Skip to main content
Glama

facturador-afip-mcp

Servidor MCP para emitir facturas electrónicas de ARCA (ex AFIP) desde Claude u otro cliente de MCP:

  • Facturas A, B y C y sus notas de crédito, por WSFE.

  • Factura E (exportación), por WSFEX.

Le pedís a Claude la factura en lenguaje natural ("haceme la factura de septiembre", o le pasás el invoice de tu cliente), la valida en homologación y, cuando la aprobás, la emite: vos confirmás cada emisión tipeando el número de comprobante en una tarjeta dentro del chat. Arma el PDF con el diseño de "Comprobantes en línea", lleva la numeración y guarda cada comprobante.

Índice

Related MCP server: ArcaMCP

Instalación

Requiere uv.

Claude Desktop

  1. Descargá facturador-afip.mcpb de la última release.

  2. Abrilo con doble clic, o en Configuración → Extensiones → Instalar extensión.

  3. Elegí tu carpeta de datos (por defecto ~/.facturador-afip).

Cada emisión se confirma en una tarjeta dentro del chat. Funciona en macOS y Windows.

Claude Code, como plugin

El plugin instala el servidor y te pide la carpeta de datos al habilitarlo:

claude plugin marketplace add ignaciovilagraca/facturador-afip-mcp
claude plugin install facturador-afip@facturador-afip-mcp

Este repositorio es el plugin (.claude-plugin/plugin.json) y también su marketplace (.claude-plugin/marketplace.json). El plugin corre el código de este repositorio con las dependencias exactas de uv.lock.

El plugin funciona en Claude Code y Cowork. En claude.ai web no, porque el servidor corre en tu computadora; en Claude Desktop usá el .mcpb.

Claude Code, como servidor MCP

claude mcp add facturador-afip --scope user -e FACTURADOR_AFIP_DIR=~/.facturador-afip -- uvx facturador-afip-mcp

Permisos recomendados en ~/.claude/settings.json: lectura sin preguntar, y ask explícito para emitir y descartar:

{
  "permissions": {
    "allow": [
      "mcp__facturador-afip__estado_configuracion",
      "mcp__facturador-afip__ver_perfil",
      "mcp__facturador-afip__probar_conexion",
      "mcp__facturador-afip__ultimo_comprobante",
      "mcp__facturador-afip__buscar_codigo",
      "mcp__facturador-afip__listar_comprobantes",
      "mcp__facturador-afip__ver_comprobante",
      "mcp__facturador-afip__listar_borradores",
      "mcp__facturador-afip__generar_pdf",
      "mcp__facturador-afip__validar_en_homologacion",
      "mcp__facturador-afip__preparar_emision"
    ],
    "ask": [
      "mcp__facturador-afip__emitir_en_produccion",
      "mcp__facturador-afip__descartar_borrador"
    ]
  }
}

Nunca pongas emitir_en_produccion en allow.

Otros clientes de MCP

El paquete está en PyPI. La configuración típica:

{
  "mcpServers": {
    "facturador-afip": {
      "command": "uvx",
      "args": ["facturador-afip-mcp"],
      "env": { "FACTURADOR_AFIP_DIR": "/Users/<usuario>/.facturador-afip" }
    }
  }
}

Primeros pasos

Pedile a Claude "configurá el facturador" (en Claude Code también está el comando /configurar del plugin). Claude revisa en qué paso estás y te guía hasta poder emitir:

  1. Te pide tu CUIT, tu nombre o razón social y los datos que van impresos en las facturas, y genera en tu computadora tu clave privada y el pedido de certificado (CSR). La clave nunca sale de tu computadora ni pasa por Claude.

  2. Te guía pantalla por pantalla en ARCA para obtener los certificados (WSASS en homologación, Administración de Certificados Digitales en producción). Le pasás el certificado que te da ARCA y lo guarda después de verificar que corresponda a tu clave y al entorno correcto.

  3. Te guía para autorizar el certificado y dar de alta el punto de venta, y te pregunta tus preferencias (cliente habitual, formato de la factura).

  4. Prueba la conexión con ARCA.

Los pasos dentro de ARCA los hacés vos con tu clave fiscal. Si te trabás, pasale a Claude una captura o el mensaje de error.

Si preferís la terminal, uvx facturador-afip-mcp init --cuit ... --nombre ... --alias ... hace el paso 1. Si ya usás facturador-afip, no hace falta nada de esto: apuntá la carpeta de datos a la de ese proyecto.

Cómo se usa

Pedíselo a Claude como se lo pedirías a una persona: "haceme la factura del mes", "facturale 1500 dólares a Acme por septiembre", o pasale el PDF del invoice. Claude:

  1. Arma la factura con tu perfil y te muestra los datos para que los confirmes.

  2. La valida en homologación, sin valor fiscal.

  3. Te muestra el número, el receptor, el total y la cotización reales de producción, y te pide la aprobación.

  4. Con tu aprobación, pide la emisión. Vos confirmás en la tarjeta tipeando el número de comprobante; si cancelás, no se emite nada.

  5. Te pasa el número, el CAE y dónde quedó el PDF.

Cómo protege la emisión

Una factura emitida en producción es un comprobante fiscal real: no se borra, solo se anula con una nota de crédito. Por eso emitir pasa por varias barreras, y las del servidor no dependen de lo que decida el modelo:

  1. Primero homologación. Solo se emite un borrador que validar_en_homologacion ya emitió con éxito en homologación. Se compara un hash: producción emite exactamente la factura validada.

  2. Los datos reales a la vista. preparar_emision arma la emisión sin emitir y devuelve el número de comprobante, el receptor, el total y la cotización de producción. emitir_en_produccion recibe esos mismos datos y el servidor verifica que coincidan con los reales; si no, no emite. Así el diálogo de permiso del cliente muestra qué se va a emitir.

  3. La confirmación de una persona. Antes de enviar a ARCA, una persona confirma por la primera de estas vías que el cliente soporte (FACTURADOR_CONFIRMACION, en este orden por defecto):

    Vía

    Dónde

    Cómo

    apps

    Clientes con MCP Apps (Claude Desktop)

    Una tarjeta dentro del chat con el resumen: hay que tipear el número de comprobante y apretar Emitir. El botón llama a confirmar_emision, una herramienta que el cliente no le muestra al modelo, con un token de un solo uso que la tarjeta pide a otra herramienta oculta, así que nunca pasa por el modelo. La confirmación vence a los 10 minutos

    elicitation

    Clientes con elicitation (Claude Code en la terminal)

    Un formulario del cliente: hay que tipear el número

    permiso

    Cualquier cliente

    El diálogo de permiso del cliente, que muestra número, receptor y total. Solo sirve si emitir_en_produccion está en ask: el servidor no puede saber si aprobó una persona. Sacalo de la lista si no es tu caso

    dialogo

    macOS (osascript) y Linux (zenity)

    Un diálogo del sistema, fuera del cliente: hay que tipear el número

    Como permiso siempre está disponible, con el orden por defecto el diálogo del sistema solo se usa si sacás permiso de la lista. estado_configuracion muestra qué vía se va a usar con el cliente conectado.

  4. Una sola vez. Un borrador emitido no se puede volver a emitir. Si la conexión se corta a mitad de la emisión, el próximo intento primero consulta a ARCA si el comprobante ya existe y solo reintenta si no.

  5. Tope opcional por comprobante, en pesos (FACTURADOR_TOTAL_MAXIMO_ARS).

Credenciales y carpeta de datos

El servidor corre en tu computadora. La clave privada y el certificado se leen de disco al firmar el login con ARCA: nunca pasan por el modelo ni por los argumentos de una herramienta.

Todo vive en una carpeta de datos, $FACTURADOR_AFIP_DIR o ~/.facturador-afip:

