# ImmigrationDB (remote · immigrationdb.com)

Read-only migration data: cities, visa routes, entry rules, costs, safety, climate, with sources.

- Trust score: 68/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- remote · `immigrationdb.com`: 68/100 (this document), [markdown](https://verifymcp.io/servers/streltcoff-immigrationdb/immigrationdb.md), [page](https://verifymcp.io/servers/streltcoff-immigrationdb/immigrationdb)

## Channel facts

- Endpoint: `https://immigrationdb.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.3.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Endpoint Security**: 80/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 41/100
  - 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 15375 tokens (~7/item across 2015 items; 15 tools + 2000 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the ImmigrationDB MCP server?

ImmigrationDB is a hosted endpoint at https://immigrationdb.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http streltcoff-immigrationdb 'https://immigrationdb.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "streltcoff-immigrationdb": {
      "url": "https://immigrationdb.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "streltcoff-immigrationdb": {
      "type": "http",
      "url": "https://immigrationdb.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.streltcoff-immigrationdb]
url = "https://immigrationdb.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "streltcoff-immigrationdb": {
      "type": "remote",
      "url": "https://immigrationdb.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add streltcoff-immigrationdb --url 'https://immigrationdb.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  streltcoff-immigrationdb:
    url: "https://immigrationdb.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "streltcoff-immigrationdb": {
      "Transport": "http",
      "Url": "https://immigrationdb.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add streltcoff-immigrationdb -t streamable-http -u 'https://immigrationdb.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "streltcoff-immigrationdb": {
      "type": "http",
      "url": "https://immigrationdb.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-18 (score 68, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-17 (score 67, 0)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-16 (score 67, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-15 (score 66, 0)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-14 (score 66, +1)

- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-13 (score 65, 0)

- [functional improvement] Stability: unverified → 0.03
- [functional] This server's schema is too large to store in full, so we cannot compare its tools day to day

### 2026-10-12 (score 65)

First indexed and scored.

## MCP tools (15)

The latest capture was truncated, so this tool list may be partial.

### `search_destinations` (~86 tokens)

Search destinations

Arguments: query (required), limit, cursor. Search admitted ImmigrationDB country and city identities with bounded cursor pagination. Example: {"query":"Berlin, Germany","limit":5} Boundary: Returns ranked public identities; it does not guess a missing country or expose data-only records.

Input parameters:

- `cursor` (string)
- `limit` (integer)
- `query` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `get_city` (~135 tokens)

Get city

Arguments: country (required), slug (required). Get one admitted city with canonical URL, claim-level facts and source metadata. Required arguments are exactly `country` (ISO 3166-1 alpha-2) and `slug` (the canonical city slug, e.g. "berlin" — not the display name). Example: {"country":"de","slug":"berlin"} Boundary: Returns the backwards-compatible full city record by default; use get_city_fact for one metric.

Input parameters:

- `country` (string, required)
- `detail` (string)
- `metric_ids` (array)
- `slug` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `get_country` (~88 tokens)

Get country

Arguments: cc (required). Get one admitted country page record and official visa-route handoffs. It takes exactly one argument: `cc`, the ISO 3166-1 alpha-2 country code (e.g. "de") — not `country`. Example: {"cc":"de"} Boundary: Only public country records and their published handoffs are returned.

Input parameters:

- `cc` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `search_visa_routes` (~99 tokens)

Search visa routes

Arguments: destination (required), purpose, limit, cursor. Search admitted destination visa and residence routes without inventing missing eligibility data. Example: {"destination":"de","purpose":"work","limit":20} Boundary: Returns sourced route families; it is reference information, not legal advice or an eligibility decision.

Input parameters:

- `cursor` (string)
- `destination` (string, required)
- `limit` (integer)
- `purpose` (string)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `get_legal_route` (~80 tokens)

Get legal route

Arguments: destination (required), route_id (required). Get one admitted legal-route record with its official source. Example: {"destination":"de","route_id":"highly-skilled"} Boundary: Missing or incomplete route fields remain explicit; the response does not infer a legal outcome.

Input parameters:

- `destination` (string, required)
- `route_id` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `search_entry_rules` (~104 tokens)

Search entry rules

Arguments: passport, destination, purpose, limit, cursor. Search passport entry rules from the admitted snapshot; unknown and unavailable decisions remain explicit. Example: {"passport":"lv","destination":"us","limit":20} Boundary: Only accepted public entry answers are returned; verify the responsible authority before travel.

Input parameters:

- `cursor` (string)
- `destination` (string)
- `limit` (integer)
- `passport` (string)
- `purpose` (string)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `get_entry_rule` (~72 tokens)

Get entry rule

Arguments: passport (required), destination. Get one passport entry rule using the canonical legal/entry URI identity. Example: {"passport":"lv","destination":"us"} Boundary: A missing answer is returned explicitly and is never replaced with an assumption.

Input parameters:

- `destination` (string)
- `passport` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `list_reports` (~78 tokens)

List reports

Arguments: category, limit, cursor. List public ImmigrationDB reports by optional category with bounded cursor pagination. Example: {"category":"Population","limit":20} Boundary: Lists published reports only; report rows retain their own source and method metadata.

Input parameters:

- `category` (string)
- `cursor` (string)
- `limit` (integer)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `get_report` (~73 tokens)

Get report

Arguments: report_id (required). Get one public report envelope with canonical and machine-resource URLs. Example: {"report_id":"warmest-published-cities-across-current-coverage"} Boundary: The report response is bounded by the published report contract and does not expose review-only rows.

Input parameters:

- `report_id` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `resolve_city` (~85 tokens)

Resolve city

Arguments: query (required), limit. Resolve a natural-language city query to bounded ranked public candidates without silently selecting an ambiguous country. Example: {"query":"Berlin, Germany","limit":5} Boundary: A bare or ambiguous city name returns candidates and ambiguity; it must not auto-select a non-exact country.

Input parameters:

- `limit` (integer)
- `query` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `get_city_fact` (~143 tokens)

Get city fact

Arguments: country (required), slug (required), metric_id (required). Return exactly one public city fact with value, unit, geographic grain, dates, source and snapshot provenance. Required arguments are exactly `country` (ISO 3166-1 alpha-2), `slug` (canonical city slug, not the display name) and `metric_id`. Example: {"country":"de","slug":"berlin","metric_id":"population_total"} Boundary: Returns not_available or ambiguous_metric_version instead of guessing across units, periods, definitions or geographic grains.

Input parameters:

- `country` (string, required)
- `metric_id` (string, required)
- `slug` (string, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `list_metrics` (~125 tokens)

List metrics

Arguments: country, block, query, comparison_eligible, limit, cursor. List reviewed metric definitions and observed public snapshot coverage with bounded filters and pagination. Example: {"query":"population","country":"de","limit":20} Boundary: Descriptions and units come from the reviewed registry; missing ontology is reported as a contract gap, not generated from a label.

Input parameters:

- `block` (string)
- `comparison_eligible` (boolean)
- `country` (string)
- `cursor` (string)
- `limit` (integer)
- `query` (string)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `list_blocks` (~74 tokens)

List blocks

Arguments: limit, cursor. List stable reviewed metric blocks with observed metric, fact and country coverage. Example: {"limit":20} Boundary: Block order and IDs are deterministic; coverage counts describe the current public snapshot only.

Input parameters:

- `country` (string)
- `cursor` (string)
- `limit` (integer)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `compare_cities` (~107 tokens)

Compare cities

Arguments: cities (required), metric_ids (required). Compare canonical public cities on compatible metric definitions with provenance for every cell. Example: {"cities":[{"country":"de","slug":"berlin"},{"country":"de","slug":"munich"}],"metric_ids":["population_total"]} Boundary: Incompatible units, periods, definitions or grains are omitted with reasons; no implicit currency, period or geography conversion occurs.

Input parameters:

- `cities` (array, required)
- `metric_ids` (array, required)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

### `search_facts` (~216 tokens)

Search facts

Arguments: countries, filters, sort_metric, sort_order, limit, cursor, diagnostic. Run bounded deterministic numeric filters over eligible public city facts with explicit counts and provenance. Example: {"countries":["de"],"filters":[{"metric_id":"population_total","op":">","value":100000}],"sort_metric":"population_total","sort_order":"desc","limit":20} Boundary: Filters are ANDed, results are capped and tie-broken by canonical entity ID; wrong-grain or non-comparable facts are excluded unless diagnostic mode is explicit.

Input parameters:

- `countries` (array)
- `country` (string)
- `cursor` (string)
- `diagnostic` (boolean)
- `diagnostic_view` (boolean)
- `direction` (string)
- `filters` (array)
- `limit` (integer)
- `metric_filters` (array)
- `sort` (object)
- `sort_direction` (string)
- `sort_metric` (string)
- `sort_order` (string)

Output parameters:

- `canonical_origin` (string)
- `citations` (object)
- `generated_at` (string)
- `resource_links` (array)
- `schema_version` (string)
- `snapshot_id` (string)
- `status` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/streltcoff-immigrationdb/immigrationdb#diagnostics

## Score history

- 2026-10-18: 68
- 2026-10-17: 67
- 2026-10-16: 67
- 2026-10-15: 66
- 2026-10-14: 66
- 2026-10-13: 65
- 2026-10-12: 65

## Common questions

### What is the ImmigrationDB MCP server?

ImmigrationDB is an MCP server listed in the public MCP registry as io.github.streltcoff/immigrationdb. Read-only migration data: cities, visa routes, entry rules, costs, safety, climate, with sources. This page covers its hosted endpoint (https://immigrationdb.com/mcp).

### Is the ImmigrationDB MCP server safe to use?

ImmigrationDB scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### Does the ImmigrationDB MCP server require authentication?

No. We connected to ImmigrationDB without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the ImmigrationDB MCP server still maintained?

ImmigrationDB is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://immigrationdb.com/mcp
- Repository: https://github.com/streltcoff/immigrationdb-mcp
- Website: https://immigrationdb.com/
- Changelog RSS feed: https://verifymcp.io/servers/streltcoff-immigrationdb/immigrationdb.xml
- Changelog JSON feed: https://verifymcp.io/servers/streltcoff-immigrationdb/immigrationdb.json
- HTML version of this page: https://verifymcp.io/servers/streltcoff-immigrationdb/immigrationdb
