Servidor MCP (asistentes IA)
Emitoo expone un servidor MCP (Model Context Protocol) en
https://api.emitoo.io/mcp. Claude, ChatGPT, Cursor, Claude Code o tu propio
agente pueden consultar los comprobantes emitidos, las ventas, los
clientes, las compras y los cobros de una empresa en
lenguaje natural: «¿cuánto facturé en septiembre?», «¿qué facturas de ACME
siguen con saldo?», «muéstrame el resumen fiscal del mes».
Solo lectura, por diseño
mcp (prefijo fmk_) que solo
admite permisos de lectura; aunque alguien la usara contra la API REST,
cualquier POST, PUT o DELETE recibe
403.
Claude.ai y ChatGPT (Conectores)
Los hosts que soportan OAuth se conectan sin copiar claves. El flujo es OAuth 2.1 con PKCE y registro dinámico del cliente; a ti solo te toca aprobar.
- En el asistente, añade un conector personalizado con la
URL
https://api.emitoo.io/mcp. - El asistente te lleva a
app.emitoo.io/conectar. Inicia sesión con un usuario administrador de la empresa. - Elige la empresa (si administras varias) y los alcances que autorizas. La pantalla muestra a qué dominio volverá el navegador: si no lo esperabas, cancela.
- Vuelves al asistente ya conectado. Empieza preguntando
«¿a qué empresa estás conectado?» (usa
empresa_actual).
La conexión vence a los 90 días; al vencer, el asistente vuelve a pedir autorización. Puedes revocarla antes desde API keys → Asistentes IA en el panel.
Claude Code, Cursor y Claude Desktop
Para hosts que se configuran con un archivo o un comando, crea una
conexión en API keys → Asistentes IA → Nueva conexión. Te
da una clave fmk_… (se muestra una sola vez) que viaja como
Authorization: Bearer.
claude mcp add --transport http emitoo https://api.emitoo.io/mcp \
--header "Authorization: Bearer fmk_..."{
"mcpServers": {
"emitoo": {
"url": "https://api.emitoo.io/mcp",
"headers": { "Authorization": "Bearer fmk_..." }
}
}
}curl -X POST https://api.emitoo.io/mcp \
-H "Authorization: Bearer $EMITOO_MCP_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "ventas_periodo",
"arguments": { "desde": "2026-09-01", "hasta": "2026-09-30" } }
}'Qué puede consultar
24 herramientas, todas anotadas como readOnlyHint. Los
listados devuelven como mucho 100 filas y un siguiente_offset
para paginar; los importes van en USD y las fechas en hora de Ecuador.
Cada alcance agrupa un conjunto de herramientas:
comprobantes:read — Comprobantes emitidos y reportes de ventas
| Herramienta | Qué devuelve |
|---|---|
empresa_actual | RUC, razón social, ambiente del SRI, plan y alcances de la conexión. Siempre disponible. |
listar_facturas | Por fecha, estado, cliente, texto o solo con saldo por cobrar. Paginado. |
obtener_factura | Por id, número (001-001-000000123) o clave de acceso: detalles, pagos, estado SRI, saldo. |
ventas_periodo | Totales entre dos fechas: subtotales por tarifa, IVA, notas de crédito, neto. |
resumen_fiscal | Resumen mensual: ventas, compras, retenciones emitidas y recibidas, IVA. |
listar_notas_credito / obtener_nota_credito | Notas de crédito emitidas y su detalle. |
listar_notas_debito / obtener_nota_debito | Notas de débito emitidas y su detalle. |
listar_retenciones / obtener_retencion | Retenciones emitidas, por fecha, estado o período fiscal. |
listar_guias_remision / obtener_guia_remision | Guías de remisión emitidas. |
listar_liquidaciones_compra / obtener_liquidacion_compra | Liquidaciones de compra emitidas. |
catalogo:read — Clientes, proveedores y servicios
| Herramienta | Qué devuelve |
|---|---|
listar_clientes_proveedores | Búsqueda por razón social o identificación. |
obtener_cliente_proveedor | Por id o por cédula/RUC. |
listar_servicios | Catálogo de productos y servicios con precio y tarifa de IVA. |
compras:read — Compras, cobros y pagos a proveedores
| Herramienta | Qué devuelve |
|---|---|
listar_compras / obtener_compra | Facturas de proveedores recibidas, por fecha, estado de pago o proveedor. |
listar_cobros / obtener_cobro | Dinero recibido de clientes y a qué facturas se aplicó. |
listar_pagos_proveedor / obtener_pago_proveedor | Pagos hechos a proveedores y qué compras cancelan. |
Lo que nunca sale por el MCP
.p12 ni ningún
binario. La clave de acceso y el número de autorización sí: son datos
públicos del comprobante y sirven para consultarlo en el SRI.
Seguridad y control
- Una conexión = una empresa. El asistente nunca ve otra empresa aunque tu usuario administre varias; para dos empresas se crean dos conexiones.
- Solo un administrador autoriza. Las cuentas de plataforma y los roles contador, usuario o admin de sucursal no pueden conectar asistentes.
- Alcances recortables. Al autorizar eliges qué grupos de datos puede leer; el resto responde «esta conexión no tiene acceso».
- Auditoría. Cada llamada a una herramienta queda en la
bitácora de la empresa (método
MCP, herramienta, argumentos, IP, duración), junto a las peticiones de la API REST. - Revocación inmediata desde el panel; la conexión también vence sola a los 90 días.
- Mismo rate limit que la API pública, por conexión y por IP.
Planes
El servidor MCP está incluido en todos los planes de pago.
En el plan Gratis, empresa_actual responde (para que el
asistente pueda explicarlo) y el resto de herramientas devuelve
«Tu plan no incluye el Asistente IA (MCP)». Se activa al subir de plan,
sin reconectar.
Para desarrolladores: el protocolo
Es MCP estándar sobre Streamable HTTP, sin estado y con
respuestas JSON, así que cualquier cliente compatible funciona. Los
endpoints relevantes cuelgan de https://api.emitoo.io:
| Endpoint | Para qué |
|---|---|
POST /mcp | JSON-RPC del protocolo (initialize, tools/list, tools/call). Manda Accept: application/json, text/event-stream. |
GET /.well-known/oauth-protected-resource/mcp | Metadata del recurso (RFC 9728): qué servidor de autorización usar. |
GET /.well-known/oauth-authorization-server | Metadata del servidor de autorización (RFC 8414). |
POST /register | Registro dinámico de clientes (RFC 7591). redirect_uris solo https (o http://localhost). |
GET /authorize | PKCE S256 obligatorio; acepta resource (RFC 8707). Redirige al consentimiento en la web. |
POST /token | grant_type=authorization_code. El access_token es una key fmk_…. Sin refresh tokens: al vencer se vuelve a autorizar. |
POST /revoke | Revoca el token (RFC 7009). |
Sin credencial, /mcp responde el 401 que dispara el flujo OAuth en el host:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token",
resource_metadata="https://api.emitoo.io/.well-known/oauth-protected-resource/mcp"Y la respuesta de /token tras el consentimiento:
{
"access_token": "fmk_…",
"token_type": "Bearer",
"expires_in": 7776000,
"scope": "comprobantes:read catalogo:read compras:read"
}Claves manuales y OAuth son lo mismo por dentro
mcp: se listan, se auditan y se
revocan en el mismo sitio. Una key fpk_ de la API REST
no funciona en /mcp, aunque solo tenga
permisos de lectura.
Errores habituales
| Qué ves | Por qué |
|---|---|
401 en /mcp | Sin Bearer, clave revocada o vencida, o una key fpk_ de la API REST. |
Resultado con isError: «Tu plan no incluye el Asistente IA» | La empresa está en el plan Gratis. |
Resultado con isError: «Esta conexión no tiene acceso a …» | Ese alcance no se autorizó al conectar. Reconecta autorizándolo. |
Resultado con isError: «No existe …» | El id no pertenece a la empresa de la conexión (no se revela si existe en otra). |
400 invalid_grant en /token | code_verifier incorrecto, código ya usado o expirado (5 minutos). |