i99dash docs
Develop

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 MCPWith MCP
Paste doc URLs into the chat manuallyAgent searches the docs itself when it needs context
Agent recites stale training-data snippetsAgent fetches the current page on every call
One-shot — no follow-up if you renamed a pageAuto-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/mcp

That's all. Restart your editor / next prompt and the tools are available.

Verify:

claude mcp list
# i99dash-docs    (http)    https://docs.i99dash.app/api/mcp

Claude 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

ToolInputUse it for
list_sections"What's in the docs?" Returns the 6 top-level groups (Getting started, Develop, Guides, Recipes, API reference, Troubleshooting).
list_packagesThe 5 @i99dash/* SDK packages with one-line descriptions.
list_symbolspackage: stringEvery public export of one package, with its API doc URL. Pair with get_doc to read the full type signature.
search_docsquery: string, limit?: numberFree-form search across every page. Title and description matches are weighted higher than body. Returns up to 25.
get_docslug: stringFull 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:

  1. Call search_docs("car status subscribe") → top hit is /docs/guides/subscriptions.
  2. Call get_doc("/docs/guides/subscriptions") → returns the full guide as markdown.
  3. 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?"

  1. list_packages → confirms the package exists.
  2. list_symbols("admin-sdk") → returns ~15 exports with URLs.
  3. get_doc("/docs/api/admin-sdk/admin-client") → fetches the AdminClient reference.

"I'm hitting BridgeTimeoutError in production."

  1. search_docs("BridgeTimeoutError", 5) → top hits are /docs/guides/best-practices (handling pattern) and /docs/api/sdk/bridge-timeout-error (reference).
  2. get_doc on 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:

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.

On this page