Korean Government Documents (HWPX)
Turns a draft into a Korean government report or press release as HWPX in each ministry's format
作者による説明(英語の原文)
Swiss public procurement (simap.ch): tenders, awards, CPV codes, all cantons + federal, read-only
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"swiss-procurement": {
"command": "uvx",
"args": [
"swiss-procurement-mcp"
]
}
}
}ターミナルでこれを実行します
claude mcp add swiss-procurement -- uvx swiss-procurement-mcpプロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"swiss-procurement": {
"command": "uvx",
"args": [
"swiss-procurement-mcp"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"swiss-procurement": {
"type": "stdio",
"command": "uvx",
"args": [
"swiss-procurement-mcp"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月10日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント malkreide で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(0.19.0)がレジストリに届いたのは44 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。
同じカテゴリには:Korean Government Documents (HWPX), Sanctions & Tariff Lookup, RAEN x402 Gateway
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Turns a draft into a Korean government report or press release as HWPX in each ministry's format
Screen names on US, UN, UK and EU sanctions lists; US HTS codes and total duty by origin.
RAEN paid x402 MCP tools: law lookup, dispute letters, image gen, contract analysis. USDC on Base.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
Part of the [Swiss Public Data MCP Portfolio](https://github.com/malkreide/swiss-public-data-mcp) — open-source MCP servers connecting AI agents to Swiss public and open data.
This is a private project. It is independent of any employer or institutional affiliation and represents no official position of any authority.
MCP server for Swiss public procurement — read access to the official simap.ch API, covering all cantons and the Confederation, updated intraday.
*«Which school-building tenders did the City of Zurich publish in 2026, which BKP construction categories do they concern, and who are the procuring offices?»*
A single search_procurements_detailed(query="Schulhaus", canton="ZH", published_from="2026-01-01") returns the leading tenders already expanded with their BKP construction codes and procuring offices — connecting procurement to school-building planning in one call (optionally paired with search_construction_codes to resolve a category).
Swiss public procurement is published on simap.ch. The platform's web UI is searchable by hand, but the amtsblatt-mcp server only reaches the three cantons (AR, BS, TI) that still mirror tenders to the Amtsblattportal — Zurich among the missing.
simap closes that gap: it operates a documented OpenAPI 3 read API (v1.5.1) whose search and detail endpoints are marked security: None and are callable without authentication. This server wraps exactly those read endpoints.
Mnemonic: *The web UI is the front door; the API is the loading dock. Probe the dock.*
Architecture A (live API only, short-lived cache).
my/ / OIDC-protected endpoints (publishing tenders, submitting offers) are out of scope — this server never writes.Every response carries source and provenance (live_api / cached / degraded). Upstream failure yields a degraded envelope, never a silent empty list.
| Endpoint | Auth | Result |
|---|---|---|
/publications/v2/project/project-search | none | 20 hits, canton filter, current-day |
/publications/v1/.../publication-details/... | none | full record: criteria, deadlines, codes |
/publications/v1/publication/{id}/past-publications | none | project lifecycle |
/codes/v1/cpv/search | none | CPV full-text search |
/codes/v1/{bkp,npk,ebkp-h,ebkp-t,oag,cpc}/search | none | Swiss construction codes |
/procoffices/v1/po/public | none | ~1 MB office list (client-side filter) |
/cantons/v1, /countries/v1 | none | reference data |
www.simap.ch/api. The simap.ch/de web UI is a separate SSR app that exposes none of it — probing the UI produced an earlier, mistaken "no API" verdict.E0025), not an empty result. The client injects a default.newestPubTypes=award returns HTTP 400. Awards are split by procedure: award_tender, award_study_contract, award_competition, direct_award. The search_awards tool queries all four.ZH, not CH-ZH. Passing an ISO subdivision code silently matches nothing; this server rejects it with a clear error.| Tool | Purpose |
|---|---|
search_procurements | Search projects by canton, CPV, process type, date, text |
search_procurements_detailed | Search + full detail for the top *n* hits in one call (aggregated) |
search_awards | Awarded contracts only (all four award types at once) |
get_procurement_details | Full record for one publication |
get_publication_history | Earlier publications of the same project (tender → award) |
search_cpv_codes | Resolve keywords to CPV classification codes |
search_construction_codes | Swiss construction codes (BKP, NPK, eBKP, OAG, CPC) |
find_procurement_office | Public procurement offices by partial name |
source_status | Reachability and latency of the simap.ch API |
All tools carry readOnlyHint, idempotentHint and openWorldHint (they query the live simap.ch API).
Every tool takes a single validated argument object. Bounds, allow-lists and patterns are declared on the input models in inputs.py — so an out-of-range limit or an unknown canton is rejected before any upstream request, and the constraints are visible to the model in the tool schema rather than buried in the tool body:
search_procurements({"canton": "ZH", "query": "Schulhaus", "limit": 20})
The models set strict=True (no silent "10" → 10 coercion) and extra="forbid" (unknown fields are rejected, not ignored). The canton, process type, publication type, code system and language allow-lists are derived from constants.py, so they cannot drift from the probe-verified tables.
canton= meanssimap offers exactly one geographic filter, orderAddressCantons, and it selects by where the work is delivered — not by who is procuring. When a procuring office files a free-text address, the structured canton is null and the publication is invisible to that filter. Measured CH-wide over 500 projects published since 2026-07-01: 303 (60.6%) carry no canton, among them the Amt für Hochbauten Zürich, Grün Stadt Zürich, USZ, BBL and SBB.
canton_match therefore makes the question explicit:
| Value | Matches | Zurich, 2026-07-01…27 |
|---|---|---|
procuring_body *(default)* | procured by that canton's public bodies, incl. communal and subordinate offices (issuedByOrganizations) | 410 projects |
place_of_delivery | the work is delivered there (orderAddressCantons) | 263 projects |
both | union of the two; two upstream calls, no pagination | 441 projects |
The 31 projects only place_of_delivery finds are federal bodies procuring in Zurich (ETH, Empa, Flughafen Zürich AG) — a different question, not a gap, which is why this is three explicit semantics rather than a silent union.
Every response states in note which semantics were applied.
register-mcp.zh-education-mcp.amtsblatt-mcp with national coverage instead of three cantons.uvx swiss-procurement-mcp
{
"mcpServers": { "swiss-procurement": { "command": "uvx", "args": ["swiss-procurement-mcp"] } } }
MCP_TRANSPORT=sse HOST=0.0.0.0 PORT=8000 python -m swiss_procurement_mcp
docker compose up --build # SSE on :8000
The image is multi-stage and runs as a non-root system user. compose.yaml adds a read-only root filesystem, drops all capabilities, sets no-new-privileges, and caps memory, CPU and PIDs. No secret is needed at runtime — the wrapped simap.ch endpoints are public.
CI builds the image on every push and asserts both properties that matter: that the container does not run as uid 0, and that the server still imports under --read-only --cap-drop ALL.
| Variable | Default | Purpose | |||
|---|---|---|---|---|---|
MCP_TRANSPORT | stdio | stdio \ | sse \ | streamable-http | |
MCP_HOST / HOST | 127.0.0.1 | HTTP binding (cloud transports only). Defaults to loopback; set 0.0.0.0 explicitly to expose all interfaces in a cloud deployment. | |||
MCP_CORS_ORIGINS | _(unset)_ | Comma-separated origins allowed to call the HTTP transports from a browser. Unset means no cross-origin browser access at all — stdio and non-browser clients are unaffected. Mcp-Session-Id is exposed and accepted for the listed origins, so a browser client can hold a session. * is honoured but logs a warning and disables credentials, because browsers reject a wildcard origin together with credentials. | |||
MCP_STATELESS | _(off)_ | Set to 1 to run the streamable-http transport with no session tracking. Removes session affinity as a concern for multi-instance deployments; gives up SSE stream resumption and server-initiated notifications. No effect on the legacy SSE transport, which logs a warning if asked. See docs/load-balancing.md. | |||
PORT / MCP_PORT | 8000 | HTTP port (cloud transports only) | |||
LOG_LEVEL | INFO | DEBUG \ | INFO \ | WARNING \ | ERROR. Structured JSON, one object per line, always on stderr — stdout carries the MCP protocol on a stdio transport. |
No API keys — the wrapped simap.ch read endpoints are fully public.
Built on structlog. Every event emitted during a tool call carries that call's correlation_id, bound via contextvars — so a failure logged deep inside the HTTP client can be joined to the request that caused it without threading context through every function.
| Level | Emitted when |
|---|---|
DEBUG | a tool call was entered (tool_call_started) — tells you whether a hung call ever started |
INFO | a tool call finished cleanly, with latency |
WARNING | simap.ch was unreachable or errored (upstream_degraded) |
ERROR | a tool call raised |
Records carry the exception *type* only — never its message and never an upstream response body (OBS-002).
{"event":"tool_call_started","tool":"search_procurements","correlation_id":"23221af26ae640c7","level":"debug","timestamp":"2026-07-27T22:20:07.494276Z"}
{"status":"ok","latency_ms":312,"event":"tool_call","tool":"search_procurements","correlation_id":"23221af26ae640c7","level":"info","timestamp":"2026-07-27T22:20:07.806Z"}
| Served via the `initialize` handshake | 2024-11-05 … `2025-11-25` — the handshake ceiling |
| Served via the per-request envelope | `2026-07-28` |
| Who picks | The client's first request, once per connection. A request carrying the 2026-07-28 _meta envelope opens a modern connection; anything else opens a handshake connection. |
| Pinned in | MCP_PROTOCOL_VERSION in server.py |
| SDK | mcp>=2.0.0,<3 |
| Cache hints | tools/list,
冒頭だけを表示しています。続きはリポジトリで読めます