mcpField
T
teamspend

teamspend

本地服务
github.com/RudrenduPaul数据与分析05 周前更新

关于 teamspend

teamspend 是用于比较不同时段 AI 编码工具支出的命令行工具和库,适合评估迁移效果的团队及使用本地会话数据的个人。它整合服务商 API、本地日志和 CSV,并明确标注估算值与不可用数据。

主要功能

  1. 01比较迁移前后的支出
  2. 02读取 API 与本地日志
  3. 03导入历史 CSV 数据
  4. 04生成 JSON 和文本报告
  5. 05标注估算费用及缺失数据

适用场景

  1. 01评估切换编码工具后的支出
  2. 02将 API 数据与旧 CSV 记录合并
  3. 03在脚本或 CI 中查看各工具费用

MCP 相关

README 将 teamspend 描述为 MCP 服务,可通过 MCP 工具比较 AI 编码工具支出。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"rudrendupaul-teamspend": {
"command": "uvx",
"args": [
"teamspend-cli"
]
}
}
}
启动命令uvx teamspend-cli

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiteamspend-cli0.2.6

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

teamspend

npm version PyPI version CI License: Apache 2.0 Node PRs welcome

安装 • 用法 • 功能 • 比较 • 常见问题 • 参与贡献

你的 AI 编码工具永远不会告诉你,在它们之间切换是否真的省了钱。teamspend 可以,只需一条命令。

终端录屏:从打包的 tarball 安装 teamspend-cli,然后运行 claude-code-personal 前后对比,打印各时段的总支出和 DELTA 行

上方录屏使用了 claude-code-personal(无需凭据,读取本地会话日志),因此从安装到首次运行的整个流程无需管理员 API 密钥即可端到端演示;无论你使用哪个适配器,实时输出格式都相同。

npx teamspend-cli --tools cursor,claude-code --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

现在支持六种工具,而不是两种:Cursor、Claude Code、GitHub Copilot、OpenCode 和 Codex CLI,以及无需凭据的个人模式,适用于没有管理员访问权限的用户。如今,越来越多的团队同时使用不止一种 AI 编码工具,或在不同工具间切换。每种工具都有一个只对自身数据完全准确、在结构上无法展示其他信息的仪表板。teamspend 正是缺少的那一环:一个真实数字,直接从两种工具各自的 API 获取,准确显示发生了什么变化。

目录

实际效果

npx teamspend-cli --tools cursor,claude-code --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

示例输出(下方仅展示格式;实际数字来自你所在组织的 API 数据):

teamspend snapshot -- migration cost comparison
Tools: cursor -> claude-code

BEFORE (cursor)
  Total spend:      $2,140.00  (exact, usage-based)
  Active users:      14

AFTER (claude-code)
  Total spend:      $1,860.00  (exact, usage-based)
  Active users:      14

DELTA: -$280.00 (-13.1%)

Full report: ./teamspend-snapshot-2026-07-11T142842.json

这就是整个产品。一条命令,一个真实数字,不用电子表格。

它实际能做什么

  • 获取真实数据,而非抓取或估算。 直接调用 Cursor 的 Admin API 和 Anthropic 的 Claude Enterprise Analytics API。你看到的数据就是供应商报告的数据。
  • 跨工具对比,这是任何单一供应商的仪表板都无法做到的。 Cursor 的仪表板显示 Cursor 的数据,Claude Code 的仪表板显示 Claude Code 的数据。teamspend 会把两者的数据放在同一份报告中。
  • 通过导入 CSV 补齐历史数据缺口。 如果你的对比时间范围早于某个工具 API 提供的历史数据,只需提供格式相同的 CSV,它就会将这些行纳入同一份报告,无需单独合并。
  • 绝不悄无声息地失败。 如果无法获取对比数据的其中一方,你会看到清晰的“数据不可用”提示和原因,绝不会把错误数字当作正确数字呈现。
  • 采用生产级客户端应有的重试机制。 遇到速率限制、超时和暂时性错误时,会自动指数退避重试,并设置上限和边界,因此 API 调用不稳定不代表结果也不稳定。
  • 标记可疑的零值,而不是盲目信任。 Cursor 和 Claude Code 的固定席位计费套餐可能会针对有实际令牌活动的用户报告看似精确的 $0。teamspend 会检测这种情况,并将数字标记为估算值,而不是显示误导性的零。
  • 运行时依赖为零。 无需审查自身代码以外的供应链。使用原生 fetch、原生命令行参数解析和原生文件 I/O。

不到一分钟即可开始

teamspend 提供两个独立且同等完善的软件包——选择适合你工具链的那个,也可以两个都安装。它们连接相同的六种数据源,并计算相同的前后差值。

# npm -- JavaScript/TypeScript CLI + library
npm install -g teamspend-cli

# PyPI -- Python CLI + library (genuine port, not a wrapper around the Node binary)
pip install teamspend-cli

