teamspend

Compara el gasto en herramientas de codificación de IA antes y después de una migración mediante herramientas MCP.

Documentación

teamspend

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

Instalación • Uso • Características • Comparar • Preguntas frecuentes • Contribuciones

Tus herramientas de codificación con IA nunca te dirán si cambiar entre ellas realmente ahorró dinero. teamspend lo hace, con un solo comando.

Terminal recording: installing teamspend-cli from a packed tarball, then running a claude-code-personal before/after comparison that prints total spend for each period and a DELTA line

La grabación anterior usa claude-code-personal (sin credenciales, lee registros de sesión locales) para que el flujo de instalación hasta la primera ejecución se reproduzca de principio a fin sin necesidad de claves de API de administrador; la forma de salida en vivo es idéntica sin importar qué adaptador uses.

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

Seis herramientas ahora, no dos: Cursor, Claude Code, GitHub Copilot, OpenCode y Codex CLI, más un modo personal sin credenciales para quienes no tienen acceso de administrador. Más equipos que nunca están usando más de una herramienta de codificación con IA a la vez, o moviéndose entre ellas. Cada una de esas herramientas tiene un panel que es perfectamente preciso sobre sí misma y estructuralmente incapaz de mostrarte cualquier otra cosa. teamspend es la pieza que faltaba: un número real, extraído directamente de las APIs de ambas herramientas, que muestra exactamente qué cambió.

Tabla de contenidos

Véalo en acción

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

Ejemplo de salida (la forma se muestra a continuación; tus números reales provienen de los datos de la API de tu propia organización):

teamspend snapshot -- comparación de costos de migración
Herramientas: cursor -> claude-code

ANTES (cursor)
  Gasto total:      $2,140.00  (exacto, basado en uso)
  Usuarios activos:  14

DESPUÉS (claude-code)
  Gasto total:      $1,860.00  (exacto, basado en uso)
  Usuarios activos:  14

DELTA: -$280.00 (-13.1%)

Informe completo: ./teamspend-snapshot-2026-07-11T142842.json

Ese es todo el producto. Un comando, un número honesto, cero hojas de cálculo.

Qué hace realmente

  • Extrae números reales, no hace scraping ni estimaciones. Habla directamente con la API de administración de Cursor y la API de análisis empresarial de Anthropic Claude. Lo que ves es lo que el propio proveedor informa.
  • Compara entre herramientas, algo que ningún panel de un solo proveedor hará jamás. El panel de Cursor muestra Cursor. El panel de Claude Code muestra Claude Code. teamspend pone ambos números en la misma frase.
  • Llena los vacíos históricos con importación CSV. Si tu ventana de comparación se remonta más atrás de lo que permite el historial de la API de una herramienta, pásale un CSV con el mismo formato y agregará esas filas al mismo informe, sin pasos de fusión separados.
  • Nunca falla en silencio. Si un lado de la comparación no se puede obtener, recibes un claro "datos no disponibles" y una razón, nunca un número incorrecto presentado como correcto.
  • Reintenta como debería hacerlo un cliente de producción. Los límites de tasa, los tiempos de espera y los errores transitorios reciben retroceso exponencial automáticamente, con límites y acotado, para que una llamada API inestable no signifique un resultado inestable.
  • Marca los ceros sospechosos en lugar de confiar en ellos. Los niveles de facturación plana por asiento tanto en Cursor como en Claude Code pueden informar un $0 de apariencia exacta para un usuario con actividad real de tokens. teamspend detecta ese patrón y marca el número como estimado en lugar de mostrar un cero engañoso.
  • Se distribuye con cero dependencias en tiempo de ejecución. Sin cadena de suministro que auditar aparte de nuestro propio código. fetch nativo, análisis de argumentos nativo, E/S de archivos nativa.

Empiece en menos de un minuto

teamspend incluye dos paquetes independientes, ambos de primera clase: elige el que se adapte a tu cadena de herramientas, o instala ambos. Hablan con las mismas seis fuentes de datos y calculan el mismo delta antes/después.

# 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

Ambos paquetes se llaman teamspend-cli (el nombre anterior más simple teamspend fue renombrado para coincidir con los otros paquetes de este proyecto y luego se eliminó por completo de ambos registros a partir del 2026-08-03: mismo mantenedor, mismo repositorio, pero ya no se puede instalar bajo ninguna versión). En cualquier caso, el comando instalado es teamspend.

Dale las dos claves API de las herramientas que estás comparando:

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

Ambas necesitan acceso de nivel administrador de organización en su plataforma. Si ya puedes ver la facturación de tu organización, tienes lo que necesitas.

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

Agrega --json para imprimir el informe JSON completo en la salida estándar en lugar del resumen legible para humanos anterior, útil para canalizar a otro script o un paso de CI. El archivo de informe JSON en disco se escribe de cualquier manera; --json solo cambia lo que se imprime en la terminal.

