vergabe-mcp
An MCP server for the German federal public-tender portal that enables searching live tenders with filters and retrieving notices in domain model, eForms XML, or OCDS format.
README
vergabe-mcp
An MCP server for oeffentlichevergabe.de, the German federal public-tender portal. Germany publishes every public tender there and offers a bulk open-data export, but that export lags a day, ships as daily ZIPs, and cannot filter — you download everything and sort it out yourself. The portal's own search API can filter (CPV code, region, deadline window, the eForms "suitable for freelancers" flag) and is current the moment a notice goes live, but it is undocumented. This server wraps it, so any MCP client can search the live feed with real filters and pull a notice in the portal's domain model, in eForms XML, or in OCDS. Anonymous, no API key, no account.
The reverse-engineered API reference is in docs/API.md — it stands on its own if you want to call the endpoints directly instead of through MCP.
Install
Nothing to install; run it with npx.
Claude Code
claude mcp add vergabe -- npx vergabe-mcp
Claude Desktop — in claude_desktop_config.json:
{
"mcpServers": {
"vergabe": {
"command": "npx",
"args": ["vergabe-mcp"]
}
}
}
Any other stdio client
npx vergabe-mcp
Streamable HTTP, if your client wants a URL rather than a subprocess:
npx vergabe-mcp --http --port 3000
Tools
| Tool | What it does |
|---|---|
search_tenders |
Search lots with flat parameters — free text, CPV prefixes, suitableFor, contract nature, NUTS region, platform, deadline and publication windows, paging, sort. Returns normalized results. |
get_tender |
One notice by id, as a curated summary (default) or verbatim domain JSON, eforms XML, or ocds JSON. |
search_tenders_raw |
The native SELECT/FROM/WHERE/PAGE/ORDER DSL, passed through and returned raw — for anything the curated tool does not express. |
lookup_code |
Resolve a CPV or NUTS code to its German or English description. |
get_export_url |
Build the bulk open-data export URL for a day or month, with the caveats attached. |
All five are read-only; the server writes nothing, stores nothing on disk, and holds no credentials.
Resources. vergabe://api-reference serves the API document, so a client can read what the
backend actually supports before composing a query. Templates cover single notices —
vergabe://notice/{noticeId}, .../eforms, .../ocds — and vergabe://codelist/{list}/{code}.
Prompt. find-solo-tenders (args: keywords, cpv, maxDays) searches with the
freelancer/self-employed flags, then walks the model through triaging candidates: person-days
buried in the description, whether the near deadline is a request to participate or the offer
itself, and the fact that an empty value field means nothing. That triage knowledge ships as a
prompt rather than as scoring code, so you can argue with it.
Example
You: Find open IT tenders that are flagged as suitable for freelancers.
The model calls search_tenders with cpv: ["72"], suitableFor: ["freelance"],
onlyActive: true. On 2026-08-17 that is 30 open lots, among them:
{
"noticeId": "7c70692d-dfb9-4b96-b777-4a5539eaee50",
"title": "Beschaffung einer Beratungsdienstleistung zur Fachberatung im Rahmen eines Identity and Access Management (IAM) Projektes für die Stadtwerke Bielefeld (SWB)",
"lotTitle": "Beratungsdienstleistung zur Fachberatung im Rahmen eines Identity and Access Management (IAM) Projektes",
"buyer": "Stadtwerke Bielefeld GmbH",
"cpv": "72260000",
"noticeType": "cn-standard",
"nature": "services",
"deadline": "2026-09-14T10:00:00+02:00",
"published": "2026-08-12T00:00:00+02:00"
}
It then calls get_tender on the interesting ones to read the description, the estimated value,
and the exclusion grounds before telling you which are worth a bid — that judgment is the model's
job, and the server deliberately does not score anything.
Note the shape of the data in that result: the deadline on this one is
deadlineReceiptRequests, a request to participate, not an offer deadline. The
find-solo-tenders prompt exists because distinctions like that decide whether a tender is
reachable.
Development
Node 20 or newer.
npm install
npm test # vitest, no network
npm run typecheck
npm run lint # biome
Integration tests hit the live portal and are skipped unless you ask for them:
VERGABE_LIVE=1 npm test
Commits follow Conventional Commits;
release-please turns them into a release PR on
main — merging that PR tags the release, writes the changelog, publishes to npm, and attaches
the tarball to the GitHub release. The commit type decides the version bump.
License
MIT.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.