Skip to main content
Glama
alirezahamid

SponsorFinder MCP Server

by alirezahamid

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.

License: MIT Node >=24 Built with MCP

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_sponsor_license

Check Sponsorship Licence

Primary tool. Resolves a company by name (typo-tolerant) and returns a verdict — licensed, formerly_licensed, ambiguous, or not_found — with routes, ratings, locations and register dates. Refuses to guess on weak matches.

company_name (2–100 chars, typos OK), country (uk | nl | both, default both)

search_sponsors

Search Sponsor Register

Exploratory list search with optional filters. Returns a compact list plus a total count. For one specific company, prefer check_sponsor_license.

query?, country (uk | nl, default uk), city? (UK), route? (UK), sponsor_type? (NL: WORK | EXCHANGE | STUDY | RESEARCH), limit (1–20, default 10)

get_sponsor_details

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.

org_id (int), country (uk | nl, default uk), include_history (bool, default false)

get_register_info

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/mcp

Claude Code

claude mcp add --transport http sponsorfinder https://mcp.sponsorfinder.io/mcp

claude.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/mcp

Add the local stdio build to Claude Code:

pnpm build
claude mcp add sponsorfinder -- node dist/entry/stdio.js

Inspect the tools interactively with the MCP Inspector against either transport:

npx @modelcontextprotocol/inspector

Configuration

All configuration is via environment variables (see .env.example):

Name

Required

Default

Description

SPONSORFINDER_API_BASE

yes

Base URL of the upstream SponsorFinder API, no trailing slash (e.g. https://api.sponsorfinder.io).

SPONSORFINDER_API_KEY

yes

Upstream x-api-key header value. Server-side secret — never exposed to MCP clients, tool output, errors, or logs.

PORT

no

3001

HTTP port for the Node entry (src/entry/node.ts). Ignored by stdio and Cloudflare Workers.

UPSTREAM_TIMEOUT_MS

no

10000

Upstream request timeout in milliseconds (aborted via AbortSignal.timeout()).

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 -d

Put 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:worker

Development

Script

What it does

pnpm typecheck

Type-check with tsc --noEmit.

pnpm lint

Lint with ESLint.

pnpm test

Run unit tests (excludes smoke tests).

pnpm test:smoke

Integration smoke tests against the real staging API (needs secrets).

pnpm build

Bundle to dist/ with tsup.

pnpm check

typecheck + lint + test in one go.

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 parameterstool, 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:

  1. Create a GA4 property (free) and a Web data stream.

  2. 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.

  3. Set GA_MEASUREMENT_ID and GA_API_SECRET (env / Docker / wrangler secret).

  4. In GA4, register the event params above as custom dimensions (Admin → Custom definitions) so they appear in reports. Use GA_DEBUG=true to 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 register

Data & 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.json is the manifest for the official MCP registry. Before running mcp-publisher publish, confirm the exact $schema URL against the current registry.modelcontextprotocol.io docs — the schema version pinned here may have moved on.

License

MIT © 2026 Alireza Hamid

Available Tools

4 tools
check_sponsor_licenseCheck Sponsorship LicenceA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryNoWhich register to check: uk, nl, or bothboth
company_nameYesCompany name, exact or approximate (typos OK)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RegistersA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already set readOnlyHint=true; description adds the specific kind of read-only data (statistics, freshness, terminology) provided beyond the annotation.

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

Conciseness5/5

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

Two concise sentences, front-loaded with purpose and usage, no wasted words.

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

Completeness5/5

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

Fully describes the tool's output (statistics, freshness, terminology) despite no output schema, and no parameters to cover.

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

Parameters4/5

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

No parameters exist, so the description doesn't need to add param info. Baseline 4 applies as it correctly implies no inputs needed.

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

Purpose5/5

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

The description clearly states it provides statistics, data freshness, and terminology for sponsor registers, distinguishing it from siblings that deal with specific entries.

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

Usage Guidelines4/5

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

Explicitly states when to use: 'to explain what a licence, route, rating, or sponsor type means.' While it doesn't list exclusions, the context is clear enough.

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 DetailsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
org_idYesOrganization id (from a search or check result)
countryNoWhich register the id belongs touk
include_historyNoAlso include register change history (ADDED / REMOVED / REACTIVATED events)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. Description adds behavioral detail: output varies by country (UK vs NL) and optional change history. No destructive actions mentioned, but all relevant behavior is disclosed.

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

Conciseness5/5

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

Single concise sentence that front-loads the core purpose. No unnecessary words, every part adds essential information.

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

Completeness4/5

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

Given no output schema, description adequately outlines return fields for each country and the optional history. It does not specify exact structure, but terms like 'routes, ratings, locations' imply common fields. Sufficient for a simple retrieval tool.

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

Parameters4/5

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

Schema covers all 3 parameters with descriptions (100% coverage). Description adds value by explaining country-specific output fields, which clarifies the role of the 'country' parameter beyond its enum values.

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

Purpose5/5

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

Clear verb 'get' and resource 'sponsor details', specifies it returns full record for one organization by ID. Distinguishes from siblings as a single-record retrieval with country-specific fields.

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

Usage Guidelines3/5

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

Implied usage (when you have an org id), but no explicit when-to-use, when-not-to-use, or alternatives. Sibling tools provide context but description lacks guidance.

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

search_sponsorsSearch Sponsor RegisterA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoFilter by city (UK only)
limitNoMax results (1–20)
queryNoSubstring to match in the company name
routeNoFilter by visa route, e.g. "Skilled Worker" (UK only)
countryNoWhich register to searchuk
sponsor_typeNoFilter by sponsor type (NL only)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds specifics: it returns a compact list with a total count and that filters apply per country. No contradictions. Adds useful behavior 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.

Conciseness5/5

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

Two sentences, front-loaded with purpose, then alternative guidance. Every sentence is valuable with no redundancy.

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

Completeness4/5

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

Covers core behavior, country-specific filters, and output summary. However, it does not mention pagination or behavior of the limit parameter, which is present in the schema. Still, it is largely complete for an exploratory search tool with read-only annotations.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description adds grouping of filters by country (city/route for UK, sponsor type for NL) and states they are optional, which adds slight value beyond the schema's individual descriptions.

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

Purpose5/5

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

The description clearly states it performs an exploratory list search of the sponsor register, and distinguishes itself from the sibling tool check_sponsor_license by recommending the latter for checking one specific company.

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

Usage Guidelines4/5

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

Explicitly tells the agent to prefer check_sponsor_license for single-company checks, and notes that filters are optional and country-specific. Lacks explicit 'when not to use' but provides clear context.

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. Dates show when Glama detected each change.

  1. 4 tool updatesv1.0.0
    • First observedcheck_sponsor_license
    • First observedget_register_info
    • First observedget_sponsor_details
    • First observedsearch_sponsors

TDQS

A4.5/5.0
Disambiguation5/5

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.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (check_, get_, search_) using snake_case. The verbs and objects are semantically appropriate and uniform.

Tool Count5/5

Four tools cover the core functionalities for a sponsor license lookup server without being excessive or insufficient. The scope is well-defined.

Completeness5/5

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

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to search and retrieve UK Companies House data including company profiles, officers, and filing history via the official API.
    4
    101
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/alirezahamid/sponsor-finder-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server