
Public Tenders Es Eu
io.github.nexus-mcp-infra由 GitHub 帳號 nexus-mcp-infra 發布v1.0.0更新於 Oct 24, 2026
Normalized search over public-sector tenders in TED (EU official procurement notices) -- Spain + EU
概覽
遠端 MCP 伺服器,讓助理依國家、關鍵字、CPV 代碼與時間範圍檢索 TED(歐盟官方採購公告)中的公共採購招標,涵蓋西班牙與歐盟。
- 可以做什麼
- 檢索 TED(歐盟官方採購公告平台)發布的公共部門招標公告,涵蓋西班牙及歐盟其他國家。
- 依採購方國家、全文關鍵字、CPV 代碼前綴與回溯天數篩選,並可限制回傳筆數。
- 回傳公告編號、多語言標題與採購方名稱、採購方國家、發布日期、CPV 分類、可用的總金額、公告類型及各語言詳情連結。
- 提供符合條件的公告總數,並標示回應是否來自一小時快取。
- 適用情境
- 適合讓助理查詢目前歐盟或西班牙的公共招標、追蹤某產業或 CPV 領域近期發布的公告,或為採購研究蒐集採購方與金額資訊,而不必自行建置 TED 用戶端。
- 執行需求
- 需要一個遠端 streamable HTTP 端點;未宣告任何套件、帳號、API 金鑰或請求標頭。執行時需要對託管服務及上游 TED API 的網路存取。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Public Tenders Es Eu,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
交給代理程式安裝
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/io.github.nexus-mcp-infra%2Fpublic-tenders-es-eu/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。
{
"mcpServers": {
"public-tenders-es-eu": {
"type": "http",
"url": "https://public-tenders-es-eu-325572559480.us-central1.run.app/mcp"
}
}
}README
Public Tenders ES/EU
Normalized search over public-sector tenders published in TED (Tenders Electronic Daily, the EU's official procurement notice platform) -- covers Spain plus the rest of the EU. NEXUS candidate #16 -- manual build, not FORGE-generated, same manual-Cloud-Run-asset pattern as candidates #3/#4/#6/#8/#9/#13.
POST /search-public-tenders {"country": "ESP", "keyword": null, "cpv_prefix": null, "days_back": 30, "limit": 20}-- $0.01/call.- MCP tool
search_public_tendersat/mcp, same params -- currently free, see "Known limitations". GET /health,GET /.well-known/agent-card.json,GET /openapi.json(hasx-payment-info),GET /.well-known/402index-verify.txt(402index claim verification file).
Source: pivoted from the original brief, with explicit sign-off (2026-08-23)
The task brief named contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_643/ (Spain's national
PLACSP ATOM sindication feed) as "ya grounded de la sesión anterior". Verified live at the start of this
session via two independent fetch paths (curl, WebFetch, with and without a browser User-Agent): 403
Forbidden, and the domain's own robots.txt is Disallow: / for the entire site -- a declared,
site-wide block, not a rate limit. That would very likely also block Cloud Run (a datacenter IP range,
the common target of this kind of WAF rule). Flagged to the user before writing any code (not silently
substituted) -- user chose to pivot to TED.
TED (Tenders Electronic Daily, api.ted.europa.eu) is the EU Publications Office's own official
public-procurement notice search API -- free, keyless, no documented auth. Verified live and field-by-field
this session (a third-party README got query-field names wrong on the first pass -- e.g. claimed
country-buyer where the real API only accepts buyer-country -- so every field/operator below was
confirmed against the real API's own responses, not trusted secondhand):
POST https://api.ted.europa.eu/v3/notices/searchwith a JSON body ofquery(expert-search string),fields(array of eForms field names to return),limit,scope("ACTIVE"or"ALL").- Query fields confirmed live:
publication-date>=YYYYMMDD(8-digit, no dashes),buyer-country=ESP(ISO-3166 alpha-3),FT~"phrase"(full-text),AND,SORT BY publication-date DESC. - Output fields confirmed live:
publication-number,notice-title(multilingual dict, keys likespa/eng),buyer-name(multilingual dict of lists),buyer-country,publication-date,classification-cpv(list of CPV codes),total-value(not present on every notice type -- e.g. qualification-system notices don't carry one, this is normal, not an error),notice-type,links(per-languagehtml/pdf/xmldetail URLs). - Real query tested:
buyer-country=ESPalone matched 26,314 notices in theACTIVEscope at the time of this check; apublication-date+buyer-countrycombo matched 1,058 in an 8-day window -- real, current volume, not a stale/empty endpoint.
TED already covers Spain (any tender above the EU publication threshold appears with buyer-country=ESP)
plus the rest of the EU, so it fits the "España/UE" framing of the original brief at least as well as the
blocked national sub-threshold feed would have -- arguably better, since it's EU-wide by construction and
not blocked. Scope difference from what the blocked source would have given: TED only carries notices
above the EU publication threshold (a real, non-trivial floor -- Spain's own sub-threshold tenders, the
ones PLACSP's national feed alone would have carried, are NOT in TED). This asset does not claim to cover
those; total_matching_notices and each result's source: "TED" field make the actual coverage explicit
to a buyer, not implied to be broader than it is.
State (db_constraint exception)
Every sibling manual asset (url-metadata-api, agent-verification-api, document-conversion-api,
new-x402-listings-feed, onchain-activity-index, x402-receipt-verifier) is fully stateless -- each call
hits its upstream fresh, no NEXUS-owned table beyond the standard traffic_events/revenue_events/
mcp_call_events telemetry trio. This is the first of the 8 manual/FORGE assets to need the case-by-case
exception: a new table, tenders_query_cache (Supabase migration add_tenders_query_cache_candidate16,
project ieduhdgfjdeffvzxvihf), read+written only by this asset.
Why: TED's own docs state there is no documented rate limit but ask callers to be reasonable with
request volume on a shared public resource. Caching identical repeat queries (same country/keyword/
cpv_prefix/days_back/limit, bucketed to the hour) for 1 hour is being a good citizen of that guidance, not
gratuitous state -- a cache hit is marked "cache_hit": true in the response so a buyer can see when this
happened.
This is NOT the state the original PLACSP-scraping design would have needed. That design (walking an
unfilterable ATOM feed, tracking "already seen" tender IDs to detect deltas -- the same shape as
new-x402-listings-feed's catalog-walk cache) doesn't apply here: TED's own server-side
publication-date>= filtering already answers "what's new since X" without this asset needing to remember
anything about individual tenders itself. The only state kept is a short-lived response cache, not a tender
index.
RLS: anon gets SELECT + INSERT on tenders_query_cache only -- no UPDATE/DELETE granted, same
insert-append discipline as every other NEXUS telemetry table. A cache "overwrite" is really just a new row
with a newer cached_at; the lookup query always picks the freshest row within the TTL window. Stale rows
past the 1-hour TTL are never deleted -- unbounded growth over the 7-day probation window is negligible
(one row per distinct query per hour) and accepted for now; a real cleanup would need either a scheduled job
or a DELETE grant this asset doesn't otherwise need.
Deploy target: Cloud Run
Same pipeline as candidates #4/#3/#6/#8/#9/#13 -- see skills/infra-deploy-ops.
Known limitations (left unfixed on purpose -- CLAUDE.md SS3, no gate without evidence it's needed)
- MCP tool calls are not charged. Same in-process-call pattern as every other manual asset in this codebase.
- Only EU-publication-threshold tenders. See "Source" above -- Spain's sub-threshold national tenders are not in TED and not covered by this asset.
cpv_prefixis filtered client-side, after fetching. TED's query syntax doesn't support CPV-prefix matching server-side; this asset over-fetches (3xlimit, capped at 50) whencpv_prefixis set, then filters in-process. A caller with a very narrowcpv_prefixagainst a broaddays_backwindow could get fewer real matches than exist in TED's full result set beyond what was over-fetched.- Cache is a plain 1-hour TTL, not invalidated on new TED publications. A query repeated within the same
hour bucket can return results that are up to ~1 hour stale relative to TED. Disclosed via
cache_hitin every response. - No per-caller rate limiting. Fine for a 7-day disposable measurement window.
tenders_query_cacherows are never deleted. See "State" above.
Quality gate (2026-08-23, from design not retroactive)
Same 2-agent process as candidates #3/#4/#6/#8/#9/#13 (security lens; functional+quality+buyer-experience lens) -- results filled in below once run.
Measurement (candidate #16, 7-day window)
7-day window from 2026-08-23 (real deploy date) -> decision point 2026-08-30. Source of truth:
traffic_events/revenue_events/mcp_call_events (asset_name = 'public-tenders-es-eu'), not Cloud Run
logs. Day 7: if zero real traffic (filtering crawlers), pause/delete the Cloud Run service
(gcloud run services delete public-tenders-es-eu --region us-central1 --project nexus-505016).
來源:README.md,提交 7a492dc
工具
0版本歷史
1- v1.0.0最新Sep 16, 2026
評分
已滿足適用檢查項的 75%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通必需25 分
- 已宣告認證方式必需10 分
- 已列出工具必需15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
請在儲存庫或註冊中心條目中宣告授權條款。