mcpField
M
mcpcost

mcpcost

远程服务
mcpcost.ulehla.dev开发工具2今天更新

关于 mcpcost

mcpcost 测量远程 MCP 服务的可用性和工具定义的 Token 成本,并提供可搜索的注册表看板、命令行工具和 CI 检查。它还向 Agent 和脚本提供查询、搜索及实时检测工具。

主要功能

  1. 01检测远程服务状态与延迟
  2. 02测量工具定义的 Token 成本
  3. 03搜索和筛选注册表服务
  4. 04跟踪服务状态与成本历史
  5. 05在 CI 中检查已配置服务

适用场景

  1. 01添加 MCP 服务前比较上下文成本
  2. 02按名称或状态查找注册表服务
  3. 03工具成本超出预算时让 CI 失败
  4. 04通过 Agent 查询或检测服务

MCP 相关

在 mcpcost.ulehla.dev/mcp 提供 Streamable HTTP MCP 服务,包含服务查询、搜索、实时检测和注册表摘要工具。命令行工具也可通过 stdio 将测量功能作为 MCP 服务提供。

配置

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

服务地址https://mcpcost.ulehla.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 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

4
参数类型必填说明
nameOrUrlstring是服务器的注册表名称或 HTTPS URL

详细介绍

mcpcost

CI npm mcpcost license Glama

这个 MCP 服务是否正常运行?它会占用多少上下文窗口?

实时面板:mcpcost.ulehla.dev

mcpcost 会探测 官方 MCP 注册表中的每个远程服务,并为每个服务记录:

  • 是否响应 initialize 和 tools/list,以及响应速度
  • 它协商的协议版本
  • 是否需要身份验证、使用哪种方案(来自 WWW-Authenticate),以及客户端如何连接:使用动态客户端注册的 OAuth、使用发布者提供的客户端 ID 进行 OAuth,或使用密钥(从服务的公开 OAuth 元数据中读取)
  • 是否要求付费(HTTP 402)
  • 拥有多少个工具,以及这些工具定义需要多少令牌

mcpcost:你自己的服务需要多少令牌?

npx mcpcost                     # reads Claude Code, Claude Desktop, Cursor, VS Code, Windsurf and Gemini CLI configs
npx mcpcost --config .mcp.json  # one file
npx mcpcost --budget 30000      # exit 1 when the total is above the budget, for CI
npx mcpcost --claude            # exact counts from the Anthropic count_tokens endpoint (free, needs ANTHROPIC_API_KEY)
npx mcpcost mcp                 # the same measurements as an MCP server over stdio, for your agent

它会按照客户端的启动方式启动每个已配置的服务,列出工具,并打印每个服务及所有服务的令牌开销。请参阅 packages/mcpcost。

需要身份验证的服务

返回 401 的服务可以连接,但在提供凭据之前不会进行测量。只需保存一次凭据;之后每次测量该 URL 时都会使用这些凭据。

npx mcpcost auth https://mcp.linear.app/mcp                                   # OAuth: register, consent in the browser, store the tokens
npx mcpcost auth https://api.githubcopilot.com/mcp/ --header "Authorization: Bearer ghp_…"   # an API key instead
npx mcpcost auth --list                                                       # what is stored, without the secrets

OAuth 流程遵循 MCP 授权规范:发现、动态客户端注册、PKCE,以及在 127.0.0.1 上设置回调。只有同意屏幕这一步需要人工操作。之后,令牌会保存在 ~/.mcpcost/credentials.json(权限模式为 0600,或保存到 $MCPCOST_CREDENTIALS);npx mcpcost 会为该 URL 发送令牌,刷新后的令牌也会写回文件。

面板也采用相同方式:npm run credentials:push 会将文件复制到 D1 表 credentials;每日运行会在探测前读取凭据,之后写回刷新后的令牌,并将服务标记为“使用凭据测量”。如果服务撤销或令刷新令牌过期,则需要再次执行同意步骤。

