Agentovka
MCP server for accessing Czech datové schránky (ISDS) with legal semantics. Enables AI agents to safely read, send, and archive messages while respecting delivery triggers and deadlines.
README
Agentovka
Agentic access to Czech datové schránky (ISDS) via MCP.
Agentovka is an MCP server that lets AI agents (Claude Desktop, Claude Code, any MCP client) work with a Czech datová schránka through the official ISDS application interface - safely and with the legal semantics of the system treated as a first-class concern.
Not a thin SOAP wrapper. ISDS has legal semantics that a naive client silently violates. Reading your inbox legally delivers your mail and starts statutory deadlines; messages are permanently deleted after 90 days; sending a message is a legal act. Agentovka encodes these facts into the tools themselves. See docs/delivery-semantics.md - the heart of the project.
Why this exists
The ISDS application interface (SOAP web services) may be used by any box owner with their login credentials, without prior registration. But the API mirrors the legal machinery of the system, and an agent that treats a datová schránka like an IMAP inbox will cause real legal consequences:
- Reading triggers delivery. Listing received messages - whether by logging in or via the API (delivery event EV13) - marks all messages in the box as legally delivered (doručeno) and starts statutory deadlines (appeals, etc.). There is no consequence-free "peek".
- Fiction of delivery. If nobody logs in, a message is deemed delivered on the 10th day after it was made available (§ 17 (4) of Act No. 300/2008 Coll.). If that day is a weekend or public holiday, delivery falls on the next working day.
- 90-day deletion. Messages are permanently deleted 90 days after delivery. The Portál občana auto-archiving notably fails for messages delivered by fiction - a real gap that Agentovka's local archive closes.
- Sending is a legal act (a submission to a public authority, a private-law act).
Agentovka's value is exactly this: a safety model and legal-semantics layer on top of a clean, reusable client.
Architecture
Two independent layers in one repository:
| Layer | Package | What it is |
|---|---|---|
| Client library | isds_client |
Pure Python client over the ISDS SOAP interface (via zeep, HTTP Basic auth over TLS). Typed pydantic models, a ZFO/CMS parser, and a small CLI. Usable standalone, without MCP. |
| MCP server | agentovka_mcp |
A thin MCP layer over the library, using the official MCP Python SDK (FastMCP), stdio transport. Implements the safety model and the local archive. |
The safety model
Tools are split into three classes, reflected in their names, descriptions and MCP annotations:
Class A - safe, no legal consequences (readOnlyHint)
search_databox(query)- find a recipient's box (ID, name, type).get_databox_info()- info about your own box.list_archived_messages(),read_archived_message(id),search_archive(q)- read from the local archive only (no ISDS call).list_sent_messages(),get_delivery_receipt(id)- sent messages and their delivery receipts. These do not touch the received store and so do not trigger delivery (see delivery-semantics).get_delivery_deadline(delivery_date)- computes the fiction-of-delivery date (D+10, shifted to the next working day) using Czech public holidays.
Class B - triggers delivery (event EV13)
list_received_messages(...),download_message(id).- Each requires a mandatory
acknowledge_delivery_trigger: bool. Withouttruethe tool returns an error explaining the legal consequences instead of acting. download_messagefetches the signed message (ZFO), stores it in the local archive, extracts attachments (the ZFO is a PKCS#7/CMS envelope), and returns metadata plus text content.
Class C - legal act: sending (destructiveHint)
send_message(recipient_id, subject, attachments, dry_run=true).- Defaults to
dry_run=true(returns a preview). Actually sending requiresdry_run=falseandAGENTOVKA_ALLOW_SEND=truein the environment.
The server never polls the mailbox on its own - no background jobs, no scheduler. Every ISDS call happens only in response to an explicit tool call.
Installation & configuration
Run with uv:
uvx agentovka # once published to PyPI
# or from a clone:
uv run agentovka
All configuration is via environment variables - credentials are never accepted as tool parameters (they would leak into the LLM context):
ISDS_USERNAME=...
ISDS_PASSWORD=...
ISDS_ENV=test # test | production (default: test)
AGENTOVKA_ARCHIVE_DIR=~/.agentovka/archive
AGENTOVKA_ALLOW_SEND=false # default: sending disabled
ISDS_ENV=test is the default on purpose - nobody should accidentally deliver
their production mail while trying the server out. The test environment is free:
create a test box at datovka-test.gov.cz
(SOAP host ws1.czebox.cz).
Claude Desktop / Claude Code
Add to your MCP client config (e.g. claude_desktop_config.json):
{
"mcpServers": {
"agentovka": {
"command": "uvx",
"args": ["agentovka"],
"env": {
"ISDS_USERNAME": "your-test-username",
"ISDS_PASSWORD": "your-test-password",
"ISDS_ENV": "test",
"AGENTOVKA_ALLOW_SEND": "false"
}
}
}
}
See examples/ for ready-to-copy configs.
Using the library standalone
from isds_client import IsdsClient, IsdsEnvironment
client = IsdsClient(username="...", password="...", environment=IsdsEnvironment.TEST)
print(client.get_owner_info())
# Parse a ZFO file with no network access:
from isds_client.zfo import parse_zfo
parsed = parse_zfo(open("message.zfo", "rb").read())
print(parsed.envelope, parsed.files)
CLI:
isds-client owner-info
isds-client find "Ministerstvo vnitra"
isds-client parse message.zfo # offline
Development
uv sync --group dev
uv run pytest # unit tests (mocked SOAP)
uv run ruff check .
uv run mypy
# integration tests against the TEST environment (opt-in):
AGENTOVKA_RUN_INTEGRATION=1 ISDS_USERNAME=... ISDS_PASSWORD=... uv run pytest -m integration
See CONTRIBUTING.md.
Prior art & credits
- WSDL/XSD schema files are the ISDS interface descriptions distributed by CZ.NIC's dslib (LGPL).
- ZFO/CMS handling follows the approach of the maintained reference implementations libdatovka and the Datovka desktop app (CZ.NIC), and clean Python references such as isds-unpack.
⚠️ Disclaimer
Agentovka is an independent open-source project. The name Agentovka is a play on datovka (datová schránka): an agent's datovka.
This project is not a legal service. The information about delivery, fiction of delivery, deadlines and archiving is provided for engineering context and may be simplified or become outdated. It is not legal advice. For binding information consult the ISDS operating rules (Provozní řád ISDS), the relevant statutes, or a qualified lawyer.
Use against the test environment until you understand the legal consequences of each tool. You are responsible for what you send and for the deadlines that your reads set in motion.
Česky
Agentovka je MCP server, který umožní AI agentům (Claude Desktop, Claude Code, libovolný MCP klient) pracovat s českou datovou schránkou přes oficiální aplikační rozhraní ISDS - bezpečně a s ohledem na právní sémantiku systému.
Proč to není jen tenký SOAP wrapper
ISDS má právní sémantiku, kterou naivní klient tiše porušuje:
- Čtení spouští doručení. Načtení seznamu dodaných zpráv (přihlášením i přes API - doručenkový kód EV13) způsobí, že se všechny dodané zprávy považují za doručené a začnou běžet zákonné lhůty. „Peek" bez následků neexistuje.
- Fikce doručení. Nepřihlásí-li se nikdo, je zpráva doručena 10. dnem od dodání (§ 17 odst. 4 zák. č. 300/2008 Sb.); padne-li 10. den na víkend/svátek, nastává fikce nejbližší pracovní den.
- Mazání po 90 dnech. Zprávy se 90 dní po doručení trvale mažou. Automatická archivace Portálu občana navíc nezvládá zprávy doručené fikcí - tuto díru řeší lokální archiv Agentovky.
- Odeslání je právní úkon.
Podrobně a se zdroji: docs/delivery-semantics.md.
Bezpečnostní model
- Třída A (bezpečné):
search_databox,get_databox_info, čtení lokálního archivu,list_sent_messages,get_delivery_receipt,get_delivery_deadline. - Třída B (spouští doručení, EV13):
list_received_messages,download_message- vyžadují parametracknowledge_delivery_trigger=true, bez něj vrátí chybu s vysvětlením právních následků. - Třída C (právní úkon):
send_message- výchozídry_run=true; skutečné odeslání vyžadujedry_run=falseaAGENTOVKA_ALLOW_SEND=true.
Server se nikdy sám od sebe nedotazuje schránky. Vše jen na explicitní volání nástroje.
Konfigurace
Výhradně přes proměnné prostředí (přihlašovací údaje nikdy neprotékají do LLM
kontextu jako parametry nástrojů). Výchozí ISDS_ENV=test je záměrný bezpečnostní
prvek. Testovací schránku zdarma získáte na
datovka-test.gov.cz.
Upozornění
Agentovka je nezávislý open-source projekt. Název je odvozenina slova datovka. Projekt není právní služba - uvedené informace nejsou právní radou.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。