Announcing CIMD support for MCP Client registration
Learn more

Should you use Mintlify MCP or Mintlify API for building AI Agents?

Vishal Dhawani
Founding Architect @ Scalekit

TL;DR

  • Mintlify inverts the usual tradeoff. The admin MCP server is the only documented path to deterministic content and navigation writes; none of the REST API's 17 endpoints edit a page by path.
  • The admin MCP runs on interactive OAuth exclusively. There is no API key option, so headless agents need a stored per-user grant.
  • The REST API uses three key types: mint_ for deployments, agent jobs, and analytics; mint_dsc_ for assistant and search; mint_us_ for the Index API. None carry user identity.
  • MCP writes land on a branch and ship through save. REST agent jobs are prompt-driven, capped at 100 per project per hour, and the platform REST API needs a Pro or Enterprise plan.
  • Neither path gives you a vault, refresh logic, or revocation. Scalekit's Mintlify MCP connector handles the grant, per-user token storage, and tool call logging on both paths.

Mintlify splits the surface down the middle

Your agent needs to read and write documentation in Mintlify. Mintlify ships a hosted admin MCP server and a REST API, and for once the MCP surface is the larger one for the job most agents are actually doing. The two paths do not overlap the way they do for Slack or GitHub; they split cleanly along a content plane and a control plane. Here is how to pick, and what breaks in production either way.

What each path actually is

Both paths authenticate against the same Mintlify organization, but they hand your agent very different primitives. One gives you a Git working session. The other gives you deployment and analytics control.

The admin MCP server

The admin MCP is a hosted Mintlify service at a single endpoint, https://mcp.mintlify.com. Every client connects to the same URL and authenticates against a Mintlify account through an interactive OAuth login.

It gives AI tools write access to your documentation content and dashboard. Content edits buffer on a session branch and ship through a pull request or a direct commit when the agent calls save. Deployment management changes, handled through code mode, apply immediately to the live deployment with no branch and no pull request.

Official docs: Mintlify admin MCP server

The Mintlify REST API

The REST API covers deployments, agent jobs, the assistant, and analytics export. Base URL is https://api.mintlify.com, with endpoints such as POST /v1/project/update/{projectId} to trigger an update and POST /v2/agent/{projectId}/job to queue a background editing job.

Auth is bearer token with three distinct key types, each scoped to a different endpoint group. Admin keys optionally carry read or write scopes, IP allowlists, and expirations of 7, 30, 60, or 90 days or none at all. The platform REST API requires a Pro or Enterprise plan.

Official docs: Mintlify REST API introduction

Three Mintlify MCP servers, one write path

Mintlify documents three separate MCP servers, and only one of them is relevant to an agent that changes docs. The admin MCP is for your team and carries write access. The Search MCP sits at /mcp on your own site domain and serves your end users read-only access to published pages. The Index MCP at index.mintlify.com searches across all Mintlify-hosted sites.

If a comparison you are reading talks about "the Mintlify MCP server" and only mentions search, it is describing the wrong server for this decision.

What your agent can actually do

The capability split is not a subset relationship. Each path owns territory the other cannot reach at all.

Capability coverage side by side

Capability
Mintlify admin MCP
Mintlify REST API
Read a page's MDX source on a working branch
Yes, read
No
Deterministic edit to a page by path
Yes, edit_page and write_page
No
Restructure navigation nodes
Yes, create_node, move_node, delete_node
No
Edit docs.json configuration
Yes, update_config
No
Branch and session control
Yes, checkout, diff, discard_session
No
Open a pull request from agent changes
Yes, save
Yes, agent jobs create a PR on success
Async background editing from a prompt
No
Yes, POST /v2/agent/{projectId}/job
Trigger deployment update or preview
Yes, via execute_code
Yes, dedicated endpoints
Workflows, billing, members, integrations
Yes, via execute_code
Partial, automations only
Analytics export (views, visitors, feedback)
Yes, via execute_code
Yes, dedicated endpoints
Assistant message and end-user doc search
No
Yes, assistant key endpoints
Retrieve published page content
Partial, branch content only
Yes, get-page-content
Headless operation with no browser present
No
Yes

Where the capability gap bites

