Pick your data sources below. You'll get copy-pasteable Claude prompts to scaffold your own observability MCP server, adapted to your tools, with placeholders for your URLs and credentials. The pattern works regardless of whether you use Elasticsearch or Loki, MongoDB or PostgreSQL, Prometheus or Datadog.
MCP is just a protocol. The real work is in how you structure the server and write the tool descriptions.
app_logs queries your log store. db_slow_queries queries your database diagnostics. They don't know about each other. Claude reasons across them."summary" key: a one-sentence description of what was found. Claude reads this first. If the summary is good, the rest of the response is supplementary detail.Select what you use for each layer. The prompts below will update to match.
Run these prompts in order. Fill in the [PLACEHOLDERS] with your actual values before sending.
Both are specific to the streamable-HTTP transport. Both are invisible from error messages. Both cost hours.
StreamableHTTPSessionManager(stateless=True)Mount("/mcp", ...) redirects /mcp to /mcp/ as a GET. The client follows that redirect as a GET, not a POST, which breaks the handshake. Trivial fix, embarrassingly long to find.
/mcp/ (trailing slash) in the client URLThis is what takes time. The prompt scaffold gets you a working server in an hour. Getting Claude to call the right tool with the right parameters from a plain English question takes weeks of tuning.
time field (ISO string, e.g. "2024-01-15T09:30:00Z"). If different services use different field names for the same concept, say that explicitly.app-{service}-{date}, describe it. If a service name fragment works as a wildcard, say so. This is the single most common source of bad tool calls.message field is a string on some services and an object on others. The level field is an integer on some and a string on others. If Claude doesn't know this, it will write queries that blow up.