关于 mcpcost
mcpcost 测量远程 MCP 服务的可用性和工具定义的 Token 成本,并提供可搜索的注册表看板、命令行工具和 CI 检查。它还向 Agent 和脚本提供查询、搜索及实时检测工具。
主要功能
- 01检测远程服务状态与延迟
- 02测量工具定义的 Token 成本
- 03搜索和筛选注册表服务
- 04跟踪服务状态与成本历史
- 05在 CI 中检查已配置服务
适用场景
- 01添加 MCP 服务前比较上下文成本
- 02按名称或状态查找注册表服务
- 03工具成本超出预算时让 CI 失败
- 04通过 Agent 查询或检测服务
MCP 相关
在 mcpcost.ulehla.dev/mcp 提供 Streamable HTTP MCP 服务,包含服务查询、搜索、实时检测和注册表摘要工具。命令行工具也可通过 stdio 将测量功能作为 MCP 服务提供。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcpcost.ulehla.dev/mcpclaude mcp add --transport http ondraulehla-mcpcost https://mcpcost.ulehla.dev/mcp{"mcpServers":{"ondraulehla-mcpcost":{"type":"http","url":"https://mcpcost.ulehla.dev/mcp"}}}在 Cursor 中打开{"servers":{"ondraulehla-mcpcost":{"type":"http","url":"https://mcpcost.ulehla.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"ondraulehla-mcpcost":{"type":"http","url":"https://mcpcost.ulehla.dev/mcp"}}}{"mcpServers":{"ondraulehla-mcpcost":{"serverUrl":"https://mcpcost.ulehla.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
4| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| nameOrUrl | string | 是 | 服务器的注册表名称或 HTTPS URL |
详细介绍
mcpcost
这个 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 使用
- 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 服务会占用多少上下文令牌。
榜单上的每台服务器都有一个页面和徽章:
[](https://mcpcost.ulehla.dev/s/io.github.you/your-server)
首次完整运行,2026-10-03
注册表中有 38 942 条最新条目。其中 24 294 条有远程端点,探测器在 40 分钟内连接了所有端点。
| 结果 | 服务数 | 占比 |
|---|---|---|
正常:initialize 和 tools/list 均成功 | 12 975 | 53 % |
| 需要身份验证(401、403) | 5 836 | 24 % |
| 不是 MCP:HTTP 200,但没有有效的 MCP 回复 | 1 800 | 7 % |
| 未找到(404、405、410) | 881 | 4 % |
| 无 DNS | 728 | 3 % |
| 受速率限制(429) | 500 | 2 % |
| 需要付费(402) | 434 | 2 % |
| 服务端错误(5xx) | 349 | 1 % |
| 其他 | 307 | 1 % |
| TLS 错误 | 259 | 1 % |
| 超时 | 204 | 1 % |
| 连接被拒绝 | 21 | 0 % |
在成功响应的 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/库和 CLImcpcost:注册表客户端、远程和 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时,也会查询 GeminicountTokens端点(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
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。