Skip to main content
Glama

Check tax residence

check_residency
Read-onlyIdempotent

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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "version": "<version>",
      "country": "<country>"
    },
    "name": "check_residency"
  }
}

Input Schema

NameRequiredDescriptionDefault
moveNoOptional: 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.
yearNoTax year: the current year or one of the two previous years. Default: current year.
incomeNoOptional: 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).
answersNoAnswers 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.
countryYesISO code of the other country (where the person lives or stays). Must be one of list_countries for this version.
versionYesVersion id (home state), see list_versions.
citizenshipNoCitizenship option value from list_countries.citizenship_options, e.g. "UA", "UA+OTHER" (dual), "NONUS". Default: the first option (citizen of the home state only).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / country / enum
      Previous value: -[
      -  "AT",
      -  "BD",
      -  "CA",
      -  "CH",
      -  "CN",
      -  "CZ",
      -  "DE",
      -  "ES",
      -  "FR",
      -  "GB",
      -  "HU",
      -  "IN",
      -  "IT",
      -  "JP",
      -  "NL",
      -  "PK",
      -  "PL",
      -  "PT",
      -  "RO",
      -  "TR",
      -  "UA",
      -  "US"
      -]New value: +[
      +  "AR",
      +  "AT",
      +  "BD",
      +  "BR",
      +  "CA",
      +  "CH",
      +  "CN",
      +  "CZ",
      +  "DE",
      +  "ES",
      +  "FR",
      +  "GB",
      +  "HU",
      +  "IN",
      +  "IT",
      +  "JP",
      +  "MY",
      +  "NL",
      +  "PK",
      +  "PL",
      +  "PT",
      +  "RO",
      +  "SE",
      +  "SG",
      +  "TR",
      +  "TW",
      +  "UA",
      +  "US"
      +]
    • changedInput schema / properties / version / enum
      Previous value: -[
      -  "uk",
      -  "en",
      -  "pl",
      -  "cs",
      -  "ro",
      -  "hu",
      -  "tr",
      -  "zh",
      -  "in",
      -  "ja",
      -  "bn",
      -  "pk",
      -  "de",
      -  "at",
      -  "fr",
      -  "es",
      -  "pt",
      -  "it"
      -]New value: +[
      +  "uk",
      +  "en",
      +  "pl",
      +  "cs",
      +  "ro",
      +  "hu",
      +  "tr",
      +  "zh",
      +  "in",
      +  "ja",
      +  "bn",
      +  "pk",
      +  "de",
      +  "at",
      +  "fr",
      +  "es",
      +  "pt",
      +  "it",
      +  "my",
      +  "sg",
      +  "tw",
      +  "se",
      +  "br",
      +  "ar"
      +]
  2. Changed2 schema fields changed
    • changedInput schema / properties / country / enum
      Previous value: -[
      -  "AT",
      -  "BD",
      -  "CA",
      -  "CH",
      -  "CN",
      -  "CZ",
      -  "DE",
      -  "ES",
      -  "FR",
      -  "GB",
      -  "HU",
      -  "IN",
      -  "IT",
      -  "JP",
      -  "NL",
      -  "PK",
      -  "PL",
      -  "RO",
      -  "TR",
      -  "UA",
      -  "US"
      -]New value: +[
      +  "AT",
      +  "BD",
      +  "CA",
      +  "CH",
      +  "CN",
      +  "CZ",
      +  "DE",
      +  "ES",
      +  "FR",
      +  "GB",
      +  "HU",
      +  "IN",
      +  "IT",
      +  "JP",
      +  "NL",
      +  "PK",
      +  "PL",
      +  "PT",
      +  "RO",
      +  "TR",
      +  "UA",
      +  "US"
      +]
    • changedInput schema / properties / version / enum
      Previous value: -[
      -  "uk",
      -  "en",
      -  "pl",
      -  "cs",
      -  "ro",
      -  "hu",
      -  "tr",
      -  "zh",
      -  "in",
      -  "ja",
      -  "bn",
      -  "pk"
      -]New value: +[
      +  "uk",
      +  "en",
      +  "pl",
      +  "cs",
      +  "ro",
      +  "hu",
      +  "tr",
      +  "zh",
      +  "in",
      +  "ja",
      +  "bn",
      +  "pk",
      +  "de",
      +  "at",
      +  "fr",
      +  "es",
      +  "pt",
      +  "it"
      +]
  3. Changed1 schema field changed
    • addedInput schema / properties / move
      Added value: +{
      +  "additionalProperties": false,
      +  "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.",
      +  "properties": {
      +    "date": {
      +      "description": "Date of the move, YYYY-MM-DD.",
      +      "type": "string"
      +    },
      +    "kind": {
      +      "enum": [
      +        "depart",
      +        "arrive"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "date"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.1/5.0
Behavior5/5

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

Annotations only declare it as a safe, idempotent read; the description goes far beyond them by disclosing the two return states ("needs_answer" with question id/text/options, "done" with conclusion, reliability %, treaty tie-breaker, exit tax, legal basis, disclaimer, and a permalink). It also warns that texts come back in the language of the version, which is a real behavioural trait an agent must anticipate.

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

Conciseness4/5

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

The interactive protocol is front-loaded in the first sentence, and the long enumeration of "done" outputs follows it logically. The output list is dense and comma-heavy, but since no output schema exists each item carries information the agent could not otherwise get. Only light trimming would be possible without losing content.

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

Completeness5/5

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

This is a complex tool — seven parameters, nested objects, enums, and a multi-turn answer loop — with no output schema, so the description carries the full burden on returns, and it does: it enumerates the result contents, the failure state, and the language behaviour. An agent has everything needed to drive the loop to completion and interpret the final payload.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter including nested income fields and answers is already documented in the schema. The description only gestures at the parameters indirectly ("with 'move'", "all answers collected so far") and adds no formatting or validation detail beyond what the schema supplies. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource — determines a person's tax residence between the version's home state and another country — with the key qualifier that it works step by step. An agent can tell what it produces. It does not, however, contrast itself with near-neighbours such as explain_residency or exit_tax_check, so differentiation rests on inference.

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

Usage Guidelines4/5

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

Gives clear operational guidance for the multi-turn protocol: if answers are incomplete it returns status "needs_answer" plus the next question, the agent should ask the user, then call again with all answers collected so far. That is exactly the context needed to use it correctly. It stops short of stating when to prefer a sibling tool instead.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources