MCP server
Use AI coding agents (Claude, Cursor, Continue) against the i99dash docs over Model Context Protocol. Install in 30 seconds, structured search + per-page fetch.
The doc site exposes a Model Context Protocol
server at https://docs.i99dash.app/api/mcp. Add it once to your
coding assistant and the agent can search every page, fetch specific
sections by slug, and list SDK exports — without you pasting URLs.
Heads-up: the MCP server is read-only and unauthenticated. All it can do is call the same routes a regular HTTP client could (
/llms.txt,/llms.mdx/...). Adding it to your assistant doesn't grant it any new privileges over your code.
Why use it
| Without MCP | With MCP |
|---|---|
| Paste doc URLs into the chat manually | Agent searches the docs itself when it needs context |
| Agent recites stale training-data snippets | Agent fetches the current page on every call |
| One-shot — no follow-up if you renamed a page | Auto-recovers via search_docs |
If you've ever pasted a doc URL into a chat to remind an agent how some SDK symbol works, this replaces it.
Install
Claude Code (CLI)
claude mcp add --transport http i99dash-docs https://docs.i99dash.app/api/mcpThat's all. Restart your editor / next prompt and the tools are available.
Verify:
claude mcp list
# i99dash-docs (http) https://docs.i99dash.app/api/mcpClaude Desktop (claude_desktop_config.json)
Open the config file (~/Library/Application Support/Claude/claude_desktop_config.json
on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows) and
merge:
{
"mcpServers": {
"i99dash-docs": {
"url": "https://docs.i99dash.app/api/mcp"
}
}
}Restart Claude Desktop. The tool icons appear in the input bar.
Cursor
Settings → Features → Model Context Protocol → Add Server:
{
"name": "i99dash-docs",
"url": "https://docs.i99dash.app/api/mcp"
}Continue.dev
In ~/.continue/config.json:
{
"mcpServers": [
{
"name": "i99dash-docs",
"transport": { "type": "streamable-http", "url": "https://docs.i99dash.app/api/mcp" }
}
]
}Generic / hand-rolled clients
Direct POST to the endpoint with JSON-RPC 2.0:
curl -X POST https://docs.i99dash.app/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'Transport: Streamable HTTP (MCP spec 2025-03-26). No session management required — the server is stateless.
Tools
| Tool | Input | Use it for |
|---|---|---|
list_sections | — | "What's in the docs?" Returns the 6 top-level groups (Getting started, Develop, Guides, Recipes, API reference, Troubleshooting). |
list_packages | — | The 5 @i99dash/* SDK packages with one-line descriptions. |
list_symbols | package: string | Every public export of one package, with its API doc URL. Pair with get_doc to read the full type signature. |
search_docs | query: string, limit?: number | Free-form search across every page. Title and description matches are weighted higher than body. Returns up to 25. |
get_doc | slug: string | Full markdown of one page. Accepts either /docs/api/sdk/mini-app-client or the bare slug. |
Example agent flows
"How do I subscribe to car-status updates?"
A well-trained agent will:
- Call
search_docs("car status subscribe")→ top hit is/docs/guides/subscriptions. - Call
get_doc("/docs/guides/subscriptions")→ returns the full guide as markdown. - Synthesize an answer with the React/Vue/Svelte pattern blocks +
the
off()cleanup contract.
You don't see steps 1–3; you just see the answer.
"What can @i99dash/admin-sdk do?"
list_packages→ confirms the package exists.list_symbols("admin-sdk")→ returns ~15 exports with URLs.get_doc("/docs/api/admin-sdk/admin-client")→ fetches theAdminClientreference.
"I'm hitting BridgeTimeoutError in production."
search_docs("BridgeTimeoutError", 5)→ top hits are/docs/guides/best-practices(handling pattern) and/docs/api/sdk/bridge-timeout-error(reference).get_docon each → composite answer with retry recipe + the type's full shape.
Architecture
┌──────────────┐ POST /api/mcp ┌──────────────────┐
│ agent │ JSON-RPC 2.0 │ docs.i99dash │
│ (Claude / │ ──────────────────▶ │ Next.js route │
│ Cursor) │ Streamable HTTP │ handler │
│ │ (spec 2025-03-26) │ │
└──────────────┘ └─────────┬────────┘
│
▼
┌──────────────────┐
│ Fumadocs source │
│ /llms.mdx/... │
│ in-process │
│ index │
└──────────────────┘The handler runs in the same Next.js process that serves the docs — no separate service, no Redis, no session store. Each call resolves in < 50 ms after warm-up.
Self-hosting
If you fork the doc site, the MCP server moves with it. The relevant files:
app/api/[transport]/route.ts— the route handler. Usesmcp-handleron top of the official MCP SDK.lib/mcp/tools.ts— the four real tool implementations. Each is a plain function overFumadocs.source— no heavy lifting.
To add a tool, register it in route.ts and implement it in tools.ts.
Troubleshooting
tools/list returns an empty array
Most clients send initialize first, then tools/list. If you're
hand-rolling and skip initialize, some servers reject. Always send:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"...","version":"0"}}}before any tool call.
Agent says it can't find the server
Restart the editor / agent host after adding the config. Most clients read the config once at startup.
Stale results
The MCP server reflects the doc site's current build. After a doc
update, allow up to 5 min for ISR / CDN propagation. Force-refresh by
calling get_doc with a known-changed slug.
CORS error in a browser-based client
The server sets Access-Control-Allow-Origin: * on /api/*. If you
still see CORS errors, your client is probably setting an
Origin: null header (file:// pages). Serve through a real origin.
Related
- MCP specification
- Available tools (live) — POST
tools/list - /llms.txt — passive alternative for clients that don't speak MCP