# Articulate 360 MCP connector

Connecting Articulate 360 to Elaichi lets Claude, ChatGPT, Cursor and the Elaichi Agent list courses and learning paths, enroll learners and groups, send invitations and record completions, with every action tied to the person who signed in and written to an audit log.

Source: https://elaichi.ai/connectors/articulate360/

## Facts

| | |
| --- | --- |
| Application | Articulate 360 |
| Category | Knowledge Management |
| AI tools | 45 |
| Authentication | Connects with an API key |
| Needs your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. 45 tools is past the 30-tool threshold, so clients use `search_tools` and `execute_tool` |

## What you can ask once Articulate 360 is connected

- Enroll the new support hires in the onboarding course.
- Which groups are missing the compliance course this quarter?
- List courses with the fewest enrollments this month.

## Connect Articulate 360 in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Articulate 360.
2. Optionally set Share with, then press Connect.
3. Paste an Articulate 360 API key. One person generates a token in Articulate 360 and pastes it once. Everyone else works through Share with, and never sees it.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Articulate 360 tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Connect Articulate 360 to Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Connect Articulate 360 to ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## Connect Articulate 360 to Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect Articulate 360 to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a Articulate 360 tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with Articulate 360 through Elaichi

### Enroll a new starter on day one

People. Ask for the new hire to be added to the onboarding group and enrolled on the induction learning path, then send the invitation, all before their first stand-up.

### See who is on which learning path

Learning and development. Pull the list of courses inside a learning path and check who is enrolled, so you can spot gaps before the quarter closes.

### Roll a product course out to a region

Sales enablement. Enroll an entire sales group on the new pricing course in one ask rather than adding reps one at a time.

### Record completions from an outside session

Compliance. After an in-person safety briefing, import the completion records into Articulate 360 so the training history matches what actually happened.

### Move agents between skill groups

Support. When someone changes queue, remove them from the old group, add them to the new one, and enroll them on the courses that queue needs.

### Clean up stale invitations and groups

Operations. List invitations that were never accepted, remove the ones that are out of date, and tidy groups whose projects have ended.

## Frequently asked questions

### How do I connect Articulate 360 to Claude?

Connect Articulate 360 in Elaichi first: you paste in the API key from your Articulate 360 admin settings, and there is no client ID or secret to generate. Then in Claude open Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Sign in as yourself when Claude asks, and your Articulate 360 courses, groups and enrollments are available in the conversation.

### Does Articulate 360 work with ChatGPT and Cursor as well as Claude?

Yes. Once Articulate 360 is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client and the Elaichi Agent. You connect Articulate 360 once and every client picks it up.

### What can an AI agent actually do with my Articulate 360 data?

An agent can look up Articulate 360 courses and learning paths, see who is enrolled, enroll or unenroll people and whole groups, create and manage groups and their members, send and remove invitations, and import course completions. Because Articulate 360 exposes a lot of actions, short concrete asks work best, for example "enroll the London sales group on the pricing course" rather than a long paragraph.

### Does connecting Articulate 360 give the AI access to every course and learner?

No. Every call to Articulate 360 runs inside the access of the person who signed in, so an agent sees the courses, groups and learners that person can already see. Elaichi can narrow that further, for example limiting a team to read-only, but it can never grant more than Articulate 360 itself allows.

### Can my team share one Articulate 360 connection?

Yes. One admin connects Articulate 360 in Elaichi and shares the connection with a team, and nobody else ever handles the API key. Each teammate still signs in to Elaichi as themselves, so the audit log names the actual person who enrolled a learner or deleted a group.

### Can I stop an agent from deleting or changing things in Articulate 360?

Yes. Restrictions in Elaichi apply per action, so you can allow listing Articulate 360 courses and enrollments while blocking unenrolling learners, deleting groups or removing invitations. A blocked action is never shown to Claude, ChatGPT or any other client, so no prompt can reach it.

### What happens to an Articulate 360 connection when someone leaves?

Offboarding that person in Elaichi ends their access to Articulate 360 through every client at once. If they had shared an Articulate 360 connection with a team, it keeps working for everyone else. Disconnecting Articulate 360 once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client at the same time.

## All 45 Articulate 360 tools

Every tool below is callable through https://api.elaichi.ai/mcp once Articulate 360 is connected, subject to the toolbox it is in and the restrictions on the caller.