两个软件包的名称都是 teamspend-cli(较早的 teamspend 名称已更名,以匹配本项目的其他软件包,随后于 2026-08-03 从两个注册表中彻底撤下——维护者和仓库相同,但已无法通过任何版本安装)。无论安装哪个,安装后的命令都是 teamspend。

提供用于对比的两个工具的 API 密钥:

export TEAMSPEND_CURSOR_TOKEN=<your Cursor Admin API key>
export TEAMSPEND_CLAUDE_CODE_TOKEN=<your Anthropic Admin/Analytics API key>

两者都需要平台组织管理员级别的访问权限。如果你已经能查看组织的账单信息,就具备所需权限。

teamspend --tools cursor,claude-code --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

添加 --json,即可将完整的 JSON 报告输出到 stdout,而不是输出上面的易读摘要——适合通过管道传递给其他脚本或 CI 步骤。无论是否指定,JSON 报告文件都会写入磁盘;--json 只会改变输出到终端的内容。

要改为与 GitHub Copilot 对比?请参阅下文的 "GitHub Copilot 支持"——它比 Cursor/Claude Code 多需要两个环境变量,原因值得你在将其用于真实组织之前了解。

两个 CLI 都接受相同的对比标志(--tools、--before、--after、 --json、--before-csv、--after-csv、--breakdown、--help/-h、 --version/-V),并输出相同格式的内容。完整标志参考请参阅下文的 命令一节;Python 软件包的库 API 请参阅 python/README.md;涵盖这两种发行版的完整指南请参阅 docs/getting-started.md。

不只好用,更值得信赖

一款涉及团队支出和电子邮件数据的工具,应当以公开透明赢得信任。以下是这个代码库的实际情况,每次提交都会进行检查,而非营销文案里的空口承诺:

运行时依赖零
软件包大小打包后 56.8 kB,解包后 193.1 kB
冷启动安装到首次响应不到 1 秒,在清空 npm/npx 缓存后测得
测试102 项通过(npm),116 项通过(PyPI),TypeScript 测试套件的行覆盖率为 97%
已知漏洞零,据 npm audit 检查
文件权限报告文件仅限所有者访问(0600),并自动添加到 git 忽略列表,因为其中包含每位用户的电子邮件和支出数据

CSV 导入,用于无法通过实时 API 获取的历史数据

date,user_email,cost_usd,is_estimated
2025-11-01,[email protected],12.50,false

npx teamspend-cli --tools cursor,claude-code --before 2025-11-01:2025-11-30 --after 2026-06-01:2026-06-30 --before-csv ./before.csv

支持 GitHub Copilot

export TEAMSPEND_COPILOT_TOKEN=<a token with read:org on the org>
export TEAMSPEND_COPILOT_ORG=<your GitHub org login>
export TEAMSPEND_COPILOT_SEAT_PRICE_USD=19   # optional, see below

npx teamspend-cli --tools cursor,copilot --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

凭据: TEAMSPEND_COPILOT_TOKEN 需要具有 read:org 权限范围(经典 PAT),或具有精细化的“View Organization Copilot Metrics”权限;组织还必须使用 Copilot Business 或 Enterprise。 TEAMSPEND_COPILOT_ORG 也是必需的——与 Cursor 和 Claude Code 的管理员 API 不同,GitHub 的 Copilot 指标端点会在 URL 路径中限定到特定的组织登录名,而不只是限定到令牌。

teamspend 如何如实计算美元金额: GitHub 真实的、当前的 Copilot 使用情况指标 API(GET /orgs/{org}/copilot/metrics/reports/users-1-day,在构建过程中已对照 GitHub 自己的文档确认——一些其他工具仍引用的旧版 /orgs/{org}/copilot/metrics 端点已于 2026-04-02 被 GitHub 停用,不再可用)完全没有任何成本或支出字段。Copilot Business/Enterprise 按席位固定计费(每席位每月 $19 或 $39,包含相应的每月 AI 积分额度),而且 GitHub 不会通过任何 API 提供组织实际签订的席位价格——这与此工具中 Cursor 和 Claude Code 的固定席位计费档位存在相同的结构性缺口。

API 确实会返回每位用户的 ai_credits_used。teamspend 会按 GitHub 自己公布的固定汇率 1 个 AI 积分 = $0.01 USD 将其换算为美元——这并非凭空编造,也不是按组织协商得出的价格。如果你设置了 TEAMSPEND_COPILOT_SEAT_PRICE_USD,这笔固定价格会在整个对比时间段内按每位活跃用户加收一次(绝不会按天加收),以反映仅按积分计算的金额中未包含的许可证成本;如果不设置,报告的金额就只包含积分使用成本,并明确不含席位费用。

由于一开始就没有供应商报告的成本字段,所有 Copilot 结果——无论是否设置席位价格——都会标记为 isEstimated: true。这比 Cursor 和 Claude Code 的可疑零值标记更严格,后者只会在特定的零成本模式下触发:Copilot 原本就没有可采信的原生美元金额,因此 teamspend 不会声称有这样的金额。完整机制请参阅 docs/concepts.md,其中包括为何一个对比时间段意味着每个日历日调用一次 API,而不是整个时间范围只调用一次。

