@transita/mcp-server
You can use this server to query Transita’s visa and immigration data for profile matching, visa details and comparisons, country overviews, and nationality-based destination search.
Score a profile against all supported visas with required citizenship plus optional age, education, work experience, income, goal, timeline, work field, current country, and target countries.
Fetch full details for one visa, including eligibility, processing time, fees, validity, PR timeline, and a document-checklist preview.
Compare 2–3 visas side by side for processing time, cost, validity, PR pathway, and fastest/cheapest/most permanent options.
Get a country overview with visa counts, EU status, score dimensions, drawbacks, cities and rent ranges, and PR/citizenship timelines.
Search destinations and recommended visas by nationality.
Use read-only MCP resources for visas, countries, and nationality guides, plus prompts for finding and comparing visa options.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@transita/mcp-serverI'm an Indian software engineer, where should I move?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@transita/mcp-server
Visa eligibility and immigration data from Transita for Claude, ChatGPT, Cursor, Cline, Zed and any other MCP client.
Ask your assistant "where should I move?" and it can check your profile against 100+ visas in 16 countries, compare pathways, and tell you whether a programme is open right now. Every answer links to the official government source.
The package holds no data. It calls the public Transita API, so it picks up visa changes as soon as transita.app redeploys. No API key, no account.
There are two ways to connect:
Hosted:
https://transita.app/api/mcp(Streamable HTTP, no auth). Nothing to install.Local:
npx -y @transita/mcp-server(stdio). Needs Node 20 or newer.
Install
Claude Code
Hosted:
claude mcp add --transport http transita https://transita.app/api/mcpLocal:
claude mcp add transita -- npx -y @transita/mcp-serverAdd --scope user to make it available in every project. Run /mcp to check it connected.
Claude Desktop and claude.ai
Hosted: add a custom connector at claude.ai/customize/connectors with the URL https://transita.app/api/mcp. It shows up in Claude Desktop too.
Local: edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows, then restart Claude Desktop.
{
"mcpServers": {
"transita": {
"command": "npx",
"args": ["-y", "@transita/mcp-server"]
}
}
}ChatGPT
ChatGPT only talks to remote servers, so use the hosted endpoint. Turn on developer mode in ChatGPT's settings, create a new connector, paste https://transita.app/api/mcp as the server URL and pick "No authentication". Developer mode is limited to some paid plans and OpenAI moves the menu around, so check their help pages if you can't find it.
Cursor
Add this to ~/.cursor/mcp.json for all projects, or .cursor/mcp.json for one:
{
"mcpServers": {
"transita": {
"url": "https://transita.app/api/mcp"
}
}
}For the local version, replace the url line with "command": "npx", "args": ["-y", "@transita/mcp-server"].
Cline, Continue, Zed and others
Any client that takes a stdio command works with command: npx and args: ["-y", "@transita/mcp-server"]. Clients that support Streamable HTTP can use https://transita.app/api/mcp instead.
Related MCP server: anzsco-mcp
Tools
Tool | What it does |
| Scores a profile (citizenship, education, years of work, income, goal, timeline) against every visa and returns the closest matches, with scores that are estimates. |
| One visa in full: eligibility, processing time, fees, validity, route to permanent residency, and a preview of the document checklist. |
| Puts 2 or 3 visas side by side and points out which is fastest, cheapest, valid longest, and which leads to permanent residency. |
| A destination at a glance: number of visas, EU membership, scores, drawbacks, main cities with rent ranges, PR and citizenship timelines. |
| Destinations and a suggested visa for citizens of one country. Useful when someone asks "where could I move?" and only knows their citizenship. |
| Whether a visa is taking applications now. For round-based programmes like Express Entry it also gives the last round's date and cutoff score. |
All tools are read-only: they declare readOnlyHint: true, destructiveHint: false, idempotentHint: true and openWorldHint: false. Nothing is stored or sent on your behalf, and no account or API key is needed.
Resources
transita://visas: every active visatransita://countries: destination countries with visa countstransita://nationalities: the nationality guidestransita://nationality/<slug>: one nationality guide, e.g.transita://nationality/indian
Prompts
find-my-visa: asks a few eligibility questions, then callstransita_match_visascompare-options: runstransita_compare_visason the visas you pickwhere-should-i-move: starts from your nationality and explores from there
Example questions
"I'm an Indian software engineer with a master's and 5 years of experience. Where should I move?"
"Compare the US O-1A, Germany's EU Blue Card and Portugal's D8. Which one gets me permanent residency soonest?"
"Is Canada's Express Entry open right now, and what was the last cutoff?"
"What does Portugal's D8 digital nomad visa require?"
Configuration
Only relevant for the local package.
Env var | Default | Purpose |
|
| API base URL. Point it at |
|
| User-Agent sent with each API request. |
Free and paid
Everything the server returns is free. The full document checklist and 30-day action plan are part of Transita's paid plan at https://transita.app/path/<id>. Tool results include a checklist preview and a link to the full plan.
Development
git clone https://github.com/snenenenenenene/transita-mcp-server.git
cd transita-mcp-server
bun install
bun run buildRun it against a local Transita dev server:
TRANSITA_API_URL=http://localhost:3000 node dist/cli.jsSmoke test from the command line:
{
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"smoke","version":"0.0"}}}'
echo '{"jsonrpc":"2.0","method":"notifications/initialized"}'
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
} | node dist/cli.jsPublishing
npm hosts the package and the MCP Registry holds the metadata in server.json. Bump the version in package.json, both version fields of server.json, src/server.ts and src/api.ts first.
Build and publish to npm:
bun run build
npm publish --access publicPush the source to the public mirror:
./sync-mirror.shPublish the metadata. Install the publisher once with Homebrew first.
mcp-publisher login github
mcp-publisher publishLicense
MIT, see LICENSE.
Links
Website: https://transita.app
MCP page: https://transita.app/mcp
Source (public mirror): https://github.com/snenenenenenene/transita-mcp-server
MCP Registry name:
io.github.snenenenenenene/transita-mcp-serverModel Context Protocol: https://modelcontextprotocol.io
Available Tools
5 toolstransita_compare_visasCompare visasAInspect
Compare 2-3 visa pathways side-by-side. Returns processing time, cost, validity, PR-pathway, and a delta summary highlighting the fastest, cheapest, and most permanent option.
| Name | Required | Description | Default |
|---|---|---|---|
| visa_ids | Yes | 2-3 Transita visa ids. Discover ids via transita_match_visas or the transita://visas resource. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the return values comprehensively (processing time, cost, validity, PR-pathway, delta summary). With no annotations provided, the description fully covers behavioral expectations. It does not mention potential errors or data freshness, but for a comparison tool this is sufficient.
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 description consists of two short, front-loaded sentences. The first sentence states the core purpose, and the second lists the return fields. Every word contributes meaning without redundancy.
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 the tool's low complexity (1 parameter, no output schema), the description is adequately complete. It explains both the action and the expected result. It could optionally mention that it requires 2-3 items, but that is already enforced by the schema.
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% as the only parameter 'visa_ids' already has a clear description. The tool description does not add additional parameter semantics beyond what the schema provides, so baseline 3 is appropriate.
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 clearly states the verb 'Compare' and the resource 'visa pathways side-by-side'. It lists specific output fields (processing time, cost, validity, PR-pathway, delta summary), making the tool's purpose distinct from siblings which provide single visa details or matching.
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 description implies that the tool should be used when comparing 2-3 visa pathways and mentions how to obtain visa ids via transita_match_visas or the transita://visas resource. However, it does not explicitly state when not to use it or provide alternative tools for non-comparison scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transita_country_overviewCountry overviewAInspect
Get summary data for a destination country: number of visa pathways, EU member status, score dimensions, drawbacks, top cities with rent ranges, and PR/citizenship timelines.
| Name | Required | Description | Default |
|---|---|---|---|
| country_code | Yes | Lowercase country code, e.g. 'us', 'de', 'pt'. List available codes via the transita://countries resource. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully convey behavioral traits. It lists returned data but does not disclose whether the operation is read-only, any rate limits, authentication requirements, or side effects. This leaves the agent uncertain about safety and constraints.
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 description is a single, front-loaded sentence that efficiently communicates the tool's purpose and outputs. Every element earns its place with no redundant or vague wording.
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?
Despite lacking an output schema, the description lists the major return dimensions (visa pathways, EU status, score dimensions, drawbacks, cities with rents, PR/citizenship timelines). This provides sufficient context for an overview tool, though structural details (e.g., JSON format) are omitted.
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 single parameter (country_code) is well-documented in the schema, including a reference to the countries resource for available codes. The description adds no additional semantic value beyond what the schema provides, so baseline 3 is appropriate.
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 clearly states the tool's purpose: 'Get summary data for a destination country' and enumerates specific data points (visa pathways, EU status, score dimensions, drawbacks, top cities with rent ranges, PR/citizenship timelines). This distinguishes it from sibling tools that focus on visas, matching, or search.
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 description implies usage when a country overview is needed, but provides no explicit guidance on when to use this tool versus alternatives (e.g., transita_visa_details for specific visa info). No when-not-to-use or prerequisite context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transita_match_visasMatch visasAInspect
Score a user's profile against every visa pathway Transita supports. Returns the top matches ranked by eligibility, with timeline, cost, and links to official sources. EU citizens automatically surface freedom-of-movement options first.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | ||
| goal | No | ||
| timeline | No | ||
| education | No | ||
| income_usd | No | ||
| work_field | No | ||
| work_years | No | ||
| citizenship | Yes | ||
| current_country | No | ||
| target_countries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It clearly states output (matches, ranking, timeline, cost, links) and the EU citizen special handling, but does not describe whether the tool is read-only, has side effects, or requires authentication. For a matching tool, partial transparency.
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 concise sentences, front-loaded with the action ('Score a user's profile'). Every sentence adds value: first describes core function and output, second adds EU citizen detail. No wasted words.
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 the tool's complexity (10 params, no output schema, no annotations), the description covers the main purpose and output format. However, it could be more complete by explaining required parameters, error cases, or how optional params influence matching.
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 has 10 parameters with 0% description coverage. The description only generically mentions 'user's profile' without explaining how each parameter (e.g., goal, timeline, education) is used or what enum values mean. It fails to add meaning beyond property names.
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 clearly states the tool's purpose: scoring a user's profile against all visa pathways, returning top matches with ranking, timeline, cost, and links. This differentiates it from siblings like transita_visa_details (specific visa details) and transita_compare_visas (comparing specific visas).
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 description implies use for initial visa matching based on a user profile, and mentions EU citizen handling, but lacks explicit guidance on when to use vs alternatives (e.g., 'Use this for a broad match; use transita_visa_details for a specific visa'). No when-not-to-use or prerequisite info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transita_search_by_nationalitySearch visas by nationalityAInspect
Show top destinations and recommended visa pathways for citizens of a given country. Ideal first stop for the question 'Where should I move?'. Returns 4-6 destinations with the best-fit visa for each, key stats, and FAQ. Falls back gracefully if a slug isn't yet curated.
| Name | Required | Description | Default |
|---|---|---|---|
| nationality | Yes | Nationality adjective (e.g. 'Indian') or country (e.g. 'India'). Case-insensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes that it returns 4-6 destinations with best-fit visa, key stats, and FAQ, and falls back gracefully if a slug isn't curated. This provides useful behavioral context beyond the schema, especially since no annotations are provided.
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?
Description is three sentences, each adding value: purpose, ideal use case, and output specifics. No superfluous words, front-loaded with key 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 simple tool with one parameter and no output schema, the description covers the output format (4-6 destinations, best-fit visa, stats, FAQ) and error handling (graceful fallback). It could mention it is a read-only operation, but that is implied.
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 of the single parameter is 100%, so the description does not need to add much. The description does not provide additional meaning beyond the schema's explanation of 'nationality adjective or country, case-insensitive'. Baseline 3 is appropriate.
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?
Clearly states the tool shows top destinations and recommended visa pathways for a given nationality. Distinguishes itself from sibling tools like 'transita_compare_visas' and 'transita_visa_details' by being an ideal first stop for the question 'Where should I move?'.
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 says 'Ideal first stop for the question 'Where should I move?', which tells agents when to use it. Does not explicitly mention when not to use or name alternatives, but the use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transita_visa_detailsVisa detailsAInspect
Fetch full details for a single visa pathway: eligibility category, processing time, fees, validity, PR timeline, and a free preview of the document checklist (lead time, ancillary cost, first section). The full multi-section checklist is part of Transita's $9 paid action plan.
| Name | Required | Description | Default |
|---|---|---|---|
| visa_id | Yes | Transita visa id, e.g. 'us-o1a', 'es-digital-nomad'. Use transita_match_visas or the transita://visas resource to discover ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It details what the tool returns and mentions that the full checklist is part of a paid action plan, adding transparency. However, it omits potential side effects (likely none) or authentication needs.
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 description is two sentences, front-loaded with the main purpose, and each sentence adds essential information without redundancy.
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 the tool's complexity (single parameter, no output schema), the description fully explains what the tool returns, including limitations about the checklist. The presence of sibling tools provides sufficient context for selection.
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 input schema already describes the visa_id parameter with examples. The description reiterates its purpose and usage, adding value by showing how to obtain the id from related tools. Schema coverage is 100%, so the description complements it well.
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 uses a specific verb ('fetch full details') and clearly identifies the resource ('single visa pathway') and the specific data included (eligibility, processing time, fees, etc.). It distinguishes from siblings like transita_compare_visas by focusing on a single visa.
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 description implies when to use the tool (for detailed information on a single visa pathway) and provides guidance on obtaining the visa_id via transita_match_visas or a resource. It does not explicitly state when not to use it, but the context is clear.
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.
5 tool updates
v0.1.1- First observed
transita_compare_visas - First observed
transita_country_overview - First observed
transita_match_visas - First observed
transita_search_by_nationality - First observed
transita_visa_details
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: comparing visas, country overview, profile matching, nationality-based search, and visa details. No overlap or ambiguity.
All tools use the 'transita_' prefix, but internal naming mixes verb_noun (e.g., compare_visas, match_visas) and noun_noun (e.g., country_overview, visa_details). Mostly consistent with minor deviations.
Five tools is well-scoped for a visa information server, each earning its place without being too few or too many.
The tool set covers key user workflows: overview, search, comparison, details, and profile matching. No obvious gaps for its information-providing purpose.
Maintenance
Related MCP Connectors
Citizenship, residency & tax-residency data for 190+ countries, with origin-aware route planning
Travel-compliance intelligence and curated booking for digital nomads and long-stay travellers.
Your personal AI travel concierge — flights, hotels, 116M+ POIs, visas, weather & more
Plan trips and track visa days per traveller across 39,601 entry rules
Related MCP Servers
- AlicenseCqualityBmaintenanceProvides tools to fetch up-to-date visa and immigration information for various countries, helping users plan their international travel with accurate data.2ISC
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to search and explore Australian occupation codes (ANZSCO), visa pathways, state nominations, and SkillSelect invitation round data.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to access official European business data across 15 EU countries, including company lookups, VAT validation, sanctions screening, and KYB reports.8,431 npm1MIT

EasyOnward MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI assistants to check passport visa, entry, and transit requirements for a country pair using official government sources and a deep link to EasyOnward.268 npmMIT