- **List all Articulate 360 courses** (List). List all submitted courses (published and unpublished) in Articulate 360 Reach 360. Returns: id, title, coverImageUrl, authorUrl, courseReportUrl, url, contentType. Max 100 results per page, defaults to 50.
- **Get single Articulate 360 course by ID** (Get). Get a single Articulate 360 Reach 360 course by id. Returns: id, title, coverImageUrl, authorUrl, courseReportUrl, url, contentType. Required: id.
- **Articulate 360 course enrollments enroll user** (Action). Enroll a single user in an Articulate Reach 360 course. Returns an empty 204 response on success. Required: course_id, user_id.
- **Articulate 360 course enrollments enroll group** (Action). Enroll a group of users in an Articulate Reach 360 course. Use `everyone` as the group_id to enroll all users in the account. Returns an empty 204 response on success. Required: course_id, group_id.
- **Articulate 360 course enrollments unenroll user** (Action). Unenroll a single user from an Articulate Reach 360 course. Returns an empty 204 response on success. Required: course_id, user_id.
- **Articulate 360 course enrollments unenroll group** (Action). Unenroll a group of users from an Articulate Reach 360 course. Use `everyone` as the group_id to unenroll all users in the account. Returns an empty 204 response on success. Required: course_id, group_id.
- **List all Articulate 360 favorites** (List). List courses and learning paths a user has saved to their Favorites in Reach 360. Returns: completedAt, courseId, courseUrl, coverImageUrl, estimatedTimeToCompleteMs, hasCertificateDownload, learnUrl, learningPathId, learningPathUrl, numberOfCourses, numberOfLessons, progressPercent, quizScorePercent, title, type, contentType. Required: user_id.
- **Create a Articulate 360 group** (Create). Create a new group in Articulate Reach 360. Returns: id, membersUrl, reportersUrl, managersUrl, name, url. Required: name.
- **List all Articulate 360 groups** (List). List groups in Articulate Reach 360. Returns: id, membersUrl, reportersUrl, managersUrl, name, url.
- **Get single Articulate 360 group by ID** (Get). Get a single group in Articulate Reach 360 by id. Returns: id, membersUrl, reportersUrl, managersUrl, name, url. Required: id.
- **Update a Articulate 360 group by ID** (Update). Update a group's name in Articulate Reach 360 by id. Returns an empty 204 response on success. Required: id, name.
- **Delete a Articulate 360 group by ID** (Delete). Delete a group in Articulate Reach 360 by id. Returns an empty 204 response on success. Required: id.
- **Articulate 360 group memberships add user** (Add). Add a user to a Reach 360 group. Returns an empty 204 response on success. Required: group_id, user_id.
- **Articulate 360 group memberships remove user** (Delete). Remove a user from a Reach 360 group. Returns an empty 204 response on success. Required: group_id, user_id.
- **List all Articulate 360 group memberships** (List). List members of a Reach 360 group. Returns user records including id, email, role, firstName, lastName, lastActiveAt, articulate360User, groupsUrl, learnerReportUrl, and url. Required: group_id.
- **Articulate 360 import course completion import** (Import). Import course completion data for a single Articulate 360 course/user pair into Reach 360. Returns an empty 202 response on success. Required: course_id, user_id, completedAt, startedAt. Repeated calls with the same course and user override prior date values.
- **Create a Articulate 360 invitation** (Create). Create a pending invitation in Articulate 360 Reach 360, sending an email invite to the specified user. Returns: id, email, firstName, lastName, groups, url. Required: email. Any groups that don't exist are created when the user accepts the invitation.
- **List all Articulate 360 invitations** (List). List pending invitations in Articulate 360 Reach 360, optionally filtered by email address. Returns: id, email, firstName, lastName, groups, url.
- **Get single Articulate 360 invitation by ID** (Get). Retrieve a single pending invitation in Articulate 360 Reach 360 by invitation id. Returns: id, email, firstName, lastName, groups, url, invitation. Required: id.
- **Delete a Articulate 360 invitation by ID** (Delete). Delete a pending invitation in Articulate 360 Reach 360 by invitation id. Deleting before the user accepts invalidates the emailed link. Returns an empty 204 response on success. Required: id.
- **List all Articulate 360 learning paths** (List). List learning paths in Articulate 360 (Reach 360). Returns: id, title, description, coverImageUrl, coursesUrl, coursesReportUrl, learnersReportUrl, url. Max 100 results per page.
- **Get single Articulate 360 learning path by ID** (Get). Get a single learning path by id in Articulate 360 (Reach 360). Returns: id, title, description, coverImageUrl, coursesUrl, coursesReportUrl, learnersReportUrl, url. Required: id.
- **Articulate 360 learning paths list courses** (List). List courses in a learning path in Articulate 360 (Reach 360). Returns: id, title, coverImageUrl, authorUrl, courseReportUrl, url, order, contentType. Required: learning_path_id. Max 100 results per page.
- **Articulate 360 learning path enrollments enroll user** (Action). Enroll a single user in an Articulate 360 Reach 360 learning path. Returns an empty 204 response on success. Required: learning_path_id, user_id.
- **Articulate 360 learning path enrollments enroll group** (Action). Enroll a group of users in an Articulate 360 Reach 360 learning path. Use `everyone` as group_id to enroll all users in the account. Returns an empty 204 response on success. Required: learning_path_id, group_id.
- **Articulate 360 learning path enrollments unenroll user** (Action). Unenroll a single user from an Articulate 360 Reach 360 learning path. Returns an empty 204 response on success. Required: learning_path_id, user_id.
- **Articulate 360 learning path enrollments unenroll group** (Action). Unenroll a group of users from an Articulate 360 Reach 360 learning path. Use `everyone` as group_id to unenroll all users in the account. Returns an empty 204 response on success. Required: learning_path_id, group_id.
- **Articulate 360 reports get activity** (Get). Get the Articulate 360 Reach 360 user activity report listing all user sessions account-wide. Returns: courseId, courseTitle, courseReportUrl, courseUrl, userId, email, firstName, lastName, learnerReportUrl, userUrl, duration, numberOfLessonsCompleted, quizScorePercent, isQuizPassed, startedAt, userDeleted, courseDeleted.
- **Articulate 360 reports get course learners** (Get). Get a course learner report from Articulate 360 Reach 360, listing all learner sessions enrolled in a specific course. Returns: userId, email, firstName, lastName, learnerReportUrl, userUrl, duration, quizScorePercent, dueAt, status, completedAt, userDeleted, progress. Required: course_id.
- **Articulate 360 reports get learner courses** (Get). Get a learner course report from Articulate 360 Reach 360, listing all course sessions for a specific learner. Returns: courseId, courseTitle, courseReportUrl, courseUrl, duration, quizScorePercent, dueAt, status, completedAt, courseDeleted, progress. Required: learner_id.
- **Articulate 360 reports get learning path courses** (Get). Get a learning path courses report from Articulate 360 Reach 360, listing all course sessions within a specific learning path. Returns: courseId, courseTitle, courseUrl, numberOfLessons, averageDuration, courseReportUrl, courseDeleted. Required: learning_path_id.
- **Articulate 360 reports get learning path learners** (Get). Get a learning path learners report from Articulate 360 Reach 360, listing all learner sessions within a specific learning path. Returns: userId, email, firstName, lastName, learnerReportUrl, userUrl, duration, dueAt, status, userDeleted. Required: learning_path_id.
- **Articulate 360 reports get group courses** (Get). List courses in which group members are enrolled in Articulate 360 Reach 360. Returns: courseId, courseTitle, courseUrl, averageDuration, courseReportUrl, courseDeleted, enrollmentDeleted. Required: group_id.
- **List all Articulate 360 users** (List). List all users in your Articulate 360 Reach 360 account. Returns: id, email, groupsUrl, reportingGroupsUrl, managingGroupsUrl, role, firstName, lastName, lastActiveAt, learnerReportUrl, favoritesUrl, url, articulate360User. Optionally filter by email address. Max 100 results per page.
- **Get single Articulate 360 user by ID** (Get). Get a single Articulate 360 Reach 360 user by id. Returns: id, email, groupsUrl, reportingGroupsUrl, managingGroupsUrl, role, firstName, lastName, lastActiveAt, learnerReportUrl, favoritesUrl, url, articulate360User. Required: id.
- **Delete a Articulate 360 user by ID** (Delete). Delete an Articulate 360 Reach 360 user by id. Returns an empty 204 response on success. Only learners who aren't managed with SSO and who don't have an Articulate ID can be deleted. Required: id.
- **Create a Articulate 360 webhook** (Create). Create a new webhook in Articulate Reach 360. Returns: id, targetUrl, events, sharedSecret, apiVersion, url. Required: targetUrl, events. A duplicate targetUrl returns a 409 error.
- **List all Articulate 360 webhooks** (List). List webhooks in Articulate Reach 360. Returns each webhook's id, targetUrl, events, apiVersion, and url. Max 2000 results per page.
- **Get single Articulate 360 webhook by ID** (Get). Get a single Articulate Reach 360 webhook by id. Returns: id, targetUrl, events, apiVersion, url. Required: id.
- **Delete a Articulate 360 webhook by ID** (Delete). Delete an Articulate Reach 360 webhook by id. Returns an empty 204 response on success. Required: id.
- **Articulate 360 managers list managing groups** (List). List groups that a manager manages in Reach 360. Returns: id, membersUrl, managersUrl, reportersUrl, name, url. Required: user_id.
- **Articulate 360 managers list group managers** (List). List managers for a specific group in Reach 360. Returns: id, email, groupsUrl, managingGroupsUrl, reportingGroupsUrl, role, firstName, lastName, lastActiveAt, learnerReportUrl, url. Required: group_id.
- **Articulate 360 reporters list reporting groups** (List). List the reporting groups a reporter belongs to in Articulate 360 Reach 360. Returns: id, name, membersUrl, managersUrl, reportersUrl, url. Required: user_id.
- **Articulate 360 reporters list group reporters** (List). List reporters in a Reach 360 reporting group, including users who report on the Everyone group. Returns: id, email, role, firstName, lastName, lastActiveAt, groupsUrl, managingGroupsUrl, reportingGroupsUrl, learnerReportUrl, url. Required: group_id.
- **List all Articulate 360 user groups** (List). List groups in which a Reach 360 user is enrolled. Returns group records including id, name, membersUrl, reportersUrl, managersUrl, and url. Required: user_id.