OpenCode:仅限本地使用,无需 API 密钥

OpenCode(前身为 sst/opencode) 完全没有管理员、团队或账单 API——它是一个本地 CLI,没有组织级使用情况端点,这一点已通过其 README 确认。 没有任何内容可供 TEAMSPEND_OPENCODE_TOKEN 进行身份验证,因此这个变量并不存在;teamspend 会直接从磁盘读取 OpenCode 自己的本地会话日志(~/.local/share/opencode/storage/message/,如果设置了 $OPENCODE_DATA_DIR,则从该目录读取),使用的文件格式与 OpenCode 自身写入的格式相同,ccusage 的 OpenCode 指南 和 tokscale 也都已在读取这种格式。

teamspend --tools claude-code,opencode --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

终端录屏:运行 teamspend 并使用 OpenCode 本地日志适配器和 --breakdown session,打印两个时段的预估总支出和按会话划分的费用表,随后显示整体 DELTA 行

在信任这个数字之前,有两点需要如实说明:

  • 这是这台机器的用量,不是你团队的用量。 OpenCode 的本地消息文件中没有任何用户或电子邮件字段——它是一个没有团队概念的单人开发工具——因此 teamspend 会将找到的所有数据都归到一个虚拟用户名下,即运行命令的 OS 账户。要比较整个团队的 OpenCode 支出,需要在每个人的机器上运行 teamspend,或者通过其他方式收集数据,再使用 CSV 导入。
  • 金额始终标记为预估值。 对于大多数模型,OpenCode 在本地消息文件中存储的 cost: 0(它本身没有实时定价表),因此 teamspend 会汇总 OpenCode 确实记录的费用值,并始终将其显示为 (estimated),绝不会显示为 (exact, usage-based),即使极少数消息中确实有这个字段也一样。Token 数量(输入/输出/缓存读取/写入)是准确的——只有金额是近似值。

Codex CLI:仅本地运行,无需 API 密钥

Codex CLI(OpenAI 的编码 Agent 命令行工具)没有管理员、团队或计费 API——它是一个本地命令行工具,这一点已直接通过其自身的 Rust 源码(codex-rs/)确认。没有任何东西可供 TEAMSPEND_CODEX_TOKEN 用来进行身份验证,因此这个令牌并不存在;teamspend 会直接从磁盘读取 Codex 自己的本地运行日志(~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl,或 CODEX_HOME 指向的位置),使用的正是 Codex 自身写入的磁盘格式,ccusage 的 Codex 指南和 mrexodia/agent-cost-dashboard 也都已在读取这种格式。

teamspend --tools claude-code,codex --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

在信任这个数字之前,有三个值得了解的实情说明:

  • 这是这台机器的用量,不是团队的用量。 和 OpenCode 的本地文件一样,Codex 的运行日志中没有任何用户或电子邮件字段,因此 teamspend 会将找到的所有数据都归到一个虚拟用户名下,也就是运行命令的操作系统账户。要比较整个团队的 Codex 支出,就需要在每个人的机器上运行 teamspend,或者通过其他方式收集数据,再使用 CSV 导入。
  • 美元金额始终标记为估算值——而且始终恰好为 $0。 Codex 的本地日志甚至没有像 OpenCode 那样的 cost: 0 占位值——token_count 事件根本没有成本字段,只有 token 数量。teamspend 自身不包含任何按 token 计价的价格表,因此它会报告 $0 并将结果标记为 (estimated),而不会根据可能与 OpenAI 实际协商价格不符的价格表来猜测金额。token 数量(输入、输出、缓存读取)是准确的;Codex 根本不会报告美元金额。
  • 只能读取最近约 7 天的数据。 Codex 本身会在后台将超过 7 天的运行日志文件压缩为 .jsonl.zst(zstd);teamspend 只读取普通 .jsonl 文件,和对 OpenCode 较新的 SQLite 存储所做的决定相同,以避免为次要的磁盘格式增加依赖。时间范围若早于这段时间,Codex 数据就会少报或为空——更早的数据请搭配 CSV 导入。

个人用量模式:没有管理员访问权限时使用

以上所有功能都需要组织管理员凭据(TEAMSPEND_CURSOR_TOKEN、TEAMSPEND_CLAUDE_CODE_TOKEN),因为它们会从供应商的管理员 API 拉取整个团队的数据。如果你只想查看自己的 Claude Code 个人支出,且没有(或不想使用)组织管理员访问权限,请将工具名称 claude-code 换成 claude-code-personal:

npx teamspend-cli --tools claude-code-personal,claude-code-personal --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30

