Yappy MCP server

Yappy runs two Model Context Protocol servers over Streamable HTTP. Neither requires authentication — the data is public, and making an agent complete an OAuth dance to read a changelog helps nobody.

SurfaceURLKind
Producthttps://yappy.biz/mcpTools that answer questions about Yappy
Documentationhttps://yappy.biz/docs/mcpThe docs corpus as resources

Both are listed in the official MCP registry under the domain-verified namespace biz.yappybiz.yappy/yappy for the product surface and biz.yappy/yappy-docs for the documentation one. Domain ownership is proved by the Ed25519 public key served at [/.well-known/mcp-registry-auth](https://yappy.biz/.well-known/mcp-registry-auth), so an agent can confirm the listing really belongs to this site rather than to somebody who picked a similar name.

The server card for the product surface is published at [/.well-known/mcp/server-card.json](https://yappy.biz/.well-known/mcp/server-card.json), so an agent can read the tool list before opening a transport connection.

Connect

Claude Code, Claude Desktop, Cursor, VS Code, and Goose all take the same shape:

{
  "mcpServers": {
    "yappy": { "type": "http", "url": "https://yappy.biz/mcp" },
    "yappy-docs": { "type": "http", "url": "https://yappy.biz/docs/mcp" }
  }
}

Claude Code, one line:

claude mcp add --transport http yappy https://yappy.biz/mcp

Transport

Streamable HTTP, protocol version 2025-06-18. POST /mcp with a JSON-RPC 2.0 body and Accept: application/json, text/event-stream. The server replies with a single JSON object for ordinary calls, and negotiates SSE when the client asks for a stream. Legacy HTTP+SSE transport is not offered; Streamable HTTP is the current standard and this server is new enough not to carry the old one.

curl -sX POST https://yappy.biz/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tools

Product surface — https://yappy.biz/mcp

ToolWhat it doesRead-only
get_latest_releaseThe current Yappy version, notes, and download URLyes
list_releasesRelease history, newest firstyes
get_pricing_plansWhat is free, and what a backend costsyes
get_frequently_askedThe FAQ, as question and answer pairsyes
get_system_requirementsMinimum macOS, chip, and every permissionyes
list_product_featuresCapabilities, with on-device and permission flagsyes
check_mac_compatibilityWhether a given macOS version and chip can run Yappyyes
create_export_jobStart an export of the docs, FAQ, or release corpusno
get_export_jobPoll an export job until it completesyes

Documentation surface — https://yappy.biz/docs/mcp

ToolWhat it doesRead-only
search_documentationFull-text search across docs and FAQyes
get_documentation_pageOne documentation page as markdownyes
list_documentation_pagesEvery page with its slug and summaryyes

Every tool carries a typed inputSchema with a required array, a description long enough to choose between them, and behavioural annotations. All of them are destructiveHint: false, and all but one are readOnlyHint: true. The exception is create_export_job, which creates a job — and a job is the only thing on this whole surface that can be created. There is no tool that can spend your money, change a user's data, or delete anything, by design.

Resources

resources/list returns:

  • yappy://docs/index — the documentation index (text/markdown)
  • yappy://llms.txt — the machine index (text/plain)
  • yappy://openapi.json — the REST contract (application/json)
  • yappy://releases/latest — the current release (application/json)

Each reads cleanly through resources/read with a declared mimeType and non-empty content.

MCP Apps

Tools that return a release or a pricing answer also carry _meta.ui.resourceUri, pointing at an inline ui:// resource so a host that supports MCP Apps can render the answer as a small card instead of a wall of JSON.

  • ui://yappy/release-card — version, date, notes, download button
  • ui://yappy/pricing-card — the free tier and backend cost table

Both are served as text/html;profile=mcp-app, open with <!DOCTYPE html>, declare <meta name="color-scheme" content="light dark"> so they read correctly in a dark host, and carry a scoped Content-Security-Policy that allows framing only by https://chatgpt.com and https://claude.ai. No secrets are embedded — there are none to embed, since the underlying API needs no key.

Errors

Invalid tool names and malformed arguments come back as JSON-RPC errors with a numeric code and a human-readable message, never as an empty response or a crash:

{"jsonrpc":"2.0","id":7,
 "error":{"code":-32602,"message":"Unknown tool 'get_transcript'. Call tools/list for the seven available tools."}}

-32700 parse error, -32600 invalid request, -32601 method not found, -32602 invalid params, -32603 internal error. Tool-level failures — a document that does not exist, say — come back as a successful result with isError: true and a message explaining what to try instead.

What it cannot do

It cannot transcribe audio. Yappy's speech recognition runs on the user's Mac and there is no hosted endpoint behind it. The MCP server answers questions about Yappy; the app does the work.

Reading this as an agent? The same page in markdown: /developers/mcp.md · machine index: /llms.txt · API: /openapi.json · MCP: https://yappy.biz/mcp