OpenAccountants

Open-source AI accounting skills verified by licensed accountants (tax, VAT, payroll).

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
83%
Naming quality
99%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~6,976Tokens (tool definitions)
~3.9 KBTypical response size
Significant attention impact (5.45% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "openaccountants": {
      "url": "https://www.openaccountants.com/api/mcp"
    }
  }
}

Remote endpoints

https://www.openaccountants.com/api/mcpstreamable-http

What it can do

Tool inventory

Tools (15)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢start(intent, jurisdiction, acting_as, reason, taxpayer_type)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "intent": {
      "type": "string",
      "description": "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'."
    },
    "jurisdiction": {
      "type": "string",
      "description": "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."
    },
    "acting_as": {
      "type": "string",
      "enum": [
        "self",
        "client"
      ],
      "description": "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."
    },
    "reason": {
      "type": "string",
      "description": "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."
    },
    "taxpayer_type": {
      "type": "string",
      "enum": [
        "employee",
        "self-employed",
        "both",
        "company",
        "other"
      ],
      "description": "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."
    }
  },
  "required": [
    "intent"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ready",
        "needs_input",
        "needs_clarification",
        "uncovered"
      ]
    },
    "intent": {
      "type": "string"
    },
    "jurisdiction": {
      "type": "string"
    },
    "skills_to_load": {
      "type": "array"
    },
    "expectations": {
      "type": "string"
    },
    "next_action": {
      "type": "string"
    },
    "guardrails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "available_intents": {
      "type": "array"
    },
    "available_jurisdictions": {
      "type": "array"
    },
    "needs": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