¿Comparando con GitHub Copilot en su lugar? Consulta "Soporte para GitHub Copilot" a continuación: necesita dos variables de entorno más que Cursor/Claude Code, por razones que vale la pena leer antes de apuntarlo a una organización real.

Ambos CLI aceptan los mismos indicadores de comparación (--tools, --before, --after, --json, --before-csv, --after-csv, --breakdown, --help/-h, --version/-V) e imprimen la misma forma de salida. Consulta la sección Comandos a continuación para la referencia completa de indicadores, python/README.md para la API de la biblioteca del paquete de Python, y docs/getting-started.md para la guía completa que cubre ambas distribuciones.

Diseñado para ser confiable, no solo usado

Una herramienta que toca el gasto y los datos de correo de tu equipo debería ganarse esa confianza de manera abierta. Esto es lo que es realmente cierto sobre este código, verificado en cada commit, no afirmado en un párrafo de marketing:

Dependencias en tiempo de ejecuciónCero
Tamaño del paquete56.8 kB comprimido, 193.1 kB descomprimido
De instalación en frío a primera respuestaMenos de 1 segundo, medido con caché de npm/npx limpia
Pruebas102 aprobadas (npm), 116 aprobadas (PyPI), 97% de cobertura de líneas en la suite de TypeScript
Vulnerabilidades conocidasCero, según npm audit
Permisos de archivosLos archivos de informe son solo del propietario (0600) y se autoagregan a .gitignore, ya que contienen correos electrónicos y gastos por usuario

Importación CSV, para el historial que una API en vivo no puede alcanzar

date,user_email,cost_usd,is_estimated
2025-11-01,jane@example.com,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

Soporte para 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   # opcional, ver más abajo

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

Credencial: TEAMSPEND_COPILOT_TOKEN necesita el alcance read:org (un PAT clásico) o el permiso de grano fino "Ver métricas de Copilot de la organización", y la organización debe estar en Copilot Business o Enterprise. TEAMSPEND_COPILOT_ORG también es obligatorio: a diferencia de las APIs de administración de Cursor y Claude Code, el endpoint de métricas de Copilot de GitHub está limitado a un inicio de sesión de organización específico en la propia ruta de la URL, no solo al token.

Cómo deriva teamspend una cifra en dólares, honestamente: la API real y actual de métricas de uso de Copilot de GitHub (GET /orgs/{org}/copilot/metrics/reports/ users-1-day, confirmada contra la documentación oficial de GitHub mientras se construía esto: el endpoint más antiguo /orgs/{org}/copilot/metrics que algunas otras herramientas aún mencionan fue retirado por GitHub el 2026-04-02 y ya no funciona) no tiene ningún campo de costo o gasto en ninguna parte. Copilot Business/Enterprise tiene facturación plana por asiento ($19 o $39 por asiento al mes, que incluye una asignación mensual de créditos de IA equivalente), y GitHub no expone el precio de asiento contratado real de una organización a través de ninguna API: la misma brecha estructural que los niveles de facturación plana por asiento de Cursor y Claude Code ya tienen en esta herramienta.

Lo que la API sí devuelve por usuario es ai_credits_used. teamspend lo convierte a USD a la tasa fija publicada por el propio GitHub de 1 crédito de IA = $0.01 USD: no inventada, y no un precio negociado por organización. Si configuras TEAMSPEND_COPILOT_SEAT_PRICE_USD, ese precio fijo se agrega una vez por usuario activo para toda la ventana de comparación (nunca una vez por día) para también reflejar el costo de licencia que la cifra solo de créditos excluye; si no lo configuras, el número informado es solo el costo de uso de créditos y explícitamente no incluye la tarifa del asiento.

Debido a que no hay un campo de costo informado por el proveedor desde el principio, cada resultado de Copilot, con o sin precio de asiento, se marca como isEstimated: true. Esta es una advertencia más fuerte que la marca de cero sospechoso de Cursor y Claude Code, que solo se activa con un patrón específico de costo cero: Copilot no tiene una cifra en dólares nativa en la que confiar en primer lugar, por lo que teamspend nunca afirma una. Consulta docs/concepts.md para conocer todos los detalles, incluido por qué una ventana de comparación significa una llamada API por día calendario en lugar de una llamada para todo el rango.

OpenCode: solo local, sin necesidad de clave API

OpenCode (anteriormente sst/opencode) no tiene API de administración, equipo o facturación en absoluto: es un CLI local sin endpoint de uso a nivel de organización, confirmado contra su propio README. No hay nada para que TEAMSPEND_OPENCODE_TOKEN autentique, por lo que no existe; teamspend en su lugar lee los registros de sesión locales de OpenCode directamente del disco (~/.local/share/opencode/storage/message/, o $OPENCODE_DATA_DIR si está configurado), el mismo formato de archivo que el propio OpenCode escribe y que tanto la guía de OpenCode de ccusage como tokscale ya leen.

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

Terminal recording: teamspend run with the OpenCode local-log adapter and --breakdown session, printing estimated total spend and a per-session cost table for both periods, then the overall DELTA line