没有凭据时,面板仍会显示许多受限服务的工具集:工具定义不依赖令牌,因此,当发布者的代码库在 npm 或 PyPI 上保存了相关包时,probe/derive-packages.ts 会找到该包,并由每周运行的容器使用占位值进行测量。服务页面随后会注明“来自发布者的软件包”。probe/derived-aliases.json 会映射少数注册表条目中未注明代码库的服务。

在 CI 中作为 GitHub Action 使用

GitHub Marketplace

- uses: ondraulehla/mcpcost@v1
  with:
    config: .mcp.json   # one or more config files, one per line
    budget: 30000       # fail when the tool definitions cost more than this

作业摘要会生成一个表格,列出每个服务、测量结果和令牌开销,以及开销最高的工具。新增一个需要 40 000 个令牌的服务时,拉取请求检查会失败。设置 claude: true 并在 env 中配置 ANTHROPIC_API_KEY,即可通过免费的 count_tokens 端点获取精确计数;默认使用 o200k_base 估算。输出:tokens、servers、over-budget。

在拉取请求中,此 Action 还会测量基准分支上的相同配置文件,并发布一条评论,说明两者差异:新增、移除和变更的服务、每个服务的令牌变化、新的总量以及预算判定。每次推送都会更新评论,不会重复发布。作业需要 pull-requests: write 权限;如果没有该权限,此步骤会发出警告,但检查仍会运行。设置 comment: false 可关闭此功能。完整工作流见 .github/examples/mcp-budget.yml。

在 Claude Code 中作为插件使用

在 Claude Code 会话中:

/plugin install mcpcost --marketplace ondraulehla/mcpcost

也可以在 Shell 中运行:claude plugin marketplace add ondraulehla/mcpcost,然后运行 claude plugin install mcpcost@mcpcost。

该插件会添加一个技能 /mcpcost:measure,用于对你的配置运行 npx mcpcost 并读取结果;还会添加榜单的 MCP 服务,这样 Claude 就能在服务器加入配置前查找或探测它。该插件本身的开销:上下文中一条技能描述,以及 Claude Code 通过工具搜索延后调用的四个工具。

榜单

mcpcost.ulehla.dev 使用 D1 数据库在边缘渲染,并且每晚刷新。它加载的脚本只有主题切换脚本和 Cloudflare Web Analytics 信标,后者无需 Cookie 即可统计页面浏览量。

  • 概览:正常响应的服务器占比、令牌成本百分位数,以及用于检查任意服务器的表单
  • 检查:实时探测一个 URL,步骤与每日运行相同;准确的令牌数在浏览器中计算
  • 统计数据:按原因统计结果、令牌成本和工具数量百分位数、最庞大的工具集、协议版本、身份验证方案、传输方式,以及最大的发布者
  • 服务器:按名称、标题、描述和主机进行全文搜索(按词前缀匹配,因此 git copilot 可以找到 GitHub Copilot 服务器);还可按结果、协议和传输方式筛选,并提供七种排序方式。每个筛选条件都是可分享的纯 URL
  • 服务器页面:状态、延迟、协议、功能、成本最高的工具、工具集相同的服务器、历史记录、徽章和电子邮件提醒:当服务器停止响应、恢复响应,或其工具集或令牌成本发生变化时发送邮件
  • 跟踪:不在注册表中的服务器可以从检查页面添加跟踪;每日探测随后会以 url/<host>/<path> 为名称对其进行测量
  • 主机:最大的 500 个发布者,以及它们实际提供的不同工具集数量

面向 Agent 和脚本

  • JSON:/api/s/<name>.json、/api/servers.json?q=…&status=ok&sort=tokens、/api/check.json?url=…、/api/summary.json。列表 API 对来自同一地址的请求限流,每 10 秒最多 6 次;响应会缓存三小时。
  • 基于 Streamable HTTP 的 MCP 服务,无需身份验证:https://mcpcost.ulehla.dev/mcp,提供工具 lookup_server、search_servers、check_server、registry_summary。注册表的清单位于 site/server.json。
  • /llms.txt 列出了所有内容。/tokens 回答一个常见问题:MCP 服务会占用多少上下文令牌。

