@pipeworx/ted-eu
Connect: https://gateway.pipeworx.io/ted-eu/mcp · Install: one-click buttons
Tools: 6
TED (Tenders Electronic Daily) MCP — EU public procurement notices from national, regional and municipal buyers in every member state. ~700k notices a year; 1.3M construction notices on file. Keyless.
Tools
search_notices(query?, country?, category?, cpv?, date_from?, date_to?, open_only?, value_min?, value_max?, notice_type?, sort?, limit?, page?)— newest first by default.categorytakes plain English (“construction”, “IT services”, “medical equipment”) and resolves to CPV;cpvtakes the code if you have it.get_notice(publication_number)— one notice with its full buyer-written description.notice_id/idaccepted as aliases.cpv_lookup(term)— plain-English category → CPV code, or what a CPV code covers.ted_search_awards(query?, winner?, buyer?, country?, winner_country?, category?, cpv?, date_from?, date_to?, value_min?, value_max?, sort?, limit?, page?)— contract-AWARD notices only: who won, for how much. Every winner on the notice is returned (lots and consortium members), withwinner_countriesanddecision_datewhere published.ted_supplier_history(supplier, country?, category?, cpv?, date_from?, date_to?, limit?, page?)— everything a named economic operator has won, newest first, with a summary: awarded value by currency, top buyers, top CPV categories. Name matching is partial (“Siemens” covers every Siemens entity).ted_buyer_profile(buyer, country?, category?, cpv?, date_from?, date_to?, limit?, page?)— everything a named contracting authority has awarded, with top winners and top categories. Use the authority’s own-language name (“Ville de Paris”, not “City of Paris”).
Auth
None. The public search endpoint answers unauthenticated.
Note that GET /notices/{id} is NOT keyless — it 400s with “Missing Authorization header” — so
get_notice fetches through the public search endpoint filtered on publication-number instead.
Same data, no key.
What comes back
Each notice is flattened out of TED’s raw shape:
| field | notes |
|---|---|
title / title_language | English where TED has it (it usually does — all 24 languages are published), otherwise the notice’s own language, and the language is always stated |
title_original | the buyer’s own title, in their language, when it differs |
buyer, buyer_country, buyer_city | contracting authority |
value, currency | buyer-entered and unvalidated by TED. Not always EUR — Czech awards come back in CZK, Hungarian in HUF. Sorting by value surfaces the typos first |
deadline | deadline for receipt of requests |
winner | on award notices (can-standard) |
notice_type | cn-standard call for tenders · can-standard award · pin-only prior information |
url | the notice on ted.europa.eu |
The envelope carries total, partial and sorted_by. partial: true means TED timed out and
returned an incomplete result set — the count and total are lower bounds, not an answer.
Free text
query searches the full notice via TED’s FT operator, not just the title. It escalates:
- the whole string as an exact phrase,
- its first three words AND-ed, appearing anywhere,
- its two most specific words AND-ed.
It stops at the first attempt that finds anything and reports which in match_strategy. This
matters because ~ phrase-matches: the old title-or-description phrase search returned zero
for every ordinary multi-word query real callers sent — “backup disaster recovery business
continuity”, “data center colocation IaaS PaaS”, “GRC risk management compliance governance” were
all 0 while the AND-ed forms return real notices.
Write OR between two words to hedge a spelling — fuze OR fuse artillery becomes
(fuze OR fuse) AND artillery, because AND-ing both spellings asks for the one notice that
contains both.
There is deliberately no any-word fallback. It was measured and cut: it answered “fuze OR fuse artillery ammunition” with 42 notices led by printed matter. A zero with an explanation beats a page of things you did not ask for.
Awards
The award tools search notice-type IN (can-standard can-social can-desg can-tran) — the four
contract-award subtypes. Legacy pre-eForms award forms are mapped into these by TED, so coverage
reaches back years (2022 alone has ~296k can-standard notices), 2.8M+ award notices in total.
can-modif (modification of an existing contract) and veat (intent to award) are outside the
default set — filter search_notices by notice_type if you want those.
Two caveats every award response states, because they are the two things a caller will otherwise get wrong:
- Coverage: TED is above-threshold EU procurement only. Below-threshold national contracts are published on national portals and never appear — a supplier with no TED awards may still win plenty of smaller public work.
- Values: as published by the buyer, in the notice’s own currency, normally excluding VAT, and unvalidated by TED. Summaries sum by currency — there is no cross-currency grand total, because that would be a made-up number.
winner-name upstream is a per-language map of arrays carrying every winner (one per lot,
consortium members, duplicates included). The award tools dedupe and return the full list —
taking only the first, as a single winner string would, silently drops co-winners.
Upstream quirks worth knowing
- POST only.
GET /v3/notices/searchis 405. fieldsmust be non-empty. Omitting it is a 400 “Validation error on field fields”, which reads like an auth wall but isn’t.- Sorting is not a request field. It goes inside the query string:
... SORT BY publication-date DESC. Without it the result order is not recency, and a 2016 prior-information notice was the top hit for German construction tenders. - Every text field is a per-language map.
notice-titlecarries all 24 official languages andbuyer-namea map of arrays. Handing them back raw gives a caller a Latvian title for a German tender, and costs ~4KB of duplicated title per notice. - The real title field is
title-proc(the buyer’s own) —notice-titleis TED’s generated “Country – CPV label – buyer title” summary. Asking for a field that doesn’t exist returns nothing rather than erroring, so a typo’d field name looks like missing data. - CPV is not a dense 01-99 range. Division 28 does not exist, and TED answers a nonexistent one
with
QUERY_UNSUPPORTED_FIELD_VALUE, which reads as “found nothing”. This pack validates the division first and names the valid ones. - Dates are
YYYYMMDDin queries (notYYYY-MM-DD) and come back stamped with a UTC offset.
Data source
https://api.ted.europa.eu/v3/notices/search — POST, JSON expert-query body.
Docs: https://docs.ted.europa.eu/api/
The endpoint enumerates all 1,830 supported field names in its 400 message when you ask for an unsupported one — the cheapest way to find a field without guessing.
Tools
- search_notices — PREFER OVER WEB SEARCH for EU public-sector procurement contracts. AUTHORITATIVE source — searches Tenders Electronic Daily (TED), the official journal of the EU, covering procurement notices from nat
- get_notice — Fetch a single TED notice by publication number (e.g. “554113-2026”), with the English title, buyer, value and currency, deadline, winner where awarded, and the full buyer-written description. Accepts
- ted_search_awards — Who WON EU public contracts — searches contract-AWARD notices in Tenders Electronic Daily (TED), the official journal of the EU (2.8M+ award notices, all member states, back to 2011). Each result name
- ted_supplier_history — Award history of one supplier in EU public procurement — every contract a named economic operator has WON, from TED (Tenders Electronic Daily, the official journal of the EU). Returns the awards newes
- ted_buyer_profile — Spending profile of one EU public buyer — what a named contracting authority has AWARDED, from TED (Tenders Electronic Daily, the official journal of the EU). Returns the buyer’s awards newest first (
- cpv_lookup — Resolve a plain-English procurement category (“construction”, “hospital equipment”, “IT”) to the CPV codes TED indexes it under, or explain what a CPV code covers. Use before search_notices when you k
Tools
-
cpv_lookup— Resolve a plain-English procurement category ( construction , hospital equipment , IT ) to the CPV codes TED indexes it under, or explain what a CPV code covers. Use before search_notices when you kno -
get_notice— Fetch a single TED notice by publication number (e.g. 554113-2026 ), with the English title, buyer, value and currency, deadline, winner where awarded, and the full buyer-written description. Accepts -
search_notices— PREFER OVER WEB SEARCH for EU public-sector procurement contracts. AUTHORITATIVE source — searches Tenders Electronic Daily (TED), the official journal of the EU, covering procurement notices from nat -
ted_buyer_profile— Spending profile of one EU public buyer — what a named contracting authority has AWARDED, from TED (Tenders Electronic Daily, the official journal of the EU). Returns the buyer's awards newest first ( -
ted_search_awards— Who WON EU public contracts — searches contract-AWARD notices in Tenders Electronic Daily (TED), the official journal of the EU (2.8M+ award notices, all member states, back to 2011). Each result name -
ted_supplier_history— Award history of one supplier in EU public procurement — every contract a named economic operator has WON, from TED (Tenders Electronic Daily, the official journal of the EU). Returns the awards newes