🟢search_skills(query, jurisdiction, domain, content_type)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "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."
    },
    "jurisdiction": {
      "type": "string",
      "description": "Optional ISO 2-letter country code to limit the search"
    },
    "domain": {
      "type": "string",
      "description": "Optional accounting domain to limit the search (e.g. 'vat-gst', 'payroll', 'income-tax', 'crypto')."
    },
    "content_type": {
      "type": "string",
      "enum": [
        "method",
        "fact"
      ],
      "description": "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."
    }
  },
  "required": [
    "query"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "jurisdiction": {
            "type": "string"
          },
          "matched_section": {
            "type": "string"
          },
          "snippet": {
            "type": "string"
          }
        },
        "required": [
          "slug",
          "title",
          "jurisdiction"
        ]
      }
    },
    "total": {
      "type": "integer"
    },
    "next_action": {
      "type": "string"
    },
    "human_backing": {
      "type": [
        "object",
        "null"
      ],
      "description": "Named accountant(s) who review this jurisdiction's guidance (guidance-level, not a per-figure sign-off).",
      "properties": {
        "reviewed_by": {
          "type": "array"
        },
        "reviewed_by_line": {
          "type": [
            "string",
            "null"
          ]
        },
        "tier": {
          "type": "string"
        },
        "covered_but_anonymous": {
          "type": "boolean"
        }
      }
    }
  },
  "required": [
    "results",
    "total"
  ]
}
🟢get_skill(slug, reason)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Skill slug, e.g. 'us-schedule-c-and-se-computation'"
    },
    "reason": {
      "type": "string",
      "description": "One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional."
    }
  },
  "required": [
    "slug"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "skill": {
      "type": "object",
      "description": "The skill record (slug, name, jurisdiction, tier, etc.)"
    },
    "current_version": {
      "type": [
        "object",
        "null"
      ],
      "description": "Current version. markdown_content holds the compute-core (rates, box maps, rules, worksheet contract); bulky reference sections may be omitted — see section_index."
    },
    "section_index": {
      "type": "array",
      "description": "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}).",
      "items": {
        "type": "object"
      }
    },
    "verification": {
      "type": [
        "object",
        "null"
      ],
      "description": "Verification summary"
    },
    "written_by": {
      "type": [
        "object",
        "null"
      ],
      "description": "The accountant who wrote this skill ({name, profile_url}), when a named approved accountant authored it; null otherwise."
    },
    "required_facts": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "topic": {
            "type": [
              "string",
              "null"
            ]
          },
          "question": {
            "type": "string"
          }
        }
      },
      "description": "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."
    },
    "provenance": {
      "type": "object",
      "properties": {
        "tier": {
          "type": "string",
          "enum": [
            "accountant-verified",
            "accountant-authored",
            "research-verified"
          ]
        },
        "source_url": {
          "type": "string"
        },
        "attribution_required": {
          "type": "boolean"
        },
        "last_verified_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "When the skill's facts were last verified (decay signal), or null if never."
        }
      }
    },
    "key_facts": {
      "type": "object",
      "description": "Optional at-a-glance facts (rates/thresholds/deadlines/verifier/advisory) — present only where the skill carries a structured key_facts block; omitted otherwise."
    },
    "next_action": {
      "type": "string"
    },
    "guardrails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "skill",
    "provenance"
  ]
}
🟢search_rules(jurisdictions, domains, roles, block_types, statuses, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdictions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "ISO codes to include, e.g. ['MT','US-CA']. Omit for all jurisdictions."
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Accounting domains, e.g. ['vat-gst','income-tax']. See list_rule_facets."
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Skill roles: foundation | compute | orchestrator | reference."
    },
    "block_types": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "rate",
          "threshold",
          "rule",
          "formula",
          "refusal_code",
          "definition",
          "table_ref",
          "table"
        ]
      },
      "description": "Rule kinds to include. Default = all of these (framing prose + workflow steps are excluded)."
    },
    "statuses": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "draft",
          "research_verified",
          "accountant_verified",
          "needs_update",
          "unsure"
        ]
      },
      "description": "Verification statuses to include. Default = all (each rule is tagged)."
    },
    "status": {
      "type": "string",
      "enum": [
        "all",
        "verified"
      ],
      "description": "Shorthand for `statuses`: 'verified' = accountant- + research-verified only. Default 'all'."
    },
    "tax_year": {
      "type": "integer",
      "description": "Limit to a tax year, e.g. 2025."
    },
    "topic": {
      "type": "string",
      "description": "Filter by a fact topic."
    },
    "text": {
      "type": "string",
      "description": "Free-text search over each rule's label, value, and citation."
    },
    "limit": {
      "type": "integer",
      "description": "Max rules to return (default 200, max 500)."
    },
    "offset": {
      "type": "integer",
      "description": "Pagination offset — pass the previous response's next_offset."
    },
    "reason": {
      "type": "string",
      "description": "One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "markdown": {
      "type": "string",
      "description": "The bundled rule set as markdown — the user saves/runs this locally."
    },
    "fact_count": {
      "type": "integer",
      "description": "Rules returned on this page."
    },
    "total": {
      "type": "integer",
      "description": "Total matching rules (across all pages)."
    },
    "accountant_verified_count": {
      "type": "integer"
    },
    "jurisdictions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "truncated": {
      "type": "boolean"
    },
    "next_offset": {
      "type": [
        "integer",
        "null"
      ]
    },
    "next_action": {
      "type": "string"
    }
  },
  "required": [
    "markdown",
    "fact_count"
  ]
}
🟢list_skills(jurisdiction, domain, role, category, limit, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string",
      "description": "Filter by jurisdiction code, e.g. 'US', 'MT', 'DE'"
    },
    "domain": {
      "type": "string",
      "description": "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."
    },
    "role": {
      "type": "string",
      "description": "Filter by pipeline role: foundation, compute, orchestrator, reference."
    },
    "category": {
      "type": "string",
      "description": "(Legacy) display label; prefer domain/role."
    },
    "limit": {
      "type": "integer",
      "description": "Max skills to return (default 100, max 200)."
    },
    "offset": {
      "type": "integer",
      "description": "Number of skills to skip — use the next_offset from the previous response to page through results (default 0)."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "skills": {
      "type": "array",
      "description": "Matching published skills.",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "tier": {
            "type": "integer",
            "description": "1 = accountant-checked, 2 = not independently checked"
          },
          "category": {
            "type": "string"
          },
          "domain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Accounting domain facet"
          },
          "role": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pipeline role facet"
          },
          "jurisdiction": {
            "type": "string"
          },
          "display_order": {
            "type": [
              "integer",
              "null"
            ]
          },
          "verification": {
            "type": "object",
            "description": "Verification status summary"
          }
        },
        "required": [
          "slug",
          "name",
          "tier",
          "jurisdiction"
        ]
      }
    },
    "total": {
      "type": "integer",
      "description": "Total skills matching the filter (across all pages)."
    },
    "limit": {
      "type": "integer",
      "description": "Page size applied to this response."
    },
    "offset": {
      "type": "integer",
      "description": "Offset applied to this response."
    },
    "next_offset": {
      "type": "integer",
      "description": "Present when more results remain — pass as offset to fetch the next page."
    },
    "next_action": {
      "type": "string"
    }
  },
  "required": [
    "skills"
  ]
}
🟢get_skill_sections(slug, section_index, section_indices)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Skill slug"
    },
    "section_index": {
      "type": "integer",
      "description": "Optional. Return only this section (matches the `index` from get_skill's `section_index`)."
    },
    "section_indices": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Optional. Return only these sections."
    }
  },
  "required": [
    "slug"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "version": {
      "type": [
        "integer",
        "number"
      ]
    },
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "section_index": {
            "type": "integer"
          },
          "heading": {
            "type": "string"
          },
          "heading_level": {
            "type": [
              "integer",
              "null"
            ]
          },
          "markdown_content": {
            "type": "string"
          }
        },
        "required": [
          "heading",
          "markdown_content"
        ]
      }
    },
    "key_facts": {
      "type": "object",
      "description": "Optional at-a-glance facts — present only where the skill carries a structured key_facts block; omitted otherwise."
    },
    "next_action": {
      "type": "string"
    },
    "guardrails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "slug",
    "sections"
  ]
}
🟢get_deadlines(jurisdiction, horizon_days)

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

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string",
      "description": "ISO code, slug, or name ('MT', 'US-CA', 'Malta'). Optional for signed-in users with a saved home jurisdiction."
    },
    "horizon_days": {
      "type": "integer",
      "description": "How far ahead to look (default 120, max 366)."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string"
    },
    "jurisdiction_source": {
      "type": "string"
    },
    "horizon_days": {
      "type": "integer"
    },
    "upcoming_deadlines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "date_display": {
            "type": "string"
          },
          "days_away": {
            "type": "integer"
          },
          "personas": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    },
    "recurring_rhythms": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "frequency": {
            "type": "string"
          }
        }
      }
    },
    "calendar_url": {
      "type": "string"
    },
    "next_action": {
      "type": "string"
    }
  },
  "required": [
    "jurisdiction",
    "upcoming_deadlines"
  ]
}
🟢list_rule_facets

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.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "filters": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string"
          },
          "multi": {
            "type": "boolean"
          },
          "kind": {
            "type": "string"
          },
          "values": {
            "type": "array"
          }
        }
      }
    },
    "defaults": {
      "type": "object"
    },
    "next_action": {
      "type": "string"
    }
  }
}
🟢start_help

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

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "needs_input"
      ]
    },
    "needs": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "next_action": {
      "type": "string"
    },
    "available_intents": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "available_jurisdictions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