The REST API has no endpoint that writes a specific file at a specific path. If your agent needs to replace a deprecated field name across forty pages and produce a reviewable diff, the API cannot express that request. You can only hand a prompt to an agent job and wait for a pull request to appear.

Conversely, the admin MCP has no assistant or end-user search surface. An agent that answers customer questions from your published docs is a REST API workload, not an MCP workload.

The inversion most teams get wrong

For most tools in this series, the vendor MCP server is a curated subset of a much larger REST surface. Mintlify is the opposite. The 19 admin MCP tools exposed through Scalekit's connector as of September 2026 cover content and navigation operations that have no REST equivalent at all.

The practical consequence: teams that default to "use the API for production, MCP for prototypes" build the wrong thing here. On Mintlify, the deterministic, reviewable, production-grade write path is the MCP path. This is one reason understanding the difference between MCP and APIs matters before you commit to an architecture.

The auth path each one puts you on

The two paths do not just differ in credential format. They differ in whose identity the change is attributed to, and that determines what your audit trail is worth.

MCP inherits a human's dashboard role

The admin MCP requires an interactive OAuth login against a Mintlify account. The resulting session inherits that user's dashboard permissions, so admin-only actions such as update_config on protected settings require an admin role on the project.

There is no API key alternative. That is a hard constraint for background agents: something has to complete a browser consent flow once, and the resulting grant has to be stored somewhere your agent can reach it.

REST keys carry no user identity

Admin API keys belong to the organization. Assistant keys belong to a deployment. Neither carries the identity of the person whose intent triggered the call.

That is fine for a CI job that redeploys after a merge. It is not fine for a multi-user agent where you need to know which support engineer asked the bot to rewrite the billing page, because the Mintlify side of the audit trail will show the same key for all of them.

Why attribution matters more here than elsewhere

Docs changes are code changes. They land in Git, they go through review, and six months later someone runs git blame on a line that broke a customer integration.

On the MCP path, the pull request carries the authorizing user's grant and Git history stays meaningful. On the REST agent job path, every change traces to one org-level key. You can reconstruct intent only if you logged it yourself, on your side, before the call went out. This is the same attribution problem covered in depth in audit trails for agent auth in B2B SaaS.

What you own in production

Neither path is managed infrastructure for your agent. The question is which failure modes land on your on-call rotation.

On the MCP path

Mintlify owns the server, the tool schemas, and the branch machinery. You own the OAuth grant per user, token storage, refresh, and revocation.

