ARCA Invoice MCP
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., "@ARCA Invoice MCPprepare an invoice for the sale to customer 20-30112223-4"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ARCA Invoice MCP
Local MCP server for preparing and issuing ARCA Factura C invoices through the official RCEL protocol.
Authentication uses direct HTTP by default, including the JSF login, JWT bridge, portal service grant, RCEL SSO, and taxpayer selection. Browser fallback is disabled: if direct authentication fails, the MCP returns the error without opening Chrome. A browser can only be enabled explicitly with ARCA_AUTH_FALLBACK=headless or ARCA_AUTH_FALLBACK=visible. The invoice flow itself always uses direct HTTP requests reconstructed from an observed HAR.
The server deliberately separates preview from issuance:
arca_prepare_invoicesends the four RCEL form requests, records a HAR, and returns a structured preview plus a one-time approval token.A human reviews the returned summary.
arca_issue_invoicerequires the exact token, re-reads the preview, emits once, downloads the official PDF, and flushes a full HAR.
arca_list_invoices queries issued Factura C records by date range directly from RCEL. Prepared or discarded previews never appear in that list because ARCA has not assigned them a number or CAE.
Security
Keep
CUILandPASSonly in.env; the file is ignored by Git.HAR, browser state, and PDFs are ignored by Git.
HAR files can contain session cookies and taxpayer/customer information. They are written with owner-only permissions and must be treated as credentials.
The client refuses to send ARCA data to hosts outside the official AFIP/ARCA domains.
Authentication requests are intentionally excluded from HAR so the password is never recorded. RCEL cookies are redacted in the generated HAR.
If issuance returns an uncertain result, do not retry. Check
Consultasin RCEL first.Use this project only with an ARCA account and taxpayer you are authorized to operate.
See SECURITY.md before sharing logs or reporting a vulnerability.
Related MCP server: keycae-mcp
Requirements
Node.js 20 or newer.
pdftotextfrom Poppler when invoices will be issued through the MCP.Google Chrome only if an explicit authentication fallback is enabled.
Why Poppler is needed
Poppler is not an ARCA requirement and is not needed to authenticate, list invoices or prepare a preview. After arca_issue_invoice sends the irreversible issuance request and downloads the official PDF, the MCP runs pdftotext to extract and verify the invoice number, CAE and CAE expiration date.
Install Poppler before using the issuance tool:
# macOS
brew install poppler
# Debian / Ubuntu
sudo apt-get install poppler-utilsIf pdftotext is unavailable at that point, ARCA may already have issued the invoice even though local verification fails. Do not retry the issuance request: check the invoice through arca_list_invoices or RCEL Consultas first.
Run
npm ci
cp .env.example .env
# Complete CUIL and PASS in .env without committing it.
npm startUse either npm ci or npm install; npm ci is recommended when using the committed lockfile.
The server uses Google Chrome on macOS by default. Override it with ARCA_CHROME_PATH. Set ARCA_HEADLESS=1 only after validating that ARCA accepts the environment.
Example Codex MCP configuration:
[mcp_servers.arca_invoice]
command = "node"
args = ["/absolute/path/to/arca-invoice-mcp/src/index.mjs"]
cwd = "/absolute/path/to/arca-invoice-mcp"Validate locally
These checks do not authenticate with ARCA or issue invoices:
npm run check
npm test
npm audit --omit=devOperational warning
arca_issue_invoice performs an irreversible external action. Always present the preview to a human, receive explicit approval for that exact preview, and call the issue tool only once. Never commit or share .env, .state, PDFs, HAR files, cookies, approval tokens, taxpayer data, or customer data.
Available Tools
5 toolsarca_discard_prepared_invoiceDiscard prepared invoiceB
Close the current preview without issuing an invoice.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It says 'Close the current preview' but does not mention potential side effects (e.g., discarding any prepared draft, irreversible action), permissions required, or whether it affects the prepared data. This is a meaningful gap for a mutation-like tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no waste, directly stating the action and outcome. It is front-loaded with the action verb. It earns a perfect score for conciseness.
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?
Given the tool's simplicity (no params, no output schema), the description is reasonably complete: it tells the agent what it does and the outcome. However, as a state-changing operation, it lacks detail on side effects (e.g., whether the preview is closed but the invoice remains as prepared, or if it cancels the entire preparation). The sibling context suggests this is part of a workflow, and without more behavioral info, some critical context is missing 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?
The tool has zero parameters, and the schema coverage is 100% (effectively, no parameters to explain). The description does not add parameter details but that's not needed; the absence of parameters is well indicated by the empty schema. Baseline of 4 is appropriate for zero-param tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific action ('Close the current preview without issuing an invoice') with a concrete verb and resource (preview/invoice), clearly distinguishing it from issuing or listing invoices. It is clear what the tool does, though it doesn't explicitly differentiate from 'arca_prepare_invoice' (which likely opens the preview), so a slight deduction for lack of sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (after preparing an invoice, to cancel the preview) but does not explicitly state alternatives or when not to use it. Given the sibling set, an agent might infer to use this instead of 'arca_issue_invoice' if the user decides not to proceed, but explicit guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arca_invoice_statusARCA invoice session statusA
Read whether the local ARCA session has a prepared invoice. Does not mutate ARCA.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It explicitly states the tool reads and 'Does not mutate ARCA,' which is a meaningful guarantee given the sibling tools mutate state. It does not detail the exact return format, but 'Read whether' makes the primary behavior clear enough.
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, front-loaded with the core purpose and followed by a concise safety note. Every word earns its place; there is no redundancy or 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 parameterless status-check tool with no output schema, the description is nearly complete: it names what is being checked and explicitly states the operation is non-mutating. It could be improved by spelling out the return shape (e.g., boolean), but the phrase 'Read whether' makes the expected result reasonably inferable.
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 has zero parameters and schema coverage is 100%, so there is nothing missing. The description adds useful context about the subject ('local ARCA session'), which earns credit above the baseline for an empty-parameter tool.
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: 'Read whether the local ARCA session has a prepared invoice.' This clearly distinguishes it from the mutating siblings (prepare, issue, discard) and from listing invoices, by scoping to the local session's prepared invoice state.
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 implies when to use it: when you need to know whether a prepared invoice exists in the local ARCA session. It does not explicitly name alternatives or exclusions, but 'Does not mutate ARCA' provides useful context that this is a safe read-only check relative to the mutating siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arca_issue_invoiceIssue prepared ARCA invoiceA
Irreversibly issue the currently prepared invoice. Call only after showing the preview and receiving explicit user approval. Never retry automatically after an uncertain response.
| Name | Required | Description | Default |
|---|---|---|---|
| approvalToken | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden of behavioral disclosure. It explicitly warns that the action is irreversible and forbids automatic retries, which are critical traits for a mutation with financial consequences. It also adds the requirement of explicit user approval, which is not inferable from the 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?
The description is three concise sentences with the key fact—irreversible issuance—front-loaded. Every sentence adds operational value, and there is no repetition of schema details or 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 one-parameter irreversible mutation with no output schema, the description provides the essential invocation context: preview, approval, issuance, and retry caution. It does not explicitly explain the origin or format of the approvalToken or possible error states, but the core calling conditions are well covered.
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 input schema has 0% description coverage and only provides the UUID type/pattern for approvalToken. The description adds workflow meaning by tying the token to 'explicit user approval,' but it never states where the token comes from or how it should be obtained. This leaves partial but incomplete compensation for the missing schema description.
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 opens with 'Irreversibly issue the currently prepared invoice,' a specific verb and resource that uniquely defines the tool. It goes beyond the title by adding the irreversibility qualifier, and it is clearly distinguishable from siblings such as arca_prepare_invoice and arca_discard_prepared_invoice.
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 the exact precondition: 'Call only after showing the preview and receiving explicit user approval.' It also gives a concrete exclusion: 'Never retry automatically after an uncertain response.' However, it does not explicitly route the agent to alternative tools when the precondition is not met.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arca_list_invoicesList issued ARCA invoicesA
Read issued Factura C records from official ARCA RCEL for a date range. This tool is read-only and does not include unissued previews.
| Name | Required | Description | Default |
|---|---|---|---|
| dateTo | Yes | ||
| dateFrom | Yes | ||
| pointOfSale | No | 00002 | |
| receiverCuit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'This tool is read-only', which is a critical safety trait. It also clarifies it does not include unissued previews, setting expectations for the output. It does not disclose pagination, response format, or error behavior, but for a list/read tool these are less critical; the key mutation-safety trait is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and then a clarifying trait. There is zero filler; every word earns its place. It is appropriately concise for a list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters, no output schema, and no annotations, the description is too sparse. It does not explain the optional parameters, the shape of the returned records, or any constraints (e.g., maximum date range, authorization). An agent would likely need to inspect the schema or guess on key details like the meaning of pointOfSale and receiverCuit, and what the response contains. It is adequate only for the most basic understanding.
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 schema has 0% description coverage, so the description must compensate. It only references 'a date range', mapping to dateFrom and dateTo, but says nothing about pointOfSale or receiverCuit. The agent would need to infer their meaning from names and patterns alone, which is insufficient for proper invocation. The description adds minimal parameter context beyond what the schema already exposes.
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 clearly states the verb 'Read', the resource 'issued Factura C records from official ARCA RCEL', and the scope 'for a date range'. It explicitly excludes unissued previews, which distinguishes it from the sibling arca_prepare_invoice. This is a precise, non-tautological purpose.
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 implies usage by stating it reads issued records and excludes unissued previews, which hints at when to use it over prepare/issue tools. However, it does not explicitly name alternatives or provide a 'use this when...' or 'do not use when...' directive, so the guidance is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
arca_prepare_invoicePrepare ARCA invoiceA
Prepare a Factura C through direct HTTP calls to official ARCA RCEL. Authentication is direct HTTP by default, with browser fallback only when explicitly configured. This tool never issues the invoice. Show the preview and obtain explicit approval before calling arca_issue_invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | ||
| dueDate | Yes | ||
| periodTo | Yes | ||
| captureHar | No | ||
| periodFrom | Yes | ||
| description | Yes | ||
| pointOfSale | No | 00002 | |
| emissionDate | Yes | ||
| receiverCuit | Yes | ||
| paymentMethods | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose two important behaviors: it never issues the invoice, and it uses a specific authentication method (direct HTTP with optional browser fallback). However, it does not mention side effects such as creating a prepared record that can later be discarded or queried via sibling tools, nor does it mention any state changes or permissions required. While it covers the critical non-issuance aspect, it leaves out other relevant behaviors, making it only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long and front-loads the core purpose immediately. The first sentence states what the tool does, the second covers authentication behavior, and the third gives the crucial workflow requirement. There is no redundant phrasing, and every sentence adds information. This is a model of concise, well-structured documentation.
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?
Given the tool's complexity (10 parameters, 8 required, no output schema, no annotations), the description is far too sparse. It does not explain what a 'Factura C' is, what the expected input formats are (even though the schema provides patterns, the description doesn't guide usage), or what the tool returns or produces. It also doesn't mention how this prepared invoice relates to sibling tools like arca_discard_prepared_invoice or arca_invoice_status. An agent would be left guessing about many essential details needed to call the tool 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?
The schema has 10 parameters (8 required) with 0% description coverage, meaning no field descriptions exist in the schema. The tool description provides no information about any parameter: it does not explain what 'receiverCuit', 'emissionDate', 'paymentMethods', etc., mean, nor their formats or relationships. Since the description is the only source of parameter semantics and it says nothing, this is a major gap. Score 1 is appropriate because the description adds no value whatsoever for understanding the parameters.
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 clearly states the tool's purpose: 'Prepare a Factura C through direct HTTP calls to official ARCA RCEL.' It specifies the verb (prepare), the resource (Factura C), and the method (direct HTTP calls). It also explicitly says 'This tool never issues the invoice,' which distinguishes it from the sibling arca_issue_invoice. This is a specific, non-tautological purpose that an agent can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit workflow guidance: 'Show the preview and obtain explicit approval before calling arca_issue_invoice.' This tells the agent when to use this tool (preparation) and the required next step. It also mentions authentication modes ('direct HTTP by default, with browser fallback only when explicitly configured'), which is a usage context. It doesn't explicitly compare to all siblings (e.g., arca_list_invoices or arca_discard_prepared_invoice), but it clearly differentiates from the issuance tool, which is the primary alternative.
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.
5 tool updates
v0.1.0- First observed
arca_discard_prepared_invoice - First observed
arca_invoice_status - First observed
arca_issue_invoice - First observed
arca_list_invoices - First observed
arca_prepare_invoice
TDQS
Scored across 5 tools
Each tool covers a distinct action: prepare, issue, list, discard, and status. These lifecycle stages are clearly separated, so an agent can unambiguously select the correct tool for a given need.
Four of the five tools follow the arca_verb_noun pattern (arca_prepare_invoice, arca_issue_invoice, arca_list_invoices, arca_discard_prepared_invoice). However, arca_invoice_status breaks this pattern by using a noun-like 'status' instead of a verb, causing a minor inconsistency.
With 5 tools, the server is well-scoped for its invoice lifecycle purpose. Each tool earns its place without redundancy or bloat, fitting the ideal 3-15 range.
The lifecycle of prepare, issue, discard, list, and local status covers the core workflow. However, after an uncertain issue response, there is no direct tool to verify the invoice status on the ARCA side (list_invoices requires knowing the date range and may not be real-time), leaving a minor gap in uncertainty resolution.
Maintenance
Related MCP Connectors
Argentina AFIP/ARCA electronic invoices for AI agents - issue & query facturas, get CAE via WSFE.
Issue and manage Brazilian fiscal documents: NF-e for goods, NFS-e for services.
Validate, generate & convert EU e-invoices (UBL, CII, XRechnung, Factur-X) — EN 16931 pre-validated.
Chilean DTE/SII invoicing — issue invoices, reconcile payments and manage clients with AI agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceModel Context Protocol (MCP) server for Spanish Electronic Invoicing. Provides tools to generate, validate, and submit invoices across VERI\*FACTU, Facturae/FACe, SII, TicketBAI, and Crea y Crece B2B.202Apache 2.0
- AlicenseAqualityFmaintenanceArgentine electronic invoicing (facturación electrónica) MCP Server for ARCA/AFIP. Emit invoices, manage credentials, check delegations, and look up taxpayers. 10 tools.12378 npmMIT
- 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 submit Uruguay DGI e-Factura (CFE) documents to the DGI webservice as a stateless forwarder; signing stays merchant-side, and it supports test, homologation, and production endpoints.MIT