.env            AFIP_CUIT, datos del emisor para el PDF, FACTURADOR_TOTAL_MAXIMO_ARS, FACTURADOR_CONFIRMACION
perfil.json     puntos de venta, condición frente al IVA, cliente por defecto, formato, reglas de fechas
certs/          afip.key y afip_homo.crt (homologación); afip_prod.key y afip_prod.crt (producción); tickets ta_*.json
facturas/homo/  validaciones en homologación
facturas/prod/  comprobantes emitidos: JSON y PDF
facturas/mcp/   borradores del servidor

Es la misma estructura que la de facturador-afip. Si ya lo usás, apuntá FACTURADOR_AFIP_DIR a esa carpeta. Además de reutilizar certificados, perfil y facturas, comparten la caché de tickets de WSAA: ARCA no da un ticket nuevo mientras el anterior siga vigente, así que dos carpetas con el mismo certificado se bloquearían entre sí.

Si arrancás de cero, init la crea: ver Primeros pasos.

Herramientas

Herramienta

Qué hace

Toca ARCA

estado_configuracion

En qué paso del alta estás, carpeta, CUIT, certificados y vencimiento, perfil, forma de confirmar

No

guia_alta_arca

Guía del alta en ARCA y errores frecuentes, por sección

No

iniciar_configuracion

Crea la carpeta de datos, guarda el CUIT y los datos del emisor, y genera la clave y los CSR

No

ver_csr

El pedido de certificado de un entorno, para llevar a ARCA

No

guardar_certificado

Verifica y guarda el certificado que da ARCA (texto de WSASS o ruta del .crt)

No

guardar_perfil

Guarda las preferencias en perfil.json

No

ver_perfil

perfil.json

No

probar_conexion

Estado del servicio, login y puntos de venta

Solo lectura

ultimo_comprobante

Último número autorizado

Solo lectura

buscar_codigo

Códigos de país, CUIT genérico por país y monedas

Solo lectura (homologación)

listar_comprobantes, ver_comprobante

Comprobantes guardados

No

generar_pdf

Regenera el PDF de un comprobante guardado

No (salvo JSON viejos de Factura E)

validar_en_homologacion

Emite en homologación y crea el borrador

Homologación, sin valor fiscal

preparar_emision

Número, receptor, total y cotización reales de producción, sin emitir

Solo lectura

listar_borradores, descartar_borrador

Borradores y su estado

No

emitir_en_produccion

Emite el borrador, con confirmación de una persona

Producción

estado_confirmacion, cancelar_emision, confirmar_emision

Solo para la tarjeta: el modelo no las ve

confirmar_emision emite en producción

El servidor le pasa al modelo instrucciones con el flujo: juntar los datos, confirmarlos con el usuario, validar en homologación, preparar la emisión, pedir aprobación expresa con los datos reales y recién ahí emitir. El formato del JSON de cada tipo de comprobante está en esas instrucciones (INSTRUCCIONES en server.py) y en ejemplos/.

Comandos

uvx facturador-afip-mcp init ...            # carpeta de datos, clave y CSR
uvx facturador-afip-mcp borradores          # lista los borradores
uvx facturador-afip-mcp emitir <borrador>   # emite un borrador, con confirmación en la terminal

emitir sirve para clientes sin tarjeta ni elicitation, o para quien prefiera emitir siempre desde la terminal.

Alta en ARCA paso a paso

Lo más simple es hacerlo con Claude: pedile "configurá el facturador" y te guía paso a paso con esta misma guía, que viene dentro del servidor (guia_alta_arca).

Para usar los web services de facturación hay que: generar una clave y un pedido de certificado, obtener el certificado en ARCA, autorizarlo para el servicio y, en producción, dar de alta un punto de venta para web services. Se hace una vez por entorno.

Los pasos son los mismos para las Facturas A, B y C (servicio wsfe) y para la Factura E (servicio wsfex); cambian el servicio que se autoriza y el tipo de punto de venta. Si vas a emitir los dos tipos, autorizá los dos servicios.

Facturas A, B o C

Factura E (exportación)

Servicio web

wsfe

wsfex

Nombre en el Administrador de Relaciones (ARCA → WebServices)

Facturación Electrónica

Facturación Electrónica de Exportación

Sistema del punto de venta

Factura Electrónica - Monotributo - Web Services (monotributistas) o RECE para aplicativo y web services (responsables inscriptos)

Comprobantes de Exportación - Web Services

Dos cosas que confunden la primera vez:

  • Lo que se autoriza es un "Computador Fiscal", no una persona. El certificado representa a tu programa; en ARCA se identifica por el alias que le pusiste. Por eso en las relaciones el representante es el Computador Fiscal con ese alias, nunca tu CUIT.

  • Hay dos ramas parecidas en el buscador de servicios de ARCA: "Servicios interactivos" (los que usás desde la web de ARCA) y "WebServices" (los que usa un programa). Para autorizar el certificado siempre es WebServices. Si elegís el interactivo, ARCA responde "El servicio debe ser delegable".

ARCA cambia seguido los nombres y la ubicación de los menús. Si alguno no coincide exactamente, buscalo por palabras clave ("certificados", "relaciones", "puntos de venta").

Requisitos

  • Clave fiscal nivel 3 o superior.

Paso 1: clave privada y pedido de certificado (CSR)

Lo hace el servidor con iniciar_configuracion: genera en la computadora de la persona una clave privada y un CSR por entorno, y escribe el CUIT y los datos del emisor. La clave privada nunca sale de la computadora ni se muestra. Los CSR son públicos: la herramienta los devuelve para pegarlos o subirlos en ARCA.

  • El alias va solo con letras y números (sin guiones, espacios ni acentos); si no, ARCA lo rechaza con "El Nombre simbólico del DN sólo puede contener números y/o letras". Ejemplo: facturador1a2b3c.

  • Los datos del emisor (razón social, domicilio comercial, condición frente al IVA, ingresos brutos, inicio de actividades) van impresos en el PDF de cada factura.

Paso 2: homologación (entorno de pruebas)

  1. Entrá a arca.gob.ar con clave fiscal.

  2. Si no tenés el servicio "WSASS - Autogestión Certificados Homologación", adherilo:

    1. Entrá a "Administrador de Relaciones de Clave Fiscal".

    2. Elegí "Adherir servicio".

    3. Buscá ARCA → Servicios interactivos → "WSASS - Autogestión Certificados Homologación" y confirmá.

    4. Cerrá sesión y volvé a entrar para que aparezca.

  3. En WSASS, elegí "Nuevo Certificado":

    1. En "Nombre simbólico del DN" poné el alias (el mismo ALIAS del CSR).

    2. En "Solicitud de certificado en formato PKCS#10" pegá el CSR de homologación que devolvió iniciar_configuracion (o ver_csr), incluidas las líneas -----BEGIN CERTIFICATE REQUEST----- y -----END CERTIFICATE REQUEST-----.

    3. Elegí "Crear DN y obtener certificado".

    4. WSASS no da un archivo: muestra el certificado en la pantalla. Copiá el texto, desde -----BEGIN CERTIFICATE----- hasta -----END CERTIFICATE-----, y pasáselo a Claude: lo guarda guardar_certificado con entorno homo, que verifica que corresponda a la clave. Ojo con no confundirlo con el CSR, que empieza con -----BEGIN CERTIFICATE REQUEST-----.

  4. En WSASS, elegí "Crear autorización a servicio":

    1. Nombre simbólico del DN: tu alias.

    2. CUIT representada: tu CUIT.

    3. Servicio: wsfe - Facturación Electrónica para las Facturas A, B y C. Si también facturás al exterior, creá otra autorización con wsfex - Facturación Electrónica de Exportación.

    4. Confirmá con "Crear autorización de acceso".

En homologación no hace falta dar de alta puntos de venta: acepta cualquier número.

