mcpField
P
public-tenders-es-eu

public-tenders-es-eu

远程服务
github.com/nexus-mcp-infra法律与政务18 周前更新
代码仓库

关于 public-tenders-es-eu

public-tenders-es-eu 在 TED 中规范化搜索西班牙及欧盟的公共采购公告,面向查找招标信息的用户。它覆盖达到欧盟公告门槛的通知,不包含西班牙低于门槛的国家级招标。

主要功能

  1. 01按国家、关键词和 CPV 前缀搜索
  2. 02按发布时间范围筛选
  3. 03返回规范化公告结果
  4. 04提供公告详情链接
  5. 05一小时查询缓存

适用场景

  1. 01查找西班牙公共采购公告
  2. 02按领域关键词筛选欧盟招标
  3. 03检查近期发布的公告
  4. 04获取公告详情页面链接

MCP 相关

在 /mcp 提供 search_public_tenders 工具,供 MCP 客户端按国家、关键词、CPV 前缀、日期范围和结果数量搜索 TED 公告。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://public-tenders-es-eu-325572559480.us-central1.run.app/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

工具

详细介绍

西班牙/欧盟公共招标

对 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 上的 MCP 工具 search_public_tenders,参数相同——目前免费,参见“已知限制”。
  • 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 订阅源)称为“已在上一会话中验证”。本会话开始时,通过两种独立的抓取方式(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 publication-date DESC。
  • 已通过实时验证的输出字段:publication-number、notice-title(多语言字典,键名如 spa/ eng)、buyer-name(多语言列表字典)、buyer-country、publication-date、 classification-cpv(CPV 代码列表)、total-value(并非每种公告类型都会提供,例如资格审查系统公告不包含该字段,这属于正常情况,并非错误)、notice-type、links(按语言提供 html/pdf/xml 详情页 URL)。
  • 已测试真实查询:仅使用 buyer-country=ESP,在本次检查时于 ACTIVE 范围内匹配到 26,314 条公告;publication-date 加 buyer-country 的组合查询在 8 天内匹配到 1,058 条——这是当前的真实数据量,并非过期或空的端点。

TED 已涵盖西班牙(任何达到欧盟公告门槛的招标都会以 buyer-country=ESP 出现)以及欧盟其他地区,因此至少与原始需求中的“西班牙/欧盟”范围同样契合,而被封锁的国家级低于门槛订阅源则做不到这一点——可以说 TED 更合适,因为它原生覆盖整个欧盟,且未被封锁。与被封锁来源相比的范围差异:TED 仅收录达到欧盟公告门槛的公告(这是一个实际且不可忽视的限制——西班牙本国低于门槛的招标,即只有 PLACSP 国家级订阅源才会收录的那些,不会出现在 TED 中)。此资源不声称覆盖这些招标;total_matching_notices 和每条结果中的 source: "TED" 字段会向采购方明确说明实际覆盖范围,而不会暗示覆盖范围比实际更广。

状态(db_constraint 例外)

所有同级手动资产(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,项目 ieduhdgfjdeffvzxvihf),仅由此资产读取和写入。

原因:TED 自己的文档指出没有规定的速率限制,但要求调用方对共享公共资源的请求量保持克制。将相同的重复查询(国家/关键词/CPV 前缀/回溯天数/数量限制相同,按小时分桶)缓存 1 小时,是遵循这项指导、做负责任的使用者,而非无端引入状态——缓存命中时,响应中会标记 "cache_hit": true,让买方能够了解这一情况。

**这不是原始 PLACSP 抓取设计所需的状态。**该设计(遍历无法筛选的 ATOM 信息流,跟踪“已见过”的招标 ID 以检测增量——与 new-x402-listings-feed 的目录遍历缓存机制相同)在这里并不适用:TED 自己的服务端 publication-date>= 筛选已经能够回答“自 X 以来有哪些新增内容”,无需此资产自行记住任何招标信息。唯一保留的状态是短期响应缓存,而不是招标索引。

RLS:anon 仅获得对 tenders_query_cache 的 SELECT + INSERT 权限——不授予 UPDATE/DELETE 权限,与其他所有 NEXUS 遥测表一样遵循仅追加插入的原则。缓存“覆盖”实际上只是新增一行,且 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 SS3,没有证据证明有必要就不设门槛)

  • **MCP 工具调用不收费。**与此代码库中其他所有手动资产一样,采用进程内调用模式。
  • **仅包含达到欧盟发布门槛的招标。**参见上文“来源”——西班牙未达到门槛的国家级招标不在 TED 中,也不受此资产覆盖。
  • **cpv_prefix 在客户端获取结果后筛选。**TED 的查询语法不支持在服务端按 CPV 前缀匹配;设置 cpv_prefix 时,此资产会超量获取(limit 的 3 倍,上限为 50),然后在进程内筛选。若调用方在较宽的 days_back 时间范围内使用非常具体的 cpv_prefix,则实际匹配结果可能少于 TED 完整结果集中超量获取范围之外的匹配数量。
  • **缓存采用固定的 1 小时 TTL,不会因 TED 发布新内容而失效。**同一小时分桶内重复查询可能返回相对于 TED 最多过时约 1 小时的结果。每个响应都会通过 cache_hit 说明这一情况。
  • **没有针对单个调用方的速率限制。**对于为期 7 天的临时测量窗口而言,这没有问题。
  • **tenders_query_cache 行不会删除。**参见上文“状态”。

质量门槛(2026-08-23,根据设计制定,非追溯性要求)

与候选项 #3/#4/#6/#8/#9/#13 使用相同的双 Agent 流程(安全视角;功能、质量和买方体验视角)——运行后将在下方补充结果。

衡量(候选项 #16,7 天窗口)

从 2026-08-23(实际部署日期)开始的 7 天窗口 -> 2026-08-30 为决策节点。数据事实来源: traffic_events/revenue_events/mcp_call_events(asset_name = 'public-tenders-es-eu'),而非 Cloud Run 日志。第 7 天:如果没有真实流量(过滤爬虫后),暂停/删除 Cloud Run 服务 (gcloud run services delete public-tenders-es-eu --region us-central1 --project nexus-505016)。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。