ArcaMCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ArcaMCPgenerate an electronic invoice for $10,000"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ARCA MCP (Model Context Protocol) para AFIP/ARCA
Este proyecto implementa un servidor MCP (Model Context Protocol) orientado a integrarse con AFIP (Argentina) y automatizar tareas claves del flujo de facturación electrónica y consulta de padrones. Aprovecha la SDK oficial de AFIP (@afipsdk/afip.js) y automatizaciones para:
Generar y gestionar certificados X.509 (dev y producción).
Autorizar Web Services (ej.
wsfe,ws_sr_padron_a13).Interactuar con servicios AFIP para emisión y consulta de comprobantes.
Estandarizar configuraciones, variables de entorno y rutas de certificados.
Además, el paquete incluye los comandos arcamcp setup y arcamcp doctor, que automatizan y diagnostican el onboarding en AFIP, reduciendo tiempos de configuración y posibles errores manuales.
Requisitos
Node.js 20 o superior
pnpm (la versión canónica la define el campo
packageManagerdepackage.json)Acceso a tu CUIT y a tu cuenta de AFIP
Clave Fiscal nivel 3 o superior
(Opcional pero recomendado) Git para clonar el repositorio
Related MCP server: Invoicetronic MCP Server
Instalación rápida
No necesitás clonar el repositorio ni instalar el paquete globalmente. Con Node.js 20 o superior, Clave Fiscal nivel 3 y un access token de afipsdk.com:
# 1. Crear el certificado, autorizar wsfe y ws_sr_padron_a13 y generar .env
# (usá --prod para producción; pide por terminal lo que falte)
npx -y @yoryoboy/arcamcp@latest setup --dev
# 2. Verificar que todo quedó bien (no modifica nada)
npx -y @yoryoboy/arcamcp@latest doctor
# 3. Iniciar el servidor MCP (normalmente lo hace tu cliente MCP)
npx -y @yoryoboy/arcamcp@latestsetup imprime al final el bloque JSON listo para pegar en tu cliente MCP. Si
preferís configurar todo a mano, mirá la sección
Configuración. El servidor también carga un archivo .env
desde el directorio donde ejecutás el comando. Detalle de los comandos en
Comandos de línea de comandos.
Para desarrollar el proyecto localmente:
Cloná el repositorio y entrá en su directorio.
Ejecutá
pnpm install.Ejecutá
pnpm run dev setup --devo creá el archivo.enva mano, y verificá conpnpm run dev doctor.Iniciá el servidor con
pnpm run devo el Inspector conpnpm run inspector.
Configuración (.env)
El archivo src/config.ts lee las siguientes variables de entorno:
AFIP_CUIT(obligatorio): CUIT del contribuyente.AFIP_PASSWORD(solo para automatizaciones): clave fiscal usada por las automatizaciones de certificados y autorización.AFIP_CERT_ALIAS(solo para automatizaciones): alias que usarán las automatizaciones de certificados.AFIP_DEV_CERT_PATH(obligatorio conAFIP_PRODUCTION=false): ruta absoluta o relativa al certificado.crtde desarrollo.AFIP_DEV_KEY_PATH(obligatorio conAFIP_PRODUCTION=false): ruta al.keyde desarrollo.AFIP_PROD_CERT_PATH(obligatorio conAFIP_PRODUCTION=true): ruta al certificado.crtde producción.AFIP_PROD_KEY_PATH(obligatorio conAFIP_PRODUCTION=true): ruta al.keyde producción.AFIP_PRODUCTION:truepara producción,falsepara homologación/dev.AFIP_SDK_ACCESS_TOKEN(obligatorio en producción): token de acceso de la SDK si corresponde.
Ejemplo de .env (plantilla):
# Identidad
AFIP_CUIT=20123456789
AFIP_PASSWORD=tu_password_afip
AFIP_CERT_ALIAS=mi-cert-prod
# Certificados (ajusta rutas según tu entorno)
AFIP_DEV_CERT_PATH=./certs/dev/dev_certificado.crt
AFIP_DEV_KEY_PATH=./certs/dev/dev_private.key
AFIP_PROD_CERT_PATH=./certs/prod/prod_certificado.crt
AFIP_PROD_KEY_PATH=./certs/prod/prod_private.key
# Modo
AFIP_PRODUCTION=false
# SDK (requerido cuando AFIP_PRODUCTION=true)
AFIP_SDK_ACCESS_TOKEN=Notas:
Verifica las rutas de certificados: el código los lee con
fs.readFileSync(...)ensrc/services/afip/client.ts.Si
AFIP_PRODUCTION=true, deben existirAFIP_PROD_CERT_PATH,AFIP_PROD_KEY_PATHy, si aplica,AFIP_SDK_ACCESS_TOKEN.
Estructura del proyecto
src/config.ts: carga.envy expone configuración.src/services/afip/client.ts: inicializa el cliente de@afipsdk/afip.jscon certificados y CUIT.src/index.ts: punto de entrada del binarcamcp(servidor MCP o comandossetup/doctor).src/server.ts: registra tools y prompts e inicia el servidor MCP por stdio.src/cli/: comandossetup(certificado + autorización de servicios +.env) ydoctor.certs/: carpeta sugerida para ubicar certificados (./certs/devy./certs/prod).
Pasos para usar el MCP (guía completa)
A continuación se detalla, punto por punto, el flujo recomendado. Puedes ejecutar estos pasos desde Windows PowerShell o CMD.
1) Obtener Clave Fiscal nivel 3
AFIP requiere Clave Fiscal 3 para operar con Web Services. Guía oficial:
Asegúrate de completar este paso antes de continuar.
2) Obtener API Key/Access Token de la SDK de AFIP
Este MCP utiliza automatizaciones provistas por la SDK de AFIP para simplificar tareas como: generación de certificados, autorización de servicios y recuperación de comprobantes.
Sitio: https://afipsdk.com/
Si tu flujo de automatización requiere AFIP_SDK_ACCESS_TOKEN, colócalo en .env para producción.
3) Obtener el certificado y autorizar los Web Services (automatizado)
Desde el directorio donde querés guardar los certificados y el .env, ejecutá:
# Homologación (por defecto si AFIP_PRODUCTION no es "true")
npx -y @yoryoboy/arcamcp@latest setup --dev
# Producción
npx -y @yoryoboy/arcamcp@latest setup --prodsetup:
Toma
AFIP_CUIT,AFIP_CERT_ALIAS,AFIP_SDK_ACCESS_TOKENyAFIP_PASSWORDdel entorno o de.env. Si falta alguno y estás en una terminal, lo pide; el token y la clave fiscal se piden sin eco.Crea el certificado con la automatización
create-cert-devocreate-cert-prody lo guarda en./certs/dev/o./certs/prod/(<env>_certificado.crty<env>_private.key, esta última con permisos600).Crea o actualiza
.envconAFIP_CUIT,AFIP_CERT_ALIAS,AFIP_SDK_ACCESS_TOKENy las rutas absolutasAFIP_<DEV|PROD>_CERT_PATH/AFIP_<DEV|PROD>_KEY_PATH, conservando el resto de las líneas. Solo agregaAFIP_PRODUCTIONsi no existe. La clave fiscal nunca se guarda.Autoriza
wsfeyws_sr_padron_a13conauth-web-service-devoauth-web-service-prod.Imprime el bloque JSON listo para pegar en la configuración de tu cliente MCP.
Si ya existe un certificado en ./certs/<env>/, setup no hace nada y termina con error antes de contactar a ARCA. Usá --force para crear uno nuevo y reemplazarlo.
Nota: el servidor carga
.envdesde su directorio de trabajo. Si tu cliente MCP lo inicia desde otro directorio, copiá las variables al bloqueenvdel cliente (el que imprimesetup).
4) Verificar la configuración
npx -y @yoryoboy/arcamcp@latest doctordoctor no modifica nada. Revisa las variables del ambiente activo, que los archivos de certificado y clave existan, que el certificado sea válido y no esté vencido, y que la clave corresponda al certificado. Si todo eso está bien, consulta a ARCA que wsfe esté autorizado y, en producción, también el padrón A13 y los puntos de venta. Termina con código 0 si no hay errores (✖) y 1 si los hay.
5) Dar de alta un Punto de Venta para Facturación Electrónica
Sigue esta guía (referencia externa) para dar de alta el PDV que usarás con wsfe:
Asegúrate de asociar correctamente el PDV al servicio de facturación electrónica.
Ejecución del servidor MCP
Uso con npx
Para ejecutar la versión publicada sin clonar el repositorio ni instalarla globalmente:
npx -y @yoryoboy/arcamcp@latest-y permite que npx descargue el paquete sin pedir confirmación, algo
necesario cuando un cliente MCP inicia el proceso sin una terminal interactiva.
El tag latest mantiene el cliente en la última versión estable publicada.
Configurá las variables de entorno requeridas antes de ejecutarlo. El servidor
carga .env desde el directorio de trabajo actual.
Ejemplo de configuración de un cliente MCP:
{
"arca-mcp": {
"command": "npx",
"args": ["-y", "@yoryoboy/arcamcp@latest"],
"env": {
"AFIP_CUIT": "20123456789",
"AFIP_PASSWORD": "tu_password_afip",
"AFIP_CERT_ALIAS": "mi-cert-prod",
"AFIP_DEV_CERT_PATH": "/ruta/local/dev.crt",
"AFIP_DEV_KEY_PATH": "/ruta/local/dev.key",
"AFIP_PROD_CERT_PATH": "/ruta/local/prod.crt",
"AFIP_PROD_KEY_PATH": "/ruta/local/prod.key",
"AFIP_PRODUCTION": "false",
"AFIP_SDK_ACCESS_TOKEN": ""
}
}
}No incluyas credenciales, tokens, certificados ni claves privadas en archivos del proyecto o en repositorios públicos.
Desarrollo:
pnpm run devEsto lanza
src/index.tscontsxen modo desarrollo.Inspector MCP (diagnóstico):
pnpm run inspectorUtiliza
@modelcontextprotocol/inspectorcontra la misma entrada (src/index.ts).
Estado del certificado X.509
La tool read-only get_certificate_status informa el ambiente, las fechas de
validez, los días restantes y el estado del certificado X.509 efectivamente
cargado por el cliente. No lee ni accede a la clave privada y no expone PEM,
identidad, subject, issuer ni rutas locales.
Las tools que usan WSAA/WSN se bloquean si el certificado todavía no es válido o ya venció. Si faltan exactamente 90 días o menos, continúan normalmente y se emite una advertencia visible una sola vez por proceso. La fecha se compara con un límite exacto de 90 días, no con meses calendario. Para inspeccionar las fechas manualmente, ejecuta:
openssl x509 -in /ruta/al/certificado.crt -noout -datesDespués de renovar o reemplazar el certificado, reinicia ArcaMCP para que el cliente cargue el nuevo PEM.
Confirmación de acciones (annotations MCP)
Cada tool declara annotations MCP para que el cliente sepa cuándo pedir confirmación:
create_voucherycreate_next_voucher:destructiveHint: true,idempotentHint: false. Emiten un comprobante fiscal con CAE, que es irreversible y no se debe repetir.create_pdf: no es de solo lectura (genera un archivo nuevo en cada llamada), pero no es destructiva.Todas las consultas (catálogos,
get_voucher_info,get_taxpayer_details,mis_comprobantes, etc.):readOnlyHint: true.get_certificate_status:readOnlyHint: true,openWorldHint: false(solo lee el certificado local).
Comandos de línea de comandos
arcamcp Inicia el servidor MCP por stdio.
arcamcp setup [--dev | --prod] [--force] Crea el certificado, actualiza .env y autoriza wsfe y ws_sr_padron_a13.
arcamcp doctor Diagnostica la configuración sin modificar nada.
arcamcp help Muestra la ayuda.Con npx, anteponé npx -y @yoryoboy/arcamcp@latest. Desde un clone del repositorio, usá pnpm run dev <comando> (por ejemplo pnpm run dev doctor). Un comando u opción desconocidos terminan con código 2.
Herramientas adicionales del MCP
Mis Comprobantes (asíncrono con consulta por ID)
La tool mis_comprobantes inicia la automatización "Mis Comprobantes" de ARCA para listar comprobantes emitidos/recibidos. Por diseño, se ejecuta en modo asíncrono (wait=false):
Entrada: filtros opcionales como
t,fechaEmision,puntosVenta,tiposComprobantes,comprobanteDesde,comprobanteHasta,tipoDoc,nroDoc,codigoAutorizacion.Salida inmediata: un objeto con
idystatus. No contiene todavía los datos finales; es el identificador de la ejecución.Consulta del resultado: usa posteriormente el tool
get_automation_detailscon eseidpara verificar si finalizó y recuperar los datos.
Ejemplo de uso conceptual (cliente MCP):
{
"tool": "mis_comprobantes",
"params": {
"t": "emitidos",
"fechaEmision": "2025-09-01..2025-09-22",
"puntosVenta": [1],
"tiposComprobantes": [11]
}
}Respuesta típica inicial:
{
"id": "abc123",
"status": "running"
}Luego, para consultar el resultado:
{
"tool": "get_automation_details",
"params": { "id": "abc123" }
}Notas:
Las credenciales (
CUIT,username,password) se leen de la configuración (src/config.ts).Mientras
statusindique ejecución en curso, vuelve a consultar más tarde con el mismoid.
Crear PDF de comprobante (enlace válido 24 h)
La tool create_pdf genera un PDF a partir de un HTML dinámico y datos del comprobante (incluyendo QR AFIP). Internamente usa ElectronicBilling.createPDF de la SDK de AFIP.
Entrada: datos del comprobante (emisor, receptor, importes, fechas,
CbteTipo,CbteLetra,PtoVta,CbteNro,CbteFch,CAE_NUMBER,CAE_EXPIRY_DATE, moneda, cotización y los ítems de la factura, entre otros).Proceso recomendado: primero recupera los datos con las tools del MCP (voucher, emisor, receptor). El asistente debe mostrar un resumen y requerir confirmación explícita antes de generar el PDF.
Salida: un objeto con
file(URL descargable) y aviso de expiración. El enlace al PDF es válido por 24 horas.
Respuesta típica:
{
"success": true,
"phase": "pdf_created",
"message": "PDF generado correctamente. El enlace expira en 24 horas.",
"file": "https://.../Factura_C_00001_00000001.pdf",
"expiresInHours": 24
}Recomendación:
Usa la numeración automática al emitir el comprobante (ver sección del prompt) para asegurar que
CbteNrosea el correcto antes de crear el PDF.
Solución de problemas (troubleshooting)
Certificados no encontrados o error
ENOENT:Revisa rutas en
.env(AFIP_*_CERT_PATHyAFIP_*_KEY_PATH). Puedes usar rutas absolutas o relativas al raíz del proyecto.
AFIP_PRODUCTION=truepero faltan variables:Define
AFIP_PROD_CERT_PATH,AFIP_PROD_KEY_PATHyAFIP_SDK_ACCESS_TOKENsi tu flujo lo requiere.
Error de autorización de servicio:
Verifica que el CUIT tiene Clave Fiscal 3 y permisos para el servicio (ej.
wsfe,ws_sr_padron_a13).
Versiones de Node incompatibles:
Asegúrate de usar Node 20+ y confirma la versión con
node -v.
Variables de entorno sin definir o certificados ilegibles:
El servidor arranca igual y cada tool responde con
kind: "configuration",code: "CONFIGURATION_ERROR"y la lista de problemas endetails.issues(por ejemploFalta AFIP_PROD_CERT_PATH.).get_certificate_statustambién los informa. Corregí la configuración y reiniciá el servidor MCP.AFIP_PASSWORDyAFIP_CERT_ALIASno son necesarias para el servidor; solo las usan las automatizaciones de certificados y autorización.
Configuración del cliente MCP (archivo JSON)
Muchos clientes MCP aceptan un archivo de configuración JSON (por ejemplo mcp.json o mcp_config.json) donde se definen los servidores. A continuación se muestra un ejemplo genérico para registrar este servidor como arca-mcp.
Ejemplo (Windows, con rutas absolutas a los certificados):
{
"arca-mcp": {
"command": "npx",
"args": ["-y", "@yoryoboy/arcamcp@latest"],
"env": {
"AFIP_CUIT": "20123456789",
"AFIP_DEV_CERT_PATH": "C:\\ruta\\a\\ArcaMCP\\certs\\dev\\dev_certificado.crt",
"AFIP_DEV_KEY_PATH": "C:\\ruta\\a\\ArcaMCP\\certs\\dev\\dev_private.key",
"AFIP_PROD_CERT_PATH": "C:\\ruta\\a\\ArcaMCP\\certs\\prod\\prod_certificado.crt",
"AFIP_PROD_KEY_PATH": "C:\\ruta\\a\\ArcaMCP\\certs\\prod\\prod_private.key",
"AFIP_SDK_ACCESS_TOKEN": "apikey",
"AFIP_PRODUCTION": "true"
}
}
}Ejemplo (rutas relativas al directorio de trabajo del cliente MCP):
{
"arca-mcp": {
"command": "npx",
"args": ["-y", "@yoryoboy/arcamcp@latest"],
"env": {
"AFIP_CUIT": "20123456789",
"AFIP_DEV_CERT_PATH": "./certs/dev/dev_certificado.crt",
"AFIP_DEV_KEY_PATH": "./certs/dev/dev_private.key",
"AFIP_PROD_CERT_PATH": "./certs/prod/prod_certificado.crt",
"AFIP_PROD_KEY_PATH": "./certs/prod/prod_private.key",
"AFIP_SDK_ACCESS_TOKEN": "apikey",
"AFIP_PRODUCTION": "true"
}
}
}Notas importantes:
Ajustá las rutas de certificados de
enva tu entorno. En Windows se debe escapar la barra invertida (\\) en JSON.Podés usar rutas relativas si conocés el directorio de trabajo del cliente MCP; las rutas absolutas suelen ser más confiables.
Si trabajas en homologación, define
"AFIP_PRODUCTION": "false"y usa los certificados de dev.
Uso del prompt de creación de comprobantes
Este repositorio incluye un prompt para asistir en la creación de comprobantes: src/prompts/CreateVoucherPrompt/CreateVoucherPrompt.ts.
Nombre del prompt:
wizard_crear_comprobante.Objetivo: recopilar y validar datos para crear un comprobante en AFIP y ejecutar la tool correspondiente.
Herramientas involucradas:
create_next_voucher(numeración automática) ocreate_voucher(manual), además de herramientas auxiliares para tipos, puntos de venta, etc.
Recomendación:
Pon la numeración en modo automático (campo
modoNumeracion="automatico") para que AFIP/ARCA asigne el número de voucher correcto y evites inconsistencias.
Ejemplo de invocación de argumentos (conceptual):
{
"prompt": "wizard_crear_comprobante",
"args": {
"tipoComprobante": 11,
"puntoDeVenta": 1,
"concepto": 1,
"modoNumeracion": "automatico"
}
}El asistente completará datos faltantes, validará reglas (por ejemplo Factura C, condiciones del receptor) y, tras confirmación explícita, ejecutará create_next_voucher para obtener CAE, fecha de vencimiento del CAE y el número de comprobante.
Seguridad
No compartas tu
.envni subas certificados a repositorios públicos.Restrinje permisos del sistema de archivos a las claves privadas.
Considera encriptar el almacenamiento de certificados en equipos compartidos.
Contribuir
¡Las contribuciones son bienvenidas! La mejor forma de colaborar en este proyecto aquí en GitHub es la siguiente:
Reporta issues: abre un Issue con un título claro, contexto, pasos para reproducir y comportamiento esperado.
Propón mejoras: para nuevas features, abre primero un Issue/Discussion para alinear el alcance.
Envía Pull Requests (PRs):
Haz un fork del repo y crea una rama desde
main(por ejemplo,feat/mi-mejoraofix/mi-bug).Instala dependencias con
pnpm instally prueba en local conpnpm run dev.Asegúrate de que el código compile (
pnpm run build) y que pasepnpm run quality.Incluye documentación actualizada en
README.mdcuando aplique (por ejemplo, variables nuevas, pasos, comandos).No incluyas secretos ni certificados en los commits (usa variables de entorno y rutas locales).
Describe claramente los cambios en el PR y referencia el Issue relacionado (
Fixes #<n>si corresponde).
Estilo y buenas prácticas:
TypeScript y ES Modules (ver
package.jsonytsconfig.json).Mantén el código y mensajes en español cuando ayuden a la comunidad local (AFIP/ARCA).
Sigue convenciones de commits (p. ej.
feat:,fix:,docs:) para facilitar el historial.
Licencia y autor
Licencia: MIT
Autor: Jorge Diaz
Available Tools
20 toolscreate_next_voucherCrear próximo comprobante electrónicoADestructive
Crear el próximo comprobante electrónico en AFIP con numeración automática y CAE asignado.
Instrucciones para el asistente: Antes de ejecutar esta herramienta, entiende y valida exhaustivamente todos los parámetros requeridos según el tipo de comprobante a emitir (concepto, tipo de factura, moneda, punto de venta, importes, fechas, ítems, etc.). Si falta información o hay inconsistencias, solicita explícitamente los datos faltantes al usuario.
Recomendación clave: previo a usar esta herramienta, consulta los puntos de venta disponibles del usuario y asegúrate de recibir el número de punto de venta correcto (PtoVta).
Flujo sugerido: 1) Validar parámetros y completar faltantes preguntando al usuario. 2) Sugerir y/o consultar puntos de venta disponibles si no se proporcionó PtoVta. 3) Preparar y presentar un resumen claro y completo de la factura que se generará (todos los campos relevantes, importes y fechas). 4) Solicitar confirmación explícita del usuario. 5) Recién entonces proceder a crear el comprobante.
Atención: Mantente atento a cualquier notificación, instrucción adicional o preferencia que el usuario indique durante el proceso y ajústalo antes de ejecutar la herramienta.
| Name | Required | Description | Default |
|---|---|---|---|
| Iva | No | Alícuotas e importes de IVA asociados. Para comprobantes tipo C y Bienes Usados – Monotributista no debe informarse | |
| MonId | Yes | Código de moneda (ej: PES). Consultar método FEParamGetTiposMonedas | |
| DocNro | No | Número de identificación del comprador. Si el monto (ImpTotal) es por menos de $10.000.000 ARS y es para consumidor Final, no es necesario declarar los datos del receptor del comprobante. (DocNro puede ser omitido) | |
| ImpIVA | Yes | Suma de importes de IVA. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0 | |
| PtoVta | Yes | Punto de venta del comprobante. Si se informan varios, deben corresponder al mismo punto de venta. Para obtener puntos de venta disponibles, usar tool get_sales_points. Si el usuario no especifica, se tiene que obtener sus puntos de venta disponibles y pedirle que elija uno | |
| CbteFch | Yes | Fecha del comprobante (yyyyMMdd). Para concepto=1: hasta 5 días anteriores/posteriores. Para 2 o 3: hasta 10 días. Si el usuario no especifica, usar la fecha actual | |
| DocTipo | Yes | Código de documento del comprador. Ej: 80=CUIT, 96=DNI, 99=Consumidor Final. Se puede recuperar todos los tipos de documentos disponibles usando tool get_document_types | |
| ImpNeto | Yes | Importe neto gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C corresponde al Subtotal. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0 | |
| ImpOpEx | Yes | Importe exento. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0 | |
| ImpTrib | Yes | Suma de los importes de tributos | |
| CbteTipo | Yes | Tipo de comprobante informado. Si se informa más de uno, todos deben ser del mismo tipo. Para obtener tipos de comprobante disponibles, usar tool get_voucher_types. Si el usuario no ha especificado el tipo de Factura, se tiene que obtener sus tipos de comprobante disponibles y recomendarle elegir uno. | |
| Concepto | Yes | Concepto del comprobante. Valores permitidos: 1=Productos, 2=Servicios, 3=Productos y Servicios | |
| ImpTotal | Yes | Importe total del comprobante. Fórmula: Importe no gravado + Importe exento + Importe neto gravado + IVA + tributos. Si el monto es por menos de $10.000.000 ARS y es para consumidor Final, no es necesario declarar los datos del receptor del comprobante. (DocNro puede ser omitido) | |
| MonCotiz | Yes | Cotización de la moneda. Para PES debe ser 1 | |
| Tributos | No | Tributos asociados al comprobante | |
| CbtesAsoc | No | Comprobantes asociados | |
| FchVtoPago | No | Fecha de vencimiento de pago (yyyyMMdd). Obligatorio si concepto=2 o 3. Debe ser igual o posterior a la fecha del comprobante. Si el usuario no especifica, se le debe preguntar por esta información. El LLM no debe asumir esa información | |
| ImpTotConc | Yes | Importe neto no gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Emisor Monotributista, corresponde al subtotal | |
| Opcionales | No | Campos auxiliares reservados para usos futuros | |
| FchServDesde | No | Fecha inicio servicio (yyyyMMdd). Obligatorio si concepto=2 o 3. Si el usuario no especifica, se le debe preguntar por esta información. El LLM no debe asumir esa información | |
| FchServHasta | No | Fecha fin servicio (yyyyMMdd). Obligatorio si concepto=2 o 3. No menor a FchServDesde. Si el usuario no especifica, se le debe preguntar por esta información. El LLM no debe asumir esa información | |
| CondicionIVAReceptorId | Yes | Condición de IVA del receptor. Si el usuario no especifica, se tienen que obtener las condiciones frente al IVA disponibles y pedirle que elija una. Para obtener las condiciones frente al IVA disponibles, usar tool get_tax_condition_types. El LLM no debe asumir esa información |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true; the description adds the human-in-the-loop confirmation requirement and the fact that AFIP assigns numbering and a CAE, which is meaningful context beyond the flags. It never states plainly that each invocation consumes the next sequential number and cannot be undone or retried safely — the single most important behavior for a non-idempotent fiscal write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded correctly, but the body repeats itself: validation-before-execution is stated in the opening instruction, again as flow step 1, and again in the closing "Atención" paragraph. The "Recomendación clave" about PtoVta duplicates flow step 2 and is also already in the PtoVta schema description. Tightening to purpose + flow + confirmation gate would lose nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter, 14-required, destructive issuance tool with no output schema, the description covers the pre-flight workflow and prerequisite lookups well. It is silent on what the agent receives on success (CAE, voucher number, expiry), on error/failure behavior when AFIP rejects the request, and on how this differs from create_voucher — gaps an agent must resolve before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-field semantics are already documented, which sets the baseline at 3. The description goes beyond that by enumerating the parameter categories that must be validated (concepto, tipo de factura, moneda, punto de venta, importes, fechas, ítems) and mandating that missing data be requested from the user rather than assumed — a cross-cutting constraint the schema does not express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Crear el próximo comprobante electrónico en AFIP") plus two distinguishing traits: automatic numbering and CAE assignment, which tell the agent this is a real fiscal issuance, not a draft. However, the sibling list contains create_voucher and the description never explains how this tool differs from it, so the agent cannot disambiguate between the two write paths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 5-step pre-execution flow (validate params, resolve PtoVta, present a summary, get explicit confirmation, then create) and a hard gate on user confirmation — far above typical guidance. It stops short of naming alternatives (create_voucher) or stating when NOT to use this tool, so it does not reach 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pdfCrear PDF de facturaA
Genera un PDF dinámico de un comprobante electrónico combinando datos del voucher, emisor y receptor desde AFIP. La manera más recomendada de llenar la información para la factura de manera correcta es utilizar las herramientas apropiadas para recuperar los datos del CAE y los datos tanto del emisor como del receptor utilizando sus CUIT. El LLM no debe asumir ninguna información que no haya sido dada explícitamente o que no pueda inferir. Una vez todos los datos estén recopilados, se debe hacer un resumen de la factura tal cual como quedaría y mostrársela al usuario antes de proceder. Procederemos solo cuando tengamos la confirmación explícita del usuario. Si A13 devuelve varios domicilios elegibles de igual prioridad, reintentar con DIRECCION_EMISOR_SELECCIONADA usando uno de los candidatos devueltos. Este campo se valida contra A13 y no permite direcciones arbitrarias. Nota importante: este tool usa dos campos relacionados al tipo de comprobante para evitar ambigüedad: CbteTipo (código numérico AFIP para uso técnico/QR) y CbteLetra (A/B/C/M) únicamente para la visualización en el PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| MonId | No | Código de moneda (ej: PES) | PES |
| DocNro | No | Número de documento del receptor (CUIL/CUIT). Debe ser de 11 dígitos, sin puntos ni guiones. Si no corresponde declarar receptor, dejar explícitamente en blanco (string vacío). Este schema normaliza 0 o cadenas de solo ceros ('000...') a vacío. No inventar números. Si el usuario no lo ha especificado y es necesario, preguntar: el LLM no debe asumir esta información. | |
| PtoVta | Yes | Punto de venta del comprobante. Se le debe agregar '0000' al inicio. Por ejemplo, si es 2, se pone '00002' | |
| CbteFch | Yes | Fecha del comprobante | |
| CbteNro | Yes | Número del comprobante | |
| CbteTipo | Yes | Código numérico del tipo de comprobante según AFIP (por ejemplo, Factura C = 11). Este valor se utiliza para propósitos técnicos como la generación del QR y debe obtenerse con el tool get_voucher_types. IMPORTANTE: Para la letra que se muestra en el PDF (A/B/C/M), usar el campo CbteLetra. | |
| Concepto | Yes | Concepto del comprobante: 1=Productos, 2=Servicios, 3=Productos y Servicios | |
| MonCotiz | No | Cotización moneda | |
| SUBTOTAL | Yes | Subtotal de la factura | |
| CbteLetra | Yes | Letra del comprobante para visualización en el PDF (A/B/C/M). No utilizar aquí el Id numérico devuelto por get_voucher_types. Si sólo se dispone de la descripción (p. ej., 'Factura C'), extraer la letra (C). Se define CbteLetra separado de CbteTipo para evitar ambigüedad: CbteTipo es el código numérico para AFIP/QR, mientras que CbteLetra es únicamente la representación visual en el PDF. | |
| CAE_NUMBER | Yes | Número de autorización del comprobante | |
| FchVtoPago | No | Fecha de vencimiento de pago. En caso de no ser necesario declarar el servicio, se puede omitir. Dejar espacio en blanco. Lo ideal sería obtener la información del CAE al que se le está generando esta factura para obtener los datos de las fechas de inicio, fin y pago del servicio. | |
| TipoCodAut | No | Tipo de autorización del comprobante para QR: 'E' (CAE) o 'A' (CAEA) | E |
| FchServDesde | No | Fecha de inicio de servicio. En caso de no ser necesario declarar el servicio, se puede omitir. Dejar espacio en blanco. Lo ideal sería obtener la información del CAE al que se le está generando esta factura para obtener los datos de las fechas de inicio, fin y pago del servicio. | |
| FchServHasta | No | Fecha de fin de servicio. En caso de no ser necesario declarar el servicio, se puede omitir. Dejar espacio en blanco. Lo ideal sería obtener la información del CAE al que se le está generando esta factura para obtener los datos de las fechas de inicio, fin y pago del servicio. | |
| IMPORTE_TOTAL | Yes | Importe total de la factura | |
| INVOICE_ITEMS | No | Ítems de factura | |
| CONDICION_PAGO | No | Condición de venta / medio de pago. Seleccionar una opción del enum: Contado, Efectivo, Transferencia, Depósito, Tarjeta de Débito, Tarjeta de Crédito, Mercado Pago, Billetera virtual, Cheque, Cuenta Corriente, A crédito, Contraentrega, QR interoperable u Otros. Si el usuario no lo ha especificado, preguntarle y no asumir esta información. | Contado |
| CAE_EXPIRY_DATE | Yes | Fecha de vencimiento de la autorización | |
| INGRESOS_BRUTOS | Yes | Condición obligatoria de Ingresos Brutos; Local y Convenio Multilateral requieren inscripción. | |
| NOMBRE_RECEPTOR | Yes | Nombre del receptor. En caso de no ser necesario declarar el receptor, se puede omitir. Dejar espacio en blanco | |
| CondicionIVAEmisor | Yes | Condición frente al IVA del emisor. Si el usuario no lo ha especificado, se deberá encontrar las opciones disponibles utilizando el tool get_tax_condition_types y se le deberá preguntar al usuario. Esta información nunca debe ser asumida, tiene que ser confirmada por el usuario. | |
| DIRECCION_RECEPTOR | No | Dirección del receptor. En caso de no ser necesario declarar el receptor, se puede omitir. Dejar espacio en blanco. Si es necesario declarar el receptor, se puede encontrar la informacion del receptor usando el tool get_taxpayer_details | |
| CondicionIVAReceptor | Yes | En caso de ser consumidor final, simplemente poner 'Consumidor Final' | |
| IMPORTE_OTROS_TRIBUTOS | No | Importe de otros tributos | |
| FECHA_INICIO_ACTIVIDADES | Yes | Fecha legal de inicio de actividades en formato YYYY-MM-DD | |
| DIRECCION_EMISOR_SELECCIONADA | No | Domicilio del emisor seleccionado explícitamente de los candidatos actuales de A13. Solo se acepta si coincide con un domicilio elegible y normalizado devuelto por AFIP; no usar para proporcionar una dirección arbitraria. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is non-read-only, open-world, non-idempotent, and non-destructive. The description adds useful behavioral context: user confirmation is required before generation, data must not be assumed, and DIRECCION_EMISOR_SELECCIONADA is validated against A13 rather than accepting arbitrary values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and then moves into workflow rules, which is appropriate for a complex 27-parameter tool. It is somewhat verbose and repeats some 'do not assume' guidance already covered in the schema, but most sentences earn their place given the workflow complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the generation workflow, confirmation requirement, and A13 address validation, which is substantial for a complex create operation. However, with no output schema, it does not explain what the PDF generation returns, such as a file path, URL, or inline binary, leaving an important gap for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema. It explicitly clarifies the distinction between CbteTipo as the AFIP/QR numeric code and CbteLetra as the PDF display letter, and explains that DIRECCION_EMISOR_SELECCIONADA must match an A13-returned eligible address.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Genera un PDF dinámico de un comprobante electrónico' and explains that it combines voucher, emisor, and receptor data from AFIP. This clearly distinguishes it from sibling tools that create or retrieve vouchers rather than render a PDF.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear workflow guidance: gather data with the appropriate tools, do not assume missing information, summarize the invoice for the user, and proceed only after explicit confirmation. It also gives a specific retry path for A13 multiple-address cases, though it does not name create_voucher or another exact sibling as the prerequisite alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_voucherCrear comprobante electrónicoCDestructive
Crear un comprobante electrónico en AFIP con CAE asignado
| Name | Required | Description | Default |
|---|---|---|---|
| Iva | No | Alícuotas e importes de IVA asociados. Para comprobantes tipo C y Bienes Usados – Monotributista no debe informarse | |
| MonId | Yes | Código de moneda (ej: PES). Consultar método FEParamGetTiposMonedas | |
| DocNro | No | Número de identificación del comprador. Si el monto (ImpTotal) es por menos de $10.000.000 ARS y es para consumidor Final, no es necesario declarar los datos del receptor del comprobante. (DocNro puede ser omitido) | |
| ImpIVA | Yes | Suma de importes de IVA. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0 | |
| PtoVta | Yes | Punto de venta del comprobante. Si se informan varios, deben corresponder al mismo punto de venta. Para obtener puntos de venta disponibles, usar tool get_sales_points. Si el usuario no especifica, se tiene que obtener sus puntos de venta disponibles y pedirle que elija uno | |
| CantReg | Yes | Cantidad de registros del detalle del comprobante o lote de comprobantes de ingreso | |
| CbteFch | Yes | Fecha del comprobante (yyyyMMdd). Para concepto=1: hasta 5 días anteriores/posteriores. Para 2 o 3: hasta 10 días. Si el usuario no especifica, usar la fecha actual | |
| DocTipo | Yes | Código de documento del comprador. Ej: 80=CUIT, 96=DNI, 99=Consumidor Final. Se puede recuperar todos los tipos de documentos disponibles usando tool get_document_types | |
| ImpNeto | Yes | Importe neto gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C corresponde al Subtotal. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0 | |
| ImpOpEx | Yes | Importe exento. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0 | |
| ImpTrib | Yes | Suma de los importes de tributos | |
| CbteTipo | Yes | Tipo de comprobante informado. Si se informa más de uno, todos deben ser del mismo tipo. Para obtener tipos de comprobante disponibles, usar tool get_voucher_types. Si el usuario no ha especificado el tipo de Factura, se tiene que obtener sus tipos de comprobante disponibles y recomendarle elegir uno. | |
| Concepto | Yes | Concepto del comprobante. Valores permitidos: 1=Productos, 2=Servicios, 3=Productos y Servicios | |
| ImpTotal | Yes | Importe total del comprobante. Fórmula: Importe no gravado + Importe exento + Importe neto gravado + IVA + tributos. Si el monto es por menos de $10.000.000 ARS y es para consumidor Final, no es necesario declarar los datos del receptor del comprobante. (DocNro puede ser omitido) | |
| MonCotiz | Yes | Cotización de la moneda. Para PES debe ser 1 | |
| Tributos | No | Tributos asociados al comprobante | |
| CbteDesde | Yes | Nro. de comprobante desde. Rango 1 – 99999999 | |
| CbteHasta | Yes | Nro. de comprobante hasta. Rango 1 – 99999999 | |
| CbtesAsoc | No | Comprobantes asociados | |
| FchVtoPago | No | Fecha de vencimiento de pago (yyyyMMdd). Obligatorio si concepto=2 o 3. Debe ser igual o posterior a la fecha del comprobante. Si el usuario no especifica, se le debe preguntar por esta información. El LLM no debe asumir esa información | |
| ImpTotConc | Yes | Importe neto no gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Emisor Monotributista, corresponde al subtotal | |
| Opcionales | No | Campos auxiliares reservados para usos futuros | |
| FchServDesde | No | Fecha inicio servicio (yyyyMMdd). Obligatorio si concepto=2 o 3. Si el usuario no especifica, se le debe preguntar por esta información. El LLM no debe asumir esa información | |
| FchServHasta | No | Fecha fin servicio (yyyyMMdd). Obligatorio si concepto=2 o 3. No menor a FchServDesde. Si el usuario no especifica, se le debe preguntar por esta información. El LLM no debe asumir esa información | |
| fullResponse | No | Si es true, devuelve la respuesta completa del WS. Si es false o no se especifica, devuelve solo CAE y CAEFchVto | |
| CondicionIVAReceptorId | Yes | Condición de IVA del receptor. Si el usuario no especifica, se tienen que obtener las condiciones frente al IVA disponibles y pedirle que elija una. Para obtener las condiciones frente al IVA disponibles, usar tool get_tax_condition_types. El LLM no debe asumir esa información |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false; the description only adds that a CAE is assigned. It does not warn that this issues a real fiscal document, is non-idempotent, or describe side effects. There is no contradiction, but added behavioral context is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no repetition. It is structurally clean, though unusually terse for a complex destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter destructive issuance tool with 17 required fields and no output schema, the description omits prerequisites, side effects, return behavior, and sibling routing. The schema carries field-level details, but the description is not complete enough for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed per-field descriptions, formulas, defaults, and sibling-tool references. The description itself adds no parameter meaning beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Crear un comprobante electrónico en AFIP', plus the outcome 'con CAE asignado'. It is clear what the tool does, but it does not distinguish it from the sibling create_next_voucher.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus create_next_voucher or other siblings. Prerequisites and conditions for issuance are left to the schema and agent inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aliquot_typesObtener tipos de alícuotasARead-only
Obtiene los tipos de alícuotas de IVA disponibles en AFIP (0%, 10.5%, 21%, 27%, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the data originates from AFIP and enumerates representative returned values (0%, 10.5%, 21%, 27%), but says nothing about failure modes, auth, or whether the list changes over time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence with the resource front-loaded and inline examples that earn their place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, full schema coverage, and annotations covering the read-only/open-world profile, the description supplies enough to call the tool correctly. It is only slightly thin on what the enumeration is used for downstream.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The example values compensate slightly by hinting at the shape of returned strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Obtiene') and a precise resource ('tipos de alícuotas de IVA disponibles en AFIP'), reinforced by concrete example values. It is distinguishable from generic siblings like get_tax_types, though the description never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is used when it needs valid IVA rates for voucher creation, but the description gives no explicit when-to-use condition, prerequisites, or named alternatives among the many sibling type-listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_automation_detailsObtener detalles de automatizaciónARead-only
Consulta el estado o el resultado final de una automatización previamente iniciada (p. ej., 'mis_comprobantes') usando su ID. Este tool SIEMPRE consulta en modo no bloqueante (wait=false). Si la automatización sigue en proceso, devolverá { id, status: 'in_process' }. Cuando finalice, devolverá los datos completos.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID de la automatización retornado por 'mis_comprobantes'. Debe pegar aquí el ID para consultar el estado o recuperar el resultado final. | |
| wait | No | Ignorado: este tool siempre consulta en modo no bloqueante (wait=false). Si la automatización sigue en proceso, devolverá { id, status: 'in_process' }. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, yet the description adds genuinely new behavior: it ALWAYS runs non-blocking regardless of the wait flag, and it discloses the in-process response payload shape ({ id, status: 'in_process' }) versus the completed-result behavior. It does not say how long results are retained or how an agent should poll, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then the non-blocking constraint, then the two possible return states. Nothing is redundant with the title and no sentence could be dropped without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so for the two main branches (in-process vs. finished). It leaves open the polling cadence and whether a completed result remains retrievable, minor gaps for a 2-parameter read tool whose annotations already cover the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is 3, but the description adds relevant meaning by asserting the wait parameter is effectively inert ('SIEMPRE consulta en modo no bloqueante'), which prevents an agent from setting wait=true expecting blocking behavior. The id parameter's provenance is also reinforced in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Consulta el estado o el resultado final de una automatización') plus the key discriminator: it requires an ID of an already-started automation, sourced from 'mis_comprobantes'. An agent can distinguish this polling tool from the sibling that starts the automation without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'previamente iniciada' plus the 'mis_comprobantes' example clearly establishes the precondition for calling this tool and implies the sibling used to launch it. What's missing is an explicit statement of what to do when status is 'in_process' (re-poll vs. stop) and how often to poll.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_certificate_statusGet X.509 certificate statusARead-only
Returns the loaded X.509 certificate validity status without exposing certificate, key, identity, issuer, subject, or local paths.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful privacy guarantee (certificate, key, identity, issuer, subject and local paths are not exposed) and the 'loaded' cue implying an in-memory certificate, but it does not state what happens when no certificate is loaded or what the status values are.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource and the verb first and the disclosure clause second. Every clause earns its place; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, no output schema and thin annotations, the description carries the burden of explaining the return value, and 'validity status' is not concrete — an agent cannot tell whether it gets a boolean, an enum, or an expiry date, nor how a missing/unloadable certificate is reported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly introduces no parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Returns the loaded X.509 certificate validity status'), so an agent knows this reports certificate health rather than reading certificate material. No sibling overlaps in this domain, so differentiation is not required, but the phrase 'validity status' leaves the exact payload shape ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied — an agent can infer it is the pre-flight check before signing/authenticated operations, but the description never says when to call it or what to do on failure. There are no alternatives to route between, which keeps this at minimum-viable rather than poor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_concept_typesObtener tipos de conceptosARead-only
Obtiene los tipos de conceptos disponibles en AFIP (Productos, Servicios, Productos y Servicios).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the result set is a small fixed AFIP enumeration with exactly three known values, which is genuinely useful context beyond the annotations, but it says nothing about caching, failure modes, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the action and resource, then the concrete value set in parentheses. Every clause earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only enumeration with no output schema, the description supplies enough: the domain (AFIP) and the actual values returned. The only gap is that it does not tie the result to where it is consumed (e.g., the concept field of a voucher), which would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The enumerated values in the description also pre-answer what the caller will see, which is a small bonus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Obtiene') and resource ('tipos de conceptos disponibles en AFIP') and enumerates the actual domain values (Productos, Servicios, Productos y Servicios), so an agent knows exactly what comes back. It does not explicitly distinguish itself from near-siblings like get_voucher_types or get_document_types, but the AFIP domain scoping makes the difference inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can deduce this is a lookup used to populate a 'concepto' field, presumably when creating vouchers. There is no explicit when-to-use statement, no mention of when it is not needed, and no named alternative among the many other type-lookup siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cuit_from_dniObtener CUIT a partir de DNICRead-only
Obtiene el CUIT de un contribuyente a partir de su DNI
| Name | Required | Description | Default |
|---|---|---|---|
| nationalId | Yes | DNI del contribuyente |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered, but the description adds nothing beyond the bare purpose: no mention of whether the lookup hits an external registry, what happens on a miss, or whether the result can be cached/trusted. For an open-world lookup this leaves behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste. It is appropriately sized for a one-parameter lookup, though it is so terse that it leaves obvious questions unanswered rather than being an example of tight, complete phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 param, no nesting) and annotations cover safety, but there is no output schema, so the description should say what the returned CUIT looks like (format, whether null on miss). That missing return-shape/edge-case context keeps it at minimum viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single nationalId parameter is documented as 'DNI del contribuyente', which matches the description's phrasing. The description adds no format constraints (digits only, with/without dots, length), so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (obtiene) and resource (CUIT del contribuyente) with the input (DNI), so an agent immediately knows the transformation performed. It does not distinguish itself from the related sibling get_taxpayer_details, which also deals with taxpayer data, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this instead of get_taxpayer_details or other taxpayer lookups, and no mention of failure conditions (e.g., DNI not found, invalid DNI). The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_currencies_typesObtener tipos de monedasARead-only
Obtiene los tipos de monedas disponibles en AFIP (ARS, USD, EUR, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context that the values come from AFIP and gives sample currency codes, but says nothing about auth requirements, caching/freshness, or whether the list is static or remote-fetched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource named first and the examples parenthesized; every clause earns its place and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only catalog lookup, the description tells an agent what comes back well enough to use it, and the examples partially substitute for the absent output schema. It stops short of describing the shape of each entry (code, label, decimals) or whether inactive currencies are included.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline for this dimension is 4. Nothing in the description is needed to disambiguate inputs, and nothing conflicts with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Concrete verb + resource ("Obtiene los tipos de monedas disponibles en AFIP") plus example values (ARS, USD, EUR) make clear this returns a currency catalog, not rates. It does not explicitly name the sibling it is distinct from (get_exchange_rate), which is the main adjacent tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the lookup to run before supplying a currency code to create_voucher or get_exchange_rate. There is no explicit when-to-use, when-not, or alternative routing, and no mention of prerequisites such as authentication with AFIP.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_typesObtener tipos de documentosARead-only
Obtiene los tipos de documentos disponibles en AFIP (DNI, CUIT, CUIL, Pasaporte, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is known. The description contributes the fact that the values come from AFIP and are a fixed catalog (DNI, CUIT, CUIL, Pasaporte), which tells the agent this is a static reference lookup rather than a dynamic query. It says nothing about response shape or whether codes accompany labels, which matters since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every element, verb, resource, source (AFIP) and example values, earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter AFIP catalog lookup whose annotations already cover safety and openness, the description supplies enough to call it correctly. The only gap is the return format (codes vs. labels), which is modest given how simple the tool is.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. No parameter semantics are needed and none are misleadingly implied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (obtiene) and resource (tipos de documentos) and scopes it to AFIP. The parenthetical examples (DNI, CUIT, CUIL, Pasaporte) make clear that this is the identity-document catalog, distinguishing it in substance from siblings like get_voucher_types or get_tax_types, though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to call this versus the many other catalog tools (get_voucher_types, get_concept_types, get_aliquot_types). Usage is only implied: an agent needing a valid document-type value for AFIP-related operations would infer this is the lookup. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exchange_rateObtener cotización de monedaBRead-only
Obtiene la cotización de una moneda específica para una fecha determinada desde AFIP.
| Name | Required | Description | Default |
|---|---|---|---|
| MonId | Yes | ID de la moneda a consultar (ej: 'DOL' para dólares) | |
| FchCotiz | Yes | Fecha de la cotización en formato AAAAMMDD (ej: '20250221') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description usefully names AFIP as the external data source, reinforcing the open-world nature. However, it says nothing about behavior for non-business days, unsupported dates, or unknown currency IDs, which are the realistic failure modes for a rate lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the two scoping dimensions appear immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with annotations covering the safety profile, the essentials are present. But with no output schema, the description should indicate what comes back (e.g. a buy/sell rate pair), and it omits that entirely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry examples ('DOL', '20250221') plus a format pattern, so the schema does the heavy lifting. The description only restates 'una moneda específica' and 'una fecha determinada' without adding format or validity detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (obtiene) plus resource (cotización de una moneda) plus source (AFIP), scoped to a single currency and date. It implicitly contrasts with the sibling get_currencies_types (which lists currency types rather than quoting one), but never names that distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use / when-not guidance, no mention of prerequisites, and no reference to alternatives such as get_currencies_types for discovering valid MonId values. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_last_voucherObtener número último comprobante creadoCRead-only
Obtener número último comprobante creado
| Name | Required | Description | Default |
|---|---|---|---|
| PtoVta | Yes | Punto de venta | |
| CbteTipo | Yes | Tipo de comprobante |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered, but the description adds nothing extra — no mention of whether it fails when no voucher exists for that point-of-sale/type pair, nor of what value is returned. It does not contradict 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste, but it is under-specified rather than genuinely concise — there is simply nothing beyond the title to structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a lookup tool whose whole value is the returned voucher number, the description never explains the return (a number, presumably the last assigned), and there is no output schema to compensate. Given the many sibling tools, more context is expected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters (PtoVta, CbteTipo) documented, so the schema carries the burden. The description adds no further meaning about the required combination or numbering semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tautological: description restates name/title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus create_next_voucher or get_voucher_info, nor on prerequisites like needing a valid PtoVta/CbteTipo combination. Usage is only weakly implied by the phrase 'último comprobante creado'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_options_typesObtener tipos de opcionesCRead-only
Obtiene los tipos de opciones disponibles para los comprobantes en AFIP.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true; the description adds nothing beyond them, such as whether the catalog is static or fetched live from AFIP, whether it can fail or require authentication, or whether results are cached. The only added element is the domain context ('para los comprobantes'), which is not behavioral.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Brevity is appropriate here, though the one sentence leaves key ambiguity unresolved rather than wasting space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, this is arguably the minimum acceptable description: it identifies a read-only AFIP catalog lookup. However, it never explains what an "opción" is or what the entries represent, which is the one thing the description could have supplied in place of structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. The empty schema is self-explanatory and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb+resource ("obtiene los tipos de opciones ... para los comprobantes"), but "opciones" is an ambiguous term that is not resolved anywhere. Among siblings like get_voucher_types, get_concept_types, get_document_types and get_aliquot_types, the agent gets no clue about which catalog this one returns or how it differs from get_voucher_types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and does not name any of the many sibling type-catalog tools. An agent choosing between this and get_voucher_types/get_concept_types must guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sales_pointsObtener puntos de venta disponiblesARead-only
Obtiene los puntos de venta disponibles para facturación electrónica. En testing siempre devuelve error ya que no existen puntos de venta configurados (se usa punto de venta 1 por defecto).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds non-obvious behavior beyond them: in testing it always errors because no sales points are configured, and point of sale 1 is used by default. That error-mode disclosure is exactly the kind of context an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the primary purpose front-loaded and the testing caveat immediately after. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, annotation-covered read tool with no output schema, the description covers purpose and the notable failure mode. It doesn't describe the shape of the returned sales points, which would be the only remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline applies. The description correctly implies a no-argument, environment-scoped call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Obtiene los puntos de venta disponibles para facturación electrónica'), so the agent knows exactly what it retrieves. It doesn't explicitly distinguish itself from siblings like get_voucher_types, though the resource is distinct enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance relative to alternatives; usage is only implied (fetch sales points before invoicing). The testing caveat is a useful operational hint but is not a selection guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_condition_typesObtener tipos de condiciones IVAARead-only
Obtiene los tipos de condiciones frente al IVA disponibles en AFIP (Responsable Inscripto, Monotributista, Exento, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the mention of values 'disponibles en AFIP' is consistent with the open-world hint. The description adds the useful signal that this returns a bounded enumerated catalog, but says nothing about caching, auth requirements, ordering, or whether the list is static.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource named first and illustrative values in parentheses. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return shape; it only gives example display names and does not mention that entries likely include an id/code plus a description, or whether the list is complete. Adequate for a trivial zero-arg lookup, but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate; the baseline of 4 applies. The description correctly implies no filtering arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Obtiene los tipos de condiciones frente al IVA') and clarifies the domain (AFIP) with concrete examples (Responsable Inscripto, Monotributista, Exento). It is clearly a catalog-listing tool, distinguishable from siblings like get_tax_types or get_aliquot_types, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this supplies valid VAT-condition values, but the description never says when to call it, that it takes no inputs, or that its output feeds fields in create_voucher / get_taxpayer_details. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taxpayer_detailsObtener datos del contribuyenteCRead-only
Obtiene los datos completos de un contribuyente a partir de su CUIT
| Name | Required | Description | Default |
|---|---|---|---|
| taxId | Yes | CUIT del contribuyente a consultar |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that: it does not mention that this hits an external service (openWorld), whether errors occur for unknown CUITs, or what the returned 'datos completos' comprise.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, appropriate for a one-parameter read tool. It is efficient but so sparse that brevity shades into under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter lookup with annotations covering safety, the essentials are present. However, with no output schema, the description should hint at the shape of the returned 'datos completos' so the agent knows what it will receive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single taxId parameter is fully documented in the schema. The description restates that the lookup is keyed by CUIT but adds no format guidance (e.g., digit count, separators), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Obtiene') and resource ('datos completos de un contribuyente'), keyed by the identifier (CUIT). It is clear what the tool does, but it never distinguishes itself from the near-siblings in the list (e.g., get_cuit_from_dni, which performs the inverse lookup) or describes what 'datos completos' actually contains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. The agent must infer usage from the name alone, which is risky given several similarly named lookup tools in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_typesObtener tipos de tributosARead-only
Obtiene los tipos de tributos disponibles en AFIP (IIBB, impuestos municipales, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the catalog comes from AFIP and what it includes, but does not disclose whether the catalog is static/cached or what the return structure looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One focused sentence that front-loads the action and resource, with examples that earn their place. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter lookup, the description is adequate but not complete: it never says that the result is a list of tax type identifiers/descriptions, nor whether these values are needed before creating a voucher. With no output schema, a brief note about the returned catalog would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain. The description appropriately does not invent any parameter behavior, matching the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Obtiene los tipos de tributos disponibles en AFIP') and clarifies scope with examples (IIBB, impuestos municipales). It distinguishes itself by resource from the many sibling '*_types' getters, though it does not explicitly differentiate when to use this versus them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call it to list available AFIP tax types. There is no explicit guidance on when not to use it, no mention of prerequisites, and no routing among the many sibling type-listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_voucher_infoObtener información de comprobanteBRead-only
Obtener información completa de un comprobante ya emitido en AFIP
| Name | Required | Description | Default |
|---|---|---|---|
| PtoVta | Yes | Punto de venta del comprobante | |
| CbteNro | Yes | Número de comprobante a consultar | |
| CbteTipo | Yes | Tipo de comprobante informado. Consultar FEParamGetTiposCbte |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe, external read operation. The description adds that it retrieves 'información completa' of an already-issued voucher, but does not disclose authentication requirements, error behavior if the voucher is not found, or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently communicates the core purpose without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with three fully documented parameters and annotations covering safety, the description is minimally adequate. However, with no output schema, it should ideally hint at what 'información completa' includes (e.g., amounts, CAE, dates) or mention any authentication/authorization requirements for AFIP access.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (PtoVta, CbteNro, CbteTipo) are already documented in the schema, including a reference to FEParamGetTiposCbte for CbteTipo. The description adds no additional parameter meaning beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Obtener') and resource ('información completa de un comprobante'), clearly indicating retrieval of full voucher details. However, it does not distinguish this tool from siblings like get_last_voucher or mis_comprobantes, leaving ambiguity about when this specific retrieval is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'ya emitido' implies the voucher must already exist, but there is no explicit guidance on when to use this tool versus alternatives such as get_last_voucher or mis_comprobantes. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_voucher_typesObtener tipos de comprobantesBRead-only
Obtiene los tipos de comprobantes disponibles en AFIP (Factura A, B, C, Nota de Crédito, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true; the description is consistent with them and adds that the catalog is AFIP-defined (external source, so values are not controlled by the server). It says nothing about whether results are cached, complete, or ordered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that identifies the resource and its scope with no filler. The parenthetical examples earn their place by disambiguating the domain term.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param catalog with no output schema, the description omits what actually comes back (e.g. an id/code plus description) — the very field an agent needs to pass into create_voucher. Otherwise complete given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the description correctly implies a parameterless catalog fetch, so there is no parameter semantics to explain. Baseline for a 0-param tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Obtiene') and resource ('tipos de comprobantes disponibles en AFIP') and gives concrete examples (Factura A, B, C, Nota de Crédito) that pin down what a 'comprobante' is. It does not explicitly distinguish itself from closely named siblings like get_document_types or get_concept_types, which an agent could confuse with this catalog.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus the many sibling lookup tools, nor any mention that the returned codes are the prerequisite input for create_voucher. Usage is only inferable from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mis_comprobantesListar comprobantes (Mis Comprobantes)ARead-only
Inicia la automatización 'Mis Comprobantes' de ARCA para descargar comprobantes emitidos o recibidos por un CUIT. Este tool SIEMPRE ejecuta en modo asíncrono (wait=false) y devuelve sólo { id, status }. Para consultar el resultado final, usar el tool 'get_automation_details' con el id devuelto. Las credenciales (CUIT, username y password) se leen de la configuración.
| Name | Required | Description | Default |
|---|---|---|---|
| t | Yes | Tipo de comprobantes: 'E' (Emitidos) o 'R' (Recibidos). Si el usuario no lo especifica, preguntarle y no asumir esta información. | |
| wait | No | Ignorado: este tool siempre inicia la automatización en modo asíncrono (wait=false) y devuelve sólo { id, status }. Para obtener el resultado final, usar el tool 'get_automation_details' con el id devuelto. Las credenciales (CUIT, username y password) se toman desde la configuración del servidor (config). | |
| nroDoc | No | Número de documento del receptor. Sin puntos ni guiones (solo dígitos). Si no corresponde, omitir. | |
| tipoDoc | No | Código de tipo de documento del receptor (p. ej., 80=CUIT). Usar get_document_types si se requiere. | |
| puntosVenta | No | Lista de puntos de venta a filtrar. Si no se especifica, se incluyen todos. | |
| fechaEmision | Yes | Rango de fecha de emisión en formato 'DD/MM/YYYY - DD/MM/YYYY'. Validar coherencia de fechas. Si no está especificado, preguntar. | |
| comprobanteDesde | No | Número de comprobante desde (inclusive). | |
| comprobanteHasta | No | Número de comprobante hasta (inclusive). | |
| tiposComprobantes | No | Lista de tipos de comprobantes (códigos AFIP, p. ej. 11=Factura C). Obtenerlos con el tool get_voucher_types. | |
| codigoAutorizacion | No | Código de autorización (CAE) de 14 dígitos. Si no corresponde, omitir. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds genuinely non-obvious behavior: the run is always asynchronous, the response payload is fixed at { id, status }, and credentials (CUIT, username, password) come from server config rather than parameters. It stops short of saying whether repeated invocations spawn duplicate jobs or how failures surface, which keeps it at a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero redundancy: action, forced async contract plus return shape, then the next-step tool, then credential sourcing. The critical constraint (always async, only id/status) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, the description supplies exactly the missing pieces: the return shape { id, status }, the async contract, the follow-up tool, and where credentials come from. Nothing an agent needs to invoke and then poll it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 10 parameters is already documented in-schema (including the 't' enum prompt-to-ask rule and the date-range pattern). The description adds no syntax or format detail beyond the emitted/received concept, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: initiates the ARCA 'Mis Comprobantes' automation to download issued or received vouchers for a CUIT. The scope (emitted vs received, CUIT-based) and the asynchronous nature are clear enough to distinguish it from data-retrieval siblings like get_last_voucher or get_voucher_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the tool ALWAYS runs async (wait=false) and returns only { id, status }, then names the follow-up tool 'get_automation_details' with the returned id. This is a complete when/when-next routing instruction, not an implication.
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.
20 tool updates
v1.2.0- First observed
create_next_voucher - First observed
create_pdf - First observed
create_voucher - First observed
get_aliquot_types - First observed
get_automation_details - First observed
get_certificate_status - First observed
get_concept_types - First observed
get_cuit_from_dni - First observed
get_currencies_types - First observed
get_document_types - First observed
get_exchange_rate - First observed
get_last_voucher - First observed
get_options_types - First observed
get_sales_points - First observed
get_tax_condition_types - First observed
get_tax_types - First observed
get_taxpayer_details - First observed
get_voucher_info - First observed
get_voucher_types - First observed
mis_comprobantes
TDQS
Scored across 20 tools
Most tools target distinct resources or actions, and the many get_*_types catalog lookups are clearly separated by their respective AFIP type. The main overlap is create_voucher vs create_next_voucher, which both mint a voucher and differ only in explicit vs auto numbering, which could cause misselection without reading carefully.
The set follows a clean get_*/create_* verb_noun snake_case pattern throughout. The main deviation is 'mis_comprobantes', a Spanish, verbless name that breaks the otherwise consistent English convention (though get_currencies_types has a minor plural awkwardness).
At 20 tools the set is on the heavy side but each catalog lookup (concepts, document types, aliquots, taxes, etc.) maps to a genuine AFIP data domain, so most tools earn their place. The many independent get_*_types tools could in principle be consolidated, keeping it slightly above ideal.
The surface covers voucher creation (explicit and auto-numbered), retrieval, PDF generation, taxpayer lookup, certificate status, and full AFIP catalog discovery, plus an async automation for downloading comprobantes. The main gaps are no voucher listing/history or void/credit-note lifecycle beyond the generic create path, but core invoicing workflows are covered.
Maintenance
Related MCP Connectors
Hosted Argentine commerce MCP: real AFIP invoicing, MercadoPago, logistics, catalog & WhatsApp.
Argentina AFIP/ARCA electronic invoices for AI agents - issue & query facturas, get CAE via WSFE.
Brazilian fiscal MCP server - issue NF-e, NFC-e, NFS-e, CT-e, MDF-e and DC-e via SEFAZ.
MCP server for Flex on the Job: inventory, jobs, customers, invoices, purchasing, sales orders.
Related MCP Servers
- AlicenseAqualityFmaintenanceArgentine electronic invoicing (facturación electrónica) MCP Server for ARCA/AFIP. Emit invoices, manage credentials, check delegations, and look up taxpayers. 10 tools.12378 npmMIT
- AlicenseAqualityDmaintenanceMCP server for Italian electronic invoicing via the Invoicetronic API, enabling management of invoices through SDI with 20 tools for sending, receiving, exporting, and more.1826 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceMCP server to issue ARCA/AFIP Factura C for monotributistas using Afip SDK, PostgreSQL, and a secure preview-before-emission flow.MIT
- AlicenseNot gradedqualityCmaintenanceHosted 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