3.1 Obtener el certificado

  1. Con clave fiscal, entrá a "Administración de Certificados Digitales". Si no aparece, adherilo como en el paso 2.2, buscando ARCA → Servicios interactivos → "Administración de Certificados Digitales".

  2. Elegí tu CUIT y después "Agregar alias".

  3. Poné el alias (solo letras y números), subí el archivo del CSR de producción (certs/afip_prod.csr en la carpeta de datos; ver_csr muestra la ruta) y confirmá con "Agregar alias".

  4. En la lista de alias, tocá "Ver" en la fila de tu alias.

  5. En la pantalla siguiente, tocá "Descargar" en el certificado. Baja un archivo .crt.

  6. Decile a Claude dónde quedó el archivo (por ejemplo, en Descargas): lo guarda guardar_certificado con entorno prod y la ruta, y verifica que corresponda a la clave.

El certificado de producción lo emite "Computadores" de AFIP (el de homologación, "Computadores Test"). ARCA usa como CN el alias que escribiste en la pantalla, aunque el CSR tenga otro.

3.2 Autorizar el certificado para el servicio

  1. Entrá a "Administrador de Relaciones de Clave Fiscal".

  2. Elegí "Nueva Relación".

  3. En "Servicio", tocá "Buscar" y elegí ARCA → WebServices → "Facturación Electrónica" (Facturas A, B y C). No uses la rama "Servicios interactivos": da el error "El servicio debe ser delegable".

  4. En "Representante", tocá "Buscar" (no escribas un CUIT en el campo), marcá "Computador Fiscal" y elegí tu alias en el desplegable.

  5. Confirmá. Si te lo pide, generá e imprimí el formulario F.3283.

Si aparece "El dador de la autorización no debe ser igual al autorizado", en "Representante" quedó tu propio CUIT como persona: tiene que ser el Computador Fiscal (el certificado).

Si también facturás al exterior, creá otra relación igual en Administrador de Relaciones de Clave Fiscal → Nueva Relación, con ARCA → WebServices → "Facturación Electrónica de Exportación" y el mismo Computador Fiscal. ARCA puede tardar unos minutos en aplicar una relación nueva.

3.3 Dar de alta el punto de venta

Se necesita uno por tipo de factura: uno para las Facturas A, B y C y, si facturás al exterior, otro para la Factura E.

  1. Con clave fiscal, entrá a "Administración de puntos de venta y domicilios". Si no aparece, adherilo como en el paso 2.2, buscando ARCA → Servicios interactivos → "Administración de puntos de venta y domicilios".

  2. Se abre "PVE - Gestión de puntos de venta". Elegí tu CUIT y, en el menú principal, "A/B/M de Puntos de venta / emisión".

  3. Vas a ver el listado con las columnas Número, Nombre de Fantasía, Sistema y Baja. Revisá qué números ya usás y cuáles son de web services (el sistema termina en "Web Services").

  4. Tocá "Agregar..." y completá:

    1. Número: uno que no uses.

    2. Nombre de Fantasía: opcional; es el nombre comercial que aparece en tus facturas.

    3. Sistema:

      • Facturas A, B y C, si sos monotributista: "Factura Electrónica - Monotributo - Web Services".

      • Facturas A, B y C, si sos responsable inscripto: "RECE para aplicativo y web services".

      • Factura E: "Comprobantes de Exportación - Web Services".

    4. Domicilio: elegí uno de los domicilios que tenés declarados en ARCA.

  5. Confirmá. El punto de venta nuevo aparece en el listado.

Tené en cuenta:

  • Los sistemas "Factura en Línea" (por ejemplo "Factura en Línea - Monotributo" o "Comprobantes de Exportación - Factura en Línea") son de "Comprobantes en línea" y no sirven para web services.

  • El sistema de un punto de venta no se puede cambiar: si elegiste mal, dalo de baja con "Baja" y creá otro.

  • Cada punto de venta tiene su propia numeración, que empieza en 1.

  • El alta puede tardar unos minutos en verse desde el web service.

Con el ejemplo de la tabla de arriba, un monotributista que factura al exterior y en Argentina termina con algo así:

Número

Sistema

Uso

5

Factura Electrónica - Monotributo - Web Services

Factura C

4

Comprobantes de Exportación - Web Services

Factura E

3.4 Lista de control

Para cada servicio que vayas a usar (wsfe, wsfex o los dos):

  • Certificado de producción guardado con guardar_certificado (paso 3.1).

  • Relación del alias como Computador Fiscal con el servicio (paso 3.2).

  • Punto de venta del sistema "... - Web Services" que corresponde (paso 3.3).

  • probar_conexion en producción muestra el punto de venta y el último número (paso 4).

Paso 4: verificar

Llamá a estado_configuracion (muestra qué falta: CUIT, certificados, perfil) y a probar_conexion para cada entorno (homo y prod) y servicio (wsfe para A, B y C; wsfex para la E).

Son consultas de solo lectura: no emiten nada. Tiene que mostrar el servicio OK, el login en WSAA y, en producción, tu punto de venta con N (no bloqueado) y el último número emitido (0 si es nuevo). Errores frecuentes:

Durante el alta en ARCA:

Mensaje

Qué pasó y qué hacer

El Nombre simbólico del DN sólo puede contener números y/o letras

El alias tiene guiones, espacios o acentos. Usá solo letras y números, y generá el CSR con ese mismo alias.

El dador de la autorización no debe ser igual al autorizado

En "Representante" quedó tu CUIT como persona. Tocá "Buscar", marcá "Computador Fiscal" y elegí el alias.

El servicio debe ser delegable

Elegiste el servicio en "Servicios interactivos". Buscalo en ARCA → WebServices.

Pegaste algo que empieza con BEGIN CERTIFICATE REQUEST como certificado

Eso es el CSR (el pedido). El certificado lo da ARCA: en homologación, el texto que muestra WSASS; en producción, el archivo que bajás con Ver → Descargar.

Al conectarse o emitir:

Error

Qué pasó y qué hacer

Computador no autorizado a acceder al servicio

Falta la autorización del paso 2.4 (homologación) o la relación del paso 3.2 (producción) para ese servicio: wsfe para A, B y C, wsfex para la E.

El CEE ya posee un TA valido para el acceso al WSN solicitado

ARCA ya entregó un ticket de acceso para ese certificado y servicio, y dura 12 horas; no da otro hasta que venza. Pasa si se borra certs/ta_*.json o si otro programa usa el mismo certificado con otra carpeta de datos. Esperá a que venza; no borres esos archivos.

1607: Campo Pto_venta no es valido

El punto de venta no es del sistema "Comprobantes de Exportación - Web Services".

Sin puntos de venta en probar_conexion de producción con wsfe

No hay punto de venta de web services para A, B y C, o todavía no se propagó el alta.

1500 (fecha)

La fecha de emisión está fuera de lo que acepta ARCA: 5 días antes o después de hoy (10 para servicios en A, B y C).

1535 (Factura E) o 10016 (A, B y C): fecha anterior al último comprobante

En cada punto de venta las fechas no pueden retroceder. En homologación suele ser por pruebas viejas: repetí con otro punto_venta_homo.

1674 / 10036: fecha de pago anterior a la emisión

La fecha de pago (o de vencimiento) tiene que ser igual o posterior a la de emisión.

2053: cotización no válida

La cotización tiene que ser la del día anterior a la fecha del comprobante; el servidor ya la pide así.

Aprobada con la observación 10238 (CUIT receptora inexistente)

ARCA emitió la factura igual. En producción hay que anularla con nota de crédito. Revisá el CUIT del receptor antes de emitir.

DH_KEY_TOO_SMALL

El servidor de producción usa una clave Diffie-Hellman de 1024 bits; el servidor ya lo resuelve.

Renovación

