prawo-pl-mcp

prawo-pl-mcp

Unified MCP server for Polish legal data, enabling search and retrieval across case law, legislation, company register, tax rulings, public procurement, and EU sources through four aggregated tools.

Category
访问服务器

README

prawo-pl-mcp

<!-- mcp-name: io.github.matematicsolutions/prawo-pl-mcp -->

One MCP server for Polish legal data.

Ten independent connectors - case law, legislation, the company register, tax rulings, public procurement, data-protection decisions, plus EU extras - behind four tools. Each connector stays a separate package with its own repository; this server spawns them on demand and translates between their conventions.

"Prawo" is Polish for "law"; the name follows yargi-mcp's move of naming a country server in its own language.

Why an aggregator

The connectors cover Polish legal data well, but as separate MCP servers, one per database - ten installs and ten config entries before the first question. yargi-mcp showed the fix for Turkish law: 16 institutions, one server. prawo-pl-mcp does the same for Poland:

  • Four tools instead of 42. pl_list_sources, pl_search, pl_get_document, pl_call - fewer tool schemas means less context spent before the LLM starts working.
  • One convention. The connectors grew organically: dateFrom here, date_from there, pages counted from 0 or from 1 depending on the repo. Here page is always 1-based and dates are always date_from/date_to (YYYY-MM-DD); the translation happens inside. One name per concept applies to the aggregator's own tools too: page is the page parameter of both pl_search and pl_get_document (page_number still works as a deprecated alias), and pl_call takes arguments or its alias args.
  • Native names on the table. Every catalog entry carries native_params - the native parameter name each unified one maps to for that source, so article_number (eu-compliance) is visible without spawning the connector or reading an upstream error. pl_call checks the names it was given against the connector's own schema and says which one it meant.
  • Nothing preinstalled. Connectors run as subprocesses via npx -y / uvx, downloaded on the first call to a given source and kept alive afterwards. A source that cannot start reports a readable error while the rest keep working.
  • Paginated documents. Full judgment and act texts are chunked at ~5000 characters per page (yargi-mcp's pattern), so a 200-page ruling does not flood the context window. Sources that paginate server-side (isap) get the page forwarded natively and are reported as pagination: "native" - the aggregator does not re-cut an already-cut page and does not invent a total_pages it cannot know.

Coverage

Source id What Institution / database Connector Runtime
saos Case law: common courts, Supreme Court, Constitutional Tribunal + citator SAOS mcp-saos npx
nsa Case law: administrative courts (NSA + 16 WSA) CBOSA mcp-nsa npx
isap Legislation: Dziennik Ustaw + Monitor Polski, 96k+ acts Sejm ELI API mcp-isap npx
krs Company register: extracts, history, board composition KRS API (Ministry of Justice) mcp-krs npx
eureka Tax rulings: 550k+ individual interpretations EUREKA (Ministry of Finance) mcp-eureka npx
kio Public procurement: National Appeal Chamber rulings orzeczenia.uzp.gov.pl kio-orzeczenia-mcp uvx
uodo GDPR enforcement: Polish DPA decisions, fines, stats orzeczenia.uodo.gov.pl uodo-orzeczenia-mcp uvx
eu-sparql EU law: EUR-Lex by CELEX, CJEU by ECLI, GDPRhub Cellar SPARQL mcp-eu-sparql npx
eu-compliance 14 EU regulations offline (GDPR, AI Act, DORA, NIS2...) Local SQLite corpus mcp-eu-compliance npx
legalize Law-as-git: 32 jurisdictions, versioned by commit legalize-dev legalize-mcp uvx

Polish sources are tagged group: pl, EU extras group: eu - filter with pl_list_sources(group="pl").

Tools

Tool What it does
pl_list_sources Catalog of sources (no subprocess spawned). With source_id: live tool schemas of one connector.
pl_search Search any source with normalized parameters; source-specific filters via extra.
pl_get_document Full document by identifier (judgment id, ELI, KRS number, signature...), paginated.
pl_call Any native tool of any connector: citator, DPA statistics, board composition, regulation comparison...

The typical flow an LLM follows (spelled out in the server's instructions): pl_list_sources → pl_search → pl_get_document, with pl_call for the specialized tools each connector brings.

Install

Requires Python ≥ 3.11 plus the runtimes of the sources you use: Node.js ≥ 18 for npx sources, uv for uvx sources. If a runtime is missing, its sources report source_unavailable and the rest work.

Claude Code

claude mcp add pl-legal -- uvx prawo-pl-mcp

Claude Desktop / any MCP client (stdio)

{
  "mcpServers": {
    "pl-legal": {
      "command": "uvx",
      "args": ["prawo-pl-mcp"]
    }
  }
}

Remote (Streamable HTTP)

uvicorn prawo_pl_mcp.asgi:app --host 0.0.0.0 --port 8000

Open by default (public, read-only data). Set PRAWO_PL_MCP_API_KEY to require X-API-Key: <key> or Authorization: Bearer <key> on every request.

Configuration

Env Default Meaning
PRAWO_PL_MCP_CMD_<ID> - Override the spawn command for a source, e.g. PRAWO_PL_MCP_CMD_SAOS="node C:/dev/mcp-saos/dist/index.js" for a local checkout. <ID> = source id, uppercase, - → _.
PRAWO_PL_MCP_INIT_TIMEOUT 180 Seconds allowed for a connector's first start (includes package download).
PRAWO_PL_MCP_TIMEOUT 90 Seconds per tool call after startup.
PRAWO_PL_MCP_AUDIT_DIR ~/.matematic/audit Where the JSONL audit log goes.
PRAWO_PL_MCP_API_KEY - ASGI mode only: require this API key (dual-channel).

Architecture

The aggregator is a thin proxy (ADR 0001). Connectors are not imported, vendored or forked; the aggregator speaks MCP to them over stdio the same way any client would. The whole layer is a source registry (one dataclass entry per connector), a lazy subprocess pool, a parameter translator and a paginator. Adding a source means adding a registry entry.

LLM client ──MCP──▶ prawo-pl-mcp ──MCP/stdio──▶ npx @matematicsolutions/mcp-saos
                        │         ──MCP/stdio──▶ uvx kio-orzeczenia-mcp
                        │         ──MCP/stdio──▶ ... (spawned on first use)
                        └─ registry + param mapping + 5000-char pagination

Every call lands in a JSONL audit log (timestamp, tool, source, parameter hash, latency - never document content).

Development

git clone https://github.com/matematicsolutions/prawo-pl-mcp && cd prawo-pl-mcp
uv sync --extra dev
uv run pytest          # offline tests: registry, dispatch mapping, pagination, drift
uv run prawo-pl-mcp    # stdio server

License

Apache-2.0. Individual connectors carry their own licenses (MIT or Apache-2.0), their own rate limits and their own terms toward upstream databases - the aggregator adds no caching and no transformation beyond pagination, so each connector's constraints apply unchanged.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选