Skip to main content
Glama

Server Details

Issue and manage Brazilian fiscal documents: NF-e for goods, NFS-e for services.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
stackin-io/stackin-mcp-plugin
GitHub Stars
0

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation4/5

Most tools are clearly distinct by resource and action (issue vs consult vs cancel vs correct; list vs lookup vs search). The only mild overlap is between consult_invoice and get_invoice_submissions, but their descriptions clearly separate status lookup from attempt history.

Naming Consistency4/5

Tool names consistently follow a verb_noun pattern (issue_invoice, cancel_invoice, list_invoices, lookup_taxpayer). Minor deviations: get_invoice_pdf and get_invoice_submissions use 'get' while others use 'list' or 'consult', but the pattern remains predictable.

Tool Count4/5

16 tools is slightly above the ideal 3-15 range but justified by the domain's complexity: Brazilian fiscal documents (NF-e/NFS-e) require distinct operations for issuing, correcting, cancelling, reissuing, manifesting, and fiscal code lookups. Each tool serves a real workflow need.

Completeness4/5

The surface covers the full lifecycle of fiscal documents: issue, validate, consult, correct, cancel, reissue, PDF, and received-invoice manifestation. Minor gaps exist (e.g., no tool to update company fiscal profile or manage multiple companies), but core workflows are complete.

Available Tools

16 tools
cancel_invoiceA
Destructive
Inspect

Cancel an authorized invoice.

Legal cancellation, with fiscal and accounting effect, inside a window the NFS-e authorizer enforces for the municipality. Ask the human to confirm before calling; never call it speculatively. The reason reaches the tax authority verbatim and must be at least 15 characters.

Pass idempotency_key to make a retry safe: repeating the same key with the same access key and reason replays the first answer instead of cancelling a second time. Reuse the key only when retrying that exact call; a genuinely new cancellation needs a new key, or none. Nothing generates one for you — two calls without a key are two cancellations.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
access_keyYes
document_typeYes
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLocal id. Use it for reissue and for submissions, and when a document was rejected and has no key.
statusNoissued, rejected or cancelled.
protocolNoThe authorization protocol, when granted.
access_keyNoThe authorizer's key. Absent while the document is not authorized.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint, idempotentHint, readOnlyHint) by detailing the fiscal/accounting impact, the verbatim submission of reason to the tax authority, and the exact semantics of idempotency_key (replay first answer vs. genuinely new cancellations). This is critical behavioral context not visible from structured 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 only four compact sentences (or a few short paragraphs), each carrying tactical value: the core action, legal conditions, human-in-the-loop rule, reason constraint, and idempotency behavior. No filler, fluff, or redundant restatements.

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 destructive nature, the description covers all non-obvious aspects the agent needs: the legal cancellation window, the requirement to ask the human, the verbatim reason, and high-value idempotency semantics. Since an output schema exists, return values are already documented and don't need describing.

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 0%, so the description must compensate. It provides important meaning for two parameters (reason min length and verbatim transfer; idempotency_key retry behavior). Access_key and document_type are left to inference, but document_type's enum is self-explanatory and access_key is predictably the invoice identifier, so the description handles the most nuanced parts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

States the action clearly ('Cancel an authorized invoice') and grounds it in legal/fiscal/accounting effect within the NFS-e municipality window, which distinguishes it from siblings like correct_invoice or invalidate_numbering.

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?

Explicitly says to ask a human to confirm and never to call it speculatively, giving a clear when-to-use condition. It does not name sibling alternatives for when-not-to (e.g., 'use correct_invoice for adjustments'), so it falls just 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.

consult_invoiceA
Read-onlyIdempotent
Inspect

Look up an invoice's current status by its access key.

Read-only: it never changes the document.

ParametersJSON Schema
NameRequiredDescriptionDefault
access_keyYes
document_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLocal id. Use it for reissue and for submissions, and when a document was rejected and has no key.
statusNoissued, rejected or cancelled.
protocolNoThe authorization protocol, when granted.
access_keyNoThe authorizer's key. Absent while the document is not authorized.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that it never changes the document, which is redundant but consistent. It doesn't disclose any additional behaviors like error conditions or rate limits, but with annotations covering the safety, a score of 3 is appropriate.

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 with no filler. The key information (read-only) is front-loaded. Perfectly concise.

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?

The tool has an output schema, so return values are covered. However, the parameters are insufficiently explained: 'document_type' is required but its purpose is not stated. Given the low schema coverage, the description fails to make the tool callable correctly.

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 description mentions 'access key' but does not explain the purpose of 'document_type' which is a required enum (nfse, nfe). With 0% schema description coverage, the description should have explained both parameters, but it only covers access key, and even that is not elaborated beyond naming it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

