mcpField
T
turva.dev

turva.dev

远程服务
turva.devAI 与智能体0今天更新

关于 turva.dev

turva.dev 是公开的只读 MCP 服务,提供 turva.dev 已发布的信息,包括联系方式和注明日期的测量证据。它供查询该网站信息的 MCP 客户端使用,不审计其他域名,也不执行交易。

主要功能

  1. 01提供服务与价格信息
  2. 02提供 Agent 就绪度测量结果
  3. 03展示有日期的安全测试证据
  4. 04说明运营原则和联系信息
  5. 05提供无需参数的只读工具

适用场景

  1. 01查找联系渠道和合作步骤
  2. 02查看网站公布的服务目录
  3. 03核对就绪度或安全证据的日期与链接

MCP 相关

通过 https://mcp.turva.dev/mcp 上的托管 Streamable HTTP MCP 端点提供五个只读工具。无需认证或 API key。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.turva.dev/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

5

此工具无需参数。

详细介绍

turva-mcp

turva-mcp on Glama

一个面向 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_readinessturva.dev 的 Agent 就绪度评分、类别评分、测量日期,以及扫描器起始页链接
get_security_evidenceturva.dev 的公开 Hardenize 和 Internet.nl 结果及其测量日期
get_principles关于书面工作、访问权限和验证的原则
get_contactturva.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.jsonGlama 域名验证文档
任何其他路径上的 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 包:

两者都通过 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 许可证,可改编后用于其他网站。部署分支之前:

  1. 将 src/index.ts 中的静态服务和证据对象替换为你自己发布的数据。
  2. 将硬编码的 turva.dev 域名、MCP 端点、浏览器来源和验证链接替换为你控制的值。
  3. 为 Worker 设置唯一的 name,并设置一个不会与 Cloudflare 账户中其他 Worker 共用的速率限制 namespace_id。
  4. 绑定你自己的自定义域名。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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。