Making a knowledge base queryable by any agent over MCP A developer built AgentPostmortem, a public registry of AI-agent failure incidents, and Casebook MCP, a remote Model Context Protocol server that exposes the registry as tools any agent can call. The server runs as a single Cloudflare Worker with a stateless streamable HTTP transport, offering tools like search_cases, get_case, similar_failures, and list_tags. The developer implemented the MCP transport directly against the 2025-03-26 spec to keep the server simple and efficient. Every team debugging an AI-agent incident is quietly rediscovering a failure mode that someone else already documented. A support bot approves hundreds of fake refunds because a ticket told it to. A retry loop runs away and spams customers. A stale cache turns into a confident hallucination. These are not novel bugs. They are recurring shapes, and the knowledge about how they played out and what fixed them is usually locked in a blog post or a postmortem doc nobody thinks to search at 2am. I built AgentPostmortem https://agentpostmortem.com as a public registry of these documented failures. But a registry a human has to remember to visit is a registry that goes unused during the exact moment it matters: while an agent is actively investigating. So I built Casebook MCP: a remote MCP https://modelcontextprotocol.io server that turns the registry into tools any agent can call. Now Claude Code, Cursor, or an agent built on the Claude Agent SDK can ask, mid-investigation, "has anything like this happened before?" Casebook exposes four tools over the Model Context Protocol: search cases query, tag? for ranked full-text search over the case files, with an optional tag filter. get case id for the full detail of one case: outcome narrative, verified facts, unknowns, and lessons. similar failures description which takes a free-text incident description and returns the closest documented failures by keyword overlap. list tags for every failure-mode tag with its description.The tool that earns its keep is similar failures . You paste in what is actually happening "our support bot was tricked by text in a ticket into approving refunds" and get back real precedents, ranked, with the shared keywords, the outcome, and the lessons attached. That is the difference between a lookup table and something an agent can reason against. The whole thing runs as a single Cloudflare Worker. I chose to implement the MCP transport directly against the 2025-03-26 streamable HTTP spec in stateless mode rather than pull in a framework. There is one POST /mcp endpoint that handles initialize , tools/list , and tools/call . No sessions, no Durable Objects, no auth, because the data is public and read-only. That decision keeps the server a plain request/response function, which is exactly what a Worker is good at. The dispatch layer is just a switch over JSON-RPC methods. Here is the shape of it: async function dispatch req: JsonRpcRequest : Promise