Skip to main content
Glama
jocks-studio

vergabe-mcp

by jocks-studio

vergabe-mcp

CI npm

oeffentlichevergabe.de를 위한 MCP 서버입니다. 독일 연방 공공입찰 포털입니다. 독일은 모든 공공입찰을 이곳에 게시하며 대량의 오픈데이터 내보내기를 제공하지만, 이 내보내기는 하루가 지연되고 일별 ZIP 파일로 제공되며 필터링이 불가능합니다. 즉, 모든 것을 다운로드하여 직접 분류해야 합니다. 포털 자체 검색 API는 필터링(CPV 코드, 지역, 마감일 기간, eForms의 '프리랜서 적합' 플래그)이 가능하며 공고가 게시되는 즉시 최신 상태이지만 문서화되어 있지 않습니다. 이 서버는 이를 래핑하여 모든 MCP 클라이언트가 실제 필터로 실시간 피드를 검색하고 포털의 도메인 모델, eForms XML 또는 OCDS로 공고를 가져올 수 있도록 합니다. 익명이며 API 키나 계정이 필요하지 않습니다.

역설계된 API 참조는 docs/API.md에 있습니다. MCP를 통하지 않고 엔드포인트를 직접 호출하려는 경우 독립적으로 사용할 수 있습니다.

설치

설치할 필요 없음; npx로 실행합니다.

Claude Code

claude mcp add vergabe -- npx vergabe-mcp

Claude Desktop — claude_desktop_config.json에서:

{
  "mcpServers": {
    "vergabe": {
      "command": "npx",
      "args": ["vergabe-mcp"]
    }
  }
}

다른 모든 stdio 클라이언트

npx vergabe-mcp

Streamable HTTP, 클라이언트가 서브프로세스 대신 URL을 원하는 경우:

npx vergabe-mcp --http --port 3000

Related MCP server: germany-tenders

도구

도구

기능

search_tenders

평면 매개변수(자유 텍스트, CPV 접두사, suitableFor, 계약 성격, NUTS 지역, 플랫폼, 마감일 및 게시 기간, 페이지 매김, 정렬)로 로트를 검색합니다. 정규화된 결과를 반환합니다.

get_tender

ID로 하나의 공고를 가져옵니다. 큐레이션된 summary(기본값) 또는 원본 domain JSON, eforms XML, ocds JSON 형식으로 제공합니다.

search_tenders_raw

네이티브 SELECT/FROM/WHERE/PAGE/ORDER DSL을 그대로 전달하고 원시 결과를 반환합니다. 큐레이션된 도구로 표현할 수 없는 모든 경우에 사용합니다.

lookup_code

CPV 또는 NUTS 코드를 독일어 또는 영어 설명으로 확인합니다.

get_export_url

일별 또는 월별 대량 오픈데이터 내보내기 URL을 생성하며, 주의사항을 함께 제공합니다.

다섯 가지 모두 읽기 전용입니다. 서버는 아무것도 쓰지 않으며, 디스크에 저장하지 않고, 자격 증명을 보유하지 않습니다.

리소스. vergabe://api-reference는 API 문서를 제공하므로 클라이언트가 쿼리를 구성하기 전에 백엔드가 실제로 지원하는 내용을 읽을 수 있습니다. 템플릿은 단일 공고(vergabe://notice/{noticeId}, .../eforms, .../ocds)와 vergabe://codelist/{list}/{code}를 다룹니다.

프롬프트. find-solo-tenders(인수: keywords, cpv, maxDays)는 프리랜서/자영업자 플래그로 검색한 후, 후보를 선별하는 과정을 모델에 안내합니다. 설명에 숨겨진 인일(人日), 임박한 마감일이 참가 요청인지 제안 자체인지, 빈 값 필드가 의미하는 바가 없다는 사실 등을 다룹니다. 이 선별 지식은 점수 매기기 코드가 아닌 프롬프트로 제공되므로, 사용자가 이에 대해 논쟁할 수 있습니다.

