DoubleTaxation MCP
An MCP server that allows AI assistants to determine tax residence status between countries, calculate tax burdens, check exit taxes, and compare business forms using legal norms and treaties. It supports 12 language versions and operates without user authentication.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://doubletaxation.app/api/mcpWhat its tools do
9 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to doubletaxation.app ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Determine tax residence status between two countries
- Calculate tax burden on salaries and income
- Check exit tax obligations and next steps
- Compare tax systems for different business forms
Source and maintenance
Protocol and capabilities
- Server
- doubletaxation 1.3.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 9 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
9 advertised
list_versions — List language versions
Lists the 12 versions of DoubleTaxation. Each version is written for taxpayers of one home state (in its language) and compares it with 20 other countries. Call this first if you are not sure which version fits the user.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"title": "List language versions",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_countries — List countries of a version
Lists the countries that can be checked against the home state of a version: whether a tax treaty is in force (title, dates, link), whether per-income treaty rules and tax burden data exist, plus the allowed citizenship options and years for check_residency.
{
"type": "object",
"required": [
"version"
],
"properties": {
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Version id from list_versions."
}
},
"additionalProperties": false
}{
"title": "List countries of a version",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}check_residency — Check tax residence
Determines the person's tax residence between the version's home state and another country, step by step. Without all answers it returns status "needs_answer" and the next question (id, text, options); ask the user and call again with all answers collected so far. When complete it returns status "done": the conclusion with reliability %, how each law treats the person, the treaty tie-breaker, where and which taxes apply, next steps (certificate of residence, resident / non-resident obligations, steps when leaving), exit tax and the year of the move (with "move"), what the result does not cover, the legal basis (norms with links) and court practice, optional per-income-type rules, the disclaimer and a link to the same result on doubletaxation.app. Texts are in the language of the version.
{
"type": "object",
"required": [
"version",
"country"
],
"properties": {
"move": {
"type": "object",
"required": [
"kind",
"date"
],
"properties": {
"date": {
"type": "string",
"description": "Date of the move, YYYY-MM-DD."
},
"kind": {
"enum": [
"depart",
"arrive"
],
"type": "string"
}
},
"description": "Optional: the person moved this tax year. kind \"depart\" = left the version's home state for the other country; \"arrive\" = moved to the home state from the other country. date YYYY-MM-DD within the tax year. Adds how each state treats the year of the move, the steps when leaving and the exit tax of the state left.",
"additionalProperties": false
},
"year": {
"type": "integer",
"description": "Tax year: the current year or one of the two previous years. Default: current year."
},
"income": {
"type": "array",
"items": {
"type": "object",
"required": [
"category",
"source"
],
"properties": {
"days": {
"type": "integer",
"description": "employment: days in the state of work within the treaty period."
},
"asset": {
"enum": [
"immovable",
"property_rich_shares",
"other"
],
"type": "string",
"description": "capital_gains: what is sold."
},
"amount": {
"type": "number",
"description": "Optional annual gross amount (any currency, used for an illustrative calculation)."
},
"source": {
"type": "string",
"description": "ISO code of the state of source: where the work is done, the property is, the payer or company is resident, the performance takes place. Must be the home state or the other country."
},
"student": {
"enum": [
"yes",
"no",
"unknown"
],
"type": "string",
"description": "students: came to the state of study for education, and the payments come from abroad?"
},
"category": {
"enum": [
"employment",
"business",
"technical_fees",
"government",
"pension",
"immovable",
"dividends",
"interest",
"royalties",
"capital_gains",
"directors",
"artistes",
"students",
"other"
],
"type": "string"
},
"borne_by_pe": {
"enum": [
"yes",
"no",
"unknown"
],
"type": "string",
"description": "employment: is the salary borne by a permanent establishment of the employer in the state of work?"
},
"fixed_place": {
"enum": [
"yes",
"no",
"unknown"
],
"type": "string",
"description": "business / technical_fees: fixed place of business (permanent establishment) in the state of source?"
},
"study_state": {
"type": "string",
"description": "students: state where the person studies (ISO code)."
},
"pension_kind": {
"enum": [
"social",
"government",
"private"
],
"type": "string",
"description": "pension: state social pension, pension for government service, or private/occupational pension."
},
"service_days": {
"type": "integer",
"description": "business / technical_fees: days of providing services in the state of source."
},
"service_state": {
"type": "string",
"description": "government: state where the government service is performed (ISO code)."
},
"employer_resident_of_source": {
"enum": [
"yes",
"no",
"unknown"
],
"type": "string",
"description": "employment: is the employer resident in the state of work?"
}
},
"additionalProperties": false
},
"description": "Optional: the person's income, one item per category, to get the treaty's special rules (who may tax it, rate limits, relief method, example calculation if amount is given)."
},
"answers": {
"type": "object",
"description": "Answers so far: { \"<question id>\": value }. Choice questions take an option value (e.g. \"yes\", \"no\", \"unknown\"); number questions take a whole number (days) or \"unknown\" if allowed.",
"additionalProperties": {
"type": [
"string",
"integer"
]
}
},
"country": {
"enum": [
"AT",
"BD",
"CA",
"CH",
"CN",
"CZ",
"DE",
"ES",
"FR",
"GB",
"HU",
"IN",
"IT",
"JP",
"NL",
"PK",
"PL",
"RO",
"TR",
"UA",
"US"
],
"type": "string",
"description": "ISO code of the other country (where the person lives or stays). Must be one of list_countries for this version."
},
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Version id (home state), see list_versions."
},
"citizenship": {
"type": "string",
"description": "Citizenship option value from list_countries.citizenship_options, e.g. \"UA\", \"UA+OTHER\" (dual), \"NONUS\". Default: the first option (citizen of the home state only)."
}
},
"additionalProperties": false
}{
"title": "Check tax residence",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}tax_burden — Tax burden on salary
Income tax and social contributions on an annual salary in one or more countries (OECD Taxing Wages method: single person, no children, full-year employee). Returns net pay, personal rate, tax wedge and marginal rate, sorted from lowest to highest personal rate. For up to 3 countries also the line-by-line breakdown, special tax regimes for individuals (e.g. for newcomers), assumptions and official sources.
{
"type": "object",
"properties": {
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Language of the texts (version id). Default: en."
},
"countries": {
"type": "array",
"items": {
"enum": [
"AT",
"BD",
"CA",
"CH",
"CN",
"CZ",
"DE",
"ES",
"FR",
"GB",
"HU",
"IN",
"IT",
"JP",
"NL",
"PK",
"PL",
"RO",
"TR",
"UA",
"US"
],
"type": "string"
},
"description": "ISO codes; default: all available countries."
},
"gross_eur": {
"type": "number",
"description": "Annual gross salary in EUR. Default 60,000 (reference profiles: 30,000 / 60,000 / 120,000)."
},
"gross_local": {
"type": "number",
"description": "Annual gross salary in the country's own currency (only with exactly one country)."
}
},
"additionalProperties": false
}{
"title": "Tax burden on salary",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}count_days — Count days of stay
Counts days of stay per country from the trips the user provides (country, from, to) under each country's own counting rule (calendar year, tax year, any 12 months, US substantial presence test, continuous stay): days in the counting period, the day threshold for tax residence and its legal source, the date it was reached or how many more days are needed, and Schengen 90/180 days used. The day of arrival and departure counts in both countries. It does not track anyone: it only counts the trips passed in, and they are not stored.
{
"type": "object",
"required": [
"trips"
],
"properties": {
"as_of": {
"type": "string",
"description": "Date to count up to, YYYY-MM-DD. Default: today. Later trips count as planned."
},
"trips": {
"type": "array",
"items": {
"type": "object",
"required": [
"country",
"from"
],
"properties": {
"to": {
"type": "string",
"description": "Departure date, YYYY-MM-DD. Omit if the person is still there (counted up to as_of)."
},
"from": {
"type": "string",
"description": "Arrival date, YYYY-MM-DD."
},
"country": {
"type": "string",
"description": "ISO 3166-1 alpha-2 code, e.g. \"PL\"."
}
},
"additionalProperties": false
},
"description": "Stays, one item per stay."
},
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Language of the texts (version id). Default: en."
}
},
"additionalProperties": false
}{
"title": "Count days of stay",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}next_steps — Next steps after the residence conclusion
What to do once the tax residence is known (the same blocks as under the result on doubletaxation.app and in check_residency "done"): how to get a certificate of residence, obligations of a resident (returns, deadlines), obligations and options of a non-resident with income from the other state (treaty relief forms, refunds), U.S. citizen obligations, steps when leaving the state, the exit tax, how each state treats the year of the move, and what the conclusion does not cover. Each step has the authority, form, link and legal norm. Texts are in the language of the version.
{
"type": "object",
"required": [
"version",
"residence"
],
"properties": {
"move": {
"type": "object",
"required": [
"kind",
"date"
],
"properties": {
"date": {
"type": "string",
"description": "Date of the move, YYYY-MM-DD."
},
"kind": {
"enum": [
"depart",
"arrive"
],
"type": "string"
}
},
"description": "Optional: the person moved this tax year. kind \"depart\" = left the version's home state for the other country; \"arrive\" = moved to the home state from the other country. date YYYY-MM-DD within the tax year.",
"additionalProperties": false
},
"year": {
"type": "integer",
"description": "Tax year of the move (current or one of the two previous). Optional; used to check move.date."
},
"other": {
"enum": [
"AT",
"BD",
"CA",
"CH",
"CN",
"CZ",
"DE",
"ES",
"FR",
"GB",
"HU",
"IN",
"IT",
"JP",
"NL",
"PK",
"PL",
"RO",
"TR",
"UA",
"US"
],
"type": "string",
"description": "The other country of the pair (ISO code). Optional when residence is a country other than the home state (then it is that country); needed for BOTH, MAP, NONE, UNDETERMINED and for move kind \"arrive\"."
},
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Version id (home state), see list_versions."
},
"residence": {
"type": "string",
"description": "State of tax residence: the version's home state or one of its other countries (ISO code), or \"BOTH\", \"MAP\", \"NONE\", \"UNDETERMINED\" (conclusion.residence from check_residency)."
},
"citizenship": {
"type": "string",
"description": "Citizenship option value from list_countries.citizenship_options (e.g. \"US\", \"US+OTHER\", \"NONUS\"). Default: the first option. Matters for U.S. citizens (taxed on worldwide income wherever they live)."
}
},
"additionalProperties": false
}{
"title": "Next steps after the residence conclusion",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}exit_tax_check — Exit tax on individuals
Whether a country levies an exit (departure) tax on individuals who give up tax residence: who pays and on what (assets, thresholds, prior residence period), deferral or relief (e.g. moving within the EU/EEA), the legal norm with a link and the date checked.
{
"type": "object",
"properties": {
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Language of the texts (version id). Default: en."
},
"countries": {
"type": "array",
"items": {
"enum": [
"AT",
"BD",
"CA",
"CH",
"CN",
"CZ",
"DE",
"ES",
"FR",
"GB",
"HU",
"IN",
"IT",
"JP",
"NL",
"PK",
"PL",
"RO",
"TR",
"UA",
"US"
],
"type": "string"
},
"maxItems": 30,
"description": "ISO codes; default: all available countries."
}
},
"additionalProperties": false
}{
"title": "Exit tax on individuals",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}regime_search — Search special tax regimes
Special and preferential tax regimes for individuals (newcomers / impatriates, employees, self-employed, investors, pensioners) in 21 countries. Filter by country, kind, status and free text. Returns per regime: official name, who it is for, the benefit, duration, how to apply, limits and risks, status (open, closed to new entrants, only for existing participants, starts later), the legal norm with a link and the date checked.
{
"type": "object",
"properties": {
"kind": {
"type": "array",
"items": {
"enum": [
"newcomer",
"employee",
"self_employed",
"investor",
"pensioner",
"other"
],
"type": "string"
},
"maxItems": 6,
"description": "Who the regime is for; default: all."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Maximum regimes returned. Default 20."
},
"query": {
"type": "string",
"maxLength": 100,
"description": "Free text; all words must match (name, who, benefit, conditions; in the version's language or English), e.g. \"foreign income flat\"."
},
"status": {
"type": "array",
"items": {
"enum": [
"open",
"closed",
"grandfathered",
"announced"
],
"type": "string"
},
"maxItems": 4,
"description": "open = can be entered now; closed = closed to new entrants; grandfathered = only for existing participants; announced = starts later. Default: all."
},
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Language of the texts (version id). Default: en."
},
"countries": {
"type": "array",
"items": {
"enum": [
"AT",
"BD",
"CA",
"CH",
"CN",
"CZ",
"DE",
"ES",
"FR",
"GB",
"HU",
"IN",
"IT",
"JP",
"NL",
"PK",
"PL",
"RO",
"TR",
"UA",
"US"
],
"type": "string"
},
"maxItems": 30,
"description": "ISO codes; default: all countries."
}
},
"additionalProperties": false
}{
"title": "Search special tax regimes",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}compare_business_forms — Business taxes: compare legal forms and tax systems
Business tax calculator for a resident of one country and one sector (activity): every legal form (sole proprietor, own company) under every available tax system — total tax and contributions, what remains, rate, line items, why a system is unavailable for the sector or amount, conditions, legal norms; requirements for each legal form and the sector's tax features; assumptions and sources. Same calculation and ranking as doubletaxation.app (section "Business taxes"); an estimate, not tax advice.
{
"type": "object",
"required": [
"country",
"revenue",
"expenses",
"currency"
],
"properties": {
"country": {
"enum": [
"AT",
"BD",
"CA",
"CH",
"CN",
"CZ",
"DE",
"ES",
"GB",
"HU",
"IN",
"IT",
"JP",
"NL",
"PK",
"PL",
"RO",
"TR",
"UA",
"US"
],
"type": "string",
"description": "ISO code of the country of residence."
},
"revenue": {
"type": "number",
"minimum": 0,
"description": "Annual revenue, in the currency given by \"currency\"."
},
"version": {
"enum": [
"uk",
"en",
"pl",
"cs",
"ro",
"hu",
"tr",
"zh",
"in",
"ja",
"bn",
"pk"
],
"type": "string",
"description": "Language of the texts (version id). Default: en."
},
"activity": {
"enum": [
"it",
"services",
"consumer",
"trade",
"production"
],
"type": "string",
"description": "Sector: it = IT and consulting for businesses (default); services = other professional services to companies (marketing, design, translation, engineering, bookkeeping); consumer = services to individuals (household services, repairs, beauty, tutoring); trade = trade in goods, retail or wholesale, incl. online shop (no excise goods); production = making and selling own products."
},
"currency": {
"type": "string",
"description": "Currency of revenue and expenses: \"EUR\" or the country's own currency code (e.g. \"PLN\"). EUR amounts are converted at the site's rate (fx.per_eur in the result)."
},
"expenses": {
"type": "number",
"minimum": 0,
"description": "Annual deductible business expenses (not more than revenue), in the same currency."
},
"distribute": {
"type": "boolean",
"description": "For companies: the whole profit after tax is paid to the owner as dividends (true, default) or stays in the company (false; companies are then not ranked against sole proprietors)."
}
},
"additionalProperties": false
}{
"title": "Business taxes: compare legal forms and tax systems",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 831 ms
- 95th percentile latency
- 831 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 831 ms · metadata changed · 9 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http doubletaxation-mcp https://doubletaxation.app/api/mcpCodex
codex mcp add doubletaxation-mcp --url https://doubletaxation.app/api/mcpCursor
{
"mcpServers": {
"doubletaxation-mcp": {
"url": "https://doubletaxation.app/api/mcp"
}
}
}Cline
{
"mcpServers": {
"doubletaxation-mcp": {
"type": "streamableHttp",
"url": "https://doubletaxation.app/api/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"doubletaxation-mcp": {
"type": "http",
"url": "https://doubletaxation.app/api/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http doubletaxation-mcp https://doubletaxation.app/api/mcpClaude Desktop
https://doubletaxation.app/api/mcpWindsurf
{
"mcpServers": {
"doubletaxation-mcp": {
"serverUrl": "https://doubletaxation.app/api/mcp"
}
}
}Let your agent find its tools
Find servers like DoubleTaxation MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run DoubleTaxation MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.