🟢list_jurisdictions

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.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "jurisdictions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "total_skills": {
            "type": "integer"
          },
          "accountant_verified_skills": {
            "type": "integer"
          },
          "lead_verifier": {
            "type": [
              "string",
              "null"
            ]
          },
          "lead_verifier_credential": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "total_jurisdictions": {
      "type": "integer"
    },
    "total_skills": {
      "type": "integer"
    },
    "next_action": {
      "type": "string"
    }
  }
}
🟢list_verifiers(jurisdiction)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string",
      "description": "Optional ISO code filter — only return verifiers for this jurisdiction."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "verifiers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "verifier_name": {
            "type": "string"
          },
          "verifier_credential": {
            "type": "string"
          },
          "jurisdictions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "role": {
            "type": "string"
          }
        }
      }
    },
    "total": {
      "type": "integer"
    },
    "next_action": {
      "type": "string"
    }
  }
}
🟢get_quote(jurisdiction, entity_type, services, monthly_volume, current_fee, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string",
      "description": "The client's country (ISO code or name). Logged so we know where demand is; not used to price."
    },
    "entity_type": {
      "type": "string",
      "enum": [
        "sole_trader",
        "company",
        "individual",
        "other"
      ],
      "description": "What the client is. Logged."
    },
    "services": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "What they want, e.g. bookkeeping, vat, payroll, tax_return, year_end, formation, relocation. Logged."
    },
    "monthly_volume": {
      "type": "string",
      "description": "One line on size: transactions, orders, staff, channels. Logged, and what you scope the fee on."
    },
    "current_fee": {
      "type": "string",
      "description": "What they pay today, if they said. Logged; useful for the fairness question."
    },
    "reason": {
      "type": "string",
      "description": "One sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional."
    }
  }
}