예시

사용자: 프리랜서에게 적합한 것으로 표시된 공개 IT 입찰을 찾아줘.

모델은 cpv: ["72"], suitableFor: ["freelance"], onlyActive: true로 search_tenders를 호출합니다. 2026-08-17 기준으로 30개의 열린 로트가 있으며, 그중에는 다음이 포함됩니다:

{
  "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"
}

그런 다음 관심 있는 공고에 대해 get_tender를 호출하여 설명, 예상 가치, 배제 사유를 읽고 어떤 것이 입찰할 가치가 있는지 알려줍니다. 이 판단은 모델의 몫이며, 서버는 의도적으로 점수를 매기지 않습니다.

해당 결과의 데이터 형태에 주목하세요. 이 공고의 마감일은 deadlineReceiptRequests로, 제안 마감일이 아닌 참가 요청입니다. find-solo-tenders 프롬프트는 이러한 차이가 입찰 가능 여부를 결정하기 때문에 존재합니다.

개발

Node 20 이상.

npm install
npm test            # vitest, no network
npm run typecheck
npm run lint        # biome

통합 테스트는 실제 포털에 접속하며, 요청하지 않으면 건너뜁니다:

VERGABE_LIVE=1 npm test

커밋은 Conventional Commits를 따릅니다. release-please가 이를 main 브랜치의 릴리스 PR로 변환합니다. 해당 PR을 병합하면 릴리스 태그가 생성되고, 변경 로그가 작성되며, npm에 게시되고, tarball이 GitHub 릴리스에 첨부됩니다. 커밋 유형에 따라 버전 범프가 결정됩니다.

라이선스

MIT.

Available Tools

5 tools
get_export_urlBulk export URLA
Read-only

Builds the URL of the official bulk export for one day or month. The file is a large ZIP, so download it outside this server.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoYYYY-MM-DD, must already be closed.
monthNoYYYY-MM.
formatNoeforms.zip

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
noteYes
formatYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint. The description adds actionable advice: 'download it outside this server' due to the large ZIP size. This enhances transparency beyond the annotations, though it could mention rate limits or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two efficient sentences: the first states the core purpose, and the second provides a critical behavioral caveat. No redundant information, every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose and a key usage note. However, it is missing clarity on whether 'day' and 'month' are mutually exclusive or what happens when both are omitted (all parameters optional). Output schema may fill gaps, but a small clarification would make the description fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (67%), with clear format descriptions for 'day' and 'month' and an enum for 'format'. The tool description adds no further parameter meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Builds the URL') and the resource ('official bulk export for one day or month'). It distinguishes the tool from sibling tools like 'search_tenders' and 'get_tender' by focusing on bulk export URL generation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives or how to choose between the 'day' and 'month' parameters. It only mentions a precondition ('must already be closed') without explaining the use case for each parameter option.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tenderGet one noticeA
Read-only

Fetches a single notice. 'summary' extracts the fields a bidder decides on (deadlines, lot values, suitableFor, document links); the other formats are returned verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNosummary = curated extraction; domain/ocds = full JSON; eforms = original XML.summary
noticeIdYesNotice identifier (UUID) from a search result.
noticeVersionNoVersion like '01'; defaults to the latest published one.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNoVerbatim response body for the non-summary formats.
uriYesCanonical resource URI for the same document.
formatYes
summaryNoOnly for format 'summary'.
noticeIdYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint, correctly indicating no side effects and external data mutability. The description adds value by detailing the behavioral difference between formats: summary is a curated extraction, while other formats are returned verbatim. This goes beyond what annotations offer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the core purpose, the second explains the critical format differentiation. No redundant information; every sentence earns its place. Highly front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has few parameters (all described in schema), an output schema, and comprehensive annotations, the description covers the essential behavioral nuance of formats. It could mention the default version behavior or error handling, but the agent has sufficient information for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaningful context for the 'format' parameter by explaining what 'summary' extracts (deadlines, lot values, suitableFor, document links) and that other formats are verbatim. This enhances agent understanding beyond the schema's enum descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches a single notice, uses a specific verb ('fetches'), and explains the key distinction between the 'summary' format (curated extraction of bidder-relevant fields) and other verbatim formats. This effectively distinguishes it from sibling search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While the description implies the tool is for retrieving a single notice after obtaining an ID from a search, it does not explicitly state when to use it versus alternatives like search_tenders. No exclusion criteria or alternative tools are mentioned, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_codeLook up a CPV or NUTS codeB
Read-only

