SponsorFinder MCP Server
The SponsorFinder MCP server provides a read-only, authentication-free interface for AI assistants to check and search work-visa sponsorship licences in the UK and Netherlands using publicly available government registers.
Check a company's sponsorship licence (
check_sponsor_license): Look up whether a specific company holds a sponsorship licence by name (typo-tolerant). Returns a verdict (licensed,formerly_licensed,ambiguous, ornot_found), along with visa routes, ratings, locations, and register dates. Deliberately refuses to guess on weak or tied matches, returning candidate lists for disambiguation instead.Search the sponsor register (
search_sponsors): Explore the register with optional filters — city or visa route (UK), or sponsor type such as WORK, EXCHANGE, STUDY, or RESEARCH (Netherlands). Returns a compact list with a total count.Get full sponsor details (
get_sponsor_details): Retrieve a complete record for one organisation by ID, including routes, ratings, locations, and register dates (UK), or sponsor type and KvK number (Netherlands). Optionally includes register change history (additions, removals, reactivations).Get register information and terminology (
get_register_info): Retrieve register statistics, data freshness dates, and a glossary explaining terms like licence, route, rating, and sponsor type.
Reports usage events to Google Analytics 4 via the Measurement Protocol for server-side analytics.
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., "@SponsorFinder MCP ServerDoes Spotify have a UK sponsorship licence?"
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.
SponsorFinder MCP Server
An authless, read-only remote MCP server that lets AI assistants (Claude, ChatGPT, Cursor, …) check whether a company holds a UK or Netherlands work-visa sponsorship licence. It proxies the public SponsorFinder API, shaping responses into clean verdicts, and keeps the upstream API key server-side so clients connect with no credentials.
What it does
SponsorFinder tracks two official government registers of licensed work-visa sponsors:
UK — the Home Office register of licensed sponsors, rebuilt from the CSVs the Home Office publishes (checked daily). Carries routes (e.g. Skilled Worker), ratings (A/B) and locations.
Netherlands — the IND public register of recognised sponsors, checked daily. Lists recognised sponsors and their sponsor type (WORK / EXCHANGE / STUDY / RESEARCH); much thinner than the UK data — no routes, ratings, or locations.
This MCP server exposes that data as four tools. It is read-only and authless for clients: the upstream x-api-key is a server-side secret that MCP clients never see. There is no OAuth, no per-user state, and no write tools.
Related MCP server: hsm-mcp
Tools
Tool | Title | What it does | Key inputs |
| Check Sponsorship Licence | Primary tool. Resolves a company by name (typo-tolerant) and returns a verdict — |
|
| Search Sponsor Register | Exploratory list search with optional filters. Returns a compact list plus a total count. For one specific company, prefer |
|
| Get Sponsor Details | Full record for one organization by id: routes/ratings/locations/dates (UK) or sponsor type + KvK number (NL). Optionally includes register change history. |
|
| About the Sponsor Registers | Register statistics, data freshness, a terminology glossary, and the legal disclaimer. Use it to explain what a licence, route, rating, or sponsor type means. | none |
Every tool is annotated readOnlyHint: true and returns both a human-readable text block and structuredContent, each stamped with the data-freshness date and a source note.
Example prompts
Natural-language things you can ask an assistant once the server is connected:
"Does Google hold a UK sponsorship licence?"
"Is ASML a recognised sponsor in the Netherlands?"
"Search UK Skilled Worker sponsors in Manchester."
"List Dutch WORK-type sponsors matching 'shell'."
"What does a B rating mean?"
A note on name matching. The fuzzy match tolerates typos (e.g. googel uk), but it needs a reasonably complete name to resolve confidently — "Google UK" or "Google UK Limited" resolves cleanly, whereas a single bare word can match many companies. The server deliberately refuses to guess on weak or tied matches: instead of silently picking one, it returns an ambiguous verdict with the candidate list and asks you to disambiguate (or to call get_sponsor_details with the right id). Absence from a register is itself a meaningful answer: it means the company cannot currently sponsor that visa type.
Use it (hosted)
The server is hosted at:
https://mcp.sponsorfinder.io/mcpClaude Code
claude mcp add --transport http sponsorfinder https://mcp.sponsorfinder.io/mcpclaude.ai — Settings → Connectors → Add custom connector → paste the URL above. No authentication is required.
ChatGPT — Settings → Connectors (or a custom GPT's Actions) → Add a custom/remote MCP connector and paste the URL above.
Any MCP client that speaks Streamable HTTP can connect the same way — point it at https://mcp.sponsorfinder.io/mcp.
Run locally
Prerequisites: Node.js 24 and pnpm 11.
pnpm install
cp .env.example .env
# then edit .env and fill in:
# SPONSORFINDER_API_BASE e.g. https://api.sponsorfinder.io
# SPONSORFINDER_API_KEY your upstream x-api-key (server-side secret)Run one of the two transports in watch mode:
pnpm dev:stdio # stdio transport (Claude Desktop / Claude Code / MCP Inspector)
pnpm dev:http # Streamable HTTP on http://localhost:3001/mcpAdd the local stdio build to Claude Code:
pnpm build
claude mcp add sponsorfinder -- node dist/entry/stdio.jsInspect the tools interactively with the MCP Inspector against either transport:
npx @modelcontextprotocol/inspectorConfiguration
All configuration is via environment variables (see .env.example):
Name | Required | Default | Description |
| yes | — | Base URL of the upstream SponsorFinder API, no trailing slash (e.g. |
| yes | — | Upstream |
| no |
| HTTP port for the Node entry ( |
| no |
| Upstream request timeout in milliseconds (aborted via |
SPONSORFINDER_API_KEY is the one true secret. MCP clients connect authless; the key lives only on the server (a Docker env var or a Cloudflare Workers secret) and is never surfaced to clients.
Self-host / deploy
The Web-standard core runs on both Node and Cloudflare Workers; only the entry file differs.
Docker (primary) — image ghcr.io/alirezahamid/sponsor-finder-mcp, config in Dockerfile and docker-compose.yml:
docker compose up -dPut a reverse proxy (Caddy/nginx) in front of mcp.sponsorfinder.io and pass POST, GET and DELETE through to /mcp. Streamable HTTP needs response buffering off (proxy_buffering off; in nginx; Caddy's defaults are fine).
Cloudflare Workers — config in wrangler.jsonc:
wrangler secret put SPONSORFINDER_API_KEY
pnpm deploy:workerDevelopment
Script | What it does |
| Type-check with |
| Lint with ESLint. |
| Run unit tests (excludes smoke tests). |
| Integration smoke tests against the real staging API (needs secrets). |
| Bundle to |
|
|
Analytics (optional)
The server can report usage to Google Analytics 4 via the server-side Measurement Protocol. Because an MCP server has no browser, a GA/GTM JavaScript tag cannot run in it — the server sends events over HTTP instead. It works on both Node and Cloudflare Workers.
Analytics are off unless both GA_MEASUREMENT_ID and GA_API_SECRET are set.
Each tool call emits one mcp_tool_call event with categorical parameters —
tool, status, verdict, country, mcp_client, latency_bucket, error_kind.
By default no company names or free-text queries are sent to GA; the searched name
is only included (as the query param) if you opt in with CAPTURE_QUERY_NAMES — see below.
Setup:
Create a GA4 property (free) and a Web data stream.
In Admin → Data streams → your stream → Measurement Protocol API secrets, create a secret. Copy the stream's Measurement ID (
G-XXXXXXXXXX) and the secret value.Set
GA_MEASUREMENT_IDandGA_API_SECRET(env / Docker /wrangler secret).In GA4, register the event params above as custom dimensions (Admin → Custom definitions) so they appear in reports. Use
GA_DEBUG=trueto send to GA's validation endpoint while testing.
Unmet-demand analysis: setting CAPTURE_QUERY_NAMES=true records the searched company
name to the server's structured logs and sends it to GA4 as the query event param
(register a query custom dimension to see it). Off by default. Caveats: raw names are
high-cardinality in GA (bucketed as (other)) and person-named queries may count as PII
under GA's terms — a private log store is usually the better home for this, and you should
add a privacy-policy line before enabling it.
How it works
The server is a thin, stateless proxy with response shaping. An MCP client connects over stdio or stateless Streamable HTTP; a small Hono app (with @hono/mcp) constructs an MCP server per request, calls the SponsorFinder API with the server-side key, validates every response with zod (a contract-drift guard), and shapes it into a compact verdict. Register stats and filter values are cached in-process with a short TTL. Because the core uses only Web-standard APIs (fetch, URL), the same code runs on Node and Cloudflare Workers — only src/entry/* differs.
MCP client (Claude / ChatGPT / Cursor)
│ stdio or stateless Streamable HTTP
▼
SponsorFinder MCP server (Hono + @hono/mcp)
• 4 read-only tools, zod-validated
• x-api-key added server-side
• cached /status + /filters
│ HTTPS (x-api-key)
▼
SponsorFinder API → UK Home Office register + Dutch IND registerData & disclaimer
The data comes from the official UK gov.uk register of licensed sponsors and the Dutch IND public register of recognised sponsors, refreshed daily.
This tool is informational only and is not legal advice. Register data can lag official publications, and a licence does not guarantee a company will sponsor any given role. Always verify against the official sources before making decisions.
Contributing
Issues and pull requests are welcome at github.com/alirezahamid/sponsor-finder-mcp. Please run pnpm check before opening a PR.
Publishing note:
server.jsonis the manifest for the official MCP registry. Before runningmcp-publisher publish, confirm the exact$schemaURL against the current registry.modelcontextprotocol.io docs — the schema version pinned here may have moved on.
License
MIT © 2026 Alireza Hamid
Available Tools
4 toolscheck_sponsor_licenseCheck Sponsorship LicenceARead-onlyInspect
Check whether a company holds a UK or Netherlands work-visa sponsorship licence. Handles typos and partial names. Returns licence routes, ratings, locations and register dates. For exploring or filtering many companies, use search_sponsors instead.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Which register to check: uk, nl, or both | both |
| company_name | Yes | Company name, exact or approximate (typos OK) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, consistent with a read operation. Description adds that the tool handles typos and partial names, and returns specific data fields (routes, ratings, etc.). No contradictions, and it provides context beyond annotations.
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, front-loaded with the main purpose, then details about typo handling and return fields, and ends with a sibling alternative. Every sentence adds value with no 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?
Despite no output schema, the description clearly lists return fields (licence routes, ratings, locations, register dates). Parameter details are sufficient. Tool complexity is low, and the description fully covers what the agent needs to use it correctly.
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%, so schema already documents both parameters. Description redundantly repeats the 'typos OK' for company_name and explains country parameter briefly. Adds no new meaning beyond what the schema provides.
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 checks if a company holds a UK or Netherlands work-visa sponsorship licence, specifies handling typos/partial names, and lists return fields. Distinguishes itself from sibling 'search_sponsors' by contrasting use cases.
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 to use this for checking a single company and suggests 'search_sponsors' for exploring/filtering many companies. Lacks explicit when-not or exclusions, but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_register_infoAbout the Sponsor RegistersARead-onlyInspect
Register statistics, data freshness, and terminology for the UK and Netherlands sponsor registers. Use this to explain what a licence, route, rating, or sponsor type means.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation. The description adds value by specifying the scope (statistics, freshness, terminology) and the UK/Netherlands geographic focus. It does not introduce any behavioral contradictions or unexpected side effects.
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 sentences, with the core function front-loaded and a practical usage example. Every word earns its place, and there is no redundant repetition of the tool name or schema.
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, read-only informational tool, the description provides adequate context about what the tool returns and when to use it. While there is no output schema, the description names the key content areas, making the return structure predictable enough for an agent.
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 has 0 parameters, so parameter descriptions are unnecessary. The baseline of 4 applies because there is nothing to explain; the description's focus on content 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 provides register statistics, data freshness, and terminology for UK and Netherlands sponsor registers. It also gives a concrete use case ('explain what a licence, route, rating, or sponsor type means'), which distinguishes it from sibling tools focused on checking licenses or searching for sponsors.
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 includes a direct usage instruction ('Use this to explain...'), which gives a clear context for when to invoke this tool. While it does not explicitly mention alternatives or exclusions, the context is strong enough to guide selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sponsor_detailsGet Sponsor DetailsARead-onlyInspect
Full record for one organization by id: routes, ratings, locations and register dates (UK), or sponsor type and KvK number (NL). Optionally include register change history.
| Name | Required | Description | Default |
|---|---|---|---|
| org_id | Yes | Organization id (from a search or check result) | |
| country | No | Which register the id belongs to | uk |
| include_history | No | Also include register change history (ADDED / REMOVED / REACTIVATED events) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation. The description adds behavioral context by listing exactly what fields are returned and noting country-specific differences (UK vs NL) and the optional history flag. This goes beyond the annotation without contradicting it.
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, information-dense sentence with no filler. It front-loads the core purpose ('Full record for one organization by id') then appends specifics, making it easy to parse and remember.
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 read-only detail retrieval tool with 3 parameters and no output schema, the description covers the essential purpose, key data fields, and country-specific behavior. It does not discuss error handling or pagination, but these are not critical given the tool's simplicity and the readOnlyHint annotation.
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 has 100% description coverage for all three parameters. The description adds value by explicitly linking the country parameter to the different data returned (routes/ratings vs sponsor type/KvK) and reinforcing the include_history parameter's purpose. This enriches the parameter meanings beyond the schema.
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 starts with 'Full record for one organization by id', clearly specifying the resource (sponsor record) and the action (retrieve). It distinguishes itself from siblings like search_sponsors by emphasizing lookup by id and enumerating specific content (routes, ratings, locations, register dates, sponsor type, KvK number).
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 phrase 'by id' implies this is for retrieving details when an org_id is already known, and the country parameter clarifies which register to query. 'Optionally include register change history' gives a usage hint. However, it does not explicitly name alternatives or state when not to use this tool, leaving some inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sponsorsSearch Sponsor RegisterARead-onlyInspect
Exploratory list search of the sponsor register with optional filters (city/route for UK, sponsor type for NL). Returns a compact list with a total count. For checking one specific company, prefer check_sponsor_license.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Filter by city (UK only) | |
| limit | No | Max results (1–20) | |
| query | No | Substring to match in the company name | |
| route | No | Filter by visa route, e.g. "Skilled Worker" (UK only) | |
| country | No | Which register to search | uk |
| sponsor_type | No | Filter by sponsor type (NL only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations providing readOnlyHint=true, the description adds value by disclosing the output behavior: returns a 'compact list with a total count'. This goes beyond the annotation's safety info and gives the agent a clearer expectation of the tool's result shape, though it doesn't mention pagination or potential limitations.
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 exceptionally concise, with two sentences that front-load purpose, then mention output and an alternative. Every word adds value, with no repetition of schema or annotation details.
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 moderately complex parameter set (though all optional) and lack of output schema, the description covers essential aspects: purpose, return shape, and an alternative. It could mention pagination or the meaning of 'compact list', but overall it sufficiently contextualizes the tool for correct invocation.
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 schema already provides full descriptions for all six parameters (100% coverage), including country-specific filters. The description reinforces the filter groupings but doesn't add substantial meaning beyond the schema, so a baseline score of 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 performs an 'Exploratory list search of the sponsor register' with specific resources and optional filters. It also distinguishes from sibling tool check_sponsor_license by directing users to that tool for checking a specific company, making purpose and scope unambiguous.
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?
Explicit guidance is provided: use this for exploratory list searches, and specifically prefer check_sponsor_license for verifying a single company. The description also notes country-specific filters (UK vs NL), helping the agent choose when to use it with appropriate parameters.
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
check_sponsor_license - First observed
get_register_info - First observed
get_sponsor_details - First observed
search_sponsors
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: checking by name (check_sponsor_license), searching with filters (search_sponsors), getting full details by ID (get_sponsor_details), and retrieving register metadata (get_register_info). The descriptions explicitly differentiate them.
All tool names follow a consistent verb_noun pattern (check_, get_, search_) using snake_case. The verbs and objects are semantically appropriate and uniform.
Four tools cover the core functionalities for a sponsor license lookup server without being excessive or insufficient. The scope is well-defined.
The tool set provides complete coverage for a read-only sponsor information service: name-based lookup, ID-based details, filtered search, and register metadata. No obvious gaps are present.
Maintenance
Related MCP Connectors
UK company register lookups plus US, EU and UN sanctions screening. Every answer cites source.
Checks whether a name is on the UK's financial sanctions list (HM Treasury), for compliance and AML
Checks whether a name is on the European Union's financial sanctions list, for compliance and AML du
Verify a company on GLEIF LEI and SEC EDGAR, screen sanctions. No key; quota-free data.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI assistants to search and retrieve UK Companies House data including company profiles, officers, and filing history via the official API.470 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying the Dutch IND public register of recognised sponsors for work/residence permits. Offers tools to search sponsors by name or KvK number and check register status.MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that lets AI assistants search the UK Register of Licensed Visa Sponsors (125,000+ companies), enabling queries about company sponsorship, location, visa routes, and ratings.1MIT
- AlicenseNot gradedqualityBmaintenanceProvides US H-1B visa sponsorship, LCA wages, and top sponsors by role for recruiting and talent data.2 npmMIT