Dos advertencias honestas que vale la pena conocer antes de confiar en este número:

  • Es el uso de esta máquina, no el de tu equipo. Los archivos de mensajes locales de OpenCode no llevan ningún campo de usuario o correo electrónico en ninguna parte: es una herramienta para un solo desarrollador sin concepto de equipo, por lo que teamspend atribuye todo lo que encuentra a un usuario sintético, la cuenta del sistema operativo que ejecutó el comando. Comparar el gasto de OpenCode de todo un equipo significa ejecutar teamspend en la máquina de cada persona, o recopilar números fuera de banda y usar la importación CSV.
  • La cifra en dólares siempre se marca como estimada. El propio OpenCode almacena cost: 0 para la mayoría de los modelos en sus archivos de mensajes locales (no tiene una tabla de precios en vivo propia), por lo que teamspend suma cualquier valor de costo que OpenCode haya registrado y siempre lo muestra como (estimated), nunca (exacto, basado en uso), incluso en el raro mensaje donde ese campo está genuinamente poblado. Los recuentos de tokens (entrada/salida/lectura de caché/escritura) son exactos: solo la cifra en dólares es aproximada.

Codex CLI: solo local, sin necesidad de clave API

Codex CLI (el CLI de agente de codificación de OpenAI) tampoco tiene API de administración, equipo o facturación — es un CLI local, confirmado directamente contra su propio código fuente en Rust (codex-rs/). No hay nada para que TEAMSPEND_CODEX_TOKEN autentique, por lo que no existe; teamspend en su lugar lee los registros de implementación locales propios de Codex directamente del disco (~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl, o donde sea que CODEX_HOME apunte), el mismo formato en disco que Codex mismo escribe y que la https://ccusage.com/guide/codex/ y mrexodia/agent-cost-dashboard ambos ya leen.

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

Tres advertencias honestas que vale la pena conocer antes de confiar en este número:

  • Es el uso de esta máquina, no el de tu equipo. Igual que los archivos locales de OpenCode, los registros de implementación de Codex no llevan ningún campo de usuario o correo electrónico en ningún lugar, por lo que teamspend atribuye todo lo que encuentra a un usuario sintético, la cuenta del SO que ejecutó el comando. Comparar el gasto de Codex de todo un equipo significa ejecutar teamspend en la máquina de cada persona, o recopilar números fuera de banda y usar importación CSV.
  • La cifra en dólares siempre está marcada como estimada — y siempre es exactamente $0. Los registros locales de Codex ni siquiera tienen un cost: 0 como los de OpenCode — no hay ningún campo de costo en un evento token_count en absoluto, solo conteos de tokens. teamspend no incluye ninguna tabla de precios por token propia, por lo que reporta $0 y marca el resultado (estimated) en lugar de adivinar una cifra en dólares de una tabla que se desviaría del precio real y negociado de OpenAI. Los conteos de tokens (entrada/salida/lectura de caché) son exactos; la cifra en dólares simplemente no es reportada por Codex en absoluto.
  • Solo los últimos ~7 días son legibles. Codex mismo comprime en segundo plano cualquier archivo de implementación de más de 7 días a .jsonl.zst (zstd); teamspend lee solo .jsonl plano, la misma llamada que ya se hace para el almacén SQLite más nuevo de OpenCode, para evitar agregar una dependencia para un formato secundario en disco. Una ventana que se remonte más atrás que eso subreportará o volverá vacía para Codex — combínalo con importación CSV para cualquier cosa más antigua.

Modo de uso personal, para cuando no tienes acceso de administrador

Todo lo anterior necesita credenciales de administrador de organización (TEAMSPEND_CURSOR_TOKEN, TEAMSPEND_CLAUDE_CODE_TOKEN) porque está extrayendo los números de todo un equipo de la API de administración de un proveedor. Si solo quieres tu propio gasto personal de Claude Code y no tienes (o no quieres usar) acceso de administrador de organización, usa claude-code-personal en lugar de claude-code como nombre de herramienta:

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

Este modo lee los registros de sesión JSONL locales propios de Claude Code directamente del disco (~/.claude/projects/**/*.jsonl por defecto, o donde sea que CLAUDE_CONFIG_DIR/XDG_CONFIG_HOME apunte). Sin clave de API, sin llamada de red, sin acceso de administrador — no necesita nada más que los registros que Claude Code ya escribe en tu máquina. Reporta sobre el único usuario local que ejecuta el comando, no un equipo.

Dos advertencias honestas: solo ve lo que está en la máquina donde lo ejecutas, y no cada entrada registrada lleva un costUSD exacto de Claude Code — cuando no lo lleva, los tokens de esa entrada aún cuentan pero su cantidad en dólares se marca isEstimated, igual que cualquier otro número estimado que esta herramienta te muestre (ver "Marca ceros sospechosos en lugar de confiar en ellos" arriba). También se combina con el respaldo de importación CSV: combina claude-code-personal en un lado con un --before-csv/--after-csv en el otro si estás comparando tu propio uso contra un número proporcionado manualmente para una herramienta que teamspend no obtiene directamente.

