Skip to main content
Glama
Yoryoboy

ArcaMCP

by Yoryoboy

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 packageManager de package.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@latest

setup 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:

  1. Cloná el repositorio y entrá en su directorio.

  2. Ejecutá pnpm install.

  3. Ejecutá pnpm run dev setup --dev o creá el archivo .env a mano, y verificá con pnpm run dev doctor.

  4. Iniciá el servidor con pnpm run dev o el Inspector con pnpm 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 con AFIP_PRODUCTION=false): ruta absoluta o relativa al certificado .crt de desarrollo.

  • AFIP_DEV_KEY_PATH (obligatorio con AFIP_PRODUCTION=false): ruta al .key de desarrollo.

  • AFIP_PROD_CERT_PATH (obligatorio con AFIP_PRODUCTION=true): ruta al certificado .crt de producción.

  • AFIP_PROD_KEY_PATH (obligatorio con AFIP_PRODUCTION=true): ruta al .key de producción.

  • AFIP_PRODUCTION: true para producción, false para 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(...) en src/services/afip/client.ts.

  • Si AFIP_PRODUCTION=true, deben existir AFIP_PROD_CERT_PATH, AFIP_PROD_KEY_PATH y, si aplica, AFIP_SDK_ACCESS_TOKEN.

Estructura del proyecto

  • src/config.ts: carga .env y expone configuración.

  • src/services/afip/client.ts: inicializa el cliente de @afipsdk/afip.js con certificados y CUIT.

  • src/index.ts: punto de entrada del bin arcamcp (servidor MCP o comandos setup/doctor).

  • src/server.ts: registra tools y prompts e inicia el servidor MCP por stdio.

  • src/cli/: comandos setup (certificado + autorización de servicios + .env) y doctor.

  • certs/: carpeta sugerida para ubicar certificados (./certs/dev y ./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.

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 --prod

setup:

  1. Toma AFIP_CUIT, AFIP_CERT_ALIAS, AFIP_SDK_ACCESS_TOKEN y AFIP_PASSWORD del 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.

  2. Crea el certificado con la automatización create-cert-dev o create-cert-prod y lo guarda en ./certs/dev/ o ./certs/prod/ (<env>_certificado.crt y <env>_private.key, esta última con permisos 600).

  3. Crea o actualiza .env con AFIP_CUIT, AFIP_CERT_ALIAS, AFIP_SDK_ACCESS_TOKEN y las rutas absolutas AFIP_<DEV|PROD>_CERT_PATH / AFIP_<DEV|PROD>_KEY_PATH, conservando el resto de las líneas. Solo agrega AFIP_PRODUCTION si no existe. La clave fiscal nunca se guarda.

  4. Autoriza wsfe y ws_sr_padron_a13 con auth-web-service-dev o auth-web-service-prod.

  5. 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 .env desde su directorio de trabajo. Si tu cliente MCP lo inicia desde otro directorio, copiá las variables al bloque env del cliente (el que imprime setup).

4) Verificar la configuración

npx -y @yoryoboy/arcamcp@latest doctor

doctor 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 dev

    Esto lanza src/index.ts con tsx en modo desarrollo.

  • Inspector MCP (diagnóstico):

    pnpm run inspector

    Utiliza @modelcontextprotocol/inspector contra 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 -dates

Despué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_voucher y create_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 id y status. No contiene todavía los datos finales; es el identificador de la ejecución.

  • Consulta del resultado: usa posteriormente el tool get_automation_details con ese id para 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 status indique ejecución en curso, vuelve a consultar más tarde con el mismo id.

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 CbteNro sea el correcto antes de crear el PDF.