Los certificados vencen a los 2 años (estado_configuracion muestra la fecha y cuántos días faltan). Para renovarlos alcanza con pedir un certificado nuevo para el mismo alias y la misma clave: las autorizaciones y relaciones son del alias, así que siguen valiendo.

  • Homologación: en WSASS → "Nuevo Certificado", poné el mismo alias como nombre simbólico del DN, pegá el mismo CSR (ver_csr) y guardá el certificado nuevo con guardar_certificado.

  • Producción: en "Administración de Certificados Digitales", elegí tu CUIT, tocá "Ver" en la fila del alias y después "Agregar certificado"; subí el mismo CSR de producción. En la pantalla del alias vas a ver dos certificados: tocá "Descargar" en el nuevo (el de vencimiento más lejano) y guardalo con guardar_certificado.

Si creés que la clave privada quedó expuesta, no renueves: generá una clave nueva con otro alias y hacé todo el alta de nuevo (certificado, autorizaciones y relaciones).

Desarrollo

uv sync
uv run pytest

Los tests usan un cliente MCP en memoria y ARCA simulada: no salen a la red. Para probar la versión local en Claude Code:

claude mcp add facturador-afip --scope user -e FACTURADOR_AFIP_DIR=~/.facturador-afip -- uv run --directory ~/ruta/al/facturador-afip-mcp facturador-afip-mcp

Publicar una versión

  1. Subí la versión en pyproject.toml, manifest.json y .claude-plugin/plugin.json (tienen que coincidir). La URI de la tarjeta la incluye, así los clientes no muestran una tarjeta vieja desde su caché.

  2. PyPI:

    uv build && uv publish dist/facturador_afip_mcp-<versión>*
  3. Extensión de Claude Desktop y release:

    npx @anthropic-ai/mcpb validate manifest.json && npx @anthropic-ai/mcpb pack . dist/facturador-afip.mcpb
    gh release create v<versión> dist/facturador-afip.mcpb --title "v<versión>" --notes "..."
  4. El plugin sale del commit: el marketplace de este repositorio y el directorio de Claude toman la rama main.

Limitaciones

  • No hay notas de crédito de Factura E.

  • Elicitation funciona con clientes que negocian el protocolo con el handshake initialize (el caso de Claude Code hoy). Con un cliente que use solo el protocolo 2026-07-28, la elicitation falla antes de emitir, así que no se emite nada.

  • La tarjeta depende de que el cliente cumpla la especificación de MCP Apps y no le muestre al modelo las herramientas de la tarjeta. Claude Desktop lo cumple.

  • El diálogo del sistema aparece en la computadora donde corre el servidor. Si le diste a Claude control de la pantalla (computer use), podría responderlo: no le des acceso a osascript ni a los diálogos del sistema.

Privacidad

  • Qué datos usa: tu CUIT y los datos del emisor (.env), tu clave privada y tus certificados de ARCA (certs/), tus preferencias (perfil.json) y los datos de las facturas que emitís, incluidos los de tus clientes.

  • Dónde quedan: todo se guarda en tu carpeta de datos, en tu computadora. El servidor no tiene base de datos propia ni servidores del autor, y no manda telemetría.

  • Con quién se comparte: el servidor solo se conecta con los web services de ARCA (afip.gov.ar) para autenticarse, consultar y emitir comprobantes. La clave privada nunca sale de tu computadora: se usa localmente para firmar el login. Los datos de las facturas que le das a Claude o que devuelven las herramientas pasan por Claude, según la política de privacidad de Anthropic.

  • Cuánto tiempo: los comprobantes, borradores y tickets de acceso quedan en tu carpeta de datos hasta que los borres. Los tickets de ARCA vencen a las 12 horas.

  • Contacto: issues del repositorio.

Licencia

MIT. El software se ofrece tal cual, sin garantías: revisá cada factura antes de confirmar su emisión en producción.

El logo de ARCA que usa el PDF es de ARCA y no está cubierto por esta licencia; se usa solo para que el PDF replique el diseño de "Comprobantes en línea".

Available Tools

21 tools
buscar_codigoBuscar códigos de ARCAA
Read-only

Busca en las tablas de ARCA: código de país destino, CUIT genérico del país del cliente (uno para personas jurídicas y otro para físicas) o código de moneda. Consulta homologación, que tiene las mismas tablas.

ParametersJSON Schema
NameRequiredDescriptionDefault
tablaYes
textoYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description doesn't need to repeat safety. It adds the scope of the search (specific tables) and the ability to query homologation, which is useful behavioral context. It does not disclose output matching behavior or limits, but with annotations covering safety, this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundant wording. The core action and options are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple lookup with an output schema, but the description leaves the 'texto' parameter's format or matching semantics undocumented. It also doesn't state whether the search is exact or partial, which an agent needs to know for correct invocation. Overall it's adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the meaning of the tabla enum by listing country, CUIT-per-country, and currency codes, but it provides no guidance on what 'texto' should contain (e.g., exact code, description, partial match). This is a significant gap for a required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Busca') and resource ('tablas de ARCA'), and enumerates the specific code categories (country code, generic CUIT, currency code). It also notes the homologation environment, which helps distinguish it from emission/configuration siblings. However, it doesn't explicitly contrast with siblings, though none do similar lookups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for looking up reference codes, and the last sentence explicitly mentions the homologation option. It does not name alternative tools or state exclusions, but the sibling set contains no other search tools, so the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancelar_emisionCancelar la emisiónA
Idempotent

Solo para la tarjeta: cancela la confirmación pendiente. No toca ARCA.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYes
borrador_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, indicating a non-destructive, retry-safe mutation. The description adds the specific behavior of canceling a pending confirmation and clarifies that ARCA is not affected, which is valuable context beyond the annotations. No contradictions with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loaded with the core action, and avoids unnecessary detail. Every word earns its place, making it highly concise and structured effectively.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with two parameters and no output schema, the description covers the purpose, scope, and a key side-effect (ARCA untouched). However, it lacks guidance on prerequisites or the exact effect on the draft, and it does not explain the parameters, but given the simplicity, it is mostly complete. A minor gap is the lack of explicit usage alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention the parameters token or borrador_id at all. It relies entirely on the parameter names, which are only slightly self-explanatory. The description adds no meaning beyond the schema, leaving the agent to infer without any guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action (cancels pending confirmation) and a resource (the card), and distinguishes itself from ARCA-related operations. It differentiates from siblings like confirmar_emision by specifying it is 'solo para la tarjeta' and does not touch ARCA.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context ('Solo para la tarjeta') and explicitly notes it does not touch ARCA, which implies when it should be used. However, it does not name specific alternative tools or provide explicit exclusion criteria beyond the card scope, leaving some inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirmar_emisionConfirmar la emisiónB
Destructive

Solo para la tarjeta de confirmación: emite el borrador con el token de un solo uso y el número tipeado.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYes
numeroYes
borrador_idYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a mutating action. The description adds the one-time-use nature of the token and the typed number, which are useful behavioral details. However, it does not disclose what happens to the draft after emission (e.g., deletion, status change) or whether the operation is reversible. With annotations covering the safety profile, the description adds some context but not comprehensive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the usage scope ('Solo para la tarjeta de confirmación') before describing the action, and every word carries meaning. It is appropriately concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with three required parameters and no output schema, the description is too sparse. It does not mention the workflow step beyond the vague 'tarjeta de confirmación', lacks prerequisites, and gives no indication of the response or side effects. An agent would struggle to know when to call it and what to expect, making the definition incomplete for safe usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description is the only source of parameter meaning. It clarifies 'token' as a one-time-use token and 'numero' as the typed number, and 'borrador' implicitly maps to 'borrador_id'. However, it does not provide formats, constraints, or how the parameters relate to the action beyond these hints. It partially compensates for the missing schema descriptions but leaves borrador_id ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'emite el borrador' (issues the draft) with a one-time token and typed number. It also scopes usage to 'Solo para la tarjeta de confirmación' (only for the confirmation card), which hints at a distinct workflow step. However, it doesn't explicitly contrast with sibling tools like 'emitir_en_produccion' or 'cancelar_emision', so it lacks full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Solo para la tarjeta de confirmación', which implies it is used in a specific confirmation scenario, but it does not state when to use this tool versus alternatives, nor does it mention prerequisites, sequence steps, or exclusions. No guidance is provided on when NOT to use it or which sibling to choose instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