榜单上的每台服务器都有一个页面和徽章:

[![mcpcost](https://mcpcost.ulehla.dev/badge/io.github.you/your-server.svg)](https://mcpcost.ulehla.dev/s/io.github.you/your-server)

首次完整运行,2026-10-03

注册表中有 38 942 条最新条目。其中 24 294 条有远程端点,探测器在 40 分钟内连接了所有端点。

结果服务数占比
正常:initialize 和 tools/list 均成功12 97553 %
需要身份验证(401、403)5 83624 %
不是 MCP:HTTP 200,但没有有效的 MCP 回复1 8007 %
未找到(404、405、410)8814 %
无 DNS7283 %
受速率限制(429)5002 %
需要付费(402)4342 %
服务端错误(5xx)3491 %
其他3071 %
TLS 错误2591 %
超时2041 %
连接被拒绝210 %

在成功响应的 12 975 个服务中:

  • 工具集的中位成本为 1 727 个 token,第 90 百分位为 7 429,第 99 百分位为 28 200
  • 208 个服务的成本超过 20 000 个 token,46 个超过 50 000 个,3 个超过整个 200k 上下文窗口
  • 成本最高的是 com.replynodes/mcp:66 个工具,431 925 个 token
  • 服务的工具数中位数为 8,最多为 1 385
  • initialize 延迟中位数为 455 ms,第 90 百分位为 1.5 s
  • 60 % 使用协议 2025-11-25,24 % 仍使用 2025-03-26,4 % 使用 2024-11-05
  • 122 个服务使用协议 2026-07-28 响应,而当前的 TypeScript SDK 会拒绝该协议

注册表分布不均。16 534 个主机中,有 16 161 个各自发布了一个服务。五个主机合计发布了 6 000 多条目:一个 Workers 子域名有 2 365 条近乎相同的条目;一个网关有 1 716 条目,其中 1 321 条在 initialize 时返回 JSON-RPC 错误;另一个主机有 276 条目,全部返回 402。

工作原理

registry ──▶ probe/run.ts ──▶ data/raw/probe-run.json
                                   │
                        probe/build-data.ts
                                   │
               data/latest/{servers,summary,hosts}.json
                                   │
                           probe/to-sql.ts ──▶ import.sql ──▶ D1
                                                                │
                              site/ (Astro on Workers) ◀────────┘
  • packages/mcpcost/ 库和 CLI mcpcost:注册表客户端、远程和 stdio 探测器、配置发现、token 计数
  • probe/ 批量运行器和数据流水线
  • site/ 控制面板:使用 Cloudflare 适配器在 Workers 上运行的 Astro 7,从 D1 渲染并支持 FTS5 搜索、SVG 徽章;除主题切换和分析信标外,不使用客户端 JavaScript
  • .github/workflows/probe.yml 每天运行整个流水线:探测、计数、build-data、to-sql、D1 导入。运行生成的 summary.json、servers.json 和 hosts.json 会作为工作流构件上传;下一次运行会与其进行差异比较,并且只导入发生变化的行,每天写入量控制在免费套餐的 100 000 行额度内
  • .github/workflows/deploy.yml 在 site/ 发生变化时部署网站

方法

  • 传输。 探测器使用官方 TypeScript SDK 作为客户端。优先使用 Streamable HTTP;只有远程服务仅支持 SSE 时才使用 SSE。
  • 不建立 GET 流。 探测器会对 SDK 的独立 GET 请求返回 405,因此不会打开服务器到客户端的流。探测器不需要服务器发起的消息,而且有些服务会在该流保持打开时让 tools/list 卡住(DeepWiki 卡了 15 秒,同时一直没有响应 POST)。
  • 精确 Token 数量。 每日运行会通过 Anthropic count_tokens 端点查询每个正常运行的服务;设置了 GEMINI_API_KEY 时,也会查询 Gemini countTokens 端点(CLI:--gemini)。先查询 Anthropic:一次请求包含服务的工具和一个标记工具,另一次仅包含标记工具,两者之差就是这些工具在 claude-opus-5-5 中占用的 Token 数量。第二次计数会在每个工具名称前加上 Claude Code 的 mcp__<server>__ 前缀。该端点免费,且不会调用模型。仅当服务的工具定义发生变化时才会再次计数。约 5 % 的服务发布的 schema 会被端点拒绝;页面会显示估算值及原因。
  • 估算。 每个工具都会序列化为包含 name、description 和 input_schema 的紧凑 JSON,并使用 o200k_base 分词器计数。中位数下,精确计数约为估算值的 1.9 倍。估算无需密钥,且对所有服务采用相同方法。
  • 相同工具集。 对排序后的工具名称和 schema 大小计算哈希,以标记那些以不同名称提供相同工具的服务。
  • 超时。 每个请求超时为 15 秒。同一时间对同一主机最多运行一个探测器。
  • 获取访问权限。 对于返回 401 或 403 的服务,探测器会读取 OAuth 受保护资源元数据(RFC 9728)以及第一个授权服务器的元数据(RFC 8414,然后是 OpenID 发现):授权服务器、范围、发布者指南、动态客户端注册(RFC 7591)、PKCE、授权类型。服务页面会将其显示为“获取访问权限”,JSON API 则显示为 authKind 和 authMetadata。会发送 2 到 4 个小型请求,不需要令牌或用户同意;探测结果不会因此改变。
  • 身份识别。 每个请求都会携带 User-Agent mcpcost/<version> (+https://github.com/ondraulehla/mcpcost)。如需排除某个服务,请使用其注册表名称提交 issue。

运行

npm install
npm run probe -- --sample 200 --per-host 2        # a sample, results in data/samples/
npm run probe -- --all --out data/raw/probe-run.json
node --import tsx probe/build-data.ts --in data/raw/probe-run.json --out data/latest
node --import tsx probe/to-sql.ts --in data/latest --out data/latest/import.sql
npm test --workspaces --if-present

站点:在本地针对本地 D1 运行:

cd site
npm run db:schema:local && npm run db:import:local
npm run dev

发送提醒邮件需要发件域名:可以使用 Cloudflare Email Sending(Workers 付费计划,然后在 site/wrangler.jsonc 中配置 send_email 绑定),也可以使用 Resend(在 Resend 中验证域名,并运行 npx wrangler secret put RESEND_API_KEY)。如果没有配置发件域名,监控表单会提示无法发送确认邮件。

部署需要一个 Cloudflare 账户,以及一个名为 mcpcost 的 D1 数据库(运行 wrangler d1 create mcpcost,然后将 ID 写入 site/wrangler.jsonc)。工作流需要配置仓库密钥 CLOUDFLARE_API_TOKEN(权限:Workers Scripts 编辑、D1 编辑)和 CLOUDFLARE_ACCOUNT_ID。两个工作流每次运行都会应用 site/schema.sql 和 site/migrations/ 中待处理的文件。用于显示 Token 计数的两个索引(迁移 007 和 008)是个例外:每次构建都会为每个服务写入一行,因此探测工作流会在导入前一天应用其中一个,为导入预留其余写入额度。新数据库需要手动应用这两个索引一次。

边缘规则

Workers Free 套餐会统计 Worker 响应的每个请求,无论响应是 403 还是页面。2026-10-22 和 23 日,带有 Chrome 用户代理、来自托管服务地址(Meta 的云、Alibaba Cloud、RapidSeedbox)的爬虫每小时生成 4 000 个列表变体,耗尽了账户每天 100 000 个请求的额度,尽管 Worker 拒绝了这些请求。要拦截它们,必须在 Worker 运行之前采取措施:site/edge/rules.mjs 通过 API 幂等地写入该区域的 WAF 规则。

  • 一条自定义规则,在整个主机上拦截这些网络,但放行已验证的机器人
  • 一条自定义规则,对来自非已验证机器人的所有列表变体(/servers?…)发起托管质询;浏览器通过一次后即可访问,脚本则无法通过。列表 API(/api/servers.json)不受此规则影响:脚本和 Agent 无法通过质询,因此 API 在速率限制规则下保持开放
  • 一条自定义规则,拦截已验证机器人访问列表变体:robots.txt 禁止所有机器人访问这些页面,搜索引擎不会请求这些页面,而 Meta 的爬虫(使用 Chrome Agent 字符串的 meta-externalagent)在 2026-10-23 每小时访问了 3 000 个这样的页面
  • Free 套餐唯一的一条速率限制规则:来自同一地址的列表变体在十秒内超过六个时,拦截该地址十秒
CLOUDFLARE_API_TOKEN=… node site/edge/rules.mjs --dry-run   # shows what it would write
CLOUDFLARE_API_TOKEN=… node site/edge/rules.mjs

边缘规则工作流(.github/workflows/edge.yml)会在 main 上该文件变更时,或手动触发时,使用 CLOUDFLARE_ZONE_TOKEN 密钥运行脚本:该令牌在此区域具有 Zone: Zone WAF: Edit 和 Zone: Zone: Read 权限。探测脚本的令牌不具备这两项权限。site/src/middleware.ts 中间件保留了相同的拒绝规则,作为第二层防护,适用于区域规则无法检测到的 workers.dev 主机。

监控

site/edge/watch.mjs 会显示在一段时间内谁访问了站点,以及访问的成本:从账户分析数据中获取每小时 Worker 请求数和 D1 行数,并从 Worker 日志中获取对应的网络、Agent 和 URL 类型。监控边缘工作流(.github/workflows/watch.yml)每小时运行一次,检查此前一小时的数据。达到阈值(每小时 5 000 个 Worker 请求、来自一个 Agent 未标明爬虫的网络的请求每小时 800 次、来自同一网络的列表变体每小时 300 次(无论该网络如何标识自身)、每小时一百万行 D1 数据;这些阈值由 WATCH_* 变量设置)时,本次运行会标记为失败,并创建标有 edge-watch 的问题,或将该小时的数据添加到现有问题中。表格会标出网络;其 ASN 会加入 site/edge/rules.mjs 中的 SCRAPER_ASNS,边缘规则工作流会在请求到达 Worker 前将其拦截。报告还会列出这些时段中读取行数最多的 D1 查询。若区域令牌具有 Zone: Analytics: Read 权限,报告还会显示该区域在请求到达 Worker 前拦截了哪些请求。

CLOUDFLARE_API_TOKEN=… CLOUDFLARE_ACCOUNT_ID=… node site/edge/watch.mjs                                   # the last hour
CLOUDFLARE_API_TOKEN=… CLOUDFLARE_ACCOUNT_ID=… node site/edge/watch.mjs 2026-10-22T22:00:00Z 2026-10-23T06:00:00Z   # one night
旧主机

该站点在 2026-10-15 之前使用的域名是 mcp-pulse.ulehla.dev。旧主机仍是 Worker 的一个路由,site/src/middleware.ts 中间件会对该主机上的每个请求返回 301,重定向到 mcpcost.ulehla.dev。

静态资源会在 Worker 之前提供,Astro 适配器也会在中间件之前提供预渲染页面,因此旧主机上的 site/public/ 文件或预渲染页面会返回 200。wrangler.jsonc 中的 run_worker_first 不会改变这一点。因此,robots.txt、llms.txt 和方法说明页面都设置为路由,爬虫读取的每个页面都会经过中间件。只有 favicon、/_astro/ 下的字体以及搜索引擎验证文件仍是静态资源。

若要同时重定向这些资源,且完全不调用 Worker,请在 Cloudflare 控制面板的 ulehla.dev 区域中添加重定向规则(Rules、Redirect Rules、Create rule):

  • 当传入请求符合以下条件时:Hostname equals mcp-pulse.ulehla.dev
  • 然后:Dynamic redirect,表达式 concat("https://mcpcost.ulehla.dev", http.request.uri.path),状态代码 301,启用保留查询字符串

重定向规则会在 Worker 和静态资源之前运行,因此该规则涵盖所有路径。中间件仍作为 workers.dev 主机的后备方案,因为区域规则无法检测到该主机。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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