PrawMi
Server Details
Polish law: search statutes (ISAP), court rulings, verify citations. Free tier + paid plans + x402.
- Status
- Unhealthy
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 8 tools
The tool set is clearly split into statute discovery/retrieval and ruling discovery/verification. The slight ambiguity lies in search_rulings and verify_ruling both being usable to check that a court case exists, but their descriptions make the verification scope different enough (database/excerpts vs external authoritative check).
Tool names follow a consistent verb-first pattern: search_* for discovery, get_* for retrieval, and verify_* for checking legal references and signatures. Even the longer names like search_rulings_by_article remain predictable and readable.
Eight tools is well-scoped for a legal research and verification server. Each tool serves a distinct stage of the workflow: find an act, find an article, read an article, find rulings, read rulings, and verify citations or court cases.
The tool surface covers the full legal research workflow: locate relevant statutes and articles, retrieve article text, search rulings, retrieve ruling text, and audit either article references or court signatures. There are no obvious dead ends, and the verification tools close the gap left by retrieval-style sources.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Added
get_tax_document - Added
search_tax_interpretations
8 tool updates
- Changed
get_article1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "The authoritative text of one statute article, split into clauses.", + "properties": { + "act_shortname": { + "description": "Echo of the requested act. Present when found is false.", + "type": "string" + }, + "act_title": { + "type": [ + "string", + "null" + ] + }, + "act_unified_url": { + "description": "ISAP unified-text URL of the act.", + "type": [ + "string", + "null" + ] + }, + "article_content": { + "description": "Full article text as one string.", + "type": "string" + }, + "article_number": { + "type": [ + "string", + "null" + ] + }, + "clauses": { + "description": "One entry per ustep. Empty when the text carries no recognisable clause labels - fall back to article_content.", + "items": { + "properties": { + "clause": { + "description": "Clause label, e.g. '1.', '2a.'.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "clause", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "found": { + "description": "False means the act or the article number does not exist - not that the lookup failed. See error_code to tell which.", + "type": "boolean" + }, + "note": { + "description": "Reading guidance, or an explanation of a miss.", + "type": "string" + }, + "related_regulations": { + "description": "Executive regulations tied to the article. Only when include_regulations was true.", + "items": { + "type": "object" + }, + "type": "array" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
get_ruling_text1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Full plain text of one court ruling.", + "properties": { + "char_count": { + "description": "Length of `text` in characters.", + "minimum": 0, + "type": "integer" + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "found": { + "description": "False when the link resolves to no stored text.", + "type": "boolean" + }, + "ruling_link": { + "description": "Echo of the requested link.", + "type": "string" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + }, + "text": { + "description": "Ruling text with HTML stripped and whitespace collapsed.", + "type": "string" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
search_act_articles1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Articles inside one statute that match a topic.", + "properties": { + "articles": { + "items": { + "description": "One matched article.", + "properties": { + "act_title": { + "type": "string" + }, + "article_maxim": { + "description": "Legal maxim (paremia) tied to the article.", + "type": "string" + }, + "article_number": { + "type": "string" + }, + "content": { + "description": "Article text, truncated to an excerpt. Use get_article for the full wording before citing.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "count": { + "description": "Number of entries in `articles`.", + "minimum": 0, + "type": "integer" + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
search_acts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Polish statutes and codes matching a topic.", + "properties": { + "acts": { + "items": { + "description": "One matched act.", + "properties": { + "shortname": { + "description": "Abbreviation such as 'KC' or 'KPC', when one exists.", + "type": "string" + }, + "summary": { + "type": "string" + }, + "title": { + "description": "Full official title.", + "type": "string" + }, + "unified_url": { + "description": "ISAP unified-text URL; pass it to search_act_articles as act_unified for the fast path.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "count": { + "description": "Number of entries in `acts`.", + "minimum": 0, + "type": "integer" + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
search_rulings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Rulings matching a topic or a case signature.", + "properties": { + "count": { + "description": "Number of entries in `rulings`.", + "minimum": 0, + "type": "integer" + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "rulings": { + "items": { + "description": "One matched court ruling.", + "properties": { + "case_number": { + "description": "Court case signature, e.g. 'III CZP 8/22'.", + "type": "string" + }, + "court": { + "description": "Court or division that issued the ruling.", + "type": "string" + }, + "date": { + "description": "Judgment date, ISO 'YYYY-MM-DD' when the source stores a real date.", + "type": "string" + }, + "excerpt": { + "description": "Text fragment of the ruling that matched the query.", + "type": "string" + }, + "link": { + "description": "Ruling id; pass it back as get_ruling_text's ruling_link.", + "type": "string" + }, + "relevance_score": { + "description": "Similarity score; 1.0 for an exact case-number hit.", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "search_type": { + "description": "Which retrieval path produced the hits: 'semantic', 'case_number', 'hybrid' or 'unknown'.", + "type": [ + "string", + "null" + ] + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
search_rulings_by_article1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Rulings that cite a specific statute article.", + "properties": { + "article": { + "description": "The article the search ran for, e.g. 'art. 415 KC'.", + "type": "string" + }, + "count": { + "description": "Number of entries in `rulings`.", + "minimum": 0, + "type": "integer" + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "rulings": { + "items": { + "description": "One matched court ruling.", + "properties": { + "case_number": { + "description": "Court case signature, e.g. 'III CZP 8/22'.", + "type": "string" + }, + "court": { + "description": "Court or division that issued the ruling.", + "type": "string" + }, + "date": { + "description": "Judgment date, ISO 'YYYY-MM-DD' when the source stores a real date.", + "type": "string" + }, + "excerpt": { + "description": "Text fragment of the ruling that matched the query.", + "type": "string" + }, + "link": { + "description": "Ruling id; pass it back as get_ruling_text's ruling_link.", + "type": "string" + }, + "relevance_score": { + "description": "Similarity score; 1.0 for an exact case-number hit.", + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
verify_article_reference1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Audit of every article reference and case signature found in a text.", + "properties": { + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "issues": { + "items": { + "description": "One citation that failed verification.", + "properties": { + "message": { + "description": "Polish explanation of the problem.", + "type": "string" + }, + "type": { + "enum": [ + "missing_act", + "invalid_article", + "invalid_case_number", + "invalid_date" + ], + "type": "string" + }, + "value": { + "description": "The offending reference as it appears in the text.", + "type": "string" + } + }, + "required": [ + "type", + "value", + "message" + ], + "type": "object" + }, + "type": "array" + }, + "issues_count": { + "description": "Number of entries in `issues`.", + "minimum": 0, + "type": "integer" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + }, + "suggestions": { + "description": "Polish remediation hint, one per issue.", + "items": { + "type": "string" + }, + "type": "array" + }, + "valid": { + "description": "True when no issue was found, i.e. issues is empty.", + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
verify_ruling1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Verdict on whether a court case signature exists, plus the audit trail of every source consulted.", + "properties": { + "case_number": { + "description": "The signature in normalised form.", + "type": "string" + }, + "checked_sources": { + "description": "Every source that was tried, in the order tried.", + "items": { + "description": "What one source was asked and how it answered.", + "properties": { + "elapsed_ms": { + "description": "Wall-clock time spent on this source.", + "type": "integer" + }, + "error": { + "description": "Truncated error detail. Present only for status 'error'.", + "type": "string" + }, + "error_code": { + "description": "Why the source failed. Present only for status 'error'.", + "enum": [ + "RATE_LIMITED", + "TIMEOUT", + "UNAVAILABLE", + "BLOCKED", + "PARSE_ERROR", + "UNKNOWN" + ], + "type": "string" + }, + "source": { + "description": "Source id: 'prawmi_db', 'saos', 'nsa' or 'sn'.", + "type": "string" + }, + "status": { + "description": "'miss' means the source answered cleanly with no match; 'error' and 'skipped' mean it could not be consulted.", + "enum": [ + "hit", + "miss", + "error", + "skipped" + ], + "type": "string" + } + }, + "required": [ + "source", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "court": { + "type": [ + "string", + "null" + ] + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "error": { + "description": "Failure reason. Present only when success is false.", + "type": "string" + }, + "error_code": { + "description": "Machine-readable failure code (INVALID_INPUT, DB_ERROR, NO_RESULTS, ACT_NOT_FOUND, ARTICLE_NOT_FOUND, UNKNOWN, ...).", + "type": "string" + }, + "found_in_db": { + "description": "True only when PrawMi's own corpus holds the ruling.", + "type": "boolean" + }, + "link": { + "type": [ + "string", + "null" + ] + }, + "matches": { + "items": { + "description": "A signature match reported by the source that verified it.", + "properties": { + "case_number": { + "type": "string" + }, + "court": { + "type": "string" + }, + "date": { + "type": "string" + }, + "link": { + "type": "string" + } + }, + "required": [ + "case_number" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "description": "Polish caveat explaining how far the verdict actually reaches.", + "type": "string" + }, + "reason": { + "description": "Why the input was rejected. Only for 'invalid_signature'.", + "type": "string" + }, + "source": { + "description": "Source that produced the hit. Present only for verdict 'verified'.", + "type": "string" + }, + "success": { + "description": "False only when the tool could not run (bad input, no DB). A successful call that found nothing still reports true.", + "type": "boolean" + }, + "uncertain_reason": { + "description": "Why the check stopped short. Only for 'uncertain'.", + "enum": [ + "external_disabled", + "external_failure" + ], + "type": "string" + }, + "verdict": { + "description": "'uncertain' means at least one source could not be reached - it is neither confirmation nor denial.", + "enum": [ + "verified", + "not_found_anywhere", + "uncertain", + "invalid_signature" + ], + "type": "string" + } + }, + "required": [ + "success" + ], + "type": "object" +}
8 tool updates
- First observed
get_article - First observed
get_ruling_text - First observed
search_act_articles - First observed
search_acts - First observed
search_rulings - First observed
search_rulings_by_article - First observed
verify_article_reference - First observed
verify_ruling
Related MCP Connectors
Semantic search over Polish law and case law, citing the exact in-force article.
Polish law via Ansvar Gateway. Cited, OAuth + paid tier.
Polish company registry: 4.4M firms, KRS/REGON data, VAT white list checks, financial statements
Resolve, search and verify legal citations against the official sources, with provenance.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to search and retrieve Polish statutes, provisions, and EU law cross-references with verified citations, supporting legal research and compliance checks.45Apache 2.0
- AlicenseAqualityAmaintenanceMCP server for Polish legislation (ISAP / Sejm) — search acts (Dz.U., M.P.) and fetch full texts with ELI identifiers and verifiable citations.31081MIT
- AlicenseAqualityBmaintenanceEnables AI-powered legal research and analysis of Polish legal acts from the Sejm API. Provides comprehensive search, document retrieval, metadata analysis, and content access for legal documents from Dziennik Ustaw and Monitor Polski.1320MIT
- AlicenseNot gradedqualityFmaintenanceMCP server providing access to Polish law statutes, provisions, case law, and EU law integrations, enabling natural language legal research, citation validation, and cross-referencing.457Apache 2.0