One handler, two surfacesA route can stay a normal HTTP endpoint and, when you opt in, become an MCP tool without creating a second app path.
Auth stays visibleHTTP routes use route-level auth. MCP has a transport auth boundary, then the same route auth inside tool calls.
Built around speedQuater keeps the hot path small: Granian on RSGI, msgspec for JSON, and a native router underneath.
Docs by defaultOpenAPI, Swagger UI, and MCP tool docs are generated from the route metadata you already wrote.