The description states a clear verb ('look up') and resource ('invoice's current status') with a specific access key. It is distinct from sibling tools like cancel_invoice or issue_invoice by being read-only.

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 explicitly says 'Read-only: it never changes the document,' which signals that this tool is for status checks only and not for modifications. However, it does not explicitly mention alternative tools, so it's slightly less explicit than ideal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

correct_invoiceA
Destructive
Inspect

File an electronic correction letter (CC-e) against an NF-e.

NF-e only: there is no correction letter for an NFS-e, where a wrong document is cancelled and issued again.

It corrects wording and non-fiscal fields only. It cannot change values, taxes, the recipient or the products — those still require cancelling and issuing again, and telling the user a CC-e will fix an amount is wrong in a way they only discover at an audit.

Each letter supersedes the previous one and the SEFAZ keeps at most 20 per document. The text reaches the tax authority verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
access_keyYes
correctionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLocal id. Use it for reissue and for submissions, and when a document was rejected and has no key.
statusNoissued, rejected or cancelled.
protocolNoThe authorization protocol, when granted.
access_keyNoThe authorizer's key. Absent while the document is not authorized.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, so the mutation aspect is covered. The description adds significant behavioral context: each letter supersedes the previous one, SEFAZ keeps at most 20 per document, and the text reaches the tax authority verbatim. It also explains the limitation on fiscal fields, which is not evident from annotations. This goes well beyond what annotations 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 concise and front-loaded with the core purpose, followed by essential limitations and side effects. Each sentence adds value, and it avoids redundant phrasing. It is slightly longer than strictly necessary but well-organized, making it easy to scan. A score of 4 reflects strong structure with minor room for tightening.

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 mutation tool with destructiveHint, the description covers the key operational details: NF-e only, field limitations, supersession, 20-letter cap, and verbatim transmission. It also distinguishes from cancellation/reissue. It does not describe the output schema (which is provided separately) or mention authentication or error conditions, but those are less critical given the existing output schema and the thoroughness of the description.

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 0%, so the description must compensate for parameter meaning. It does not explicitly explain 'access_key' or the 'correction' field beyond the general context. The term 'correction' is implicitly the letter text, but there is no mention of format, length constraints (minLength 15), or what access_key represents (e.g., the NF-e access key). This is a notable gap given zero schema documentation.

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 precise action: 'File an electronic correction letter (CC-e) against an NF-e.' It immediately distinguishes from NFS-e and explicitly states it corrects wording and non-fiscal fields only, setting it apart from cancel_invoice and reissue_invoice siblings. The verb and resource are specific, and the scope 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 gives explicit when-to-use guidance (for wording and non-fiscal field corrections) and when-not-to-use guidance (cannot change values, taxes, recipient, or products; those require cancelling and reissuing). It also clarifies NF-e only, not NFS-e, and warns that using it for amounts is wrong and only discovered at audit. This is thorough routing to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invoice_pdfA
Read-onlyIdempotent
Inspect

Return the printable rendering of a document, as a PDF.

Works for both types — a DANFE for nfe, a DANFSe for nfse. The PDF comes back base64-encoded in content_base64; the XML, not this, is the legally valid document. A 502 from here means the authorizer is unavailable, not that the invoice is wrong.

ParametersJSON Schema
NameRequiredDescriptionDefault
access_keyYes
document_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
access_keyYes
content_typeNo
content_base64YesThe PDF bytes, base64-encoded. Decode before saving.

TDQS

A3.7/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false), the description adds three distinct behaviors: the PDF arrives base64-encoded in content_base64, the XML is the legally authoritative document (not this PDF), and a 502 error signals authorizer unavailability rather than invoice invalidity. This is rich error and return-format context that annotations cannot convey. 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 purpose is front-loaded in the first sentence, followed by scope, return format, legal context, and error interpretation. Five sentences each carry distinct information with no filler or repetition. Slightly long for a 2-parameter tool, but every sentence earns its place given the valuable behavioral context it conveys.

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 simple 2-param read tool with an output schema present, the description is nearly complete: it covers output encoding (base64 in content_base64), legal significance, and error interpretation. The only meaningful gap is the undocumented access_key parameter, but the output schema and annotations cover most of the remaining surface area.

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?

With 0% schema description coverage, the description must compensate for both parameters. It handles document_type well by mapping the enum values (nfe→DANFE, nfse→DANFSe), which adds meaning beyond the raw enum list. However, access_key is never described - its purpose, format, or constraints are left entirely to the schema, which provides only a title. Compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