Solución de problemas (troubleshooting)

  • Certificados no encontrados o error ENOENT:

    • Revisa rutas en .env (AFIP_*_CERT_PATH y AFIP_*_KEY_PATH). Puedes usar rutas absolutas o relativas al raíz del proyecto.

  • AFIP_PRODUCTION=true pero faltan variables:

    • Define AFIP_PROD_CERT_PATH, AFIP_PROD_KEY_PATH y AFIP_SDK_ACCESS_TOKEN si 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 en details.issues (por ejemplo Falta AFIP_PROD_CERT_PATH.). get_certificate_status también los informa. Corregí la configuración y reiniciá el servidor MCP.

    • AFIP_PASSWORD y AFIP_CERT_ALIAS no 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 env a 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) o create_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 .env ni 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-mejora o fix/mi-bug).

    • Instala dependencias con pnpm install y prueba en local con pnpm run dev.

    • Asegúrate de que el código compile (pnpm run build) y que pase pnpm run quality.

    • Incluye documentación actualizada en README.md cuando 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.json y tsconfig.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 tools
create_next_voucherCrear próximo comprobante electrónicoA
Destructive

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.

NameRequiredDescriptionDefault
IvaNoAlícuotas e importes de IVA asociados. Para comprobantes tipo C y Bienes Usados – Monotributista no debe informarse
MonIdYesCódigo de moneda (ej: PES). Consultar método FEParamGetTiposMonedas
DocNroNoNú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)
ImpIVAYesSuma de importes de IVA. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0
PtoVtaYesPunto 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
CbteFchYesFecha 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
DocTipoYesCó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
ImpNetoYesImporte neto gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C corresponde al Subtotal. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0
ImpOpExYesImporte exento. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0
ImpTribYesSuma de los importes de tributos
CbteTipoYesTipo 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.
ConceptoYesConcepto del comprobante. Valores permitidos: 1=Productos, 2=Servicios, 3=Productos y Servicios
ImpTotalYesImporte 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)
MonCotizYesCotización de la moneda. Para PES debe ser 1
TributosNoTributos asociados al comprobante
CbtesAsocNoComprobantes asociados
FchVtoPagoNoFecha 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
ImpTotConcYesImporte neto no gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Emisor Monotributista, corresponde al subtotal
OpcionalesNoCampos auxiliares reservados para usos futuros
FchServDesdeNoFecha 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
FchServHastaNoFecha 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
CondicionIVAReceptorIdYesCondició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

A3.8/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
MonIdNoCódigo de moneda (ej: PES)PES
DocNroNoNú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.
PtoVtaYesPunto de venta del comprobante. Se le debe agregar '0000' al inicio. Por ejemplo, si es 2, se pone '00002'
CbteFchYesFecha del comprobante
CbteNroYesNúmero del comprobante
CbteTipoYesCó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.
ConceptoYesConcepto del comprobante: 1=Productos, 2=Servicios, 3=Productos y Servicios
MonCotizNoCotización moneda
SUBTOTALYesSubtotal de la factura
CbteLetraYesLetra 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_NUMBERYesNúmero de autorización del comprobante
FchVtoPagoNoFecha 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.
TipoCodAutNoTipo de autorización del comprobante para QR: 'E' (CAE) o 'A' (CAEA)E
FchServDesdeNoFecha 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.
FchServHastaNoFecha 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_TOTALYesImporte total de la factura
INVOICE_ITEMSNoÍtems de factura
CONDICION_PAGONoCondició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_DATEYesFecha de vencimiento de la autorización
INGRESOS_BRUTOSYesCondición obligatoria de Ingresos Brutos; Local y Convenio Multilateral requieren inscripción.
NOMBRE_RECEPTORYesNombre del receptor. En caso de no ser necesario declarar el receptor, se puede omitir. Dejar espacio en blanco
CondicionIVAEmisorYesCondició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_RECEPTORNoDirecció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
CondicionIVAReceptorYesEn caso de ser consumidor final, simplemente poner 'Consumidor Final'
IMPORTE_OTROS_TRIBUTOSNoImporte de otros tributos
FECHA_INICIO_ACTIVIDADESYesFecha legal de inicio de actividades en formato YYYY-MM-DD
DIRECCION_EMISOR_SELECCIONADANoDomicilio 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

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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ónicoC
Destructive