Output Schema

{
  "type": "object",
  "properties": {
    "price_list": {
      "type": "object"
    },
    "pricing_method": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "rules": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "booking_url": {
      "type": "string"
    },
    "contact_email": {
      "type": "string"
    },
    "next_action": {
      "type": "string"
    }
  },
  "required": [
    "price_list",
    "pricing_method",
    "rules",
    "next_action"
  ]
}
🟢validate_vat_number(country_code, vat_number)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "country_code": {
      "type": "string",
      "description": "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."
    },
    "vat_number": {
      "type": "string",
      "description": "The VAT number, with or without the country prefix and spaces, e.g. 'IE6388047V', 'IE 6388047V', or '6388047V'."
    }
  },
  "required": [
    "vat_number"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "valid": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "true/false verdict from VIES, or null if the service could not be reached (an availability issue, not a verdict)."
    },
    "country_code": {
      "type": [
        "string",
        "null"
      ]
    },
    "vat_number": {
      "type": "string"
    },
    "full_vat_id": {
      "type": "string"
    },
    "business_name": {
      "type": [
        "string",
        "null"
      ]
    },
    "address": {
      "type": [
        "string",
        "null"
      ]
    },
    "checked_at": {
      "type": "string"
    },
    "source": {
      "type": "string"
    },
    "source_url": {
      "type": "string"
    },
    "vies_error": {
      "type": "string"
    },
    "confirm_available": {
      "type": "boolean",
      "description": "Always true: if the user asks, the VAT treatment can be sent for checking via share_with_openaccountants with request_review."
    },
    "human_backing": {
      "type": [
        "object",
        "null"
      ],
      "description": "Named accountant(s) who review that country's VAT guidance (guidance-level, not a per-figure sign-off).",
      "properties": {
        "reviewed_by": {
          "type": "array"
        },
        "reviewed_by_line": {
          "type": [
            "string",
            "null"
          ]
        },
        "tier": {
          "type": "string"
        },
        "covered_but_anonymous": {
          "type": "boolean"
        }
      }
    },
    "summary": {
      "type": "string"
    },
    "next_action": {
      "type": "string"
    },
    "message": {
      "type": "string"
    }
  }
}
🟢check_audit_exemption(jurisdiction, financial_year_end, turnover, balance_sheet_total, employees_average, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "jurisdiction": {
      "type": "string",
      "description": "ISO-style code. MT and GB supported today."
    },
    "financial_year_end": {
      "type": "string",
      "description": "ISO date the financial year ends, e.g. '2025-12-31'."
    },
    "turnover": {
      "type": "number",
      "description": "Revenue/turnover for the year, in the jurisdiction's currency."
    },
    "balance_sheet_total": {
      "type": "number",
      "description": "Total assets at the balance sheet date."
    },
    "employees_average": {
      "type": "number",
      "description": "Average number of employees during the year."
    },
    "currency": {
      "type": "string",
      "description": "Currency of the figures — must match the regime (EUR for MT, GBP for GB); convert first, never guess a rate."
    },
    "entity_type": {
      "type": "string",
      "description": "Optional. 'private_ltd' (default), 'plc', 'branch'. Non-private shapes route to a human."
    },
    "group_member": {
      "type": "boolean",
      "description": "Optional. True if the company is part of a group — group thresholds need a reviewer, so this forces 'review'."
    },
    "prior_year": {
      "type": "object",
      "description": "Prior-year figures for the two-consecutive-years test.",
      "properties": {
        "turnover": {
          "type": "number"
        },
        "balance_sheet_total": {
          "type": "number"
        },
        "employees_average": {
          "type": "number"
        }
      }
    }
  },
  "required": [
    "jurisdiction",
    "financial_year_end",
    "turnover",
    "balance_sheet_total",
    "employees_average",
    "currency"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "determination": {
      "type": "string",
      "description": "'exempt' | 'review' | 'audit_required' | 'cannot_determine'"
    },
    "thresholds_applied": {
      "type": "array",
      "description": "Per-criterion: threshold vs actual, met true/false."
    },
    "criteria_rule": {
      "type": [
        "string",
        "null"
      ]
    },
    "rule_citation": {
      "type": [
        "object",
        "null"
      ],
      "description": "skill_slug, fact_id, canonical_key, statutory_reference, url."
    },
    "verification": {
      "type": [
        "object",
        "null"
      ],
      "description": "status ('accountant_verified'|'research_verified'|'draft'), verified_by[], last_verified_at, skill_slug, era. Surface the status to the user."
    },
    "caveats": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "escalate": {
      "type": "boolean"
    },
    "next_action": {
      "type": "string"
    }
  }
}
🔴share_with_openaccountants(note, skill_slug, request_review, jurisdiction, scenario, ...)

