OpenAccountants
Server Details
Open-source AI accounting skills verified by licensed accountants (tax, VAT, payroll).
- Status
- Healthy
- Uptime
- 100.0% over 77 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-03-26
- URL
- Repository
- openaccountants/openaccountants
- GitHub Stars
- 468
- Server Listing
- OpenAccountants
TDQS
Scored across 15 tools
The retrieval cluster (start, search_rules, search_skills, list_skills, get_skill, get_skill_sections) overlaps conceptually, but descriptions explicitly cross-reference and rank each other (e.g. 'for a specific topic, search_skills is quicker'; 'a skill is often more complete than search_rules'). start vs start_help is a real potential confusion point but is clearly split on whether the user already has a question. Domain tools (check_audit_exemption, validate_vat_number, get_deadlines, get_quote) are each distinct.
Overwhelmingly consistent snake_case verb_noun pattern (get_deadlines, list_jurisdictions, search_rules, validate_vat_number, check_audit_exemption). Minor deviations: 'start' / 'start_help' are bare verbs, and 'share_with_openaccountants' embeds the vendor name, but all remain readable and predictable.
15 tools sit in the well-scoped 3-15 band and map onto distinct jobs: routing, search, retrieval, verification, regulatory checks, pricing, and escalation. The only mild bloat is the five-tool retrieval family plus two helper tools (list_rule_facets, start_help), though each helper has a stated purpose.
The surface covers the full read lifecycle for a tax-knowledge server: discover jurisdictions, search rules/skills, page sections, look up deadlines, check audit thresholds, validate VAT numbers, get pricing, and escalate to a human. Gaps are minor — no direct per-regime registration-threshold tool (only VAT), no entity-level filing or status operations, and no tool to re-fetch a rule by identifier — but agents can route through start/get_skill.
Available Tools
15 toolscheck_audit_exemptionCheck statutory audit exemptionARead-onlyIdempotentInspect
Answers 'does my company need an audit?' for a private limited company in Malta (MT, Article 185(2) micro thresholds) or the UK (GB, small-company thresholds before and after 6 April 2025). A deterministic check of turnover, balance sheet total and average employees. Returns 'exempt' | 'review' | 'audit_required' | 'cannot_determine', the per-threshold table, the rule citation, and whether a named accountant has confirmed the thresholds ('draft' = no accountant has confirmed them yet; say which). Pass prior_year figures: most regimes are two-consecutive-year tests, so without them a qualifying year returns 'review'. 'cannot_determine' is a valid outcome (unsupported jurisdiction, wrong currency, a shape needing judgment). Use the determination as returned, not thresholds from memory.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | Yes | Currency of the figures — must match the regime (EUR for MT, GBP for GB); convert first, never guess a rate. | |
| turnover | Yes | Revenue/turnover for the year, in the jurisdiction's currency. | |
| prior_year | No | Prior-year figures for the two-consecutive-years test. | |
| entity_type | No | Optional. 'private_ltd' (default), 'plc', 'branch'. Non-private shapes route to a human. | |
| group_member | No | Optional. True if the company is part of a group — group thresholds need a reviewer, so this forces 'review'. | |
| jurisdiction | Yes | ISO-style code. MT and GB supported today. | |
| employees_average | Yes | Average number of employees during the year. | |
| financial_year_end | Yes | ISO date the financial year ends, e.g. '2025-12-31'. | |
| balance_sheet_total | Yes | Total assets at the balance sheet date. |
Output Schema
| Name | Required | Description |
|---|---|---|
| caveats | No | |
| escalate | No | |
| next_action | No | |
| verification | No | status ('accountant_verified'|'research_verified'|'draft'), verified_by[], last_verified_at, skill_slug, era. Surface the status to the user. |
| criteria_rule | No | |
| determination | No | 'exempt' | 'review' | 'audit_required' | 'cannot_determine' |
| rule_citation | No | skill_slug, fact_id, canonical_key, statutory_reference, url. |
| thresholds_applied | No | Per-criterion: threshold vs actual, met true/false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/non-open-world, and the description layers on real behavior: the enumerated outcome set, that 'cannot_determine' is a valid result, the 'draft' accountant-confirmation flag, and that missing prior_year yields 'review'. This is substantial context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core question and jurisdiction scope, then dense but purposeful sentences covering outcomes, prior_year, and the draft caveat. Slightly long, but nearly every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with a nested prior_year object and an output schema, the description covers outcomes, edge cases (unsupported jurisdiction, wrong currency, group membership), and the human-review path. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds rationale the schema lacks—why prior_year matters (two-consecutive-year tests) and the currency-must-match-regime rule with 'convert first, never guess a rate'. It maps parameters to the regulatory logic rather than restating types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific question it answers ('does my company need an audit?') scoped to named jurisdictions (MT Article 185(2), GB small-company thresholds). This is clearly distinguishable from every sibling, which are list/get/search utilities rather than determination engines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong conditional guidance: pass prior_year for two-consecutive-year tests, group_member forces 'review', non-private shapes route to a human, and 'use the determination as returned, not thresholds from memory'. It lacks explicit sibling alternatives, but none of the listed siblings are substitutes for this check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deadlinesTax filing deadlinesARead-onlyIdempotentInspect
Filing and payment deadlines for a country or US state: 'when is my tax return due', 'when do I file VAT', 'when is the next instalment'. Returns upcoming dates and recurring filing rhythms (monthly VAT, quarterly instalments) from the OpenAccountants tax calendar. Signed-in users with a saved home jurisdiction can omit jurisdiction; the response marks jurisdiction_source.
| Name | Required | Description | Default |
|---|---|---|---|
| horizon_days | No | How far ahead to look (default 120, max 366). | |
| jurisdiction | No | ISO code, slug, or name ('MT', 'US-CA', 'Malta'). Optional for signed-in users with a saved home jurisdiction. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next_action | No | |
| calendar_url | No | |
| horizon_days | No | |
| jurisdiction | Yes | |
| recurring_rhythms | No | |
| upcoming_deadlines | Yes | |
| jurisdiction_source | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuinely new context: results come from the OpenAccountants tax calendar, include both upcoming dates and recurring rhythms, and that the response marks jurisdiction_source.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and scope, then uses compact example queries to convey intent efficiently. Slightly dense but every clause carries information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, yet the description still summarizes the output shape. For a two-parameter read tool this covers everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description's jurisdiction note ('can omit jurisdiction') largely restates what the schema already documents. The pointer to the jurisdiction_source response field is a small addition, but the schema is doing most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('Filing and payment deadlines for a country or US state') with example phrasings that map directly onto the tool's intent. No sibling in the list competes for this operation, so the agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The illustrative queries ('when is my tax return due', 'when do I file VAT') make the intended use unambiguous, and it notes that signed-in users with a saved home jurisdiction can omit the parameter. It stops short of naming alternatives or explicit exclusions, but none are needed since no sibling overlaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quoteGet an OpenAccountants fee estimateARead-onlyIdempotentInspect
Call only when the user asks what OpenAccountants charges, requests a quote, or asks whether their current fee is fair. Returns the same published plans, service prices, limits, market exceptions and hourly rate as the website, plus the engagement process and contact details. Match the client's scope to the listed prices; incomplete scope means the total is provisional. Separately quoted services must be confirmed by OpenAccountants. This tool does not create an engagement.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional. | |
| services | No | What they want, e.g. bookkeeping, vat, payroll, tax_return, year_end, formation, relocation. Logged. | |
| current_fee | No | What they pay today, if they said. Logged; useful for the fairness question. | |
| entity_type | No | What the client is. Logged. | |
| jurisdiction | No | The client's country (ISO code or name). Logged so we know where demand is; not used to price. | |
| monthly_volume | No | One line on size: transactions, orders, staff, channels. Logged, and what you scope the fee on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rules | Yes | |
| price_list | Yes | |
| booking_url | No | |
| next_action | Yes | |
| contact_email | No | |
| pricing_method | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed world, so safety is covered. The description adds genuinely new behavioral context: the data mirrors the website, incomplete scope makes the total provisional, separately quoted services require confirmation, and no engagement is created. It does not mention caching/staleness or rate limits, which keeps it at a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five compact sentences, front-loaded with the invocation trigger before the payload description, and no filler. The one slight inefficiency is that the return-value inventory is enumerated at length even though an output schema exists, so a sentence or two partly duplicates structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only pricing lookup with full schema coverage and an output schema, the description supplies everything needed: when to invoke, what is returned, the provisional-total caveat, the confirmation requirement for separately quoted services, and the explicit statement that no engagement is created. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the reason/current_fee/jurisdiction logging semantics is already documented in the schema. The description's only added parameter guidance is 'match the client's scope to the listed prices' and the provisional-total caveat, which is useful but marginal. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get an OpenAccountants fee estimate') and then enumerates exactly what comes back: published plans, service prices, limits, market exceptions, hourly rate, plus engagement process and contact details. No sibling tool deals with pricing, so an agent can route to it unambiguously from the name and description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('only when the user asks what OpenAccountants charges, requests a quote, or asks whether their current fee is fair') and a negative boundary ('does not create an engagement'), which implicitly separates it from share_with_openaccountants/start. It stops short of naming an alternative tool for adjacent intents, so it is clear context rather than full when/when-not/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_skillRead a tax skillARead-onlyIdempotentInspect
Open a skill by slug (from start, search_skills or search_rules) to answer the user's question. Returns the skill's rules and method, its quality tier, the named accountant where one reviewed it, a section_index of sections not inlined, and a provenance footer to keep with the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Skill slug, e.g. 'us-schedule-c-and-se-computation' | |
| reason | No | One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| skill | Yes | The skill record (slug, name, jurisdiction, tier, etc.) |
| key_facts | No | Optional at-a-glance facts (rates/thresholds/deadlines/verifier/advisory) — present only where the skill carries a structured key_facts block; omitted otherwise. |
| guardrails | No | |
| provenance | Yes | |
| written_by | No | The accountant who wrote this skill ({name, profile_url}), when a named approved accountant authored it; null otherwise. |
| next_action | No | |
| verification | No | Verification summary |
| section_index | No | Every section of the skill with {index, heading, level, chars, priority, included}. For any section with included:false, fetch it via get_skill_sections({slug, section_index}). |
| required_facts | No | Intake skills only: the questions a professional asks before computing, verbatim from the skill. Answer from what the user said or data you hold, then ask the rest grouped, before any figure. |
| current_version | No | Current version. markdown_content holds the compute-core (rates, box maps, rules, worksheet contract); bulky reference sections may be omitted — see section_index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, but the description adds real value by enumerating the returned artifacts (rules, method, quality tier, reviewing accountant, section_index of non-inlined sections, provenance footer) and the instruction to keep the footer with the answer. This is useful operational guidance beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-front-loaded sentence: the operation and its input source come first, then the return contents. No filler, no restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations covering the safety profile, the description supplies the remaining actionable context: where the slug comes from, what the payload contains, and the provenance-footer handling. An agent has everything needed to call and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description modestly exceeds it by tracing the slug's origin to start/search_skills/search_rules. The optional 'reason' parameter is not described in the tool description, though the schema documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a skill by slug') plus the reason for doing so ('to answer the user's question'), and names the sibling tools that produce the slug. It is readily distinguishable from get_skill_sections (returns indexed sections) and search_skills (finds slugs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent where the required slug comes from (start, search_skills, search_rules), which is the key usage prerequisite. It does not state when to prefer this over get_skill_sections or when not to call it, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_skill_sectionsRead more sections of a skillARead-onlyIdempotentInspect
Follow-up to get_skill: fetch sections it listed in section_index as not inlined (for example a supplier-pattern library). Pass section_index for one section, or omit it to get every section with its heading and markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Skill slug | |
| section_index | No | Optional. Return only this section (matches the `index` from get_skill's `section_index`). | |
| section_indices | No | Optional. Return only these sections. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | Yes | |
| version | No | |
| sections | Yes | |
| key_facts | No | Optional at-a-glance facts — present only where the skill carries a structured key_facts block; omitted otherwise. |
| guardrails | No | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety and repeatability are covered structurally. The description adds the useful cross-tool detail that sections are addressed by the indexes get_skill reported, but says nothing about ordering, limits, or behavior when a slug or index does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the relationship to get_skill and then the parameter behavior. No filler, no restatement of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the annotations carry the safety profile for this simple read tool. The only real gap is the unaddressed section_indices parameter, which is minor for a three-parameter read operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds genuine cross-tool semantics by tying section_index to get_skill's section_index list, but it never mentions the section_indices (plural) parameter, leaving one of the three parameters unexplained in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('fetch sections') and immediately positions itself relative to the sibling get_skill as a follow-up, so an agent can distinguish it from get_skill without opening either schema. It also defines scope: sections that were listed as not inlined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger condition (after get_skill, when sections were flagged as not inlined) and gives the routing rule for the optional parameter: pass section_index for one section, omit to get all. The alternative (get_skill's inlined content) is implicitly and clearly excluded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jurisdictionsList all jurisdictions coveredARead-onlyIdempotentInspect
Answers 'which countries do you cover?' or 'what is there for [country]?'. Returns every jurisdiction with published skills (countries as ISO 2, US states as US-XX, Canadian provinces) with skill counts, accountant-reviewed counts and the named lead accountant where there is one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| next_action | No | |
| total_skills | No | |
| jurisdictions | No | |
| total_jurisdictions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds scope semantics beyond that: only jurisdictions with *published* skills are returned, plus what each entry contains (counts and named lead accountant). It doesn't mention result size or any limits, but for a no-argument read tool this is solid added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero filler, the trigger question leading and the payload described second. Every clause carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value structure needn't be explained, yet the description still summarizes the payload shape (code, skill count, reviewed count, lead accountant). Nothing an agent needs to invoke this zero-arg, read-only listing tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate beyond confirming it is argument-free.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and pins down the exact scope: "Returns every jurisdiction with published skills," including the code formats (ISO 2, US-XX, Canadian provinces). It is clearly separable from the list_skills/search_skills siblings, which operate on skills rather than coverage geography.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames usage around two concrete user questions ("which countries do you cover?", "what is there for [country]?"), which is a clear trigger context. It does not, however, name alternative tools or state when NOT to use it versus list_skills/search_skills for country-scoped lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rule_facetsList queryable rule facets (no args)ARead-onlyIdempotentInspect
Helper for search_rules: lists the values you can filter on (live jurisdictions, domains, roles, rule kinds, statuses, tax years, a sample of topics) and the defaults. Takes no arguments. Use it when unsure of a filter value rather than guessing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| filters | No | |
| defaults | No | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds real context beyond that: it takes no arguments, it returns only *live* jurisdiction values and a *sample* of topics (not exhaustive), and it includes defaults. That last detail matters to an agent deciding whether the list is authoritative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and payoff, then the usage rule. No repetition of the title and no filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return shape, and it still names the facet categories and the 'defaults' it returns. For a zero-argument read-only helper this is complete coverage of what an agent needs to select and call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters the baseline is 4, and the description reinforces it with 'Takes no arguments,' which matches the empty schema. No further parameter semantics exist to document, so there is nothing more the description could add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('lists the values you can filter on') and enumerates the facet dimensions it covers (jurisdictions, domains, roles, rule kinds, statuses, tax years, topics). It also positions itself explicitly as a helper for the sibling tool search_rules, so an agent can distinguish it from list_jurisdictions and the other list_* tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use it when unsure of a filter value rather than guessing') and names the tool it feeds into (search_rules). The when-not case is implied and unambiguous: if you already know the filter value, go straight to search_rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_skillsBrowse tax skillsARead-onlyIdempotentInspect
Browse the skills for one jurisdiction or domain (for example every skill for 'MT', or every 'payroll' skill), each with its quality tier and verification status. For a specific topic, search_skills is quicker. Filter by jurisdiction, domain or role ('foundation' | 'compute' | 'orchestrator' | 'reference'). Paginated (default 100, max 200); page with offset/next_offset.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Filter by pipeline role: foundation, compute, orchestrator, reference. | |
| limit | No | Max skills to return (default 100, max 200). | |
| domain | No | Filter by accounting domain: income-tax, vat-gst, payroll, bookkeeping, e-invoicing, formation, financial-statements, transfer-pricing, tax-optimization, crypto, cross-border, corporate-tax, estate-wealth-tax, references, sector-guidance, tooling. | |
| offset | No | Number of skills to skip — use the next_offset from the previous response to page through results (default 0). | |
| category | No | (Legacy) display label; prefer domain/role. | |
| jurisdiction | No | Filter by jurisdiction code, e.g. 'US', 'MT', 'DE' |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Page size applied to this response. |
| total | No | Total skills matching the filter (across all pages). |
| offset | No | Offset applied to this response. |
| skills | Yes | Matching published skills. |
| next_action | No | |
| next_offset | No | Present when more results remain — pass as offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds useful behavior beyond that: results carry quality tier and verification status, and pagination is bounded (default 100, max 200) with offset/next_offset paging. It does not, however, describe ordering or what happens when no filter is supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core scope, then the routing alternative, then filters and pagination. Every sentence carries new information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers scope, filters, the sibling alternative, and pagination limits. The only thin spot is not stating behavior when zero filters are passed, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented, including the legacy-category fallback and role/domain value lists. The description restates the role values and the pagination dance (offset/next_offset) but adds no semantics the schema lacks, so baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Browse the skills') with scope narrowed to one jurisdiction or domain, and explicitly names the sibling it is not (search_skills). An agent can distinguish this from search_skills, get_skill, and list_jurisdictions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the routing rule explicitly: browsing a jurisdiction/domain, use this; 'For a specific topic, search_skills is quicker.' It also names the filter dimensions and the pagination contract, so both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_verifiersList named accountant verifiersARead-onlyIdempotentInspect
Answers 'who reviewed this?' or 'which accountants are behind this?'. Returns the named licensed accountants who have signed off on OpenAccountants jurisdictions, with their credentials and the jurisdictions they cover.
| Name | Required | Description | Default |
|---|---|---|---|
| jurisdiction | No | Optional ISO code filter — only return verifiers for this jurisdiction. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| verifiers | No | |
| next_action | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds the substance of what is returned (credentials, covered jurisdictions), but says nothing about auth needs, rate limits, or whether the list is exhaustive; with an output schema present, this is adequate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the user-facing intent before the technical return description, with no filler. The quoted-question opener is slightly rhetorical but earns its place by anchoring intent matching.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param read tool with full annotation coverage and an output schema, the description supplies everything needed to select and call it. Only minor omissions (no mention of result ordering or scope of completeness) keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'jurisdiction' parameter is fully documented as an ISO code filter in the schema. The description's mention of 'jurisdictions they cover' alludes to the dimension but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Returns... named licensed accountants') plus a precise resource and scope ('who have signed off on OpenAccountants jurisdictions'). The framing questions ('who reviewed this?') make the intent instantly matchable and clearly separate it from sibling list_* tools like list_jurisdictions and list_skills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear intent-based context via the two quoted user questions, which tells an agent when this tool applies. It does not, however, state when not to use it or name an alternative sibling for adjacent needs, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rulesLook up tax rates and rulesARead-onlyIdempotentInspect
Look up tax rates, thresholds and rules in one or many jurisdictions, such as 'VAT rates in MT, IE and DE', 'income tax brackets for 2025' or 'rules mentioning reverse charge'. Returns a bundled markdown rule set plus each jurisdiction's official source (official_source). For one specific figure in one jurisdiction a skill is often more complete (search_skills then get_skill): a figure can sit in a skill without being a separate rule here, and then this returns related guidance instead. Entries tagged GUIDANCE are text, not values. Figures are not certified current: confirm each against official_source and prefer it when they disagree. By default returns all matching rules, each tagged with its verification status; status:'verified' excludes draft, needs_update and unsure rules; it still includes research-verified (source-cited) rules, so it does not mean accountant-reviewed. list_rule_facets gives the valid filter values.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Free-text search over each rule's label, value, and citation. | |
| limit | No | Max rules to return (default 200, max 500). | |
| roles | No | Skill roles: foundation | compute | orchestrator | reference. | |
| topic | No | Filter by a fact topic. | |
| offset | No | Pagination offset — pass the previous response's next_offset. | |
| reason | No | One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional. | |
| status | No | Shorthand for `statuses`: 'verified' = accountant- + research-verified only. Default 'all'. | |
| domains | No | Accounting domains, e.g. ['vat-gst','income-tax']. See list_rule_facets. | |
| statuses | No | Verification statuses to include. Default = all (each rule is tagged). | |
| tax_year | No | Limit to a tax year, e.g. 2025. | |
| block_types | No | Rule kinds to include. Default = all of these (framing prose + workflow steps are excluded). | |
| jurisdictions | No | ISO codes to include, e.g. ['MT','US-CA']. Omit for all jurisdictions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | Total matching rules (across all pages). |
| markdown | Yes | The bundled rule set as markdown — the user saves/runs this locally. |
| truncated | No | |
| fact_count | Yes | Rules returned on this page. |
| next_action | No | |
| next_offset | No | |
| jurisdictions | No | |
| accountant_verified_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly/idempotent/non-destructive), but the description adds substantial behavioral context beyond them: it returns a bundled markdown rule set plus official_source, GUIDANCE entries are text not values, figures are not certified current and should be confirmed against official_source, and the status:'verified' filter does NOT mean accountant-reviewed. These are non-obvious traits an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core capability and examples come first, then caveats. Every sentence carries information (skill routing, GUIDANCE tagging, verification caveats), though the description is on the long side and the parenthetical routing guidance is packed tightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 12-parameter tool with an output schema and full annotation coverage, the description closes the remaining gaps: what is returned, what verification status means, and the reliability caveat about figures. An agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns extra credit by clarifying semantics the schema does not: status:'verified' includes research-verified rules and excludes draft/needs_update/unsure, and default behavior returns all matching rules tagged with verification status. This directly disambiguates the status/statuses pair.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look up) and resource (tax rates, thresholds and rules) with concrete query examples in multiple jurisdictions. It also contrasts itself with search_skills/get_skill, so an agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'For one specific figure in one jurisdiction a skill is often more complete (search_skills then get_skill)', explains why a figure may not appear here, and points to list_rule_facets for valid filter values. Both the when-to-use and the when-to-use-something-else cases are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_skillsSearch tax skills by topicARead-onlyIdempotentInspect
Find the skill for a specific tax topic by keyword: a deduction, form, regime or rule such as 'home office deduction', 'Schedule C', 'reverse charge', 'crypto capital gains' or 'Beckham regime'. Optionally limit to one jurisdiction or domain. Returns matching skill slugs to open with get_skill. Set content_type='method' to find step-by-step methods (run them via start), each tagged accountant-reviewed or source-cited.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search term, e.g. 'home office deduction', 'crypto capital gains', 'reverse charge'. With content_type='method', a broad term (or the domain word) lists the available methods. | |
| domain | No | Optional accounting domain to limit the search (e.g. 'vat-gst', 'payroll', 'income-tax', 'crypto'). | |
| content_type | No | What kind of skill to find. 'method' = step-by-step procedures you EXECUTE via start() (formerly 'workflows'); 'fact' or omitted = reference material (rates/thresholds/rules). A skill can be either or both. | |
| jurisdiction | No | Optional ISO 2-letter country code to limit the search |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes | |
| next_action | No | |
| human_backing | No | Named accountant(s) who review this jurisdiction's guidance (guidance-level, not a per-figure sign-off). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds useful non-schema context: results are slugs intended for get_skill, methods are run via start, and method skills carry an accountant-reviewed or source-cited trust tag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and concrete query examples, then filters, then the return contract. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be detailed, yet the description still names the slug payload and the natural follow-up call. It covers the method/fact distinction and optional scoping, leaving only minor unstated details such as result limits or no-match behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the content_type enum and its 'method' vs 'fact' semantics, so the schema already does the heavy lifting — baseline 3. The description restates jurisdiction/domain limiting and content_type='method' rather than adding syntax or matching behavior (e.g. partial-word or synonym matching) beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find/search) and resource (tax skill) plus scope: keyword lookup of deductions, forms, regimes, rules. Concrete example queries make the retrieval target unambiguous, and it distinguishes itself from list_skills and search_rules by returning skill slugs rather than enumerating or matching rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when the optional filters apply ('limit to one jurisdiction or domain') and routes to the correct downstream tool in each case: get_skill to open a found slug, start to run a method. It lacks an explicit when-not-to-use statement (e.g. use list_skills to browse everything), so it stops short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
startAnswer a tax question (call first)ARead-onlyIdempotentInspect
Call this first for any tax, VAT/GST, payroll or filing question about a country or US state, such as "how much tax will I pay in Spain", "do I need to register for VAT", "when is my tax return due", "is this deductible", "how is a freelancer or a company taxed in Germany", "sales tax in Texas" or "what changes if I move to Portugal". Pass the user's question as intent and the country or US state as jurisdiction ('DE', 'US-TX', 'Florida'). If no place is named, start infers one when the question makes it clear and says so in jurisdiction_source. Returns the skills to read next (skills_to_load, open each with get_skill), or what is still needed, usually the country. Covers 190+ jurisdictions; where no skill exists yet it returns a research_brief naming the official sources.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | Required. The user's question or goal in their own words, e.g. 'how much tax will I pay as a freelancer', 'VAT return', 'set up a company'. | |
| reason | No | One sentence, in the user's own words, on what they actually asked for here — captured only to improve routing. E.g. 'user sold ETH and wants to know what to report'. Optional but helpful. | |
| acting_as | No | Optional. Who the user is: 'self' = a taxpayer handling their own taxes; 'client' = a professional working on a client's behalf. Infer it from the conversation; omit it if unclear. | |
| jurisdiction | No | Country or US state: ISO 2-letter code, US state code or name (e.g. 'MT', 'GB', 'US-CA', 'Florida'). Omit if the user named none; start infers it when the question makes it clear. | |
| taxpayer_type | No | The taxpayer's occupation, when known. Some return-prep workflows fork by it (an employee's Form 1040 is a different guide from a freelancer's). Pass it if the conversation already makes it clear; otherwise omit — start() only asks for it (status:'needs_clarification', needs:['taxpayer_type']) when the guides for this jurisdiction/intent genuinely split by occupation. 'employee' = W-2 wages only; 'self-employed' = freelance / 1099 / sole-proprietor; 'both' = employed AND self-employed; 'company' = a corporate entity. Don't guess — ask the user one short question if unsure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| needs | No | |
| intent | No | |
| status | No | |
| guardrails | No | |
| next_action | No | |
| expectations | No | |
| jurisdiction | No | |
| skills_to_load | No | |
| available_intents | No | |
| available_jurisdictions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses non-obvious behavior: it may infer jurisdiction and report that via `jurisdiction_source`, it returns either `skills_to_load` or a clarifying request, and where no skill exists it returns a `research_brief` naming official sources. Coverage limits (190+ jurisdictions) and the fallback path are stated, which annotations alone would 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action directive and the key parameters are front-loaded, and every sentence carries routing or behavioral information. It is on the long side because of the long example list of question phrasings, which is useful but slightly padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an entry-point router with an output schema, an optional-reason field and clarifying-question behavior, the description covers purpose, inputs, inference rules, next steps and fallback. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: jurisdiction accepts ISO codes, US state codes or names ('DE', 'US-TX', 'Florida'), and it explains the inference rule for omitted jurisdiction. It also motivates taxpayer_type by the forking return-prep workflows, though the detailed field-level semantics live in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (route/answer a tax, VAT/GST, payroll or filing question) plus the resource and the scoping constraint ('about a country or US state'), and positions itself ahead of siblings by saying 'call this first'. An agent can distinguish it from get_skill, search_skills or list_jurisdictions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it ('call this first for any tax... question'), names the concrete next step ('Returns the skills to read next (`skills_to_load`, open each with get_skill)'), and explains the alternative outcome when input is missing ('or what is still needed, usually the country'). Routing is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_helpWhat can you help with? (no args)ARead-onlyIdempotentInspect
Call when the user has no tax question yet and opens with 'what can you do?', 'how can you help me?' or 'where do I start?'. Takes no arguments. Returns the two scoping questions plus the available intents and jurisdictions; for a signed-in approved accountant, a short personal orientation briefing instead. Once there is a question, call start.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| needs | No | |
| status | No | |
| next_action | No | |
| available_intents | No | |
| available_jurisdictions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still adds real behavioral context beyond them: the response branch depends on sign-in/approval status, yielding a personal briefing instead of the generic scoping questions. It stops short of describing error or unauthenticated behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: trigger condition first, arity second, return content and hand-off to `start` last. The routing information is front-loaded where an agent will read it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, yet the description still summarizes the two possible response shapes. Combined with the explicit trigger, the next-step routing to `start`, and annotation-covered safety, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description confirms 'Takes no arguments', which is consistent with the empty schema and prevents an agent from hunting for hidden inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns — the two scoping questions plus available intents and jurisdictions, or a personalized `orientation` briefing for signed-in approved accountants. It is a specific verb+resource statement that an agent can distinguish from the sibling `start` without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger phrases ('what can you do?', 'how can you help me?', 'where do I start?') and names the alternative plus the condition that selects it: 'Once there is a question, call `start`.' Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_vat_numberValidate an EU VAT number (live VIES lookup)ARead-onlyIdempotentInspect
Check live whether an EU VAT number is valid and registered, for example before applying a B2B reverse charge, zero-rating an intra-EU sale or onboarding a supplier. Queries the European Commission's VIES registry and returns the verdict plus the registered business name and address where the authority discloses them. Coverage: the 27 EU member states plus 'XI' (Northern Ireland); use 'EL' for Greece. Other countries, including the UK, are not supported yet: say live validation is not available there rather than guessing. If the registry is down the response says so.
| Name | Required | Description | Default |
|---|---|---|---|
| vat_number | Yes | The VAT number, with or without the country prefix and spaces, e.g. 'IE6388047V', 'IE 6388047V', or '6388047V'. | |
| country_code | No | 2-letter EU member-state code of the VAT number, e.g. 'DE', 'IE', 'FR'. Use 'EL' for Greece and 'XI' for Northern Ireland. May be omitted if the country prefix is already part of vat_number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | No | true/false verdict from VIES, or null if the service could not be reached (an availability issue, not a verdict). |
| source | No | |
| address | No | |
| message | No | |
| summary | No | |
| checked_at | No | |
| source_url | No | |
| vat_number | No | |
| vies_error | No | |
| full_vat_id | No | |
| next_action | No | |
| country_code | No | |
| business_name | No | |
| human_backing | No | Named accountant(s) who review that country's VAT guidance (guidance-level, not a per-figure sign-off). |
| confirm_available | No | Always true: if the user asks, the VAT treatment can be sent for checking via share_with_openaccountants with request_review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, openWorld, non-destructive), but the description adds real behavior an agent needs: it hits an external EU registry, may return business name/address only where the authority discloses them, and reports registry downtime distinctly. The only gap is no mention of latency or rate limits on an external call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then usage, then coverage, then failure mode — a sensible information hierarchy. It runs four sentences and slightly overlaps the schema on country codes, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value shape needn't be explained; the description instead covers what schema and annotations cannot: external-registry scope, country coverage and the downtime path. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented with examples, prefix/spaces tolerance and the omission rule. The description adds only the coverage table ('EL' for Greece, 'XI' for Northern Ireland), which largely duplicates the schema's country_code text. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Check live whether an EU VAT number is valid and registered') and immediately scopes it to the VIES registry. No sibling tool in the list does VAT validation, so it is unambiguously distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete trigger scenarios (B2B reverse charge, zero-rating an intra-EU sale, supplier onboarding) and gives an explicit exclusion with a fallback instruction: other countries including the UK are unsupported, so say live validation is not available rather than guessing.
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.
3 tool updates
- Changed
get_quote4 fields changed- removed
Output schema / properties / anchorsRemoved value: -{ - "items": { - "type": "object" - }, - "type": "array" -} - removed
Output schema / properties / floorRemoved value: -{ - "type": "object" -} - added
Output schema / properties / price_listAdded value: +{ + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "anchors", - "pricing_method", - "rules", - "next_action" -]New value: +[ + "price_list", + "pricing_method", + "rules", + "next_action" +]
- Changed
get_skill1 field changed- changed
Output schema / properties / written_by / descriptionPrevious value: -"The accountant who wrote this skill ({name, profile_url}), when it is accountant-authored; null otherwise."New value: +"The accountant who wrote this skill ({name, profile_url}), when a named approved accountant authored it; null otherwise."
- Changed
list_skills1 field changed- changed
Output schema / properties / skills / items / properties / tier / descriptionPrevious value: -"1 = accountant-verified, 2 = research-verified"New value: +"1 = accountant-checked, 2 = not independently checked"
3 tool updates
- Changed
get_skill2 fields changed- changed
Output schema / properties / required_facts / descriptionPrevious value: -"Intake Guides only: the questions a professional asks before computing, verbatim from the Guide. Answer from what the user said or data you hold, then ask the rest grouped, before any figure."New value: +"Intake skills only: the questions a professional asks before computing, verbatim from the skill. Answer from what the user said or data you hold, then ask the rest grouped, before any figure." - changed
Output schema / properties / written_by / descriptionPrevious value: -"The accountant who wrote this Guide ({name, profile_url}), when it is accountant-authored; null otherwise."New value: +"The accountant who wrote this skill ({name, profile_url}), when it is accountant-authored; null otherwise."
- Changed
search_skills1 field changed- changed
Input schema / properties / content_type / descriptionPrevious value: -"What kind of Guide to find. 'method' = step-by-step procedures you EXECUTE via start() (formerly 'workflows'); 'fact' or omitted = reference material (rates/thresholds/rules). A Guide can be either or both."New value: +"What kind of skill to find. 'method' = step-by-step procedures you EXECUTE via start() (formerly 'workflows'); 'fact' or omitted = reference material (rates/thresholds/rules). A skill can be either or both."
- Changed
share_with_openaccountants1 field changed- changed
Input schema / properties / skill_slug / descriptionPrevious value: -"Optional: set when the note is feedback about a SPECIFIC Guide, by its slug (e.g. 'us-sales-tax'). Replaces the old submit_feedback."New value: +"Optional: set when the note is feedback about a SPECIFIC skill, by its slug (e.g. 'us-sales-tax'). Replaces the old submit_feedback."
1 tool update
- Changed
get_skill1 field changed- added
Output schema / properties / required_factsAdded value: +{ + "description": "Intake Guides only: the questions a professional asks before computing, verbatim from the Guide. Answer from what the user said or data you hold, then ask the rest grouped, before any figure.", + "items": { + "properties": { + "question": { + "type": "string" + }, + "topic": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" +}
1 tool update
- Added
get_quote
1 tool update
- Changed
start3 fields changed- changed
Input schema / properties / acting_as / descriptionPrevious value: -"REQUIRED. Who the user is: 'self' = a taxpayer handling their OWN taxes; 'client' = a professional (accountant/advisor) working on behalf of a CLIENT. Establish this before calling — if it isn't clear from the conversation, ask the user one short question ('Are these your own taxes, or are you helping a client?'). Never guess."New value: +"Optional. Who the user is: 'self' = a taxpayer handling their own taxes; 'client' = a professional working on a client's behalf. Infer it from the conversation; omit it if unclear." - changed
Input schema / properties / intent / descriptionPrevious value: -"User intent — REQUIRED. Free text, e.g. 'taxes', 'VAT return', 'set up a company'."New value: +"Required. The user's question or goal in their own words, e.g. 'how much tax will I pay as a freelancer', 'VAT return', 'set up a company'." - changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"ISO 2-letter code or US state code (e.g. 'MT', 'GB', 'US-CA')."New value: +"Country or US state: ISO 2-letter code, US state code or name (e.g. 'MT', 'GB', 'US-CA', 'Florida'). Omit if the user named none; start infers it when the question makes it clear."
3 tool updates
- Changed
list_verifiers1 field changed- removed
Output schema / properties / verifiers / items / properties / calendly_urlRemoved value: -{ - "type": "string" -}
- Changed
share_with_openaccountants3 fields changed- changed
Input schema / properties / contact_email / descriptionPrevious value: -"Review only, REQUIRED when request_review: the user's email. Ask for it first."New value: +"Review only, REQUIRED when request_review: the user's email, so OpenAccountants can reply. Ask for it first." - changed
Input schema / properties / request_review / descriptionPrevious value: -"true only when the user has asked for a licensed accountant to review their figures. Requires working_paper + jurisdiction + scenario + contact_email. Omit/false = just the note."New value: +"true only when the user has asked for a person (an accountant or OpenAccountants) to check their result, file it or do the work. Requires working_paper + jurisdiction + scenario + contact_email. Omit/false = just the note." - changed
Input schema / properties / skill_slug / descriptionPrevious value: -"Optional: set when the note is feedback about a SPECIFIC skill (e.g. 'us-sales-tax'). Replaces the old submit_feedback."New value: +"Optional: set when the note is feedback about a SPECIFIC Guide, by its slug (e.g. 'us-sales-tax'). Replaces the old submit_feedback."
- Changed
validate_vat_number1 field changed- changed
Output schema / properties / confirm_available / descriptionPrevious value: -"Whether the user can ask a named accountant to confirm the VAT treatment via ask_accountant_to_confirm."New value: +"Always true: if the user asks, the VAT treatment can be sent for checking via share_with_openaccountants with request_review."
1 tool update
- Changed
get_skill2 fields changed- changed
Output schema / properties / provenance / properties / tier / enumPrevious value: -[ - "accountant-verified", - "research-verified" -]New value: +[ + "accountant-verified", + "accountant-authored", + "research-verified" +] - added
Output schema / properties / written_byAdded value: +{ + "description": "The accountant who wrote this Guide ({name, profile_url}), when it is accountant-authored; null otherwise.", + "type": [ + "object", + "null" + ] +}
1 tool update
- Changed
start1 field changed- changed
Input schema / requiredPrevious value: -[ - "intent", - "acting_as" -]New value: +[ + "intent" +]
Related MCP Connectors
Double entry accounting run by your own AI: books, VAT figures, invoices, month close (UK, DE, AT).
AI bookkeeper for Swiss small companies: books invoices, reconciles the bank, keeps VAT current.
AI-powered bookkeeping and tax filing for entrepreneurs at the heart of the European economy.
AI agents for bookkeeping, reconciliation, and financial close for SMBs.
Related MCP Servers
- AlicenseCqualityDmaintenanceAI-powered skills for financial professionals. Comprehensive collection of finance, accounting, audit, and compliance skills for AI agents. IFRS/GAAP compliant with industry-specific applications.10042MIT
- AlicenseBqualityAmaintenanceEnables AI assistants to query and manage self-hosted accounting data—invoices, balances, and books—through natural language, with read-only tools by default and optional scoped write operations.3019 PyPI1AGPL 3.0
- AlicenseBqualityAmaintenanceFree, open-source (MIT), local-first Swiss accounting MCP server: an AI agent posts double-entry journal entries, categorises and chases invoices, and prepares the MWST-Abrechnung (the Swiss VAT return), with a minimalist Studio for human oversight. Posted entries are append-only and immutable, corrections are reversing entries, and every query is tenant-scoped.500198 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query a connected accounting platform for organisations, invoices, contacts, chart of accounts, and profit-and-loss reports, supporting bookkeeping, AR/AP, and financial reporting workflows.9 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.