server.json і маніфести клієнтів

server.json і маніфести клієнтів

Кожен ендпоінт віддає ще два види документів. Обидва захищені правилом токена для документації (protected_doc JsonRpcBundle), відповідають 404 так само, як сам ендпоінт, і беруть URL ендпоінта із запиту: <prefix>[/{ver}].

server.json — MCP Registry

GET <prefix>/server.json (або <prefix>/v2/server.json) — документ, який очікує MCP Registry під час публікації сервера (схема 2025-12-11). Клієнти не читають його для підключення.

{
    "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
    "name": "io.github.your-org/your-app",
    "title": "Your App MCP Server",
    "description": "Exposes Your App RPC services as MCP tools.",
    "version": "v1",
    "websiteUrl": "https://api.example.com",
    "icons": [{"src": "https://example.com/icon.png", "mimeType": "image/png", "sizes": ["128x128"]}],
    "remotes": [{"type": "streamable-http", "url": "https://api.example.com/mcp"}]
}
  • name, title, description, icons — з mcp_server_info групи (з fallback поле за полем на загальне налаштування, див. Налаштування); незадані поля не потрапляють у документ.
  • version — {ver} запиту; websiteUrl — схема, хост і порт запиту; remotes[0].url — URL ендпоінта.

Маніфести клієнтів

GET <prefix>/manifest/{aiName}.json — готова конфігурація підключення. Токен лишається плейсхолдером: маніфест ніколи не містить справжнього токена. Ключ сервера в конфігурації — назва групи.

aiName Для чого Формат
claude Claude Code (.mcp.json) {"mcpServers": {"<group>": {"type": "http", "url": "…", "headers": {"Ufo-RPC-Token": "${UFO_MCP_TOKEN}"}}}}
cursor Cursor (mcp.json) {"mcpServers": {"<group>": {"url": "…", "headers": {"Ufo-RPC-Token": "${env:UFO_MCP_TOKEN}"}}}}
gemini Gemini CLI (settings.json) {"mcpServers": {"<group>": {"httpUrl": "…", "headers": {"Ufo-RPC-Token": "<UFO_MCP_TOKEN>"}}}}
openai OpenAI Responses API елемент tools[]: {"type": "mcp", "server_label": "<group>", "server_url": "…", "headers": {…}, "require_approval": "always"}
  • Claude Code і Cursor підставляють змінну оточення UFO_MCP_TOKEN самі.
  • Gemini CLI не підставляє змінні в заголовках, а OpenAI API надсилає заголовки як є: замініть <UFO_MCP_TOKEN> на токен вручну або у своєму коді.
  • require_approval: "always" для OpenAI — консервативне значення, щоб бандл не дозволяв виклики без підтвердження; змініть його за потреби.
  • Назва заголовка — ufo_json_rpc.security.token_name (типово Ufo-RPC-Token).

Невідомий aiName відповідає 404 {"error": "Unknown MCP client manifest \"…\"."}. Маніфест для іншого клієнта — див. Розширення.