World Monitor
Real-time global intelligence on conflict, markets, energy, trade, shipping and cyber. 102 tools.
Description from the maker (original English)
Swiss official gazettes (SHAB + cantonal) — procurement & notices, person-data rubrics excluded
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"amtsblatt": {
"command": "uvx",
"args": [
"amtsblatt-mcp"
]
}
}
}Run this in your terminal
claude mcp add amtsblatt -- uvx amtsblatt-mcpPaste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"amtsblatt": {
"command": "uvx",
"args": [
"amtsblatt-mcp"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"amtsblatt": {
"type": "stdio",
"command": "uvx",
"args": [
"amtsblatt-mcp"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 10, 2026
The registry name was verified with the GitHub account malkreide, which owns the repo
Code last changed 9 days ago
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 2 of 2 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed 9 days ago, and the latest version (0.23.0) reached the registry 44 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: World Monitor, Claude Flow, Tldraw
Servers in the same category from other makers, sorted by stars.
Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Real-time global intelligence on conflict, markets, energy, trade, shipping and cyber. 102 tools.
AI orchestration with hive-mind swarms, neural networks, and 87 MCP tools for enterprise dev.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
🇨🇭 Part of the [Swiss Public Data MCP Portfolio](https://github.com/malkreide)
MCP server for amtsblattportal.ch — the Swiss official gazette portal
(SHAB + 27 cantonal gazettes). Public procurement and official notices,
person-data rubrics excluded by design.
The Amtsblattportal publishes roughly 2.79 million official notices: public procurement, cantonal and communal announcements, enactments, spatial planning — and also bankruptcies, debt collection, inheritance calls and civil-status records naming natural persons.
This server exposes only the first group. Rubrics carrying systematic natural-person data are not queryable, and no tool accepts a person's name, birth date or address. That is a deliberate data-protection decision, explained in Data Protection & Scope.
Anchor demo query: *"Which public tenders did canton Ticino publish this month?"*
→ gazette_search_procurement(canton="TI", only_language=True, language="it") → gazette_get_publication(id=…)
For procurement in any other canton — including Zürich, Bern and Basel-Stadt — use swiss-procurement-mcp; see Boundary with swiss-procurement-mcp.
OB-ZG was never filled after the simap switch, and that ZH routes everything through simap.ch — so it explains instead of returning nothing. Activity is measured, not read off the rubric labellanguage_mix rather than guessed at, and only_language=True gives a single-language viewprovenancepip install amtsblatt-mcp
uvx amtsblatt-mcp
From source:
git clone https://github.com/malkreide/amtsblatt-mcp
cd amtsblatt-mcp pip install -e ".[dev]"
{
"mcpServers": { "amtsblatt": { "command": "uvx", "args": ["amtsblatt-mcp"] } } }
export MCP_TRANSPORT=streamable-http
export MCP_API_KEY="$(openssl rand -hex 32)" # mandatory — fails loud if unset export PORT=8000 amtsblatt-mcp
The endpoint is `/mcp`.
Migrating from SSE. Until 0.18.0 this server spoke SSE only, on
/sse+/messages. MCP spec2026-07-28reclassifies HTTP+SSE as
deprecated with a twelve-month removal window and removes protocol-level
sessions, so streamable-http is now the default.
MCP_TRANSPORT=ssestill
works and still carries the full bearer-auth, rate-limit and CORS stack — it
logs a warning at startup naming the deadline. **Update the client URL when
you switch**: the path change is the part that breaks silently.
| Variable | Default | Purpose | |||
|---|---|---|---|---|---|
MCP_TRANSPORT | stdio | stdio, streamable-http (alias http), or the deprecated sse | |||
MCP_HOST | 127.0.0.1 | HTTP bind address. Defaults to loopback; set 0.0.0.0 to expose on all interfaces (the Docker image does this deliberately). | |||
MCP_STATELESS | _(on)_ | streamable-http runs with no session tracking at all — the native mode of spec 2026-07-28, which has no protocol-level sessions. Removes session hijacking and session affinity as questions rather than answering them (SEC-009, SCALE-002). 0 / false / no restores sessions for handshake-era clients; any other value keeps the default. Ignored on sse, which has no stateless mode. | |||
MCP_CORS_ORIGINS | _(unset)_ | Comma-separated origins allowed to call the endpoint 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_API_KEY | — | Bearer token; required on every HTTP transport | |||
MCP_RATE_LIMIT / MCP_RATE_WINDOW | 60 / 60 | Sliding-window rate limit | |||
RUBRICS_TTL | 86400 | Taxonomy cache TTL (seconds) | |||
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. |
Built on structlog. Every event emitted during a tool call carries that call's correlation_id, bound via contextvars — so a retry or an egress denial logged deep in the HTTP path can be joined to the request that caused it, without threading context through every signature.
| 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 | upstream retry, egress denied, auth failure, rate limit |
ERROR | a tool call raised |
Records carry the exception *type* only — never its message and never an upstream response body.
{"event":"tool_call_started","tool":"gazette_search_procurement","correlation_id":"23221af26ae640c7","level":"debug","timestamp":"2026-07-27T22:20:07.494276Z"}
{"status":"ok","latency_ms":312,"event":"tool_call","tool":"gazette_search_procurement","correlation_id":"23221af26ae640c7","level":"info","timestamp":"2026-07-27T22:20:07.806Z"}
Ship these to your SIEM and alert on auth_failed, rate_limited, egress_denied, green_gate_violation and blocked_publication_requested — the last two mean something tried to reach a rubric this server does not serve.
| Tool | Signature | Notes |
|---|---|---|
gazette_search_publications | (keyword?, rubric?, sub_rubric?, canton?, date_start?, date_end?, limit=20, page=0, language='de', only_language=False) | Green rubrics enforced. Without rubric, all green rubrics are injected — a keyword-only query can never reach a blocked one. |
gazette_search_detailed | same filters + `top_n=3` | Aggregated. Search *and* full text for the top top_n hits in one call, fetched in parallel. Same green gate on every expanded document; blocked ones are withheld and counted, never rendered. |
gazette_search_procurement | (keyword?, canton?, date_start?, date_end?, include_inactive=False, limit=20, page=0, language='de', only_language=False) | OB-* rubrics plus the gazette-native sub-rubrics AR-VS40, AR-OW40, BA-SH40. A canton with neither gets a simap.ch explainer and no HTTP call. No CPV — the source has none. |
gazette_get_publication | (id, response_format='markdown') | Full official text from XML. Re-checks the rubric after fetching; content from a blocked rubric is discarded. |
gazette_list_rubrics | (language='de', rubric_class='green', response_format='markdown') | rubric_class='all' shows the full taxonomy with traffic-light classes and reasons — listed ≠ queryable. |
gazette_source_status | (response_format='markdown') | Reachability, latency, cache age, scope metrics. |
All tools are readOnlyHint=True.
| Question | Tool chain |
|---|---|
| Tenders in Ticino this quarter | gazette_search_procurement(canton="TI", only_language=True, language="it") |
| Procurement simap.ch does not have | gazette_search_procurement(canton="VS") — 150 Valais awards, none on simap |
| Tenders in any other canton | → use swiss-procurement-mcp |
| What is even queryable here? | gazette_list_rubrics() |
| Why can't I search bankruptcies? | gazette_list_rubrics(rubric_class="all") |
| Zoning changes in Zurich | gazette_search_publications(rubric="RP-ZH") |
| Full text of a notice | gazette_get_publication(id="fbf0ff9e-…") |
| Everything published about one company | → use register-mcp |
The Amtsblattportal systematically publishes personal data of natural persons. Those publications are public — but making them *systematically queryable by name* through an AI agent is a repurposing the publication never intended, and a profiling instrument under the revised Swiss FADP (revDSG).
Four rules follow, and they are enforced in code, not in documentation:
🔴 Konkurse (KK), Schuldbetreibungen (SB), Schuldenrufe (LS, SR), Nachlass (NA), Erbschaft/Testament/Ableben (ES, TE-*, VA-*), Familie & Zivilstand (FZ-*, BV-*, BU-*), gerichtliche Vorladungen (UV, GB-*, GE-*, SJ-BE), Baugesuche (BP-*), Grundbuch (GR-*), Meldungskatalog GR (AA-GR).
🟡 Deferred: Steuerwesen, Anzeigen, Bewilligungen, Bildungs- und Kirchenwesen and the general catch-all rubrics.
The full audit trail — including three documented extensions to the source specification — is in docs/rubric-classification.md.
How much each decision covers is measured, not estimated. docs/coverage-matrix.md enumerates the source's own rubric axis and marks this server's reach into it: 84.2 % of 2 804 063 publications are reachable, 12.6 % blocked by decision, 3.3 % still unclassified. The insolvency group alone is 321 704 publications — present in the source, out of reach here on purpose. Without that figure, "out of scope" and "not in the source" read the same in a review, and this repository made exactly that mistake once (see ARCH-003 in SECURITY.md).
register-mcpFor publications about a specific company, use [register-mcp](https://github.com/malkreide/re