The opening line 'Return the printable rendering of a document, as a PDF' states a specific resource and output format. The follow-up clarifies scope ('Works for both types — a DANFE for nfe, a DANFSe for nfse'), which helps differentiate it from sibling tools like consult_invoice (which presumably returns XML). The verb 'Return' is generic, but the resource and format make the purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated. The description hints that the XML (not the PDF) is the legally valid document, which subtly suggests an agent might prefer another tool for legal/validation purposes, but it never names an alternative like consult_invoice or states explicit when-to/when-not-to conditions. The scope note about both types is helpful but not a routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invoice_submissionsA
Read-onlyIdempotent
Inspect

Show every attempt made for one invoice and what came back.

This is the tool that answers "why was it rejected". consult_invoice gives the status; this gives the tax authority's own code, its message, and the request and response exactly as they went over the wire. Read-only.

It takes the invoice_id, like reissue_invoice — a rejected document has no access key to look it up by. Get the id from list_invoices.

The rows are attempts, not documents: a reissued invoice has more than one, oldest first, and only the last describes the current state. Quote the authority's message rather than paraphrasing it; the code is what the user will search for.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoice_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
attemptsNo
invoice_idNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark readOnly, idempotent, non-destructive; the description adds the critical nuance that rows are attempts (not documents), ordered oldest first, and only the last describes current state. It also instructs to quote the authority's message, which is behavioral guidance beyond the annotations. No contradiction.

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?

Structured into clear paragraphs: purpose, usage, row semantics. Every sentence adds value, front-loads the main purpose, and provides actionable guidance. No filler or repetition.

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?

Despite having an output schema, the description conveys the conceptual return shape (attempts with authority code, message, raw request/response). It covers how to find the id, ordering, and how to interpret results. Nothing an agent needs to invoke correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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

Schema coverage is 0% and the schema only says 'invoice_id' is a string. The description explains why invoice_id is needed (rejected docs lack access key), how to obtain it (from list_invoices), and its relationship to reissue_invoice. This fully compensates for the schema 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 opens with a specific verb and resource: 'Show every attempt made for one invoice and what came back.' It immediately differentiates from consult_invoice by clarifying it answers 'why was it rejected' with the authority's code, message, and raw request/response. This is unambiguous and distinguishes it from siblings.

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 names the scenario ('why was it rejected'), contrasts with consult_invoice, and explains that a rejected document has no access key, so invoice_id must come from list_invoices. It even parallels reissue_invoice for lookup semantics. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

invalidate_numberingA
Destructive
Inspect

Declare an NF-e numbering range reserved but never used.

NF-e numbering has to be continuous, so a gap left by a failed issuance is explained to the SEFAZ with this — not with a new document. Irreversible: a number declared unused can never be used.

Only for numbers that were never authorized. An authorized document is cancelled, never invalidated. Confirm the range with the user and read it back before calling: the range is inclusive, and one digit wrong burns numbers the company still needs.

The SDK refuses a backwards range and a reason outside 15-255 characters before anything is transmitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
seriesYes
number_endYes
number_startYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLocal id. Use it for reissue and for submissions, and when a document was rejected and has no key.
statusNoissued, rejected or cancelled.
protocolNoThe authorization protocol, when granted.
access_keyNoThe authorizer's key. Absent while the document is not authorized.

TDQS

A4.8/5.0
Behavior5/5

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

The description goes beyond the destructiveHint annotation by explicitly stating the operation is irreversible and that declared numbers can never be used again. It also warns about the risk of burning numbers if the range is wrong, and mentions SDK-level validations before transmission, giving a full picture of the tool's side effects.

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 somewhat lengthy but every sentence adds critical information about usage, constraints, and side effects. The structure is clear, with repeated emphasis on key points (irreversibility, application scope, and confirmation) that are essential for safe invocation.

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 operation's destructive and irreversible nature, the description covers all necessary context: when to use it, when not to use it, what validation the SDK performs, and the need for user confirmation. The existence of an output schema is not relevant to explaining the tool's behavior, and no critical context appears missing.

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?

While the schema lists parameters without descriptions, the tool description provides meaningful context: it explains the reason must be 15-255 characters and that the range must be non-backwards. It does not define 'series' explicitly, but the overall purpose and constraints give sufficient guidance for an agent to infer the parameters' roles.

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: declaring an NF-e numbering range as reserved but unused, to maintain continuous numbering. It explicitly contrasts this with issuing a new document and with canceling an authorized document, making it distinct from sibling tools like 'cancel_invoice' and 'issue_invoice'.

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 guidance, including that it applies only to never-authorized numbers, that authorized documents should be canceled instead, and that the user must confirm the range before calling. It also indicates the SDK will refuse backwards ranges and invalid reason lengths, which helps the agent avoid invalid calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

issue_invoiceA
Destructive
Inspect

Issue a Brazilian fiscal document: NFS-e or NF-e.

This produces a legal fiscal document. Confirm the data with the user before calling when you inferred any field.

Every item needs a price: unit_price is what one unit costs and amount is the line's gross total. Send unit_price with quantity when the user quotes a price per unit, amount when they quote the line. Sending both asserts they agree and is refused if they do not.