Desglose de costos a nivel de sesión

Un total plano responde "¿qué gastamos?", no "¿qué lo está impulsando?". Agrega --breakdown session para desglosar ese total por sesión/conversación — los mismos datos de registro que claude-code-personal y opencode ya leen, solo agrupados por el sessionId/sessionID que cada entrada de registro ya lleva, en lugar de sumarse en un solo número:

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

Terminal recording: teamspend run with --breakdown session, printing a per-session cost table (session ID, dollar cost, request count) for both the before and after period, then the overall DELTA line

Esto agrega una tabla por sesión (top 10 por costo) al resumen de terminal, y el array completo de sesiones al informe JSON — ambos opt-in. Sin la bandera, la salida es byte por byte lo que siempre fue.

Una sesión es una unidad acotada de una interacción — el proxy más honesto que teamspend puede ofrecer para "costo por tarea". Ese es un número real y defendible: viene directamente del identificador de sesión propio del registro, nada inventado. Lo que no es es una medida de éxito de tarea, calidad o ROI. Ningún proveedor — ni Anthropic, ni Cursor, ni GitHub — expone si la salida de una sesión dada fue realmente buena, por lo que teamspend nunca afirma saberlo, y nunca lo hará. Si una sesión costó $9 y otra costó $1, eso te dice a dónde fueron los dólares, no cuál valió la pena.

Dos límites honestos además de eso:

  • Solo disponible para las herramientas basadas en registros locales. claude-code-personal y opencode leen datos con alcance de sesión directamente del disco, por lo que pueden agrupar por ello. cursor, claude-code, y copilot extraen de la API de administración de cada proveedor, y ninguna de esas tres APIs devuelve nada por debajo de un agregado por usuario — no hay ningún campo de sesión en ninguna parte de su forma de respuesta para agrupar. Pasar --breakdown session con esas herramientas imprime un mensaje claro explicando eso, no una tabla vacía o fabricada.
  • La cifra en dólares de una sesión hereda el estado de estimación que tengan sus entradas subyacentes. Si alguna línea de registro en una sesión carece de un costo exacto, esa sesión (y las entradas dentro de ella) se marca isEstimated, la misma regla que el total plano ya sigue.

Comandos

Ambos binarios teamspend-cli (npm's dist/cli.js, PyPI's teamspend.cli:main) aceptan el mismo conjunto de banderas y validan argumentos de la misma manera. Esta tabla se re-deriva de la salida --help del binario instalado real, no de memoria:

BanderaArgumentoRequeridoQué hace
--tools<a>,<b>SíExactamente dos herramientas para comparar, p. ej. cursor,claude-code. Una de: cursor, claude-code, copilot, opencode, claude-code-personal, codex.
--beforeYYYY-MM-DD:YYYY-MM-DDSíLa ventana de comparación "antes".
--afterYYYY-MM-DD:YYYY-MM-DDSíLa ventana de comparación "después".
--before-csv<path>NoRespaldo CSV para la herramienta "antes" si la API de administración no puede cubrir esa ventana.
--after-csv<path>NoRespaldo CSV para la herramienta "después", misma regla.
--breakdownsessionNoAgrega una tabla de costos por sesión a la salida de terminal y al informe JSON. Solo funciona con claude-code-personal y opencode (los dos adaptadores de registros locales); las otras cuatro herramientas imprimen una explicación en lugar de un desglose fabricado.
--jsonningunoNoImprime el informe JSON completo a stdout en lugar del resumen legible por humanos. El archivo de informe en disco se escribe de cualquier manera.
-h, --helpningunoNoImprime el uso y sale con 0.
-V, --versionningunoNoImprime la versión instalada y sale con 0.

Códigos de salida: 0 en una comparación exitosa (o en --help/--version), 1 en un argumento inválido (herramienta desconocida, rango de fechas malformado, bandera requerida faltante) o una comparación donde cualquiera de los lados falló al resolverse. No hay código de salida de éxito parcial: una comparación con un lado no disponible aún sale con 1, coincidiendo con el marcador DATA UNAVAILABLE propio del informe para ese lado.

Una diferencia real entre los dos binarios que vale la pena conocer: el --help de npm imprime la tabla de banderas completa arriba; el build actualmente publicado de PyPI 0.2.7's --help imprime una sola línea de uso condensada con las mismas banderas pero sin descripciones por bandera. Ambos aceptan y validan las mismas banderas de manera idéntica, solo el texto --help en sí difiere en verbosidad.

Referencia de API de biblioteca

