关于 turva.dev
turva.dev 是公开的只读 MCP 服务,提供 turva.dev 已发布的信息,包括联系方式和注明日期的测量证据。它供查询该网站信息的 MCP 客户端使用,不审计其他域名,也不执行交易。
主要功能
- 01提供服务与价格信息
- 02提供 Agent 就绪度测量结果
- 03展示有日期的安全测试证据
- 04说明运营原则和联系信息
- 05提供无需参数的只读工具
适用场景
- 01查找联系渠道和合作步骤
- 02查看网站公布的服务目录
- 03核对就绪度或安全证据的日期与链接
MCP 相关
通过 https://mcp.turva.dev/mcp 上的托管 Streamable HTTP MCP 端点提供五个只读工具。无需认证或 API key。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.turva.dev/mcpclaude mcp add --transport http turva https://mcp.turva.dev/mcp{"mcpServers":{"turva":{"type":"http","url":"https://mcp.turva.dev/mcp"}}}在 Cursor 中打开{"servers":{"turva":{"type":"http","url":"https://mcp.turva.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"turva":{"type":"http","url":"https://mcp.turva.dev/mcp"}}}{"mcpServers":{"turva":{"serverUrl":"https://mcp.turva.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
5此工具无需参数。
详细介绍
turva-mcp
一个面向 turva.dev 的公开、只读 Model Context Protocol 服务,以 TypeScript 编写。它允许 AI 客户端查询该网站已发布的信息,包括联系方式和标注日期的测量证据。
例如,有人询问如何联系我时,客户端可以调用 get_contact。响应会说明如何开始。该服务回答关于 turva.dev 本身的问题,不会扫描其他域名、执行审计或进行交易。
连接
Streamable HTTP 端点:
https://mcp.turva.dev/mcp
直接连接到托管服务。无需安装 npm、身份验证或 API 密钥。在支持 Streamable HTTP 的 MCP 客户端中设置该端点。使用基于 URL 的 mcpServers 配置的客户端通常接受以下格式:
{
"mcpServers": {
"turva": {
"url": "https://mcp.turva.dev/mcp"
}
}
}
该端点需要 MCP POST 请求。在浏览器中打开 /mcp 会返回 405。请改用发现文档检查是否可访问:
curl https://mcp.turva.dev/
在 Windows PowerShell 中,如果 curl 指向 Invoke-WebRequest,请使用 curl.exe。
该服务已列入官方 MCP 注册表,名称为 dev.turva/turva-mcp,也收录于 Glama MCP 目录。
试用工具
连接后,使用空参数对象调用 get_contact。在 MCP 客户端 SDK 中,调用方式如下:
const result = await client.callTool({ name: "get_contact", arguments: {} });
const contact = result.structuredContent;
console.log(contact.email, contact.first_reply);
这里的 client 是你已连接的 MCP 客户端。对于只读取文本的客户端,相同的 JSON 也位于 result.content[0].text 中。以下响应摘录展示了 src/index.ts 中维护的联系字段:
{
"email": "[email protected]",
"location": "Tampere, Finland",
"engagement": "async_only",
"first_reply": "Within one business day, in writing, by email or Signal. LinkedIn messages have no set reply time."
}
完整响应还包括其他联系渠道、开始合作的步骤,以及说明 turva.dev 由谁运营的 operator 对象。
不使用 SDK 时,当前协议通道中的请求除了 JSON-RPC 主体,还需要四项内容:MCP-Protocol-Version 标头、Mcp-Method 标头、在 tools/call 请求中使用的 Mcp-Name 标头,以及一个位于 params 中、注明协议版本和客户端功能的 _meta 对象。以下是使用 curl 发起相同调用的方式:
curl https://mcp.turva.dev/mcp \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/call" \
-H "Mcp-Name: get_contact" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_contact","arguments":{},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'
响应是一个 JSON-RPC 响应,联系数据位于 result.structuredContent 中。
工具
五个只读工具,均为幂等工具。每个工具都会以 structuredContent 返回数据,其结构由工具的 outputSchema 描述;同时也会在文本块中返回相同的 JSON。工具均不接受参数:输入架构不允许传入参数,传入参数的调用会返回工具错误。没有写入工具或交易工具。
| 工具 | 返回内容 |
|---|---|
get_services | 合作模式、服务目录(Shopify Agent 商店检查、审计、咨询、实施、Agent 运营和 MCP 服务设计)和价格(四项固定标价及两项按需报价);另包括两个实施附加项目,均有固定价格,且仅与其后续诊断服务搭售 |
get_agent_readiness | turva.dev 的 Agent 就绪度评分、类别评分、测量日期,以及扫描器起始页链接 |
get_security_evidence | turva.dev 的公开 Hardenize 和 Internet.nl 结果及其测量日期 |
get_principles | 关于书面工作、访问权限和验证的原则 |
get_contact | turva.dev 的运营者、联系渠道、首次回复时间,以及审计所需的访问权限 |
证据
工具响应来自打包在 Worker 中的静态 TypeScript 对象,不依赖实时上游请求。测量工具包含 measured_at 日期和公开验证链接,因此在需要了解当前状态时,请将记录的数值与最新扫描结果进行比较。
打包的快照记录了 isitagentready.com 上 100/100、Level 5 Agent-Native,Internet.nl 网站测试 上 98/100,以及其邮件测试上的 90/100。快照还记录了 Hardenize 上全部 24 个类别均通过。所有数据的日期均为 2026-10-21。这些测量结果来自第三方。本服务并未生成任何这些评分。
端点
| 方法和路径 | 行为 |
|---|---|
POST /mcp | 通过 Streamable HTTP 使用 MCP。请求正文超过 64 KiB 时返回 413;JSON-RPC 批量请求返回 400,错误码为 -32600 |
GET /mcp、DELETE /mcp | 返回 405,并带有 Allow: POST, OPTIONS。不提供 GET 流,也不拆除会话 |
OPTIONS /mcp | 接受的 MCP 预检请求返回 200;浏览器的 Origin 不在允许范围内时返回 403 |
/mcp/ | 返回 308,重定向到 /mcp,并保留请求方法和查询字符串。预检 OPTIONS 请求会按照 /mcp 的方式响应,因为浏览器不会跟随预检请求的重定向 |
GET / | 返回包含服务名称、传输方式和端点的最简发现 JSON |
GET /.well-known/mcp | 返回相同的发现 JSON |
GET /.well-known/glama.json | Glama 域名验证文档 |
任何其他路径上的 OPTIONS | 返回 204,用于发现功能的 CORS 预检 |
除 /mcp 和 /mcp/ 之外任何路径上的 POST、PUT、DELETE 或 PATCH | 返回 405,并带有 Allow: GET, HEAD, OPTIONS |
任何其他路径上的 GET 或 HEAD | 返回 404 |
对发现文档的 HEAD 请求会返回其标头,不包含正文。发现文档带有 Cache-Control: public, max-age=3600,缓存时间与 tools/list 和 server/discover 声明的相同,均为一小时。
主站提供完整的已签名 MCP 服务卡片,位于 turva.dev/.well-known/mcp/server-card.json。
协议与实现
一个基于 Cloudflare Agents SDK 构建的 Cloudflare Worker 通过 agents/mcp/server 中的 createMcpHandler 提供该端点,并为每个请求从 @modelcontextprotocol/server 创建一个全新的 McpServer。这里没有 Durable Object,也没有持久化的 MCP 会话。
当前协议通道使用修订版 2026-07-28。同一端点上的旧版通道为 2025 年前后的客户端提供服务。该通道是 Agents SDK 中的一个适配器,并通过 @modelcontextprotocol/server 的 Web 标准服务器传输方式响应。
在当前通道上,每个请求都必须携带 MCP-Protocol-Version 和 Mcp-Method,对于 tools/call,还必须携带 Mcp-Name;缺少其中任一项的请求都会收到 400,错误代码为 -32020。请求正文的验证优先处理,响应为 -32602 或工具错误。格式错误的 params 和未知工具名称都归入此类,名为 __proto__ 的参数也一样。其他意外参数会在检查标头后进行检查,SDK 会对此返回工具错误。JSON-RPC 通知会传给 SDK,不进行此标头检查。@modelcontextprotocol/server 会检查 Mcp-Method 和 Mcp-Name,而 Worker 会在处理程序运行前检查 MCP-Protocol-Version,因为该软件包会从请求正文读取版本,否则就会响应缺少该标头的请求。
在当前通道上,不会检查 Accept;旧版通道则会在 Accept 未同时列出 application/json 和 text/event-stream 时响应 406。标准 MCP 客户端会处理这些细节。
server/discover 由 @modelcontextprotocol/server 提供。它声明 tools 能力的 listChanged: false,因为工具集只会在部署时更改,且服务器不会发送更改通知;它还会返回简短说明,指出哪个工具可以回答哪个问题。
发现文档和工具数据会编译进 Worker。此 Worker 与主 turva.dev Worker 相互独立,因此这里的更改不会影响网站。
依赖项
代码导入 @modelcontextprotocol/server、agents 和 zod。package.json 还列出了代码未导入的 @modelcontextprotocol/client 和 @modelcontextprotocol/sdk。package.json 中锁定的 agents 版本将这三个 MCP 软件包都声明为必需的精确版本对等依赖项,因此 npm 必须安装它们,但 @modelcontextprotocol/client 和 @modelcontextprotocol/sdk 都不会被打包进 Worker。
安全与运行限制
此服务没有写入路径,只返回公开数据,因此需要抵御的是对端点本身的滥用:来自单个地址的负载、精心构造的高开销请求,以及其他网站上的页面从访客的浏览器调用此服务。
- 按设计,此服务公开且无需身份验证。所有公开的值本来就是公开的。
- 每个工具都带有只读 MCP 注释。未声明任何破坏性操作或开放世界操作,且没有工具接受参数。
- 速率限制:每个客户端 IP 每 60 秒约 100 个请求,超过后返回
429和Retry-After: 60。Cloudflare 的速率限制绑定会在每个位置分别维护近似计数,因此在首次返回429前,突发请求可能会通过更多请求。如果速率限制器绑定缺失或出错,端点将默认放行。 - 请求大小:超过 64 KiB 的请求正文会在处理程序读取之前收到
413;两条通道上的 JSON-RPC 批量请求都会收到400,因此单个请求无法携带大量工具调用来绕过速率限制。 /mcp上的浏览器 CORS 接受主机名为turva.dev的Origin,无论其协议或端口为何;其他所有来源都会被拒绝,并返回403。非浏览器 MCP 客户端通常不会发送Origin标头,可以直接连接。发现文档使用开放 CORS,以便目录读取。- 代码不会存储请求正文、客户端身份或工具输入。Cloudflare Workers 可观测性处于禁用状态。速率限制器发生故障时,只会写入不含请求数据的诊断错误。
- MCP 和发现响应均会应用安全标头。
如需私下报告漏洞,请参阅 SECURITY.md 或发送邮件至 [email protected]。
此服务之外的相关工具
以下两项检查是独立工具。它们不是 MCP 工具,此服务也不会运行它们。若要检查其他网站,请使用独立的 npm 包:
- turva-llms-txt-validator 可检查 llms.txt 结构和首页发现声明。其浏览器版本接受任何公开域名。
- markdown-parity-check 可比较 HTML 页面和 Markdown 页面的主要内容。其浏览器版本仅检查 turva.dev 自己发布的页面。
两者都通过 npx 运行,且都需要 Node.js 22 或更高版本。验证器说明和比较说明介绍了参数和退出代码。
开发和测试
此 Worker 需要 Node.js ^22.18.0 || >=24.11.0,这是 package.json 中 engines 字段指定的版本范围。入口文件是 src/index.ts。没有构建步骤:运行或部署时,Wrangler 会打包 TypeScript;Node 则会通过剥离类型来运行测试。
npm ci
npm run dev
npm test
npm run typecheck
npm run dev会启动wrangler dev,运行 Worker 的本地副本。npm test会对test/catalog.test.ts和test/protocol.test.ts运行node --experimental-strip-types --test。npm run typecheck会运行两次tsc --noEmit:一次使用tsconfig.json检查src,另一次使用tsconfig.test.json检查test。package.json中的两个overrides是有意设置的。其中一个将@hono/node-server固定在已修补的版本,原因见 SECURITY.md;另一个将 Workers 类型的所有副本指向直接依赖。移除其中任何一项之前,请再次运行npm ci和npm audit。
此工作流 会在每次推送和拉取请求时运行,并且仅具有只读权限。它只有一个作业 test,分别使用 Node.js 22 和 24。该作业会运行 npm ci、npm audit --omit=dev --audit-level=moderate,然后运行 npm test 和 npm run typecheck。如果运行时依赖存在严重程度为中等或更高的安全公告,构建会在审计步骤失败。此工作流不会执行任何部署。
此仓库中最后的 JavaScript 文件是两个测试文件。它们于 2026 年 10 月 20 日(网站 Worker 更名当天)迁移到 TypeScript,此后一直由 tsconfig.test.json 进行类型检查。src/index.ts 中的服务端代码原本就是 TypeScript。
部署自己的副本
此仓库采用 MIT 许可证,可改编后用于其他网站。部署分支之前:
- 将
src/index.ts中的静态服务和证据对象替换为你自己发布的数据。 - 将硬编码的
turva.dev域名、MCP 端点、浏览器来源和验证链接替换为你控制的值。 - 为 Worker 设置唯一的
name,并设置一个不会与 Cloudflare 账户中其他 Worker 共用的速率限制namespace_id。 - 绑定你自己的自定义域名。
wrangler.jsonc中已禁用workers_dev。
按照“开发和测试”中的说明运行检查,然后使用你的 Cloudflare 账户进行部署:
npm run deploy
在 Workers & Pages、你的 Worker、Settings、Domains & Routes 下配置自定义域名。使用你自己的主机名,并更新 src/index.ts 中的发现端点,使其与之匹配。
维护者
由 Erik Rekola 在 turva.dev 构建。有关实现的问题可发送至 [email protected]。我从事写作工作。turva.dev 为其他网站提供类似这样的服务端构建服务:MCP 服务设计。
企业注册信息可在芬兰商业信息系统中查询。
许可证
MIT。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。