# How to Run Your LMS From Claude and ChatGPT: A Step-by-Step Guide

https://cubite.io/blogs/connect-claude-chatgpt-to-your-lms-step-by-step

**By:** Amir Tadrisi
**Updated:** 2026-08-20

The click-by-click walkthrough: connect Claude, Claude Code, or ChatGPT to your Cubite site over MCP, do real work in chat, and read your analytics. Every screenshot is production.

Last month I wrote about why we built an MCP server into Cubite: the argument, the honest competitive map, the security model. This post is the other half: the actual walkthrough. Every screenshot below is from our production environment at cubite.io, taken today, and every command is copy-pasteable.

By the end you will have Claude or ChatGPT connected to your learning site and able to do real work: create a course, publish a post, enroll a cohort, and answer questions like "which of my courses has the worst completion rate?" from live data.

## What you need

- A Cubite site (any plan; the MCP server is included). If you do not have one, register and create a site first.
- A Claude account (web or desktop; even the free plan can add one custom connector), Claude Code in the terminal, or ChatGPT with developer mode available (Plus, Pro, Business, Enterprise, or Edu; not the free tier).
- About five minutes.

There is exactly one server URL, for every site:

https://cubite.io/api/mcp/mcp

You never tell the assistant which site is yours in a prompt. You pick the site once, on the sign-in screen, and the connection is bound to it from then on. There is no parameter an assistant can pass to reach a different site.

## Step 1: Connect Claude (web or desktop)

1. In Claude, open Settings, then Connectors (Anthropic currently files it under Customize), then Add custom connector.
2. Paste https://cubite.io/api/mcp/mcp and continue.
3. Claude opens a Cubite sign-in page in your browser. Sign in, pick which of your sites to connect, and review the permission checkboxes.

This is the consent screen you will see. Each permission is its own checkbox, ticked to start. Untick anything you do not want to grant; the connection gets only what stays ticked. The screen also names the exact destination the authorization is sent to, because app names are self-reported and unverified; glance at it before you approve:

1. Approve. Back in Claude, the Cubite tools appear in your chat. That is the whole setup: no key was copied, nothing was pasted into a settings file.

Try it immediately (this works even under the default read-only grant):

> Give me a health check of my courses: enrollments, completion rates, and where learners stall.

## Step 2: Connect Claude Code (terminal)

If you live in the terminal, one command:

claude mcp add --transport http cubite https://cubite.io/api/mcp/mcp

Then run /mcp inside Claude Code and pick cubite to complete the same browser sign-in. From then on, your terminal sessions can operate the site:

> create a draft blog post announcing our new food safety course, link the course, and keep it hidden so I can review it

Prefer a key over OAuth (for CI, servers, or a shared machine)? Create a scoped API key in Admin, then your site, then Integrations, and add it as a header instead:

claude mcp add --transport http cubite https://cubite.io/api/mcp/mcp \ --header "Authorization: Bearer ck_..."

## Step 3: Connect ChatGPT

1. In ChatGPT, enable developer mode (in Settings; OpenAI has filed it under connectors and under security at different times, so look around).
2. Add a connector and paste https://cubite.io/api/mcp/mcp as the server address.
3. Sign in when prompted, pick your site, approve the permissions. Same consent screen as Claude, same rules.

Two ChatGPT-specific notes worth knowing:

- Developer mode is what unlocks the write tools (creating courses, enrolling learners). That is OpenAI's policy for any connector with write actions, not a Cubite limitation.
- ChatGPT's research modes only ever call two tools, named search and fetch. Cubite ships both. That means Deep Research and company knowledge can search your site's courses, pages, blog posts, and learning paths and cite them by URL, even though those modes never touch the write tools.

## Step 4: Do real work

The server exposes 59 tools, and the assistant only sees the ones your connection is allowed to use. Some real prompts we use, verbatim:

Build a course from a document.

> Here is our onboarding SOP. Turn it into a course called "New Staff Onboarding": H2s become sections, H3s become units, and add a short graded quiz at the end of each section. Keep it out of the catalog until I review it.

The assistant chains course_create, course_set_content, and the question tools, then hides the course from the public catalog. H2/H3 mapping is a server convention, so structure survives.

Enroll a cohort.

> Enroll these 12 people in Food Safety Level 2 and give me their sign-in links: [paste list]

