sanalert-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sanalert-mcpwhat's the air threat level in Przemyśl right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SanAlert for AI assistants
The unofficial threat level from the air for a place in Poland, for an AI assistant that can run a local MCP server (Claude Code, Claude Desktop and others). Ask it "what is the level in Przemyśl?" and the assistant gets the answer the website would show for that place. Not an official warning system: it does not replace sirens, Alert RCB or instructions from the services.
What it does, and what it sends
It runs on your computer and talks to the assistant over stdio.
When the assistant asks about a place, it fetches
https://api.sanalert.pl/v1/state, the same public document the website and the apps read: at most once every 5 s, withIf-None-Matchand the User-AgentSanAlert-MCP/<version>. Once per run it fetches the public grid (/v1/grid/1.json) to find the place's ~11 km square and its voivodeship.It looks the place's level up in that document with the rules SanAlert's website and apps follow (sanalert.pl/jak-to-dziala). The place stays on your computer: no request carries it, and a town's name is never looked up online.
The privacy page says the same (sanalert.pl/prywatnosc, "Serwer SanAlert dla asystentów AI"). Terms (Regulamin, Умови).
Related MCP server: machine-mcp
The tool
sanalert_level takes place, one of the website's towns (Przemyśl, Lublin, Rzeszów, Chełm and
the rest of its list; Polish letters optional, and Warsaw and Cracow work too), or latitude and longitude, and language:
pl, en or uk.
Field | What it is |
|
|
| the level's name and the website's sentence under it, in the chosen language |
| what raised the level, as the website shows it |
| as in the state; |
| whether the level can be trusted now, and why not |
| the town or the point, its square ( |
| RCB and RSO messages in force for the voivodeship; |
| what has to stay with the data wherever it is shown |
Blind is not calm. When the document is missing, cannot be read or is older than 60 s, or the
grid cannot be read, the level is no_data, never quiet, and say says so. The age is never less
than the time the server has held the document, so a computer clock that runs behind cannot keep an
old "quiet" fresh while the API is down. A point outside
Poland's grid is out_of_range. A name that is not on the list is an error that names the list:
give coordinates instead.
For the whole of Poland (the state summarised, official messages of the last 24 hours, night
reports, the reliability record) SanAlert runs a remote MCP server, https://api.sanalert.pl/mcp.
It takes no place.
Install
It needs uv.
Claude Code:
claude mcp add sanalert -- uvx --from git+https://github.com/plrojek/sanalert-mcp sanalert-mcp
claude mcp add --transport http sanalert-poland https://api.sanalert.pl/mcp # optional: the whole of PolandClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"sanalert": {
"command": "uvx",
"args": ["--from", "git+https://github.com/plrojek/sanalert-mcp", "sanalert-mcp"]
}
}
}Conditions of use
Whoever shows or repeats the data keeps notice visible with it and a visible link to every
attribution entry, always refers readers to the official air-raid alarms (sirens, Alert RCB, the
instructions of the authorities), keeps a visible link to NEPTUN (https://neptun.in.ua, for example
"Дані: Карта повітряних тривог — NEPTUN") next to the level, never turns no data into quiet, and
says that the level is SanAlert's inference, not an official warning. In full:
terms and the API description.
Development
uv run pytest runs the tests; none of them goes online.
Three files in src/sanalert_mcp/ are generated, never edited by hand:
core.pyis the Home Assistant integration'score.py, the same rules in the same words;towns.jsonis the apps' town list (ios/SanAlertKit/Sources/SanAlertKit/Resources/towns-v1.json, made from the website'sweb/src/lib/cities.ts);api_texts.jsonis the API's notice, attribution and pass-through (api/sanalert/state.py,api/sanalert/mcp_server.py).
python scripts/sync.py copies the first two and python scripts/sync.py --check fails on any
difference (CI runs it). The API's tests fail when api_texts.json no longer matches the API.
The source is integrations/mcp/ in SanAlert's own repository; the public repository
(github.com/plrojek/sanalert-mcp) is a copy of it, refreshed with each release, so a fix in
core.py reaches users with the next release.
License
MIT, Applied AI sp. z o.o.
Available Tools
1 toolsanalert_levelARead-onlyIdempotent
SanAlert's level right now for one place in Poland, worked out on this computer: quiet, activity,
approaching or near, the website's sentence about it (say), what raised it, the official RCB and RSO
messages in force for the place's voivodeship, and whether the data can be trusted now (data: ok,
delayed or no_data; no_data is never quiet). Give one of SanAlert's towns or the coordinates. The place
is never sent anywhere: the server fetches the same public documents everybody gets.
| Name | Required | Description | Default |
|---|---|---|---|
| place | No | One of SanAlert's towns, e.g. Przemyśl, Lublin, Rzeszów or Chełm (Polish letters optional). Leave it out when you give coordinates. | |
| language | No | The language of level_name and say. | en |
| latitude | No | The place's latitude, in degrees. | |
| longitude | No | The place's longitude, in degrees. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the data-trust states (ok/delayed/no_data) and the rule that no_data is never quiet, plus the privacy guarantee that the place is never sent anywhere and the server only fetches public documents. These are the kind of semantics that change how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first clause is well front-loaded, but the description then runs as one very long sentence that enumerates return fields ('the website's sentence about it', 'what raised it', the RCB/RSO messages) which the output schema likely already provides. The privacy sentence earns its place; the field enumeration is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with a full schema, an output schema and covering annotations, the description supplies the remaining context an agent needs: input alternatives, data-staleness semantics and privacy. It is slightly over-complete on return fields but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented (place as a town or omit for coordinates, language controlling level_name and say, lat/long bounds). The description restates the town-or-coordinates choice without adding format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (SanAlert's current level for one place in Poland) and the scope of the answer (quiet/activity/approaching/near). It is clear what the agent gets back, though the verb is implicit ('SanAlert's level right now') rather than stated as an action. With no sibling tools, no differentiation is needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent what to supply ('Give one of SanAlert's towns or the coordinates'), which is input guidance rather than when-to-use guidance. There are no alternative tools and no stated when-not-to-use conditions, so usage is only implied by the place/coordinates split.
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 tool update
v0.1.0- First observed
sanalert_level
TDQS
Scored across 1 tool
Only one tool exists, so there is no risk of selecting the wrong tool. Its description clearly defines a single purpose: retrieving SanAlert level and related alerts for a specified place in Poland.
The single tool name sanalert_level is descriptive, uses snake_case, and aligns with the server name. With only one tool, there is no inconsistent convention to compare.
A single tool is thin for an MCP server, even though the tool itself is comprehensive. The rubric treats 1-2 tools as borderline, and there is no ability to split concerns across multiple operations.
The tool covers current level, messages, and data trust for one place, but there is no way to discover valid town names or coordinates, nor to query multiple places or historical data. This is a notable gap for an agent that does not already know the exact input.
Maintenance
Related MCP Connectors
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Local ML: speech to text (SRT/VTT), text embeddings, reranking, similarity, entities, zero-shot.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Real-time planetary signal engine and Model Context Protocol (MCP) server for autonomous AI agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides integrated access to location-based weather, reporting history, and infrastructure status data for safety reporting systems. It supports both SSE and stdio protocols for flexible integration with various AI agents and clients.-
- AlicenseAqualityBmaintenanceEnables an AI agent to run local tools on the user's own machine via stdio, including command execution, workspace file read/write, and system status checks.52MIT
- FlicenseBqualityBmaintenanceEnables an AI assistant to read and manage a local project-management database over stdio: listing and creating projects, tasks, expenses, chats and people, and pulling money, margin, deadline and overdue summaries. It runs on the same service layer and SQLite file as the bundled web UI, so figures shown to the assistant and to the human always agree.14-

recordist-gatewayofficial
AlicenseNot gradedqualityBmaintenanceLets an AI assistant search and read the meetings recorded by Recordist on your own computer: transcripts, action items and notes. Local stdio server that talks only to the app's loopback API or its SQLite file; nothing leaves the machine.507 npmMIT