Ambos paquetes también funcionan como biblioteca importable, no solo como CLI — los campos package.json's main/types y el diseño de paquete de python/pyproject.toml apuntan a código real y exportado, re-derivado aquí del código fuente real en lugar de asumido:

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 },
);
ExportaciónFirmaQué hace
fetchCursorSpend(window: DateWindow, apiKey: string) => Promise<AdapterResult>Extrae el gasto de la API de administración de Cursor para una ventana, paginando a través del límite de 30 días por llamada de la API.
fetchClaudeCodeSpend(window: DateWindow, apiKey: string) => Promise<AdapterResult>Extrae el gasto de la API de análisis de Claude Enterprise. Lanza DataUnavailableError para cualquier ventana que comience antes de 2026-01-01, la fecha de inicio fija de la API.
fetchCopilotSpend(window: DateWindow, apiKey: string, org: string, seatPriceUsd?: number) => Promise<AdapterResult>Deriva una cifra en dólares de Copilot de ai_credits_used a la tasa fija de $0.01/crédito de GitHub; siempre marca el resultado isEstimated.
importFromCSV(csvPath: string, source: ToolId, window: DateWindow) => Promise<AdapterResult>Analiza el esquema CSV date,user_email,cost_usd,is_estimated en la misma forma AdapterResult que devuelven los adaptadores en vivo.
buildComparison(before: PeriodOutcome, after: PeriodOutcome) => ComparisonReportConstruye el delta antes/después. Devuelve un delta nulo, nunca un número parcial, si cualquiera de los lados falló.
fetchWithRetry(options: FetchWithRetryOptions) => Promise<unknown>El cliente HTTP compartido que usa cada adaptador de API de administración, con retroceso exponencial acotado en límites de tasa y errores transitorios.
renderTerminalSummary(report: ComparisonReport, options?: RenderOptions) => stringFormatea un ComparisonReport en el resumen de terminal mostrado arriba.
writeJsonReport(report: ComparisonReport, cwd: string) => Promise<string>Escribe el archivo de informe JSON con permiso 0600 y devuelve su ruta.
sumCost, topSpenders(users: UserUsage[]) => number / (users: UserUsage[], limit: number) => UserUsage[]Ayudantes de agregación usados internamente y seguros de reutilizar contra cualquier array UserUsage[].

Los adaptadores opencode, codex, y claude-code-personal son solo CLI al momento de escribir esto: están conectados a src/cli.ts pero no re-exportados desde src/index.ts, por lo que son alcanzables a través del comando teamspend pero aún no a través de import { ... } from "teamspend-cli". Todo lo demás exportado desde src/schema.ts, src/errors.ts, y src/compare.ts (tipos, clases de error, DateWindow, AdapterResult) está disponible de la misma manera.

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)

El paquete de Python exporta la misma forma: fetch_cursor_spend, fetch_claude_code_spend, fetch_copilot_spend, import_from_csv, build_comparison, render_terminal_summary, write_json_report, más los tipos AdapterResult/DateWindow/ToolId/UserUsage y la jerarquía de errores completa (AuthenticationError, RetryExhaustedError, SchemaDriftError, DataUnavailableError, CSVSchemaError, EmptyCSVError, CSVRowError, InvalidCliArgError), listados en su totalidad en python/src/teamspend/__init__.py. Igual que el paquete npm, los adaptadores opencode/codex/claude-code-personal son solo CLI, aún no re-exportados desde la raíz del paquete.

No existe aún un sitio de documentación de API generado para ninguno de los dos paquetes (sin build de TypeDoc o Sphinx en CI) — las tablas anteriores son la referencia hasta que exista uno.

Servidor MCP

teamspend incluye un servidor de Protocolo de Contexto de Modelo para que un agente de IA (Claude, Cursor, o cualquier cliente compatible con MCP) pueda ejecutar una comparación de gastos directamente, sin que un humano invoque el CLI manualmente.

Instala el extra:

pip install "teamspend-cli[mcp]"

Agrégalo a la configuración de tu cliente MCP (para Claude Desktop, claude_desktop_config.json):

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

El servidor expone una herramienta, run, que ejecuta el binario npm teamspend publicado con los argumentos dados más --json, y devuelve el resultado JSON analizado:

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

Los adaptadores de registro local (claude-code-personal, opencode, codex) escanean archivos de sesión reales en el disco, por lo que una llamada que los utilice puede tardar hasta 30 segundos en devolver resultados, especialmente con un historial grande de ~/.claude/projects/ o ~/.local/share/opencode/storage/. El transporte es stdio, por lo que no hay nada que alojar: el cliente MCP inicia el servidor como un subproceso local. Fuente: python/src/teamspend/mcp_server.py.

Hoja de ruta

Esto comenzó deliberadamente limitado: probar la idea con las dos herramientas entre las que un equipo real estaba migrando, hacerlo bien y luego ampliarlo. Lo siguiente, aproximadamente en el orden en que la gente lo solicita:

  • Adaptador de GitHub Copilot
  • Adaptador de OpenCode
  • Adaptador de Codex CLI
  • Soporte de facturación no USD

¿Quieres una de estas antes, o una herramienta que no esté en la lista? Abre un issue y dilo. Así es genuinamente como se decide el orden.