Crear un comprobante electrónico en AFIP con CAE asignado

NameRequiredDescriptionDefault
IvaNoAlícuotas e importes de IVA asociados. Para comprobantes tipo C y Bienes Usados – Monotributista no debe informarse
MonIdYesCódigo de moneda (ej: PES). Consultar método FEParamGetTiposMonedas
DocNroNoNú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)
ImpIVAYesSuma de importes de IVA. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0
PtoVtaYesPunto 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
CantRegYesCantidad de registros del detalle del comprobante o lote de comprobantes de ingreso
CbteFchYesFecha 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
DocTipoYesCó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
ImpNetoYesImporte neto gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C corresponde al Subtotal. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0
ImpOpExYesImporte exento. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Monotributista: no debe informarse o debe ser = 0
ImpTribYesSuma de los importes de tributos
CbteTipoYesTipo 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.
ConceptoYesConcepto del comprobante. Valores permitidos: 1=Productos, 2=Servicios, 3=Productos y Servicios
ImpTotalYesImporte 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)
MonCotizYesCotización de la moneda. Para PES debe ser 1
TributosNoTributos asociados al comprobante
CbteDesdeYesNro. de comprobante desde. Rango 1 – 99999999
CbteHastaYesNro. de comprobante hasta. Rango 1 – 99999999
CbtesAsocNoComprobantes asociados
FchVtoPagoNoFecha 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
ImpTotConcYesImporte neto no gravado. ≤ ImpTotal y ≥ 0. Para comprobantes tipo C debe ser = 0. Para Bienes Usados – Emisor Monotributista, corresponde al subtotal
OpcionalesNoCampos auxiliares reservados para usos futuros
FchServDesdeNoFecha 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
FchServHastaNoFecha 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
fullResponseNoSi es true, devuelve la respuesta completa del WS. Si es false o no se especifica, devuelve solo CAE y CAEFchVto
CondicionIVAReceptorIdYesCondició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

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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ícuotasA
Read-only

Obtiene los tipos de alícuotas de IVA disponibles en AFIP (0%, 10.5%, 21%, 27%, etc.).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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ónA
Read-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.

NameRequiredDescriptionDefault
idYesID de la automatización retornado por 'mis_comprobantes'. Debe pegar aquí el ID para consultar el estado o recuperar el resultado final.
waitNoIgnorado: este tool siempre consulta en modo no bloqueante (wait=false). Si la automatización sigue en proceso, devolverá { id, status: 'in_process' }.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, 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.

Conciseness5/5

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.

Completeness4/5

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

With no output schema, the description 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-only

Returns the loaded X.509 certificate validity status without exposing certificate, key, identity, issuer, subject, or local paths.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 conceptosA
Read-only

Obtiene los tipos de conceptos disponibles en AFIP (Productos, Servicios, Productos y Servicios).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 DNIC
Read-only

Obtiene el CUIT de un contribuyente a partir de su DNI

NameRequiredDescriptionDefault
nationalIdYesDNI del contribuyente

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 monedasA
Read-only

Obtiene los tipos de monedas disponibles en AFIP (ARS, USD, EUR, etc.).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 documentosA
Read-only

Obtiene los tipos de documentos disponibles en AFIP (DNI, CUIT, CUIL, Pasaporte, etc.).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 monedaB
Read-only

Obtiene la cotización de una moneda específica para una fecha determinada desde AFIP.

NameRequiredDescriptionDefault
MonIdYesID de la moneda a consultar (ej: 'DOL' para dólares)
FchCotizYesFecha de la cotización en formato AAAAMMDD (ej: '20250221')

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 creadoC
Read-only

Obtener número último comprobante creado

NameRequiredDescriptionDefault
PtoVtaYesPunto de venta
CbteTipoYesTipo de comprobante

TDQS

C2.3/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose2/5

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.