此模式会直接从磁盘读取 Claude Code 自己的本地 JSONL 会话日志(默认位于 ~/.claude/projects/**/*.jsonl,或 CLAUDE_CONFIG_DIR/XDG_CONFIG_HOME 指向的位置)。无需 API 密钥、无需网络请求、无需管理员访问权限——它只需要 Claude Code 已在你的机器上写入的日志。此模式报告的是运行命令的单个本地用户的数据,而非团队数据。

有两个实情需要说明:它只能读取你运行命令的这台机器上的数据;而且并非每条日志都包含 Claude Code 提供的精确 costUSD——如果缺少该值,该条目的 token 仍会计入,但其美元金额会标记为 isEstimated,和此工具显示的其他估算值一样(参见上文“标记可疑的零值,而不是盲目信任它们”)。它也可以搭配 CSV 导入备用方案:一边使用 claude-code-personal,另一边使用 --before-csv/--after-csv,即可将自己的用量与手动提供的、teamspend 不会直接拉取的工具用量进行比较。

会话级费用明细

总费用只能回答“我们花了多少钱”,却无法说明“费用由什么驱动”。添加 --breakdown session,按会话/对话拆分总费用——使用的仍是 claude-code-personal 和 opencode 已在读取的同一批日志数据,只是按每条日志中已有的 sessionId/sessionID 分组,而不是汇总成一个数字:

npx teamspend-cli --tools claude-code-personal,claude-code-personal --before 2026-04-01:2026-04-30 --after 2026-06-01:2026-06-30 --breakdown session

终端录屏:运行带有 --breakdown session 的 teamspend,打印 before 和 after 时段的逐会话费用表(会话 ID、美元费用、请求数),随后显示总体 DELTA 行

此选项会在终端摘要中添加逐会话表格(按费用排列的前 10 项),并在 JSON 报告中添加完整的会话数组。两者都需选择启用。不加此标志时,输出与以往完全一致,连字节都不差。

会话是一次交互中边界明确的单位,是 teamspend 能提供的最诚实的“每项任务费用”近似值。 这是一个真实、站得住脚的数字:它直接来自日志自身的会话标识,并非臆造。但它并非任务成功率、质量或投资回报率的衡量标准。没有任何供应商——无论是 Anthropic、Cursor 还是 GitHub——会公开某个会话的输出是否真的优质,因此 teamspend 从不声称了解这一点,也绝不会这么做。如果一个会话花费了 9 美元,另一个花费了 1 美元,这只能说明钱花在了哪里,而不能说明哪一个更值得。

此外,还有两个需要如实说明的限制:

  • 仅适用于基于本地日志的工具。 claude-code-personal 和 opencode 会直接从磁盘读取会话级数据,因此可以据此分组。cursor、claude-code 和 copilot 从各供应商的管理 API 获取数据,而这三个 API 都不会返回低于每用户汇总级别的数据——它们的响应结构中没有任何会话字段可用于分组。对这些工具使用 --breakdown session 时,会打印一条清晰的说明,而不是显示空表格或编造数据。
  • 会话的费用数字沿用其底层条目的估算状态。 如果会话中有任何日志行缺少精确费用,该会话(及其中的条目)就会标记为 isEstimated,遵循的规则与总费用相同。

命令

两个 teamspend-cli 二进制文件(npm 的 dist/cli.js、PyPI 的 teamspend.cli:main)接受相同的标志集,并以相同方式验证参数。下表根据实际安装的二进制文件的 --help 输出重新整理,而非凭记忆编写:

标志参数必填功能
--tools<a>,<b>是指定要比较的两个工具,例如 cursor,claude-code。可选项:cursor、claude-code、copilot、opencode、claude-code-personal、codex。
--beforeYYYY-MM-DD:YYYY-MM-DD是“之前”的比较时间段。
--afterYYYY-MM-DD:YYYY-MM-DD是“之后”的比较时间段。
--before-csv<path>否如果管理 API 无法涵盖该时间段,则使用 CSV 作为“之前”工具的数据回退来源。
--after-csv<path>否如果管理 API 无法涵盖该时间段,则使用 CSV 作为“之后”工具的数据回退来源。
--breakdownsession否在终端输出和 JSON 报告中添加按会话细分的成本表。仅适用于 claude-code-personal 和 opencode(两个本地日志适配器);其他四个工具会输出说明,而不会生成虚构的细分数据。
--json无否将完整 JSON 报告打印到 stdout,而非输出人类可读的摘要。无论如何,都会将报告文件写入磁盘。
-h、--help无否打印用法并以 0 退出。
-V、--version无否打印已安装的版本并以 0 退出。

**退出代码:**比较成功时(或使用 --help / --version 时)为 0;参数无效(工具未知、日期范围格式错误、缺少必填标志)或比较任一侧无法解析时为 1。没有部分成功的退出代码:即使一侧不可用,比较仍会以 1 退出,与报告中该侧自身的 DATA UNAVAILABLE 标记一致。

