turva-mcp
turva-mcp
A public, read-only Model Context Protocol (MCP) server for turva.dev.
It gives compatible AI clients structured access to turva.dev's service catalog, agent-readiness evidence, public web-security evidence and engagement principles. The server answers questions about turva.dev itself. It does not scan another domain, run an audit or perform transactions.
Connect
Streamable HTTP endpoint:
https://mcp.turva.dev/mcpNo authentication or API key is required. Set the endpoint in any MCP client with Streamable HTTP support. Clients that use a URL-based mcpServers configuration commonly accept this shape:
{
"mcpServers": {
"turva": {
"url": "https://mcp.turva.dev/mcp"
}
}
}The endpoint expects MCP POST requests, so opening /mcp in a browser returns 405. Check reachability through the discovery document instead:
curl.exe https://mcp.turva.dev/The server is listed in the official MCP registry as dev.turva/turva-mcp and in the Glama MCP directory.
Tools
Four read-only tools, each idempotent and returning JSON as text content. There are no write tools and no transaction tools.
get_services: the service catalog (Shopify agent storefront check, audit, advisory, implementation, agent operations and MCP server design), the engagement model, and pricing (four fixed list prices, the other two on request).get_agent_readiness: turva.dev's agent-readiness score, category scores, measurement date and verification link.get_security_evidence: public Hardenize and Internet.nl results for turva.dev, with their measurement date.get_principles: the async-only, least-access, measured-results and transparency principles.
Evidence
Tool responses come from static TypeScript objects bundled with the Worker. They are deterministic and do not depend on a live upstream request.
The two measurement tools include a measured_at date and public verification links. Treat their values as point-in-time evidence and compare them with a fresh scan when current status matters.
The bundled snapshot records these results for 2026-09-06:
Agent readiness: 100/100, Level 5 (Agent-Native) on isitagentready.com
Web security: 24/24 categories passed on Hardenize
Website standards: 98/100 on Internet.nl
Mail standards: 95/100 on Internet.nl
These are third-party readings for turva.dev, not scores produced by this server.
Endpoints
Method and path | Behavior |
| MCP over Streamable HTTP |
|
|
|
|
| Minimal discovery JSON with the server name, transport and endpoint |
| The same discovery JSON |
| Glama domain-verification document |
|
|
|
|
|
|
The full signed MCP server card is published at turva.dev/.well-known/mcp/server-card.json.
Protocol and implementation
A single Cloudflare Worker built on the Cloudflare Agents SDK serves the endpoint through createMcpHandler. A fresh McpServer is created for each request, and there is no Durable Object or persistent MCP session.
The current protocol lane uses revision 2026-07-28, and the SDK's legacy compatibility lane remains available at the same endpoint. On the current lane the handler validates MCP-Protocol-Version and Mcp-Method, plus Mcp-Name for tools/call. Standard MCP clients handle these details. server/discover is supplied by the SDK.
The discovery documents and tool data are compiled into the Worker. The MCP Worker is separate from the main turva.dev Worker, so changes here do not change the website.
Security and operating limits
Public and unauthenticated by design: every exposed value is already public.
Read-only MCP annotations on every tool: no destructive or open-world operation is declared.
Rate limit: 100 requests per 60 seconds per client IP, with
429andRetry-After: 60after the limit. The endpoint fails open if the rate-limiter binding errors.Browser CORS on
/mcp:https://turva.devis the only allowedOrigin, and the handler returns403for every other origin. Non-browser MCP clients normally send noOriginheader and can connect directly. Discovery documents use open CORS so directories can read them.No application request log: the code does not store request bodies, client identities or tool inputs. Cloudflare Workers observability is disabled. A rate-limiter failure writes one diagnostic error without request data.
Security headers are applied to MCP and discovery responses.
For private vulnerability reports, see SECURITY.md or email info@turva.dev.
Deploy your own copy
This repository is MIT licensed and can be adapted for another site. Before deploying a fork:
Replace the static service and evidence objects in
src/index.tswith your own published data.Replace the hard-coded
turva.devdomain, MCP endpoint, browser origin and verification links with values you control.Give the Worker a unique
nameand a rate-limitnamespace_idthat is not shared with another Worker in your Cloudflare account.Attach your own custom domain.
workers_devis disabled inwrangler.jsonc, andmcp.turva.devbelongs to this deployment.
Then install, check and deploy with your Cloudflare account:
cd turva-mcp
npm install
npm run typecheck
npx wrangler deployConfigure the custom domain under Workers & Pages, your Worker, Settings, Domains & Routes. Use your own hostname and update the discovery endpoint in src/index.ts to match it.
Verify the published claims
If you want an agent-readiness audit of your own domain, see turva.dev or Erik Rekola on LinkedIn.
License
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/erekola/turva-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server