Bueno saber antes de ejecutarlo

  • Esta es una herramienta de instantáneas, no un panel en vivo. Responde bien una pregunta y se detiene.
  • La salida incluye correos electrónicos reales y montos en dólares, impresos en tu terminal y guardados en un archivo de informe. Si lo conectas a un trabajo de CI programado en un repositorio público, esos datos terminan en tus registros de compilación, así que verifica primero la visibilidad de los registros de tu proveedor de CI.
  • Los fixtures de prueba se construyen a partir de la documentación pública de la API de cada proveedor, no de una cuenta en vivo. Si tu primera ejecución real arroja un error de análisis, eso es una señal genuina de que la forma de la API de un proveedor se desvió, no un error que te estemos ocultando. Abre un issue, ayuda a todos los que lo encuentren después.
  • Los niveles de facturación de asiento plano y por asiento (planes de Cursor sin excedente de uso, asientos de Claude.ai Team/Enterprise) no exponen el costo real por usuario a través de la API de administración del propio proveedor. Cuando teamspend ve a un usuario con actividad real de tokens o solicitudes pero un costo reportado de exactamente $0, marca el número de ese usuario, y todo el informe, como estimado en lugar de mostrar un $0 engañoso que parece exacto.
  • El paquete de PyPI --version actualmente reporta la cadena de versión de la versión 0.2.2 en lugar de leerla de los metadatos de la distribución instalada; la corrección ya vive en main y se incluye en la próxima versión de PyPI. pip show teamspend-cli siempre reporta la versión real instalada mientras tanto.

Qué es teamspend y por qué existe

teamspend es una herramienta de línea de comandos que responde una pregunta: cuando un equipo migra de una herramienta de codificación de IA a otra, o ejecuta dos a la vez, ¿cuánto costó realmente, en dólares reales, extraído directamente de la API de administración de cada proveedor?

Existe porque ningún panel de control de proveedor puede responder esa pregunta estructuralmente. La API de administración de Cursor reporta el gasto de Cursor. La API de Claude Enterprise Analytics de Anthropic reporta el gasto de Claude Code. Ninguna tiene razón para mostrar el número de un competidor junto al suyo, por lo que un equipo en plena migración se queda abriendo dos paneles y haciendo la resta a mano. teamspend hace lo mismo que un diff hace con dos archivos: extrae ambos lados a través del mismo esquema normalizado e imprime un delta honesto.

Es deliberadamente limitado. teamspend no se ejecuta continuamente, no aloja un panel y no rastrea más que una ventana de antes/después para dos herramientas a la vez. Es un solo comando que responde una sola pregunta y sale.

Por qué esto importa ahora mismo. El gasto en agentes de codificación de IA ha dejado de ser un error de redondeo. El CTO de Uber reveló a The Information que la organización de ingeniería de la empresa agotó todo su presupuesto de herramientas de IA para 2026 en unos cuatro meses, mientras la adopción de Claude Code subía del 32% al 84% entre aproximadamente 5,000 ingenieros (Forbes, Fortune) — el COO de Uber lo dijo claramente: "es muy difícil trazar una línea entre una de esas estadísticas y producir un 25% más de funciones útiles para el consumidor". La división de Experiences and Devices de Microsoft canceló las licencias internas de Claude Code y movió a los ingenieros a GitHub Copilot CLI después de que los costos superaran su presupuesto anual de IA (The Verge, reportado además por Windows Central). Una encuesta de FinOps sobre 127 implementaciones empresariales de IA agéntica encontró que el 73% superó el presupuesto, algunos hasta 2.4 veces (TechTimes, beri.net). Cada proveedor respondió con sus propios controles de presupuesto este año: Claude Enterprise lanzó alertas de umbral de gasto, Cursor añadió límites de dólares a nivel de equipo, GitHub Copilot añadió límites de gasto a nivel de organización. Ninguno te mostrará jamás un número de la herramienta de un competidor junto al suyo. Esa brecha es exactamente lo que teamspend llena, y es por eso que la herramienta creció de dos adaptadores de API de administración a seis formas reales de obtener un número de costo.

Cómo se compara teamspend

Esta es una herramienta limitada construida para un trabajo específico. No intenta reemplazar los dos proyectos siguientes, y si lo que realmente necesitas es lo que ellos hacen bien, úsalos en su lugar.

