Skip to main content
Glama
getpopapi
by getpopapi

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

License: MIT Node.js


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/mcp

Head 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-Version and Mcp-Method are required on every request (per SEP-2243), and must match the body's _meta.protocolVersion and method exactly, or the server rejects the request with a 400 and JSON-RPC error -32020 (HeaderMismatch). tools/call requests additionally require an Mcp-Name header matching params.name.

Example with MCP Inspector

npx @modelcontextprotocol/inspector

Configure 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.tssrc/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

pop_create_sdi_invoice

POST /create-xml

Any

pop_create_peppol_invoice

POST /create-ubl

Any (Basic+ to submit)

pop_create_pdf_invoice

POST /create-pdf

Any (Basic+ for email)

pop_create_ksef_invoice

POST /create-ksef-xml

Any (KSeF setup for provider submission)

pop_create_zugferd_invoice

POST /create-zugferd

Any

pop_sync_zoho_document

POST /integration/zoho/sync

Zoho connector required

Status & Retrieval

Tool

Endpoint

Plan

pop_get_invoice_status

POST /sdi/document-notifications

Any

pop_get_peppol_document

POST /peppol/document-get

Basic+

pop_get_sdi_document

POST /sdi/document-get

Basic+

Validation & Advanced SdI

Tool

Endpoint

Plan

pop_verify_sdi_document

POST /sdi/document-verify

Basic+

pop_preserve_document

POST /sdi/document-preserve

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:

  1. Open https://popapi.io/otp-login/

  2. Enter your email address

  3. Receive a one-time password (OTP) by email and enter it

  4. Complete the configuration wizard

  5. Open https://popapi.io/Account > API

  6. Copy the default generated license_key

Key Management

  • Your account includes one default license_key, visible under Account > API

  • You can generate additional keys linked to the same account from that same page

  • Every license_key must be treated as a secret credential — do not commit it to source control

  1. Get your license_key

  2. Test it with GET /account-profile

  3. Send one document-generation request with a real payload

  4. Add optional delivery integrations only after local generation works


Installation

npm install -g @getpopapi/pop-mcp

From Source

git clone https://github.com/getpopapi/pop-mcp
cd pop-mcp
npm install
npm run build

Configuration

Set your POP license key as an environment variable:

export POP_API_KEY=your_license_key_here

Optional — use the staging environment:

export POP_ENVIRONMENT=staging

Claude 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.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.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

data

object

Full invoice data (see Invoice Data Structure)

submit_to_sdi

boolean

Set true to submit to SdI. Requires Basic+ plan with active SdI integration. Default: false

integration

object

Override integration config. Overrides submit_to_sdi if set.

environment

string

Target environment (e.g. "sandbox")

Integration options for integration.use:

  • "sdi-via-pop" or "sdi" — Submit via POP SdI

  • "pop-to-webhook" — Deliver to a webhook (requires id)

  • "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" }
}

integration is omitted when submit_to_sdi is false and 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

data

object

Full invoice data. customer_type must be "company" or "freelance"

submit_to_peppol

boolean

Set true to submit to the Peppol network. Requires Basic+ plan. Default: false

integration

object

Override integration config

environment

string

Target environment

Integration options for integration.use:

  • "peppol-via-pop" or "peppol" — Submit via POP Peppol

  • "pop-to-webhook" — Deliver to a webhook (requires id)

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

data

object

Invoice data. Must include data.pdf for PDF-specific settings

send_email

boolean

Set true to email the PDF (requires data.pdf.email_invoice, Basic+ plan). Default: false

environment

string

Target environment

data.pdf fields:

Field

Description

doc_type_title

Title shown on document (e.g. "Invoice", "Receipt")

logo_url

Company logo URL (HTTPS)

head.store_info_address

Supplier address string in header

head.billing[]

Customer billing address array

head.shipping[]

Shipping address array (optional)

email_invoice.to

Up to 3 recipient email addresses

email_invoice.from

Reply-to address

footer_text

Custom footer message

total_tax

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

data

object

Full invoice data for KSeF FA(3) generation

integration

object

Optional KSeF provider submission config: { use: "ksef" | "ksef-via-pop", action }

environment

string

Target environment (e.g. "sandbox")

Domain rules specific to KSeF:

  • Poland only — transfer_lender.personal_data.tax_id_vat.country_id must be "PL" with a 10-digit NIP as id_code

  • customer_type must be "company" or "freelance" (no private individuals)

  • nature is 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 variant

  • transmitter_data is not used (SdI-only concept)

  • payment_data.payment_details only accepts MP01, MP02/MP03, MP05, MP08 — other payment method codes are rejected at generation time

  • Base 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" }
}

integration is 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

data

object

Full invoice data for ZUGFeRD/Factur-X generation

environment

string

Target environment (e.g. "sandbox")

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

uuid

string (UUID)

Invoice UUID returned by pop_create_sdi_invoice when submit_to_sdi=true

response_format

"markdown" | "json"

Output format. Default: "markdown"

environment

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

uuid

string (UUID)

Peppol document UUID from pop_create_peppol_invoice

zone

string (2 chars)

Country code of the Peppol access point (e.g. "BE" for Belgium). Required for some regions.

response_format

"markdown" | "json"

Output format. Default: "markdown"

environment

string

Target environment

API payload sent:

{
  "license_key": "YOUR_LICENSE_KEY",
  "integration": { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "zone": "IT" }
}

zone is 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

uuid

string (UUID)

SdI document UUID

response_format

"markdown" | "json"

Output format. Default: "markdown"

environment

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

xml_base64

string

The SdI XML document encoded as a Base64 string

environment

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

uuid

string (UUID)

UUID of the SdI document to archive

