public-tenders-es-eu
Public Tenders ES/EU
对 TED(Tenders Electronic Daily,欧盟官方的招标公告发布平台)上发布的所有公共部门招标公告做规范化检索 —— 覆盖西班牙及欧盟其他国家。NEXUS 候选 #16 —— 手动构建,非 FORGE 生成,与候选 #3/#4/#6/#8/#9/#13 相同的手动 Cloud Run 资产模式。
POST /search-public-tenders {"country": "ESP", "keyword": null, "cpv_prefix": null, "days_back": 30, "limit": 20}-- $0.01/次。MCP 工具
search_public_tenders(位于/mcp),参数相同 —— 当前免费,见「已知限制」。GET /health、GET /.well-known/agent-card.json、GET /openapi.json(含x-payment-info)、GET /.well-known/402index-verify.txt(402index 声明校验文件)。
数据源:从原始简报转向而来,且已获得明确签核(2026-08-23)
任务简报将 contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_643/(西班牙国家 PLACSP ATOM 聚合订阅源)认定为「ya grounded de la sesión anterior」。本次会话开始时,我们通过两条相互独立的抓取路径(curl、WebFetch,分别带与不带浏览器 User-Agent)对它做了实时验证:结果是 403 Forbidden,而且该域名自己的 robots.txt 对整个站点声明了 Disallow: / —— 这是明确的、站点级的封锁,而不是限流。这种封锁极有可能同样会挡住 Cloud Run(数据中心 IP 段,正是此类 WAF 规则的常见目标)。该情况在写代码之前就明确标记给了用户(并非悄悄替换方案)—— 而用户做出了转向 TED 的选择。
TED(Tenders Electronic Daily,api.ted.europa.eu) 是欧盟出版物办公室自己的官方公共采购公告搜索 API —— 免费、不需要密钥、无文档化鉴权描述。本次会话逐一字段地对其做了实时验证(有第三方 README 第一遍就把查询字段名写错了 —— 例如声称 country-buyer,而真实 API 只接受 buyer-country —— 因此下面的每个字段/操作符都是对照真实 API 自身的响应验证过的,而不是盲信二手资料):
POST https://api.ted.europa.eu/v3/notices/search,请求体为 JSON,包含query(专家搜索字符串)、fields(要返回的 eForms 字段名数组)、limit、scope("ACTIVE"或"ALL")。已在线实盘确认的查询字段:
publication-date>=YYYYMMDD(8 位数字,无连字符)、buyer-country=ESP(ISO-3166 alpha-3)、FT~"phrase"(全文检索)、AND、SORT BY announcement-date DSC。已在线实盘确认的输出字段:
publication-number、notice-title(多语言字典,键如spa/eng)、buyer-name(多语言字典,值为列表)、buyer-country、publication-date、classification-cpv(CPV 编码列表)、total-value(并非每种公告类型都带该字段 —— 例如 qualification-simulation 公告一般不带,这属于正常,不是错误)、notice-type、links(各语种对应的html/pdf/xml详情 URL)。已实测的真实查询:仅
buyer-country=ESP一项,就在检查当时的ACTIVE范围内命中了 26,314 条公告;publication-date+buyer-country组合在一个 8 天窗口内命中了 1,058 条 —— 这说明是真实、实时、有数据量的接口,而非过期的空端点。
TED 已涵盖到本西班牙(任何须超过欧盟公告发布阈值的招标)都会带有 buyer-country=ESP)以及欧盟其他国家和地区,因此它与原始简报的「España/UE」框架的契合度至少不低于被封锁的国内子阈值订阅源,甚至可以说更好,因为 TED 天然覆盖全欧盟,且没有被封锁。与被封锁来源相比的范围差异:TED 只承载超过欧盟发布阈值的公告(这是一个真实存在且不可忽视的门槛—— 西班牙本国的子阈值招标,也就是本来只有 PLACSP 国内订阅源才会承载的那些,不包含在 TED 内)。本资产并不声称覆盖这些招标;total_matching_notices 与每条结果的 source: "TED" 字段都会让所在方看到实际覆盖范围,不会暗示实际覆盖比它更宽。
Related MCP server: LexSocket MCP Server
状态(db_constraint 例外)
该 codebase 中所有其他手动构建资产(url-metadata-api、agent-verification-api、document-conversion-api、new-x402-listings-feed、onchain-activity-index、x402-receipt-verifier)都是完全无状态;也就是每次调用都会重新访问其上游,除了标准的 traffic_events/revenue_events/mcp_call_events 这三张遥测表之外,没有任何 NEXUS 所属的表。这是 8 个手动/FORGE 资产中第一个需要逐案例外处理的:一张新表 tenders_query_cache(Supabase 迁移 add_tenders_query_cache_candidate16,项目对象 ieduhdgfjdeffvzxuvilf),仅由该资产读写。
原因:TED 官方文档声明没有文档化限制速率,但要求调用方对共享的公共资源保持合理的请求量。对完全相同的重复查询(相同的 country/keyword/cpv_prefix/days_back/limit,按小时分桶)缓存 1 小时,就是对该指导的善意遵循,而非为保留状态而保留状态 不是)。缓存命中会在响应中标记 "cache_hit": true,以便调用方看到命中发生(可辨识地看出什么时候发生了缓存命中)。
这不是原本 PLACSP 爬取设计会需要的状态。 那种设计(遍历一个不可过滤的 ATOM 订阅源,跟踪“所有见过的”招标 ID 以便检测增量 —— 与 new-x402-listings-feed 的目录遍历缓存的形态相同)在这里并不适用:TED 的服务端 publication-date>= 过滤本身就是实现了“自某个时间以来有什么新公告”的问题,而无需本资产自己记住任何单个招标信息。需要保留的唯一状态是短期响应缓存,而非统一每个招标项目的索引。
RLS(行级安全):anon 角色在 tenders_query_cache 上仅授予 SELECT + INSERT —— 不授予 UPDATE/DELETE,与其他每个 NEXUS 遥测表一样的追加插入(insert-append)纪律。所谓缓存的“覆盖”实际上就是插入带一个新 cached_at 的新行;定期查询始终在 TTL 窗口中选择查询最新一行。超过 1 小时 TTL 的过期行永远不会被删除 —— 7 天评估期内累积出的无界增长微不足道(每个不同查询每小时最多加一行),现阶段可接受;将来要真正清理就需要一个定时任务,或者授予一个本资产其他方面用不到的 DELETE 权限。
部署目标:Cloud Run
与候选 #4/#3/#6/#8/#9/#13 相同的管线,见 skills/infra-deploy-ops。
# 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>已知限制(刻意不修复 —— 按 CLAUDE.md 的 S3 原则,但无证据支持就不建立门槛)
MCP 工具调用不收费。 与本代码库中所有其他手动资产相同的进程内调用模式相同。
只覆盖欧盟公告发布阈值以上的招标公告 —— 见上面“来源”一节:西班牙的子阈值国家招标不在 TED 中,本资产也不覆盖收录它们。
cpv_prefix是在预取后才在客户端过滤。 TED 的查询语法在服务端不支持 CPV 前缀匹配;在本资产设置了cpv_prefix时会多抓取(3 倍limit,上限 50),然后在进程内过滤。如果调用方使用了非常窄的cpv_prefix、又配合很宽的days_back窗口,则实际匹配的结果会比 TED 完整结果集中存在的结果更少(超出多抓取到的数量之外)。缓存只是一个粗略的 1 小时 TTL,不会因 TED 新公告而失效。 同上小时窗口内重复的相同查询可能返回与 TED 相比滞后约 1 小时的结果。这一点已在每个响应中通过
cache_hit披露。没有按调用方进行限流。对于 7 天的试用窗口来说可以接受。
tenders_query_cache行永远不会被删除。见上文 “状态”。
质量门禁(2026-08-23,出自设计而非回溯)
与候选 #3/#4/#6/#8/#9/#13 相同的双 Agent 过程(安全视角;功能+质量+买方体验视角)—— 运行后结果填在下方。
测量(候选 #16,7 天窗口)
7 天的窗口从 2023-01-01(实际上线日期)到 2023-01-08 的决策点。事实来源是 traffic_events/revenue_events/mcp_call_events(asset_name = 'public-tenders-es-eu'),而不是 Cloud Run 日志。第 7 天:若 0 个真实流量(在过滤掉爬虫后),则暂停/删除该 Cloud Run 服务(gcloud run services delete public-tenders-es-eu --region us-central1 -- project nexus-505016)。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceExposes 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.4MIT
- 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
- AlicenseNot gradedqualityCmaintenanceAccess Spain public procurement tender notices from PLACSP without API keys.8MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching and retrieving detailed information on EU grant calls and tenders from the EU Funding & Tenders Portal, including deadlines, budgets, and topic details.15MIT
Related MCP Connectors
Spain public procurement MCP — PLACSP tender notices (keyless).
Government tender search for AI agents. UK, EU and US procurement opportunities.
TED MCP — Tenders Electronic Daily (EU public procurement)
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/nexus-mcp-infra/public-tenders-es-eu'
If you have feedback or need assistance with the MCP directory API, please join our Discord server