Usage Guidelines2/5

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 opcionesC
Read-only

Obtiene los tipos de opciones disponibles para los comprobantes en AFIP.

NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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 disponiblesA
Read-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).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 IVAA
Read-only

Obtiene los tipos de condiciones frente al IVA disponibles en AFIP (Responsable Inscripto, Monotributista, Exento, etc.).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

With no output schema, the description 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 contribuyenteC
Read-only

Obtiene los datos completos de un contribuyente a partir de su CUIT

NameRequiredDescriptionDefault
taxIdYesCUIT del contribuyente a consultar

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 tributosA
Read-only

Obtiene los tipos de tributos disponibles en AFIP (IIBB, impuestos municipales, etc.).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 comprobanteB
Read-only

Obtener información completa de un comprobante ya emitido en AFIP

NameRequiredDescriptionDefault
PtoVtaYesPunto de venta del comprobante
CbteNroYesNúmero de comprobante a consultar
CbteTipoYesTipo de comprobante informado. Consultar FEParamGetTiposCbte

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

For a read-only tool with 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 comprobantesB
Read-only

Obtiene los tipos de comprobantes disponibles en AFIP (Factura A, B, C, Nota de Crédito, etc.).

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)A
Read-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.

NameRequiredDescriptionDefault
tYesTipo de comprobantes: 'E' (Emitidos) o 'R' (Recibidos). Si el usuario no lo especifica, preguntarle y no asumir esta información.
waitNoIgnorado: 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).
nroDocNoNúmero de documento del receptor. Sin puntos ni guiones (solo dígitos). Si no corresponde, omitir.
tipoDocNoCódigo de tipo de documento del receptor (p. ej., 80=CUIT). Usar get_document_types si se requiere.
puntosVentaNoLista de puntos de venta a filtrar. Si no se especifica, se incluyen todos.
fechaEmisionYesRango de fecha de emisión en formato 'DD/MM/YYYY - DD/MM/YYYY'. Validar coherencia de fechas. Si no está especificado, preguntar.
comprobanteDesdeNoNúmero de comprobante desde (inclusive).
comprobanteHastaNoNúmero de comprobante hasta (inclusive).
tiposComprobantesNoLista de tipos de comprobantes (códigos AFIP, p. ej. 11=Factura C). Obtenerlos con el tool get_voucher_types.
codigoAutorizacionNoCódigo de autorización (CAE) de 14 dígitos. Si no corresponde, omitir.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 20 tool updatesv1.2.0
    • First observedcreate_next_voucher
    • First observedcreate_pdf
    • First observedcreate_voucher
    • First observedget_aliquot_types
    • First observedget_automation_details
    • First observedget_certificate_status
    • First observedget_concept_types
    • First observedget_cuit_from_dni
    • First observedget_currencies_types
    • First observedget_document_types
    • First observedget_exchange_rate
    • First observedget_last_voucher
    • First observedget_options_types
    • First observedget_sales_points
    • First observedget_tax_condition_types
    • First observedget_tax_types
    • First observedget_taxpayer_details
    • First observedget_voucher_info
    • First observedget_voucher_types
    • First observedmis_comprobantes

TDQS

B3.3/5.0

Scored across 20 tools

Disambiguation4/5

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.

Naming Consistency4/5

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).

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Argentine electronic invoicing (facturación electrónica) MCP Server for ARCA/AFIP. Emit invoices, manage credentials, check delegations, and look up taxpayers. 10 tools.
    12
    378 npm
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for Italian electronic invoicing via the Invoicetronic API, enabling management of invoices through SDI with 20 tools for sending, receiving, exporting, and more.
    18
    26 PyPI
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Hosted MCP server for Argentine commerce: real AFIP/ARCA fiscal invoicing (live CAE), MercadoPago payments, logistics, catalog, cash register and WhatsApp behind one authenticated endpoint. Includes 9 no-auth fiscal validation/formatting tools.
    MIT