需要了解的一个实际区别:npm 的 --help 会打印上方的完整标志表;目前已发布的 PyPI 0.2.7 版本的 --help 会打印一行精简的用法,其中包含相同的标志,但没有逐项说明。两个版本接受和验证标志的方式完全相同,只有 --help 文本的详细程度不同。

库 API 参考

这两个包也可以作为可导入的库使用,而不只是命令行工具——package.json 的 main/types 字段和 python/pyproject.toml 的包布局都指向实际导出的代码。以下内容根据实际源码重新整理,而非凭空假设:

npm(TypeScript),import { ... } from "teamspend-cli":

import { fetchCursorSpend, fetchClaudeCodeSpend, buildComparison } from "teamspend-cli";

const before = await fetchCursorSpend({ start: "2026-04-01", end: "2026-04-30" }, cursorApiKey);
const after = await fetchClaudeCodeSpend({ start: "2026-06-01", end: "2026-06-30" }, claudeApiKey);
const report = buildComparison(
  { label: "before", tool: "cursor", result: before, error: null },
  { label: "after", tool: "claude-code", result: after, error: null },
);
导出项签名功能
fetchCursorSpend(window: DateWindow, apiKey: string) => Promise<AdapterResult>获取指定时间窗口的 Cursor Admin API 支出;遇到 API 每次调用最多查询 30 天的限制时,会自动分页。
fetchClaudeCodeSpend(window: DateWindow, apiKey: string) => Promise<AdapterResult>获取 Claude Enterprise Analytics API 支出。如果时间窗口的起始日期早于 2026-01-01(该 API 的硬性起始日期),则抛出 DataUnavailableError。
fetchCopilotSpend(window: DateWindow, apiKey: string, org: string, seatPriceUsd?: number) => Promise<AdapterResult>根据 GitHub 固定的每积分 0.01 美元费率,从 ai_credits_used 推算 Copilot 支出;结果始终标记为 isEstimated。
importFromCSV(csvPath: string, source: ToolId, window: DateWindow) => Promise<AdapterResult>将符合 date,user_email,cost_usd,is_estimated CSV 架构的文件解析为与实时适配器返回结果相同的 AdapterResult 格式。
buildComparison(before: PeriodOutcome, after: PeriodOutcome) => ComparisonReport生成前后对比差值。如果任一侧失败,则返回 null 差值,而非部分数值。
fetchWithRetry(options: FetchWithRetryOptions) => Promise<unknown>所有管理 API 适配器共用的 HTTP 客户端;遇到速率限制和暂时性错误时,会进行有界指数退避重试。
renderTerminalSummary(report: ComparisonReport, options?: RenderOptions) => string将 ComparisonReport 格式化为上文所示的终端摘要。
writeJsonReport(report: ComparisonReport, cwd: string) => Promise<string>写入权限为 0600 的 JSON 报告文件,并返回其路径。
sumCost、topSpenders(users: UserUsage[]) => number / (users: UserUsage[], limit: number) => UserUsage[]内部使用的汇总辅助函数,也可安全地用于任何 UserUsage[] 数组。

截至目前,opencode、codex 和 claude-code-personal 适配器仅支持命令行:它们已接入 src/cli.ts,但尚未从 src/index.ts 重新导出,因此可通过 teamspend 命令调用,但尚不能通过 import { ... } from "teamspend-cli" 使用。src/schema.ts、src/errors.ts 和 src/compare.ts 导出的其他所有内容(类型、错误类、DateWindow、AdapterResult)也可以用同样的方式导入。

PyPI(Python),from teamspend import ...:

from teamspend import fetch_cursor_spend, fetch_claude_code_spend, build_comparison
from teamspend.types import DateWindow

before = fetch_cursor_spend(DateWindow("2026-04-01", "2026-04-30"), cursor_api_key)
after = fetch_claude_code_spend(DateWindow("2026-06-01", "2026-06-30"), claude_api_key)

Python 包导出的内容与之相同:fetch_cursor_spend、fetch_claude_code_spend、fetch_copilot_spend、import_from_csv、build_comparison、render_terminal_summary、write_json_report,以及 AdapterResult/DateWindow/ToolId/UserUsage 类型和完整的错误层级(AuthenticationError、RetryExhaustedError、SchemaDriftError、DataUnavailableError、CSVSchemaError、EmptyCSVError、CSVRowError、InvalidCliArgError),详见 python/src/teamspend/__init__.py。与 npm 包相同,opencode/codex/claude-code-personal 适配器仅支持命令行,尚未从包根目录重新导出。

目前,这两个包都还没有生成的 API 文档站点(CI 中没有 TypeDoc 或 Sphinx 构建)——在建成之前,请以以上表格为准。

MCP 服务

teamspend 提供了一个 Model Context Protocol 服务,让 AI Agent (Claude、Cursor 或任何兼容 MCP 的客户端)无需人工手动调用 CLI,即可直接运行支出对比。

安装附加组件:

pip install "teamspend-cli[mcp]"

将其添加到 MCP 客户端的配置中(对于 Claude Desktop,使用 claude_desktop_config.json):