teamspendtokscalecodeburnVantage
Qué responde"¿En cuánto cambió el gasto de nuestro equipo, a través de una migración entre dos herramientas?""¿Cuánto he usado personalmente en más de 40 CLIs de agentes de codificación?""¿Qué estoy gastando, desglosado por modelo, proyecto y tarea, en las herramientas que ejecuto?""¿Qué está gastando mi organización en nube, SaaS e IA, todo en una consola?"
AudienciaLa persona que tiene que responder por la factura de IA de un equipoUn desarrollador individual que rastrea su propio usoUn desarrollador individual que quiere un desglose de costos localUn equipo de plataforma financiado que consolida costos multinube
Cobertura de herramientas6: Cursor, Claude Code, Copilot, OpenCode, Codex, más un modo personalMás de 40 integraciones de herramientas, incluyendo Cursor y Claude Code31 herramientas y agentes, incluyendo Cursor, Claude Code, Codex, GeminiCursor y Anthropic se incluyen como conectores en vivo
Presupuesto de equipo / vista de migración antes-despuésSí, este es todo el productoNo solicitado por su propia comunidad hasta la fechaNo, seguimiento local de una sola máquina, no una extracción de API de administración de equipoNo específico de migración; plataforma más amplia de asignación de costos
Escala y respaldoProyecto OSS nuevo y de propósito únicoMás de 4,700 estrellas, 395 forks, licencia MIT, mantenido activamenteMás de 9,100 estrellas, 715 forks, gratuito y local-primero$25M recaudados (semilla + Serie A), plataforma comercial

tokscale es un proyecto genuinamente bueno: más de 4,700 estrellas, rastrea el uso personal de tokens en más de 40 herramientas de agentes de codificación con una tabla de clasificación y un gráfico de contribuciones. Revisar sus últimos 100 issues no muestra ninguna solicitud de presupuestos de equipo, paneles de gerentes o resúmenes de gasto, porque ese no es el producto que está construyendo. Si lo que quieres es un rastreador de uso personal en cada CLI de IA que uses, usa tokscale. teamspend existe para una pregunta diferente, la que hace el dueño del presupuesto de un equipo, no la que hace un contribuyente individual.

codeburn es lo más cercano a competencia real que tiene teamspend: gratuito, local-primero, y ya desglosa el costo por modelo, proyecto y tarea en más herramientas de las que cubre teamspend. Si lo que quieres es un desglose de costos personal en una sola máquina en una amplia lista de herramientas, codeburn lo hace mejor que teamspend. Lo que no hace es extraer de una API de administración de proveedor para responder la pregunta de migración antes-después a nivel de equipo, que es la única cosa para la que se construyó teamspend.

Vantage ya incluye conectores en vivo de Cursor y Anthropic como parte de una plataforma más amplia de costos de nube/SaaS/IA. Si ya estás consolidando toda tu factura de nube a través de Vantage, es una opción sólida y cubre más terreno del que teamspend jamás cubrirá. teamspend es para el caso más limitado: una herramienta ligera y de propósito único para una decisión de migración, sin adoptar una plataforma completa de gestión de costos para llegar allí.

Las consolas de administración propias de Cursor, Claude Code y Copilot son cada una precisas para su propia herramienta. Úsalas si solo ejecutas una. teamspend existe para el momento en que estás comparando dos, porque ninguna pondrá jamás el número de un competidor en la misma vista que el suyo.

Preguntas frecuentes

¿Qué es teamspend, en una frase? Un solo comando que extrae números de gasto reales reportados por el proveedor para dos herramientas de codificación de IA e imprime un delta de antes/después, para que un equipo en plena migración no tenga que abrir dos paneles y hacer la resta a mano. Deliberadamente no se ejecuta continuamente ni aloja un panel propio — consulta "Qué es teamspend y por qué existe" arriba para el caso completo.

¿Qué necesito instalado para ejecutarlo y en qué plataformas? El paquete npm (teamspend-cli) necesita Node.js 18.3.0 o más reciente, según el campo engines en package.json; el paquete de PyPI (también teamspend-cli) necesita Python 3.9 o más reciente, según requires-python en python/pyproject.toml. Ambos listan Operating System :: OS Independent y no incluyen dependencias de ejecución, por lo que no hay configuración específica del sistema operativo más allá de tener ese runtime disponible. Los adaptadores de API de administración (Cursor, Claude Code, Copilot) solo necesitan acceso de red saliente a la API del proveedor; los adaptadores de registro local (OpenCode, Codex CLI, claude-code-personal) leen archivos directamente del disco de la máquina donde ejecutas teamspend y no necesitan acceso de red ni credenciales en absoluto.

¿Cómo se compara teamspend específicamente con codeburn, ya que son la superposición más cercana? codeburn ya desglosa el costo por modelo, proyecto y tarea en 31 herramientas, todo en una máquina, sin API de administración involucrada — si ese desglose de una sola máquina es lo que necesitas, codeburn lo hace mejor que teamspend. teamspend responde una pregunta diferente: extrae de la API de administración de un proveedor para comparar lo que gastó un equipo completo, antes versus después de una migración, que no es algo que el modelo de seguimiento local de codeburn haga. Elige codeburn para un desglose de costos personal entre herramientas; elige teamspend para el número de antes/después a nivel de equipo que un dueño de presupuesto tiene que reportar. La comparación completa, incluyendo escala y conteos de estrellas, está en "Cómo se compara teamspend" arriba.

