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 分