document_type nfse is a service invoice: each item needs a description and a price, the recipient address is optional, and service_code (LC 116/2003 item.subitem) falls back to the company's fiscal profile when omitted.

document_type nfe is for goods, and the SEFAZ rejects a partial one: every item needs ncm and cfop, and recipient_address is required with street, number, neighborhood, city, state, zip_code and city_code all filled. Call validate_invoice_payload first when any of that was inferred rather than given.

Pass idempotency_key when a retry is possible: repeating the same key with the same payload replays the first answer instead of issuing a second document. Without one, a retry after a lost response issues again — another credit, another number burned, and undoing it means cancelling, which has a deadline. Nothing generates the key for you; use one per business event, not per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes
numberNo
seriesNo
tax_idYes
client_nameYes
document_typeYes
idempotency_keyNo
recipient_addressNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLocal id. Use it for reissue and for submissions, and when a document was rejected and has no key.
statusNoissued, rejected or cancelled.
protocolNoThe authorization protocol, when granted.
access_keyNoThe authorizer's key. Absent while the document is not authorized.

TDQS

A5/5.0
Behavior5/5

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

Despite the annotations (destructiveHint, non-idempotent), the description goes well beyond them: it discloses the legal nature of the document, the SEFAZ rejection of incomplete NF-e, the refusal when unit_price and amount conflict, and the full replay-vs-issue-again behavior of idempotency_key, including the need to cancel to undo. This is exactly the kind of behavioral context an agent needs and the schema cannot express.

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 long, but each sentence earns its place: the purpose is front-loaded, then pricing semantics, then the two document type branches, then idempotency guidance. There's minimal fluff, and the paragraphs are grouped by responsibility, making it easy to scan. For a tool this complex, this level of detail is not almost at all.

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 complex nested schema and the existence of an output schema, the description covers the decision points an agent needs to invoke this tool correctly: which validation is required, what each document type demands, and what idempotency hazards exist. It also flags the user-confirmation step, which is a critical interaction requirement. No obvious gaps remain for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full semantic load and does so thoroughly. It explains document_type's nfse vs nfe field requirements, the difference between unit_price and amount, when recipient_address becomes mandatory, and the business meaning of idempotency_key. Even though it does not narrate the obviously named tax_id, client_name, number, and series, it covers every ambiguity an agent is likely to face 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 first sentence states a specific verb and resource: 'Issue a Brazilian fiscal document: NFS-e or NF-e.' This clearly identifies the tool as the issuance action, distinct from siblings like reissue_invoice, cancel_invoice, and validate_invoice_payload. The two document_type variants are also exposed, so an agent immediately knows what the tool does.

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 gives explicit when-to-use guidance: confirm the user's data before calling when any field was inferred, call validate_invoice_payload first for partially inferred NF-e data, and pass idempotency_key whenever a retry might occur. It even describes the when-not-to case by warning that without a key, retries issue a duplicate document. This passes the bar of naming the alternative tool and the condition that selects it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_fiscal_kindsA
Read-onlyIdempotent
Inspect

Which classifications this country has data for, right now.

Ask this before assuming a classification exists. The answer grows as the source data does, so a name absent here is absent today rather than absent forever.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryNoISO 3166-1 alpha-2 code. A code means nothing without it, and Brazil is the default rather than a guess.BR

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindsNo

TDQS

A4.2/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, so safety is covered. The description adds genuine value by disclosing the temporal dynamics: the answer grows with source data, and an absent name is absent today, not forever. This enriches the open-world semantics without contradicting 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely compact — three short sentences carrying the purpose, the usage trigger, and the behavioral caveat. Nothing is wasted, and the key question is front-loaded.

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 an output schema present, full parameter coverage, and annotations carrying the safety profile, the description is nearly complete for a simple listing tool. The only minor omission is explicit naming of what a 'fiscal kind' is, though sibling context makes it reasonably inferable.

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 schema fully documents the 'country' parameter. The description adds no parameter-specific detail beyond what the schema already states, matching the baseline 3 for fully covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

States a specific verb+resource ('list' classifications with 'data') scoped by country. The purpose is immediately clear and distinct from all siblings, which concern invoice operations, fiscal codes, and taxpayer lookups — none list fiscal classifications.

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?

'Ask this before assuming a classification exists' gives clear, actionable usage timing. However, it names no explicit alternatives and offers no when-not-to-use condition, so the guidance is context-rich but lacks exclusionary detail.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_invoicesA
Read-onlyIdempotent
Inspect

List the invoices this company issued, newest first.

One document type at a time: pass nfse for services or nfe for goods. A company that issues both has to be asked twice.

