# Use the documentation MCP server

Read documentation, provider capabilities, examples, and one integration skill through the public, unauthenticated MCP endpoint.

Canonical: https://searchsdk.dev/docs/guides/mcp
Markdown: https://searchsdk.dev/docs/guides/mcp.md

<a id="connect"></a>

## Connect to the public endpoint

Configure an MCP client that supports protocol revision `2026-07-28` with the Streamable HTTP URL `https://searchsdk.dev/mcp`. `/api/mcp` is an alias. No API key or account is required; send no cookies or Authorization header. The endpoint serves public documentation only; it does not accept provider keys, run live searches, execute examples, or create remote infrastructure.

This revision uses stateless requests. Every request includes protocol version and client capabilities in `params._meta`; HTTP mirrors the version and method in headers. It does not use the older `initialize` handshake or a session ID. A client that only supports older handshake-based revisions needs a compatible update.

**Discover the server · terminal**

```bash
curl --fail-with-body https://searchsdk.dev/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: server/discover' \
  --data '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"docs-reader","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}'
```

Read `supportedVersions` and `capabilities` from the discovery response, then call `tools/list` to inspect the current tool schemas. `Mcp-Name` is also required for `tools/call` and `resources/read`, matching the tool name or resource URI in the body. Skill discovery uses `Mcp-Method` and the version header; `skills/get` does not require `Mcp-Name`.

