Reference

MCP server & tools

OpenAccountants runs a Model Context Protocol server that any MCP-compatible AI agent can call for tax data, rate lookups, cross-border planning, and handoff to a suitably qualified professional. The catalogue below is generated from the live server, so it always matches what the agent can actually call.

Connect

  • Endpoint: POST /api/mcp — Streamable HTTP, JSON-RPC 2.0 (server openaccountants-mcp v1.4.0).
  • Install: add the connector from /connect — it works with any MCP-compatible agent.
  • Auth: reads are public — discovery, retrieval, rates, cross-border and workflow-read tools need no sign-in. Contribution and verification tools require sign-in (OAuth); an anonymous call to one returns a 401 with an OAuth challenge. The access tier is shown per tool below.
  • Limits: 60 requests/minute per IP; 1,000 requests/day per signed-in account.

14 tools, generated from the live server catalogue. Reads are public (no sign-in); contribution and verification tools require a signed-in account. * marks a required parameter.

Orientation

Scope a request and discover what's covered.

startPublic — no sign-in

Front door for any tax / accounting question once you know what the user wants. `intent` is REQUIRED (e.g. 'taxes', 'VAT return', 'set up a company', 'find deductions', 'classify transactions', 'payroll'); pass a jurisdiction too (ISO 2-letter, e.g. 'MT', 'GB', 'US-CA'). If you don't yet have an intent, call `start_help` first. Returns either a clarification request (if jurisdiction is missing) or a ready-to-execute plan with the list of skills to load. Call this FIRST (after start_help if needed) whenever the user asks for tax help.

ParameterTypeDescription
intent *stringUser intent — REQUIRED. Free text, e.g. 'taxes', 'VAT return', 'set up a company'.
jurisdictionstringISO 2-letter code or US state code (e.g. 'MT', 'GB', 'US-CA').
acting_as *stringREQUIRED. 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.
reasonstringOne 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_typestringThe 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.
start_helpPublic — no sign-in

No-argument front door — call this FIRST whenever a user asks 'how can you help me?', 'what can you do?', 'where do I start?', or otherwise opens vaguely (do NOT answer such questions by listing your tools or calling list_jurisdictions). For a signed-in approved accountant it returns a personalized `orientation` briefing (their standing + what their jurisdiction needs + one next action). For everyone else it returns the two scoping questions plus the available intents and jurisdictions. Once you have an intent, call `start(intent, jurisdiction)`.

list_jurisdictionsPublic — no sign-in

Returns every jurisdiction with published skills — countries (ISO 2), US states (US-XX), Canadian provinces — with skill counts, accountant-verified counts, and named lead verifier. Use when the user asks 'which countries does OpenAccountants cover?' or 'what's available for [country]?' Avoids paginating through list_skills to compute this.

list_verifiersPublic — no sign-in

Returns named licensed accountants who have signed off on OpenAccountants jurisdictions, with their credentials and covered jurisdictions. Use when the user asks who verified a skill or wants to see the verifier network. If the user wants one of them to review their work, that goes through `share_with_openaccountants` with `request_review: true` — at the user's explicit request only.

ParameterTypeDescription
jurisdictionstringOptional ISO code filter — only return verifiers for this jurisdiction.

Skills — discovery & retrieval

Find and load the cited rules an answer is built from.

list_skillsPublic — no sign-in

List published OpenAccountants skills with their quality tier and verification status. Optionally filter by jurisdiction (e.g. 'US', 'MT', 'DE', 'GB'), domain (the accounting area, e.g. 'vat-gst', 'payroll', 'income-tax'), or role ('foundation' | 'compute' | 'orchestrator' | 'reference'). Results are paginated (default 100, max 200 per call) — unfiltered browsing of the full ~1,100-skill catalogue requires paging via offset/next_offset, so jurisdiction/domain filters are strongly recommended.

ParameterTypeDescription
jurisdictionstringFilter by jurisdiction code, e.g. 'US', 'MT', 'DE'
domainstringFilter 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.
rolestringFilter by pipeline role: foundation, compute, orchestrator, reference.
categorystring(Legacy) display label; prefer domain/role.
limitintegerMax skills to return (default 100, max 200).
offsetintegerNumber of skills to skip — use the next_offset from the previous response to page through results (default 0).
search_skillsPublic — no sign-in