Resolves a CPV or NUTS code to its official description.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
listYes
languageNode

Output Schema

ParametersJSON Schema
NameRequiredDescription
codeYes
listYes
descriptionNo
descriptionDefaultNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, indicating safe read-only operation with a known set of codes. The description adds no extra behavioral context beyond 'resolves to official description', which is consistent but not additional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words, but it is under-specified rather than efficiently complete. It is concise but sacrifices necessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three parameters (two required, with enums) and an output schema, the description lacks context about code format, case sensitivity, or the nature of the official description. The output schema is not shown, but even with it, the description should provide usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'CPV or NUTS code' hinting at the 'list' and 'code' parameters, but does not explain the 'language' parameter or the expected format of the code. This is insufficient for three parameters with no schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'resolves' and the resource 'CPV or NUTS code' to its 'official description'. It is distinct from siblings like 'search_tenders' which deal with tenders, not code resolution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. The description only states what it does, not when or why to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_tendersSearch German public tendersA
Read-only

Searches lots on oeffentlichevergabe.de. Defaults to open lots of the competition notice types (cn-standard, cn-social, cn-desg, subco, qu-sy, pin-cfc-standard, pin-cfc-social), newest first. Use search_tenders_raw for anything this does not cover.

ParametersJSON Schema
NameRequiredDescriptionDefault
cpvNoCPV code prefixes, OR-ed, e.g. ['72', '7921'].
nutsNoNUTS codes of the place of performance.
pageNo
sortNopublicationDate
textNoFree-text query across the whole notice (allFreeText).
maxValueNoEstimated value in EUR. Set on roughly 8.5% of lots.
minValueNoEstimated value in EUR. Set on roughly 8.5% of lots.
pageSizeNo
platformNoContracting platform host, e.g. 'evergabe-online.de'.
textModeNoHow `text` is matched: all words, any word, or substring.all
onlyActiveNoRestrict to lots that are still open.
noticeTypesNoeForms notice types; defaults to the competition set (cn-standard, qu-sy, …).
suitableForNoBT-726 business types the buyer marked the lot suitable for.
deadlineAfterNoISO date or datetime; keeps lots whose first deadline is later.
sortDirectionNoDESC
contractNatureNo
publishedSinceNoISO date or datetime, inclusive lower bound.
publishedBeforeNoISO date or datetime, inclusive upper bound.
deadlineAtLeastDaysAwayNoKeep lots whose first deadline is at least N days out — bidding runway.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
totalYes
resultsYes
pageSizeYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint. Description adds default filtering and sorting behavior, as well as the specific website. No contradictions. Adds useful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with core action and defaults. Second sentence provides key alternative. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 19 optional parameters, an output schema that documents return values, and a sibling tool reference, the description is sufficiently complete. It covers the tool's purpose, defaults, and when to use an alternative.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 74%, so the schema already documents most parameters. The description mentions defaults for onlyActive, noticeTypes, and sort, but these are already in the schema. No new parameter semantics beyond what schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specifically states it searches lots on oeffentlichevergabe.de with defaults (open lots, competition notice types, newest first). Clearly distinguishes from sibling search_tenders_raw by saying 'use for anything this does not cover'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides default behavior and references an alternative tool for cases not covered. This gives clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_tenders_rawSearch with the native DSLA
Read-only

