vergabe-api: German public procurement notices

io.github.applehorsefrog由 GitHub 账号 applehorsefrog 发布v0.4.0更新于 Oct 25, 2026

German public tenders as normalised JSON (CPV, NUTS, deadlines). Free sample; search paid via x402.

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

概览

AI 生成的概览

面向德国公共采购公告的远程 MCP 服务器,提供免费样本与统计,以及通过 x402 USDC 付费的全文检索和公告查询。

可以做什么
获取最新的德国公开招标公告,可按 CPV 代码或前缀筛选,个人联系数据已移除,数据为 CC0 许可。查看最近 30 天每个发布日导入的公告数量,并按类型拆分。读取 API 说明,涵盖端点、价格、x402 支付详情、数据来源、许可和法定声明。按全文和结构化条件检索公告,例如 CPV、NUTS、截止日期、采购方类型和金额,并按 UUID 获取单条公告及其标段、截止日期、链接和中标方。两个检索工具为付费工具,在远程端点上只返回 HTTP 地址和支付要求,不返回数据。
适用场景
当你需要查找或跟踪德国公共招标机会、中标结果或采购统计,并希望在助手中以规范化 JSON 获取数据时使用。适合采购调研和投标筛选;仅用免费工具即可快速浏览近期招标。
运行要求
远程 Streamable HTTP 端点,无需账户或 API 密钥。付费工具每次调用分别收费 0.01 和 0.002 美元,通过 x402 在 Base 主网以 USDC 支付;远程服务器无法付款,需使用本地 stdio 服务器(Node 20+,npx)并在 VERGABE_PAYER_KEY 中配置有余额的钱包密钥,或其他 x402 HTTP 客户端。
安装前请注意
付费工具每次调用都会在 Base 主网花费真实 USDC。本地服务器需要 VERGABE_PAYER_KEY 中的钱包私钥,用于签署转账授权;请使用专用的低余额钱包。远程端点无法付款,只返回支付要求而非结果。查询内容和支付信息会发送给第三方运营方。

安装

在 SourceWeft 中

  1. 打开 控制台中的 vergabe-api: German public procurement notices,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.applehorsefrog%2Fvergabe-api/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "vergabe-api-german-public-procurement-no": {
      "type": "http",
      "url": "https://vergabe-api.applehorsefrog.workers.dev/mcp"
    }
  }
}

README

vergabe-api

German public procurement notices, above and below the EU thresholds, as a normalised JSON API for software agents and procurement tools. Paid per call with x402 (HTTP 402, USDC). No account, no API key, no subscription.

Base URL: https://vergabe-api.applehorsefrog.workers.dev (a branded domain under viono-insights.de will follow). Payments settle on Base mainnet in USDC since 2026-09-14; the facilitator is PayAI.

What you get

Every day roughly 1,000 notices are published on the official German notification service (Datenservice Öffentlicher Einkauf, eForms-DE). The raw feed is a ZIP of XML files, 20 MB per day, with organisation contacts, lots, deadlines and classifications scattered over UBL extensions. This API turns each notice into one flat record:

fieldmeaning
id, notice_id, versionnotice UUID and version
published, issue_datepublication day of the export, issue date from the notice
kindcompetition (calls for tenders), result (awards), planning, change
notice_type, subtype, procedure, legal_basis, natureeForms codes (cn-standard, open, vgv, works ...)
title, descriptionGerman text, personal contact data removed
cpv_main, cpv_additionalCPV codes without check digit
buyer_name, buyer_type, buyer_city, buyer_postal, buyer_nuts, buyer_websitecontracting authority (organisation level only)
place_nuts, place_cityplace of performance
estimated_value, currencyif stated
deadline_date, deadline_time, deadline_kindearliest lot deadline; tender or participation
documents_url, submission_urlwhere the tender documents live
lotsarray of lots with title, CPV, NUTS, value, deadline, period
winners, total_awardedfor award notices, organisation names only
source_urlthe original notice at oeffentlichevergabe.de

Coverage on a sample day (2026-09-10): 1,067 notices, 589 calls for tenders, 569 of them with a submission deadline, 1,036 with CPV, 985 with NUTS.

Endpoints

endpointpricenotes
GET /freeservice descriptor
GET /openapi.jsonfreeOpenAPI 3.1
GET /v1/statsfreenotices per day, last 30 days
GET /v1/sample?cpv=72free5 latest calls for tenders, compact fields
GET /v1/notices$0.01filtered list, up to 100 records
GET /v1/notice/{id}$0.002one full record
POST /mcpfreeremote MCP server (Streamable HTTP), free tools
GET /.well-known/x402freex402 discovery manifest

Filters for /v1/notices

kind (default competition; result, planning, change, all), cpv (codes or prefixes, comma separated: 45,7131), nuts (prefixes: DE2,DE1), q (substring in title, description, buyer), since / until (publication day), deadline_after / deadline_before, nature, procedure, legal_basis, buyer_type, min_value, limit (max 100), offset (max 5000), fields=full (all columns incl. lots), sort=deadline.

GET /v1/notices?cpv=45,71&nuts=DE2&deadline_after=2026-09-20&limit=20GET /v1/notices?q=Photovoltaik&since=2026-09-01&fields=fullGET /v1/notices?kind=result&cpv=72&since=2026-09-01

Paying with x402