descartar_borradorDescartar un borradorA
DestructiveIdempotent

Borra un borrador que no se va a emitir. No afecta nada en ARCA.

ParametersJSON Schema
NameRequiredDescriptionDefault
borrador_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds the contextual detail 'No afecta nada en ARCA' (does not affect anything in ARCA), which clarifies that this operation has no impact on the production system. It does not contradict annotations and provides extra behavioral context beyond what structured fields convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loading the core action in the first sentence and adding a relevant side effect in the second. Every word serves a purpose, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter destructive operation, the description provides sufficient context: it states the action, the condition for use, and the non-effect on ARCA. It does not describe return values or error handling, but given the simplicity and existing annotations (destructive, idempotent), the description is adequately complete for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only 'borrador_id' with no description (0% coverage). The description does not explicitly explain the parameter, but the tool's purpose makes it clear that it is the identifier of the draft to delete. The name itself is descriptive, and the context in the description supports inference, though it lacks details such as expected format or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Borra un borrador que no se va a emitir' (deletes a draft that won't be emitted). It specifies the verb (borra) and resource (borrador), and the phrase 'que no se va a emitir' distinguishes it from emission-related tools. No other sibling performs deletion of drafts, so it is uniquely identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for drafts that won't be emitted ('que no se va a emitir'), but it does not explicitly contrast with alternatives or mention when not to use it. There is no reference to sibling tools like 'listar_borradores' or 'cancelar_emision', so the guidance remains implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

emitir_en_produccionEmitir en producciónA
Destructive

EMITE UN COMPROBANTE FISCAL REAL en ARCA producción. No se puede deshacer: solo se anula con una nota de crédito. Llamala únicamente si el usuario aprobó de forma expresa la emisión de ESTE borrador en este momento, con numero, receptor y total exactamente como los devolvió preparar_emision: si no coinciden con los reales, no se emite. Antes de enviar, una persona confirma (tarjeta en el chat, formulario, permiso o diálogo del sistema); si no confirma, no se emite nada.

ParametersJSON Schema
NameRequiredDescriptionDefault
totalYes
numeroYes
receptorYes
borrador_idYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond the annotations: irreversibility ('No se puede deshacer'), the only remedy (credit note), the requirement of express approval, and the human confirmation gate. This is exactly the kind of safety-critical behavior an agent needs to know and is consistent with destructiveHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and irreversibility, then states the critical preconditions. Every sentence adds essential information; the parenthetical list of confirmation channels is slightly expansive but still useful for an agent deciding whether confirmation has occurred.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, high-stakes tool with no output schema, the description covers purpose, environment, irreversibility, preconditions, and parameter matching. It does not describe the success/error response or post-emission workflow, but those are secondary to the safety-critical guidance it provides.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining that numero, receptor, and total must exactly match the values returned by preparar_emision, and that mismatches prevent emission. It does not define borrador_id explicitly, but the draft context and tool name make it inferable. This is strong compensation for a fully undocumented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('EMITE') with a concrete resource ('COMPROBANTE FISCAL REAL') and environment ('ARCA producción'), clearly distinguishing this from preparation, validation, and confirmation tools. It is immediately obvious that this tool performs the real, irreversible emission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use conditions: only after express user approval of this exact draft, with exact values from preparar_emision, and only after a human confirmation. It also states clear exclusions: if values do not match or confirmation is absent, no emission occurs. This fully routes the agent away from misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estado_configuracionRevisar la configuraciónA
Read-only

Muestra la configuración: carpeta de datos, CUIT, certificados (y cuándo vencen), perfil y cómo se va a pedir la confirmación de emisión. Usala primero si algo falla o si el usuario está configurando.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint=true annotation already declares the safety profile, and the description's 'Muestra' verb is fully consistent with it. The description adds value beyond the annotation by specifying exactly what configuration data is exposed (including certificate expiry), which is useful context for an agent deciding whether to call this before a risky emission action. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero waste. The first sentence front-loads the informational content, and the second delivers the usage rule. Every word earns its place; no fluff or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a zero-parameter, read-only diagnostic tool whose safety profile is already carried by annotations. The description covers what it shows and when to call it; the absence of an output schema is acceptable for a status/display tool, so nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is empty, so the baseline of 4 applies. There is nothing to document, and the description correctly avoids inventing parameter details that don't exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Muestra la configuración') and enumerates the concrete contents it reveals: data folder, CUIT, certificates with expiration dates, profile, and issuance-confirmation method. This clearly distinguishes it from siblings like ver_perfil (profile only), ver_csr (certificate only), and probar_conexion (connectivity test), so an agent can disambiguate at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Usala primero si algo falla o si el usuario está configurando' — positioning it as the first diagnostic step on failure or during setup. It does not name specific alternatives or state when not to use it, but the use conditions are concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estado_confirmacionEstado de la confirmaciónC
Read-only

Solo para la tarjeta: si la confirmación sigue pendiente (con el resumen y un token para esta apertura), o si se canceló, venció o ya se emitió.

ParametersJSON Schema
NameRequiredDescriptionDefault
borrador_idYes

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and openWorldHint=false. The description adds value by enumerating the finite set of statuses (pending, cancelled, expired, issued), which complements the closed-world annotation. It does not contradict the annotations. However, it doesn't disclose the return format or explain the 'tarjeta' context, leaving the behavioral picture incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence, which is appropriately sized. However, the sentence is convoluted, front-loading the ambiguous 'Solo para la tarjeta' before the actual status list, which reads as confusing rather than efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a status-check tool with no output schema and an undocumented parameter, the description leaves critical gaps: what 'la tarjeta' refers to, the meaning and format of borrador_id, and the return shape. An agent cannot reliably invoke this tool correctly without additional context, especially given the cryptic domain terminology.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden of explaining borrador_id, yet it never mentions the parameter at all. The phrase 'un token para esta apertura' is oblique and does not clearly map to borrador_id. An agent has no way to understand what value to pass or how it relates to the confirmation status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool reports the confirmation status by enumerating the possible outcomes (pending with summary and token, cancelled, expired, or already issued). This does distinguish it from the sibling 'estado_configuracion' (configuration status). However, 'Solo para la tarjeta' (only for the card) is ambiguous — it never clarifies what 'the card' refers to in this domain, and the run-on phrasing obscures the core purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no explicit guidance on when to use this tool versus siblings like confirmar_emision, cancelar_emision, or preparar_emision. The only hint is the opening 'Solo para la tarjeta,' which is a scope restriction but is unexplained and gives no actionable condition for selection, and no alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generar_pdfGenerar el PDFA
Idempotent

Regenera el PDF de un comprobante guardado, con el diseño de "Comprobantes en línea". No toca ARCA.

ParametersJSON Schema
NameRequiredDescriptionDefault
archivoYes
entornoNoprod

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already supply idempotent/non-destructive behavior. The description adds a meaningful external boundary—'No toca ARCA'—which is not derivable from annotations and tells the agent this operation has no tax-authority side effects. It doesn't describe the output or overwrite behavior, but the annotation safety profile lowers the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and resource, with 'No toca ARCA' as a high-value one-line caveat. No filler or repetition of schema titles.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with idempotent/non-destructive annotations, the core purpose and side-effect boundary are clear. But with no output schema, the description doesn't say what the tool returns, and the unexplained 'archivo' parameter means an agent still has to guess a key part of the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never explains 'archivo' or 'entorno'. 'Archivo' is especially ambiguous (file path? comprobante ID?), and while the enum gives controlled values for 'entorno', its effect on the operation is unspecified. The phrase 'de un comprobante guardado' gives only a loose hint about the required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific action 'Regenera' and the object 'PDF de un comprobante guardado', and names the exact design ('Comprobantes en línea'). The closing 'No toca ARCA' separates it from ARCA-focused sibling tools, so there is no ambiguity about what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: regenerate a PDF for an already-saved comprobante, without touching ARCA, so the agent can infer it is for PDF re-generation rather than emission, cancellation, or ARCA setup. It does not name a sibling alternative or list explicit when-not conditions, which keeps it a point below the strongest definitions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

guardar_certificadoGuardar un certificado de ARCAA
Idempotent

Guarda el certificado que dio ARCA, después de verificar que sea un certificado (no el CSR), del entorno correcto y que corresponda a la clave de esta carpeta. Homologación: certificado con el texto que muestra WSASS (desde -----BEGIN CERTIFICATE-----). Producción: ruta al .crt descargado (ej. ~/Downloads/xxx.crt).

ParametersJSON Schema
NameRequiredDescriptionDefault
rutaNo
entornoYes
certificadoNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover idempotentHint=true and destructiveHint=false, so the description correctly adds behavioral context: it verifies the certificate is not a CSR, checks the environment, and ensures it corresponds to the key before saving. This is valuable beyond annotations, though it doesn't describe failure behavior, which is acceptable given the safe profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence with a colon separating the main action and verification from environment-specific instructions. It is front-loaded with the purpose and contains no filler, making it efficient and perfectly sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers everything an agent needs to call the tool correctly: the verification prerequisites, the required `entorno`, and which optional parameter to use in each case. With no output schema and safe annotations, no critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates: it explains `certificado` for homologación (text from WSASS, from -----BEGIN CERTIFICATE-----) and `ruta` for producción (path to .crt). It also implies `entorno` values via the Homologación/Producción mapping. No parameter meaning is left ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the exact purpose: 'Guarda el certificado que dio ARCA' (saves the certificate given by ARCA), and distinguishes it from CSR handling ('no el CSR') and clarifies it is for the correct environment and key. This clearly separates it from siblings like ver_csr (view CSR) and guardar_perfil (save profile), so an agent can identify when to use it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage instructions: for homologación use the `certificado` parameter, for producción use `ruta`, and only after verifying it is a certificate (not a CSR) and matches the key. This gives clear when-to-use and when-not-to-use guidance, and implies alternatives (e.g., not for CSR).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

guardar_perfilGuardar el perfilA
Idempotent

Actualiza perfil.json con los campos que se pasen (el resto queda como está). Campos: nombre (cómo dirigirse a la persona), condicion_iva_emisor ("monotributo" o "responsable_inscripto"), punto_venta_prod (Factura E), punto_venta_prod_comunes (A, B y C; null si no tiene), drive_folder_id, formato {un_solo_item, descripcion, idioma (1 español, 2 inglés), forma_pago}, fechas {emision: "ultimo_dia_mes_trabajado" | "hoy", pago: "primer_dia_habil_mes_siguiente" | "igual_emision"}, cliente_por_defecto {alias, pais_destino, cliente {nombre, cuit_pais, id_impositivo, domicilio}, moneda, notas}.

ParametersJSON Schema
NameRequiredDescriptionDefault
perfilYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is non-read-only, idempotent, and non-destructive. The description adds meaningful behavior beyond annotations by specifying partial-update semantics: passed fields are updated and 'el resto queda como está'. This clarifies the merge behavior without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded in the first clause, and the field enumeration is dense but organized through nested braces. It is long because it documents a complex object, though line breaks or a list format would improve readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the opaque schema, nested objects, and lack of output schema, the description is remarkably complete: every field, nested subfield, and allowed value is specified. An agent has enough information to construct a valid perfil object without opening other references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides almost no information: perfil is just an object with additionalProperties true and 0% schema coverage. The description fully compensates by listing all accepted keys, nested object structures, allowed enum values, and even null semantics for punto_venta_prod_comunes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Actualiza perfil.json con los campos que se pasen'. It clearly distinguishes this write/update operation from sibling read tools like ver_perfil, and it enumerates the exact fields involved.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: it is the tool for persisting profile settings. However, it does not explicitly state when to use it versus alternatives, nor does it provide any exclusions or prerequisites beyond the partial-update behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

guia_alta_arcaGuía de alta en ARCAA
Read-only

Guía paso a paso del alta en ARCA y tabla de errores. Sin sección, la guía completa. Secciones: introduccion, paso1 (clave y CSR), homologacion (WSASS), produccion_certificado, produccion_autorizacion (Administrador de Relaciones), punto_de_venta, lista_de_control, verificar_y_errores, renovacion.

ParametersJSON Schema
NameRequiredDescriptionDefault
seccionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only and non-open-world, and the description adds behavior beyond that: omitting 'seccion' returns the complete guide while named sections return that part. Nothing about the description contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the purpose appears first, and the parameter behavior follows in one short sentence. A minor clarity improvement would be to phrase the default behavior as a complete sentence, but it remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter reference tool with an output schema and read-only annotations, the description covers the necessary selection behavior and section inventory. It does not detail each section's contents, but that is not required for the agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description compensates by listing all section values and defining the null case ('Sin sección, la guía completa'). It adds useful labels such as 'paso1 (clave y CSR)' and 'homologacion (WSASS)' that the enum alone would not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource ('alta en ARCA') and the deliverable (step-by-step guide plus error table), which is clear even though it lacks a strong verb. It does not explicitly differentiate from the operational sibling tools, but the reference nature is evident from 'Guía'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the main usage decision: 'Sin sección, la guía completa' and enumerates the selectable sections. It does not discuss when to prefer this over sibling tools, but for a documentation tool the context is clear and no exclusion is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iniciar_configuracionIniciar la configuraciónA
Idempotent

Paso 1 del alta: crea la carpeta de datos, guarda el CUIT y los datos del emisor, y genera en esta computadora la clave privada y el pedido de certificado (CSR) de cada entorno. Devuelve los CSR (son públicos) para llevarlos a ARCA; la clave privada nunca se devuelve. Nunca pisa una clave existente. Se puede volver a llamar con el mismo CUIT para completar datos del emisor.

  • nombre: nombre o razón social, como figura en ARCA.

  • alias: nombre del certificado, solo letras y números (ej. facturador1a2b3c).

  • condicion_iva: como va impresa en el PDF (ej. "Responsable Monotributo", "IVA Responsable Inscripto").

  • ingresos_brutos: número o "Exento". inicio_actividades: AAAA-MM-DD.

ParametersJSON Schema
NameRequiredDescriptionDefault
cuitYes
aliasYes
nombreYes
razon_socialNo
condicion_ivaNo
ingresos_brutosNo
inicio_actividadesNo
domicilio_comercialNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotentHint=true annotation, it discloses that an existing key is never overwritten, that the private key is never returned, and that the returned CSRs are public. This is valuable non-obvious behavior an agent needs to set expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main behavior is front-loaded and the parameter bullets are compact and useful. The final bullet loses a line break and the text is denser than needed, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a side-effectful setup tool with no output schema, it adequately describes the generated artifacts, their return, and idempotent retry behavior. Missing output details (e.g., what else the response includes or what happens if a key already exists) prevent a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description compensates by giving real-world meaning and formats for nombre, alias, condicion_iva, ingresos_brutos, and inicio_actividades. It falls short on cuit format and omits domicilio_comercial, and it slightly conflates nombre with razon_social despite both existing in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Paso 1 del alta') and concrete effects: crea carpeta de datos, guarda CUIT/datos del emisor, genera clave privada y CSR. It differentiates from sibling tools by being the initialization step and by referencing the CSR that later steps like ver_csr/guardar_certificado handle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly frames when to call it ('Paso 1 del alta') and states that it can be re-invoked with the same CUIT to complete emitter data. It doesn't list exclusions or name alternative tools, but the first-step context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listar_borradoresListar borradoresA
Read-only

Borradores validados en homologación y su estado: validado, emitiendo o emitido.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds that the tool returns drafts from homologation with specific statuses (validado, emitiendo, emitido), which is useful context. However, it doesn't mention ordering, pagination, or other behavioral details, though the output schema likely covers the return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that conveys the core purpose and scope without fluff. It is front-loaded with the primary action and context, making it easy for an agent to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, output schema present), the description is nearly complete. It specifies the resource (drafts validated in homologation) and the returned status values. It doesn't mention any limitations or edge cases, but this is acceptable for a straightforward read-only list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so schema coverage is trivially 100%. Per the baseline for no parameters, the description need not add parameter details, and it doesn't. The description adds no parameter-related information because none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists drafts ('borradores') that have been validated in homologation and shows their status. It is specific about the resource and action, and the term 'borradores' distinguishes it from sibling tools like listar_comprobantes, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus other list tools or under what circumstances. The description only states what it does, not when it should be chosen or which scenarios it is not suitable for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listar_comprobantesListar comprobantesA
Read-only

Comprobantes guardados en la carpeta de datos, del más nuevo al más viejo. buscar filtra por texto (nombre del cliente, archivo, fecha).

ParametersJSON Schema
NameRequiredDescriptionDefault
buscarNo
limiteNo
entornoNoprod

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is covered. The description adds valuable context by stating the data source (carpeta de datos) and ordering (newest to oldest), which are not present in annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the core purpose and ordering, the second explains the filter parameter. It is front-loaded and compact, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the description does not explain the meaning or defaults of `limite` and `entorno`, which are essential for an agent to call the tool correctly. It only covers `buscar`, leaving significant context missing for a list endpoint with multiple options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that `buscar` filters by text and lists searchable fields, but it leaves `limite` (limit) and `entorno` (environment) entirely undocumented. For a tool with 3 parameters and zero schema descriptions, this is only partial coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (comprobantes guardados en la carpeta de datos) and the order (del más nuevo al más viejo), which distinguishes it from siblings like ultimo_comprobante (single record) and listar_borradores (drafts). The verb 'listar' in the title reinforces the action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a specific use case for the `buscar` parameter (filter by client name, file, date), but does not explicitly state when to choose this tool over alternatives like ver_comprobante or ultimo_comprobante. The intended usage is implied rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preparar_emisionPreparar la emisiónA
Read-only

Arma la emisión en producción de un borrador SIN emitir: devuelve el número de comprobante, el receptor, el total y la cotización reales, para mostrárselos al usuario antes de pedirle la aprobación. Solo lee de ARCA.

ParametersJSON Schema
NameRequiredDescriptionDefault
borrador_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description's 'Solo lee de ARCA' reinforces this and adds specificity about what is read. It also discloses that it returns specific fields and that it is a non-destructive preparation step, providing context beyond the annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the purpose and return values, with no redundant information. Every sentence contributes to understanding what the tool does and when to use it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers the essential context: it is for production, works on a draft, returns preview data, and is read-only. It lacks mention of error conditions (e.g., invalid draft) or the exact format of returned data, but these are minor given the clarity of the purpose and the data fields listed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain the single parameter borrador_id. It indirectly does so by saying 'de un borrador SIN emitir', indicating it is the ID of a draft. However, it does not provide additional details like format, required attributes, or how to obtain the ID, relying on the schema's title 'Borrador Id'. It adds some context but not sufficient to fully compensate for the lack of schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: preparing an emission from a draft without emitting, and specifies exactly what it returns (voucher number, recipient, total, exchange rate) for user approval. It distinguishes itself from siblings like emitir_en_produccion (which emits) and confirmar_emision (which confirms) by explicitly noting it does not emit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use this tool: before asking the user for approval, to show real data from a draft. While it doesn't name alternatives explicitly, the workflow context with siblings (emitir_en_produccion, confirmar_emision) implies it is the preliminary step. It could be improved by explicitly stating 'use this instead of emitir_en_produccion when you need to preview before emitting', but the purpose is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

probar_conexionProbar la conexión con ARCAA
Read-only

Prueba de solo lectura: estado del servicio, login y puntos de venta. wsfe: A, B y C; wsfex: Factura E.

ParametersJSON Schema
NameRequiredDescriptionDefault
entornoYes
servicioYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with the readOnlyHint and adds detail about what is tested (service status, login, points of sale). It also specifies the invoice types per service, which is extra context beyond the annotations. However, it doesn't mention other potential behaviors like rate limits or error handling, but for a simple read-only test that's acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence, front-loaded with the read-only nature, and efficiently packs the service details. No fluff or redundant information. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (2 parameters, no output schema), the description covers the core purpose and service details. It doesn't describe the return format, but for a test tool that's likely just a status result. The environment parameter is a gap, but overall it's complete enough for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides enums for both parameters, but description coverage is 0%. The description explains the services (wsfe, wsfex) and their invoice types, which adds meaning for 'servicio'. However, it doesn't explain the 'entorno' parameter (homo vs prod) at all, so the semantics are incomplete. The agent knows the enum values but not their implications (e.g., homologation vs production environment).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it's a read-only test of service status, login, and points of sale, and specifies the invoice types for each service (wsfe: A, B, C; wsfex: Factura E). This distinguishes it from sibling tools that handle emission, confirmation, cancellation, etc. The purpose is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies it's a connectivity test but doesn't explicitly state when to use it versus alternatives. There is no exclusion or condition for when to use this tool instead of others, nor any mention of prerequisites. The read-only nature is clear, but no scenario guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ultimo_comprobanteÚltimo comprobante autorizadoB
Read-only

Último número autorizado por ARCA para un tipo de comprobante y punto de venta (por defecto, el del perfil en producción o el primero activo).

ParametersJSON Schema
NameRequiredDescriptionDefault
tipoYes
entornoYes
punto_ventaNo
nota_creditoNo

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint and openWorldHint, and the description adds useful behavior beyond them: the number is obtained from ARCA, and an omitted point of sale defaults to the production profile's point of sale or the first active one. This default-selection behavior is not present in the annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact sentence with no filler or repetition. The main object is front-loaded, and the default-selection caveat is placed in a parenthetical where it does not distract. It is concise but slightly terse for a tool with four parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only query, the description plus schema and annotations is mostly adequate: safety is covered, allowed inputs are enums, and the point-of-sale default is explained. However, there is no output schema and no guidance on the nota_credito parameter or the intended workflow, leaving some gaps for an agent selecting and invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate, but it only alludes to 'tipo de comprobante' and 'punto de venta'. It does not explain the meaning of 'entorno' beyond indirectly mentioning production, and it never explains the nota_credito boolean. The schema provides allowed values, but parameter semantics remain under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource: the last ARCA-authorized voucher number for a given comprobante type and point of sale. This distinguishes it from listar_comprobantes and ver_comprobante, which return lists or individual documents. It loses one point because it lacks an explicit verb like 'obtener' or 'consultar' and the title/description are very close.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool instead of listar_comprobantes, ver_comprobante, or before calling emitir_en_produccion. There are no exclusions, workflow cues, or alternative tool mentions. The intended usage is left entirely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validar_en_homologacionValidar en homologaciónA

Valida la factura emitiéndola en homologación (sin valor fiscal) y, si ARCA la aprueba sin observaciones, crea un borrador listo para producción. Llamala solo después de que el usuario confirmó los datos. factura tiene el formato descripto en las instrucciones del servidor. punto_venta_homo sirve para esquivar el error de fechas de pruebas anteriores.

ParametersJSON Schema
NameRequiredDescriptionDefault
facturaYes
punto_venta_homoNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds that it emits in homologation without fiscal value, conditionally creates a draft, and mentions a workaround for test dates. This provides behavioral context beyond annotations, such as the conditional draft creation and the non-idempotent nature implied by the action. No contradiction found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences long, each carrying value: the action and outcome, the usage condition, and parameter hints. It is concise and front-loaded, with no redundant information. It could be slightly more structured, but it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a mutation with conditional behavior, no output schema, and a nested parameter. The description explains the action and the conditional outcome (creates draft if approved) but does not specify what the tool returns, what happens if not approved, or how to interpret the result. It also lacks details on error handling and prerequisites beyond user confirmation. For a tool with this complexity, the description is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate. It states that `factura` follows the format described in server instructions (a pointer rather than a full explanation) and explains that `punto_venta_homo` is for avoiding previous test date errors. This gives some meaning but does not detail the structure of the nested factura object, leaving gaps for an agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool validates an invoice by emitting it in homologation (test environment, no fiscal value) and conditionally creates a draft for production if ARCA approves without observations. It uses a specific verb (valida) and resource (factura) and distinguishes from siblings like emitir_en_produccion by specifying the homologation context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs to call only after the user has confirmed the data, providing a clear when-to-use condition. It also explains the purpose of punto_venta_homo for avoiding date errors from previous tests. However, it does not explicitly mention alternatives or when not to use it, though the sibling context implies this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ver_comprobanteVer un comprobanteA
Read-only

JSON completo de un comprobante guardado (campo "factura": los datos originales, para reutilizarlos o para armar una nota de crédito).

ParametersJSON Schema
NameRequiredDescriptionDefault
archivoYes
entornoNoprod

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses the return behavior: a complete JSON representation of a saved comprobante, with the 'factura' field carrying the original data. This is useful context for an agent deciding whether the output is sufficient. It does not detail error cases or response shape beyond JSON, but for a simple read tool the disclosure is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads the core output ('JSON completo de un comprobante guardado') and then clarifies the 'factura' field's purpose. There is no filler or redundant restating of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description does explain the main return value and its purpose. However, it omits clarification of the required 'archivo' parameter and the surrounding retrieval context. The definition is minimally viable but leaves an agent guessing about how to identify the target comprobante.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coveragehola, and the description does not explain 'archivo' or 'entorno' at all. An agent must infer that 'archivo' is the identifier/path of the saved comprobante and that 'entorno' switches between homologation and production. The description adds no parameter-level meaning, leaving a significant ambiguity gap for a required argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the complete JSON of a saved comprobantelands, including the original data in the 'factura' field des. It is distinct from siblings like listar_comprobantes or generar_pdf because it focuses on retrieving the full stored record for reuse or credit-note construction. However, it does not explicitly name or contrast against sibling alternatives, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit use cases: reusing the original data or building a credit note from it. This tells an agent when the tool is appropriate. It does not mention when not to use it or point to alternatives, so it lacks the exclusionary guidance needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ver_csrVer el pedido de certificado (CSR)A
Read-only

El CSR de un entorno (texto, ruta del archivo y alias): el de homologación se pega en WSASS; el de producción se sube como archivo en Administración de Certificados Digitales. Es público.

ParametersJSON Schema
NameRequiredDescriptionDefault
entornoYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds that the CSR 'Es público' (is public), reinforcing that no sensitive data is involved. It also clues the agent into the expected payload shape (texto, ruta del archivo y alias) without contradicting the read-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and each clause carries distinct information: output components, environment-specific usage, and publicness. The colon-and-semicolon structure is slightly awkward but no content is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-enum, read-only tool with no output schema, the description supplies the necessary scope, environment variants, and a hint at the return fields. It does not explicitly state 'returns', but the title and parenthetical make the behavior clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate for the undocumented 'entorno' parameter. It does so by mapping the two values to 'homologación' and 'producción', so an agent can infer that 'homo' and 'prod' select the environment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title 'Ver el pedido de certificado (CSR)' names the action (view) and the resource (certificate request/CSR), and the description narrows the scope to 'un entorno' with homologación/producción variants. It is clear that this is a retrieval tool for CSR data, though the description itself is a noun phrase and does not state the verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives downstream context: the homologación CSR is pasted into WSASS and the producción CSR is uploaded as a file in Digital Certificates Administration. It does not explicitly say when to choose this tool over siblings or when not to use it, so the usage guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ver_perfilVer el perfilA
Read-only

Devuelve perfil.json: nombre, puntos de venta de producción, condición frente al IVA, cliente por defecto, formato y reglas de fechas.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds the specific content of the return (fields), which is useful for an agent. It does not disclose any additional behavioral aspects like authentication requirements or error conditions, but given the simple read operation and existing annotations, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, compact sentence that front-loads the action and resource. It lists all the returned fields without redundancy, making it highly efficient and easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description is the sole source of return information. It covers all the relevant fields (including date rules) so an agent knows exactly what to expect. For a parameterless, read-only tool, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and the schema coverage is 100% (trivially). The description correctly implies no arguments are needed and does not introduce confusion. The baseline for 0-parameter tools is 4, and the description maintains that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb 'Devuelve' (returns) and the specific resource 'perfil.json', and enumerates the exact fields returned (nombre, puntos de venta, condición IVA, cliente, formato, reglas de fechas). This clearly distinguishes it from the sibling 'guardar_perfil', which is the write counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose is immediately clear from the name and description—it retrieves the profile. However, it does not explicitly state when not to use it or contrast with the alternative 'guardar_perfil'. The context is unambiguous enough that no further guidance is necessary, but explicit routing would be ideal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 21 tool updatesv0.2.0
    • First observedbuscar_codigo
    • First observedcancelar_emision
    • First observedconfirmar_emision
    • First observeddescartar_borrador
    • First observedemitir_en_produccion
    • First observedestado_configuracion
    • First observedestado_confirmacion
    • First observedgenerar_pdf
    • First observedguardar_certificado
    • First observedguardar_perfil
    • First observedguia_alta_arca
    • First observediniciar_configuracion
    • First observedlistar_borradores
    • First observedlistar_comprobantes
    • First observedpreparar_emision
    • First observedprobar_conexion
    • First observedultimo_comprobante
    • First observedvalidar_en_homologacion
    • First observedver_comprobante
    • First observedver_csr
    • First observedver_perfil

TDQS

B3.4/5.0

Scored across 21 tools

Disambiguation3/5

Most tools map to a distinct resource/action, and the descriptions carefully fence off the confirmation-card tools. However, estado_configuracion and ver_perfil overlap on profile/config data, and both emitir_en_produccion and confirmar_emision trigger emission, so an agent could misselect without reading closely.

Naming Consistency4/5

The set overwhelmingly follows a Spanish snake_case verb_noun pattern (ver_perfil, guardar_certificado, listar_borradores). A few noun-led exceptions (estado_confirmacion, estado_configuracion, ultimo_comprobante, guia_alta_arca) are noticeable but do not make the scheme unpredictable.

Tool Count3/5

21 tools is within the 16–25 range that feels heavy for an agent surface. Most tools earn their place given the complex AFIP setup/emission workflow, but three confirmation-card-only tools (confirmar_emision, estado_confirmacion, cancelar_emision) are implementation details that could probably be folded into fewer tools.

Completeness4/5

The server covers the full lifecycle: onboarding/certificates, profile/config, homologation validation, production emission, saved comprobantes, PDF generation, and draft management. The main gap is that cancellation is only mentioned as a credit-note workflow rather than exposed as a first-class tool, though existing tools can likely support it via the factura object.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Argentine electronic invoicing (facturación electrónica) MCP Server for ARCA/AFIP. Emit invoices, manage credentials, check delegations, and look up taxpayers. 10 tools.
    12
    378 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for automating AFIP/ARCA electronic invoicing, certificate management, and Web Service authorization in Argentina.
    169 npm
    23
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Hosted MCP server for Argentine commerce: real AFIP/ARCA fiscal invoicing (live CAE), MercadoPago payments, logistics, catalog, cash register and WhatsApp behind one authenticated endpoint. Includes 9 no-auth fiscal validation/formatting tools.
    MIT