Sifende MCP Server
Sifende MCP connects MCP clients to a Sifende account to query SIFEN e-documents and, if enabled, issue and manage fiscal documents locally with your API key.
Inspect the server environment, version, and whether write tools are enabled.
Query a document’s status by CDC and download its KuDE PDF.
Look up your taxpayer data, RUC/cédula in the SET padrón, and plan usage.
List valid API enumerations, SIFEN geography codes, and registered events.
Calculate document totals locally with SET rounding and get example document payloads.
With
SIFENDE_MCP_ALLOW_WRITE=true, issue invoices, credit/debit notes, remission notes, and self-invoices; cancel documents, void numbering ranges, and nominate recipients.Access bundled guides, docs index, and example resources.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Sifende MCP Serverconsultá el estado del documento con CDC 01234567890123456789012345678901234567890123"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@sifende/mcp
Servidor MCP oficial de Sifende. Conecta Claude, Cursor y otros clientes MCP a tu cuenta de Sifende para que puedas pedir en lenguaje natural lo que hoy hacés con la API: consultar documentos electrónicos de SIFEN, descargar el KuDE, buscar un RUC en el padrón y, si lo habilitás, emitir facturas, notas y eventos.
Corre en tu máquina, por
stdio, con tu propia API key. No hay servidor intermedio ni se envía nada a terceros.Arranca en solo lectura. Para emitir tenés que habilitarlo con una variable.
Usa el SDK oficial
@sifende/sdk, con los mismos reintentos seguros, idempotencia y cálculo de totales que la API.
Primeros pasos
Necesitás Node.js 22.18 o superior y un cliente MCP. No hace falta instalar nada: el cliente ejecuta el servidor con npx.
1. Creá una API key de Sandbox
En el panel de Sifende, entrá a API Keys → Crear API Key y creá una de Sandbox: empieza con sk_sandbox_ (guía). Con ella podés emitir sin enviar nada a SIFEN.
2. Agregá el servidor a tu cliente
Claude Code
claude mcp add sifende --env SIFENDE_API_KEY=sk_sandbox_... -- npx -y @sifende/mcpClaude Desktop. Abrí Configuración → Desarrollador → Editar configuración, agregá este bloque a claude_desktop_config.json y reiniciá Claude Desktop:
{
"mcpServers": {
"sifende": {
"command": "npx",
"args": ["-y", "@sifende/mcp"],
"env": {
"SIFENDE_API_KEY": "sk_sandbox_..."
}
}
}
}Cursor. El mismo bloque va en ~/.cursor/mcp.json, o en .cursor/mcp.json para un solo proyecto. También sirve para otros clientes con el formato mcpServers (Windsurf, Cline, Zed con su variante, etc.).
3. Probá una consulta
¿Con qué ambiente estás conectado y cuántos documentos me quedan en el plan?
El modelo llama a informacion_servidor y consultar_consumo_plan. Si responde "Sandbox", ya está funcionando.
4. Emití tu primera factura de prueba
Para que el modelo pueda emitir, agregá SIFENDE_MCP_ALLOW_WRITE=true al bloque env y reiniciá el cliente:
"env": {
"SIFENDE_API_KEY": "sk_sandbox_...",
"SIFENDE_MCP_ALLOW_WRITE": "true"
}En Claude Code, volvé a agregar el servidor con --env SIFENDE_MCP_ALLOW_WRITE=true (antes borralo con claude mcp remove sifende).
Después pedile:
Emití una factura al contado por 2 remeras a 150.000 Gs y un envío de 25.000 Gs, IVA 10%, para Juan Pérez, cédula 1234567. Cuando esté aprobada, bajame el KuDE.
El modelo calcula el total con calcular_totales, revisa los valores válidos con listar_enumeraciones, emite, consulta el estado hasta que SIFEN lo aprueba y guarda el PDF. Tu cliente te va a pedir confirmación antes de emitir.
Related MCP server: peru-invoice-mcp
Ambientes
El prefijo de la API key decide el ambiente. No hay otra URL ni otra configuración.
Prefijo | Ambiente | Validez fiscal | Eventos (cancelar, inutilizar, nominar) |
| Sandbox de Sifende. No se envía a SIFEN. | No | No. Las herramientas de eventos no aparecen. |
| Ambiente de pruebas de SIFEN. | No | Sí |
| Producción. | Sí | Sí |
Para probar eventos, usá una API key sk_test_. Para saber con qué ambiente está conectado el servidor, preguntale al modelo o llamá a informacion_servidor.
Qué le podés pedir
Consultas (siempre disponibles):
¿En qué estado está el documento con CDC 01800123450010010000001...?
Buscá el RUC 80012345 en el padrón y decime la razón social.
Bajame el KuDE del documento 01800123450010010000001...
¿Qué códigos de unidad de medida acepta SIFEN?
Con la escritura habilitada:
Cancelá la factura con CDC 01800123450010010000001..., el cliente la rechazó.
Inutilizá las facturas 50 a 60 del timbrado 12345678, establecimiento 001, punto 001. Se saltaron por un error del sistema.
Hacé una nota de crédito por la devolución de una de las remeras de la factura anterior.
Antes de usar sk_live_
Con una API key sk_live_, cada emisión es un documento fiscal real a nombre de tu contribuyente.
Supervisá cada operación. Un modelo puede equivocarse en un importe, un receptor o un tipo de documento. Un documento aprobado por SIFEN solo se deshace con una cancelación dentro de las 48 horas (facturas) o 168 horas (notas).
Revisá los datos antes de aceptar una herramienta de escritura. Los clientes MCP piden confirmación por herramienta. No la desactives con
sk_live_.Dejá
SIFENDE_MCP_ALLOW_WRITEapagado cuando solo necesites consultar. Al arrancar con escritura habilitada ysk_live_, el servidor escribe una advertencia en stderr.Tratá la API key como una contraseña. Queda en texto plano en la configuración del cliente: no la subas a un repositorio.
Corré el servidor solo en tu máquina. No lo expongas por red ni lo incluyas en una app que distribuyas.
Referencia
Variables de entorno
Variable | Por defecto | Qué hace |
| Obligatoria. Su prefijo define el ambiente. | |
|
| Con |
| carpeta temporal del sistema | Carpeta donde |
|
| Solo para apuntar a otro host. |
Herramientas de lectura
Siempre disponibles.
Herramienta | Qué hace |
| Ambiente, versión y si la escritura está habilitada. No usa la red. |
| Estado de un documento por CDC ( |
| Guarda el KuDE (PDF) de un documento aprobado en un archivo local y devuelve la ruta. Opcionalmente lo incluye en base64. |
| RUC, razón social, ambiente y actividades del contribuyente de la API key. |
| Busca un RUC o cédula en el padrón de la SET y devuelve los datos con los nombres de campo del receptor. |
| Plan vigente y documentos incluidos, consumidos y disponibles. |
| Valores válidos de cada enumeración de la API: tipos de pago, unidades de medida, monedas, países, etc. |
| Departamentos, distritos y ciudades con sus códigos SIFEN. |
| Eventos registrados (cancelación, inutilización, nominación) y su estado ante SIFEN. |
| Total de un documento con el redondeo oficial de la SET. Se calcula localmente, sin llamar a la API. |
| Documentos de ejemplo con datos ficticios: factura al contado B2C y B2B, factura a crédito en cuotas, nota de crédito y nota de débito. |
Herramientas de escritura
Solo aparecen con SIFENDE_MCP_ALLOW_WRITE=true. Con una API key sk_sandbox_ aparece solo emitir_documento, porque Sandbox no admite eventos.
Herramienta | Qué hace | Anotaciones |
| Emite una factura, nota de crédito, nota de débito, nota de remisión o autofactura. Responde con el CDC en estado |
|
| Cancela un documento aprobado (48 h para facturas, 168 h para notas). |
|
| Da de baja un rango de numeración sin usar. |
|
| Identifica al receptor de una factura emitida como innominada. |
|
emitir_documento y nominar_documento no se marcan como destructivas porque solo agregan: no modifican ni borran lo que ya está registrado. Aun así no tienen vuelta atrás (un documento emitido solo se anula con una cancelación dentro del plazo), y con una API key sk_live_ las cuatro descripciones le advierten al modelo que registran operaciones fiscales reales y que confirme los datos con el usuario.
Recursos
URI | Contenido |
| Flujo de emisión, reglas del documento y eventos. |
| Índice de la documentación, descargado de sifende.com.py. |
| Los mismos documentos de ejemplo de |
Errores
Los errores de la API (Problem Details, RFC 9457) le llegan al modelo como texto legible: el código, el detalle, cada campo inválido, los valores aceptados cuando falla una enumeración, el traceId para soporte y el enlace a la documentación del error.
Si se corta la conexión al emitir o registrar un evento, no se sabe si la operación se hizo. El mensaje incluye la idempotencyKey usada: si el modelo repite la llamada con esa misma idempotencyKey, recibe el resultado original y no se duplica el documento. emitir_documento y los eventos siempre devuelven la idempotencyKey que usaron.
Desarrollo
git clone https://github.com/ithdev/sifende-mcp
cd sifende-mcp
npm ci
npm run lint && npm run typecheck && npm test && npm run buildLos tests levantan el servidor MCP en memoria y simulan la API con un fetch falso, sin llamadas de red.
Probarlo con el Inspector
# Listar las herramientas
npx @modelcontextprotocol/inspector --cli -e SIFENDE_API_KEY=sk_sandbox_... node dist/index.mjs --method tools/list
# Llamar una herramienta
npx @modelcontextprotocol/inspector --cli -e SIFENDE_API_KEY=sk_sandbox_... node dist/index.mjs \
--method tools/call --tool-name listar_enumeraciones --tool-arg nombre=tipoPago
# Interfaz web. El Inspector no hereda el entorno: pasá la API key en la interfaz o con -e.
SIFENDE_API_KEY=sk_sandbox_... npm run inspectorPublicar una versión
Los pasos para publicar en npm y en el MCP Registry están en RELEASING.md.
Soporte
Errores del servidor MCP: abrí un issue.
Vulnerabilidades: reportalas en privado, como explica SECURITY.md.
Tu cuenta, tus documentos o la API: escribinos a soporte@sifende.com.py.
Licencia
Apache 2.0. Copyright 2026 ITH E.A.S.; ver NOTICE.
Available Tools
12 toolscalcular_totalesCalcular totales de un documentoARead-only
Calcula el total de un documento con las mismas reglas que valida Sifende, incluido el redondeo oficial de la SET (en guaraníes, al múltiplo de 50 inferior). Usala para obtener el montoPago exacto de una venta al contado antes de emitir. Los precios incluyen IVA. Es un cálculo local, sin llamar a la API.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Ítems del documento, con los mismos nombres de campo que en emitir_documento. | |
| comision | No | Comisión de la operación, con IVA 10% incluido. | |
| tipoCambio | No | Tipo de cambio global; obligatorio fuera de PYG si los ítems no traen el suyo. | |
| monedaOperacion | No | Código de moneda de la operación. Por defecto PYG (guaraníes). | PYG |
| descuentoGlobalPorcentaje | No | Porcentaje de descuento global aplicado a cada ítem. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Es un cálculo local, sin llamar a la API', which is valuable confirmation rather than contradiction. It also discloses the non-obvious rounding behavior (lower multiple of 50) and that prices include IVA. It does not describe the shape of the returned totals beyond mentioning montoPago.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the verb and resource, then rounding rule, use case, and locality. Every sentence carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a local computation tool with no output schema and fully documented parameters, the description covers rules, locality, and the key use case. It could be slightly stronger by stating what the returned totals contain (beyond montoPago), but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema; the description adds no per-parameter syntax or constraints. The note that prices include IVA and that field names match emitir_documento is helpful but closely mirrors what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Calcula el total de un documento') and scopes it to Sifende validation rules and the official SET rounding in guaraníes. An agent can distinguish it from the sibling read/query tools (consultar_documento, listar_eventos) because it produces a computed total rather than retrieving stored data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'para obtener el montoPago exacto de una venta al contado antes de emitir', giving a concrete triggering condition and workflow position. It does not state when NOT to use it (e.g. for crédito or for already-issued documents), so it falls short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_consumo_planConsultar el consumo del planARead-only
Muestra el plan vigente del contribuyente y su consumo del período: documentos incluidos, consumidos, reservados y disponibles, si admite documentos adicionales y el costo estimado en guaraníes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that by disclosing what the response contains — included, consumed, reserved, and available documents, whether extra documents are allowed, and the estimated cost in guaraníes — which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that opens with the action and resource, then lists the returned fields. Every clause carries information; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description does the necessary work of enumerating the returned fields and is backed by read-only/open-world annotations. The only gap is that it never clarifies whose plan is returned (presumably the authenticated taxpayer) or the response format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema-baseline is 4. There is nothing for the description to disambiguate, and it correctly avoids inventing parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Muestra') and a precise resource (el plan vigente del contribuyente y su consumo del período), then enumerates the exact data points returned (documentos incluidos/consumidos/reservados/disponibles, documentos adicionales, costo estimado en guaraníes). The resource is naturally distinct from siblings like consultar_contribuyente or consultar_documento, but the description never explicitly differentiates itself from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content: an agent can infer this is the tool for checking plan quota/consumption status. However, there is no explicit when-to-use statement, no prerequisites (e.g., whether authentication determines the taxpayer), and no named alternatives among the many sibling 'consultar_*' tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_contribuyenteConsultar el contribuyente de la API keyARead-only
Devuelve los datos del contribuyente dueño de la API key: RUC, razón social, tipo, ambiente, actividades económicas y domicilio. Es el emisor de todos los documentos.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully clarifies that the scope is bound to the caller's API key (no parameters to choose a contribuyente), which is real added context, but it says nothing about failure modes (invalid/expired key) or response shape beyond the field list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: the first front-loads the action and the returned fields, the second adds a single clarifying identity fact. Nothing is wasted and nothing important is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of describing what comes back, and it does so by enumerating the six field categories. It stops short of describing structure or error behavior, which keeps it from a 5 for a zero-argument, no-output-schema tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description reinforces this by explaining that the subject is implicitly 'dueño de la API key', which explains why no identifier is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Devuelve los datos del contribuyente dueño de la API key') and enumerates the returned fields (RUC, razón social, tipo, ambiente, actividades económicas, domicilio). The added line 'Es el emisor de todos los documentos' clarifies what the resource conceptually is, so an agent can distinguish it from siblings like consultar_padron or informacion_servidor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Es el emisor de todos los documentos' hints this is the root entity to consult before working with documents, but there is no explicit when-to-use, when-not-to-use, or named alternative among the eleven siblings. An agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_documentoConsultar estado de un documentoARead-only
Consulta el estado de un documento electrónico por su CDC: PENDIENTE o un estado terminal, que puede ser APROBADO, APROBADO_OBSERVACION (también es éxito), RECHAZADO, CANCELADO o ERROR. Incluye el protocolo de autorización de SIFEN y, si fue rechazado, el motivo (mensajeRechazo).
| Name | Required | Description | Default |
|---|---|---|---|
| cdc | Yes | CDC (Código de Control del Documento Electrónico): 44 dígitos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description is consistent with a read-only external query. It adds real value by disclosing what is returned: the SIFEN authorization protocol and, for rejected documents, the mensajeRechazo reason. It does not mention rate limits, retry expectations for PENDIENTE, or response shape beyond the status fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key resource first and the outcome space immediately after. The state enumeration is dense but every item earns its place because it defines what callers must branch on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, no output schema, and light annotations, the description carries most of the burden of describing returns and does so well by naming the state space plus the authorization protocol and rejection reason. It stops short of describing the full response structure or whether PENDIENTE should be re-queried.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single cdc parameter is fully documented in the schema with its 44-digit pattern. The description only restates 'por su CDC', adding no format, validation, or acquisition guidance (e.g., how to obtain a CDC) beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: consulting the status of an electronic document identified by its CDC. The enumeration of possible states (PENDIENTE, APROBADO, APROBADO_OBSERVACION, RECHAZADO, CANCELADO, ERROR) makes the output domain unambiguous. It does not explicitly contrast itself with siblings such as consultar_evento, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this versus alternatives like consultar_evento or descargar_kude. Usage is only implied: the distinction between PENDIENTE and terminal states hints that the caller should poll until a terminal state is reached. That implication is genuinely useful but never stated as guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_eventoConsultar un eventoARead-only
Detalle de un evento por su id (eventoSifenId): estado (APROBADO o RECHAZADO), código y mensaje de respuesta de SIFEN. Confirmá el resultado de una cancelación, nominación o inutilización con esta herramienta.
| Name | Required | Description | Default |
|---|---|---|---|
| eventoId | Yes | Id del evento (eventoSifenId). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no output schema, the description usefully discloses what the call returns (status APROBADO/RECHAZADO, response code and message). Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds genuine return-value context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the identification-and-return detail front-loaded and the usage hint second. No redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-id read-only lookup with no output schema, the description covers both what it returns and when to use it, which is nearly everything the agent needs. Minor gap: it doesn't state behavior when the id does not exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single eventoId parameter is fully documented in the schema and the description only restates its meaning (eventoSifenId). Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (detalle de un evento por su id) and enumerates exactly what it returns (estado, código, mensaje de respuesta de SIFEN). This clearly differentiates it from the sibling listar_eventos, which lists rather than fetches a single event by id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence gives an explicit use case: confirm the result of a cancelación, nominación, or inutilización. It tells the agent when to reach for this tool, though it doesn't name an alternative tool for other scenarios (e.g. listing events).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_geografiaConsultar departamentos, distritos y ciudadesARead-only
Catálogo geográfico de SIFEN para domicilios. nivel "departamentos" lista todos; "distritos" lista los de un departamento (id = departamentoId); "ciudades" lista las de un distrito (id = distritoId). Los códigos se usan en el domicilio del receptor.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Obligatorio para "distritos" (id del departamento) y "ciudades" (id del distrito). | |
| nivel | Yes | Nivel que se quiere listar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered without the description. The description adds the hierarchical dependency between nivel and id plus the fact that results feed receptor addresses, but it says nothing about result size, ordering, caching, or failure behavior for "departamentos" which lists everything.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and then the per-level rules; nothing is redundant padding and the critical per-mode constraint comes before the closing context sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter read-only lookup with full schema coverage and annotations, the description covers purpose, mode semantics and id requirements. The only gap is that no output schema exists and the description never indicates what a result item looks like (code plus name), leaving the agent to infer the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both `id` (required for distritos/ciudades, with which entity's id) and `nivel` (enum). The description restates the same rules in prose, reinforcing but not extending them beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (SIFEN geographic catalog for domiciles) and enumerates its three modes (departamentos, distritos, ciudades) with their scoping rules. No sibling tool touches geography, so the agent can distinguish it from the rest of the toolset immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states concretely when each nivel applies and that `id` is required for the two sub-levels, which is exactly the decision the agent must make before calling. It also gives the downstream purpose ("Los códigos se usan en el domicilio del receptor"), though it names no alternative tool or exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consultar_padronConsultar RUC o cédula en el padrónARead-only
Busca un RUC o una cédula en el padrón de la SET y devuelve razón social, tipo de contribuyente y domicilio, con los mismos nombres de campo que el receptor de un documento. Usala para completar el receptor de una factura. Acepta el número con o sin puntos y con o sin dígito verificador.
| Name | Required | Description | Default |
|---|---|---|---|
| documento | Yes | RUC o cédula, por ejemplo "80012345-0", "80012345" o "1.234.567". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true), so the bar is lower. The description adds genuine value by disclosing the return fields and the fact that field names mirror the document receiver — important since there is no output schema — plus the accepted input-format tolerance. It does not mention lookup-failure behavior (e.g., not-found vs. error) or any rate/coverage limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the operation and return shape; nothing is padding. There is slight overlap between the 'same field names as the receiver' clause and the 'use it to complete the receiver' clause, which keeps it just short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup with full schema coverage, the description covers purpose, return content, and input flexibility, which is sufficient. The only gap is what the agent should expect when the identifier is absent from the padrón, which matters for downstream error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description explicitly adds format tolerance beyond the schema examples: dots and check digit are both optional. That is meaningful disambiguation for a free-text identifier that an agent might otherwise over-validate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Busca un RUC o una cédula en el padrón de la SET') and enumerates exactly what comes back (razón social, tipo de contribuyente, domicilio), which separates it from siblings like consultar_contribuyente or consultar_documento. An agent can identify the operation and its payload without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('Usala para completar el receptor de una factura'), which is clear context for when to reach for it. It does not, however, exclude or name alternatives, even though several siblings (consultar_contribuyente, consultar_documento) could plausibly be confused with it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
descargar_kudeDescargar el KuDE (PDF)AIdempotent
Descarga el KuDE (representación gráfica en PDF) de un documento APROBADO y lo guarda en un archivo local; devuelve la ruta. Si el PDF todavía se está preparando, espera hasta esperarSegundos y, si no llega, avisa para reintentar. Con una API key sandbox el PDF dice "SIN VALIDEZ FISCAL". Con incluirBase64 devuelve además el PDF embebido, que pesa mucho en el contexto del modelo: usalo solo si el cliente no puede leer el archivo.
| Name | Required | Description | Default |
|---|---|---|---|
| cdc | Yes | CDC (Código de Control del Documento Electrónico): 44 dígitos. | |
| incluirBase64 | No | Incluir el PDF embebido en la respuesta. Por defecto no. | |
| esperarSegundos | No | Cuánto esperar a que el PDF esté listo. Por defecto 45 s; el máximo es 170 s. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: it writes a local file (explaining why readOnlyHint=false while destructiveHint=false), polls up to esperarSegundos and signals a retry if the PDF isn't ready, watermarks output as 'SIN VALIDEZ FISCAL' under a sandbox key, and warns that the embedded base64 payload is context-heavy. None of this is recoverable from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary action and return value, then edge cases (polling/retry, sandbox watermark, base64 cost). No filler; every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return (local path plus optional embedded PDF) and covers the tricky async/retry case. It omits what happens when the document is not APPROVED or on auth failure, but for a 3-parameter tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds real meaning on top: esperarSegundos is framed as the timeout after which the tool advises retrying, and incluirBase64 is given a concrete decision rule (client can't read the file) plus a cost warning absent from the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (descarga), resource (KuDE / representación gráfica en PDF), scope (documento APROBADO) and outcome (guarda en archivo local y devuelve la ruta). This clearly differentiates it from read-oriented siblings like consultar_documento or obtener_ejemplo_documento.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: only for APPROVED documents, and explains the conditional behavior when the PDF is still being prepared (wait then retry). It also scopes incluirBase64 to 'solo si el cliente no puede leer el archivo'. It does not explicitly name a sibling alternative to route away to, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
informacion_servidorInformación del servidor SifendeARead-only
Muestra con qué ambiente está conectado este servidor (Sandbox, pruebas con SIFEN o producción), si las herramientas de escritura están habilitadas y la versión. No hace llamadas a la red.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false; the description corroborates and reinforces this in plain language ("No hace llamadas a la red") and, more usefully, discloses the returned fields so the agent knows exactly what diagnostic data it gets back. It does not add anything about frequency, cost, or failure modes, but for a zero-argument read-only probe that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded with the highest-value information (what environment, whether writes are enabled) followed by the network-behavior note. Nothing redundant and nothing padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the full burden of explaining return values, and it does so at a summary level (environment, write-enabled flag, version). It stops short of describing the shape of those values (e.g. how the environment is labeled in the response), which is the only remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing to disambiguate; the baseline for a 0-parameter tool is 4. The description correctly implies it is argument-free by describing only outputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Muestra") and a concrete resource (the server's connected environment), and enumerates the exact payload: environment name, whether write tools are enabled, and version. No sibling tool (calcular_totales, consultar_evento, listar_eventos, etc.) returns server metadata, so an agent can tell immediately this is the diagnostic/config tool rather than a SIFEN data query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention of "si las herramientas de escritura están habilitadas" hints you check this before attempting writes, and the returned environment names (Sandbox, pruebas con SIFEN, producción) signal a pre-flight check. But the description never states when to call it, what it should precede, or that it is safe/cheap to call repeatedly as a first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listar_enumeracionesListar enumeraciones de la APIARead-only
Devuelve los valores válidos de las enumeraciones de la API (tipoDocumento, tipoPago, unidadMedida, afectacionTributaria, monedaOperacion, país, motivoEmision, etc.). Sin parámetros lista los nombres de las enumeraciones; con "nombre" devuelve sus valores. Usala antes de enviar un valor de enumeración: un nombre aproximado falla recién al emitir.
| Name | Required | Description | Default |
|---|---|---|---|
| nombre | No | Nombre de la enumeración, por ejemplo "tipoPago" o "unidadMedida". Si se omite, lista los nombres. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely new behavioral context: the two distinct operating modes (no param = list names, with nombre = list values) and the late-failure mode when an invalid enum reaches emission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with what the tool returns, then the enumeration examples, then the behavioral rule. Every sentence carries information and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single optional-parameter read tool with no output schema, the description covers both invocation modes and the motivation for calling it. The only gap is the return shape (array of strings vs. objects), which the agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema property description already says "Si se omite, lista los nombres". The description restates the same no-param/with-param semantics rather than adding format, case-sensitivity, or fuzzy-matching details, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Devuelve los valores válidos de las enumeraciones de la API") and enumerates concrete examples (tipoDocumento, tipoPago, unidadMedida...). No sibling tool does anything similar, so an agent can route here immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit usage trigger: "Usala antes de enviar un valor de enumeración", plus the consequence of skipping it ("un nombre aproximado falla recién al emitir"). No when-not guidance or named alternative is needed since the sibling list has no overlapping tool, but that omission keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listar_eventosListar eventos de documentosARead-only
Lista los eventos registrados (cancelación, inutilización, nominación) con su estado ante SIFEN, paginados. Filtrá por tipoEvento con un valor de listar_enumeraciones.
| Name | Required | Description | Default |
|---|---|---|---|
| pagina | No | Número de página, desde 0. | |
| tamanio | No | Eventos por página (1 a 100). | |
| tipoEvento | No | Filtro por tipo de evento. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered externally. The description adds that results are paginated and carry SIFEN status, which is modest extra context, but says nothing about ordering, volume, or result shape. Reasonable at 3 given the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what is listed and followed by the filter instruction. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only paginated list with all three parameters documented and no output schema, the description covers purpose, scope, and filter sourcing adequately. It could add one note on result ordering or pagination semantics to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning for tipoEvento by pointing to listar_enumeraciones as the source of valid values. Pagination parameters are otherwise left entirely to the schema, so it stays just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista los eventos registrados') and enumerates concrete event types (cancelación, inutilización, nominación) plus SIFEN status, so the agent knows exactly what domain is covered. It does not explicitly distinguish itself from the singular sibling 'consultar_evento', which is the only gap keeping it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent how to supply the filter ('Filtrá por tipoEvento con un valor de listar_enumeraciones'), which is useful routing. However, it gives no when-to-use guidance relative to alternatives like consultar_evento, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
obtener_ejemplo_documentoObtener un ejemplo de documentoARead-only
Devuelve un documento de ejemplo con datos ficticios, listo para adaptar y enviar a emitir_documento: factura al contado B2C o B2B, factura a crédito en cuotas, nota de crédito y nota de débito. Para nota de remisión y autofactura devuelve el enlace al modelo en la documentación. Reemplazá los datos ficticios (receptor, ítems, CDC asociado) antes de emitir.
| Name | Required | Description | Default |
|---|---|---|---|
| ejemplo | Yes | Tipo de ejemplo. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real context beyond them: data is fictional/synthetic, two enum values (nota_remision, autofactura) return a docs link instead of a payload, and the payload must be mutated before emission. It doesn't describe response shape or whether the link is a URL string, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then the per-value behavior split, then the required pre-emission action. No filler and the most decision-relevant information (which types work) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden; it partially discharges this by explaining the document-vs-link split and the fictional-data caveat. It stops short of describing the example's structure or format, but is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a documented enum, so baseline is 3, but the description adds semantics the schema does not: it maps which enum values yield a full example versus which yield a documentation link. That materially changes what the agent should expect per parameter value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (devuelve un documento de ejemplo con datos ficticios) and enumerates exactly which document types are produced versus which return a documentation link. An agent can distinguish it from siblings like consultar_documento or calcular_totales without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the output as input for emit_documento and instructs the agent to replace receptor/ítems/CDC before emitting, which is genuine when-to-use guidance. It lacks an explicit statement of when *not* to use it or which sibling to prefer when a real document is needed, so it stops short of a 5.
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.
12 tool updates
v0.1.0- First observed
calcular_totales - First observed
consultar_consumo_plan - First observed
consultar_contribuyente - First observed
consultar_documento - First observed
consultar_evento - First observed
consultar_geografia - First observed
consultar_padron - First observed
descargar_kude - First observed
informacion_servidor - First observed
listar_enumeraciones - First observed
listar_eventos - First observed
obtener_ejemplo_documento
TDQS
Scored across 12 tools
Each tool targets a clearly distinct resource or operation: document status, event status, event listing, taxpayer data, enumerations, plan usage, geography, RUC lookup, KuDE download, and example documents. The only apparent overlap is between consultar_evento and listar_eventos, but their singular-detail versus paginated-list purposes are explicit. consultar_contribuyente and consultar_padron are also clearly differentiated as API-key owner data versus SET registry lookup.
Most tools follow a predictable Spanish verb_noun pattern: consultar_*, listar_*, calcular_*, descargar_*, and obtener_*. The main deviation is informacion_servidor, which is a noun phrase rather than a verb-led name, but the overall convention remains readable and consistent.
Twelve tools is well-scoped for a SIFEN e-invoicing integration, covering lookup, calculation, validation, catalog, plan, event, and document retrieval workflows. Each listed tool appears to earn its place without excessive surface area.
The surface is missing core write operations for an e-invoicing server: there is no emitir_documento tool, despite several descriptions referencing it, and no tools to create cancellation, nomination, or invalidation events. Read-only lookup, calculation, catalog, and download operations are well represented, but agents cannot complete the primary issuance workflow from this tool set.
Maintenance
Related MCP Connectors
Paraguay SIFEN e-Kuatia: AI agents issue and query electronic invoices, stateless BYO.
Chile DTE for AI agents - boleta/factura electronica via OpenFactura or LibreDTE. Stateless BYO.
Ecuador factura electronica for AI agents - issue and query SRI e-invoices via Datil. Stateless BYO.
Peru CPE invoices for AI agents - issue, query, void facturas/boletas via SUNAT (2 backends).
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to issue Chilean electronic tax documents (boleta and factura) stamped at SII via OpenFactura, with stateless bring-your-own-credentials.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to issue Peruvian electronic invoices (factura/boleta) declared to SUNAT via Nubefact. Supports creating, querying, and canceling invoices with automatic IGV tax computation.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to issue and query Paraguay SIFEN e-Kuatia electronic invoices through FacturaSend, handling IVA math and stateless forwarding.MIT
- AlicenseAqualityAmaintenanceEnables AI agents to validate Mexican RFC, CURP, CLABE and NSS identifiers with real check digits, parse CFDI 4.0 invoices with labelled SAT catalogue codes and verified totals, and query the SAT's public status service to see whether an invoice is still valid. It also generates coherent test people and companies, all read-only and without API keys, certificates or PAC contracts.9120 npm1MIT