A request without payment returns 402 with a PAYMENT-REQUIRED header describing the amount (USDC), network and receiving address. Any x402 client handles this automatically, for example @x402/fetch:

ts
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";import { ExactEvmScheme } from "@x402/evm";import { privateKeyToAccount } from "viem/accounts";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`); // holds USDC on Baseconst fetchWithPay = wrapFetchWithPaymentFromConfig(fetch, {  schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],});const r = await fetchWithPay("https://vergabe-api.applehorsefrog.workers.dev/v1/notices?cpv=72");console.log(await r.json());

Prices are in USD and settled in USDC on Base (eip155:8453); there are no other fees on our side. The same code runs against Base Sepolia by setting X402_NETWORK=eip155:84532 and X402_FACILITATOR=https://x402.org/facilitator in wrangler.jsonc.

MCP server

Two ways to use the data from an MCP client (Claude Desktop, Claude Code, Cursor, any MCP host):

Remote, free tools only (no install): Streamable HTTP endpoint https://vergabe-api.applehorsefrog.workers.dev/mcp with sample_tenders, tender_stats, describe_api. The paid tools are listed there too but only return the payment requirements, because the remote server has no wallet.

Local, with paid tools (stdio, Node 20+): the client pays per call from a wallet you control.

json
{  "mcpServers": {    "vergabe": {      "command": "npx",      "args": ["-y", "github:applehorsefrog/vergabe-api"],      "env": { "VERGABE_PAYER_KEY": "0x<private key of a wallet holding USDC on Base>" }    }  }}

Tools: search_tenders ($0.01 per call, all filters of /v1/notices), get_tender ($0.002), sample_tenders, tender_stats, describe_api (free). Without VERGABE_PAYER_KEY the paid tools return the x402 payment requirements and the HTTP URL instead of data. Use a dedicated low-balance wallet for the key; the server never sends it anywhere, it only signs USDC transfer authorisations (EIP-3009) for the exact price of each call. Source: mcp/server.mjs.

Data source, licence, privacy

Data: Datenservice Öffentlicher Einkauf, https://oeffentlichevergabe.de, published under CC0 1.0. Every response carries X-Data-Source and X-Data-License headers. Code in this repository: MIT.

Contact persons, e-mail addresses, phone and fax numbers are removed during import (etl/etl.py), both from structured fields and from free text. Only organisation-level data is served. If you find personal data that slipped through, open an issue and it will be removed.

This is a technical data service, not legal advice. Deadlines and conditions must be verified at the source before bidding.

How it runs

  • src/index.ts: Cloudflare Worker (Hono) with @x402/hono payment middleware, a D1 (SQLite) database and the remote MCP endpoint.
  • mcp/server.mjs: local MCP server (stdio) that pays for the paid endpoints with @x402/fetch.
  • etl/etl.py: downloads the daily eForms ZIP, parses it with lxml, scrubs personal data, writes INSERT statements.
  • .github/workflows/daily-etl.yml: runs the ETL twice a day (06:30 and 14:00 UTC), re-imports the last three days and loads the rows with wrangler d1 execute.

Local development:

npm installnpx wrangler d1 execute vergabe --local --file=schema.sqlpython etl/etl.py --day 2026-09-10 --out etl/out/d.sql && for f in etl/out/d*.sql; do npx wrangler d1 execute vergabe --local --file=$f; donenpx wrangler dev

Provider, legal notice, privacy

Operated by Dr. Josua Decker, Viono Insights (https://viono-insights.de). Legal notice (Impressum, § 5 DDG): https://viono-insights.de/impressum.html, also served at GET /impressum. Privacy notice for this API (Art. 13 GDPR): GET /datenschutz. Contact: [email protected]. The GitHub account that publishes this repository is an automated account operated with Claude on behalf of the provider.

Disclosure

This service was built with substantial AI assistance (Claude); the provider reviews and is responsible for it. Issues and pull requests are welcome; automated contributions are labelled as such.

来源:README.md,提交 b22fb79

工具

5

sample_tenders

Free sample: latest German calls for tenders

FREE. The 5 most recent German public calls for tenders (compact fields) from oeffentlichevergabe.de, optionally filtered by one CPV code or prefix. Data: CC0, personal contact data removed.

输入参数cpv

tender_stats

Free: notices per day

FREE. Imported notices per publication day for the last 30 days, split by kind.

无需输入参数。

describe_api

Service description, prices, legal notice

FREE. Endpoints, prices, x402 payment details (USDC on Base), data source and licence, provider and legal notice, how to use the paid tools.

无需输入参数。

search_tenders

Search German procurement notices (paid, see description)

PAID ($0.01 USDC on Base per call via x402). Full-text and structured search over German public procurement notices (CPV, NUTS, deadline, buyer type, value). This remote server cannot pay on your behalf: the tool returns the exact HTTP URL and payment requirements; use the local MCP server (npx -y github:applehorsefrog/vergabe-api) or an x402 HTTP client to get data.

输入参数qcpvkindnutssortlimitsinceuntilfieldsnatureoffsetmin_value另有 5 个

get_tender

Get one procurement notice (paid, see description)

PAID ($0.002 USDC on Base per call via x402). One notice by UUID with lots, deadlines, links and winners. Returns the HTTP URL and payment requirements; pay via the local MCP server or an x402 HTTP client.

输入参数id必填

版本历史

1
  1. v0.4.0最新Sep 16, 2026

评分

已满足适用检查项的 100%

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

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分