environment

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_status returns status RC (Ricevuta di Consegna) or MC (Mancata Consegna). Do not call for statuses NS, EC, SE, or DT.

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

Quick 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.js

Development

# Run with auto-reload
npm run dev

# Build
npm run build

# Clean build artifacts
npm run clean

Invoice 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_text

Error Reference

Error Code

Meaning

Solution

unauthorized_user

Invalid license key

Check POP_API_KEY

insufficient_level

Plan too low

Upgrade POP plan

business_not_registered

No business profile

Register on popapi.io

integration_inactive

SdI/Peppol not enabled

Activate on popapi.io

pop_api_email_limit

>3 email recipients

Reduce to max 3

pop_api_email_not_allowed

Plan doesn't allow email

Upgrade to Basic+



License

MIT © getpopapi

Available Tools

16 tools
pop_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesFull invoice data object for KSeF FA(3) generation
site_urlNo
site_titleNo
environmentNoTarget environment (e.g. 'sandbox')
integrationNoOptional KSeF provider submission configuration
plugin_versionNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesFull invoice data object. Must include data.pdf configuration for PDF-specific settings.
site_urlNo
send_emailNoIf true, emails the PDF to recipients in data.pdf.email_invoice.to (max 3 addresses, Basic+ plan required).
site_titleNo
environmentNoTarget environment (e.g. 'sandbox')
plugin_versionNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesFull invoice data object. Note: Peppol only supports company and freelance customer types.
site_urlNo
site_titleNo
environmentNoTarget environment (e.g. 'sandbox')
integrationNoIntegration configuration override
plugin_versionNo
submit_to_peppolNoIf true, automatically submits to the Peppol network. Requires active Peppol via POP integration.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesFull invoice data object
site_urlNoSite/shop URL
site_titleNoSite/shop title
environmentNoTarget environment (e.g. 'sandbox')
integrationNoIntegration configuration — use this to override the default behaviour or deliver via webhook/Fatture in Cloud. Overrides submit_to_sdi if set.
submit_to_sdiNoIf true, automatically submits the invoice to the Italian SdI (Sistema di Interscambio). Requires active SdI via POP integration (Growth+ plan).
plugin_versionNoCaller application version

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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

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

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesFull invoice data object for ZUGFeRD/Factur-X generation
site_urlNo
site_titleNo
environmentNoTarget environment (e.g. 'sandbox')
plugin_versionNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 StatusA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYesInvoice UUID returned by pop_create_sdi_invoice when submit_to_sdi=true
environmentNoTarget environment (e.g. 'sandbox')
response_formatNoOutput format: 'markdown' for human-readable, 'json' for structured datamarkdown

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines4/5

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 DocumentA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoDocument type to retrieve: invoice or credit-noteinvoice
uuidYesPeppol document UUID returned by pop_create_peppol_invoice when submit_to_peppol=true
zoneNoCountry code of the Peppol access point zone (e.g. 'BE' for Belgium). Required for some countries.
environmentNoTarget environment (e.g. 'sandbox')
response_formatNomarkdown

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DocumentA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYesSdI document UUID to retrieve
environmentNoTarget environment (e.g. 'sandbox')
response_formatNomarkdown

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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

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

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ConfigurationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
onboarding_tokenYesToken returned by pop_onboarding_verify_otp. Expires 30 minutes after issue.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

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

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StatusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
onboarding_tokenYesToken returned by pop_onboarding_verify_otp. Expires 30 minutes after issue.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLocale hint (e.g. 'en', 'it'). Stored in the session context but does not affect response language.
emailYesEmail address to send the OTP to. If the account does not exist it will be created automatically.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
environmentNoWhich POP environment to configure. 'live' affects your production account; 'sandbox' is for testing.live
configurationsYesAccount setup fields. Send only the fields you want to set. Locked fields (field_locks=true) cannot be changed.
onboarding_tokenYesToken returned by pop_onboarding_verify_otp. Expires 30 minutes after issue.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
otpYes6-digit OTP from the request-otp response (or the administrator password for admin accounts)
emailYesMust match the email used in pop_onboarding_request_otp
site_idNoOptional caller site domain or identifier
platformNoClient identifier recorded in the session. Default: 'mcp'mcp

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines5/5

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 DocumentA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYesUUID of the SdI document to archive/preserve in long-term storage
environmentNoTarget environment (e.g. 'sandbox')

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesFull invoice data object for Zoho synchronization
site_urlNo
site_titleNo
environmentNoTarget environment (e.g. 'sandbox')
plugin_versionNo
check_connector_statusNoCheck that the account's Zoho connector is active before synchronizing

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DocumentA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
xml_base64YesThe SdI XML document encoded as a Base64 string
environmentNoTarget environment (e.g. 'sandbox')

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 16 tool updatesv1.2.0
    • First observedpop_create_ksef_invoice
    • First observedpop_create_pdf_invoice
    • First observedpop_create_peppol_invoice
    • First observedpop_create_sdi_invoice
    • First observedpop_create_zugferd_invoice
    • First observedpop_get_invoice_status
    • First observedpop_get_peppol_document
    • First observedpop_get_sdi_document
    • First observedpop_onboarding_get_account_setup
    • First observedpop_onboarding_get_status
    • First observedpop_onboarding_request_otp
    • First observedpop_onboarding_save_account_setup
    • First observedpop_onboarding_verify_otp
    • First observedpop_preserve_document
    • First observedpop_sync_zoho_document
    • First observedpop_verify_sdi_document

TDQS

A4/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    MCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.
    15
    56
    -
  • A
    license
    A
    quality
    A
    maintenance
    Model 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.
    43
    1
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    MCP 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.
    6
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP 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.
    11
    MIT

Latest Blog Posts

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