Use it for "my last invoices", "what was rejected today", and to find a document whose access key the user does not have at hand. Read-only.

An authorized document is stored as issued, which is the value the rows carry; authorized is accepted as a synonym and asks for the same thing.

Every row carries both identifiers the other tools need: id, which reissue_invoice takes, and access_key, which consult_invoice, cancel_invoice and get_invoice_pdf take. A rejected row has an id and no access key — the authorizer never assigned one.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
statusNo
document_typeNonfse

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoThe rows on this page.
pageNo
totalNoHow many exist, not how many are here.
per_pageNo
next_pageNo
prev_pageNo
total_pagesNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and idempotent, and the description aligns with these without contradiction. It adds valuable behavioral details beyond annotations: the status synonym handling ('authorized' = 'issued'), the guarantee that every row carries the needed identifiers, and the specific caveat that rejected rows lack an access key. This is substantive and non-redundant.

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 longer than typical but every sentence earns its place. It opens with the core purpose, then layers constraints, usage hints, synonym nuances, and row semantics in a logical order. There is no fluff or repetition; the density of useful information justifies the length.

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 that an output schema exists (so return format is already documented), the description covers all other essential context: ordering, one-document-type-at-a-time behavior, synonym handling, identifier semantics, and rejected-row behavior. No critical detail an agent needs to call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it does thoroughly. It explains document_type ('nfse' for services, 'nfe' for goods), interprets status (synonym, rejected implications), and clarifies the meaning of the row output (id vs access_key). Even though limit and offset are not explicitly described, their schema defaults and bounds make them self-evident; the description adds value where it is needed most.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

The description states a precise verb-resource pair ('List the invoices this company issued') and adds ordering (newest first), which clearly identifies the tool's function. It also differentiates from siblings by specifying that it only returns issued (not received) invoices and references other tools that consume the returned identifiers, making it unambiguous which tool to select.

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 gives explicit usage scenarios ('my last invoices', 'what was rejected today', finding a document without an access key) and states a key constraint (one document type at a time). It also clarifies the read-only nature and the importance of passing the correct document_type, effectively directing the agent when to use this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_received_invoicesA
Read-onlyIdempotent
Inspect

List NF-e documents other companies issued against this one.

The mirror of list_invoices: that one shows what this company issued, this one what it received. Read-only.

It reads what the API already collected and never calls the tax authority, which caps how often a company may ask per day. Each row carries the issuer, the amount and, once one was filed, the manifestation. Before a manifestation the authority sends a summary only; the full document arrives after one.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
pageNo
totalNo
per_pageNo
next_pageNo
prev_pageNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds that it reads what the API already collected and never calls the tax authority, which is useful side-effect transparency. The daily-cap phrase is slightly ambiguous but does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is strong and concise, but the later prose about 'manifestation' and 'summary only' is repetitive and confusing. Some sentences could be tightened or removed without losing core meaning.

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?

An output schema exists, so return-value details do not need to be in the description. However, the missing parameter explanation leaves a meaningful operational gap, and the ambiguous remarks about daily caps reduce completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

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

The schema has two parameters with no descriptions and 0% schema description coverage. The description does not mention limit or offset at all, so the agent gets no guidance on pagination, defaults, or maximum values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

States a specific verb ('List') and a clear object: NF-e documents issued by other companies against this one. It also explicitly contrasts with list_invoices, making the distinction obvious.

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?

Directly names list_invoices as the alternative and explains the difference: that one shows issued documents, this one shows received documents. It also states the tool is read-only and never calls the tax authority, which helps the agent decide when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_fiscal_codeA
Read-onlyIdempotent
Inspect

Resolve one code of one classification, when you know both.

Use this to confirm a code before putting it on a document — an NCM that does not exist is rejected by the tax authority after issuing, which costs a cancellation.

A code that is not there answers 404. That means the code is wrong, not that the lookup failed; do not retry it.

metadata differs per kind and is passed through as published: utrib on an NCM, ncm_code on a CEST, tax_type on a CST, and nothing at all on an ISS service.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe code itself, as published: 84716052 for an NCM, 5102 for a CFOP. Digits only, no dots.
kindYescfop, ncm, cest, cst, csosn, ...
countryNoISO 3166-1 alpha-2 code. A code means nothing without it, and Brazil is the default rather than a guess.BR

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeNo
kindNocfop, ncm, cest, cst, csosn, ...
countryNo
metadataNoWhatever the classification carries beyond a code and a description, and it differs per kind: utrib on an NCM, ncm_code on a CEST, tax_type on a CST, null on an ISS service.
descriptionNo

TDQS

A4.5/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond the annotations: 404 means invalid code, not a lookup failure, and metadata varies by kind with concrete examples. This disclosure helps the agent interpret responses correctly and avoid useless retries.

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 tightly organized: purpose first, then when to use, then failure semantics, then metadata variation. Every sentence adds distinct value with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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

