Catálogo de herramientas
Hasta 90 herramientas del servidor MCP, según los scopes del grant, agrupadas por dominio, con sus entradas, sus salidas, sus anotaciones y cuáles pasan por confirmación.
Esta página se genera desde el registro real de herramientas del servidor: si una herramienta existe, está acá, con las mismas anotaciones que ve tu cliente MCP. Hasta 90 herramientas, según los scopes del grant.
Convenciones que comparten todas
- El primer argumento de cada herramienta con alcance de empresa es
empresa. Las de nivel cuenta lo rechazan. - Un argumento con
?es opcional. - Las anotaciones son las del protocolo, leídas del mismo objeto
annotationsque recibe tu cliente: «solo lectura» esreadOnlyHint, «irreversible» esdestructiveHint, «idempotente» esidempotentHint. Tu cliente decide con eso si te pregunta cada vez o no. - 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. - Esta página lista todas. TU CONEXIÓN puede ver menos.
tools/listviene filtrado por los permisos que otorgó la persona: una herramienta aparece solo si todo lo que está en su columna Permisos está en el grant. Una conexión condocuments:read empresas:readno recibeemit_document, porque prometer una factura que no puede emitir es peor que no ofrecerla. Cada herramienta publica además su requisito en_meta.requiresScope, para que un cliente pueda decir POR QUÉ falta alguna. Llamar a una que el grant no cubre sigue respondiendoinsufficient_scope, con el permiso que falta y cómo conseguirlo: oculta no es lo mismo que inexistente. - Casi todas necesitan
empresas:read, incluso las que parecen solo de escritura: nombrar una empresa implica leer la lista de empresas que esta conexión alcanza, que es también donde se chequea el límite del sandbox. - Los errores son errores REST. El contenido de error de una herramienta es el mismo objeto
{ type, code, message, hint, retriable, 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 | Salida | Anotaciones | Permisos | ¿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?, items, issue_date?, references? | preview con resolved_receptor, resolved_items, totals, folio_preview, warnings[], preview_id y expires_at. | escribe · reversible | empresas:read + documents:write | no |
emit_document | Emite de verdad. Sandbox: simulado y determinista. Live: ida y vuelta real al SII, folio real, registro tributario real. | empresa?, preview_id?, tipo_dte?, receptor?, items?, issue_date?, references?, external_id?, receptor_details? | el objeto document — o un sobre pending_confirmation si la empresa exige confirmación. | escribe · irreversible · idempotente | empresas:read + documents:write | sí |
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?, document_id?, external_id?, tipo_dte?, folio? | status, bloque sii, rejection_reasons y los timestamps clave. | solo lectura | empresas:read + documents:read | no |
get_document_file | Un PDF o XML como resource_link con vida de 10 minutos, nunca como bytes embebidos. copy: "cedible" elige la copia cedible (solo tipos 33 y 34, solo en PDF). | empresa?, document_id, format?, copy? | un bloque resource_link más la URL en texto como respaldo. | escribe · reversible | empresas:read + documents:read | no |
list_documents | Buscar y navegar lo emitido. También sirve para «tráeme un documento completo» filtrando por id o folio, que es por qué no hay una herramienta get_document aparte. | empresa?, status?, tipo_dte?, folio?, receptor_rut?, external_id?, issue_date_gte?, issue_date_lte?, cursor?, limit? | sobre de lista de document. | solo lectura | empresas:read + documents:read | no |
get_folio_status | ¿Va a alcanzar la próxima emisión? Muestra el stock de folios por tipo antes de gastar una llamada en descubrir que no hay. | empresa?, tipo_dte? | stock por tipo de DTE, con el rango vigente y cuántos quedan. | solo lectura | empresas:read | no |
send_document | Le manda por correo al receptor un documento ya emitido, en PDF y/o XML firmado. Siempre la copia ORIGINAL, nunca la cedible. Sin to va a las direcciones guardadas en el receptor del documento; con to va a donde le digan — y si no hay ninguna guardada ni entregada, no_recipient lo dice y hay que preguntar, jamás inventar una dirección. | empresa?, document_id?, to?, attach?, job_id? | Un job de tipo document_send. El 202 es «encolado», nunca «llegó»: con job_id se lee result.delivered, y en sandbox result.simulated es true y no llegó a ningún buzón real. Repetir el mismo envío a las mismas direcciones devuelve el trabajo ORIGINAL y no manda un segundo correo — eso es el deduplicado funcionando, no una falla. | escribe · reversible | empresas:read + documents:write | no |
emit_credit_note | Emite una nota de crédito (tipo 61) contra un documento que ya está en el SII. En Chile no existe «borrar una factura»: el código 1 la ANULA, el 2 corrige el texto y el 3 corrige los montos (y ahí sí van los items corregidos). Es un segundo documento tributario REAL, con su propio folio. Exige confirm_emit: true, y si la empresa pidió aprobación humana para las escrituras del agente esta herramienta se NIEGA en vez de emitir. | empresa?, document_id, code, reason, items?, external_id?, confirm_emit? | La nota de crédito emitida, con su folio, su total y su estado, y qué documento anula o corrige. Si quedó queued avisa que sigue en vuelo en el SII y que no se emita una segunda: el folio ya se gastó. | escribe · irreversible · idempotente | empresas:read + documents:write | no |
retry_document | Vuelve a encolar un documento atascado en failed — se acabaron los folios, venció el certificado, el SII estaba caído. REUSA el folio ya asignado y nunca crea un segundo documento, que es justamente por qué reintentar es la respuesta correcta a una falla y re-emitir no lo es. Solo failed se puede reintentar; cualquier otro estado se rechaza nombrando el estado real. | empresa?, document_id | El documento de vuelta en queued. La narración dice que se reusa el MISMO folio, que no existe un segundo documento y que hay que mirar get_document_status en vez de darlo por aceptado. | escribe · reversible · idempotente | empresas:read + documents:write | no |
get_document_events | La línea de tiempo de un documento, de lo más viejo a lo más nuevo: cuándo se firmó, cuándo se transmitió, qué contestó el SII y cuándo, si se envió por correo, si una nota de crédito lo anuló. Es la herramienta para «¿qué pasó con esta factura?»; get_document_status responde «dónde está ahora», que es otra pregunta y mucho más corta. | empresa?, document_id | Los eventos con su tipo, su hora y su detalle. Una lista vacía no es un error: un documento emitido hace segundos todavía no tiene ninguno, y eso no es lo mismo que el documento no existir. | solo lectura | empresas:read + documents:read | no |
check_cesion | Le pregunta al SII si una factura se puede ceder hoy. Es un REPORTE, nunca un cálculo nuestro y nunca la cesión misma: la Ley 19.983 la hace cedible con el acuse del receptor, o con ocho días corridos de silencio, y una venta al contado nunca lo es — solo el SII sabe cuál aplica. Es un POST que hace una LECTURA: la operación del registro que consulta no lleva código de acción y no puede cambiar nada allá. | empresa?, document_id | El documento con su bloque cesion. cedible en null significa «nadie ha preguntado todavía», JAMÁS «no es cedible» — la narración lo dice con esas palabras. Termina diciendo que no se cedió ni se registró nada: cede_document es el acto. | solo lectura | empresas:read + documents:read | no |
cede_document | Cede el crédito de una factura a un tercero, registrándolo en el Registro Electrónico de Transferencia de Crédito del SII. ASIGNA PLATA que le deben a otra empresa y NO SE PUEDE DESHACER. Ninguna de las cuatro acciones de la puerta de confirmación cubre una cesión, así que exige confirm_irreversible: true y todos los datos del cesionario sin adivinar ninguno: un RUT equivocado le cede el crédito a la empresa equivocada. | empresa?, document_id?, cesionario_rut?, cesionario_razon_social?, cesionario_direccion?, cesionario_email?, monto?, ultimo_vencimiento?, otras_condiciones?, email_deudor?, job_id?, confirm_irreversible? | Un job de tipo cesion_submit. UN ACUSE NO ES UNA ANOTACIÓN: mientras el trabajo esté running con registration: pending, el AEC fue RECIBIDO por el registro con su TrackID y la anotación está pendiente — la narración lo dice así y prohíbe liquidar plata sobre eso. Solo registration: confirmed es cesión registrada. Un segundo intento tras uno que ya puso un AEC firmado en el cable se rechaza y no se reintenta. | escribe · irreversible · idempotente | empresas:read + documents:write | no |
revoke_document_links | Revoca todos los enlaces públicos vivos de un documento — las URL firmadas y sin credencial que mintea get_document_file. Sirve cuando un enlace se fue a la persona equivocada: dejan de resolver al tiro. | empresa?, document_id | La confirmación de que quedaron revocados, diciendo lo que NO hace: no recupera una copia ya descargada ni un correo ya entregado, y el documento sigue emitido y en el SII. get_document_file mintea uno nuevo cuando haga falta. | escribe · reversible | empresas:read + documents:write | 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 | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
list_received_documents | Navegar los DTE que te enviaron tus proveedores, filtrables por estado de respuesta comercial. | empresa?, status?, tipo_dte?, issue_date_gte?, issue_date_lte?, cursor?, limit? | sobre de lista de resúmenes. | solo lectura | empresas:read + received:read | no |
get_received_document | El 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). | solo lectura | empresas:read + received:read | no |
accept_received_document | Registrar la aceptación explícita (ACD) de un documento recibido. | empresa?, received_document_id | commercial_response. | escribe · irreversible · idempotente | empresas:read + received:write | no |
reclaim_received_document | Registrar un reclamo: contenido, parcial o total. Irreversible una vez registrado en el SII. | empresa?, received_document_id, reason, note? | commercial_response — o un sobre pending_confirmation. | escribe · irreversible · idempotente | empresas:read + received:read + received:write | sí |
acknowledge_received_document | Otorga el acuse de recibo (acción SII ERM) de un documento recibido: registra que la mercadería o el servicio realmente llegó. NO es aceptación del contenido — esa es accept_received_document (ACD). Un documento puede llevar ERM, ACD, ambos o ninguno. Nunca se gatilla por require_confirmation, igual que la aceptación. | empresa?, received_document_id | El CommercialResponse registrado (sii_code ERM, state receipt_acknowledged) con una frase que aclara explícitamente que no es aceptación y que no hay forma de deshacerlo. | escribe · irreversible · idempotente | empresas:read + received:write | no |
Trampa
Las descripciones de estas herramientas dicen «8 días corridos» en su propio 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 | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
get_periodo_summary | La posición de IVA de un período, lista para narrar: débito, crédito, retenido, remanente, PPM y total_payable, con un párrafo en español citable tal cual. | empresa?, period, compare_previous? | las cifras crudas más un narrative de un párrafo y, si se pide, el delta del período anterior. | solo lectura | empresas:read + tax:read | no |
query_rcv | Leer filas del Registro de Compras y Ventas, compras y/o ventas, con filtros por período, contraparte, tipo y estado contable. | empresa?, direction?, period?, estado_contable?, counterparty_rut?, tipo_dte?, issue_date_gte?, issue_date_lte?, cursor?, limit? | sobre de lista de rcv_entry más un bloque sync de frescura. | solo lectura | empresas:read + tax:read | no |
sync_rcv | Pide al SII una lectura fresca del Registro de Compras y Ventas para un período — o para un rango de hasta diez meses, que es cómo se llega a la historia que ni el barrido diario (últimos tres meses) ni el relleno único de doce meses tras la primera sincronización leyeron. Con job_id consulta cómo va una sincronización ya pedida. | empresa?, period?, from?, to?, job_id? | lista de job de tipo rcv_sync (uno por período) con status; el sync.last_synced_at de query_rcv se mueve cuando cada uno termina. | escribe · reversible · idempotente | empresas:read + tax:write | no |
get_f29_propuesta | El F29 calculado del período con cada código explicado en lenguaje llano, y el archivo de carga al SII como enlace. | empresa?, period | el objeto propuesta; cada fila de codes[] lleva explanation y contributing_entries. | escribe · reversible | empresas:read + tax:read | no |
file_f29 | Declarar el F29 — o, pasando 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 pending_confirmation. | escribe · irreversible · idempotente | empresas:read + tax:read + tax:write | sí |
list_tipo46_suggestions | Compras de servicios digitales extranjeros que están esperando una factura de compra. | empresa?, status?, period? | lista de suggestion. | solo lectura | empresas:read + tax:read | no |
emit_tipo46 | Confirmar una sugerencia: emite la factura de compra tipo 46 y deja el IVA retenido como crédito fiscal. | empresa?, suggestion_id | document — o un sobre pending_confirmation. | escribe · irreversible · idempotente | empresas:read + tax:read + tax:write | sí |
characterize_purchases | Fija el tipo de compra de una o varias entradas del registro de compras — la decisión que dice si el IVA de cada compra es crédito fiscal recuperable y, por lo tanto, qué cargan los códigos 519/520 del F29. Una entrada es el caso simple; hasta 500 por llamada para «ordenar el mes completo». | empresa?, entries, confirmation_token? | El lote (characterization_batch): cuántas instrucciones quedaron encoladas, la acción de cada entrada con su tipo_compra anterior, y las que fallaron con su razón. En esta build las escrituras en vivo están apagadas: cada acción termina en dry_run y el registro del SII NO se mueve — la narración lo dice con todas sus letras. Si la empresa tiene la puerta de confirmación, devuelve el sobre pending_confirmation con su URL y no encola nada. | escribe · reversible | empresas:read + tax:write | no |
revert_characterization | Deshace la última caracterización asentada de una compra, devolviéndola al previous_tipo_compra que quedó registrado. Encola una acción NUEVA enlazada a la que deshace: no edita ni borra la original, porque una escritura a un registro tributario que ocurrió, ocurrió, y su fila es la evidencia. | empresa?, entry_id, iva_no_recuperable_code?, confirmation_token? | La acción encolada (characterization_action) con reverts apuntando a la acción deshecha. Igual que la caracterización: en esta build no llega al SII y termina en dry_run. Pasa por la misma puerta de confirmación. | escribe · reversible | empresas:read + tax:write | no |
set_estado_contable | Anota el estado contable LOCAL de una compra —REGISTRO, PENDIENTE o NO_INCLUIR— al lado del valor del SII y nunca encima: el estado_contable del registro del SII lo escribe la sincronización y manda siempre. RECLAMADO no se puede fijar acá: eso es consecuencia de un reclamo registrado, no una elección. | empresa?, entry_id, estado_contable | La entrada actualizada (rcv_entry), con el valor del SII intacto, el override y su honored, y estado_contable_effective — el que la propuesta F29 va a usar de verdad. Si la empresa no tiene honor_estado_contable_override, la narración dice explícitamente que el crédito fiscal no cambió. | escribe · reversible · idempotente | empresas:read + tax:write | no |
list_f29_propuestas | Lista los períodos que tienen propuesta F29 calculada y en qué estado está cada uno (ready, computing, stale, blocked), del mes más nuevo al más viejo. Responde «qué meses están listos» sin sondear doce períodos y cosechar once 404. | empresa?, cursor?, limit? | Una lista de propuestas con período, estado, total a pagar y vencimiento. Un mes que NO aparece nunca fue calculado — la narración lo llama «desconocido», jamás «no se debía nada». | solo lectura | empresas:read + tax:read | no |
recompute_f29_propuesta | Pide recalcular la propuesta F29 de un período con los libros como están ahora, guardando opcionalmente overrides por código. No declara nada y no toca al SII. Cada override exige una razón escrita: una cifra tributaria sobrescrita sin razón registrada es inauditable. | empresa?, period, overrides? | La propuesta en computing — está ENCOLADA, no recalculada. get_f29_propuesta del mismo período la refleja en un momento; hasta entonces no se cita un total ni se llama a file_f29. | escribe · reversible · idempotente | empresas:read + tax:write | no |
list_f29_filings | Todas las declaraciones F29 registradas para la empresa, de la más nueva a la más vieja, con el período, el total declarado y hasta dónde llegó cada una. Es la forma de lista del filing_id de file_f29, sin declarar nada. | empresa?, period_gte?, period_lte?, status?, cursor?, limit? | Una lista de f29_filing. La narración cuida el vocabulario: submitted no es accepted, rejected significa que NO quedó declarada, y dry_run es un ensayo que nunca salió. Un período ausente no fue declarado POR FACTURIA — no dice nada sobre lo que alguien haya declarado a mano en el SII. | solo lectura | empresas:read + tax:read | no |
list_expenses | Los cargos que Facturia tiene para la empresa —cargados por API, traídos de un feed bancario o parseados de una cartola—, que son la materia prima del detector de facturas de compra tipo 46. | empresa?, period?, status?, source?, cursor?, limit? | Una lista de expense con proveedor, monto original y su equivalente en pesos, origen y la sugerencia o el documento que cuelga de cada uno. Un cargo sin sugerencia no es necesariamente inelegible: la detección es asíncrona. | solo lectura | empresas:read + tax:read | no |
add_expense | Registra un cargo para que el detector de tipo 46 pueda verlo — la puerta por la que entra una compra de servicios digitales del exterior cuando no hay feed bancario de la tarjeta con que se pagó. No emite nada ni toca al SII. Un cargo en pesos NUNCA es candidato a tipo 46; uno en moneda extranjera EXIGE fx_rate, porque la tasa fija la base imponible del documento y Facturia no la inventa. | empresa?, provider_name, provider_country?, description?, amount_original, currency, date, fx_rate?, fx_source?, external_id? | El cargo guardado (expense) con su monto convertido a pesos y su período. La sugerencia llega después, de forma asíncrona: se lee con list_tipo46_suggestions y se confirma con emit_tipo46. | escribe · reversible | empresas:read + tax:write | no |
list_statements | Las cartolas subidas para la empresa y cómo resultó cada importación. Es donde se mira cuando alguien dice «subí mi cartola y no pasó nada». | empresa?, cursor?, limit? | Una lista de statement con filas leídas, cargos creados, duplicados saltados y los rechazos fila por fila con su número de línea. El parser rechaza en vez de adivinar, así que esos rechazos son la instrucción de arreglo, no un detalle. | solo lectura | empresas:read + tax:read | no |
upload_statement | Sube una cartola bancaria o de tarjeta (base64, porque una llamada de herramienta no puede llevar un archivo) para que sus líneas en moneda extranjera se conviertan en cargos. En una cartola no hay credencial: son los propios cargos del usuario. | empresa?, file_base64, filename?, format?, default_currency? | Un job de importación: está IMPORTANDO, no importada. Si los bytes son idénticos a una subida anterior, la API reconoce el sha256 antes de guardar nada y devuelve el job ORIGINAL con 200 — la herramienta lo narra como «ya estaba», sin segundo parseo ni doble conteo (#206). | escribe · reversible · idempotente | empresas:read + tax:write | no |
dismiss_tipo46_suggestion | Descarta una sugerencia de factura de compra tipo 46 con una razón de la que el detector aprende. No emite nada y el cargo queda en ficha. Es la otra mitad del par con emit_tipo46. | empresa?, suggestion_id, reason? | La sugerencia en dismissed. La narración dice cuánto IVA de crédito se está dejando de recuperar, porque descartar cuesta plata de verdad y esa es la consecuencia de la llamada. | escribe · reversible | empresas:read + tax:write | no |
list_bank_connections | Los feeds bancarios y de tarjeta enlazados a la empresa, con el estado de cada uno y cuándo sincronizó por última vez. Nunca devuelve credenciales: viven en el proveedor y Facturia solo guarda un token de enlace. | empresa?, cursor?, limit? | Una lista de connection. El estado es lo importante: pending_link significa que falta que una persona complete el enlace y no está llegando nada; requires_relink es la falla típica de los feeds bancarios y explica un mes vacío que no es vacío; solo active sincroniza. | solo lectura | empresas:read + tax:read | no |
link_bank_connection | Crea una conexión bancaria o de tarjeta y devuelve el link_url que una PERSONA abre una vez para autorizarla. Ninguna credencial pasa por la conversación: el login ocurre donde el proveedor, en esa página. | empresa?, provider?, account_types?, sync_frequency? | La conexión en pending_link con su link_url. Todavía no llega nada: la herramienta lo dice y prohíbe describir el feed como funcionando hasta que list_bank_connections lo muestre active. En sandbox nace active sin link y sin nada detrás. | escribe · reversible | empresas:read + tax:write | no |
sync_bank_connection | Pide a un feed enlazado que traiga sus movimientos ahora en vez de esperar la sincronización programada. Cada movimiento en moneda extranjera se convierte en un cargo y el detector de tipo 46 corre sobre los nuevos. No emite nada. | empresa?, connection_id?, job_id? | Un job connection_sync: está ENCOLADO. Con job_id la misma herramienta consulta el job en vez de arrancar otro (GET /jobs/{id}, sin cabecera de empresa). Una conexión que no está active se rechaza en vez de encolar un job que correría sin hacer nada. | escribe · reversible · idempotente | empresas:read + tax:write | no |
delete_bank_connection | Desconecta un feed bancario: se revoca el enlace y deja de entrar movimiento. Los cargos ya creados se CONSERVAN — un gasto que se convirtió en tipo 46 es parte del F29 de la empresa y su procedencia no deja de importar porque se apagó el feed. | empresa?, connection_id | Confirmación de la desconexión. La narración advierte que reconectar no es algo que un agente pueda hacer: link_bank_connection crea una conexión nueva y una persona tiene que completar el enlace en su banco. | escribe · irreversible | empresas:read + tax:write | no |
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 acá: 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.
Cuenta
| Herramienta | Para qué | Entradas | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
list_empresas | Qué empresas puede ver esta conexión — la herramienta de desambiguación de un grant multiempresa. Marca cuáles son sandbox y cuáles no están emitiendo todavía. | status? | lista escueta: id, rut, legal_name, ambiente, mode, status. | solo lectura | empresas:read | no |
select_empresa | Fija la empresa por defecto del resto de la sesión, para no repetir el RUT en cada llamada. Un argumento empresa explícito siempre gana. | empresa | confirmación de la empresa elegida, o del borrado del default. | escribe · reversible · idempotente | empresas:read | no |
get_usage | Cuántos documentos aceptó el SII en un período de facturación, por cuenta o por empresa. Los documentos de sandbox no se facturan nunca. | empresa?, period | usage_summary. | solo lectura | usage:read | no |
get_pending_confirmation | Leer qué pasó con una aprobación que le entregaste a una persona: si sigue esperando, si la aprobó, si la rechazó, si venció, o si la aprobó y la ejecución falló. Es la única lectura que sirve para eso — get_document_status pide un identificador que el sobre no trae. | confirmation_id | status (pending/confirmed/rejected/expired/failed), el resumen que vio la persona, cuándo y por dónde decidió, el result cuando ya corrió, y el error cuando fue rechazada por la API. | solo lectura | ninguno | no |
poll_events | Leer la bitácora de la cuenta hacia adelante desde un checkpoint, para enterarse de que algo pasó — que firmaron el mandato, que el SII aceptó un documento — sin repetir llamadas a ciegas. wait_seconds espera hasta 30 s; por defecto mira una vez y contesta. | after?, type?, limit?, wait_seconds? | Los eventos nuevos, en orden, con el next_cursor para la próxima vez. Sin novedad es una respuesta, no una falla. | solo lectura | webhooks:read | no |
Son deliberadamente 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.
Puesta en marcha
| Herramienta | Para qué | Entradas | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
create_empresa | Agrega una empresa a la cuenta. En sandbox nace emitting; en live nace al principio de la puesta en marcha y necesita varios trámites de una persona ante el SII antes de emitir. | rut, legal_name, giro?, emission_channel?, origen?, contact_email?, doc_types?, resolucion?, resolucion_boletas? | el objeto empresa recién creado, con su id, su onboarding_status y su emission_channel. | escribe · reversible | empresas:write | no |
get_onboarding_status | Dónde está una empresa en la puesta en marcha y qué la tiene detenida: el reporte de avance. | empresa? | el objeto de puesta en marcha, con steps[], blocked_on y los requisitos del SII. | solo lectura | empresas:read | no |
get_pending_human_action | El traspaso a la persona: qué trámite falta, quién exactamente puede hacerlo, qué tener a mano y cómo verificamos que ocurrió, con las instrucciones en español para relatarlas tal cual. Cuando el paso trae approval no hay trámite que hacer: la persona autoriza en la página y lo presentamos nosotros con el certificado en custodia — así va la Declaración de Cumplimiento, que aprueba el representante legal. Lo que sigue siendo del cliente (permisos «Enviar Doctos.», casilla de intercambio) lo es porque ocurre dentro de la sesión del usuario administrador en el SII, donde el certificado que custodiamos no tiene atribuciones. No inventes un tercero: la lista es la que trae pending_action, que ya sabe qué alcanza este despliegue y qué no. | empresa? | pending_action completo, o null cuando nadie está esperando a una persona. | solo lectura | empresas:read | no |
request_mandato_signature | Acuña el enlace donde el representante legal firma el mandato. No firma nada: devuelve una URL de un solo uso para entregarle a esa persona. | empresa? | el mandato con su signing_url — que se entrega una sola vez. | escribe · reversible · idempotente | empresas:read + mandato:write | no |
get_mandato | ¿Está firmado el mandato? Cuándo, por quién y contra qué versión del texto. Sirve para preguntar sin acuñar un enlace nuevo (acuñar revoca el vigente). | empresa? | el mandato, con accepted_at y accepted_by cuando existen. | solo lectura | empresas:read + mandato:write | no |
mint_onboarding_link | Acuña la página alojada de un paso que tiene que hacer una persona, para pasarle la URL. La clave del paso sale de get_pending_human_action; no se inventa. | empresa?, step | el onboarding_link con su url — que se entrega una sola vez — y su vencimiento. | escribe · reversible · idempotente | empresas:read + onboarding:write | no |
recheck_onboarding_step | «Ya lo hice»: pide que vayamos a leer el SII. Acepta una afirmación y no produce ningún hecho — no mueve el paso ni cambia el estado, y lo dice. | empresa?, step | el estado del paso tal como estaba ANTES de mirar, más evidence_source (cómo se confirma, o si no podemos observarlo). | escribe · reversible · idempotente | empresas:read + onboarding:write | no |
upload_certificate | Deja el certificado digital (.pfx) de la empresa en custodia de Facturia. Como una llamada de herramienta no puede llevar un archivo, recibe el .pfx en base64 y su contraseña — o reuse_from_empresa para reutilizar uno que la cuenta ya tiene. | empresa?, file_base64?, password?, filename?, reuse_from_empresa? | la metadata del certificate: titular, vencimiento y los RUT para los que el SII lo reconoce. | escribe · reversible | empresas:read + onboarding:write | no |
set_sfg_credential | Guardar la clave del certificado CENTRALIZADO que el SII ya tiene de la empresa — lo que autoriza al SII a firmar cada documento del Portal MIPYME. Llamada sin la clave, acuña la página alojada donde la persona la escribe ella misma: no se la pidas por chat. No es la clave tributaria, que Facturia nunca pide. | empresa?, clave_centralizado? | La metadata de custodia (stored, stored_at) — el valor no se puede volver a leer nunca — o el enlace a la página donde se escribe. | escribe · reversible | empresas:read + onboarding:write | no |
upload_certification_set_file | Subir el .txt del set de pruebas que el SII emitió para la empresa, en base64, para que se pueda armar la ronda de certificación. Nadie lo baja por ti. Los bytes van tal cual: el archivo es ISO-8859-1 y sus acentos son parte del documento. | empresa?, file_base64, filename? | El set como lo leímos: atención, codificación real, secciones y sus tipos, cantidad de casos y los problemas que no entendimos. | escribe · reversible | empresas:read + empresas:write | no |
request_go_live_authorization | Acuña la página donde el titular autoriza la Declaración de Cumplimiento. No la autoriza: declarar arranca la obligación de Información Electrónica de Compras y Ventas desde ese mes, y ese mes lo elige el cliente. | empresa? | la autorización con su enlace y su vencimiento. | escribe · reversible · idempotente | empresas:read + onboarding:write | no |
get_account | La cuenta autenticada y la credencial en uso: scopes, modo, allowlist de empresas, cuántas empresas alcanza y cuántas de esas pueden emitir hoy, y los límites de la cuenta. Es cómo un agente aprende qué puede hacer esta conexión antes de prometer algo. | ninguna | El objeto Account completo (incluida la ApiKey anidada) en structuredContent; el texto resume nombre de cuenta, scopes, alcance de empresas y límites. | solo lectura | ninguno | no |
get_job | Consulta cualquier job asíncrono por job_id (folio_request, document_send, cesion_submit, rcv_sync, statement_import, connection_sync) — el chequeo genérico que sync_rcv solo cubre para rcv_sync. No manda cabecera de empresa (GET /jobs/{id} la rechaza) y no fija un scope propio: el gate real es del lado de /v1, por tipo de job, así que una negativa llega como insufficient_scope real desde /v1. | job_id | El Job completo en structuredContent; el texto narra por type+status — para rcv_sync delega textualmente en describeSyncJob (tax.ts) para no mantener dos redacciones de lo mismo. | solo lectura | empresas:read | no |
list_usage_records | El ledger inmutable de uso: un registro por documento que el SII efectivamente aceptó (nunca al enviarlo), con reversas como registros compensatorios de cantidad negativa. Es el detalle detrás del resumen de get_usage. empresa es opcional (por defecto, toda la cuenta) — sigue exactamente el patrón de get_usage, incluida la decisión de NO declarar empresas:read en el catálogo porque el camino primario es a nivel de cuenta. | empresa?, period?, metric?, cursor?, limit? | Lista paginada de UsageRecord; el texto resume métrica, cantidad, RUT y período de cada fila. | solo lectura | usage:read | no |
get_event | El gemelo de poll_events para UN evento por id — para reconciliar por id (un id citado en un ticket, o un webhook recibido fuera de orden) en vez de recorrer el ledger hacia adelante. | event_id | El Event completo en structuredContent; el texto resume tipo, fecha y empresa, y avisa qué sub-bloques (data.object/previous_attributes/detail) están presentes. | solo lectura | webhooks:read | no |
get_mandato_terms | El texto y versión vigente del mandato — lo que request_mandato_signature hace firmar. GET /mandato_terms es security: [] en el YAML (sin scope, igual que /error_codes): el cuerpo es una constante sin datos de tenant, por eso el manifest declara requiredScopes vacío. | version? | El objeto mandato_terms completo (texto, versión, status, anexos) en structuredContent; el texto avisa si status es draft (no vinculante) y lista los anexos «parte integrante». | solo lectura | ninguno | no |
list_webhook_endpoints | Lista los endpoints de webhook de la cuenta — URL, eventos habilitados, empresas restringidas, estado. Nunca incluye el secreto de firma. Solo lectura: crear/editar/borrar un endpoint y rotar su secreto se quedan REST/panel-only, decisión del fundador (un agente no tiene dónde recibir un webhook propio). | cursor?, limit? | Lista paginada de WebhookEndpoint. | solo lectura | webhooks:read | no |
list_webhook_deliveries | Intentos de entrega de un endpoint de webhook, más reciente primero — para responder «¿de verdad disparó nuestro webhook para ese evento?». Solo lectura: reintentar una entrega se queda REST/panel-only. | webhook_endpoint_id, status?, event_id?, cursor?, limit? | Lista paginada de WebhookDelivery. | solo lectura | webhooks:read | no |
get_certification | El estado del set de pruebas de una empresa en pista mercado: ronda actual, si el archivo del SII está guardado, qué insumos (slots) faltan, problemas y avisos de la última construcción, y cada envío con su veredicto. | empresa? | El objeto Certification completo. submittable: null se narra como «desconocido, no hay corrida todavía», nunca como false. | solo lectura | empresas:read | no |
set_certification_inputs | Entrega los hechos que el set de pruebas del SII no trae por sí solo: receptor de las pruebas, corrección CodRef-2, quién emitió cada compra, factor de proporcionalidad, folio de notificación, boletas de muestra. Fusión por slot completo: omitir deja, null borra, un valor reemplaza entero. | empresa?, receptor?, giro_recep_emisor?, text_correction?, proveedores?, iva_no_rec_codes?, libro_treatments?, libro_guias?, factor_proporcionalidad?, libro_boleta_folio_notificacion?, boleta_unidades?, boleta_muestras?, permiso_usuario_rut? | Un resumen de qué slots quedaron actualizados. No corre ninguna ronda ni gasta folios — get_certification refleja el efecto. | escribe · reversible · idempotente | empresas:read + empresas:write | no |
list_onboarding_evidence | La rendición de cuentas de la cláusula 4.4 del mandato: cada acto que Facturia hizo por esta empresa, del más nuevo al más viejo, filtrable por step o kind. | empresa?, step?, kind?, cursor?, limit? | Una lista de OnboardingEvidence. El export en CSV completo NO se ofrece como herramienta — responde un archivo crudo sin mecanismo de enlace público. | solo lectura | empresas:read | no |
get_certificate | Metadatos del certificado digital en custodia de una empresa — sujeto, emisor, vencimiento, estado, RUTs autorizados — NUNCA el material. null es una respuesta válida: no hay certificado todavía. | empresa? | El objeto Certificate, o null narrado como «sube uno con upload_certificate». | solo lectura | empresas:read | no |
get_sfg_credential | Si la clave del certificado centralizado SFG está guardada, y desde cuándo — nunca el valor, que esta API no puede devolver a nadie. | empresa? | El objeto SfgCredential (solo metadatos). | solo lectura | empresas:read | no |
delete_certificate | Destruye para siempre el certificado en custodia. LA EMISIÓN SE DETIENE al toque. Exige confirm_delete: true — sin eso, se rechaza antes de llamar a /v1. | empresa?, confirm_delete? | Confirmación de destrucción. Dice que hay que subir un certificado nuevo antes de poder emitir de nuevo. | escribe · irreversible · idempotente | empresas:read + empresas:write | no |
delete_sfg_credential | Destruye para siempre la clave SFG en custodia. A diferencia del certificado, NO retrocede el onboarding — la próxima emisión SFG simplemente se rechaza hasta que se ponga una clave nueva. Exige confirm_delete: true. | empresa?, confirm_delete? | Confirmación de destrucción. | escribe · irreversible · idempotente | empresas:read + empresas:write | no |
revoke_onboarding_link | Revoca el enlace hospedado que un mint_onboarding_link anterior generó para un paso, antes de que caduque solo. Sirve si el enlace equivocado salió, o si la persona ya no debería tenerlo. | empresa?, step | Confirmación de revocación (o de que no había ninguno vivo — mismo resultado). No mueve el estado del paso. | escribe · reversible | empresas:read + onboarding:write | no |
request_mandato_revocation_link | Acuña la página donde el representante legal ejerce la cláusula 7.1: revocar el mandato en cualquier momento, sin causa ni sanción. Esta herramienta SOLO acuña la página — la revocación es el acto de la persona, con su RUT como segundo factor, y ningún tool acá puede hacerlo por ella. | empresa? | El enlace de revocación (vive ~un siglo, se entrega una sola vez). La narración dice explícitamente que revocar detiene a Facturia de actuar ante el SII por esta empresa — nada se revocó por esta llamada. | escribe · reversible · idempotente | empresas:read + mandato:write | no |
Ninguna de estas marca un paso como hecho, y no es una omisión: un paso avanza cuando leemos el hecho en el
SII, nunca porque alguien lo diga. get_pending_human_action es la que hay que llamar cuando una emisión falla
con empresa_not_emitting — devuelve el traspaso completo, en español, escrito para la persona que tiene que
actuar, que muy seguido no es quien tiene la cuenta. Relátalo tal cual: si viene un caveat, esa frase
también va.
Sandbox
| Herramienta | Para qué | Entradas | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
sandbox_set_onboarding_step | Solo en sandbox: forzar un paso del onboarding a un estado, para ensayar el traspaso antes de hacerlo con la empresa de verdad de alguien. Poner mandato en action_required produce el mismo handoff que produciría una empresa real. Afirma un estado, no corre la máquina, y rechaza toda empresa live. | empresa?, step, status, tipo_dte? | El paso como quedó. Nada se verificó y nada llegó al SII. | escribe · reversible | empresas:read + empresas:write | no |
sandbox_advance_clock | Solo en sandbox: adelantar el reloj de la empresa en días enteros, para llegar a un plazo que está a días de distancia — sobre todo la ventana de acuse de 8 días de un documento recibido, que sin esto no se puede ver nunca antes de emitir de verdad. El desfase es acumulativo y no se puede retroceder. | empresa?, days | El desfase en días y qué fecha cree la empresa que es ahora. | escribe · reversible | empresas:read + empresas:write | no |
Estas dos son de ENSAYO y sólo tocan empresas de prueba: la API las rechaza sobre una empresa real y las
herramientas también, antes de llamarla. Existen porque una empresa sandbox nace emitting con todos los pasos
omitidos, así que el traspaso —lo más importante que hace esta superficie— no se podía probar sin una empresa de
verdad y el SII de verdad. Forzar un paso es afirmar un estado, no hacer avanzar nada: fuera del sandbox un paso
avanza cuando leemos el hecho en el SII, nunca porque alguien lo diga.
Folios y CAF
| Herramienta | Para qué | Entradas | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
request_folios | Le pide folios al SII para un tipo de documento — el timbraje, que es un acto REAL contra un recurso finito y no un contador que subimos nosotros. Antes de llamarla hay que mirar get_folio_status: bajo el umbral de la empresa la reposición es automática, así que pedir a mano encima registra un segundo rango que nadie va a usar y que igual hay que anular. El timbraje es un recorrido guionado por el portal del SII y demora minutos, no segundos. | empresa?, tipo_dte?, quantity?, job_id? | Un job de tipo folio_request. Con job_id vuelve a consultarlo: si terminó bien narra el rango realmente registrado (from–to, caf_id) y avisa cuando el SII otorgó MENOS de lo pedido; si falló con range_registered: true dice explícitamente que ya hay un rango registrado y que NO se reintente, porque un reintento registra otro. En sandbox el trabajo llega ya succeeded sobre el rango virtual y la narración dice que no se le pidió nada al SII. | escribe · irreversible | empresas:read + folios:write | no |
list_cafs | Lista los CAF (autorizaciones de folios) que tiene la empresa: un rango por fila, con su tipo de documento, su primer y último folio, si sigue activo y de dónde salió — de un timbraje nuestro o de un archivo que alguien subió. Es la pregunta «qué rangos existen», distinta de get_folio_status, que responde «puedo emitir». | empresa? | La lista de CAF. Una empresa en el portal gratuito del SII no tiene ninguno —ni tendrá, porque el SII asigna el folio en cada emisión— y la lista vacía es la respuesta verdadera, no un hueco. | solo lectura | empresas:read | no |
upload_caf | Registra un CAF que la empresa ya bajó del portal del SII, para que Facturia pueda sacar folios de ese rango. Es la alternativa a request_folios: acá el rango YA está autorizado y no se le pide nada al SII. El archivo se pasa en base64 y no se le pide a nadie que lo pegue en el chat: un CAF lleva <RSASK>, la llave privada que firma el timbre de cada documento del rango. | empresa?, caf_xml_base64?, caf_xml? | El caf registrado, con su rango y su estado. Si el mismo rango ya estaba en archivo devuelve la fila que ya teníamos —el SII no autoriza dos veces el mismo rango— así que reintentar tras un timeout es seguro. El contador de folios NO se mueve al rango nuevo hasta que el rango en uso se agota, así que subirlo antes no bota folios pagados. Nada del archivo se repite en la respuesta. | escribe · reversible · idempotente | empresas:read + folios:write | no |
deactivate_caf | Deja de sacar folios nuevos de un rango CAF. La historia se conserva: los documentos ya emitidos de ese rango mantienen su folio y el rango no se borra — pero deja de ofrecer folios y ESTO NO SE DESHACE desde ninguna parte. Exige confirm_deactivate: true y refuerza mirar list_cafs y nombrarle al usuario el rango por sus folios antes de apagarlo. | empresa?, caf_id, confirm_deactivate? | La confirmación de que el rango quedó inactivo, diciendo que los documentos ya emitidos no se tocan y que un reemplazo necesita request_folios o upload_caf. | escribe · irreversible · idempotente | empresas:read + folios:write | no |
Empresa
| Herramienta | Para qué | Entradas | Salida | Anotaciones | Permisos | ¿Confirmación? |
|---|---|---|---|---|---|---|
get_empresa | Lee la empresa completa como la tiene /v1: estado de onboarding, ambiente SII, qué puede emitir AHORA (capabilities.tipos, no doc_types) y cualquier resolución declarada o probada. Es la vista completa; list_empresas da la misma fila para todas las empresas de la conexión. | empresa? | El objeto Empresa completo. La narración distingue explícitamente capabilities.tipos (la verdad de emisión) de doc_types (la declaración), y dice verified: false/true de cualquier resolución o habilitación de boleta reclamada. | solo lectura | empresas:read | no |
update_empresa | Corrige o declara hechos de una empresa ya existente: razón social, giro, dirección, doc_types, canal de emisión, origen, certification_track, status, y — la puerta del 2026-09-07 — resolucion/resolucion_boletas para una empresa que YA factura con otro proveedor. Declarar no prueba nada por sí solo: verified sigue en false hasta que Facturia pida un timbraje y el SII lo conceda. | empresa?, legal_name?, giro?, acteco?, address?, codigo_sucursal?, contact_email?, doc_types?, certification_track?, origen?, emission_channel?, resolucion?, resolucion_boletas?, status? | El Empresa actualizado. La narración marca un cambio de emission_channel como un cambio de ruteo real (antes→después) y nunca dice que una resolución declarada está confirmada. | escribe · reversible · idempotente | empresas:read + empresas:write | no |
get_automation_settings | Lee cada interruptor de automatización de la empresa: auto-emitir tipo 46, auto-declarar F29, auto-pedir folios, auto-aceptar recibidos, y require_confirmation — si un agente necesita que una persona apruebe antes de que un acto se ejecute. | empresa? | El objeto AutomationSettings, narrado con el estado ON/OFF y el umbral de cada uno. | solo lectura | empresas:read | no |
update_automation_settings | Prende o ajusta una automatización. REGLA QUE ESTA HERRAMIENTA HACE CUMPLIR: un agente NUNCA puede apagar require_confirmation — eso se rechaza acá mismo, antes de llamar a /v1, sea quien sea quien lo pida. Prenderlo sí está permitido. | empresa?, auto_emit_46?, auto_emit_46_max_amount?, auto_file_f29?, auto_file_f29_day?, auto_file_f29_max_payable?, auto_request_folios?, auto_request_folios_threshold?, auto_accept_received?, auto_accept_received_after_days?, require_confirmation?, rcv_sync_frequency?, auto_characterize_purchases?, honor_estado_contable_override? | El AutomationSettings actualizado. La narración dice qué campos cambiaron y el estado final de require_confirmation. | escribe · reversible · idempotente | empresas:read + empresas:write | no |
get_branding | Lee el logo, el pie de página y si una factura sale cedible por defecto en los PDF de la empresa. | empresa? | El objeto Branding. | solo lectura | empresas:read | no |
update_branding | Cambia el logo (por URL — nunca bytes de imagen), el pie de página, o si una factura 33/34 sale cedible por defecto. default_pdf_format solo acepta carta. | empresa?, logo_url?, default_pdf_format?, cedible_by_default?, footer_text? | El Branding actualizado. | escribe · reversible · idempotente | empresas:read + empresas:write | no |
list_counterparties | A quiénes esta empresa les ha facturado (tipos 33/34/56/61 — una boleta es a un consumidor y nunca aparece). Es una DERIVACIÓN de los documentos ya emitidos, no una tabla propia. Sirve para encontrar el rut que piden list_counterparty_contacts y set_counterparty_contact. | empresa? | Una lista de Counterparty, cada una con sus contactos de WhatsApp si los tiene. No paginada — has_more siempre false. | solo lectura | empresas:read | no |
get_counterparty | Lee lo que Facturia tiene guardado de UNA contraparte: razón social, giro y dirección, de dónde salió cada dato (source) y cuándo se actualizó. Es lo que arma el bloque <Receptor> de una factura — el SII acepta el sobre y después rechaza el documento si faltan GiroRecep, DirRecep o CmnaRecep, y el folio se gasta igual. Qué campos exige cada documento lo decide la emisión, no esta herramienta. | empresa?, counterparty_rut | El Counterparty guardado, más una línea que dice qué campos ya están y cuáles siguen en blanco. | solo lectura | empresas:read | no |
update_counterparty | Guarda la razón social, el giro y la dirección de una contraparte para que TODOS los documentos futuros a ese RUT los lleven sin volver a preguntarle a nadie. Es la respuesta a receptor_incomplete. Nunca se inventan ni se deducen: lo que se guarda tiene que venir del usuario. Los topes son rechazos, no recortes — giro 40 caracteres, dirección 70, comuna 20, ciudad 20, razón social 100 — porque acortar un giro cambia lo que dice el documento. | empresa?, counterparty_rut, legal_name?, giro?, address? | El Counterparty ya guardado, con lo que quedó en ficha. | escribe · reversible · idempotente | empresas:read + empresas:write | no |
list_counterparty_contacts | Los contactos de WhatsApp guardados para una contraparte — la libreta de direcciones de esa empresa, primario primero. | empresa?, counterparty_rut | Una lista de CounterpartyContact. notifiable dice si de verdad se le avisaría (primario, con opt-in, sin opt-out) — v1 solo notifica al primario. | solo lectura | empresas:read | no |
set_counterparty_contact | Crea (sin contact_id) o edita (con contact_id) un contacto de WhatsApp de una contraparte — a quién avisarle de una factura. El opt-in es una ATESTACIÓN, no un trámite: se pasa solo cuando hay una base real, nunca por defecto. Un opt-out es de una sola vía y esta herramienta nunca lo revierte. | empresa?, counterparty_rut, contact_id?, name?, phone?, counterparty_name?, primary?, opt_in?, opt_in_method?, opt_in_attested_by?, opted_out? | El CounterpartyContact creado o editado, con notifiable calculado. | escribe · reversible | empresas:read + empresas:write | no |
delete_counterparty_contact | Borra un contacto de la libreta de una contraparte. Borrado real, sin deshacer — y no sirve para esquivar un opt-out: un contacto que ya dijo STOP se rechaza (contact_opted_out), porque esa fila es justamente lo que impide que se le vuelva a agregar. | empresa?, counterparty_rut, contact_id | Confirmación de borrado (o de que ya no existía — mismo resultado). | escribe · irreversible · idempotente | empresas:read + empresas:write | no |
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" }
// ← contenido del resultado
[
{ "type": "text", "text": "Factura 33 folio 412, enlace válido 10 minutos." },
{
"type": "resource_link",
"uri": "https://ver.facturia.cl/l/3d9f2b8a1c?exp=1755184211",
"name": "factura-33-412.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.
Lo que no está en la superficie de agente
Pedir CAF, administrar webhooks, la marca y las escrituras de caracterización del RCV quedan solo en REST y panel: son acciones puntuales o raras con una UI mucho mejor que un turno de chat, 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.
Tampoco hay herramientas de anulación (credit_note) ni de reintento (retry) en este corte.
Además de herramientas, este servidor publica un prompt (onboard_empresa, la caminata completa de puesta
en marcha) y recursos que apuntan a esta documentación y al llms.txt del sitio, para que un agente los
descubra desde dentro de la conexión.
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.