Skip to main content
Glama
malkreide

swiss-procurement-mcp

by malkreide

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
HOSTNoAlias for MCP_HOST.127.0.0.1
PORTNoHTTP port (cloud transports only).8000
MCP_HOSTNoHTTP binding (cloud transports only). Defaults to loopback; set 0.0.0.0 to expose all interfaces.127.0.0.1
MCP_PORTNoAlias for PORT.8000
LOG_LEVELNoLog level: DEBUG, INFO, WARNING, ERROR. Logs to stderr.INFO
MCP_STATELESSNoSet to '1' to run streamable-http with no session tracking.0
MCP_TRANSPORTNoTransport mode: stdio, sse, or streamable-http.stdio
MCP_CORS_ORIGINSNoComma-separated origins allowed to call the HTTP transports from a browser. Unset means no cross-origin browser access at all.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
search_procurementsA

Find open tenders matching a topic, canton, CPV code or date window — the default entry point when the question is "what is being tendered?".

Search Swiss public procurement projects on simap.ch.

Covers all cantons and the Confederation, updated intraday. This is the entry point; use get_procurement_details with the returned ids for the full record.

Note that simap indexes PROJECTS, not publications: one hit is one project, represented by its NEWEST publication. A project tendered in March and awarded in July appears once, as the July award. Use get_publication_history to see the earlier publications of a project.

At least one filter is required — simap answers a filterless query with nothing rather than everything.

Args: query: Free-text search over titles and descriptions. canton: Bare canton id, e.g. ZH (NOT CH-ZH). See CANTON_IDS. canton_match: How canton is interpreted. procuring_body (default) — procured by that canton's public bodies, including communal and subordinate offices. place_of_delivery — the work is delivered there. Beware: ~60% of publications carry no structured order address and are invisible to this filter. both — the union of the two. Costs two upstream calls and does not support cursor. cpv_codes: One or more CPV classification codes. Resolve names to codes with search_cpv_codes first. process_type: One of open, selective, invitation, direct, no_process. pub_type: Publication type. For awarded contracts use one of award_tender, award_study_contract, award_competition, direct_award — a plain "award" is rejected by the API. published_from / published_until: ISO dates YYYY-MM-DD. These filter on the NEWEST publication date of a project. cursor: Pagination cursor from a previous response's next_cursor. language: de, fr, it or en.

search_procurements_detailedA

Answer a question needing both the hit list and each hit's detail in one step, e.g. "which school-building tenders ran in ZH and what BKP codes do they carry?". Prefer this over search_procurements followed by N detail calls.

Search publications and return the FULL record for the top matches at once.

Aggregated entry point for the common "find tenders and show me their details" question: it runs the search and then fetches get_procurement_details for the first top_n hits in parallel, so a typical query is answered in a single tool call instead of a search-then-N-details chain. Each result carries the CPV and Swiss construction codes (BKP, NPK), deadlines and procurement office.

Prefer search_procurements when you only need the summaries or want to paginate; use this when you want the leading hits fully expanded immediately.

Args: top_n: How many of the top hits to expand to full detail (1-5). query, canton, canton_match, cpv_codes, process_type, pub_type, published_from, published_until, language: identical to search_procurements — including the canton_match semantics, which default to matching the procuring body.

search_awardsA

Find who won, not what is open — all four award types at once. Use when the question is about completed procurement rather than current opportunities.

Search only awarded contracts (who won).

Convenience wrapper over search_procurements that queries all four award publication types at once.

Two coverage caveats. First, award coverage is uneven across cantons — some publish awards diligently, others rarely, so absence is not proof that no award happened. Second, the filter matches a project's NEWEST publication: a project awarded in May and corrected in June is no longer an "award" to this filter and drops out. Use get_publication_history on a project to see whether an award exists further back.

canton_match works exactly as in search_procurements and defaults to matching the procuring body.

get_procurement_detailsA

Retrieve the full record for one publication once you have its ids: criteria, deadlines, classification codes and the procuring body.

Return the full record for one procurement publication.

Both ids come from a search_procurements result. The record includes the order description, CPV and Swiss construction codes (BKP, NPK), deadlines and the procurement office — the BKP codes make this joinable with construction cost data and school-building planning.

get_publication_historyA

Trace one project through time — tender to award to correction. Use when the question is "what happened to this procurement?".

Return earlier publications of the same procurement project.

Traces a project's lifecycle: tender → correction → award. An empty list is normal for a first publication.

search_cpv_codesA

Translate a keyword into the CPV classification codes needed to filter a search. Call this first when the user names a subject rather than a code.

Search CPV classification codes by keyword.

CPV (Common Procurement Vocabulary) is the international code system used to filter search_procurements by category. Resolve a keyword like "Metall" to its code here, then pass the code to search_procurements(cpv_codes=[...]).

search_construction_codesA

Translate a keyword into Swiss construction cost codes (BKP, NPK, eBKP, OAG, CPC) — the bridge between a building topic and procurement filters.

Search Swiss construction classification codes by keyword.

Args: system: One of bkp, npk, ebkp-h, ebkp-t, oag, cpc. query: Keyword.

These are the Swiss construction cost standards (Baukostenplan, Normpositionen- katalog) used in building tenders — relevant for school-building procurement.

find_procurement_officeA

Resolve a partial organisation name to the procuring offices simap knows, when the user names an authority rather than a project.

Find public procurement offices by (partial) name.

The public office list is large (~1 MB), so this fetches it once and filters client-side. Returns the office id, type (cantonal / federal / communal) and the linked institution id.

source_statusA

Check whether simap.ch is reachable and how fast it is responding. Call this when a search returns nothing and you need to distinguish "no matching tenders" from "the source could not be asked" — the two are not the same answer.

Report reachability and latency of the simap.ch read API.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/swiss-procurement-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server