pop-mcp
OfficialThe pop-mcp server enables AI assistants to generate, submit, and manage electronic invoices in multiple international formats, and handle account onboarding.
Capabilities:
Invoice Creation: Generate Italian FatturaPA/SdI XML, Peppol UBL 2.1, PDF (branded), Polish KSeF FA(3) XML (invoices/credit notes), ZUGFeRD/Factur-X packages (PDF, XML, hybrid PDF/A-3), and sync to Zoho.
Submission & Delivery: Optionally submit SdI and Peppol invoices to their respective networks, email PDF invoices, and submit KSeF via provider (require a Basic+ plan).
Status & Retrieval: Retrieve SdI invoice status and notifications, fetch Peppol documents by UUID, and retrieve archived SdI documents.
Validation & Archival: Validate SdI XML compliance and archive documents for long-term legal retention.
Account Onboarding: Request/verify OTP for onboarding, get status, retrieve/save account setup, and activate SdI or Peppol integrations.
Sync documents (invoices) to Zoho via a dedicated Zoho connector.
Click on "Install 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., "@pop-mcpCreate an Italian e-invoice (FatturaPA) for €1000 to ABC srl"
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.
pop-mcp
MCP (Model Context Protocol) server for POP — enabling LLMs to generate, submit, and manage Italian e-invoices (FatturaPA/SdI), Peppol, KSeF, ZUGFeRD/Factur-X, and PDF invoices directly from AI assistants.
npm:
@getpopapi/pop-mcp· Remote:https://mcp.popapi.io/mcp
Remote MCP (HTTP) — fastest way to get started
Don't want to install anything? pop-mcp runs as a hosted, multi-tenant MCP server at:
https://mcp.popapi.io/mcpHead to popapi.io to grab a license key, then point any MCP-speaking client at
that URL with your key as a Bearer token. No local install, no POP_API_KEY env var, no build step
— this is the recommended way to try pop-mcp for most people. Use the local stdio setup below only
if you specifically need a Claude Desktop config running a process on your own machine.
How it works
This endpoint speaks MCP 2026-07-28, which is fully stateless: there is no initialize
handshake and no session to open or track. Every request is self-contained — it names its own
protocol version and capabilities — and the server answers it independently. Because of that,
this is a multi-tenant endpoint: it never reads a fixed POP_API_KEY from its own environment.
Every request must carry your own POP license key as a Bearer token:
Authorization: Bearer <your_license_key>A missing or malformed Authorization header returns a 401 with error_code: "unauthorized_user"
before any POP API call is made. An invalid-but-well-formed key is passed straight through to POP's
API and surfaces whatever error POP returns (unauthorized_user, insufficient_level, etc.) — the
server does not re-validate keys itself.
Any modern MCP HTTP client can connect: Claude (remote connector), the OpenAI Responses API, n8n,
MCP Inspector, or a custom integration — not
just Claude Desktop. All invoice, status, advanced, and onboarding tools are available; onboarding
tools use their own onboarding_token per call and don't require the Bearer key.
Example with curl
Discover the server's supported protocol versions and capabilities (optional — clients can also
just call tools/list or tools/call directly and handle a version-negotiation error inline):
curl -X POST https://mcp.popapi.io/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_license_key_here" \
-H "MCP-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: server/discover" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "server/discover",
"params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {} } }
}'List the available tools — every request is self-contained, so _meta (protocol version + client
capabilities) travels on every call, not just the first one:
curl -X POST https://mcp.popapi.io/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_license_key_here" \
-H "MCP-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/list" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {} } }
}'The tool catalog is identical for every license key, so tools/list and server/discover
responses carry a one-hour public cache hint (ttlMs: 3600000, cacheScope: "public") — clients and
gateways may cache them across tenants.
MCP-Protocol-VersionandMcp-Methodare required on every request (per SEP-2243), and must match the body's_meta.protocolVersionandmethodexactly, or the server rejects the request with a400and JSON-RPC error-32020(HeaderMismatch).tools/callrequests additionally require anMcp-Nameheader matchingparams.name.
Example with MCP Inspector
npx @modelcontextprotocol/inspectorConfigure it to connect to https://mcp.popapi.io/mcp with header
Authorization: Bearer <your_license_key>.
This endpoint runs as a Vercel serverless function (api/mcp.ts → src/mcpHandler.ts). To run it
locally: npx vercel dev (requires vercel link to the project first).
Related MCP server: mcp-fattura-elettronica-it
What is POP?
POP is a cloud service for electronic invoice generation and delivery, supporting:
🇮🇹 Italian e-invoicing (FatturaPA/SdI) — compliant with D.Lgs. 127/2015
🇪🇺 Peppol — pan-European cross-border B2B invoicing (UBL 2.1)
📄 PDF invoices — branded, with email delivery
✅ Validation — fiscal codes, VAT numbers, document pre-submission checks
🗄️ Preservation — Italian legal archival (conservazione sostitutiva)
Tools Available (11 total)
Invoice Creation
Tool | Endpoint | Plan |
| POST | Any |
| POST | Any (Basic+ to submit) |
| POST | Any (Basic+ for email) |
| POST | Any (KSeF setup for provider submission) |
| POST | Any |
| POST | Zoho connector required |
Status & Retrieval
Tool | Endpoint | Plan |
| POST | Any |
| POST | Basic+ |
| POST | Basic+ |
Validation & Advanced SdI
Tool | Endpoint | Plan |
| POST | Basic+ |
| POST | Basic+ |
Prerequisites
Node.js >= 20
A POP license key
For SdI/Peppol submission: active integration on your POP account (Basic/Growth plan)
Authentication
Get Your License Key
New to POP? Visit popapi.io to create your account and get your license key.
API-only users can activate their account and obtain a license_key with this flow:
Enter your email address
Receive a one-time password (OTP) by email and enter it
Complete the configuration wizard
Open https://popapi.io/ → Account > API
Copy the default generated
license_key
Key Management
Your account includes one default
license_key, visible under Account > APIYou can generate additional keys linked to the same account from that same page
Every
license_keymust be treated as a secret credential — do not commit it to source control
Recommended First Steps
Get your
license_keyTest it with
GET /account-profileSend one document-generation request with a real payload
Add optional delivery integrations only after local generation works
Installation
From npm (recommended)
npm install -g @getpopapi/pop-mcpFrom Source
git clone https://github.com/getpopapi/pop-mcp
cd pop-mcp
npm install
npm run buildConfiguration
Set your POP license key as an environment variable:
export POP_API_KEY=your_license_key_hereOptional — use the staging environment:
export POP_ENVIRONMENT=stagingClaude Desktop Setup
Add to your claude_desktop_config.json:
If installed from npm:
{
"mcpServers": {
"pop": {
"command": "pop-mcp",
"env": {
"POP_API_KEY": "your_license_key_here"
}
}
}
}If running from source:
{
"mcpServers": {
"pop": {
"command": "node",
"args": ["/path/to/pop-mcp/dist/cli.js"],
"env": {
"POP_API_KEY": "your_license_key_here"
}
}
}
}Config file locations:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Tool Reference
The license_key is always injected automatically from POP_API_KEY — never pass it manually.
pop_create_sdi_invoice
Generate an Italian FatturaPA XML document. Optionally submit it to the SdI (Sistema di Interscambio).
MCP inputs:
Parameter | Type | Required | Description |
| object | ✅ | Full invoice data (see Invoice Data Structure) |
| boolean | — | Set |
| object | — | Override integration config. Overrides |
| string | — | Target environment (e.g. |
Integration options for integration.use:
"sdi-via-pop"or"sdi"— Submit via POP SdI"pop-to-webhook"— Deliver to a webhook (requiresid)"fatture-in-cloud"— Deliver to Fatture in Cloud
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"user_agent": "pop-mcp",
"user_agent_version": "1.0.0",
"data": { "...invoice fields..." },
"integration": { "use": "sdi-via-pop", "action": "create" }
}
integrationis omitted whensubmit_to_sdiisfalseand no override is provided (XML-only generation).
pop_create_peppol_invoice
Generate a Peppol UBL 2.1 document. Optionally submit it to the Peppol network.
MCP inputs:
Parameter | Type | Required | Description |
| object | ✅ | Full invoice data. |
| boolean | — | Set |
| object | — | Override integration config |
| string | — | Target environment |
Integration options for integration.use:
"peppol-via-pop"or"peppol"— Submit via POP Peppol"pop-to-webhook"— Deliver to a webhook (requiresid)
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"user_agent": "pop-mcp",
"user_agent_version": "1.0.0",
"data": { "...invoice fields..." },
"integration": { "use": "peppol-via-pop", "action": "create" }
}pop_create_pdf_invoice
Generate a branded PDF invoice. Optionally email it to up to 3 recipients.
MCP inputs:
Parameter | Type | Required | Description |
| object | ✅ | Invoice data. Must include |
| boolean | — | Set |
| string | — | Target environment |
data.pdf fields:
Field | Description |
| Title shown on document (e.g. |
| Company logo URL (HTTPS) |
| Supplier address string in header |
| Customer billing address array |
| Shipping address array (optional) |
| Up to 3 recipient email addresses |
| Reply-to address |
| Custom footer message |
| Total tax amount as string |
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"user_agent": "pop-mcp",
"user_agent_version": "1.0.0",
"data": {
"...invoice fields...",
"pdf": {
"doc_type_title": "Invoice",
"logo_url": "https://example.com/logo.png",
"head": { "store_info_address": "Via Roma 1, 00100 Roma IT", "billing": [] },
"total_tax": "22.00",
"email_invoice": { "to": ["customer@example.com"] }
}
}
}pop_create_ksef_invoice
Generate a Polish KSeF FA(3) XML invoice or credit note. Optionally submit it through a configured KSeF provider integration.
MCP inputs:
Parameter | Type | Required | Description |
| object | ✅ | Full invoice data for KSeF FA(3) generation |
| object | — | Optional KSeF provider submission config: |
| string | — | Target environment (e.g. |
Domain rules specific to KSeF:
Poland only —
transfer_lender.personal_data.tax_id_vat.country_idmust be"PL"with a 10-digit NIP asid_codecustomer_typemust be"company"or"freelance"(no private individuals)natureis always required at the top level for KSeF (unlike SdI/Peppol, where it's only required at 0% VAT) — reuses the same SdI nature codes (N1,N2.1,N2.2,N3.1,N3.2,N4, ...) to derive KSeF's internal fiscal varianttransmitter_datais not used (SdI-only concept)payment_data.payment_detailsonly acceptsMP01,MP02/MP03,MP05,MP08— other payment method codes are rejected at generation timeBase XML generation is available on any plan; provider submission via
integration.use: "ksef"requires a Basic+ plan and the supplier already enrolled as a KSeF legal entity in the POP dashboard
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"user_agent": "pop-mcp",
"user_agent_version": "1.0.0",
"data": { "...invoice fields...", "nature": "N1" },
"integration": { "use": "ksef", "action": "create" }
}
integrationis omitted entirely for local XML-only generation (no provider submission).
Returns: raw FA(3) XML (application/xml) for local generation, or JSON (with a UUID) when submitted through a provider integration.
pop_create_zugferd_invoice
Generate a ZUGFeRD/Factur-X document package: a visual PDF, an EN16931 CII XML, and a hybrid PDF/A-3 with the XML embedded.
MCP inputs:
Parameter | Type | Required | Description |
| object | ✅ | Full invoice data for ZUGFeRD/Factur-X generation |
| string | — | Target environment (e.g. |
This tool has no integration parameter — ZUGFeRD generation is local only, with no submit/delivery step.
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"user_agent": "pop-mcp",
"user_agent_version": "1.0.0",
"data": { "...invoice fields..." }
}Returns: JSON with generation metadata and three Base64-encoded attachments:
{
"success": true,
"data": {
"valid": true,
"profile": "EN16931",
"attachments": {
"pdf": { "filename": "...", "mime": "application/pdf", "content_base64": "..." },
"xml": { "filename": "...", "mime": "application/xml", "content_base64": "..." },
"hybrid_pdf": { "filename": "...", "mime": "application/pdf", "content_base64": "..." }
},
"validation": { "...": "..." },
"errors": [],
"warnings": []
}
}pop_get_invoice_status
Retrieve the SdI processing status and notifications for a submitted invoice.
MCP inputs:
Parameter | Type | Required | Description |
| string (UUID) | ✅ | Invoice UUID returned by |
|
| — | Output format. Default: |
| string | — | Target environment |
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
}SdI notification statuses: pending · accepted · rejected · delivery
SdI processing is asynchronous and can take minutes to hours. Retry if no notifications are returned yet.
pop_get_peppol_document
Retrieve a Peppol document from the network by UUID.
MCP inputs:
Parameter | Type | Required | Description |
| string (UUID) | ✅ | Peppol document UUID from |
| string (2 chars) | — | Country code of the Peppol access point (e.g. |
|
| — | Output format. Default: |
| string | — | Target environment |
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "zone": "IT" }
}
zoneis omitted from the payload if not provided.
pop_get_sdi_document
Retrieve an archived SdI (FatturaPA) document from POP storage by UUID.
MCP inputs:
Parameter | Type | Required | Description |
| string (UUID) | ✅ | SdI document UUID |
|
| — | Output format. Default: |
| string | — | Target environment |
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
}Requires: Basic+ plan with active SdI integration.
pop_verify_sdi_document
Validate an SdI XML document for compliance before submission. Does not submit the document.
MCP inputs:
Parameter | Type | Required | Description |
| string | ✅ | The SdI XML document encoded as a Base64 string |
| string | — | Target environment |
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"skip_business_check": true,
"integration": { "xml": "<base64-encoded-xml-string>" }
}Validation checks performed: XML schema conformance · fiscal code format · VAT number validity · required field presence · amount consistency
Requires: Basic+ plan with active SdI integration and registered business.
pop_preserve_document
Archive an SdI document in certified long-term digital storage (conservazione sostitutiva). Italian law requires invoices to be preserved for 10 years.
MCP inputs:
Parameter | Type | Required | Description |
| string (UUID) | ✅ | UUID of the SdI document to archive |
| string | — | Target environment |
API payload sent:
{
"license_key": "YOUR_LICENSE_KEY",
"integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
}Important: Only call this tool when
pop_get_invoice_statusreturns statusRC(Ricevuta di Consegna) orMC(Mancata Consegna). Do not call for statusesNS,EC,SE, orDT.
Requires: Basic+ plan with active SdI integration.
Usage Examples
Generate a Simple Italian Invoice (XML Only)
Ask your AI assistant:
"Create a FatturaPA invoice for 1000€ + 22% VAT to Rossi SRL (VAT IT12345678901, Milan). My company is Bianchi SRL (VAT IT98765432109, Rome), using payment method bank transfer to IBAN IT60X0542811101000000123456."
Submit Invoice to SdI
"Create and submit to SdI an invoice #45 for consulting services, 500€ + 22% VAT to customer Mario Rossi (fiscal code RSSMRA80A01H501U) in Rome."
Check Invoice Status After Submission
"What's the status of SdI invoice with UUID abc123-def456-...?"
Generate PDF with Email Delivery
"Create a PDF invoice for order #123 and email it to customer@example.com."
Verify SdI Document Before Sending
"Verify SdI document with UUID abc123-... for compliance before submission."
Plan Requirements
Feature | Free | Basic/Growth | Pro |
XML generation (local) | ✅ | ✅ | ✅ |
PDF generation | ✅ | ✅ | ✅ |
SdI submission | ❌ | ✅ | ✅ |
Peppol submission | ❌ | ✅ | ✅ |
PDF email delivery | ❌ | ✅ | ✅ |
SdI document verification | ❌ | ✅ | ✅ |
Document preservation | ❌ | ✅ | ✅ |
Testing
MCP Inspector (Interactive)
npm run inspector
# or
npx @modelcontextprotocol/inspector dist/cli.jsQuick Smoke Test
POP_API_KEY=your_key node -e "
import('./dist/cli.js').catch(e => {
if (e.message.includes('stdin')) process.exit(0);
console.error(e); process.exit(1);
});
"Test Tool Schema Listing
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | POP_API_KEY=test node dist/cli.jsDevelopment
# Run with auto-reload
npm run dev
# Build
npm run build
# Clean build artifacts
npm run cleanInvoice Data Structure
The data parameter for invoice creation follows the FatturaPA structure:
data
├── id Invoice/order ID (numeric)
├── filename Output filename without extension (e.g. 'IT99900088876_00009')
├── type "invoice" | "credit_note"
├── version "FPR12" | "FPA12"
├── sdi_type 7-char SDI code ('0000000' for private individuals)
├── customer_type "private" | "company" | "freelance" | "pa"
├── nature VAT exemption code (required when rate is 0%, e.g. 'N2.1', 'N6.1')
├── transmitter_data
│ ├── transmitter_id { country_id, id_code }
│ ├── progressive Transmission progressive ID (e.g. '00001')
│ ├── transmitter_format "FPR12" | "FPA12"
│ ├── sdi_code 7-char code
│ ├── transmitter_contact { phone, email }
│ └── recipient_pec PEC email (alternative to sdi_code)
├── transfer_lender Supplier/seller
│ ├── personal_data { tax_id_vat: { country_id, id_code, tax_regime }, company_name }
│ ├── place { address, zip_code, city, province_id, country_id }
│ └── contact { phone, email }
├── transferee_client Customer/buyer
│ ├── personal_data { tax_id_vat, tax_id_code (fiscal code for IT private), company_name }
│ └── place { address, zip_code, city, province_id, country_id }
├── invoice_body
│ ├── general_data { doc_type (TD01|TD04), date (YYYY-MM-DD), invoice_number, currency }
│ └── total_document_amount
├── order_items[]
│ ├── description, quantity, unit
│ ├── unit_price, total_price
│ ├── rate VAT rate as string (e.g. '22.00')
│ ├── total_tax VAT amount (number)
│ └── item_type "product" | "shipping" | "fee"
├── payment_data
│ ├── terms_payment TP01 (instalment) | TP02 (full) | TP03 (advance)
│ ├── payment_details MP01 (Cash) | MP02 (Check) | MP05 (Bank Transfer) | MP08 (Credit Card) | ...
│ ├── payment_amount
│ ├── beneficiary Required for MP05 (bank transfer)
│ ├── financial_institution Required for MP05
│ └── iban Required for MP05
├── purchase_order_data (optional) { id, date }
├── connected_invoice_data[] (required for credit notes) { id, date }
├── overrides (optional) { language, bollo_force_apply }
└── pdf (only for pop_create_pdf_invoice)
├── doc_type_title
├── logo_url
├── head { store_info_address, billing[], shipping[] }
├── total_tax
├── email_invoice { to[] (max 3), from }
└── footer_textError Reference
Error Code | Meaning | Solution |
| Invalid license key | Check |
| Plan too low | Upgrade POP plan |
| No business profile | Register on popapi.io |
| SdI/Peppol not enabled | Activate on popapi.io |
| >3 email recipients | Reduce to max 3 |
| Plan doesn't allow email | Upgrade to Basic+ |
Related Projects
n8n-nodes-pop — n8n community nodes for POP
POP — Official website
API Documentation — Postman docs
License
MIT © getpopapi
Available Tools
16 toolspop_create_ksef_invoiceCreate KSeF Invoice (FA(3) XML)A
Generate a Polish KSeF FA(3) XML invoice or credit note.
The POP Cloud API performs the authoritative KSeF fiscal validation and can optionally submit the document through the configured KSeF provider integration. KSeF onboarding and legal-entity configuration must be completed for provider submission.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Full invoice data object for KSeF FA(3) generation | |
| site_url | No | ||
| site_title | No | ||
| environment | No | Target environment (e.g. 'sandbox') | |
| integration | No | Optional KSeF provider submission configuration | |
| plugin_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only and non-idempotent behavior. The description adds that the API performs authoritative fiscal validation, can optionally submit through a provider integration, and requires prior onboarding/configuration. This goes beyond the structured hints, though it doesn't cover failure behavior or response format.
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 concise sentences, front-loaded with the primary function and followed by operational context. Every sentence earns its place without 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?
This is a complex create tool with a large nested input and no output schema. The description covers high-level behavior and prerequisites but omits return value, validation failure behavior, and how the 'integration' object affects submission. More operational context would help the agent 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?
The schema covers 50% of top-level parameters with rich nested descriptions for 'data', so the schema does much of the work. The description contributes no parameter-specific guidance and doesn't compensate for undocumented top-level parameters like site_url, site_title, and plugin_version.
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 starts with a specific verb and object: 'Generate a Polish KSeF FA(3) XML invoice or credit note.' It clearly identifies the document format and distinguishes this tool from siblings like SDI, Zugferd, and Peppol.
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 provides clear context: it performs authoritative KSeF fiscal validation and can optionally submit via the configured provider, with a prerequisite that onboarding/legal-entity configuration be completed. It doesn't explicitly name alternatives or state when not to use it, but the Polish KSeF scope is evident from the title and first sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_create_pdf_invoiceCreate PDF InvoiceA
Generate a PDF invoice with optional branding and email delivery.
Creates a printable PDF invoice. Can include company logo, custom footer, and billing/shipping addresses. The PDF can be emailed automatically to up to 3 recipients (Basic+ plan required for email).
Configuration via data.pdf:
invoice_html: '"true"' to generate HTML version
doc_type_title: Title shown on document (e.g. 'Invoice', 'Receipt', 'Credit Note')
logo_url: Company logo URL (HTTPS)
head.store_info_address: Supplier address displayed in header
head.billing: Customer billing address array
email_invoice.to: Array of up to 3 recipient emails (requires Basic+ plan)
email_invoice.from: Reply-to email address
footer_text: Custom footer message
Returns: PDF binary data or confirmation JSON with email delivery status.
Args:
data: Invoice data with data.pdf configuration populated
send_email: Set true to deliver PDF via email (requires email_invoice in data.pdf)
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Full invoice data object. Must include data.pdf configuration for PDF-specific settings. | |
| site_url | No | ||
| send_email | No | If true, emails the PDF to recipients in data.pdf.email_invoice.to (max 3 addresses, Basic+ plan required). | |
| site_title | No | ||
| environment | No | Target environment (e.g. 'sandbox') | |
| plugin_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate a non-read-only, non-idempotent operation. The description adds valuable behavioral context: it mentions the Basic+ plan requirement for email delivery, the ability to generate an HTML version, and the return type (PDF binary or JSON). It also explains the data.pdf configuration structure. These go beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary, detailed configuration list, and return statement. It is appropriately sized for a complex tool. Minor redundancy exists between the first sentence and the second sentence ('Generate a PDF invoice' vs 'Creates a printable PDF invoice'), but overall every section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex nested data object, the description does a good job of pointing the agent to the crucial data.pdf configuration and the email delivery option. It mentions the return types, which is important because there is no output schema. It could be more explicit about required prerequisites, but the schema covers that.
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 50%, and the description lists key data.pdf fields, but this mostly mirrors the schema's own descriptions (e.g., invoice_html, logo_url, email_invoice). It adds a consolidated view but does not introduce new semantics beyond the schema. The send_email parameter is described in both places, with the schema slightly more detailed.
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 function: 'Generate a PDF invoice with optional branding and email delivery.' The verb 'generate' is specific, the resource is a PDF invoice, and it distinguishes itself from sibling tools like pop_create_sdi_invoice or pop_create_peppol_invoice by focusing on PDF creation.
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 clear context: it's for creating printable PDF invoices, optionally with email delivery. It implies when to use this tool (when a PDF, not an SDI/KSeF/Peppol document, is needed) but does not explicitly name alternatives or provide exclusion criteria. Still, the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_create_peppol_invoiceCreate Peppol / UBL InvoiceA
Generate a Peppol e-invoice in UBL 2.1 format and optionally submit it to the Peppol network.
Peppol (Pan-European Public Procurement Online) enables cross-border B2B electronic invoicing across Europe. The API generates a compliant UBL 2.1 XML document.
Restrictions:
Customer type must be 'company' or 'freelance' (Peppol does not support private individuals)
Submission requires active Peppol via POP integration (Basic+ plan)
The customer must have a valid Peppol participant ID
Returns: UBL XML string or JSON with UUID when submitting to the network.
Args:
data: Complete invoice data (customer_type must be 'company' or 'freelance')
submit_to_peppol: Set true to submit to Peppol network
integration: Override integration config
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Full invoice data object. Note: Peppol only supports company and freelance customer types. | |
| site_url | No | ||
| site_title | No | ||
| environment | No | Target environment (e.g. 'sandbox') | |
| integration | No | Integration configuration override | |
| plugin_version | No | ||
| submit_to_peppol | No | If true, automatically submits to the Peppol network. Requires active Peppol via POP integration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a non-read-only, open-world operation, and the description adds relevant behavioral context: it generates UBL 2.1 XML, optionally submits to the Peppol network, and returns either a UBL XML string or a JSON with UUID. It also discloses the integration/prerequisites for submission. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear top-line purpose, a short explanation of Peppol, a bulleted 'Restrictions' section, a return-value note, and an 'Args' list. It is not overly verbose, though the Args section partially repeats schema information; still, each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 7 parameters, nested objects, and no output schema, the description covers purpose, format, return types, integration requirements, and key restrictions. It does not describe every nested field, but the schema handles that. The missing output schema is compensated by the explicit return description.
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 description highlights the key parameters 'data', 'submit_to_peppol', and 'integration' with meaningful semantics beyond the schema, such as the customer_type restriction inside 'data' and the condition for 'submit_to_peppol'. Schema coverage is 57%, and many nested fields are documented in the schema, so the description adds useful high-level guidance without repeating every 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?
The description opens with a specific verb+resource: 'Generate a Peppol e-invoice in UBL 2.1 format and optionally submit it to the Peppol network.' It names the format, the network, and the action, and is clearly distinct from sibling tools like pop_create_sdi_invoice or pop_create_zugferd_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?
The description clearly states when to use this tool (Peppol e-invoicing) and provides explicit restrictions: customer type must be 'company' or 'freelance', submission requires an active Peppol via POP integration, and the customer needs a valid Peppol participant ID. It does not explicitly name alternative tools for other formats, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_create_sdi_invoiceCreate SdI / FatturaPA Invoice (XML)A
Generate an Italian FatturaPA electronic invoice in XML format and optionally submit it to the SdI (Sistema di Interscambio).
This tool creates a compliant FatturaPA XML document that satisfies Italian e-invoicing regulations (D.Lgs. 127/2015). The invoice can be generated locally (XML only) or submitted directly to SdI for B2B/B2C delivery.
Key facts:
Supports invoice types: TD01 (invoice) and TD04 (credit note)
Customer types: private, company, freelance, pa (Public Administration)
For Private customers: sdi_type must be '0000000' and tax_id_code (codice fiscale) is required
For PA customers: use version='FPA12' and the 6-char PA office code as sdi_type
VAT rates: 22%, 10%, 5%, 4%, 0% (with nature code required when 0%)
Submission to SdI requires Growth+ plan with active SdI via POP integration
Returns: XML document string when not submitting, or JSON with UUID when submitting.
Args:
data: Complete invoice data (transmitter, supplier, customer, line items, payment)
submit_to_sdi: Set true to automatically submit to SdI (requires active integration)
integration: Override integration config (sdi-via-pop, pop-to-webhook, fatture-in-cloud)
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Full invoice data object | |
| site_url | No | Site/shop URL | |
| site_title | No | Site/shop title | |
| environment | No | Target environment (e.g. 'sandbox') | |
| integration | No | Integration configuration — use this to override the default behaviour or deliver via webhook/Fatture in Cloud. Overrides submit_to_sdi if set. | |
| submit_to_sdi | No | If true, automatically submits the invoice to the Italian SdI (Sistema di Interscambio). Requires active SdI via POP integration (Growth+ plan). | |
| plugin_version | No | Caller application version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a write operation (readOnlyHint=false) with possible external side effects (openWorldHint=true). The description adds substantial context: it creates a compliant XML document, can submit to SdI, requires a specific plan, and returns either an XML string or JSON with UUID. It also discloses supported invoice types and customer-specific requirements, all consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a lead sentence, a 'Key facts' bullet list, a 'Returns' line, and an 'Args' section. It's moderately lengthy but every section serves a purpose given the tool's complexity, and it avoids repeating schema details verbatim.
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 explicitly states return values ('XML document string when not submitting, or JSON with UUID when submitting') and covers generation, submission, integration options, and plan requirements. Minor omissions like explicit error conditions do not significantly impact completeness for this complex 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?
Schema coverage is 100%, so the schema already documents all parameters. The description adds semantic constraints beyond the schema: e.g., 'For Private customers: sdi_type must be ''0000000'' and tax_id_code (codice fiscale) is required', 'For PA customers: use version=''FPA12'' and the 6-char PA office code as sdi_type', and VAT rates with nature code required at 0%. These enrich parameter understanding beyond the structured fields.
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 'Generate an Italian FatturaPA electronic invoice in XML format and optionally submit it to the SdI', which states a specific verb, resource, and scope. This distinguishes it from sibling tools like pop_create_ksef_invoice (Poland) or pop_create_zugferd_invoice (Germany) by explicitly targeting Italian FatturaPA e-invoicing.
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 provides clear usage context: Italian e-invoicing compliance (D.Lgs. 127/2015), support for B2B/B2C, customer types, and the Growth+ plan requirement for SdI submission. However, it does not explicitly name alternative tools or state when not to use this tool, so it falls short of full exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_create_zugferd_invoiceCreate ZUGFeRD / Factur-X InvoiceA
Generate a ZUGFeRD/Factur-X document package containing a visual PDF, EN16931 CII XML, and hybrid PDF with embedded XML.
The POP Cloud API performs the authoritative document and fiscal validation and returns structured generation metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Full invoice data object for ZUGFeRD/Factur-X generation | |
| site_url | No | ||
| site_title | No | ||
| environment | No | Target environment (e.g. 'sandbox') | |
| plugin_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation (readOnlyHint=false). The description adds that the API performs authoritative validation and returns generation metadata, which is useful context. However, openWorldHint=true is not addressed, and no side effects (e.g., external calls, persistence) are disclosed.
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 with zero filler. It front-loads the main purpose and then adds a valuable note about validation. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex nested schema and no output schema, the description is far too incomplete. It does not explain the return metadata structure, prerequisites, common use cases, or how the many fields interrelate. The sparse description leaves the agent to infer critical details from the schema alone.
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 coverage is only 40% and the description provides no parameter-level detail. It does not explain the required 'data' object, how to structure nested fields, or clarify any of the poorly documented parameters. The description adds no meaning beyond the schema's existing field descriptions.
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 generates a ZUGFeRD/Factur-X document package with specific components (visual PDF, EN16931 CII XML, hybrid PDF). This distinctly separates it from sibling tools like pop_create_sdi_invoice or pop_create_peppol_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?
The description implies usage for ZUGFeRD/Factur-X invoices but gives no explicit guidance on when to choose this over alternatives, nor any exclusions or context about regional/regulatory applicability. It lacks a 'when to use vs. other tools' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_get_invoice_statusGet SdI Invoice StatusARead-onlyIdempotent
Retrieve the SdI processing status and notifications for a submitted invoice.
After submitting an invoice to the Italian SdI (Sistema di Interscambio), the system processes it asynchronously and sends notifications. This tool polls the current status and all notifications.
SdI notification statuses:
pending: Invoice received, awaiting processing
accepted: Invoice accepted and delivered to recipient
rejected: Invoice rejected (check details for reason and correction steps)
delivery: Delivery notification received
Note: SdI processing can take from minutes to hours. If no notifications are returned, wait and retry.
Args:
uuid: The UUID returned by pop_create_sdi_invoice (when submit_to_sdi=true)
response_format: 'markdown' for readable output, 'json' for structured data
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | Invoice UUID returned by pop_create_sdi_invoice when submit_to_sdi=true | |
| environment | No | Target environment (e.g. 'sandbox') | |
| response_format | No | Output format: 'markdown' for human-readable, 'json' for structured data | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining asynchronous processing, notification delivery, status meanings, and the need to wait and retry if no notifications are returned. This adds significant behavioral context that the annotations (readOnlyHint, idempotentHint, etc.) do not capture, making the tool's behavior predictable.
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 well-structured with a clear opening, a bulleted list of statuses, a note on retry, and an args section. Every sentence adds value, and the most important information is front-loaded. It is concise without being under-specified.
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 lack of an output schema, the description provides useful context by listing possible statuses and the meaning of response_format. It explains retry behavior and ties the uuid to pop_create_sdi_invoice. However, it does not describe the full response structure (e.g., fields beyond status/notifications) or error handling, leaving some ambiguity about the exact return 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?
Schema description coverage is 100%, so the baseline is 3. The description repeats the schema descriptions for uuid and response_format without adding new information, and it omits the environment parameter entirely. There is no added value beyond what the input schema already provides.
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 a specific verb and resource: 'Retrieve the SdI processing status and notifications for a submitted invoice.' It clearly identifies the tool's function and distinguishes it from sibling tools like pop_get_sdi_document (which retrieves the document itself) by focusing on status polling and notifications.
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 provides clear context for when to use the tool: 'After submitting an invoice to the Italian SdI... This tool polls the current status and all notifications.' It also advises on retry behavior. However, it does not explicitly name alternative tools or state when not to use it, which would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_get_peppol_documentGet Peppol DocumentARead-onlyIdempotent
Retrieve a Peppol document from the network by UUID.
After a Peppol invoice is submitted, use this tool to retrieve the processed document or check its delivery status on the Peppol network.
Args:
uuid: The Peppol document UUID from pop_create_peppol_invoice
zone: Country code for the Peppol access point (e.g. 'BE' for Belgium). Required for some regions.
response_format: Output format
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Document type to retrieve: invoice or credit-note | invoice |
| uuid | Yes | Peppol document UUID returned by pop_create_peppol_invoice when submit_to_peppol=true | |
| zone | No | Country code of the Peppol access point zone (e.g. 'BE' for Belgium). Required for some countries. | |
| environment | No | Target environment (e.g. 'sandbox') | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds workflow context (processed document after submission), the checking of delivery status, and notes zone requirements for some regions, which goes beyond 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?
The description is front-loaded with a clear purpose, split into a concise intro, usage context, and a short args list. It doesn't waste words, though the args list somewhat repeats schema 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?
Without an output schema, the description doesn't fully clarify what the tool returns—whether it's the document content, delivery status, or both. It hints at this via 'check its delivery status' and the response_format parameter, but a more explicit description of the return structure would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, and the schema documents most parameters. The description adds a valuable link for uuid (from pop_create_peppol_invoice) and hints at zone requirements, but these are also present in the schema. The response_format is only described as 'Output format,' adding minimal 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?
The description opens with 'Retrieve a Peppol document from the network by UUID,' which clearly specifies the verb, resource, and key identifier. It distinguishes itself from sibling tools like pop_get_sdi_document by focusing specifically on the Peppol network.
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 explicitly states 'After a Peppol invoice is submitted, use this tool to retrieve the processed document or check its delivery status on the Peppol network,' providing a clear when-to-use context. However, it does not mention alternatives or exclusions, so it doesn't reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_get_sdi_documentGet SdI DocumentARead-onlyIdempotent
Retrieve an SdI document from POP storage by UUID.
Fetches a previously submitted or preserved SdI (FatturaPA) document. Useful for auditing, re-downloading, or verifying stored invoices.
Requires: Growth+ plan with active SdI via POP integration.
Args:
uuid: The SdI document UUID
response_format: 'markdown' for readable summary, 'json' for raw data
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | SdI document UUID to retrieve | |
| environment | No | Target environment (e.g. 'sandbox') | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description need not repeat that. It adds valuable context beyond annotations, such as the storage location ('POP storage'), the document type (SdI/FatturaPA), and a critical requirement ('Growth+ plan with active SdI via POP integration'). This helps the agent understand prerequisites and trust boundaries.
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 well-structured and front-loaded with the primary action. It includes a use-case sentence, a requirement line, and a concise Args list. Every sentence earns its place, though the second sentence ('Fetches a previously submitted or preserved...') is somewhat redundant with the first and could be merged. Still, it is efficiently written overall.
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 should hint at what the response contains. It does this indirectly through response_format options ('readable summary' vs 'raw data'), which is helpful. However, it lacks information on the environment parameter, error cases, or what happens if the UUID is not found. Given the tool's simplicity and available annotations, the description is adequate but not exhaustive.
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 67% (uuid and response_format have descriptions; environment does not). The description adds meaning by explaining response_format values ('markdown' for readable summary, 'json' for raw data), but it omits the environment parameter entirely, leaving it undefined in both schema and description. uuid is adequately described in schema, so the description adds little there. Overall, the description partially compensates but leaves a gap.
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 primary action: 'Retrieve an SdI document from POP storage by UUID.' It uses a specific verb and resource, and distinguishes itself from sibling tools like pop_verify_sdi_document (verification) and pop_get_peppol_document (Peppol format) by focusing on SdI retrieval. The stated use cases (auditing, re-downloading, verifying stored invoices) further clarify its scope.
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 provides clear usage context: 'Useful for auditing, re-downloading, or verifying stored invoices' and specifies a prerequisite ('Growth+ plan with active SdI via POP integration'). It does not explicitly name alternatives or state when not to use the tool, which prevents a 5, but the context is sufficient for an agent to make a reasonable selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_onboarding_get_account_setupGet Account Setup ConfigurationARead-onlyIdempotent
Retrieve the full account setup payload: current field values, lookup tables, capabilities, and integration state.
This is step 4 of 5 in the onboarding sequence. Call this before save_account_setup to understand:
Which fields are already saved (non-null in configurations)
Which fields are locked (field_locks = true) and cannot be changed
Which integrations are available for the account country (capabilities)
Valid tax regime codes (lookup.tax_regimes keyed by country)
Valid Peppol scheme options (lookup.peppol.endpoint_scheme_options)
Which integration toggles can be set (allowed_integration_toggles)
Key behaviours:
Null values in configurations = field not yet saved, must be provided in save_account_setup.
Locked fields (🔒) must not be changed — the API will reject modifications.
Use capabilities.supports_sdi_onboarding and supports_peppol_onboarding to decide which integration to offer.
lookup.countries labels are in Italian regardless of the lang field.
| Name | Required | Description | Default |
|---|---|---|---|
| onboarding_token | Yes | Token returned by pop_onboarding_verify_otp. Expires 30 minutes after issue. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations indicating read-only, open-world, idempotent, and non-destructive behavior, the description adds critical context: null values mean unsaved fields, locked fields must not be changed, capabilities determine integration options, and country labels are Italian. This goes beyond what annotations provide, enhancing transparency.
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 structured with a clear purpose statement, a sequence note, and a bulleted list of key behaviors. Every sentence and bullet adds value, no redundancy or fluff, making it appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description thoroughly explains the return payload's structure and semantics (configurations, field_locks, capabilities, lookups, allowed_integration_toggles). It also tells the agent how to interpret and use the data, leaving no important context missing.
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 already fully describes the only parameter (onboarding_token) with its source and expiration. The description does not add additional meaning to the parameter, so the baseline score of 3 applies since schema coverage is 100%.
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 it retrieves the full account setup payload including current field values, lookup tables, capabilities, and integration state. It uses a specific verb and resource, and the phrase 'step 4 of 5 in the onboarding sequence' distinguishes it from related onboarding tools like pop_onboarding_get_status and pop_onboarding_save_account_setup.
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 explicitly says 'This is step 4 of 5 in the onboarding sequence' and 'Call this before save_account_setup', providing clear when-to-use guidance. It also lists what to understand from the response, making the intended usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_onboarding_get_statusGet Onboarding StatusARead-onlyIdempotent
Retrieve the current onboarding state for the authenticated account.
This is step 3 of 5 in the onboarding sequence (optional — use to poll state or check progress).
Returns: state, next_action, wizard_variant, wizard_completed, required_fields, step_visibility, integration_state.
Does NOT return configurations (field values). Use pop_onboarding_get_account_setup for those.
Key behaviours:
auth_source will be 'onboarding_token' confirming the token was accepted.
step_visibility.integration = false means SdI/Peppol toggles do not apply to this account (basic variant).
integration_state.ksef.status = 'not_supported_in_onboarding_yet' is correct — not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| onboarding_token | Yes | Token returned by pop_onboarding_verify_otp. Expires 30 minutes after issue. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite strong annotations (readOnly, idempotent), the description adds valuable behavioral context: auth_source meaning, step_visibility interpretation, and a clarification that certain integration_state values are expected and not errors. These prevent misinterpretation of response data.
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 well-structured with a clear opening, use-context, return list, exclusions, and key behaviours. Every section adds value and the formatting makes key facts scannable without unnecessary verbosity.
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?
Considering the absence of an output schema, the description compensates by listing return attributes and explaining important response semantics. It also situates the tool within the 5-step onboarding flow and differentiates it from related tools, making it sufficiently complete for an agent.
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%, including token provenance and expiry, so the description need not repeat parameter details. The tool description does not add much about the parameter itself, matching the baseline for high schema coverage.
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 ('Retrieve') and resource ('current onboarding state'), and explicitly distinguishes itself from the sibling pop_onboarding_get_account_setup by noting it does NOT return configurations. The purpose is unambiguous and well-differentiated.
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 provides explicit when-to-use context ('step 3 of 5', 'use to poll state or check progress') and names the alternative tool for configurations. This gives clear usage direction within the onboarding sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_onboarding_request_otpRequest Onboarding OTPA
Start the POP onboarding flow by sending a one-time password (OTP) to an email address.
This is step 1 of 5 in the onboarding sequence: request-otp → verify-otp → get_status → get_account_setup → save_account_setup
Key behaviours:
The OTP code is returned directly in the response (not just by email). Read otp_code from the response.
OTP expires in 10 minutes. Pass it to pop_onboarding_verify_otp immediately.
If the email does not exist, a new POP account is created automatically.
For administrator accounts, no OTP is issued. Use the admin password as the otp field in verify-otp instead.
No API key required for this call.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Locale hint (e.g. 'en', 'it'). Stored in the session context but does not affect response language. | |
| Yes | Email address to send the OTP to. If the account does not exist it will be created automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond annotations by disclosing key behaviors: OTP is returned directly in the response, expiry is 10 minutes, accounts are auto-created for new emails, administrators require a different password flow, and no API key is needed. This adds substantial context that annotations alone do not provide.
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 moderately long but well-structured with a clear opening line and bullet points for key behaviors. Every sentence adds value, covering purpose, sequence, and edge cases. It is not overly verbose, though it could be slightly tightened without losing fidelity.
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 and lack of output schema, the description is remarkably complete. It covers authentication requirements (no API key), behavioral side effects (account creation), temporal constraints (10-minute expiry), and the exact next step in the workflow. This is sufficient for an agent to invoke the tool correctly and handle the response.
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. The description adds extra meaning by clarifying that 'lang' is only a session hint and does not affect response language, and that 'email' triggers automatic account creation if missing. This goes beyond the schema's field descriptions, justifying a 4.
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: 'Start the POP onboarding flow by sending a one-time password (OTP) to an email address.' It uses a specific verb and resource, and explicitly differentiates it from siblings by labeling it 'step 1 of 5' and referencing subsequent steps in the sequence.
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 provides clear usage context by outlining the full onboarding sequence and specifically instructing to 'Pass it to pop_onboarding_verify_otp immediately.' It also notes edge cases (auto-creation, admin accounts) that affect when to use. However, it does not explicitly state when not to use this tool versus alternatives, so it falls 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.
pop_onboarding_save_account_setupSave Account Setup ConfigurationA
Save the account setup configuration and optionally activate SdI or Peppol integration.
This is step 5 of 5 in the onboarding sequence.
Integration rules:
To activate SdI (Italy/San Marino): set active_sdipop_integration=1 and active_peppol_integration=0
To activate Peppol (EU countries): set active_peppol_integration=1 and active_sdipop_integration=0, and provide all peppol_* fields
SdI and Peppol are mutually exclusive — never set both to 1
For 'basic' variant accounts (non-IT, non-EU): do not send integration toggle fields
Key behaviours:
general_store_vat_number must be unique on the target environment. 422 if already in use.
Sending 0 for an integration toggle means "do not activate" — the value stores as null in configurations. Always read the effective activation state from integration_state.environments.*.sdi.enabled.
Once wizard is complete (wizard_completed=true), calling this again returns the current state without writing (applied_changes=false).
Once Peppol is registered (peppol_legal_entity_uuid set), all Peppol fields are locked permanently.
If SdI activation fails at ACube, the account data is still saved — retry is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| environment | No | Which POP environment to configure. 'live' affects your production account; 'sandbox' is for testing. | live |
| configurations | Yes | Account setup fields. Send only the fields you want to set. Locked fields (field_locks=true) cannot be changed. | |
| onboarding_token | Yes | Token returned by pop_onboarding_verify_otp. Expires 30 minutes after issue. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only indicate non-read-only, non-idempotent, non-destructive), the description adds rich behavioral context: uniqueness requirement with 422 error, the meaning of sending 0 (stores null), the non-writing behavior after wizard completion (applied_changes=false), permanent locking of Peppol fields, and retry safety after SdI failure. This is value-added disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and uses clear bullet points for integration rules and key behaviors. It is longer than a simple two-sentence description, but this is justified by the tool's complexity. Minor inefficiency: the 'Key behaviours' list could be split further, but substance outweighs length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 18 nested sub-parameters and no output schema, yet the description covers the critical side effects (uniqueness, wizard completion guard, Peppol locking, SdI failure retry) and even hints at response fields (applied_changes, integration_state). It stops short of describing the full response structure or all error cases, but for a save action it is largely 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?
The input schema already provides 100% coverage for all parameters, so the baseline is 3. The description goes further by explaining the conditional logic between integration toggle fields (mutual exclusion, required peppol_* fields when active_peppol_integration=1) and the meaning of 0 for toggles, which is not evident from individual schema descriptions.
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 a specific verb+resource ('Save the account setup configuration') and clearly states its role as step 5 of 5 in the onboarding sequence. It distinguishes itself from sibling tools like pop_onboarding_get_account_setup by focusing on the write/update action.
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 provides explicit integration rules (SdI vs Peppol, mutual exclusion, basic variant exclusion) and notes when it is safe/appropriate to call again (wizard incomplete, retry after SdI failure). It does not explicitly name alternative tools, but the step positioning and integration constraints implicitly guide selection away from read-only siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_onboarding_verify_otpVerify Onboarding OTPA
Verify the OTP from pop_onboarding_request_otp and obtain an onboarding token.
This is step 2 of 5 in the onboarding sequence.
Key behaviours:
Returns an onboarding_token (48-character string). Save it — required for all subsequent steps.
Token expires 30 minutes after issue. No refresh endpoint; restart from request-otp if expired.
token_issued_at and token_expires_at are ISO 8601 strings (e.g. 2026-05-26T13:47:15+00:00).
wizard_variant is 'basic' if no country is saved yet — it updates after save_account_setup sets the country.
If wizard_required is false after this step, the account is already fully set up. No further steps needed.
For administrator accounts: pass the admin password as the otp field.
No API key required for this call.
| Name | Required | Description | Default |
|---|---|---|---|
| otp | Yes | 6-digit OTP from the request-otp response (or the administrator password for admin accounts) | |
| Yes | Must match the email used in pop_onboarding_request_otp | ||
| site_id | No | Optional caller site domain or identifier | |
| platform | No | Client identifier recorded in the session. Default: 'mcp' | mcp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses many behavioral traits beyond the minimal annotations: the returned onboarding_token is 48 characters, token expires after 30 minutes, there is no refresh endpoint, token_issued_at/token_expires_at are ISO 8601, wizard_variant behavior depends on country setup, and no API key is required. The annotations only specify flags; the description enriches the agent's understanding of the tool's side effects, lifecycle, and response semantics.
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 well-structured and front-loaded: the first sentence states the core purpose, followed by sequence context, then bullet-point key behaviors. Each bullet is concise and information-dense, covering token, expiry, response fields, wizard variant, completion condition, and admin case. No wasted words; the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by explaining return values (onboarding_token, token_issued_at, token_expires_at, wizard_variant, wizard_required) and their significance. It also covers the token lifecycle, expiration handling, sequence context, and authentication nuance for admins. For a step in a multi-step onboarding flow, this is complete and actionable for an agent.
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. The description does not add significant meaning beyond the schema for parameters like otp (schema already notes 'or the administrator password for admin accounts'), email (schema already requires matching), and site_id/platform (schema already describes them). The description's value is more about return behavior than parameter semantics, so it stays at the 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?
The description starts with a clear, specific verb+resource: 'Verify the OTP from pop_onboarding_request_otp and obtain an onboarding token.' It explicitly references the sibling tool pop_onboarding_request_otp, distinguishing this as the verification step in the onboarding flow. The title and name are consistent, and the purpose is unambiguous.
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 provides explicit usage context: 'This is step 2 of 5 in the onboarding sequence.' It states when not to continue ('If wizard_required is false after this step, the account is already fully set up. No further steps needed'), and offers an alternative when the token expires ('No refresh endpoint; restart from request-otp if expired'). It also notes when to use the admin password as OTP, giving clear when-to-use vs alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_preserve_documentPreserve / Archive SdI DocumentAIdempotent
Archive an SdI document in long-term digital storage (conservazione sostitutiva).
Italian law requires electronic invoices to be preserved for 10 years. This tool archives a document in POP's certified digital storage system to meet legal preservation requirements.
IMPORTANT: Only call this tool when pop_get_invoice_status returns a status of RC (Ricevuta di Consegna — successfully delivered) or MC (Mancata Consegna — delivery failed but SdI accepted). Do NOT call for other statuses such as NS, EC, SE, or DT.
Requires: Basic+ plan with active SdI via POP integration.
Args:
uuid: UUID of the SdI document to archive
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | UUID of the SdI document to archive/preserve in long-term storage | |
| environment | No | Target environment (e.g. 'sandbox') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds context beyond annotations by explaining the legal preservation requirement and the status precondition. It does not explicitly state side effects (e.g., document becoming immutable), but given the annotations cover safety traits, the added context is sufficient.
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 well-structured: purpose, legal context, IMPORTANT usage rule, requirements, and args. It is slightly redundant ('Archive an SdI document...' and 'This tool archives a document...'), but each section serves a purpose and is front-loaded with the primary action.
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 has no output schema, the description provides enough context to call it correctly: when to call, prerequisites, and the single key parameter. It does not describe return values, but the action is simple and the annotations fill in the rest. This is complete for a straightforward archival 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?
Schema description coverage is 100%, so the baseline is 3. The description repeats the uuid parameter but adds no extra meaning beyond the schema. The environment parameter is not mentioned in the description, but it is adequately described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Archive an SdI document in long-term digital storage.' This clearly distinguishes it from sibling tools like pop_get_sdi_document or pop_verify_sdi_document, which are read/check operations. The addition of 'conservazione sostitutiva' and the legal context further clarify scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: only after pop_get_invoice_status returns RC or MC, and explicitly lists statuses to avoid (NS, EC, SE, DT). Also gives a prerequisite (Basic+ plan with active SdI). This is model guidance with both inclusion and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_sync_zoho_documentSync Invoice to ZohoA
Synchronize an invoice or credit note with the account's native Zoho Books/Invoice connector.
The connector status is checked first by default. TD04 credit notes require a reference in connected_invoice_data, and the POP Cloud API performs the authoritative Zoho payload validation and mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Full invoice data object for Zoho synchronization | |
| site_url | No | ||
| site_title | No | ||
| environment | No | Target environment (e.g. 'sandbox') | |
| plugin_version | No | ||
| check_connector_status | No | Check that the account's Zoho connector is active before synchronizing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show a non-read-only, non-idempotent, non-destructive operation; description adds that connector status is checked first and that the POP Cloud API performs authoritative payload validation/mapping. It does not disclose duplicate creation risks, failure behavior, or side effects beyond the Zoho connector, so only partial transparency.
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, front-loaded with the purpose, and no filler. Every clause adds relevant context: connector status check, TD04 prerequisite, and authoritative validation/mapping by the POP Cloud API.
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 complex, side-effecting sync tool with openWorldHint=true and no output schema, the description omits return values, error/duplicate behavior, and what happens on the Zoho side. The TD04 prerequisite and connector check are useful but insufficient for a mutation tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and the description adds little beyond the schema. It repeats that connected_invoice_data is required for credit notes (already stated in the schema) and provides no guidance for undocumented top-level params like site_url, site_title, or plugin_version.
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?
Clearly states it synchronizes invoices or credit notes to the account's native Zoho Books/Invoice connector, with a specific verb and resource. The sibling tool names (pop_create_sdi_invoice, pop_create_ksef_invoice, etc.) make the Zoho-specific target distinct.
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?
Implies usage for Zoho syncing and provides a prerequisite for TD04 credit notes (reference in connected_invoice_data), plus the default connector-status check. However, it does not explicitly say when to use this tool over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pop_verify_sdi_documentVerify SdI DocumentARead-onlyIdempotent
Validate an SdI (FatturaPA) XML document for compliance before submission.
Use this tool to check if an SdI XML document passes XML syntax validation and Italian e-invoicing compliance checks — without actually submitting it. This helps catch errors before they result in SdI rejections.
Common validation checks:
XML schema conformance
Fiscal code format
VAT number validity
Required field presence
Amount consistency
Requires: Basic+ plan with active SdI via POP integration and registered business.
Args:
xml_base64: The SdI XML document encoded as a Base64 string
| Name | Required | Description | Default |
|---|---|---|---|
| xml_base64 | Yes | The SdI XML document encoded as a Base64 string | |
| environment | No | Target environment (e.g. 'sandbox') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint=false. The description adds value by explaining the validation checks performed, the requirement for a 'Basic+ plan with active SdI via POP integration and registered business,' and the fact that it does not submit. This enriches behavioral transparency beyond 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?
The description is well-structured and front-loaded with the main purpose, followed by usage context, a bulleted list of checks, and requirements. The 'Args' section is somewhat redundant with the schema, slightly impacting conciseness, but the overall organization makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential aspects: purpose, usage timing, prerequisites, and validation checks. It lacks an output schema, so a note about the return value or error reporting would be helpful, but the description gives sufficient context for a pre-submission validation 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?
Schema coverage is 100%, with both parameters including descriptions. The description's 'Args' section repeats the exact xml_base64 schema description without adding further meaning, and it omits the environment parameter entirely. The schema already fully defines the parameters, so the description adds no new semantic information.
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 action: 'Validate an SdI (FatturaPA) XML document for compliance before submission.' It uses a specific verb and resource, and explicitly contrasts with submission by saying 'without actually submitting it,' distinguishing it from sibling tools like pop_create_sdi_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?
The description provides clear usage context: 'Use this tool to check if an SdI XML document passes XML syntax validation and Italian e-invoicing compliance checks — without actually submitting it.' It frames the tool as a pre-submission validation step to catch errors. However, it does not explicitly name alternative tools or state when not to use it, so it lacks explicit exclusions.
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. Dates show when Glama detected each change.
16 tool updates
v1.2.0- First observed
pop_create_ksef_invoice - First observed
pop_create_pdf_invoice - First observed
pop_create_peppol_invoice - First observed
pop_create_sdi_invoice - First observed
pop_create_zugferd_invoice - First observed
pop_get_invoice_status - First observed
pop_get_peppol_document - First observed
pop_get_sdi_document - First observed
pop_onboarding_get_account_setup - First observed
pop_onboarding_get_status - First observed
pop_onboarding_request_otp - First observed
pop_onboarding_save_account_setup - First observed
pop_onboarding_verify_otp - First observed
pop_preserve_document - First observed
pop_sync_zoho_document - First observed
pop_verify_sdi_document
TDQS
Most tools have distinct purposes based on their target invoice format or operation. Potential confusion exists between pop_get_invoice_status and pop_get_sdi_document, but descriptions clearly differentiate status polling from document retrieval. Onboarding tools are distinctly sequenced.
All tools follow a consistent pop_ prefix with snake_case. Create tools follow pop_create_<format>_invoice, get tools use pop_get_<resource>, and onboarding tools are grouped as pop_onboarding_*. The naming pattern is predictable and uniform.
With 16 tools, the server is at the high end of the ideal range, but each tool serves a distinct purpose across multiple invoice formats and an onboarding sequence. The count is justified for the domain's breadth.
The server covers SdI and Peppol well with create/status/retrieve/verify operations, but lacks equivalent status and verification tools for KSeF and ZUGFeRD. Generic listing or cancellation tools are missing, and credit note support is inconsistent across formats.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Italy FatturaPA invoices for AI agents: build FPR12 XML, transmit to the SdI, query status.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
- Frihet ERPOAuthio.frihet
AI-native ERP MCP: ES/EU fiscal compliance (VeriFactu/TicketBAI/Facturae), invoicing, tax, banking
Related MCP Servers
- FlicenseBqualityDmaintenanceMCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.1556-
- AlicenseAqualityAmaintenanceModel Context Protocol (MCP) server for Italian Electronic Invoicing (FatturaPA / SDI). Provide tools to validate, generate, and explore API specifications for Sistema di Interscambio (SDI) interoperability.431Apache 2.0
- AlicenseAqualityDmaintenanceMCP server for German e-invoice compliance (XRechnung 3.0 & ZUGFeRD 2.x) enabling AI agents to validate, generate, parse, and check compliance of electronic invoices per EN 16931.61MIT
- AlicenseAqualityBmaintenanceMCP server for VoxFactura enabling AI assistants to query business data (invoices, expenses, project margins, clients, VAT) and create draft quotes or mark invoices paid via a scoped API, with no direct client sends.11MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/getpopapi/pop-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server