One bulk-enroll call. New learners are created on your site and come back with a magic sign-in link you can drop into an email. Existing learners are just enrolled, with one deliberate exception on the links: if an account signs in with a password, or also exists on another Cubite site, no sign-in link is minted for it (a link like that would be an account-takeover vector), and that learner keeps signing in the way they already do.

Publish content.

> Write a 900-word post about our new HACCP course for food-truck operators, use our usual tone, link the course, and publish it.

Upload a SCORM or xAPI package.

> Here is the URL of our Storyline export: https://... Upload it and add it as the final unit of the Compliance course.

## Step 5: Ask for analytics

This shipped today and it changes how the connection feels: the assistant can now read your numbers, not just your content. Three report tools back it:

- Site overview: members by role, enrollments (total, last 30 days, active learners), completions and completion rate, certificates issued, quiz attempts with average score and pass rate.
- Per-course engagement: one row per course with enrollments, completions, completion rate, average progress, certificates, and quiz stats.
- Per-learner progress: each member with their enrollment count, completed courses, average progress, certificates, and last activity.

So you can ask:

> Give me a health check of my site: how are enrollments trending, which courses complete well, and which have a quiz pass rate under 70%?

or

> Who enrolled in the last month but has not started anything? Draft a nudge email for them.

A deliberate privacy split: the aggregate reports sit behind a reports:read permission that never returns a learner's name or email, and it is part of the default read-only grant. The per-learner report requires the members permission (members:read), the same one that already means "may read who my learners are". An assistant you connected read-only can tell you your completion rate; it cannot tell you your learners' emails unless you granted that explicitly.

Here is the overview tool answering for one of my own sites, verbatim from production while writing this post (a site where I park course experiments, so the completion numbers are honestly unflattering):

{ "members": { "total": 13, "byRole": { "STUDENT": 13 } }, "courses": { "total": 363 }, "enrollments": { "total": 16, "last30Days": 0, "activeLearners": 6 }, "completions": { "total": 0, "last30Days": 0, "completionRatePct": 0 }, "certificates": { "total": 0, "last30Days": 0 }, "quizzes": { "submittedAttempts": 0, "averageScorePct": null, "passRatePct": null } }

And the per-course report on the same site, top row:

{ "name": "AI-Driven LLM Evaluation: Picking the right AI model", "enrollments": 6, "completions": 0, "completionRatePct": 0, "averageProgressPct": 50.6, "lastEnrollmentAt": "2026-05-21T17:49:20.057Z" }

An assistant reading that will tell me the same thing I can see myself: learners get halfway through the flagship course and stall, and nobody has enrolled in 30 days. That is exactly the kind of thing you want surfaced in the same chat where you can then say "draft a re-engagement email".

## Step 6: Know your permissions, and how to cut it off

Everything runs on scoped permissions:

- The OAuth consent screen shows exactly what is requested; untick freely.
- A client that asks for nothing specific gets read-only defaults: site settings, pages, courses, and aggregate analytics. It can look, not change.
- Write permissions are explicit. So is reading learner data.
- Access tokens last one hour and refresh automatically; replaying a stolen refresh token revokes the whole connection.

And when you want it gone: Admin, then your site, then Integrations shows every connected assistant with its permissions, who authorized it, and when it was last used. Disconnect kills the credential immediately, no matter what the assistant's own settings say.

## Troubleshooting

- A 401 mid-session: "API key expired" means the one-hour access token lapsed and your client did not refresh it. Reconnect once; a client that implements OAuth refresh properly stays quiet after that. "Missing API key" is different: no credential was sent at all, so for header-based setups re-check the Authorization: Bearer ck_... header.
- The assistant says it has no Cubite tools: the tool list is filtered to the permissions the connection actually holds, so a narrow grant sees a short list. Check the connection's permissions in Admin, then Integrations. A key with no permissions at all is refused outright, with an error that says exactly that.
- A tool call fails with "missing required scope": the connection was approved without that permission. Reconnect and tick it, or create an API key that has it.
- ChatGPT does not show the connector: developer mode is not enabled, or your workspace admin has not allowed it (Business and Enterprise gate it).
- Gemini: the consumer Gemini app has no custom-connector UI. Gemini CLI works with an API key; use httpUrl (not url) in its settings.

## What is next

The server, the OAuth flow, and everything in this post is live today. Next on the list: publishing to the official MCP registry and the assistant directories so connecting is one click from inside Claude and ChatGPT, with no URL to paste at all.

If you hit anything odd, email hello@cubite.io. And if you do not have a site yet, start here: create the site, connect the assistant, and build your first course by describing it.
