Catálogo de herramientas
Las veinte herramientas del servidor MCP, agrupadas por dominio, con sus entradas, sus salidas y cuáles pasan por confirmación.
Veinte herramientas: las diecinueve del catálogo de la especificación, más select_empresa, que se
agregó bajo la regla de evolución aditiva porque una sesión de chat quiere un default de empresa.
Convenciones que comparten todas
- El primer argumento de cada herramienta con alcance de empresa es
empresa. - La idempotencia es trabajo del servidor, no del agente. Un cliente REST manda su propio
Idempotency-Key; un agente MCP no debería tener que pensar en seguridad de reintento. El servidor genera y administra la llave por debajo — anclada alpreview_idcuando la llamada vino dedraft_document, o a un UUID nuevo por llamada — así que un reintento tras una conexión cortada reutiliza el folio ya asignado en vez de quemar un segundo. - Los errores son errores REST. El contenido de error de una herramienta es el mismo objeto
{ type, code, message, param, doc_url, request_id, empresa }del sobre de errores, devuelto como contenido de error MCP. - Plata, fechas y RUT usan exactamente las convenciones de la API: enteros en CLP, fechas civiles
YYYY-MM-DDen America/Santiago, RUT canónico.
Emisión
| Herramienta | Para qué | Entradas clave | Salida | ¿Confirmación? |
|---|---|---|---|---|
draft_document | Previsualiza antes de firmar nada: resuelve el receptor, valoriza los ítems, calcula totales y previsualiza (nunca reserva) el folio. Sin efectos | empresa, tipo_dte, receptor (RUT, nombre u objeto), items (prosa o arreglo), issue_date?, references? | preview con resolved_receptor, resolved_items, totals, folio_preview, warnings[], preview_id, expires_at | n/a — solo lectura |
emit_document | Emite de verdad. Sandbox: simulado y determinista. Live: ida y vuelta real al SII | empresa, o preview_id o los campos explícitos completos | el objeto document — o un sobre de confirmación pendiente | sí, salvo en sandbox |
get_document_status | Chequeo de estado del tamaño de una narración — no el documento completo, para que un agente que hace polling no arrastre ítems y totales a su contexto cada vez | empresa, uno de document_id | external_id | (tipo_dte+folio) | status, bloque sii, rejection_reasons, timestamps clave | no |
get_document_file | Un PDF o XML como resource link, no como bytes embebidos | empresa, document_id, format (pdf|xml), pdf_format?, copy? | un bloque resource_link más una URL de texto como respaldo | no |
list_documents | Buscar y navegar. También sirve para «tráeme un documento completo» vía filtro de id o folio, que es por qué no hay una herramienta get_document aparte | empresa, filtros, cursor?, limit? | sobre de lista de document | no |
draft_document devuelve receptor_incomplete con el campo exacto que falta, nunca una adivinanza
silenciosa. emit_document puede devolver totals_mismatch si el agente mandó totales explícitos que
no cuadran — la descripción de la herramienta le dice que nunca calcule totales a mano salvo que esté
seguro, precisamente porque ese campo es una aserción, no una pista.
Recepción
| Herramienta | Para qué | Entradas clave | Salida | ¿Confirmación? |
|---|---|---|---|---|
list_received_documents | Navegar los DTE de proveedores, filtrables por estado de respuesta comercial | empresa, filtros, cursor?, limit? | sobre de lista de resúmenes | no |
get_received_document | Detalle completo de uno, incluido el plazo del acuse | empresa, received_document_id | received_document completo, con commercial_response (deadline_at, days_remaining, available_actions) | no |
accept_received_document | Registrar la aceptación explícita ACD | empresa, received_document_id | commercial_response | no — coincide con el default legal de todas formas |
reclaim_received_document | Registrar un reclamo: contenido, parcial o total. Irreversible | empresa, received_document_id, reason, note? (obligatorio en content) | commercial_response — o un sobre de confirmación pendiente | sí |
Trampa
Las descripciones de estas dos herramientas dicen «8 días corridos» en el texto
get_received_document y reclaim_received_document declaran la ventana de 8 días en su propia
descripción y exponen days_remaining de forma prominente. Un agente narrando «te quedan 2 días para
responder» solo funciona si el plazo es imposible de pasar por alto en el esquema.
Errores frecuentes: commercial_response_window_closed (pasado el día 8),
commercial_response_already_registered (un solo tiro), commercial_response_not_applicable (tipo
equivocado — solo 33/34/43 llevan respuesta comercial).
Impuestos
| Herramienta | Para qué | Entradas clave | Salida | ¿Confirmación? |
|---|---|---|---|---|
get_periodo_summary | Posición de IVA de un período, lista para narrar | empresa, period, compare_previous? | débito/crédito/retenido/remanente/PPM/total_payable/due_date, un narrative de un párrafo y, si se pide, el delta del período anterior | no |
query_rcv | Leer filas del RCV, compras y/o ventas | empresa, direction, period?, estado_contable?, counterparty_rut?, tipo_dte?, rango de fechas, cursor? | sobre de lista de rcv_entry más un bloque sync de frescura | no |
get_f29_propuesta | El F29 calculado del período, con cada código explicado | empresa, period | el objeto propuesta; cada fila de codes[] lleva además explanation en lenguaje llano y contributing_entries | no |
file_f29 | Declarar el F29 — o, con filing_id, consultar una declaración ya hecha en vez de crear un duplicado | empresa, period, confirm_total_payable, filing_id? | job f29_filing — o un sobre de confirmación pendiente | sí |
list_tipo46_suggestions | Compras de servicios digitales extranjeros esperando una factura de compra | empresa, status? (por defecto open), period? | lista de suggestion | n/a — solo lectura |
emit_tipo46 | Confirmar una sugerencia → emite la factura de compra tipo 46 | empresa, suggestion_id | document — o un sobre de confirmación pendiente | sí |
confirm_total_payable sigue siendo obligatorio a través de la capa MCP. La API REST ya se niega a
declarar sin él, y esa barrera vale doble aquí: obliga a que la cifra aparezca explícita en la llamada
de herramienta, lo que obliga a que aparezca explícita en lo que el agente le diga a la persona antes
de declarar.
El narrative de get_periodo_summary existe porque acertarle al vocabulario tributario en español
—débito, crédito, remanente— es exactamente el tipo de cosa que un modelo generalista equivoca de
forma sutil. La herramienta devuelve las cifras crudas y el párrafo listo para citar.
Cuenta
| Herramienta | Para qué | Entradas clave | Salida |
|---|---|---|---|
list_empresas | Qué compañías puede ver este token — la herramienta de desambiguación de un grant multiempresa | status? | lista escueta: id, rut, legal_name, ambiente, mode, status |
get_onboarding_status | Dónde está una empresa en el asistente de puesta en marcha | empresa | el objeto de puesta en marcha |
get_usage | Resumen de consumo y facturación | empresa? (omítela para toda la cuenta), period | usage_summary |
select_empresa | Fija la empresa por defecto de la sesión | empresa | confirmación |
Las tres primeras son deliberadamente de solo lectura y escuetas. select_empresa está acotada para
que no rompa el requisito de que el servidor sea capaz de operar sin estado: un argumento empresa
explícito siempre gana, y perder la sesión pierde un default, no produce una respuesta equivocada.
Confirmación
| Herramienta | Para qué | Entradas | Salida |
|---|---|---|---|
confirm_action | Completar una escritura que require_confirmation dejó pendiente | confirmation_id | exactamente el recurso que la llamada original habría devuelto |
Cómo vuelven los archivos
MCP le da a una herramienta dos formas de devolver un archivo: embebido como blob base64, o como un
resource_link que el cliente busca solo si y cuando necesita los bytes. Facturia MCP siempre usa
resource_link, nunca blobs embebidos.
// → get_document_file
{ "empresa": "77928532-4", "document_id": "doc_01K2R7Q4XW9M3B8ZC5YHTVJD6N", "format": "pdf", "copy": "cedible" }
// ← contenido del resultado
[
{ "type": "text", "text": "Factura 33 folio 412 — copia cedible, enlace válido 10 minutos." },
{
"type": "resource_link",
"uri": "https://ver.facturia.cl/l/3d9f2b8a1c?exp=1755184211",
"name": "factura-33-412-cedible.pdf",
"mimeType": "application/pdf"
}
]Tres razones:
- Economía de contexto. Un PDF firmado embebido en base64 puede ser cientos de kilobytes de contenido inyectado al contexto del modelo por un documento que nadie pidió que leyera en voz alta. Un enlace cuesta una frase.
- Compatibilidad de clientes. Las URL
pdf_url/xml_urlde la API REST exigen una llave. La mayoría de los hosts MCP no tienen forma de adjuntar el token OAuth de Facturia al resolver un resource link — ni deberían tener que sostenerlo. - Más seguro que el default REST.
get_document_fileenciende el mecanismo que REST ya publica como opt-in (enlaces públicos firmados, con vencimiento, sin autenticación) y le acorta la vida a 10 minutos, con alcance de un solo documento y sin listar. Suficientemente corto para que un enlace pegado en un chat que la persona comparta después ya esté muerto; suficientemente largo para sobrevivir la vuelta por lo que sea que lo renderice.
Lo que no está en la superficie de agente
Crear una empresa, cargar un certificado, firmar un mandato, pedir CAF, administrar webhooks, la
marca y las escrituras de caracterización del RCV quedan solo en REST y panel. Dos razones se apilan:
son acciones puntuales o raras con una UI mucho mejor que un turno de chat (nadie quiere pegar la
contraseña de un .pfx en una conversación con un agente), y el registro dinámico de cliente
significa que el software que llama no está verificado como sí lo está una sesión del panel, así que
las herramientas de mayor radio de daño por error son justamente las que conviene mantener fuera del
alcance del agente.
Tampoco hay herramientas de anulación (credit_note) ni de reintento (retry) en este corte.
Conectar un agente
mcp.facturia.cl — el mismo motor, otra puerta de entrada. Cómo conectar Claude, qué pasa en el OAuth y por qué un grant de sandbox es un límite duro.
Confirmaciones de dos pasos
Cuándo la aprobación del cliente MCP no basta, qué herramientas se pueden poner tras un segundo cerrojo y cómo se completa una acción pendiente.