{
  "openapi": "3.1.0",
  "info": {
    "title": "Emiote Public API",
    "version": "1.0.0",
    "summary": "Machine-readable surfaces of emiote.com for AI agents and developers",
    "description": "Emiote is a product and engineering studio (https://emiote.com). This document describes the publicly discoverable machine-readable resources on emiote.com — an agent-facing site surface, not a product REST API.\n\n## Versioning policy\n\n- Current version: **v1**, exposed at URL-path-versioned routes (`/api/v1/...`).\n- Unversioned aliases (`/api/ai`, `/api/md/_catalog`, `/api/mcp`) serve the **same v1 payloads** and are kept for backwards compatibility; prefer `/api/v1/...`.\n- Additive changes (new fields, new endpoints) do **not** bump the major version. Breaking changes ship as `/api/v2/...` alongside v1.\n- Deprecation is signalled with the standard `Deprecation: true` header plus a `Sunset` HTTP date on deprecated operations, announced at least 90 days before removal in [llms.txt](https://emiote.com/llms.txt) and [/docs](https://emiote.com/docs).\n\n## Errors\n\nAll JSON surfaces return errors as RFC 9457 `application/problem+json` with fields `type`, `title`, `status`, `detail`, `instance`, plus extensions `code` (machine-readable) and `resolution` (human/agent hint).\n\n## Rate limits\n\nRead-only endpoints return `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, and `RateLimit-Policy` headers (RFC 9334 field names). A 429 response includes `Retry-After`. Limit: 10 requests per 60-second window per client per instance.\n\nContact: dhanji@emiote.com.",
    "contact": {
      "name": "Emiote",
      "email": "dhanji@emiote.com",
      "url": "https://emiote.com/contact"
    }
  },
  "servers": [
    {
      "url": "https://emiote.com",
      "description": "Production site and API surface"
    }
  ],
  "tags": [
    {
      "name": "discovery",
      "description": "Catalogs and documents that index every machine-readable surface"
    },
    {
      "name": "data",
      "description": "Structured studio data (snapshot, pricing, catalog)"
    },
    {
      "name": "mcp",
      "description": "Model Context Protocol JSON-RPC endpoint"
    },
    {
      "name": "pages",
      "description": "Human-readable HTML pages also exposed via content negotiation"
    }
  ],
  "paths": {
    "/.well-known/api-catalog": {
      "get": {
        "tags": ["discovery"],
        "summary": "RFC 9727 API catalog (linkset)",
        "description": "Returns an application/linkset+json document indexing every public machine-readable surface on emiote.com. Start here when discovering what this domain offers to agents.",
        "operationId": "getApiCatalog",
        "responses": {
          "200": {
            "description": "RFC 9727 linkset catalog of public surfaces",
            "content": {
              "application/linkset+json": {
                "schema": { "$ref": "#/components/schemas/ApiCatalogLinkset" }
              }
            }
          },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      }
    },
    "/api/v1/ai": {
      "get": {
        "tags": ["data"],
        "summary": "Structured JSON snapshot of the studio (v1)",
        "description": "Complete structured snapshot of Emiote: positioning, founder contact, named offers with prices, products, case studies, FAQs, and journal metadata. Cache-friendly; regenerated on each deploy.",
        "operationId": "getAiSnapshotV1",
        "responses": {
          "200": {
            "description": "Studio snapshot",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/AiSnapshot" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      }
    },
    "/api/ai": {
      "get": {
        "tags": ["data"],
        "summary": "Structured JSON snapshot of the studio (unversioned alias)",
        "description": "Byte-identical alias of GET /api/v1/ai kept for existing integrations. Prefer /api/v1/ai.",
        "operationId": "getCurrentAiSnapshot",
        "deprecated": false,
        "responses": {
          "200": {
            "description": "Studio snapshot (identical payload to /api/v1/ai)",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/AiSnapshot" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      }
    },
    "/api/v1/mcp": {
      "get": {
        "tags": ["mcp"],
        "summary": "MCP server manifest (v1)",
        "description": "GET returns a plain-JSON manifest describing this Model Context Protocol server: name, protocol, transport, docs URL, and tool definitions. Useful for capability discovery before opening a JSON-RPC session.",
        "operationId": "getMcpServerManifestV1",
        "responses": {
          "200": {
            "description": "MCP server manifest",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/McpServerManifest" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      },
      "post": {
        "tags": ["mcp"],
        "summary": "MCP JSON-RPC 2.0 endpoint (v1)",
        "description": "HTTP POST transport for MCP JSON-RPC 2.0 requests. Supported methods: initialize, tools/list, tools/call, ping. All responses are valid JSON-RPC 2.0 objects — including errors (parse error -32700, method-not-found -32601). Send `MCP-Protocol-Version` header when known; defaults to 2024-11-05.",
        "operationId": "postMcpJsonRpcV1",
        "parameters": [
          {
            "name": "MCP-Protocol-Version",
            "in": "header",
            "required": false,
            "description": "MCP protocol revision requested by the client.",
            "schema": { "type": "string", "examples": ["2024-11-05"] }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/JsonRpcRequest" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC 2.0 result or error object",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body — JSON-RPC parse error (-32700)",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "404": {
            "description": "Unknown JSON-RPC method (-32601)",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "405": { "$ref": "#/components/responses/MethodNotAllowed" }
        }
      }
    },
    "/api/mcp": {
      "get": {
        "tags": ["mcp"],
        "summary": "MCP server manifest (unversioned alias)",
        "description": "Byte-identical alias of GET /api/v1/mcp. Prefer /api/v1/mcp.",
        "operationId": "getMcpServerManifest",
        "responses": {
          "200": {
            "description": "MCP server manifest",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/McpServerManifest" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      },
      "post": {
        "tags": ["mcp"],
        "summary": "MCP JSON-RPC 2.0 endpoint (unversioned alias)",
        "description": "Identical behavior to POST /api/v1/mcp. Prefer /api/v1/mcp.",
        "operationId": "postMcpJsonRpc",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/JsonRpcRequest" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC 2.0 result or error object",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body — JSON-RPC parse error (-32700)",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "404": {
            "description": "Unknown JSON-RPC method (-32601)",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "405": { "$ref": "#/components/responses/MethodNotAllowed" }
        }
      }
    },
    "/api/v1/md/_catalog": {
      "get": {
        "tags": ["data"],
        "summary": "Markdown route catalog (v1)",
        "description": "Markdown document listing every canonical route on emiote.com and how to fetch each one as text/markdown (Accept-header negotiation or direct endpoints).",
        "operationId": "getMarkdownCatalogV1",
        "responses": {
          "200": {
            "description": "Markdown catalog document",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      }
    },
    "/api/md/_catalog": {
      "get": {
        "tags": ["data"],
        "summary": "Markdown route catalog (unversioned alias)",
        "description": "Byte-identical alias of GET /api/v1/md/_catalog. Prefer /api/v1/md/_catalog.",
        "operationId": "getMarkdownCatalog",
        "responses": {
          "200": {
            "description": "Markdown catalog document",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
            },
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/Problem" }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "tags": ["discovery"],
        "summary": "Agent-oriented site summary (llms.txt)",
        "description": "Concise markdown/plain-text summary of Emiote with curated links: positioning, products, services, pricing, and all machine-readable endpoints. Includes agent guidance on when to use this site.",
        "operationId": "getLlmsTxt",
        "responses": {
          "200": {
            "description": "llms.txt document",
            "content": {
              "text/plain": {
                "schema": { "type": "string" },
                "text/markdown": {
                  "schema": { "type": "string" }
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "tags": ["discovery"],
        "summary": "Full site corpus (llms-full.txt)",
        "description": "Complete site knowledge corpus in a single markdown document: every product, case study, field note, and article.",
        "operationId": "getLlmsFullTxt",
        "responses": {
          "200": {
            "description": "llms-full.txt document",
            "content": {
              "text/plain": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/pricing.md": {
      "get": {
        "tags": ["data"],
        "summary": "Machine-readable offer sheet",
        "description": "Markdown pricing sheet for Reframe Stack Review ($199) and Build Sprint (from $1,200) with deliverables and timelines.",
        "operationId": "getPricingMarkdown",
        "responses": {
          "200": {
            "description": "Markdown offer sheet",
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/pricing": {
      "get": {
        "tags": ["pages"],
        "summary": "Human-readable pricing page",
        "description": "HTML pricing page matching /pricing.md. Send `Accept: text/markdown` to receive the markdown representation instead.",
        "operationId": "getPricingPage",
        "responses": {
          "200": {
            "description": "HTML page (or negotiated markdown)",
            "content": {
              "text/html": {
                "schema": { "type": "string" }
              },
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/docs": {
      "get": {
        "tags": ["pages", "discovery"],
        "summary": "Emiote developer documentation index",
        "description": "Human-readable documentation index linking every service, product, and agent-discovery resource on emiote.com.",
        "operationId": "getDocsIndex",
        "responses": {
          "200": {
            "description": "HTML documentation index",
            "content": {
              "text/html": {
                "schema": { "type": "string" }
              },
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/reframehub/": {
      "get": {
        "tags": ["pages"],
        "summary": "ReframeHub open-source & SaaS cost directory",
        "description": "Directory of open-source alternatives and self-hosted vs managed cloud cost comparisons, with field notes from real deployments.",
        "operationId": "getReframehubIndex",
        "responses": {
          "200": {
            "description": "ReframeHub directory index",
            "content": {
              "text/html": {
                "schema": { "type": "string" }
              },
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/contact": {
      "get": {
        "tags": ["pages"],
        "summary": "Contact and booking",
        "description": "Lead and scoping-call entry point: email dhanji@emiote.com or book a 15-minute call at https://cal.com/dhanjib/15min.",
        "operationId": "getContactPage",
        "responses": {
          "200": {
            "description": "HTML contact page",
            "content": {
              "text/html": {
                "schema": { "type": "string" }
              },
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "headers": {
      "RateLimitLimit": {
        "description": "Maximum requests allowed in the current window.",
        "schema": { "type": "integer", "example": 10 }
      },
      "RateLimitRemaining": {
        "description": "Requests remaining in the current window.",
        "schema": { "type": "integer", "example": 9 }
      },
      "RateLimitReset": {
        "description": "Seconds until the current window resets.",
        "schema": { "type": "integer", "example": 42 }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying a rejected request.",
        "schema": { "type": "integer", "example": 30 }
      }
    },
    "responses": {
      "Problem": {
        "description": "RFC 9457 problem details",
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/Problem" }
          }
        }
      },
      "NotFound": {
        "description": "Unknown path — RFC 9457 problem details with code `not_found`",
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/Problem" }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Unsupported HTTP method — RFC 9457 problem details with code `method_not_allowed`",
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/Problem" }
          }
        }
      },
      "TooManyRequests": {
        "description": "Rate limit exceeded — includes Retry-After and RateLimit-* headers",
        "headers": {
          "Retry-After": { "$ref": "#/components/headers/RetryAfter" },
          "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
          "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimitRemaining" },
          "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
        },
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/Problem" }
          }
        }
      }
    },
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 Problem Details with Emiote extensions (code, resolution).",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri-reference",
            "description": "URI identifying the problem class, e.g. https://emiote.com/problems/not_found"
          },
          "title": {
            "type": "string",
            "description": "Short human-readable summary."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation."
          },
          "instance": {
            "type": "string",
            "description": "Request path that produced the problem."
          },
          "code": {
            "type": "string",
            "description": "Stable machine-readable error code.",
            "enum": [
              "not_found",
              "method_not_allowed",
              "invalid_json",
              "invalid_request",
              "rate_limited",
              "internal_error"
            ]
          },
          "resolution": {
            "type": "string",
            "description": "Actionable hint for agents or developers on how to recover."
          }
        },
        "required": ["type", "title", "status"]
      },
      "LinkObject": {
        "type": "object",
        "properties": {
          "href": { "type": "string", "format": "uri" },
          "type": { "type": "string", "description": "IANA media type hint." },
          "title": { "type": "string" }
        },
        "required": ["href"]
      },
      "LinksetEntry": {
        "type": "object",
        "properties": {
          "anchor": { "type": "string", "format": "uri" },
          "service-desc": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/LinkObject" }
          },
          "service-doc": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/LinkObject" }
          },
          "describedby": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/LinkObject" }
          }
        }
      },
      "ApiCatalogLinkset": {
        "type": "object",
        "description": "RFC 9727 linkset document.",
        "properties": {
          "linkset": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/LinksetEntry" }
          }
        },
        "required": ["linkset"]
      },
      "Offer": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "name": { "type": "string" },
          "price": { "type": "string" },
          "priceNote": { "type": "string" },
          "audience": { "type": "string" },
          "tagline": { "type": "string" },
          "description": { "type": "string" },
          "includes": {
            "type": "array",
            "items": { "type": "string" }
          },
          "deliverable": { "type": "string" }
        },
        "required": ["id", "name", "price"]
      },
      "ProductSummary": {
        "type": "object",
        "properties": {
          "slug": { "type": "string" },
          "name": { "type": "string" },
          "stage": { "type": "string" },
          "tagline": { "type": "string" },
          "description": { "type": "string" },
          "purpose": { "type": "string" },
          "highlights": {
            "type": "array",
            "items": { "type": "string" }
          },
          "origin": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "liveUrl": { "type": "string", "format": "uri" }
        },
        "required": ["slug", "name", "stage", "tagline", "url"]
      },
      "CaseStudySummary": {
        "type": "object",
        "properties": {
          "slug": { "type": "string" },
          "title": { "type": "string" },
          "client": { "type": "string" },
          "summary": { "type": "string" },
          "outcome": { "type": "string" },
          "stack": {
            "type": "array",
            "items": { "type": "string" }
          },
          "url": { "type": "string", "format": "uri" }
        },
        "required": ["slug", "title", "outcome", "url"]
      },
      "AiSnapshot": {
        "type": "object",
        "description": "Structured snapshot of the Emiote studio for agents.",
        "properties": {
          "name": { "type": "string" },
          "tagline": { "type": "string" },
          "url": { "type": "string", "format": "uri" },
          "description": { "type": "string" },
          "positioning": { "type": "string" },
          "founder": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "title": { "type": "string" },
              "email": { "type": "string", "format": "email" },
              "github": { "type": "string", "format": "uri" },
              "linkedin": { "type": "string", "format": "uri" },
              "x": { "type": "string", "format": "uri" }
            },
            "required": ["name", "email"]
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "offers": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/Offer" }
          },
          "products": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/ProductSummary" }
          },
          "caseStudies": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/CaseStudySummary" }
          },
          "faqs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "q": { "type": "string" },
                "a": { "type": "string" }
              },
              "required": ["q", "a"]
            }
          },
          "journal": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": { "type": "string" },
                "date": { "type": "string" },
                "category": { "type": "string" },
                "readingTime": { "type": "string" },
                "description": { "type": "string" },
                "url": { "type": "string", "format": "uri" }
              }
            }
          }
        },
        "required": ["name", "tagline", "url", "positioning", "generatedAt", "offers"]
      },
      "McpToolDefinition": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "description": { "type": "string" },
          "inputSchema": {
            "type": "object",
            "description": "JSON Schema for tool input."
          }
        },
        "required": ["name", "description"]
      },
      "McpServerManifest": {
        "type": "object",
        "description": "Plain-JSON description of the MCP server returned by GET.",
        "properties": {
          "name": { "type": "string", "example": "Emiote Studio MCP" },
          "version": { "type": "string", "example": "1.0.0" },
          "protocol": { "type": "string", "example": "json-rpc-2.0" },
          "transport": { "type": "string", "example": "http-post" },
          "protocolVersion": { "type": "string", "example": "2024-11-05" },
          "docs": { "type": "string", "format": "uri" },
          "tools": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/McpToolDefinition" }
          }
        },
        "required": ["name", "version", "protocol", "transport", "tools"]
      },
      "JsonRpcRequest": {
        "type": "object",
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "description": "Request identifier (string or integer).",
            "oneOf": [{ "type": "string" }, { "type": "integer" }]
          },
          "method": {
            "type": "string",
            "enum": ["initialize", "tools/list", "tools/call", "ping"]
          },
          "params": {
            "type": "object",
            "description": "Method parameters. For tools/call: { name, arguments }."
          }
        },
        "required": ["jsonrpc", "method"]
      },
      "JsonRpcErrorObject": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "JSON-RPC error code, e.g. -32700 parse error, -32601 method not found.",
            "examples": [-32601]
          },
          "message": { "type": "string" },
          "data": {}
        },
        "required": ["code", "message"]
      },
      "JsonRpcResult": {
        "type": "object",
        "description": "Method-specific result. For initialize: protocolVersion, capabilities, serverInfo. For tools/list: { tools }. For tools/call: { content: [...] }.",
        "properties": {
          "protocolVersion": { "type": "string" },
          "capabilities": { "type": "object" },
          "serverInfo": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "version": { "type": "string" }
            }
          },
          "tools": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/McpToolDefinition" }
          },
          "content": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": { "type": "string", "const": "text" },
                "text": { "type": "string" }
              },
              "required": ["type", "text"]
            }
          }
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "description": "JSON-RPC 2.0 response: exactly one of `result` or `error`.",
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "oneOf": [{ "type": "string" }, { "type": "integer" }]
          },
          "result": { "$ref": "#/components/schemas/JsonRpcResult" },
          "error": { "$ref": "#/components/schemas/JsonRpcErrorObject" }
        },
        "required": ["jsonrpc"],
        "oneOf": [
          { "required": ["result"] },
          { "required": ["error"] }
        ]
      }
    }
  }
}