{
  "mcpServers": {
    "teamspend": {
      "command": "uvx",
      "args": ["--from", "teamspend-cli", "teamspend-mcp"]
    }
  }
}

该服务提供一个名为 run 的工具,它会使用给定参数和 --json,调用已发布的 teamspend npm 二进制文件,并返回解析后的 JSON 结果:

run(["--tools", "claude-code-personal,opencode", "--before", "2026-04-01:2026-04-30", "--after", "2026-06-01:2026-06-30"])

本地日志适配器(claude-code-personal、opencode、codex)会扫描磁盘上的真实会话文件,因此使用这些适配器的调用可能需要最多 30 秒才能返回,尤其是在处理较大的 ~/.claude/projects/ 或 ~/.local/share/opencode/storage/ 历史记录时。传输方式为 stdio,因此无需托管任何内容:MCP 客户端会将该服务作为本地子进程启动。源码: python/src/teamspend/mcp_server.py。

路线图

我们有意从小范围起步:先在一个真实团队确实正在迁移的两款工具上验证想法并做好实现,然后再逐步扩展。接下来计划支持的内容大致按用户提及频率排序:

  • GitHub Copilot 适配器
  • OpenCode 适配器
  • Codex CLI 适配器
  • 支持非 USD 计费

想让其中一项尽快推出,或者希望支持列表中没有的工具?请提交 issue 说明。这确实是决定开发顺序的方式。

运行前须知

  • 这是一个快照工具,而不是持续运行的仪表板。它能很好地回答一个问题,然后就会停止。
  • 输出中包含真实邮箱地址和美元金额,会打印到终端并保存到报告文件中。如果你将它接入公开仓库中的定时 CI 作业,这些数据就会出现在构建日志中,因此请先检查 CI 提供商的日志可见性设置。
  • 测试样例基于各供应商发布的 API 文档构建,而非真实账户。如果你第一次实际运行时遇到解析错误,这说明供应商的 API 结构确实发生了变化,并非我们隐瞒的 bug。请提交 issue,这会帮助之后遇到同样问题的所有人。
  • 固定席位和按席位计费的套餐(不含超额用量费用的 Cursor 套餐、Claude.ai Team/Enterprise 席位)不会通过供应商自己的 Admin API 提供真实的用户级成本。当 teamspend 检测到某个用户有真实的令牌或请求活动,但报告的成本恰好为 $0 时,它会将该用户的金额以及整份报告标记为估算值,而不是显示一个看似精确、具有误导性的 $0。
  • PyPI 软件包的 --version 目前报告的是 0.2.2 版本发布时的版本字符串,而不是从已安装发行版自身的元数据中读取;修复已经合并到 main,并将在下一个 PyPI 版本中发布。在此期间,pip show teamspend-cli 始终会报告实际安装的版本。

什么是 teamspend,它为何存在

teamspend 是一款命令行工具,只回答一个问题:当团队从一种 AI 编码工具切换到另一种,或同时使用两种工具时,实际花了多少钱?这些真实费用直接取自各供应商自己的管理 API。

它之所以存在,是因为从根本上说,没有哪家供应商的仪表板能回答这个问题。Cursor 的 Admin API 报告 Cursor 的支出。Anthropic 的 Claude Enterprise Analytics API 报告 Claude Code 的支出。两者都没有理由在自家数据旁边显示竞争对手的数据,因此,处于迁移过程中的团队只能打开两个仪表板,手动计算差额。teamspend 做的事情就像对两个文件运行 diff:它通过同一套规范化架构获取两边的数据,并打印出一个真实的差额。

它的功能范围刻意保持狭窄。teamspend 不会持续运行,不托管仪表板,也不会同时跟踪两种工具以外的工具,且只比较迁移前后的时间窗口。它是一条回答单个问题后就退出的命令。

为什么现在这很重要。 AI 编码 Agent 的支出已不再是可以忽略不计的零头。Uber 的首席技术官向 The Information 透露,随着 Claude Code 的采用率在约 5,000 名工程师中从 32% 升至 84%,公司的工程部门在大约四个月内就耗尽了 2026 年的全部 AI 工具预算(Forbes、Fortune)——Uber 的首席运营官直言:“很难将这些数据中的任何一项与多产出 25% 的实用消费级功能联系起来。”微软的 Experiences and Devices 部门取消了内部 Claude Code 许可证,并在费用超出年度 AI 预算后,将工程师转向 GitHub Copilot CLI(The Verge,后续报道见 Windows Central)。一项针对 127 个企业级 Agentic AI 部署项目的 FinOps 调查发现,73% 的项目超出预算,部分项目超出预算 2.4 倍(TechTimes、beri.net)。今年,各家供应商都推出了自己的预算控制功能:Claude Enterprise 推出了支出阈值提醒,Cursor 增加了团队级美元支出上限,GitHub Copilot 增加了组织支出限额。但没有一家会在自家数据旁边显示竞争对手工具的数据。这正是 teamspend 要填补的空白,也正因如此,这款工具从两个管理 API 适配器扩展到了六种获取费用数据的实际方式。