Full-text search across all published tax and accounting skills. Find, lookup, query, or discover skills by keyword, tax concept, deduction type, form number, or regulation (e.g. 'home office deduction', 'crypto capital gains', 'reverse charge', 'Schedule C', '60-day reporting'). Optionally limit to one jurisdiction. Use this when you don't know the exact skill slug. Set content_type='method' to discover step-by-step METHODS (guided procedures — what you EXECUTE via start()) instead of reference material; each method carries a review_status (accountant-reviewed | source-cited).

ParameterTypeDescription
query *stringSearch 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.
jurisdictionstringOptional ISO 2-letter country code to limit the search
domainstringOptional accounting domain to limit the search (e.g. 'vat-gst', 'payroll', 'income-tax', 'crypto').
content_typestringWhat 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.
get_skillPublic — no sign-in

Fetch a published skill by slug, including its current-version markdown, quality tier, named verifier (where accountant-verified), and a provenance/attribution footer.

ParameterTypeDescription
slug *stringSkill slug, e.g. 'us-schedule-c-and-se-computation'
reasonstringOne sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional.
get_skill_sectionsPublic — no sign-in

Fetch the parsed sections of a skill's current version. Each section has a heading and its markdown content. Use this to pull a specific section that get_skill listed in `section_index` as not inlined (e.g. a supplier-pattern library) — pass `section_index` to fetch just that one. Omit it to get every section.