You also own session hygiene. Sessions hold an in-memory branch on the Mintlify side, and abandoning one without calling save or discard_session leaves an admin-mcp/* branch in your repository. An agent that crashes mid-run does not clean up after itself.

On the REST path

You own everything: schema handling, polling loops, error semantics, and key lifecycle. Agent jobs are asynchronous, so you poll GET /v2/agent/{projectId}/job/{id} until status leaves active, then read prLink to find out whether anything actually changed.

Key rotation is manual by design. Scopes, IP allowlists, and expirations are all set at creation time and cannot be changed afterward; to adjust any of them you create a new key and update every integration that used the old one.

Rate limits and blast radius

Agent jobs are capped at 100 uses per Mintlify project per hour. That is generous for a docs workflow and restrictive for a bulk migration driven one page at a time.

Blast radius differs sharply too. MCP content edits are reversible because they live on a branch. Code mode writes are not: workflow, settings, member, billing, and integration changes apply immediately to the live deployment.

When to use MCP, when to use the API

Pick based on what the agent produces, not on which path feels more modern.

Use the Mintlify admin MCP when

  • Your agent edits documentation content and you want a reviewable pull request as the output artifact, not a black-box job result
  • You need navigation restructuring, frontmatter updates, or docs.json changes, none of which the REST API exposes
  • A human is present to authorize once, or you can capture and store that grant, as with a release-notes agent that a technical writer connects to their own account
  • You want the change attributed to a real person with real dashboard permissions

Use the Mintlify REST API when

  • Your agent runs fully headless in CI and only needs to trigger updates, preview deployments, or scheduled automations
  • You are embedding the docs assistant or building a custom search experience over published content
  • You are exporting analytics, feedback, or assistant conversations into a warehouse on a schedule
  • You want prompt-level delegation and do not need deterministic control over which bytes change

Building a Mintlify agent with Scalekit

Scalekit ships Mintlify MCP as a vendor MCP connector with 19 tools and OAuth 2.1 with Dynamic Client Registration. Your agent never handles the Mintlify grant directly; it calls a tool name with a user identifier, and Scalekit resolves the credential at request time.

Connect the user and run the first tool call

Install the SDK and generate an authorization link. The connector slug is mintlifymcp, and every tool name is prefixed with it.

import os from scalekit import ScalekitClient scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions connection_name = "mintlifymcp" identifier = "writer@yourcompany.com" link_response = actions.get_authorization_link( connection_name=connection_name, identifier=identifier, ) print("Authorize Mintlify MCP:", link_response.link) input("Press Enter after authorizing...") result = actions.execute_tool( tool_input={}, tool_name="mintlifymcp_list_deployments", connection_name=connection_name, identifier=identifier, ) print(result.data)

result.execution_id is the handle you correlate against Scalekit's tool call logs later.

Drive a docs edit to a pull request with LangChain

Scalekit returns native LangChain StructuredTool objects, so there is no schema reshaping. Pass page_size=100 so a 19-tool connector is not truncated by the default page. For more on how LangChain tool calling fits into production agent architectures, see LangChain tool calling: how it works, where it stops, and how Scalekit completes it.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier="writer@yourcompany.com", connection_names=["mintlifymcp"], page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [HumanMessage( "Check out a branch with slug replace-legacy-token. Find every page that " "mentions legacy_token and update the examples to use api_key instead. " "Show me the diff, then save it as a pull request." )] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = tool_map[tc["name"]].invoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

The agent will call mintlifymcp_checkout first, because every content tool requires an active session branch. Skipping that step is the most common failure on this connector.

Call the REST API through Tool Proxy

Scalekit's catalog ships the MCP connector for Mintlify, so the REST path runs through a custom connector pointed at https://api.mintlify.com with static bearer auth. From there, actions.request proxies the call and injects the credential.

job = actions.request( connection_name="mintlify-rest", identifier="acme-docs-workspace", path="/v2/agent/proj_01abc/job", method="POST", body={"prompt": "Add a quickstart guide for the Python SDK"}, ) print(job.status_code, job.json()) job_id = job.json()["id"] status = actions.request( connection_name="mintlify-rest", identifier="acme-docs-workspace", path=f"/v2/agent/proj_01abc/job/{job_id}", method="GET", ) print(status.json()["status"], status.json()["prLink"])

Note the identifier here: for an org-level admin key, the right unit of isolation is the tenant workspace, not an individual user. That distinction is the whole reason the two paths need different credential models.

Scope the agent with a virtual MCP server

Handing an agent all 19 Mintlify tools means handing it delete_node, update_config, and execute_code. A release-notes agent needs about five of them. Virtual MCP servers let you publish a scoped endpoint with only the tools you allow.

from datetime import timedelta # config.config carries the new config ID and its static mcp_server_url config = scalekit_client.actions.mcp.create_config( name="Release notes agent", description="Read, edit, and save Mintlify pages. No config or code mode.", ) state = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config.config.id, identifier="writer@yourcompany.com", include_auth_link=True, ) for account in state.connected_accounts: if account.connected_account_status != "active": print("Needs authorization:", account.authentication_link) session = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config.config.id, identifier="writer@yourcompany.com", expiry=timedelta(hours=1), ) headers = {"Authorization": f"Bearer {session.token}"}

Session tokens default to about one hour. create_session_token is the remint call; there is no refresh endpoint and a token cannot be extended in place, so long-running hosts need a mint schedule.

The credential problem that exists on both paths

Both paths hand you a credential and walk away. Neither gives you a vault, a rotation policy, or a revocation flow that fires when someone leaves the company.

The N-credential problem for docs agents

This looks like a single-tenant problem until it is not. A devtool company running a docs agent for its own site has one grant. A platform that builds docs agents for its customers has one Mintlify grant per customer organization, each with its own deployment scope and its own repository write access.

At that point you are storing, refreshing, and revoking N OAuth grants that each carry the ability to open pull requests against a customer's repository. That is not a credential you want in an environment variable. The same pattern is explored in detail in who holds the token: credential ownership across agent tool-calling patterns.

What downstream tool call logs give you

This is where the MCP path's attribution advantage either survives or dies. If your agent resolves a shared credential, the Git history says a bot did it and nothing on your side says who asked.

Scalekit records every tool call with the user whose credential ran it, the tool name, and whether it succeeded or failed and why, exportable to Datadog, Splunk, or any SIEM. Combined with the pull request the MCP path already produces, you get a chain from the prompt to the diff to the reviewer. That is the artifact your security team asks for, and neither Mintlify path builds it for you. More on that pattern in agent tool observability.

Multi-tool agents make this worse, not better

A real docs agent is rarely Mintlify-only. It reads a Linear issue, checks a GitHub pull request, writes the Mintlify page, and posts to Slack. That is four OAuth grants per user, four token lifecycles, four revocation paths.

A virtual MCP server exposes a scoped subset across all four connectors behind one URL and one short-lived, user-bound session token. The agent sees one endpoint; you keep per-connector isolation underneath. The Scalekit connector catalog covers the rest of that stack. For a concrete example of how this plays out across multiple tools, see agent tool calling auth production problems, patterns, anti-patterns.

Which one to build against

If your agent changes documentation content, build against the admin MCP. It is the only path with page-level and navigation-level writes, and branch semantics give you a reviewable artifact instead of a completed job you have to trust.

If your agent triggers deployments, runs scheduled automations, serves an assistant, or exports analytics, build against the REST API. Those endpoints have no MCP equivalent outside code mode, and code mode applies immediately to production with no review gate.

Most teams building seriously will run both, which is the real answer: one path for the content plane, one for the control plane, and one credential layer underneath both. That layer is the part that has to be production-grade, because it is the part that holds write access to your repositories.

Where to start

Start with the Mintlify MCP connector and the AgentKit Python SDK. The auto release notes agent template is the closest working reference, and pricing covers what running this at tenant scale costs.

Talk to other Mintlify agent builders

Building a docs agent that edits Mintlify on behalf of your users is a small enough niche that the failure modes are not well documented yet. Session branches leak, checkout gets skipped, and org-level keys quietly flatten your audit trail.

Join the Scalekit Slack community to compare notes with other agent builders, or use the Talk to us page if you want an engineer on a call this week.

FAQs

Does the Mintlify admin MCP support API key authentication?

No. The admin MCP requires an interactive OAuth login. There is no API key alternative, which means headless background agents must capture and store a per-user OAuth grant before they can use the MCP path.

Can the Mintlify REST API edit a specific documentation page by path?

No. None of the REST API's endpoints write to a specific file at a specific path. Deterministic page edits are only possible through the admin MCP using tools like edit_page and write_page.

What is the rate limit for Mintlify REST API agent jobs?

Agent jobs are capped at 100 uses per Mintlify project per hour. This is generous for typical docs workflows but can become a bottleneck for bulk migrations processed one page at a time.

Which Mintlify MCP server should an agent use for writing documentation?

Only the admin MCP server at https://mcp.mintlify.com provides write access. The Search MCP and Index MCP are read-only surfaces intended for end-user doc search, not for agents that need to edit content.

How does Scalekit handle OAuth grants for the Mintlify MCP connector?

Scalekit manages the OAuth grant, per-user token storage, and tool call logging. Your agent calls a tool name with a user identifier, and Scalekit resolves and injects the correct credential at request time, so your agent code never touches the raw grant.

What happens to Mintlify MCP session branches if an agent crashes?

Abandoned sessions leave an admin-mcp/* branch in your repository. The agent does not automatically clean up after itself. You must call discard_session to remove the branch, or use save to ship it as a pull request before the session ends.

When should I use Client Credentials vs. OAuth for Mintlify agents?

Use the REST API with static bearer tokens (analogous to client credentials) when your agent is a headless CI job with no user context, such as triggering deployments or exporting analytics. Use the MCP path with OAuth delegation when the agent acts on behalf of a named user who needs attribution in Git history and audit logs.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.