Posts a WHERE/FROM/PAGE/ORDER query to /bkmk/searches unchanged. Operators: =, >, >=, <, <=, IN, STARTS_WITH, CONTAINS, MATCH_ALL, MATCH_ANY, RANGE_DAYS. Fields on lots: allFreeText, description, allCpvCodes, allContractNatures, active, noticeType, suitableFor (freelance|selbst|startup|other-sme), estimatedValue ('150000 EUR'), publicationDate, firstDeadline, allDeadlines, allPlacesOfPerformanceNutsCodes, contractingPlatform, procedureType, procedureLegalBasis, procedureIdentifier. Text and temporal operators take exactly one operand; IN and STARTS_WITH OR a list. RANGE_DAYS n means field >= midnight Europe/Berlin of today + n days, not a window. See the vergabe://api-reference resource for the full contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
FROMNo'notices' has a smaller field set, rejects active/suitableFor and ignores ORDER.lots
PAGENo
ORDERNoOther fields answer HTTP 500.
WHERENo
SELECTNo'ALL' or a projection of field names.ALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
offsetYes
elementsYes
totalElementsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true. The description aligns: it describes a read operation ('posts a query ... unchanged') and adds behavioral nuances not covered by annotations, such as: 'RANGE_DAYS n means field >= midnight Europe/Berlin of today + n days, not a window', 'Other fields answer HTTP 500' for ORDER, and operator operand constraints. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph. It front-loads the core action and then dumps operators and fields. While every sentence adds value, the lack of bullet points or breaks may hinder quick scanning. However, it is not verbose and efficiently packs necessary information. Could be slightly more structured but still effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters (0 required), nested objects, an output schema, and high complexity, the description covers query structure, operator semantics, field lists, FROM variations, ORDER limitations, and provides a reference to a full contract. It addresses pagination implicitly via PAGE parameter, and mentions error behavior for ORDER. No major gaps for a power-user tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, but the description adds substantial meaning beyond the input schema. It enumerates all operators with their operand requirements (e.g., 'Text and temporal operators take exactly one operand; IN and STARTS_WITH OR a list'), lists all field names on lots with examples (e.g., 'estimatedValue (''150000 EUR'')'), and clarifies constraints like RANGE_DAYS behavior. This compensates for schema gaps and aids correct parameter construction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: 'Posts a WHERE/FROM/PAGE/ORDER query to /bkmk/searches unchanged.' It names the HTTP method (POST), the endpoint, the query structure, and lists operators and fields. This clearly distinguishes it from the sibling 'search_tenders' tool, which likely provides a simpler search interface.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides extensive operator and field listings, guiding the agent on how to construct queries. It also notes that the 'notices' FROM value has a smaller field set. However, it does not explicitly compare with the sibling 'search_tenders' to state when to use this raw DSL version versus a simpler alternative. Missing explicit when-not or alternatives, but the detail implies usage for complex filtering.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv1.0.1
    • First observedget_export_url
    • First observedget_tender
    • First observedlookup_code
    • First observedsearch_tenders
    • First observedsearch_tenders_raw

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct operation: searching tenders, fetching details, raw querying, code lookup, and export URL generation. There is no overlap between their purposes.

Naming Consistency5/5

All tool names follow a clear verb_noun pattern (search_tenders, get_tender, search_tenders_raw, lookup_code, get_export_url). The conventions are uniform and predictable.

Tool Count5/5

Five tools are well-scoped for a public procurement domain. Each tool addresses a necessary function without being excessive or insufficient.

Completeness4/5

Core workflows for searching, fetching, raw querying, code lookup, and export are covered. Minor gaps like bulk export download instructions are handled via external guidance, which is acceptable.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    MCP server providing read access to Swiss public procurement data via the official simap.ch API, covering all cantons and the Confederation with intraday updates. It enables searching tenders, awards, construction codes, and procurement offices through natural language queries.
    9
    160 PyPI
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for Ukrainian public procurement (Prozorro) that exposes tools to search tenders, retrieve tender details and cards, list and read tender documents.
    -