ParameterTypeDescription
slug *stringSkill slug
section_indexintegerOptional. Return only this section (matches the `index` from get_skill's `section_index`).
section_indicesarrayOptional. Return only these sections.

Rules & citations

Query individual facts/rules and check a citation.

search_rulesPublic — no sign-in

Query individual tax RULES/FACTS (rates, thresholds, rules, definitions, tables) ACROSS jurisdictions and metadata, and get back a bundled markdown rule set plus the jurisdiction's OFFICIAL SOURCE. Unlike get_skill (one whole skill), this assembles a cross-cutting SET — e.g. 'VAT rates in MT, IE and DE', 'all income-tax thresholds for 2025', or 'rules mentioning reverse charge'. IMPORTANT: this returns human-reviewed GUIDANCE, and does NOT certify that a figure is current — confirm each number against the official source returned in `official_source` before you state it, and prefer that source when they disagree. By default returns ALL matching rules, each tagged with its verification status; pass status:'verified' for accountant-/research-verified only. Call `list_rule_facets` first to see the queryable values.

ParameterTypeDescription
jurisdictionsarrayISO codes to include, e.g. ['MT','US-CA']. Omit for all jurisdictions.
domainsarrayAccounting domains, e.g. ['vat-gst','income-tax']. See list_rule_facets.
rolesarraySkill roles: foundation | compute | orchestrator | reference.
block_typesarrayRule kinds to include. Default = all of these (framing prose + workflow steps are excluded).
statusesarrayVerification statuses to include. Default = all (each rule is tagged).
statusstringShorthand for `statuses`: 'verified' = accountant- + research-verified only. Default 'all'.
tax_yearintegerLimit to a tax year, e.g. 2025.
topicstringFilter by a fact topic.
textstringFree-text search over each rule's label, value, and citation.
limitintegerMax rules to return (default 200, max 500).
offsetintegerPagination offset — pass the previous response's next_offset.
reasonstringOne sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional.
list_rule_facetsPublic — no sign-in

Returns the metadata you can filter on with `search_rules` — the live jurisdictions, the domains, roles, block types (rule kinds), statuses, tax years, and a sample of topics — plus the defaults. Call this before `search_rules` to learn the valid filter values rather than guessing.

Rates & cross-border

Indexed numbers and multi-country planning.

Share & optional review

One channel: send anonymous feedback to improve the guidance, and optionally route a working paper to a Partner for review if the user wants it.

share_with_openaccountantsPublic — no sign-in

Sends feedback or a review request to OpenAccountants. This is the single outbound channel; it does nothing unless the user has explicitly asked to send feedback or to request a review. 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` — submits the user's working paper for review by a licensed accountant; also requires `working_paper` (complete), `jurisdiction`, `scenario`, and `contact_email`. The review is a paid professional engagement (never describe it as free); the request is saved to the user's own queue and the response returns a booking link — nothing reaches an accountant until the user engages. Call at most once per explicit user request; never call as a routine closing step, and never solicit the request.

ParameterTypeDescription
note *stringAnonymized 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_slugstringOptional: set when the note is feedback about a SPECIFIC skill (e.g. 'us-sales-tax'). Replaces the old submit_feedback.
request_reviewbooleantrue 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.
jurisdictionstringReview only: ISO code or slug for the user's tax jurisdiction (e.g. 'US-CA').
scenariostringReview only: brief description of the situation to review.
contact_emailstringReview only, REQUIRED when request_review: the user's email. Ask for it first.
contact_namestringReview only: the user's name.
tax_yearintegerReview only: tax year, if relevant.
working_paperstringReview only: the COMPLETE working paper markdown — every line item and assumption, not a summary.

Workflows

Guided, accountant-authored procedures that wire skills together.

Verification & contribution

Contribute new skills and verify facts inline (approved accountants).

Other tools

get_deadlinesSigned-in caller

Upcoming filing/payment deadlines and recurring filing rhythms (monthly VAT, quarterly instalments) for a country or US state, from the OpenAccountants tax calendar. Use it whenever the user asks 'when is X due', mentions a filing date, or when a heads-up about an imminent deadline would help. Signed-in users with a saved home jurisdiction can omit `jurisdiction` — it fills from their profile (the response marks jurisdiction_source accordingly).

ParameterTypeDescription
jurisdictionstringISO code, slug, or name ('MT', 'US-CA', 'Malta'). Optional for signed-in users with a saved home jurisdiction.
horizon_daysintegerHow far ahead to look (default 120, max 366).
validate_vat_numberSigned-in caller

Check whether a business's VAT / tax-registration number is real and registered, in real time against the official government registry — and return the registered business NAME and ADDRESS when the authority discloses them. This is an authoritative, unfakeable confirmation you cannot get from a knowledge lookup or from training data. Use it whenever a user wants to verify a supplier's or customer's tax ID: before applying a B2B reverse charge, zero-rating a cross-border sale, or onboarding a vendor. COVERAGE TODAY IS EU ONLY — the 27 EU member states plus 'XI' (Northern Ireland), live via the European Commission's VIES registry (use 'EL' for Greece). Other jurisdictions (e.g. UK/HMRC and beyond) are NOT supported yet but are on the roadmap — for a non-EU number, tell the user live validation isn't available for that country yet rather than guessing a verdict. This is a LIVE external lookup — if the registry is temporarily unavailable it says so plainly rather than inventing an answer.

ParameterTypeDescription
country_codestring2-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 *stringThe VAT number, with or without the country prefix and spaces, e.g. 'IE6388047V', 'IE 6388047V', or '6388047V'.
check_audit_exemptionSigned-in caller

DETERMINISTIC check of whether a private limited company qualifies for statutory audit exemption, from aggregate figures any ledger can provide (turnover, balance sheet total, average employees). Returns a determination ('exempt' | 'review' | 'audit_required' | 'cannot_determine'), the per-criterion threshold table showing exactly why, the canonical rule citation it rests on, and the LIVE verification envelope (whether a named accountant has attested the thresholds — surface that status prominently; 'draft' means treat as a source-cited draft). COVERAGE TODAY: MT (Article 185(2) micro thresholds) and GB (small-company thresholds, both pre and post 6 April 2025 eras). Most exemption regimes are two-consecutive-years tests, so pass prior_year figures when available — without them a qualifying year returns 'review', not 'exempt'; that is correct behaviour, not an error. 'cannot_determine' is a first-class outcome (unsupported jurisdiction, wrong currency, entity shapes needing judgment, or the cited fact changed since calibration). Never override the determination with training-data thresholds.

ParameterTypeDescription
jurisdiction *stringISO-style code. MT and GB supported today.
financial_year_end *stringISO date the financial year ends, e.g. '2025-12-31'.
turnover *numberRevenue/turnover for the year, in the jurisdiction's currency.
balance_sheet_total *numberTotal assets at the balance sheet date.
employees_average *numberAverage number of employees during the year.
currency *stringCurrency of the figures — must match the regime (EUR for MT, GBP for GB); convert first, never guess a rate.
entity_typestringOptional. 'private_ltd' (default), 'plc', 'branch'. Non-private shapes route to a human.
group_memberbooleanOptional. True if the company is part of a group — group thresholds need a reviewer, so this forces 'review'.
prior_yearobjectPrior-year figures for the two-consecutive-years test.
Building tax intelligence into a product? The AI-agent guide walks through a typical call sequence, and the platforms guide covers embedding it under your brand.