What is your developer-dependent CMS actually costing you? Calculate your costs and get a full report
What is your developer-dependent CMS actually costing you? Calculate your costs and get a full report
Authentication
For admins and security reviewers: how the Agility MCP Server authenticates, enforces each user's permissions, confirms destructive actions, and how to roll AI access out safely.
The Agility CMS MCP Server lets AI assistants such as Claude, ChatGPT, GitHub Copilot, Cursor and Microsoft 365 Copilot read and change content in Agility on a person's behalf. This article is for admins, IT and security reviewers deciding whether to allow it, and how to roll it out safely.
The short version: the MCP server does not introduce a new account type or a new set of permissions. Every call runs as a named Agility user, through that user's own OAuth sign-in (or, for unattended automation, a Personal Access Token that belongs to that user), and the Agility Management API checks that user's permissions on every call. The AI can never do more than the person using it could do in the Agility app.
| Question | Answer |
|---|---|
| How does the AI authenticate? | OAuth 2.0, per user. Each person signs in through Agility's standard login and gets a short-lived access token. |
| Are there shared API keys? | No. Nothing to copy into a config file, and no shared or service credential is needed to connect. |
| Can the AI exceed the user's role? | No. The Management API enforces the signed-in user's permissions on every call. |
| Does the MCP server store passwords? | No. |
| Do AI edits go live immediately? | Not on save. Saves land in Staging. Publishing is a separate action that needs the user's Publish permission. Whether a person confirms it, an approver signs off, or the AI publishes on its own is your choice. See Levels of autonomy. |
| Do approval workflows still apply? | Yes. AI-made changes move through the same Staging, approval and publish states as any other change. |
| Who is recorded as making the change? | The signed-in user, in the item's version history. |
The hosted server lives at https://mcp.agilitycms.com/api/mcp and uses the Streamable HTTP transport. When someone adds it to their AI client, the client opens a browser window and the person signs in to Agility with their own account. From then on, calls use a short-lived OAuth access token issued for that person.
https://mcp.agilitycms.com/.well-known/oauth-protected-resource and supports dynamic client registration, so clients such as Copilot Studio can register without anyone creating an app registration.The get_current_user tool is a read-only "whoami". It returns the identity behind the active token (userID, userName, emailAddress, firstName, lastName, adminAccess, isSuspended, userTypeID, jobRole and the number of instances the user can access) and never returns credentials.
Encourage people to run it before any bulk or destructive work, and use it when a permission-denied message references a user ID you need to trace.
Which Agility user am I connected as, and how many instances can I reach?
The MCP server translates a request like "publish these three items" into Management API calls made with the person's own token. Agility evaluates permissions per user on every Management API call, so:
get_available_instances lists exactly those.Because the check happens at the API, it does not depend on the AI client behaving well. If a user's role cannot do something in the Agility app, it cannot be done through the MCP server either. Because the check runs on every call, the way to narrow what someone can do through AI is the same as in the app: change their role, or remove them from the instance in Settings > User Access.
For the full list of built-in roles and permissions, see User Permissions. Enterprise customers can also define Custom Roles.
Unpublishing and deleting are annotated as destructive. Publishing (publish_content, publish_page) is not, so MCP clients don't force a prompt before it, and users can also choose "always allow" for any tool in their client. Whether a person confirms each publish is therefore something you configure, through client settings and approval workflows, not something the server imposes. For destructive actions, the server stacks up to three layers of protection, depending on what the person's AI client supports:
| Layer | What happens | Who controls it |
|---|---|---|
| 1. Client permission prompt | Destructive tools are annotated as such, so MCP clients ask "Allow this tool to run?" before calling them. | The user, in their AI client. Choosing "always allow" turns the prompt off for that tool. The server cannot override that choice. |
| 2. Server elicitation | On clients that support MCP elicitation (Claude Code, for example), the server shows its own confirmation form in the user's interface, such as "type DELETE" for deletes. The AI assistant cannot answer this on its own. | The Agility MCP server. |
| 3. Agility permissions | On clients without elicitation, the action runs with the user's own token and the Management API allows or denies it based on their role. The response records that no interactive prompt was shown (humanConfirmed: false). | Your role assignments in Agility. |
Approve, decline and request-approval actions are not gated, because they are low risk and already part of a reviewed workflow.
The practical takeaway: layer 3 is the one you fully control. If a group of people should never publish or delete, give them a role without Publish or Delete. Don't rely on a prompt that a user can switch off. If you do want an AI to publish on its own, grant Publish deliberately to the account it runs as, as described in Setting up fully automated publishing.
When an AI saves content through the MCP server, the item lands in Staging. Saving changes to a published item creates a new Staging version while the live version stays as it is. Nothing reaches your live site until it's published, by a person or by an automation you've set up, and publishing always requires the Publish permission.
If you have approvals turned on for a content list or page, AI-made changes go through the same Staging, approval and publish states as changes made by hand. See Approvals and Workflows to enable Requires Approval on pages or Enable Approval Workflow on content lists.
The same AI agent, with the same tools, can run at three levels. Your organization decides, per content type, which level applies.
| Level | What the AI does | Who publishes | What you configure |
|---|---|---|---|
| Assist | Drafts and saves to Staging. | A person, after reviewing it. | Nothing extra. This is the default. |
| Approve | Drafts, saves and requests approval (manage_content_workflow or manage_page_workflow, request-approval). | A publisher approves; then a person or the AI publishes. | Approvals on for those pages and content lists. |
| Autonomous | Drafts, checks its own work and publishes (publish_content / publish_page, or a Management SDK batch publish for unattended jobs). | The AI. | A dedicated automation user, checks, logging and a rollback plan (below). |
All three are valid configurations. Assist and Approve suit content where judgement matters or someone is accountable for what goes live. Autonomous suits repeatable, checkable changes, and is how many teams run scheduled jobs, pipelines and always-on agents.
publish_content and publish_page aren't annotated destructive, so most clients won't stop for them. If yours does, choose "always allow" for those two tools.unpublish_content / unpublish_page (or batchWorkflowContent with WorkflowOperationType.Unpublish from the SDK), and restore an earlier version from version history, which brings it back in Staging for you to publish.For unattended jobs, publishing from the Management SDK looks like this (JavaScript):
import {WorkflowOperationType} from "@agility/management-sdk"
// Content items that passed your checks
await apiClient.contentMethods.batchWorkflowContent(contentIDs, guid, locale, WorkflowOperationType.Publish)
// Pages that passed your checks
await apiClient.pageMethods.batchWorkflowPages(pageIDs, guid, locale, WorkflowOperationType.Publish)
Agility records content activity through version history and the Recent Changes report. Every change creates an immutable version that records what changed, the user who made it, the timestamp and the workflow state, and versions are retained indefinitely. Because the MCP server acts as the signed-in user, a change made through an AI assistant is recorded against that person, the same as a change they made by hand.
Keep these limits in mind when you plan monitoring:
The full details are in Audit Trail, Logging & SIEM Integration.
The supported connection is the hosted endpoint https://mcp.agilitycms.com/api/mcp with OAuth 2.0 sign-in (setup steps for each client are at mcp.agilitycms.com/instructions); treat any other "Agility MCP" package or server as untrusted unless Agility publishes it.
Microsoft 365 Copilot reaches the MCP server through an agent built in Copilot Studio, and that adds three things an admin must check. The full walkthrough is in Connect the Agility MCP Server to Microsoft 365 Copilot.
DlpViolationError or BlockedConnector on publish means a policy is blocking it.Anything an Agility tool returns (content, field values, model definitions) becomes part of the conversation in the person's AI client. Review the data handling terms of the AI tools you approve the same way you would for any other tool your team pastes content into. File uploads use a short-lived signed URL, so file bytes do not travel through the conversation.
get_current_user part of the routine before bulk changes.