¿Puedo usar teamspend comercialmente o en un código base de empresa? Sí. Ambos paquetes tienen licencia Apache 2.0 (consulta LICENSE y el campo license en package.json/python/pyproject.toml), que permite uso comercial, modificación y uso interno o redistribuido con atribución y sin requisito de copyleft. No hay un nivel comercial separado ni una licencia que comprar.

¿Reemplaza teamspend la consola de administración propia de Cursor o Claude Code? No. La consola de cada proveedor sigue siendo la fuente precisa para los números de ese proveedor, y para cualquier cosa más allá del gasto (gestión de asientos, política de uso, acceso a modelos). teamspend existe para la única cosa que ninguna consola hace: poner los números de ambas herramientas en la misma comparación.

¿Qué sucede si la llamada a la API de una herramienta falla a mitad de camino? Toda la comparación se marca como incompleta en lugar de reportarse silenciosamente como completa. buildComparison en src/compare.ts solo calcula un delta cuando ambos lados se resolvieron; si cualquiera de los lados falló, el informe muestra DATA UNAVAILABLE para ese lado y un delta nulo, nunca un número derivado de una extracción parcial.

¿Almacena o envía teamspend los datos de gasto de mi equipo a algún lugar? No. Es un CLI local: llama a la API de cada proveedor directamente desde tu máquina, imprime un resumen en tu terminal y escribe un archivo de informe JSON (permisos 0600) en tu directorio actual. Nada se envía a teamspend ni a ningún tercero.

¿Puedo usar teamspend para herramientas que no sean Cursor y Claude Code? Sí. GitHub Copilot es compatible — consulta "Soporte de GitHub Copilot" arriba, incluyendo una nota honesta sobre cómo se deriva su cifra de costo, ya que la propia API de GitHub no tiene un campo de dólares para reportar. OpenCode y Codex CLI también son compatibles — consulta OpenCode: solo local, sin necesidad de clave API y Codex CLI: solo local, sin necesidad de clave API arriba; ambos leen sus propios registros de sesión local directamente, sin requerir clave API. Un respaldo de importación CSV aún cubre cualquier otra herramienta mientras tanto, usando el mismo esquema date,user_email,cost_usd,is_estimated documentado arriba. ¿Por qué un número de gasto de $0 a veces aparece como "estimado" en lugar de exacto? Algunos niveles de facturación (planes Cursor de asiento plano, asientos de Claude.ai Team/Enterprise) no exponen el costo real por usuario a través de la API de administración del propio proveedor y reportan un $0 de apariencia exacta incluso para usuarios con actividad real. teamspend detecta un costo de $0 emparejado con recuentos de tokens o solicitudes distintos de cero y lo marca como estimado en lugar de presentar un cero exacto engañoso. Consulta "Historias de éxito" a continuación para ver los dos informes de errores independientes en otras herramientas que llevaron a esta corrección.

¿teamspend me dice si el dinero que gastamos valió la pena? No, y nunca pretenderá hacerlo. Ningún proveedor, ni Anthropic, ni Cursor, ni GitHub, expone si una sesión determinada produjo buen código o desperdició un presupuesto. teamspend responde "¿cuánto costó esto?" con un número real extraído directamente de la fuente; no responde ni puede responder "¿valió la pena?". El desglose a nivel de sesión te acerca tanto como una herramienta honesta puede: costo por sesión, no costo por resultado.

Contribuciones

¿Encontraste un borde áspero, una API de proveedor que cambió de forma, o una herramienta que deseas que esto soporte? Abre un issue o un pull request. El código base es pequeño a propósito, así que una corrección o un nuevo adaptador suele ser un cambio más pequeño de lo que parece. Consulta CONTRIBUTING.md para la guía completa que cubre tanto el paquete npm (TypeScript) como el de PyPI (Python, python/) — un cambio de adaptador debería aterrizar en ambos.

# TypeScript (raíz del repositorio)
npm install
npm run build
npm run lint
npm run typecheck
npm test

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

Si teamspend te ahorró abrir dos paneles y hacer matemáticas a mano, una estrella ayuda a otras personas con el mismo problema a encontrarlo.

Historias de éxito

La corrección del cero sospechoso anterior no se encontró en el vacío. Vino de ver a otro equipo chocar con la misma pared en su propia herramienta y tratar su informe de error como una especificación.

  • El PR de liuzemei a ccusage corrigió el mismo problema raíz: en facturación de asiento plano, la propia API de un proveedor puede reportar cost_usd: 0 para un usuario claramente activo, y una herramienta que confía en ese número a primera vista termina diciéndole a un equipo que su mayor gastador no cuesta nada. teamspend tenía la misma brecha en sus adaptadores de Cursor y Claude Code. Las dos correcciones toman rutas diferentes, sin embargo: ccusage recalcula una cifra en dólares real desde su tabla de precios cuando encuentra ese cero, mientras que teamspend da el paso más modesto de simplemente marcar el número como estimado en lugar de presentar un cero incorrecto como uno real.

Licencia

Apache 2.0.