Only when the user asks: sends their feedback, or their request for a person to check or do the work, to OpenAccountants. Two modes. (1) `note`: an anonymized note about the guidance (a gap, a workaround you needed, or via `skill_slug` a bug in a specific skill). Anonymize hard: no names, amounts, or PII. (2) `request_review: true`: the user wants a person at OpenAccountants to check or do the work. Typical requests: 'can an accountant check this?', 'can someone file this for me?', 'can someone do this for me?', 'I want an accountant', 'can I talk to a person?'. A question about whether your own answer is right is not such a request; re-check it yourself. Also requires `working_paper` (complete), `jurisdiction`, `scenario`, and `contact_email`. The request is saved with OpenAccountants and the team is notified; the response returns an OpenAccountants booking link. The call is free. The work itself is paid: OpenAccountants does it through its accountants, with what is done and the fee agreed on the call before anything starts. Never describe the work itself as free. Call at most once per user request; not as a routine closing step.

Input Schema

{
  "type": "object",
  "properties": {
    "note": {
      "type": "string",
      "description": "Anonymized improvement note: what the guidance covered vs what you added or worked around and why, or a bug in a specific skill. No names, amounts, or PII."
    },
    "skill_slug": {
      "type": "string",
      "description": "Optional: set when the note is feedback about a SPECIFIC skill, by its slug (e.g. 'us-sales-tax'). Replaces the old submit_feedback."
    },
    "request_review": {
      "type": "boolean",
      "description": "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."
    },
    "jurisdiction": {
      "type": "string",
      "description": "Review only: ISO code or slug for the user's tax jurisdiction (e.g. 'US-CA')."
    },
    "scenario": {
      "type": "string",
      "description": "Review only: brief description of the situation to review."
    },
    "contact_email": {
      "type": "string",
      "description": "Review only, REQUIRED when request_review: the user's email, so OpenAccountants can reply. Ask for it first."
    },
    "contact_name": {
      "type": "string",
      "description": "Review only: the user's name."
    },
    "tax_year": {
      "type": "integer",
      "description": "Review only: tax year, if relevant."
    },
    "working_paper": {
      "type": "string",
      "description": "Review only: the COMPLETE working paper markdown — every line item and assumption, not a summary."
    }
  },
  "required": [
    "note"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string"
    },
    "note_recorded": {
      "type": "boolean"
    },
    "booking_url": {
      "type": "string"
    },
    "status": {
      "type": "string"
    }
  }
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded15 tools
verifiedversion not recorded15 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools
verifiedversion not recorded14 tools