teamspend 的对比

这是一个专为一项特定任务打造的小众工具。它并不打算取代下面两个项目;如果你真正需要的是它们擅长的功能,就用它们吧。

teamspendtokscalecodeburnVantage
它能回答的问题“在两种工具之间迁移时,我们团队的支出变化了多少?”“我个人在 40 多种编码 Agent 命令行工具中的使用量有多少?”“在我运行的各种工具中,我的支出是多少,按模型、项目和任务细分?”“我的组织在云、SaaS 和 AI 上的总支出是多少?能否在一个控制台中查看?”
目标用户需要对团队 AI 工具账单负责的人跟踪个人使用情况的开发者希望在本地查看成本明细的开发者整合多云成本的、有资金支持的平台团队
工具覆盖范围6 种:Cursor、Claude Code、Copilot、OpenCode、Codex,另有个人模式40 多种工具集成,包括 Cursor 和 Claude Code31 种工具和 Agent,包括 Cursor、Claude Code、Codex、GeminiCursor 和 Anthropic 提供实时连接器
团队预算/迁移前后对比视图有,这就是整个产品截至本文撰写时,其社区没有提出此类需求没有,仅跟踪单台机器上的本地数据,不通过管理员 API 拉取团队数据并非专为迁移设计;这是一个覆盖范围更广的成本分配平台
规模与支持新兴的单一用途开源项目4,700+ 个 star、395 个 fork、采用 MIT 许可证,且在积极维护9,100+ 个 star、715 个 fork、免费且以本地优先融资 2,500 万美元(种子轮 + A 轮),商业平台

tokscale 确实是个好项目:它有 4,700+ 个 star,可跟踪个人在 40 多种编码 Agent 工具中的令牌使用量,并提供排行榜和贡献图。查看最近的 100 个 issue,没有发现任何关于团队预算、经理仪表板或支出汇总的需求,因为这些并非它要打造的产品。如果你想要跟踪自己在每种 AI 命令行工具中的个人使用情况,就用 tokscale。teamspend 要解决的是另一个问题:团队预算负责人会问的问题,而不是个人贡献者会问的问题。

codeburn 是 teamspend 最接近的真正竞争对手:它免费、以本地优先,而且已经能在比 teamspend 更多的工具中按模型、项目和任务细分成本。如果你想在一系列广泛的工具中查看个人在单台机器上的成本明细,codeburn 做得比 teamspend 更好。它无法做到的是从供应商的管理员 API 拉取数据,回答团队层面的迁移前后对比问题,而这正是 teamspend 唯一专为之打造的功能。

Vantage 已将 Cursor 和 Anthropic 的实时连接器纳入其更广泛的云/SaaS/AI 成本平台。如果你已经通过 Vantage 整合了全部云账单,它是个不错的选择,覆盖范围也远超 teamspend。teamspend 面向的是范围更窄的场景:用轻量、单一用途的工具辅助做出一次迁移决策,而不必为此采用完整的成本管理平台。

Cursor、Claude Code 和 Copilot 自带的管理员控制台各自都能准确展示对应工具的数据。如果你只用一种工具,就用它们。teamspend 则适用于需要比较两种工具的情况,因为这些控制台永远不会在同一个视图中同时显示自家和竞争对手的数据。

常见问题

teamspend 是什么?用一句话来说。 只需运行一条命令,即可获取两种 AI 编码工具由供应商报告的实际支出数据,并打印迁移前后的差额,这样正在迁移的团队就不必打开两个仪表板再手动相减。它有意不持续运行,也不托管自己的仪表板——完整说明请参见上文的“teamspend 是什么,为什么会有它”。 运行它需要安装什么,支持哪些平台? npm 包(teamspend-cli)需要 Node.js 18.3.0 或更高版本,具体要求见 package.json 中的 engines 字段;PyPI 包(同样名为 teamspend-cli)需要 Python 3.9 或更高版本,具体要求见 python/pyproject.toml 中的 requires-python。两个包都标记为 Operating System :: OS Independent,且不包含任何运行时依赖,因此只要安装相应的运行时,无需进行特定操作系统的设置。管理 API 适配器(Cursor、Claude Code、Copilot)只需要能够向供应商的 API 发起出站网络连接;本地日志适配器(OpenCode、Codex CLI、claude-code-personal)会直接读取运行 teamspend 的机器上的文件,无需网络连接或凭据。

teamspend 与 codeburn 相比如何,尤其是两者重合度最高的方面? codeburn 已能在一台机器上跨 31 种工具,按模型、项目和任务拆分成本,且不涉及管理 API——如果你需要的是这种单机成本拆分,codeburn 做得比 teamspend 更好。teamspend 回答的是另一个问题:它从供应商的管理 API 获取数据,对比整个团队在迁移前后的支出,而 codeburn 的本地追踪模式无法做到这一点。个人跨工具成本拆分可选 codeburn;需要向预算负责人汇报团队级迁移前后数据时可选 teamspend。完整对比(包括规模和星标数量)见上文的“teamspend 对比”。