For a simple lookup tool with an output schema, the description covers the key operational details: use case, failure mode, retry guidance, and kind-dependent metadata. Nothing needed for correct invocation is 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 covers all parameters clearly with 100% schema description coverage, including examples and validation constraints. The description adds useful context about metadata behavior, but does not need to repeat parameter details; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

The description states a precise operation: resolve one code of one classification when both are known. It clearly distinguishes this from broader searching by emphasizing the single-code, confirmatory nature.

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 a clear use case: confirm a code before putting it on a document to avoid rejected issuance. It also explains that a 404 means the code is wrong and should not be retried, though it does not explicitly name sibling alternatives like search_fiscal_codes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_taxpayerA
Read-onlyIdempotent
Inspect

Look up one taxpayer by exact tax id, to confirm who it is.

Use it to check a recipient's name before issuing against them. It takes the id exactly — punctuation is fine, but there is no search by name, by prefix or by state, and there will not be: the registry holds the names and addresses of real people.

A 404 does not mean the company does not exist. The registry reloads monthly from the RFB's dump, so a recently registered CNPJ is simply not in it yet. Say that to the user rather than reporting the tax id as invalid, and never turn a 404 here into a validation rule.

ParametersJSON Schema
NameRequiredDescriptionDefault
tax_idYesThe exact tax id. A CNPJ is 14 digits.
countryNoISO 3166-1 alpha-2 code. A code means nothing without it, and Brazil is the default rather than a guess.BR

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindNoWhether it is a company or a person.
nameNo
stateNo
statusNo
tax_idNo
countryNo
metadataNoWhatever the registry holds beyond these.
city_codeNo
started_atNo
trade_nameNo
postal_codeNo
activity_codeNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, and destructiveHint=falseikuha. The description adds essential behavioral context beyond these: the registry reloads monthly, so a 404 does not imply nonexistence. This is critical behavioral information that annotations do not convey, and it could easily lead to misinterpretation of lookup failures. The description does not contradict annotations.

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 appropriately sized, with no fluff. Key points are front-loaded: the primary purpose and usage scenario come firstainer, followed by the explicit exclusions and critical 404 handling. Each sentence earns its place, contributing crucial operational guidance. Perfectly structured for quick agent comprehension.

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 simplicity (2 params, one required), an output schema exists to explain returns, and annotations cover safety/idempotency. The description covers all necessary usage details: exact match, no partial search, the 404 caveat, and how to handle it. Nothing gaping missing for an agent to call correctly.

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 parameters. The description adds important context for both parameters: the tax_id must be exact and allows punctuation, and clarifies the 14-digit format for CNPJ (though schema says that). For country, the description notes that 'a code means nothing without it' (reinforcing the need for context) and explains the default is Brazil as a deliberate choice, not a guess. This adds value beyond 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 clearly states the tool's specific purpose: 'Look up one taxpayer by exact tax id, to confirm who it is.' It distinguishes this from name/prefix search, explicitly noting there is no search by those means presumably available in sibling tools. The verb+resource is specific, and it names the exact scenario (check recipient's name before issuing).

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 guidance: use it to confirm identity before issuing against a recipient. It explicitly states when not to use it: no search by name, prefix, or state. It also handles the 404 edge case, instructing the agent to explain to the user rather than report invalid, and never to turn a 404 into a validation rule. This is thorough usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manifest_received_invoiceA
Destructive
Inspect

Declare this company's position on a document issued against it.

Legally binding and irreversible once the tax authority accepts it — ask the human to confirm before calling, and read back which document and which of the four positions is being filed.

Denying a document (210220) or declaring the operation did not happen (210240) is an accusation against whoever issued it. Never pick either because the user sounds unsure — ask.

210200 confirms the operation happened, 210210 acknowledges the document exists, 210220 denies knowing it, and 210240 states the operation was not carried out. Only 210240 takes a reason, and it requires one; the others are refused if a reason is sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
access_keyYes
manifestationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
protocolNoThe receipt, when the authority gave one.
access_keyNo
manifestationNoThe code that was filed.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations, which only indicate destructiveHint and non-idempotence. It explicitly states the action is 'legally binding and irreversible once the tax authority accepts it,' warns that two positions (210220 and 210240) are accusations against the issuer, and details that only 210240 accepts a reason and requires one. This adds critical behavioral context that the annotations do not convey.

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 relatively long but every sentence contributes necessary information. It front-loads the purpose and then adds warnings and parameter details in a logical order. It could be slightly more condensed without losing essential guidance, but it remains efficient given the complexity of the tool.

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 legal and irreversible nature, the description is remarkably complete. It covers the purpose, the four positions, the reason requirement, confirmation steps, and caution against misusing accusatory codes. The presence of an output schema covers the response format, so nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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

