SudnoKontrol MCP
The server provides read-only, API-key-free access to Ukraine's national vessel registries (Державний судновий реєстр України and Суднова книга України).
search_vessel_registries: Free-text and structured search across both registries by registration number, vessel name, owner, home port, vessel type, and build year range; deterministic ordering puts exact registration-number matches first; supports Cyrillic/Latin and separator-insensitive numbers.
lookup_vessel: Exact vessel lookup by normalized registration number, returning the full registry record plus a web_url to the public vessel information page.
get_registry_stats: Answer aggregate "how many vessels" questions with public vessel counts.
get_dataset_metadata: Get dataset context — sources, import dates, record counts, and available fields.
Every search/lookup result includes a web_url to the public site for viewing the vessel or ordering an official registry excerpt.
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., "@SudnoKontrol MCPLook up vessel УПС-4249 in the Ukrainian registry"
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.
SudnoKontrol MCP
Model Context Protocol server for the Ukrainian national vessel registry — search vessels by registration number, name or owner, look up full registry records, and query aggregate statistics. Exposes the public data of the Державний судновий реєстр України (State Ship Registry) and the Суднова книга України (Ship Book).
Data is read-only and public — no API key required.
Hosted endpoint (recommended):
https://api.sk.ukrfish.org/mcp(Streamable HTTP)Project docs:
https://sk.ukrfish.org/api-docsandhttps://sk.ukrfish.org/info/ai-agentsDiscovery:
https://sk.ukrfish.org/llms.txt
Tools
Tool | Description |
| Free-text + structured search across both national registries. Deterministic ordering: exact registration-number matches first. Supports Cyrillic/Latin and separator-insensitive numbers ( |
| Exact vessel lookup by normalized registration number. Returns full registry record. |
| Aggregate public vessel counts ("how many vessels..."). |
| Dataset context: sources, import dates, record counts, fields. |
Every search/lookup result includes a web_url → https://sk.ukrfish.org/registry?vessel=<reg> pointing to the public vessel information page.
Related MCP server: Ukrainian Statistics MCP Server
Quick start — hosted server
Claude Code / Claude Desktop
claude mcp add --transport http sudnokontrol https://api.sk.ukrfish.org/mcpCursor
Settings → MCP → Add new MCP server → Name sudnokontrol, Type HTTP, URL https://api.sk.ukrfish.org/mcp.
Windsurf
Windsurf → MCP → Add server → https://api.sk.ukrfish.org/mcp.
Any MCP client (streamable HTTP)
URL: https://api.sk.ukrfish.org/mcp
Auth: none (public, IP rate-limited)Run it yourself
The server proxies the public API and needs no credentials.
# stdio (for Claude Desktop "command" servers)
npx sudnokontrol-mcp
# HTTP (streamable)
npx sudnokontrol-mcp http
# or: PORT=9000 HOST=127.0.0.1 npx sudnokontrol-mcp httpInstall from this repo directly:
npm install -g github:ailubes/sudnokontrol-mcpTo point at a different base (e.g. your own deployment):
SUDNOKONTROL_API=https://api.sk.ukrfish.org/api/ai npx sudnokontrol-mcpFrom source:
npm install
npm run build
node dist/index.js # stdio
node dist/index.js http # HTTP on :8958/mcpConnect to your local instance
claude mcp add --transport http local-sudnokontrol http://127.0.0.1:8958/mcpAPI (underlying REST, no MCP needed)
Endpoint | Purpose |
| OpenAPI 3.1 spec |
| Function-calling tool definitions (JSON Schema) |
| Dataset context |
| Search |
| Lookup |
| Aggregates |
Rate limit: 300 requests / 15 min / IP on /api/ai/*. Search/meta/stats responses cached 60s.
Example
User: Is the vessel УПС-4249 registered?
Agent calls: lookup_vessel {"registration_number": "УПС-4249"}
Response: { registration_number: "УПС-4249", name: "ua 5614 KV", owner_name: "ТОВ Соціальні ініціативи Запоріжжя", source: "registry", web_url: "https://sk.ukrfish.org/registry?vessel=УПС-4249", ... }License
MIT
Disclaimer
This is an open-source MCP adapter for the public data of the Ukrainian vessel registries operated by SudnoKontrol. It is not an official government service.
Available Tools
4 toolsget_dataset_metadataDescribe available vessel-registry datasetsAInspect
Describes available data sources (Державний судновий реєстр / Суднова книга), freshness (import dates), record counts, and available fields.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does disclose what information the tool provides (data source names, freshness, record counts, available fields), which gives the agent a clear sense of the output content. However, it does not explicitly state that the operation is read-only, nor does it mention any side effects or error conditions. For a metadata tool with no parameters, this is reasonably transparent but not exhaustive.
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, concise sentence that front-loads the core purpose and enumerates the key metadata elements. It contains no filler or redundancy, making it highly efficient for an agent to parse.
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 zero-parameter tool with no output schema and no annotations, the description is fairly complete. It tells the agent exactly what kind of information is returned (data source names, freshness, record counts, fields). One could argue it could also mention the structure or how to interpret the output, but given the simplicity of the tool, the description provides sufficient context for an agent to make an informed call.
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 tool accepts zero parameters, and the schema reflects that with 100% coverage (an empty schema). Since there are no parameters to document, the baseline of 4 applies. The description adds no parameter-related semantics because none are needed.
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 action ('Describes') and its resource ('available data sources'), and enumerates the specific kinds of metadata it returns (freshness, record counts, available fields). This is more specific than a generic statement, though it does not explicitly differentiate itself from the sibling tools (e.g., search_vessel_registries). However, the purpose is distinct enough that an agent can infer it is for obtaining dataset metadata rather than querying records.
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 provides no guidance on when to use this tool versus the siblings (search_vessel_registries, lookup_vessel, get_registry_stats) or when not to use it. There is no mention of prerequisites, context, or alternatives, so an agent must infer the appropriate use case from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_registry_statsGet aggregate vessel countsAInspect
Aggregate public vessel counts for answering "how many vessels" questions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It indicates the tool is read-only (aggregate counts) and public (no auth scaffold), but it does not disclose the output format or any limitations. The plural 'counts' hints at a structured return, yet the exact shape is absent.
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?
A single, front-loaded sentence that clearly states the tool's purpose and intended use. No superfluous information; every word earns its place.
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 zero-parameter tool without an output schema, the description should specify what the return value looks like. It says 'aggregate public vessel counts' but does not detail whether it returns a single number, a breakdown by category, or a summary object. This gap could lead an agent to misinterpret the response.
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?
There are zero parameters, so the schema is trivially 100% covered. The description adds no parameter-specific meaning, but none is needed. The baseline for zero-parameter tools is 4, and this description stays within that.
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 a specific action ('Aggregate public vessel counts') and its intended query type ('how many vessels' questions). The title reinforces the purpose. While it does not explicitly name sibling tools, the aggregate-count nature distinguishes it from lookup_vessel (single record), search_vessel_registries (general search), and get_dataset_metadata (metadata retrieval).
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 provides clear context for when to use the tool: when the user asks about aggregate vessel counts or quantity questions. However, it gives no explicit guidance on when not to use it or alternatives to consider, leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_vesselLook up a vessel by registration numberAInspect
Exact vessel lookup by normalized registration number (handles -, ., and space variance, and Latin/Cyrillic forms). Returns full registry data plus a web_url to the public site for ordering an official excerpt.
| Name | Required | Description | Default |
|---|---|---|---|
| registration_number | Yes | Registration number (e.g. УПС-0129). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: normalization of registration numbers and that the response includes a web_url. It does not cover error cases or authentication requirements, which would enrich transparency, but the provided information is useful and non-obvious.
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 compact and well-structured, with the primary purpose stated up front followed by normalization details and return value. Two sentences deliver all necessary 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?
For a simple single-parameter lookup tool, the description covers normalization and return contents. It does not explicitly address not-found behavior or response format beyond mentioning web_url, but these are minor gaps given the tool's simplicity and lack of output 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 coverage is 100% (the parameter has a description and example), giving a baseline of 3. The description adds value beyond the schema by explaining normalization (e.g., handling dashes, spaces, Latin/Cyrillic forms), which informs the agent how to format or interpret the registration_number parameter.
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 states a specific verb ('lookup') and resource ('vessel') and clarifies the exact-match behavior with normalization. It distinguishes from siblings like search_vessel_registries by emphasizing 'exact' lookup, making the tool's role clear.
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 this tool (when you have an exact registration number, given normalization) but does not explicitly mention when not to use it or direct the agent to alternatives like search_vessel_registries for partial matches. The usage context is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vessel_registriesSearch Ukrainian national vessel registriesAInspect
Search Державний судновий реєстр України and Суднова книга України by free-text query and structured filters. Deterministic ordering with exact registration-number matches first. Each result includes a web_url linking to the public site for ordering an official registry excerpt.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Registration number, vessel name, or owner name. Accepts Latin or Cyrillic. | |
| limit | No | Page size. | |
| offset | No | Pagination offset. | |
| source | No | Dataset to search. | |
| home_port | No | Partial match on home port. | |
| vessel_type | No | Partial match on vessel type (e.g. земснаряд). | |
| build_year_max | No | Inclusive maximum build year. | |
| build_year_min | No | Inclusive minimum build year. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does disclose two meaningful behaviors: deterministic ordering with exact registration-number matches first, and that each result includes a web_url for ordering an official excerpt. However, it does not mention pagination behavior, rate limits, or whether the operation is strictly read-only, which could be relevant. The disclosed behaviors are useful but not comprehensive, justifying a 3.
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 with zero filler. It front-loads the core purpose, then adds the ordering behavior and result link. Every sentence contributes essential information, making it an exemplary model of conciseness.
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?
The tool has 8 parameters (0 required), no output schema, and no annotations, making the description the primary source of context. It covers the basic purpose, ordering logic, and the web_url presence, but it does not explain how filters combine (e.g., AND semantics), the effect of the source parameter, or what other fields appear in results. Given the tool's complexity, the description is adequate but leaves room for interpretation, so a 3 is appropriate.
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%, so the baseline is 3. The description adds nothing beyond the schema's parameter documentation; it only refers generally to 'free-text query and structured filters.' It does not provide additional context on parameter interaction or format beyond what the schema already states. Therefore, the description meets the baseline but does not elevate it.
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 action (search) and the exact resources (Державний судновий реєстр України and Суднова книга України), along with the search method (free-text and structured filters). It also notes the deterministic ordering and the presence of a web_url in results, making the tool's function unambiguous. However, it does not explicitly contrast with sibling tools like lookup_vessel or get_registry_stats, so it falls just short of a perfect score.
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 implicitly conveys when to use the tool (when searching by free-text or structured filters across these registries), but it does not provide explicit guidance on when not to use it or mention alternatives. For instance, it does not say that lookup_vessel should be used for exact vessel lookups. The usage context is clear but lacks explicit exclusions or comparisons, so it earns a 3.
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.
4 tool updates
v1.0.0- First observed
get_dataset_metadata - First observed
get_registry_stats - First observed
lookup_vessel - First observed
search_vessel_registries
TDQS
Scored across 4 tools
Each tool has a distinct purpose: dataset metadata, free-text search, exact registration-number lookup, and aggregate statistics. No overlaps in function; even search and lookup are clearly separated by exact vs. fuzzy matching.
All tool names follow the same verb_noun snake_case convention: get_dataset_metadata, search_vessel_registries, lookup_vessel, get_registry_stats. Consistent and predictable.
4 tools is well-scoped for a read-only registry API. Each tool covers a necessary operation without redundancy or bloat.
The surface fully covers the domain's read-side: metadata discovery, flexible search, exact lookup, and statistics. No essential operations are missing for the stated purpose.
Maintenance
Related MCP Connectors
Vessel tracking for 750,000+ ships, with ownership, inspections, port records, routes, and more.
Public Data Ukraine Mcp connects AI agents to real public APIs via MCP. Tools include
Official public & government APIs, dozens of countries: registers, statistics, open data. Keyless.
Global customs trade data and company registry. Search shipments, and look up legal entities.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides access to Maersk vessel information including IMO numbers, vessel schedules, shipment deadlines, and port call data through Maersk's public APIs.1-
- AlicenseNot gradedqualityDmaintenanceProvides seamless access to official Ukrainian government statistics from the State Statistics Service via their SDMX API. It enables users to query bilingual datasets across domains like energy, demographics, and trade using flexible filtering and metadata exploration tools.9 npm50MIT
- FlicenseNot gradedqualityCmaintenanceEnables querying maritime vessel data via MCP tools and resources, including vessel search, port proximity, and vessel details lookups.-
- AlicenseNot gradedqualityBmaintenanceProvides real-time, machine-readable ship and port conditions for major US container gateways using AIS data, allowing AI agents to query vessel status, berthing events, and gateway conditions without API keys or signup.Apache 2.0