Si tu agente tiene shell, dale una línea de comandos
MCP vs CLI para agentes de IA se reduce a una pregunta: ¿tiene el agente una shell? Si la tiene, como en Claude Code, Codex o Cursor, una línea de comandos bien hecha suele ser la mejor interfaz. Carga solo lo que el agente necesita, se combina con todo lo demás de la shell y puedes ejecutar tú mismo cada comando. Si el agente no tiene shell, como en una app de chat, MCP es la vía de entrada. Construimos el acceso de agentes de Time Momentum como una línea de comandos, tm, y decidimos no hacer un servidor MCP. Esta guía explica por qué y dónde esa decisión sería un error.
Qué es MCP
El Model Context Protocol es, en sus propias palabras, “an open-source standard for connecting AI applications to external systems”, un estándar abierto para conectar aplicaciones de IA con sistemas externos (modelcontextprotocol.io). El proyecto lo compara con un puerto USB-C: un conector para muchos dispositivos.
La especificación actual, versión 2026-07-28, define hosts (la aplicación de IA), clientes (los conectores dentro de ella) y servidores (los servicios que aportan datos y herramientas), que se comunican por JSON-RPC. Un servidor puede ofrecer recursos, prompts y herramientas. Las herramientas son lo que más usan los agentes: el cliente pide al servidor su lista con tools/list, y cada herramienta llega con un nombre, una descripción y un JSON Schema para su entrada.
Diseño de CLI para agentes de IA: qué hace que una línea de comandos les sirva
Una línea de comandos no es buena para agentes por sí sola. Necesita algunas propiedades que las personas rara vez piden:
- Se describe a sí misma como datos:
--helpy un catálogo completo de comandos en JSON, para que el agente nunca tenga que adivinar flags. - La salida es un contrato: con
--json, exactamente un documento JSON en stdout y los errores en JSON en stderr. - Los códigos de salida tienen significado: corregir la llamada, preguntar a la persona, esperar, reintentar. Un número le dice al agente qué hacer a continuación.
- Nunca espera una entrada que no puede recibir: sin terminal, no pregunta nada. Los pasos destructivos necesitan un flag explícito como
--yes. - Puede mostrar en lugar de actuar:
--dry-runimprime la petición exacta sin enviarla. - Los secretos quedan fuera de la salida, también con
--verbosey--dry-run, porque todo lo que ve el agente acaba en su contexto. - Es fácil de instalar allí donde funcione un agente, idealmente sin árbol de dependencias.
MCP vs CLI para agentes de IA de un vistazo
| Pregunta | Servidor MCP | CLI pensada para agentes |
|---|---|---|
| Contexto usado antes de la primera llamada | en parteA menudo todas las definiciones | Solo a demanda |
| Los resultados se combinan sin el modelo | –A través del modelo | Pipes, jq, scripts |
| Puedes repetir lo que hizo el agente | en parteInspector | El mismo comando |
| La versión se puede fijar | en parteDecide el servidor | |
| Funciona en agentes con shell | en parteSi el cliente lo admite | |
| Funciona en apps de chat sin shell | – | |
| Descubrimiento e inicio de sesión estándar | tools/list, OAuth | –Convención propia |
Actualizado el: 10 oct 2026
Contexto: definiciones por adelantado o a demanda
El equipo de ingeniería de Anthropic describió el problema en noviembre de 2025: “Most MCP clients load all tool definitions upfront directly into context”, es decir, la mayoría de los clientes MCP cargan todas las definiciones de herramientas en el contexto desde el principio, y esas descripciones aumentan el tiempo de respuesta y el coste (Code execution with MCP). Su recomendación es dejar que el modelo lea las definiciones de herramientas a demanda.
Para ser justos, los clientes se están poniendo al día. Claude Code ya aplaza las herramientas MCP por defecto: al iniciar la sesión solo se cargan los nombres de las herramientas y las instrucciones del servidor, y la definición completa llega cuando Claude busca la herramienta (MCP tool search). Otros clientes pueden seguir cargándolo todo.
Una CLI trae la carga a demanda de serie, porque no hay nada en el contexto hasta que el agente ejecuta un comando. Medimos cuánto hay para cargar en tm 0.3.0: el catálogo completo (tm schema --json) ocupa 377.203 caracteres, la vista general de todos los grupos de comandos (tm --json) 32.110 y el grupo de facturas 104.009. Un comando individual tiene una mediana de 934 caracteres entre 157 comandos. Método: npx -y @time-momentum/cli@0.3.0 schema --json | wc -c y lo mismo para las demás llamadas, el 10 oct 2026.
El catálogo no es pequeño. De eso se trata: el agente decide qué cargar, normalmente un grupo o un comando.
Composición: pipes, jq y scripts
Con MCP, “every intermediate result must pass through the model”, cada resultado intermedio tiene que pasar por el modelo, como dice el mismo artículo de Anthropic. Una lista de 500 facturas que el agente solo necesita contar acaba igualmente en su contexto.
En una shell, el agente filtra antes de leer. tm payments outstanding --json | jq '[.data[].summary.outstanding_micros] | add / 1000000' devuelve un número: el total pendiente en euros. tm invoices list --all --json | jq '[.data[] | select(.status == "draft")] | length' cuenta los borradores de todas las páginas. Las mismas líneas funcionan en un cron job o en un script de shell, sin ningún agente.
Autenticación: OAuth o clave de API
En MCP, la autorización es opcional. Los servidores remotos por HTTP deberían seguir el flujo OAuth 2.1 de la especificación; los servidores locales por stdio toman sus credenciales del entorno. Para una app de chat en la que cada usuario inicia sesión con su propia cuenta, OAuth es la opción más cómoda.
Una CLI suele trabajar con una clave de API. Es sencillo, pero requiere cuidado: la clave nunca debe aparecer en lo que lee el agente. tm la guarda en un archivo local con permisos 600 o en una variable de entorno, canjea una clave de escritura por un token válido durante una hora y nunca imprime la clave, ni siquiera con --verbose o --dry-run. Un token de ese canje no puede crear claves nuevas ni eliminar la cuenta.
Pruebas: simulación y el mismo comando para ti
Cada llamada que hace un agente con una CLI es una línea que puedes copiar, leer y ejecutar tú mismo. --dry-run va un paso más allá y muestra método, URL y cuerpo sin enviar nada. Así el trabajo del agente se puede revisar antes de que ocurra, lo que más importa en las facturas.
MCP también tiene herramientas para esto, como el MCP Inspector para desarrolladores. Pero una llamada a una herramienta no es algo que escribas en tu propia terminal para ver qué pasa.
Versiones: fijarla o dejar que avance
Una CLI es un paquete con versión. Puedes fijarla (npx -y @time-momentum/cli@0.3.0), volver atrás (tm update --to <version>) y saber que un script que funcionaba ayer funciona hoy. Cuando la API cambia de una forma que una versión antigua interpretaría mal, el servidor rechaza esa versión con un error claro y el comando de actualización.
MCP versiona el protocolo por fecha y permite a los servidores anunciar cambios en su lista de herramientas en tiempo de ejecución. Un servidor remoto decide por sí mismo qué herramientas recibes hoy. Es cómodo mientras nada se rompa.
Alcance: cualquier agente con shell
Claude Code, Codex, Cursor y la mayoría de los agentes de programación pueden ejecutar comandos de shell. Una CLI funciona en todos ellos sin que el cliente tenga que admitir nada más, también en sandboxes y en CI.
Dónde MCP es la mejor opción
- Clientes sin shell. claude.ai, Claude Desktop y las apps móviles de Claude llegan a herramientas externas mediante conectores, que son servidores MCP (Claude docs). Ahí una CLI no sirve.
- Descubrimiento estándar. Cada servidor MCP responde a
tools/listde la misma forma, y el registro oficial de MCP lista servidores. Cada CLI se documenta a su manera. - Inicio de sesión por usuario. OAuth permite que cada persona conecte su propia cuenta sin manejar una clave.
- Usuarios no técnicos. Añadir un conector en una app de chat es más fácil que instalar una línea de comandos.
Cómo lo hace Time Momentum
Los agentes de nuestros usuarios ya trabajan en una shell, en proyectos de clientes. Por eso Time Momentum no tiene servidor MCP. Tiene tm, una línea de comandos que maneja todo el producto: esfuerzo, clientes, encargos, proyectos, facturas y facturas electrónicas, pagos, partes de horas y rentabilidad.
tm no tiene dependencias en tiempo de ejecución. Cada operación de la API REST pensada para la línea de comandos tiene exactamente un comando, 143 operaciones en la versión 0.3.0, y un test lo exige con cada cambio de la API. tm skill devuelve la guía de uso que corresponde a la versión instalada. En Claude Code, tm skill --install añade un skill breve que apunta a ella, y Time Momentum también está disponible como plugin de Claude Code.
Emitir o anular una factura y eliminar necesitan un --yes explícito. Sin terminal, tm se detiene en caso contrario.
Más sobre este tema
Para agentes de IA
Lo que tu agente puede hacer en Time Momentum con
Para agentes de IAtm, el modelo de seguridad y cómo configurarlo.Software empresarial para agentes de IA
Cómo saber si un software deja trabajar a tu agente de forma segura con clientes, facturas y pagos.
Leer la guía
Deja que tu agente lleve la facturación desde la shell
- 30 días de Pro
- Sin tarjeta de crédito
- Después sigues en Free
Preguntas frecuentes
¿Es mejor una CLI o un servidor MCP para agentes de IA?
Para agentes con shell, como Claude Code, Codex o Cursor, una CLI bien hecha suele ser mejor: carga solo lo que pide el agente, los resultados se pueden filtrar con pipes antes de que el modelo los lea y puedes repetir tú mismo cada llamada. Para apps de chat sin shell, MCP es la única opción.
¿Las definiciones de herramientas MCP consumen la ventana de contexto?
En muchos clientes, sí: Anthropic escribió en noviembre de 2025 que la mayoría de los clientes MCP cargan todas las definiciones de herramientas desde el principio. Claude Code ya las aplaza por defecto y al inicio solo carga los nombres de las herramientas.
¿Qué hace que una CLI sirva para agentes?
Un catálogo de comandos legible por máquina, exactamente un documento JSON por llamada, errores en JSON, códigos de salida con significado, ninguna pregunta interactiva sin terminal, un flag de confirmación explícito para pasos destructivos, una simulación y ningún secreto en la salida.
¿Tiene Time Momentum un servidor MCP?
No. Los agentes usan la línea de comandos tm, que cubre cada operación de la API pensada para ella. Claude Code recibe además un skill y un plugin.