With schema description coverage at 0%, the description carries the full burden. It explains the meaning of each manifestation enum value (what each code confirms or denies) and specifies the reason parameter's behavior—that it is required only for 210240 and causes refusal for others if sent. This adds substantial semantic value beyond the bare schema titles and enum.

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 clear, specific verb and resource: 'Declare this company's position on a document issued against it.' It then enumerates the four possible positions (210200, 210210, 210220, 210240) with their meanings, making the tool's function unambiguous and easily distinguished from siblings like issue_invoice or cancel_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 the tool (when the company needs to declare a position on a received document) and provides important usage constraints, such as requiring human confirmation due to legal binding and instructing to ask when unsure rather than selecting accusatory positions. However, it does not explicitly compare against alternative tools or mention when not to use it in favor of another, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reissue_invoiceA
Destructive
Inspect

Retry a rejected invoice after the data that caused the rejection was fixed.

Takes the local invoice_id, not the access key: a rejected document never got one. Consumes a credit like a new issuance, so it takes an idempotency_key for the same reason issue_invoice does. An authorized invoice is corrected or cancelled, never reissued.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoice_idYes
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLocal id. Use it for reissue and for submissions, and when a document was rejected and has no key.
statusNoissued, rejected or cancelled.
protocolNoThe authorization protocol, when granted.
access_keyNoThe authorizer's key. Absent while the document is not authorized.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark it destructive/non-read-only, and the description adds concrete side effects: reissue 'consumes a credit like a new issuance' and uses an idempotency_key for the same reason as issue_invoice. It also clarifies that a rejected document has no access key, which helps set expectations about the identifier. It does not spell out every destructive consequence, but the annotations cover the core flag.

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?

Three sentences, front-loaded with the core operation, then compact clarifications. The phrasing ('A rejected document never got one') is slightly indirect, but each sentence earns its place and there is no redundant schema repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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

Despite 11 siblings and fairly minimal schema descriptions, the description gives enough context to select this tool and invoke it correctly: it names the target state (rejected after fix), the identifier distinction, and the idempotency key rationale. With an output schema present, the lack of return-value prose is acceptable.

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?

With zero schema descriptions, the description compensates: invoice_id is explained as 'the local invoice_id, not the access key,' and idempotency_key is motivated by the credit consumption parallel to a new issuance. Both parameters receive meaningful semantic context beyond their TypeScript types.

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 conditional action: 'Retry a rejected invoice after the data that caused the rejection was fixed.' It further distinguishes reissue from related operations by stating an authorized invoice is 'corrected or cancelled, never reissued,' making the tool's object and scope clear.

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 explicitly defines the trigger: only after a rejection fix, use reissue. It also provides boundary guidance: authorized invoices should be corrected/cancelled, not reissued, and explains that like a new issuance it consumes a credit, which signals when to reach for this tool rather than a correction or document retrieval sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_fiscal_codesA
Read-onlyIdempotent
Inspect

Find a code from a description, or page through a table.

This is the tool for "what NCM is a keyboard" — the one the user actually asks. Prefer it over guessing a code from memory: the tables change, and a plausible wrong code is worse than a lookup.

Leaving kind unset searches every classification of that country at once, which is the most expensive call here. Set it whenever the question already names one.

Rows come back ordered by kind then code; there is no sort argument, and asking for one changes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoNarrows to one classification. All if unset.
termNoMatches the code or the description.
limitNoRows per page. 20 by default.
offsetNoRows to skip. Use it to page, not to narrow — a term is cheaper than paging to find one row.
countryNoISO 3166-1 alpha-2 code. A code means nothing without it, and Brazil is the default rather than a guess.BR

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
pageNo
totalNo
per_pageNo
next_pageNo
prev_pageNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description reveals useful behavioral traits: unset `kind` searches all classifications and is the most expensive call, rows are ordered by kind then code, and there is no sort argument. This prevents the agent from inventing a sort parameter and sets clear performance expectations.

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 tightly written and front-loaded with the core purpose in the first sentence. Every subsequent sentence earns its place: cost guidance, when to set `kind`, and the no-sort behavior. It is appropriately sized for a tool with five parameters.

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 rich annotations, fully described schema, and output schema, the description covers the remaining practical concerns: use case, cost, paging, ordering, and absence of sorting. Nothing the agent needs to invoke the tool correctly is missing.

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 meaningful guidance beyond the schema, especially for `kind` (unset means all classifications and is expensive; set it when the question names one). It also disambiguates the pagination intent with the "no sort" note. This lifts it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

