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

已验证Streamable HTTP可网页运行网页搜索与抓取商业与电商

概览

AI 生成的概览

远程 MCP 服务器,让助手按国家、关键词、CPV 代码和时间范围检索 TED(欧盟官方采购公告)中的公共采购招标,覆盖西班牙及欧盟。

可以做什么
  • 检索 TED(欧盟官方采购公告平台)发布的公共部门招标公告,覆盖西班牙及欧盟其他国家。
  • 按采购方国家、全文关键词、CPV 代码前缀和回溯天数筛选,并可限制返回条数。
  • 返回公告编号、多语言标题与采购方名称、采购方国家、发布日期、CPV 分类、可用的总金额、公告类型及各语言详情链接。
  • 给出匹配公告总数,并标明响应是否来自一小时缓存。
适用场景
适合让助手查询当前欧盟或西班牙的公共招标、跟踪某行业或 CPV 领域近期发布的公告,或为采购调研收集采购方与金额信息,而无需自行搭建 TED 客户端。
运行要求
需要一个远程 streamable HTTP 端点;未声明任何软件包、账号、API 密钥或请求头。运行依赖对托管服务及上游 TED API 的网络访问。
安装前请注意
README 说明 HTTP 搜索端点按每次调用 0.01 美元计费,而 MCP 工具调用目前不收费;使用前请确认当前价格。覆盖范围仅限超过欧盟发布门槛的公告,西班牙门槛以下的招标不在其中。由于一小时查询缓存,结果可能滞后约一小时;CPV 前缀过窄的检索可能少于实际存在的匹配数。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Public Tenders Es Eu,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

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_tenders at /mcp, same params -- currently free, see "Known limitations".
  • GET /health, GET /.well-known/agent-card.json, GET /openapi.json (has x-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/search with a JSON body of query (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 like spa/ 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-language html/pdf/xml detail URLs).
  • Real query tested: buyer-country=ESP alone matched 26,314 notices in the ACTIVE scope at the time of this check; a publication-date + buyer-country combo 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.

bash
# 1. First deploy -- PUBLIC_DOMAIN not known yet, every real request 421s until step 2../scripts/deploy_cloud_run.sh public-tenders-es-eu manual_assets/public-tenders-es-eu
# 2. Grab the printed *.run.app URL, then (only if it differs from env-vars.deploy.yaml's guess):gcloud run services update public-tenders-es-eu --region us-central1 --project nexus-505016 \    --update-env-vars PUBLIC_DOMAIN=<the-real-domain>

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_prefix is filtered client-side, after fetching. TED's query syntax doesn't support CPV-prefix matching server-side; this asset over-fetches (3x limit, capped at 50) when cpv_prefix is set, then filters in-process. A caller with a very narrow cpv_prefix against a broad days_back window 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_hit in every response.
  • No per-caller rate limiting. Fine for a 7-day disposable measurement window.
  • tenders_query_cache rows 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
SourceWeft 尚未读取此服务器的工具。

版本历史

1
  1. v1.0.0最新Sep 16, 2026

评分

已满足适用检查项的 75%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。