ted-mcp
Provides read-only access to TED (Tenders Electronic Daily), the EU's official public-procurement journal, via its keyless Search API v3. Enables searching and counting EU tender notices using filters such as keywords, countries, CPV codes, date ranges, and notice types, returning notice titles, buyers, countries, CPV codes, values, and links. Also supports raw expert queries and query-syntax validation.
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., "@ted-mcp How many EU tenders mentioning NIS2 were published since 2026-01-01?"
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.
ted-mcp: EU public tenders for AI agents
Read-only MCP server for TED (Tenders Electronic Daily), the EU's official public-procurement journal. It uses TED's free, keyless Search API v3; no account or API key is needed.
Tools
Tool | What it does |
| Search with simple filters: keywords, countries, CPV codes, date range, notice type. Returns title, buyer, country, CPV, value, link |
| Count matches only (one tiny request). Compare two date windows to see if demand is rising |
| Raw TED expert query, for advanced use |
| Validate expert-query syntax without fetching notices |
All tools are marked read-only. Notice text is returned as third-party data, and the server tells the AI to treat it as data, not instructions.
Example prompts once connected:
"How many EU tenders mentioning NIS2 were published since 2026-01-01, vs the same period last year?"
"List open Romanian IT tenders (CPV 72000000) published this month."
"Find active tenders in DE, AT and NL mentioning SBOM or 'Cyber Resilience Act'."
Related MCP server: LexSocket MCP Server
1. First run: check it against the real API
python3 -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
pytest -q # 20 tests, TED is mocked
# Real API smoke test (no key needed):
curl -s -X POST https://api.ted.europa.eu/v3/notices/search \
-H 'Content-Type: application/json' \
-d '{"query":"buyer-country=ROU AND publication-date>=20260901","fields":["publication-number","notice-title"],"limit":2}' | head -c 600Query syntax follows TED's official Expert Search help: single words unquoted (
FT ~ kubernetes), phrases quoted (FT ~ "cyber security"), and lists viaIN(buyer-country IN (ROU DEU)). Usecheck_queryto validate anything custom before running it.
2. Claude Desktop (stdio, local)
Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"ted-tenders": {
"command": "/ABSOLUTE/PATH/ted-mcp/.venv/bin/ted-mcp"
}
}
}Windows path example: C:\\Users\\you\\ted-mcp\\.venv\\Scripts\\ted-mcp.exe. Restart Claude Desktop.
3. Claude Code
claude mcp add ted-tenders -- /ABSOLUTE/PATH/ted-mcp/.venv/bin/ted-mcp4. Remote connector (claude.ai web, mobile)
claude.ai custom connectors need a public HTTPS URL. HTTP mode refuses to start without a token.
export TED_MCP_TOKEN=$(openssl rand -hex 24) # save this in your password manager
docker build -t ted-mcp .
docker run -d --name ted-mcp --restart unless-stopped \
-e TED_MCP_TOKEN=$TED_MCP_TOKEN \
-e TED_MCP_ALLOWED_HOSTS=ted.example.com \
-p 127.0.0.1:8000:8000 ted-mcpPut TLS in front, for example with Caddy (automatic Let's Encrypt):
ted.example.com {
reverse_proxy 127.0.0.1:8000
}Then in claude.ai → Settings → Connectors → Add custom connector:
https://ted.example.com/mcp?token=YOUR_TOKENHealth check (no token needed): https://ted.example.com/healthz
Security notes
The token is compared in constant time; requests without it get
401.A token in a URL can end up in proxy logs. Keep access logs private and rotate the token if exposed. MCP clients that can send headers should use
Authorization: Bearer <token>instead.TED_MCP_ALLOWED_HOSTSenables DNS-rebinding protection. Set it to your domain.The container runs as a non-root user and exposes only port 8000 on localhost. The server makes outbound calls to TED only.
Built-in politeness: at most 2 concurrent requests and 0.4 s between calls, with retries on 429/5xx.
Configuration
Variable | Default | Purpose |
|
|
|
|
| HTTP bind address |
| none | Required for HTTP; minimum 24 characters |
| none | Comma-separated hostnames for DNS-rebinding protection |
| TED v3 search | Override for testing |
Data and licence
TED notice metadata is published by the EU Publications Office for free reuse, including commercial use. Keep "Source: TED (ted.europa.eu)" attribution when you republish results. This project is independent and not affiliated with the EU. Code: MIT.
Available Tools
4 toolscheck_queryBRead-onlyIdempotent
Validate TED expert-search syntax without returning notices.
Inputs: query (required). Returns: object
count_tendersARead-onlyIdempotent
Count matching notices without listing them (cheap demand signal).
Same filters as search_tenders. Defaults to scope ALL so date ranges count the archive. Tip: compare the same filters across two date windows to see if demand is rising.
Inputs: scope, keywords, countries, cpv_codes, +3 more. Returns: object
search_noticesARead-onlyIdempotent
Run a raw TED expert-search query (advanced).
Example: 'FT ~ kubernetes AND buyer-country IN (DEU AUT) AND publication-date>=20260801 SORT BY publication-date DESC' fields: TED field names to return (defaults to a standard set). Unknown fields are rejected by TED. Use check_query first if unsure about syntax.
Inputs: query (required), page, limit, scope, +2 more. Returns: object
search_tendersARead-onlyIdempotent
Search EU public tenders with simple filters.
keywords: full-text terms, OR-combined (e.g. ["NIS2", "cybersecurity audit"]). countries: buyer countries, ISO alpha-3 or alpha-2 (e.g. ["ROU", "DE"]). cpv_codes: 8-digit CPV codes, e.g. 72000000 (IT services), 48000000 (software packages). published_since / published_until: YYYY-MM-DD. notice_types: e.g. ["cn-standard"] (contract notices) or ["can-standard"] (award notices). scope: ACTIVE (open now), LATEST, or ALL (archive). Returns total match count plus normalised notices (title, buyer, country, CPV, value, URL).
Inputs: page, limit, scope, keywords, +6 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
The four tools have mostly distinct purposes: simple search, raw expert search, count-only, and syntax validation. search_tenders and search_notices overlap in domain but are differentiated by simple vs. advanced query modes, so misselection is possible but unlikely.
All tool names follow a consistent snake_case verb_noun pattern: search_tenders, search_notices, count_tenders, check_query. The naming is predictable and readable.
Four tools are well-scoped for a search-focused API: two search modes, a count utility, and a query validator. Each tool earns its place without redundancy or bloat.
The server covers discovery, advanced querying, counting, and query validation for EU tenders, which is strong for a read-only search domain. A minor gap is the absence of a direct notice-detail retrieval tool by ID, though returned URLs partially mitigate this.
Maintenance
Related MCP Connectors
EU TED public procurement tender notices search via the official API. Runs on Apify.
Search EU public tenders from TED and national portals by CPV code, country, buyer or value.
Search EU public tenders across TED and 8 national portals. Monitor, match, and analyse procurement.
Search EU TED procurement notices by CPV, country, keyword, value, or type.
Related MCP Servers
- AlicenseAqualityCmaintenanceExposes French and EU public procurement data (BOAMP + TED) as MCP tools for AI agents, enabling search for tenders, awards, and winner intelligence via typed filters.445 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceEnables search and analysis of European public procurement tenders, including EU above-threshold (TED) and below-threshold from 11 national sources, with hybrid search and filtering.MIT
- FlicenseNot gradedqualityCmaintenanceProvides normalized search over public-sector tender notices from TED, covering Spain and the rest of the EU. Supports filtering by country, keyword, CPV prefix, and publication recency, returning tender details and related links.1-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search and retrieve public procurement notices from 17 sources across Germany, the EU, and the UK, with filtering by country, CPV code, deadline, and contract value, plus full tender details and source freshness checks.MIT