我可以将 teamspend 用于商业用途或公司代码库吗? 可以。两个包都采用 Apache License 2.0(见 LICENSE 以及 package.json/python/pyproject.toml 中的 license 字段),允许商业使用、修改以及内部使用或再分发,但需注明出处,且不要求采用 Copyleft 许可证。无需另行购买商业版本或许可证。

teamspend 会取代 Cursor 或 Claude Code 自带的管理控制台吗? 不会。每家供应商自带的控制台仍是该供应商相关数据的准确来源,也适用于支出以外的事项(席位管理、使用策略、模型访问权限)。teamspend 解决的是两种控制台都无法做到的一件事:将两种工具的数据放在同一份对比中。

如果某个工具的 API 调用中途失败,会发生什么? 整个对比会被标记为未完成,而不会被悄悄报告为已完成。src/compare.ts 中的 buildComparison 只有在两边都成功获取数据时才会计算差值;如果任意一边失败,报告会在该侧显示 DATA UNAVAILABLE,并将差值设为 null,绝不会根据部分获取的数据得出数字。

teamspend 会在任何地方存储或发送我团队的支出数据吗? 不会。它是一个本地 CLI:直接从你的机器调用每家供应商的 API,将摘要打印到终端,并在当前目录写入一个 JSON 报告文件(权限为 0600)。不会向 teamspend 或任何第三方发送数据。

我可以将 teamspend 用于 Cursor 和 Claude Code 以外的工具吗? 可以。支持 GitHub Copilot——详情见上文“GitHub Copilot 支持”,其中也如实说明了 GitHub 自带的 API 不提供美元金额字段,因此成本数值是如何得出的。OpenCode 和 Codex CLI 也受支持——详情见上文的 OpenCode:仅本地运行,无需 API 密钥和 Codex CLI:仅本地运行,无需 API 密钥;两者都会直接读取各自的本地会话日志,无需 API 密钥。同时也提供 CSV 导入备用方案,可用于其他任何工具,采用上文说明的相同 date,user_email,cost_usd,is_estimated 架构。 为什么有时 $0 的支出金额会显示为“估算”,而不是确切金额? 某些计费方案(按席位定价的 Cursor 计划、Claude.ai Team/Enterprise 席位)不会通过厂商自己的 Admin API 提供真正的用户级成本,即使用户确实有活动记录,API 也会报告一个看似确切的 $0。teamspend 会检测成本为 $0、但令牌数或请求数非零的情况,并将其标记为估算,而不是显示一个容易误导人的确切零值。请参阅下文的“成功案例”,了解导致这项修复的另外两款工具中的两份独立错误报告。

teamspend 会告诉我花出去的钱是否值得吗? 不会,而且它绝不会假装能做到。没有任何厂商——无论是 Anthropic、Cursor 还是 GitHub——会提供某次会话是否产出了优质代码,或是白白浪费了预算的信息。teamspend 用直接从来源获取的真实数字回答“花了多少钱”,但它不会、也无法回答“值不值得”。会话级明细能让你尽可能接近诚实工具所能提供的信息:每次会话的成本,而不是每项成果的成本。

参与贡献

发现了不够完善之处、厂商 API 结构发生变化,或想支持某款工具?欢迎提交 issue 或 pull request。代码库刻意保持精简,因此修复问题或新增适配器通常比看起来更简单。完整指南请参阅 CONTRIBUTING.md,其中涵盖 npm(TypeScript)和 PyPI(Python,python/)两个包——适配器的变更应同时应用到两者。

# TypeScript(仓库根目录)
npm install
npm run build
npm run lint
npm run typecheck
npm test

# Python(python/)
cd python
pip install -e ".[dev]"
pytest

如果 teamspend 帮你省去了打开两个仪表板、手动计算的麻烦,点个星标就能帮助遇到同样问题的人找到它。

成功案例

上文提到的可疑零值修复并非凭空发现的。我们看到另一支团队在自己的工具中遇到了完全相同的障碍,并将他们的错误报告作为修复依据。

  • liuzemei 的 PR 为 ccusage 修复了同一个根本问题:采用按席位计费时,厂商自己的 API 可能会为一个明显活跃的用户报告 cost_usd: 0;如果工具全盘采信这个数字,最终就会告诉团队,他们的头号消费用户一分钱都没花。teamspend 的 Cursor 和 Claude Code 适配器也存在完全相同的问题。不过,这两项修复采用了不同的方式:ccusage 遇到零值时,会根据自己的定价表重新计算实际金额;而 teamspend 采取了更谨慎的做法,只将该金额标记为估算,而不把错误的零值显示为真实金额。

许可证

Apache 2.0。

评论

支持 Markdown

第一次接触 MCP?

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

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