The description clearly states the resource (fiscal codes) and the two main actions: searching by description and paging through the table. The example "what NCM is a keyboard" makes the purpose concrete, but it does not explicitly contrast with sibling tools like lookup_fiscal_code or list_fiscal_kinds, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives excellent usage context: prefer this lookup over guessing from memory, and set `kind` whenever the question already names one to avoid the most expensive call. It lacks explicit when-not-to-use statements naming sibling alternatives, so it stops short of fully explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_invoice_payloadA
Read-onlyIdempotent
Inspect

Check invoice data against the field rules without issuing anything.

Nothing is sent to the tax authority and no document is created. The SDK models check field formats, and for nfe the rules the SEFAZ refuses a document over: ncm and cfop on every item, and a complete recipient address. Worth calling before issue_invoice whenever a field was inferred rather than given.

This does not replace issuing: the authorizer's cross-field and fiscal rules are only checked when the document is transmitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes
document_typeYes
recipient_addressNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYesTrue when no field rule was broken. It does not promise the authorizer will accept the document.
errorsNo
checkedYesWhat was checked, so the answer is not read as more than it is.
document_typeYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, non-destructive. The description reinforces this with 'Nothing is sent to the tax authority and no document is created' and adds behavioral context by detailing what is checked (field formats, nfe-specific ncm/cfop and address) and what is not (cross-field/fiscal rules). This exceeds annotation coverage without contradiction.

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 three short paragraphs with the core purpose front-loaded. Each sentence adds value: the summary, the safety reassurance, the specific checks, and the limitation. It is slightly verbose but not padded, and the structure is logical.

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 validation tool with an output schema, the description covers usage context, limitations, and key validation specifics. It doesn't fully enumerate all param requirements or the exact validation rules, but it provides enough for an agent to decide when and why to call it. The presence of an output schema reduces the need to explain return values.

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 has 0% description coverage, so the description must compensate. It references items and recipient_address in the nfe context, implying their significance, and document_type is covered by the enum. However, it doesn't explicitly detail each parameter's format or constraints, leaving some interpretation to the agent. Still, it adds meaningful context beyond the bare 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 clearly states the tool validates invoice data against field rules without issuing anything. It distinguishes itself from issue_invoice and specifically mentions the nfe checks (ncm, cfop, recipient address), making its purpose 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?

It explicitly advises calling this before issue_invoice when a field was inferred, and warns that it does not replace issuing since authorizer rules are only checked on transmission. This gives clear when-to-use and when-not-to-use guidance, differentiating it from sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedissue_invoice2 fields changed
      • addedInput schema / $defs / IbsCbs
        Added value: +{
        +  "description": "The Reforma Tributária group for one item.",
        +  "properties": {
        +    "base": {
        +      "anyOf": [
        +        {
        +          "exclusiveMinimum": 0,
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Base"
        +    },
        +    "classification": {
        +      "pattern": "^\\d{6}$",
        +      "title": "Classification",
        +      "type": "string"
        +    },
        +    "cst": {
        +      "pattern": "^\\d{3}$",
        +      "title": "Cst",
        +      "type": "string"
        +    },
        +    "rate_city": {
        +      "minimum": 0,
        +      "title": "Rate City",
        +      "type": "number"
        +    },
        +    "rate_federal": {
        +      "minimum": 0,
        +      "title": "Rate Federal",
        +      "type": "number"
        +    },
        +    "rate_state": {
        +      "minimum": 0,
        +      "title": "Rate State",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "cst",
        +    "classification",
        +    "rate_state",
        +    "rate_city",
        +    "rate_federal"
        +  ],
        +  "title": "IbsCbs",
        +  "type": "object"
        +}
      • addedInput schema / $defs / Product / properties / ibs_cbs
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/IbsCbs"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Addedlist_fiscal_kinds
    • Addedlookup_fiscal_code
    • Addedlookup_taxpayer
    • Addedsearch_fiscal_codes
  2. 12 tool updates
    • First observedcancel_invoice
    • First observedconsult_invoice
    • First observedcorrect_invoice
    • First observedget_invoice_pdf
    • First observedget_invoice_submissions
    • First observedinvalidate_numbering
    • First observedissue_invoice
    • First observedlist_invoices
    • First observedlist_received_invoices
    • First observedmanifest_received_invoice
    • First observedreissue_invoice
    • First observedvalidate_invoice_payload

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables issuing, consulting, and listing Brazilian NFS-e invoices through Spedy's API over an authenticated HTTP endpoint.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables searching, downloading, and querying Brazilian electronic service invoices (NFS-e) through ISSWeb/Fiorilli municipal portals, including XML and PDF retrieval, access-key and CNPJ lookups, and multi-client configuration.
    10
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables retrieving inbound Brazilian electronic fiscal documents (supplier invoices, CT-e, events) directly from SEFAZ using your company's A1 digital certificate, with incremental NSU sync, query-budget protection, and DANFE PDF generation.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.