- [Official July 2026 MCP introduction](https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro)
- [Discovery specification](https://modelcontextprotocol.io/specification/2026-07-28/server/discover)
- [Streamable HTTP requirements](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http)

<a id="tools"></a>

## Documentation, providers, and examples

| Tool | Arguments | Result |
| --- | --- | --- |
| `search_docs` | `query`, optional `limit` (1–10) | Local lexical search with bounded article snippets; no web-provider request. |
| `get_doc` | `slug` | Complete article text. Use an empty slug for the introduction. |
| `list_providers` | Optional opaque `cursor` | Public provider metadata, up to 50 entries per page. |
| `get_provider` | `id` | One provider, including its supported boundary. |
| `list_examples` | Optional opaque `cursor` | Documented code examples, up to 50 entries per page. |
| `get_example` | `id` from the listing | One example with language, source URL, and code. |

Use returned cursors unchanged to fetch later pages. Choose example IDs from `list_examples`; IDs are generated from the article, section, and block position. Titles such as “shape” or “abbreviated” identify examples that are not standalone applications. Review environment requirements before using any code.

**mcp-docs.ts · read public data**

```typescript
const endpoint = 'https://searchsdk.dev/mcp';
const metadata = {
  'io.modelcontextprotocol/protocolVersion': '2026-07-28',
  'io.modelcontextprotocol/clientInfo': { name: 'docs-reader', version: '1.0.0' },
  'io.modelcontextprotocol/clientCapabilities': {},
};
let requestId = 0;
async function rpc(method: string, params: Record<string, unknown> = {}) {
  const name = method === 'tools/call' ? params.name
    : method === 'resources/read' ? params.uri : undefined;
  const headers = new Headers({
    'Content-Type': 'application/json',
    Accept: 'application/json, text/event-stream',
    'MCP-Protocol-Version': '2026-07-28',
    'Mcp-Method': method,
  });
  if (typeof name === 'string') headers.set('Mcp-Name', name);
  const response = await fetch(endpoint, {
    method: 'POST', headers, credentials: 'omit', signal: AbortSignal.timeout(10_000),
    body: JSON.stringify({ jsonrpc: '2.0', id: ++requestId, method,
      params: { ...params, _meta: metadata } }),
  });
  // This endpoint returns JSON. Other MCP servers can return an SSE stream.
  const message = await response.json();
  if (!response.ok || message.error) throw new Error('MCP request failed');
  return message.result;
}

console.log(await rpc('server/discover'));
console.log(await rpc('tools/list'));
console.log(await rpc('tools/call', {
  name: 'search_docs', arguments: { query: 'fallback cancellation', limit: 3 },
}));
console.log(await rpc('tools/call', {
  name: 'get_doc', arguments: { slug: 'quickstart' },
}));
console.log(await rpc('tools/call', { name: 'list_providers', arguments: {} }));
console.log(await rpc('tools/call', {
  name: 'get_provider', arguments: { id: 'context' },
}));
console.log(await rpc('tools/call', { name: 'list_examples', arguments: {} }));
// Pass a returned example ID to get_example; do not infer an ID or execute it.
export {};
```

> **Verification boundary**
> The tools read generated, public source material. Fixture tests and documented operation mappings do not establish live provider availability, account permissions, retrieval quality, pricing, or latency. Provider capabilities distinguish normalized web adapters from native clients and corpus retrieval.

<a id="limits"></a>

## Handle request limits

Keep request bodies below 16 KiB. The server allows three seconds to receive the body, a five-second total request deadline, and responses up to 512 KiB. Article text stays below 128 KiB per record. Prefer search snippets and individual articles over fetching the entire catalog.

Rate limits apply per server instance: a client socket address has a burst of 30 requests and refills at 60 per minute; the aggregate burst is 120 and refills at 240 per minute. Up to 12 requests run concurrently. Forwarded-address headers are ignored, so clients behind a reverse proxy can share one address bucket. On HTTP 429, respect `Retry-After` before retrying. These limits are local protective bounds, not a guaranteed service quota or availability promise.

<a id="resources"></a>

## Read exact resources

Clients can enumerate the exact resource catalog with `resources/list`. There are no resource templates. Read an enumerated URI with `resources/read`. The introduction is `searchsdk://docs/index`; other documentation uses `searchsdk://docs/` followed by `encodeURIComponent(slug)`. Provider and example resources use `searchsdk://providers/` or `searchsdk://examples/` followed by `encodeURIComponent(id)`.

**Resource request · params**

```json
{
  "uri": "searchsdk://docs/reliability%2Ffallback",
  "_meta": {
    "io.modelcontextprotocol/protocolVersion": "2026-07-28",
    "io.modelcontextprotocol/clientInfo": { "name": "docs-reader", "version": "1.0.0" },
    "io.modelcontextprotocol/clientCapabilities": {}
  }
}
```

Send these params with JSON-RPC method `resources/read`, header `Mcp-Method: resources/read`, and matching header `Mcp-Name: searchsdk://docs/reliability%2Ffallback`. Documentation text is bounded below 128 KiB per article. The endpoint serves exact resources from its generated catalog rather than reading arbitrary filesystem paths.

<a id="skill"></a>

## Load the searchSDK integration skill

The server publishes one curated skill through the official `io.modelcontextprotocol/skills` extension: `skill://searchsdk/SKILL.md`. It guides provider selection, server integration, fallback, cancellation, errors, and local fixture checks. It does not authorize live provider calls. Directory reads are not supported.

After `server/discover` advertises the extension, use `skills/list` or `skills/get` with `{ "uri": "skill://searchsdk/SKILL.md" }`, including the same required per-request metadata. Read that URI with `resources/read`. The manifest contains the SHA-256 digest and exact UTF-8 byte size of the single file. Skill-capable hosts verify the manifest and frontmatter and apply their skill-loading and approval rules before activation; an ordinary resource read does not activate the skill.

- [Read the public searchSDK skill](https://searchsdk.dev/skills/searchsdk/SKILL.md)
- [Official Skills over MCP extension](https://modelcontextprotocol.io/extensions/skills/overview)
- [Agent Skills format](https://agentskills.io/specification)

<a id="static-access"></a>

## Read without an MCP client

Every public page has a Markdown export discoverable through an HTML `rel="alternate"` link with `type="text/markdown"`. `rel="describedby"` points to `/llms.txt`. The short index links to the main references; `/llms-full.txt` is an optional full-text concatenation, not a required part of the llms.txt proposal. Generated JSON indexes are searchSDK-specific formats, not new MCP or web standards.

- [Agent entry point](https://searchsdk.dev/llms.txt)
- [All canonical articles and Markdown URLs](https://searchsdk.dev/agent-index.json)
- [Machine-readable provider capabilities](https://searchsdk.dev/provider-capabilities.json)
- [Full public MCP dataset](https://searchsdk.dev/mcp-public-data.json)
- [Canonical sitemap](https://searchsdk.dev/sitemap.xml)
- [llms.txt proposal](https://llmstxt.org/)
