Law Scrapper MCP
This server provides read-only MCP tools for searching, retrieving, and analyzing Polish legal acts (Dziennik Ustaw and Monitor Polski) from the Sejm API.
Search & browse acts — full-text/keyword search (
search_legal_acts) and full-year browsing (browse_acts) by publisher, year, title, type, status, keywords, in-force flag, and publication/effective date ranges.Filter stored results —
filter_resultsnarrows prior search/browse/changes result sets with RE2 regex, exact type/status/year match, date ranges, and sorting;list_result_setsshows active sets and their scope (completevspage).Inspect acts —
get_act_detailsreturns metadata (title, status, dates, keywords, TOC, HTML/PDF availability) and can load full text into the in-memory Document Store.Read & search content —
read_act_contentreads a specific section (or the TOC) andsearch_in_actfinds terms within a loaded act with surrounding context;list_loaded_documentsshows what is cached.Analyze relationships —
analyze_act_relationshipsreturns amendments, repeals, legal bases, and consolidated-text links.Track changes —
track_legal_changeslists acts published or changed within a date range, optionally filtered by publisher and keywords.Compare acts —
compare_actsdiffs metadata (titles, types, statuses, dates, keyword overlap) of two acts.Date utilities —
calculate_legal_datecomputes deadlines/vacatio legis by adding or subtracting days, months, and years from a base date.System metadata —
get_system_metadataretrieves available keywords, publishers, statuses, types, and institutions for filtering.Operational features — STDIO and streamable-HTTP transports, bearer/OAuth auth, caching, rate limiting, circuit breaker, pagination, and structured logging.
Utilizes Git version control for repository management and development workflow
Hosted on GitHub for source code management, distribution, and collaborative development
Built using Python programming language with FastMCP framework for MCP server implementation
Displays project status badges for Python version, license, and version information
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., "@Law Scrapper MCPFind recent regulations about data protection from the last 2 years"
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.
Law Scrapper MCP
A comprehensive Model Context Protocol (MCP) server for accessing and analyzing Polish legal acts from the Sejm API, enabling AI-powered legal research and document analysis.
Features
Comprehensive legal act access - Full access to Polish legal acts from Dziennik Ustaw (DU) and Monitor Polski (MP)
Advanced search and filtering - Multi-criteria search by date, type, keywords, publisher, and status
Result Store with chained filtering - Store search results and filter with regex, type/status/year match, date ranges, sorting
Document Store pattern - Load acts into memory for efficient section-level navigation and search
Detailed document analysis - Metadata, structure, references, and content retrieval
Content processing - Automatic PDF-to-text and HTML-to-Markdown conversion
Date calculations - Specialized date utilities for legal document analysis
System metadata - Keywords, statuses, document types, and institution data
Official MCP SDK - Built with
mcp[cli]==2.0.0andMCPServer; STDIO and stateless Streamable HTTP transportsAsync HTTP client - Efficient httpx client with retry logic and connection pooling
TTL caching - Intelligent response caching with configurable TTL
Structured logging - JSON and text log formats for easy debugging
Docker support - Containerized deployment with docker-compose
Comprehensive documentation - Examples and clear parameter descriptions
Related MCP server: Slov-Lex MCP Server
Requirements
Python: 3.13 or higher
Package manager: uv (recommended) or pip
Internet connection: Required for accessing Sejm API endpoints
MCP-compatible tool: Cursor IDE, Claude Code, or other MCP clients
Installation
Using uv (recommended)
# Clone the repository
git clone https://github.com/numikel/law-scrapper-mcp.git
cd law-scrapper-mcp
# Install dependencies
uv sync
# Install with dev dependencies
uv sync --extra devUsing pip
# Clone the repository
git clone https://github.com/numikel/law-scrapper-mcp.git
cd law-scrapper-mcp
# Install dependencies
pip install -e .Using uvx (no installation required)
For quick testing without cloning the repository:
# Run the server directly from GitHub
uvx --from git+https://github.com/numikel/law-scrapper-mcp law-scrapperQuick start
STDIO transport (default)
STDIO is the default transport for MCP communication. Start the server and connect from your MCP client:
# Run the server
uv run python -m law_scrapper_mcp
# Or use the installed script
law-scrapperConfigure in your MCP client (e.g., Cursor .cursor/mcp.json):
{
"mcpServers": {
"law-scrapper-mcp": {
"command": "law-scrapper"
}
}
}For Claude Code:
claude mcp add law-scrapper "uvx --from git+https://github.com/numikel/law-scrapper-mcp law-scrapper"HTTP transport (streamable-http)
Run the server on HTTP with streamable-http transport:
# Run with HTTP transport on port 7683
LAW_MCP_TRANSPORT=streamable-http uv run python -m law_scrapper_mcp
# Or specify a custom port (the host stays on loopback unless you configure
# an authentication mode — see "Authenticated remote deployment" below)
LAW_MCP_TRANSPORT=streamable-http LAW_MCP_PORT=8080 uv run python -m law_scrapper_mcpConfigure in your MCP client:
{
"mcpServers": {
"law-scrapper-mcp": {
"url": "http://localhost:7683/mcp",
"transport": "streamable-http"
}
}
}Note: The URL must include the /mcp path. The server exposes stateless Streamable HTTP at /mcp, not at the root. Using http://localhost:7683 without /mcp results in 404 (Not Found).
Docker
Build and run with Docker:
# Build the image
docker build -t law-scrapper-mcp .
# Run with STDIO transport (default)
docker run -it law-scrapper-mcp
# Run with HTTP transport on port 7683
docker run -it -p 7683:7683 -e LAW_MCP_TRANSPORT=streamable-http law-scrapper-mcpOr use docker-compose:
# Run with STDIO transport
docker compose up
# Run with HTTP transport (set TRANSPORT=streamable-http in docker-compose.yml)
docker compose -f docker-compose.yml upCI builds this image and smoke-tests both transports (/health over streamable-http, one initialize over STDIO) on every code change, so a Dockerfile that no longer builds fails the pull request rather than a downstream registry.
Configuration
All settings are configured via environment variables with the LAW_MCP_ prefix:
The list-valued settings — LAW_MCP_ALLOWED_HOSTS, LAW_MCP_ALLOWED_ORIGINS,
LAW_MCP_TRUSTED_PROXIES, LAW_MCP_AUTH_REQUIRED_SCOPES and
LAW_MCP_AUTH_ALGORITHMS — accept either a comma-separated value
(a:*, b:*, the form used throughout this document) or a JSON array
(["a:*", "b:*"]). Both are equivalent; surrounding whitespace is trimmed.
Variable | Default | Description |
|
| Transport: |
|
| HTTP server host (when using streamable-http). Binding beyond loopback requires |
|
| HTTP server port (when using streamable-http) |
|
| Graceful shutdown window in whole seconds for the HTTP server (a fractional value is rejected at startup rather than silently rounded). Keep |
|
| HTTP request timeout in seconds |
|
| Concurrent light API requests (JSON metadata and search) |
|
| Concurrent heavy API requests (act HTML and PDF downloads) |
|
| Sustained outbound request rate towards the Sejm API; accepted range |
|
| Requests allowed back-to-back before the rate applies; accepted range |
|
| Longest pause, in seconds, that a |
|
| Attempts per operation, retries included; accepted range |
|
| Seconds the retry sequence of one operation may plan to wait |
|
| Metadata cache TTL (24 hours) |
|
| Search results cache TTL (10 minutes) |
|
| Browse results cache TTL (1 hour) |
|
| Act details cache TTL (1 hour) |
|
| Changes tracking cache TTL (5 minutes) |
|
| Maximum cache entries |
|
| Maximum documents in Document Store |
|
| Maximum Document Store size (5 MB). Also the conversion threshold: content whose HTML or PDF payload exceeds it is refused with an error naming the source PDF URL — the download is aborted as soon as the body passes the limit (or earlier, from |
|
| Document Store TTL (2 hours) |
|
| Failures before circuit breaker opens |
|
| Seconds before trying recovery |
|
| Test calls in half-open state |
|
| Max |
|
| Max records |
|
| Cap on error-message length for categories whose message text is built from an exception's own string ( |
|
|
|
|
|
|
| unset | Override the JWKS URI discovered from |
|
| Scopes a presented token must carry, checked by |
|
| JWT signature algorithm allowlist passed to the decoder; never read from the token header |
|
| Seconds a fetched JWKS key set is cached before re-fetching |
|
| Whether the per-client rate limiter wraps the HTTP app. |
|
| Requests allowed per |
|
| Rate limit window in seconds |
|
| Token bucket capacity — how many requests can arrive back-to-back before |
|
| Log level: |
|
| Log format: |
Logs go to stderr (stdout carries the MCP protocol on the STDIO transport). Every record carries a request_id correlating it with a single tool call — lifespan for records emitted outside one:
2026-08-24 12:00:00,123 - law_scrapper_mcp.tools.search - [a1b2c3d4] - INFO - Stored result set rs_1: 20 results (total 137){"timestamp": "2026-08-24T10:00:00.123456+00:00", "level": "INFO", "logger": "law_scrapper_mcp.tools.search", "request_id": "a1b2c3d4", "message": "Stored result set rs_1: 20 results (total 137)"}Set LAW_MCP_LOG_LEVEL=DEBUG to recover the detail deliberately kept off INFO: search query text and the exception messages behind validation and upstream failures.
Example environment configuration:
export LAW_MCP_TRANSPORT=streamable-http
export LAW_MCP_PORT=7683
export LAW_MCP_LOG_LEVEL=DEBUG
export LAW_MCP_CACHE_METADATA_TTL=86400Authenticated remote deployment
The HTTP transport binds 127.0.0.1 by default and refuses to start on any
other address unless an authentication mode is configured. Two modes exist and
neither falls back to the other.
Bearer token — local and simple deployments:
export LAW_MCP_AUTH_TOKEN=$(openssl rand -base64 32) # min. 32 bytes
LAW_MCP_TRANSPORT=streamable-http \
LAW_MCP_HOST=0.0.0.0 \
LAW_MCP_AUTH_MODE=bearer \
law-scrapperIn production prefer LAW_MCP_AUTH_TOKEN_FILE=/run/secrets/law_mcp_token —
an environment variable is visible in docker inspect and /proc/<pid>/environ.
Setting both sources is a startup error, not a precedence rule.
OAuth 2.1 / OIDC — corporate deployments. Works with any provider publishing OIDC discovery and JWKS:
Provider |
|
Microsoft Entra ID |
|
| |
AWS Cognito |
|
Okta |
|
Auth0 |
|
LAW_MCP_AUTH_MODE=oauth \
LAW_MCP_AUTH_ISSUER=https://login.microsoftonline.com/<tenant>/v2.0 \
LAW_MCP_AUTH_AUDIENCE=api://law-scrapper \
LAW_MCP_AUTH_RESOURCE_SERVER_URL=https://mcp.example.com/mcp \
law-scrapperReachable through a reverse proxy — LAW_MCP_ALLOWED_HOSTS and
LAW_MCP_ALLOWED_ORIGINS default to loopback-only (F18): a request whose
Host or Origin header doesn't match gets 421/403 from the SDK's
DNS-rebinding protection, even with a valid token. This default is
deliberate — widening the allowlist is only permitted once an auth mode is
configured (enforced at startup, D6). A reverse proxy that preserves the
original Host (nginx's proxy_set_header Host $host, Caddy's default)
needs both variables set to the public name, for either auth mode above:
LAW_MCP_ALLOWED_HOSTS='mcp.example.com:*' \
LAW_MCP_ALLOWED_ORIGINS='https://mcp.example.com' \
law-scrapperProviders issuing opaque tokens (GitHub) are not supported — they would require
RFC 7662 introspection. TLS termination stays with the reverse proxy.
/health is intentionally unauthenticated so container healthchecks work; it
exposes the server version and circuit-breaker state. It is exempt from the
rate limiter only for loopback peers — a probe arriving from another host is
metered like any other request.
Rate limiting is always on for HTTP: 60 requests per 60 s, burst 10.
Behind a proxy, set LAW_MCP_TRUSTED_PROXIES (addresses or CIDRs) — otherwise
X-Forwarded-For is ignored and every client shares one bucket.
Tools reference
Law Scrapper MCP provides 13 tools for legal research and analysis:
Every tool is read-only (readOnlyHint=true, destructiveHint=false, idempotentHint=true), and openWorldHint=true means the tool calls api.sejm.gov.pl, while false means it never does: it works on data already held in the server's memory or computes its answer locally.
Tool | Title | readOnlyHint | openWorldHint |
| Metadane systemu ELI | true | true |
| Wyszukiwanie aktów prawnych | true | true |
| Przeglądanie aktów z rocznika | true | true |
| Filtrowanie wyników wyszukiwania | true | false |
| Szczegóły aktu prawnego | true | true |
| Czytanie treści aktu | true | false |
| Wyszukiwanie w treści aktu | true | false |
| Powiązania aktu prawnego | true | true |
| Śledzenie zmian w prawie | true | true |
| Obliczanie terminu prawnego | true | false |
| Porównanie dwóch aktów | true | true |
| Zestawy wyników w pamięci | true | false |
| Dokumenty załadowane do pamięci | true | false |
1. get_system_metadata(category)
Retrieve system metadata for filtering and searching legal acts.
Parameters:
category(string, default: "all") - Metadata category: "keywords", "publishers", "statuses", "types", "institutions", or "all"
Returns: Keywords, publishers, document types, statuses, and institutions available in the system
Examples:
- Get all available search keywords
- Retrieve all legal document types
- List all publishers (DU, MP)
- Get all document statuses
- Get complete system metadata2. search_legal_acts(publisher, year, keywords, detail_level, status, type)
Search for legal acts with advanced filtering options.
Parameters:
publisher(string) - Publisher code: "DU" (Dziennik Ustaw) or "MP" (Monitor Polski)year(integer) - Publication year (e.g., 2024)keywords(string) - Search keywords (AND logic - use multiple searches for OR)detail_level(string, default: "standard") - Response detail: "minimal", "standard", or "full"status(string, optional) - Document status filtertype(string, optional) - Document type filter
Returns: List of matching legal acts with metadata
Search note: Multiple keywords use AND logic. Search one keyword at a time for OR behavior.
Examples:
- Search DU 2024 for "environment protection" acts
- Find all MP 2023 acts with status "active"
- Search for COVID-19 related legislation
- Find acts by specific type (e.g., "regulation")
- Get minimal detail results for quick scanning3. browse_acts(publisher, year, detail_level)
Browse all legal acts published in a specific year by publisher.
Parameters:
publisher(string) - Publisher code: "DU" or "MP"year(integer) - Publication yeardetail_level(string, default: "standard") - Response detail: "minimal", "standard", or "full"
Returns: Complete list of acts published in the specified year
Examples:
- Browse all DU acts from 2024
- Get minimal details of all MP acts from 2023
- Browse full details of DU 2022 legislation
- Get an overview of acts by publisher and year
- Track legislation published in a specific year4. filter_results(result_set_id, pattern, field, type_equals, ...)
Filter and narrow down previously retrieved search/browse/changes results.
Parameters:
result_set_id(string) - Result set ID from a previous search/browse/changes call (e.g., "rs_1")pattern(string, optional) - Regex pattern for text search (supports OR: "podatek|VAT|akcyza")field(string, default: "title") - Field to search: "title", "eli", "status", "type", "publisher"type_equals(string, optional) - Exact match on document type (e.g., "Ustawa", "Rozporządzenie")status_equals(string, optional) - Exact match on status (e.g., "akt obowiązujący", "akt uchylony")year_equals(integer, optional) - Exact match on publication yeardate_field(string, optional) - Date field for range filter: "promulgation_date" or "effective_date"date_from/date_to(string, optional) - Date range (YYYY-MM-DD)sort_by(string, optional) - Sort field: "title", "year", "pos", "promulgation_date", etc.sort_desc(boolean, default: false) - Sort descendinglimit(integer, optional) - Maximum results to return
Returns: Filtered results with a new result_set_id for chained filtering
Examples:
- Filter search results to only "Rozporządzenie" type
- Search titles with regex "zdrow|apteka|lekar"
- Filter by date range and sort by promulgation date
- Chain filters: first by type, then by regex pattern
- Get top 10 most recent resultsResult-set scope. Every stored result set declares whether it is the whole answer
(complete) or a window cut from a larger corpus (page), in the result_set_scope field
of the response and in list_result_sets. The distinction matters because filter_results
narrows the set, not the query: an empty filter over a page set means "no match among
these twenty records", not "no such act exists". Responses say so explicitly — a filter that
matches nothing over a window sets no_match_is_inconclusive. track_legal_changes is the
one tool whose set is always complete, because it stores the whole fetched range.
5. get_act_details(eli, load_content, detail_level)
Retrieve detailed information about a specific legal act and optionally load its content.
Parameters:
eli(string) - Act identifier in format "PUBLISHER/YEAR/NUMBER" (e.g., "DU/2024/1")load_content(boolean, default: false) - Load act content into Document Store for section readingdetail_level(string, default: "standard") - Response detail: "minimal", "standard", or "full"
Returns: Act metadata (title, publication date, status, type, etc.), table of contents if load_content=true
content_status: Outcome of the content-loading half of this call, one of:
not_requested-load_contentwas not set and the act was not already in the Document Storeloaded- content is in the Document Store, ready forread_act_content/search_in_actunavailable- the act permanently has no readable text (no HTML/PDF source, a 404 on either text fetch, or an empty extraction from either format); retrying will not change that, and the server remembers the absence for the metadata cache TTL rather than asking the API again
A transient upstream failure during loading (an open circuit breaker, a timeout, an HTTP 5xx
from api.sejm.gov.pl) is not a content_status value — it fails the call itself with
isError=true, distinct from content_status="unavailable". Retrying a transient failure may
succeed; retrying an unavailable act will not.
Examples:
- Get metadata for act DU/2024/1
- Load act content for section-level reading
- Get full details including table of contents
- Retrieve act status and publication information
- Load multiple acts for comparison6. read_act_content(eli, section)
Read content from a specific section of a loaded legal act.
Parameters:
eli(string) - Act identifier (must be loaded first via get_act_details with load_content=true)section(string) - Section to read (e.g., "Art. 1", "Chapter 2", "Preamble")
Returns: Content of the requested section
Workflow note: Must call get_act_details(eli="...", load_content=true) first, then use this tool.
Examples:
- Read Article 1 from loaded act
- Get Chapter 2 content
- Read the Preamble section
- Access specific numbered articles
- Navigate act by chapters7. search_in_act(eli, query)
Search for specific terms within a loaded legal act.
Parameters:
eli(string) - Act identifier (must be loaded first via get_act_details with load_content=true)query(string) - Search term or phrase
Returns: Matching sections with context and location
Examples:
- Find all mentions of "penalty" in loaded act
- Search for specific legal terms
- Locate articles containing "fine" or "punishment"
- Find definitional sections
- Search for specific references8. analyze_act_relationships(eli, relationship_type)
Analyze legal relationships and references of an act (amendments, references, etc.).
Parameters:
eli(string) - Act identifierrelationship_type(string, default: "all") - Type: "amends", "amended_by", "references", "referenced_by", or "all"
Returns: List of related acts and their relationships
Examples:
- Find which acts amend this legislation
- See what acts this legislation amends
- Get all legal references in the act
- Find acts that reference this legislation
- Analyze complete act relationship network9. track_legal_changes(date_from, date_to, publisher, keywords)
Track legal changes and new acts within a date range.
Parameters:
date_from(string) - Start date (YYYY-MM-DD format)date_to(string) - End date (YYYY-MM-DD format)publisher(string, optional) - Filter by publisher: "DU" or "MP"keywords(string, optional) - Filter by keywords
Returns: Legal acts published in the date range
Examples:
- Track changes from 2024-01-01 to 2024-12-31
- Find new DU acts from last month
- Get changes published in past 7 days
- Track legislation on specific topics over time
- Monitor legal changes by publisher and date range10. calculate_legal_date(days, months, years, base_date)
Calculate legal dates with intuitive sign convention.
Parameters:
days(integer, default: 0) - Days offset (+future, -past)months(integer, default: 0) - Months offset (+future, -past)years(integer, default: 0) - Years offset (+future, -past)base_date(string, optional) - Base date (YYYY, YYYY-MM, or YYYY-MM-DD format, defaults to today)
Returns: Calculated date and relative description
Sign convention: Positive = future, Negative = past
Examples:
- Get current date (call with no parameters)
- Calculate date 30 days in the future (+30)
- Calculate date 6 months in the past (-6 months)
- Calculate date 1 year from a specific date
- Calculate legal deadlines and periods11. compare_acts(eli_a, eli_b)
Compare metadata of two legal acts.
Parameters:
eli_a(string) - ELI identifier of the first act (e.g., "DU/2024/1692")eli_b(string) - ELI identifier of the second act (e.g., "DU/2024/1716")
Returns: Comparison of titles, types, statuses, dates, keywords overlap and differences
Examples:
- Compare two acts from the same year
- Compare old and new versions of legislation
- Identify metadata differences between related acts12. list_result_sets()
Display active result sets stored in memory.
Returns: List of result sets with IDs, query summaries, counts, and creation times
13. list_loaded_documents()
Display documents loaded into the Document Store.
Returns: List of loaded documents with ELIs, sizes, section counts, and timestamps
Document Store workflow
The Document Store pattern enables efficient content navigation and search within legal acts:
Workflow steps
Load an act - Call
get_act_details(eli="DU/2024/1", load_content=true)to load the act into the Document StoreRead sections - Use
read_act_content(eli="DU/2024/1", section="Art. 1")to read specific sectionsSearch within act - Use
search_in_act(eli="DU/2024/1", query="penalty")to find terms
Benefits
Efficient memory usage (configurable max documents and TTL)
Fast section-level navigation without refetching
Search within loaded acts without API calls
Automatic content processing (PDF→text, HTML→Markdown)
Configuration
LAW_MCP_DOC_STORE_MAX_DOCUMENTS- How many acts to keep in memory (default: 10)LAW_MCP_DOC_STORE_MAX_SIZE_BYTES- Maximum memory usage (default: 5 MB)LAW_MCP_DOC_STORE_TTL- How long to keep acts in memory (default: 2 hours)
Project structure
law-scrapper-mcp/
├── src/law_scrapper_mcp/
│ ├── __init__.py
│ ├── __main__.py # Entry point for python -m
│ ├── server.py # MCPServer, lifespan, transport config
│ ├── config.py # Pydantic settings (env vars)
│ ├── logging_config.py # Structured logging setup
│ ├── models/ # Pydantic models
│ │ ├── enums.py # Enumerations
│ │ ├── api_responses.py # Sejm API response models
│ │ ├── tool_inputs.py # Tool input models
│ │ └── tool_outputs.py # Tool output models
│ ├── client/ # HTTP client
│ │ ├── sejm_client.py # AsyncClient with retry and circuit breaker
│ │ ├── cache.py # Async TTL cache implementation
│ │ ├── circuit_breaker.py # Circuit breaker for API protection
│ │ └── exceptions.py # Custom exceptions (Polish messages)
│ ├── services/ # Business logic
│ │ ├── metadata_service.py # Metadata retrieval
│ │ ├── search_service.py # Search and browse
│ │ ├── act_service.py # Act details and content
│ │ ├── changes_service.py # Change tracking
│ │ ├── document_store.py # In-memory act storage
│ │ ├── result_store.py # Search result persistence and filtering
│ │ ├── content_processor.py # PDF/HTML processing
│ │ └── response_enrichment.py # Response hints
│ └── tools/ # MCP tool definitions
│ ├── annotations.py # Shared ToolAnnotations presets (READ_ONLY_REMOTE / READ_ONLY_LOCAL)
│ ├── metadata.py # get_system_metadata
│ ├── search.py # search_legal_acts
│ ├── browse.py # browse_acts
│ ├── act_details.py # get_act_details
│ ├── act_content.py # read_act_content
│ ├── act_search.py # search_in_act
│ ├── relationships.py # analyze_act_relationships
│ ├── filter_results.py # filter_results, list_result_sets
│ ├── changes.py # track_legal_changes
│ ├── compare.py # compare_acts
│ ├── dates.py # calculate_legal_date
│ └── error_handling.py # Centralized @handle_tool_errors decorator
├── tests/
│ ├── unit/ # Unit tests
│ └── integration/ # Integration tests with Sejm API
├── Dockerfile # Container image definition
├── docker-compose.yml # Multi-service setup
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Reproducible dependency lock
└── README.md # This fileDocker
Security and deployment
The server binds 127.0.0.1 by default; binding beyond loopback (as Docker port publishing requires) fails at startup unless an authentication mode is configured — see "Authenticated remote deployment" above. When exposing the HTTP transport (streamable-http) to a network, place the server behind a reverse proxy (nginx, Caddy, Traefik) with TLS termination — this project verifies bearer tokens and OAuth 2.1/OIDC access tokens, but does not terminate TLS itself. The /health endpoint is unauthenticated and intended for container healthchecks only — do not expose it publicly without access controls. Dependency versions are pinned in uv.lock with security overrides in pyproject.toml (cryptography, urllib3, idna, werkzeug, requests).
Host/Origin allowlist (DNS-rebinding protection): the official MCP SDK only auto-enables Host/Origin validation when the server binds to a literal loopback address (127.0.0.1, localhost, ::1). docker-compose.yml sets LAW_MCP_HOST=0.0.0.0 so Docker can publish the port, which would otherwise leave that validation disabled. server.py passes transport_security explicitly (build_transport_security()) so requests are still validated against the configured allowlist — Host outside it gets 421, Origin outside it gets 403 — independent of the bind address. The allowlist defaults to loopback only (127.0.0.1:* / localhost:* / [::1]:* and the matching http:// origins) and is widened through LAW_MCP_ALLOWED_HOSTS / LAW_MCP_ALLOWED_ORIGINS, which startup validation permits only once an authentication mode is configured. This restores the pre-3.0.0 FastMCP posture for /mcp. It is a defense-in-depth layer, not a substitute for the authentication mode required to bind beyond loopback in the first place.
One deliberate difference from the pre-3.0.0 server: the SDK applies this validation inside the Streamable HTTP app, not as whole-app middleware, so /health is not covered by the allowlist and answers any Host. That is what keeps container healthchecks working when they connect by container name or bridge IP, but it also means /health discloses the server name and version — and, since it now also reports the circuit breaker's circuit_state and failure_count, the health of the Sejm API integration — to anything that can reach the published port. FastMCP guarded /health too. Restrict the published port, or front it with a proxy, if that disclosure matters to you.
Health contract: the response body carries an upstream object. upstream.circuit_state is closed, open, half_open, or unknown before the lifespan has started (or after it has been torn down) — in that unknown case upstream.failure_count is omitted entirely; otherwise it sits alongside circuit_state. /health still answers 200 while the breaker is open: restarting the container cannot repair an outage of api.sejm.gov.pl, and under restart: unless-stopped a 503 would turn someone else's outage into a restart loop.
Dockerfile
The included Dockerfile builds a containerized Law Scrapper MCP server:
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -e .
EXPOSE 7683
CMD ["law-scrapper"]Build and run:
# Build the image
docker build -t law-scrapper-mcp .
# Run with STDIO transport
docker run -it law-scrapper-mcp
# Run with HTTP transport, published on the host — the image no longer
# defaults LAW_MCP_HOST to 0.0.0.0, so publishing the port beyond loopback
# requires setting the host explicitly together with an authentication mode
docker run -it -p 7683:7683 \
-e LAW_MCP_TRANSPORT=streamable-http \
-e LAW_MCP_HOST=0.0.0.0 \
-e LAW_MCP_AUTH_MODE=bearer \
-e LAW_MCP_AUTH_TOKEN="$(openssl rand -base64 32)" \
-e LAW_MCP_LOG_LEVEL=DEBUG \
law-scrapper-mcpdocker-compose.yml
Deployment with docker-compose:
# LAW_MCP_AUTH_TOKEN is required — docker-compose.yml fails fast without it
export LAW_MCP_AUTH_TOKEN=$(openssl rand -base64 32)
# Start service
docker compose up -d
# View logs
docker compose logs -f
# Stop service
docker compose downMigration guide (v1 to v2)
If upgrading from v1.0.2, note these breaking changes:
v1.0.2 (old) | v2.0.0 (new) | Notes |
|
| Call with no parameters for current date |
|
| Use intuitive +future/-past sign convention |
|
| Consolidated into one tool |
|
| Consolidated into one tool |
|
| Consolidated into one tool |
|
| Consolidated into one tool |
|
| Consolidated into one tool |
| N/A | Use |
|
| Enhanced with |
|
| Renamed for clarity |
|
| Added |
|
| Requires pre-loading with |
|
| TOC included in details response |
|
| Renamed for clarity |
ELI format | Single string "DU/2024/1" | Changed from separate parameters |
Legacy event-stream transport | STDIO (default) | STDIO is default, HTTP via streamable-http |
Port 7683 | Port 7683 | Same default HTTP port |
What's new in v3.0.0
Official Python MCP SDK — Replaced the prior third-party framework with
mcp[cli]==2.0.0andMCPServer[AppContext]Native structured responses — Tools return
EnrichedResponsewithoutputSchemaand objectstructuredContent(no JSON strings)Protocol-visible errors — Tool failures surface as
isError=trueinstead of in-bodyerrorfieldsStateless Streamable HTTP —
/mcpendpoint only; legacy event-stream transport removedPagination —
PageInfomodel exposed as thepage_infofield withlimit/offseton search, browse, metadata, changes, TOC, sections, and in-act searchTyped
AppContext— Lifespan resources accessed viactx.request_context.lifespan_contextDomain services —
ComparisonService,RelationshipService, andDateServiceextracted from tool adaptersTransport tests — Real STDIO subprocess, loopback HTTP, and MCP conformance in CI
Explicit Host/Origin allowlist on HTTP —
transport_securityis passed explicitly so DNS-rebinding protection applies regardless of the configured bind host; see Security and deployment
Migration guide (v2 to v3)
v2.x (old) | v3.0.0 (new) | Notes |
|
| Parse native MCP structured payload |
|
| Check |
v2.x in-process client | Official | In-memory and transport tests use SDK client |
v2.x direct lifespan access |
| Typed |
Legacy event-stream transport | Removed | STDIO or stateless Streamable HTTP only |
What's new in v2.4.0
Security hardening — Framework upgrade and dependency overrides close 51 Dependabot alerts (cryptography, urllib3, pillow, starlette, and others)
Framework 3.x — Lifespan context API,
app.run()for HTTP transport,@custom_routefor/healthIntegration tests — In-memory client tests for core tools (metadata, search, dates, act details)
CI and Dependabot — Automated quality gates and weekly dependency updates
What's new in v2.3.1
uvx / tool registration fix — Fixed
NameError: name 'Annotated' is not definedwhen running viauvx --from "git+https://github.com/numikel/law-scrapper-mcp" law-scrapper. Removedfrom __future__ import annotationsfromcompare.pyso parameter type hints resolve correctly during tool registration.
What's new in v2.3.0
3 new tools —
compare_acts,list_result_sets,list_loaded_documents(total: 13 tools)Circuit breaker — Protects against cascading failures when Sejm API is unavailable
Centralized error handling —
@handle_tool_errorsdecorator with error classification and full tracebacksasyncio.Lock migration — All stores use
asyncio.Lockfor proper async compatibilityDefault search limit — Search/browse return max 20 results by default to limit token usage
Health endpoint —
/healthfor Docker deployments with streamable-http transportPolish error messages — All exception messages in Polish for consistent user experience
Decision tree docstrings — "When to use" / "When NOT to use" for all tools
Development
Setup
# Install dependencies
uv sync
# Install with dev dependencies
uv sync --extra devRunning tests
# Run unit tests
uv run pytest tests/unit/ -v
# Run integration tests (mocked Sejm API via respx; no live network required)
uv run pytest tests/integration/ -v -m integration
# Run all tests with coverage
uv run pytest --cov=law_scrapper_mcp --cov-report=term-missing
# Run with timeout for slow tests
uv run pytest --timeout=10 -vMCP integration testing
Law Scrapper MCP uses three automated test layers to verify all 13 tools and their MCP protocol interaction:
Layer 1 — unit tests (tests/unit/):
uv run pytest tests/unit/ -vLayer 2 — in-memory integration (official mcp.Client, mocked Sejm API via respx):
uv run pytest tests/integration/test_tools_e2e.py \
tests/integration/test_content_pagination.py \
tests/integration/test_result_pagination.py -v -m integrationLayer 3 — transport integration (real STDIO subprocess and loopback Streamable HTTP):
uv run pytest tests/integration/test_stdio_transport.py \
tests/integration/test_http_transport.py -v -m integrationFull integration suite:
uv run pytest tests/integration/ -v -m integrationWhat the tests verify:
All 13 tools registered with preserved public arguments
Native
structuredContentpayloads withoutputSchema(not JSON strings)isError=trueon tool execution failurespage_info(PageInfo) pagination metadata on paginated outputsStateful workflows: search → filter → load act → read sections → search in content
Real STDIO and HTTP transports against a running server process
Architecture:
Test framework: pytest with asyncio (unit) and anyio (MCP client tests)
HTTP mocking: respx intercepts httpx calls in in-memory integration tests
MCP protocol: Official
mcp.Clientfrom the Python MCP SDKHelpers:
tests/mcp_helpers.py(parse_tool_resultforstructuredContentassertions)CI: Legacy dependency gate, protocol transport tests, and MCP conformance against
/mcp
See tests/TEST_SUITE_SUMMARY.md for the full file layout and patterns.
Code quality
The project follows MCP SDK best practices:
Modular architecture - Separated concerns (models, client, services, tools)
Type hints - Full type annotation with Pydantic models
Async throughout - Async/await for all I/O operations
Comprehensive examples - Minimum 5 examples per tool
Tagged tools - Organized by category for easy discovery
Annotated parameters - Clear descriptions for all inputs
Structured logging - Configurable JSON/text formats
Running the server
# STDIO transport (default)
uv run python -m law_scrapper_mcp
# HTTP transport
LAW_MCP_TRANSPORT=streamable-http uv run python -m law_scrapper_mcp
# With debug logging
LAW_MCP_LOG_LEVEL=DEBUG uv run python -m law_scrapper_mcpContributing
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes using Conventional Commits format
Add tests for new functionality
Ensure all tests pass and coverage is maintained
Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
Development guidelines
Follow MCP SDK patterns for tool definitions and structured output
Include comprehensive examples and parameter descriptions
Add appropriate tags for tool categorization
Write async code throughout
Add tests for all new functionality
Update CHANGELOG.md with your changes
Use English for all code comments and documentation
License
This project is licensed under the MIT License. See the LICENSE file for details.
Author
Developed with help from:
And with models:
Legal disclaimer: This tool provides access to Polish legal documents for research purposes. Always consult with qualified legal professionals for legal advice and interpretation of laws.
Available Tools
13 toolsanalyze_act_relationshipsPowiązania aktu prawnegoARead-onlyIdempotent
Przeanalizuj powiązania i referencje między aktami prawnymi.
Zwraca informacje o aktach zmienionych, zmieniających, uchylonych, podstawie prawnej i tekstach jednolitych.
Przykłady:
analyze_act_relationships(eli="DU/2024/1716") - Wszystkie powiązania
analyze_act_relationships(eli="DU/2024/1716", relationship_type="Akty zmienione") - Jakie akty zmienił
analyze_act_relationships(eli="DU/2024/1716", relationship_type="Podstawa prawna") - Na jakiej podstawie powstał
analyze_act_relationships(eli="DU/2024/1716", relationship_type="Akty zmieniające") - Co go zmienia
analyze_act_relationships(eli="DU/2024/1", relationship_type="Akty uznane za uchylone") - Uchylone akty
| Name | Required | Description | Default |
|---|---|---|---|
| eli | Yes | Identyfikator ELI aktu. Format: "{wydawca}/{rok}/{pozycja}". Wydawcy: DU (Dziennik Ustaw), MP (Monitor Polski). Przykłady: "DU/2024/1716", "MP/2023/500", "DU/2024/1". | |
| relationship_type | No | Filtruj po typie powiązania (dokładne dopasowanie do klucza z API). Dostępne typy: 'Akty zmienione', 'Akty zmieniające', 'Akty uchylone', 'Akty uchylające', 'Akty uznane za uchylone', 'Podstawa prawna', 'Podstawa prawna z art.', 'Teksty jednolite'. None = zwróć wszystkie powiązania. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only that the tool returns information about relationship categories; it does not disclose additional behavioral traits such as result completeness, pagination, or exact-match limitations, though the openWorldHint is present in annotations.
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 description is front-loaded with the purpose, followed by a compact list of return categories and then five single-line examples. There is no filler; each example earns its place by illustrating a different relationship type.
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?
With an output schema present, return values do not need to be explained in the description. Both parameters are fully covered by the schema, annotations cover the read-only/idempotent behavior, and the examples complete the picture for selecting and invoking the tool correctly.
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 coverage is 100%, so the parameters are already documented. The description adds value by mapping example relationship_type values to natural-language questions ('Jakie akty zmienił', 'Na jakiej podstawie powstał'), which clarifies the intended meaning beyond the raw key list.
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 clearly identifies the operation ('Przeanalizuj powiązania i referencje między aktami prawnymi') and enumerates the relationship categories returned, so an agent can tell it is about act-to-act references rather than document contents or search. It does not explicitly name or contrast sibling tools, which keeps it from a 5.
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?
The examples provide concrete call patterns for common needs (what an act amended, its legal basis, what amends it, repealed acts), giving clear context for when this tool answers relationship queries. It does not explicitly state when not to use it or direct the agent to an alternative sibling, but the intended use is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browse_actsPrzeglądanie aktów z rocznikaARead-onlyIdempotent
Przeglądaj wszystkie akty prawne wydane przez wydawcę w danym roku.
Kiedy użyć: Gdy chcesz przeglądać cały rocznik wydawcy bez filtrowania. Kiedy NIE używać: Gdy szukasz po słowach kluczowych lub tytule → użyj search_legal_acts.
Zwraca listę aktów (domyślnie max 20). Wyniki zapisywane są do result_set_id — użyj filter_results aby je zawęzić.
Przykłady:
browse_acts(publisher="DU", year=2024) - Wszystkie akty DU z 2024
browse_acts(publisher="MP", year=2024) - Wszystkie akty MP z 2024
browse_acts(publisher="DU", year=2024, detail_level="full") - Ze szczegółami
browse_acts(publisher="DU", year=2024, detail_level="minimal") - Tylko podstawowe info
browse_acts(publisher="DU", year=2000) - Akty z roku 2000
browse_acts(publisher="DU", year=2024, limit=20, offset=20) - Druga strona rocznika
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Rok publikacji (np. 2024). | |
| limit | No | Maksymalna liczba wyników do zwrócenia. Domyślnie 20, maksymalnie 100 — wartości powyżej są przycinane, tak samo jak w pozostałych narzędziach listujących. Podawaj najmniejszą wystarczającą wartość. | |
| offset | No | Liczba wyników do pominięcia (paginacja). Użyj razem z limit. Domyślnie 0. | |
| publisher | Yes | Kod wydawcy: 'DU' (Dziennik Ustaw) lub 'MP' (Monitor Polski). | |
| detail_level | No | Poziom szczegółowości: 'minimal' (ELI, tytuł, status), 'standard' (+ typ, daty, obowiązywanie), 'full' (wszystkie pola). Domyślnie 'standard'. | standard |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, idempotent, and non-destructive hints. The description adds that results are saved to result_set_id and that the default limit is 20 (max 100), which are useful behavioral details beyond the structured data. No contradictions found.
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 description is well-structured: purpose, usage guidance, return behavior, and examples. Every sentence earns its place, and the content is front-loaded with the core purpose. No fluff or redundancy.
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?
The description fully covers the tool's functionality, including usage alternatives, return format, result-set persistence, and parameter defaults. Given the comprehensive schema and annotations, nothing essential is missing for an agent to call the tool correctly.
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 the baseline is 3. The description provides examples that illustrate parameter usage but does not add new semantic meaning beyond what the schema already documents. The examples are helpful but not essential for understanding parameter meaning.
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 clearly states the tool browses all legal acts issued by a publisher in a given year, distinguishing it from search_legal_acts. It specifies the verb (przeglądaj) and the resource (akty prawne), and explicitly mentions the return type (list) and default limit.
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?
The description gives explicit when-to-use and when-not-to-use guidance, naming search_legal_acts as the alternative for keyword/title searches. It also mentions using filter_results to narrow results, providing clear routing and post-processing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_legal_dateObliczanie terminu prawnegoARead-onlyIdempotent
Oblicz daty na potrzeby prawne (np. terminy, daty wejścia w życie, vacatio legis).
Dodaje lub odejmuje dni, miesiące i lata od daty bazowej (lub dzisiejszej). Wartości dodatnie = przyszłość, ujemne = przeszłość.
Przykłady:
calculate_legal_date(days=14) - Termin 14 dni od dziś (np. termin na odwołanie)
calculate_legal_date(days=30, base_date="2024-06-01") - 30 dni od 1 czerwca 2024
calculate_legal_date(years=1, base_date="2024-01-01") - Rok po 1 stycznia 2024
calculate_legal_date(days=-90) - 90 dni wstecz od dziś
calculate_legal_date(months=6, days=15) - 6 miesięcy i 15 dni od dziś
calculate_legal_date(years=-5, base_date="2024") - 5 lat przed 1 stycznia 2024
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Liczba dni do dodania (+) lub odjęcia (-). Np. days=14 = za 14 dni, days=-14 = 14 dni temu. Domyślnie 0. Wartości logiczne (true/false) są niedozwolone. | |
| years | No | Liczba lat do dodania (+) lub odjęcia (-). Np. years=1 = za rok, years=-5 = 5 lat temu. Domyślnie 0. Wartości logiczne (true/false) są niedozwolone. | |
| months | No | Liczba miesięcy do dodania (+) lub odjęcia (-). Np. months=3 = za 3 miesiące, months=-6 = 6 miesięcy temu. Domyślnie 0. Wartości logiczne (true/false) są niedozwolone. | |
| base_date | No | Data bazowa. Akceptowane formaty: 'YYYY-MM-DD' (np. '2024-01-15'), 'YYYY-MM' (np. '2024-01' → 2024-01-01), 'YYYY' (np. '2024' → 2024-01-01). Jeśli nie podano, używa dzisiejszej daty. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the tool's safety profile is known. The description adds a minor behavioral cue: it's a pure calculation with no side effects, but nothing beyond that. Since annotations cover the key behavioral aspects, the description's additional value is limited, hence a 3.
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 description is tight and front-loaded: it states the purpose in the first sentence, explains the arithmetic, and then lists six focused examples. Every sentence earns its place, with no redundancy or fluff. The structure (introduction, rule, examples) is excellent for quick comprehension.
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 tool with 4 optional parameters and an output schema (not shown but indicated), the description covers the essential usage patterns and edge-case formats (e.g., '2024' → '2024-01-01') via base_date description. It does not explain the return format, but that is presumably handled by the output schema. Given the tool's simplicity, the description is complete enough for correct invocation, though it could mention handling of month-end or leap years if relevant—but that's likely covered by the output schema and not necessary here.
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?
The schema already provides full descriptions for all four parameters (coverage 100%). The description goes beyond by offering concrete examples that illustrate parameter combinations (e.g., 'months=6, days=15') and clarifying the sign convention. This adds practical meaning that helps an agent form correct calls. While schema alone is sufficient, the examples and conventions enhance understanding, warranting a score above baseline.
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 clearly states the tool's function: calculating legal dates (deadlines, effective dates, vacatio legis) by adding/subtracting days, months, and years from a base date or today. It distinguishes itself from siblings (which deal with documents, acts, searches) by its computational nature. Specific verb 'calculate' and resource 'legal date' are present.
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?
The description gives clear examples of how to invoke the tool and explains the sign convention (+future, -past). However, it does not explicitly mention when to use this tool over alternatives or any conditions that would make it inappropriate. Sibling tools are not referenced, so an agent must infer that date calculations belong here based on the purpose. There is no explicit exclusion or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_actsPorównanie dwóch aktówARead-onlyIdempotent
Porównaj metadane dwóch aktów prawnych.
Porównuje tytuły, typy, statusy, daty (ogłoszenia, promulgacji, wejścia w życie), słowa kluczowe dwóch aktów. Identyfikuje różnice i wspólne elementy. Nie wymaga wcześniejszego załadowania treści (load_content).
Kiedy użyć: Aby porównać metadane dwóch aktów (np. wersji, powiązanych aktów). Kiedy NIE używać: Do porównania treści → załaduj oba akty i użyj read_act_content.
Przykłady:
compare_acts(eli_a="DU/2024/1692", eli_b="DU/2024/1716") - Porównaj dwa akty z 2024
compare_acts(eli_a="DU/2020/1444", eli_b="DU/2024/1692") - Porównaj starą i nową wersję
compare_acts(eli_a="DU/2024/1", eli_b="DU/2023/2000") - Porównaj akty z różnych lat
compare_acts(eli_a="DU/2024/100", eli_b="MP/2024/200") - Porównaj DU vs MP
compare_acts(eli_a="DU/2021/1500", eli_b="DU/2021/1600") - Porównaj podobne akty
| Name | Required | Description | Default |
|---|---|---|---|
| eli_a | Yes | Identyfikator ELI pierwszego aktu. Format: "{wydawca}/{rok}/{pozycja}". Przykłady: "DU/2024/1716", "MP/2023/500". | |
| eli_b | Yes | Identyfikator ELI drugiego aktu do porównania. Format: "{wydawca}/{rok}/{pozycja}". Przykłady: "DU/2024/1692", "DU/2020/1444". |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive hints. The description adds meaningful behavioral context by stating that no prior load_content is required and that the tool identifies differences and common elements. No contradiction with annotations.
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 description is well-organized with a purpose statement, details, usage rules, and examples. It is front-loaded and efficient, though the five examples are somewhat repetitive; each adds a slight variant but could be trimmed.
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 two-parameter read-only comparison tool with full schema coverage, an output schema, and annotations, the description covers purpose, usage boundaries, and prerequisite behavior. Nothing needed to invoke it correctly 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?
The input schema covers 100% of parameters with format and examples, giving a baseline of 3. The description's examples add extra semantic context—e.g., comparing old and new versions, DU vs MP—thereby clarifying valid combinations and intended use of eli_a and eli_b.
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 opens with a clear verb+resource: 'Porównaj metadane dwóch aktów prawnych' (compare metadata of two legal acts) and enumerates the exact fields compared (titles, types, statuses, dates, keywords). It also explicitly distinguishes itself from content comparison by referring to read_act_content, so an agent can differentiate it from sibling tools.
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?
Contains explicit 'Kiedy użyć' (when to use) and 'Kiedy NIE używać' (when not to use) sections. It names read_act_content as the alternative for content comparison and describes the appropriate scenario (comparing versions/related acts), leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filter_resultsFiltrowanie wyników wyszukiwaniaARead-onlyIdempotent
Filtruj i zawężaj wyniki wcześniejszego wyszukiwania aktów prawnych.
Działa jak grep/filtr na wynikach z search_legal_acts, browse_acts lub track_legal_changes. Wymaga result_set_id zwróconego przez te narzędzia. Przefiltrowane wyniki zapisywane są jako nowy zestaw (nowe result_set_id), który można filtrować dalej.
Limit rozmiaru wejścia: pojedyncze wywołanie przetwarza maksymalnie 100 rekordów (wartość domyślna, konfigurowalna przez operatora). Większy zestaw kończy się błędem, a nie wynikiem częściowym — dzięki temu brak dopasowania zawsze oznacza przeszukanie całego zestawu. Zawęź wyszukiwanie przed filtrowaniem.
Kiedy użyć: Po search_legal_acts/browse_acts/track_legal_changes aby zawęzić wyniki. Kiedy NIE używać: Gdy potrzebujesz nowych wyników z API → użyj search_legal_acts. Kiedy NIE używać: Do dowodzenia, że akt nie istnieje, dopóki pole source_scope odpowiedzi ma wartość 'page' — filtrowane jest wtedy okno, a nie cały zbiór, więc pusty wynik nie rozstrzyga. Odpowiedź sygnalizuje to polem no_match_is_inconclusive.
Przykłady:
filter_results(result_set_id="rs_1", type_equals="Rozporządzenie") - Tylko rozporządzenia
filter_results(result_set_id="rs_1", pattern="zdrow|apteka|lekar") - Akty związane ze zdrowiem
filter_results(result_set_id="rs_1", pattern="podatek|VAT", type_equals="Ustawa") - Ustawy podatkowe
filter_results(result_set_id="rs_1", date_field="promulgation_date", date_from="2024-01-01", date_to="2024-06-30") - Ogłoszone w I połowie 2024
filter_results(result_set_id="rs_1", sort_by="promulgation_date", sort_desc=True, limit=10) - 10 najnowszych na pierwszej stronie
filter_results(result_set_id="rs_1", pattern="\p{L}+ o ochronie") - Wzorzec z klasą unikodową
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | Pole do przeszukania wzorcem RE2. Dostępne: 'title' (domyślne), 'eli', 'status', 'type', 'publisher'. | title |
| limit | No | Maksymalna liczba wyników na stronie odpowiedzi (domyślnie 20, maks. 100). | |
| offset | No | Nieujemne przesunięcie strony wyników. | |
| date_to | No | Koniec zakresu dat (YYYY-MM-DD). Wymaga ustawienia date_field. | |
| pattern | No | Wzorzec wyszukiwania w składni RE2. Wielkość liter jest ignorowana. Obsługiwany podzbiór składni: alternatywa (a|b), klasy znaków ([a-z], \d, \p{L}, [[:alpha:]]), kwantyfikatory (*, +, ?, {n,m}; maksymalnie 4 zmienne zakresy), kotwice (^, $), grupy nieprzechwytujące. Lookaround ((?=...), (?<=...), (?!...)) oraz backreferencje (\1) nie są obsługiwane. Przykłady: 'zdrow|Minister Zdrowia|apteka|lekar', 'budżet.*państw', 'transport|drogow', '\p{L}+ o ochronie' | |
| sort_by | No | Pole do sortowania: 'title', 'year', 'pos', 'promulgation_date', 'effective_date', 'type', 'status'. | |
| date_from | No | Początek zakresu dat (YYYY-MM-DD). Wymaga ustawienia date_field. | |
| sort_desc | No | Sortuj malejąco (True) lub rosnąco (False, domyślnie). | |
| date_field | No | Pole daty do filtrowania zakresem: 'promulgation_date' (data ogłoszenia) lub 'effective_date' (data wejścia w życie). | |
| type_equals | No | Filtruj po typie dokumentu (dokładne dopasowanie). Wartości: 'Ustawa', 'Rozporządzenie', 'Obwieszczenie', 'Komunikat', 'Uchwała', 'Zarządzenie', 'Wyrok', 'Postanowienie', 'Oświadczenie rządowe' | |
| year_equals | No | Filtruj po roku publikacji (dokładne dopasowanie). Np. 2024. | |
| result_set_id | Yes | Identyfikator zestawu wyników z poprzedniego wyszukiwania (np. 'rs_1'). Zwracany przez search_legal_acts, browse_acts lub track_legal_changes w polu result_set_id. | |
| status_equals | No | Filtruj po statusie aktu (dokładne dopasowanie). Wartości: 'akt obowiązujący', 'akt uchylony', 'akt jednorazowy', 'obowiązujący', 'uchylony', 'uznany za uchylony', 'nieobowiązujący' |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent, non-destructive), it discloses the 100-record input limit, that oversized sets error rather than return partial results, and that each filtering round creates a new result_set_id. It also explains the no_match_is_inconclusive signal tied to source_scope, giving agents a clear model of edge-case behavior.
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 description is organized with a short lead, an operation/input section, an input-limit warning, explicit usage/non-usage guidance, and a compact example list. Every block carries distinct information and no sentence is filler.
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 13-parameter filter tool with an output schema and full annotation coverage, the description covers prerequisites, chaining behavior, limit semantics, failure modes, and the key epistemic limitation that empty results may be inconclusive. The examples cover all major filter dimensions, leaving no significant gap for correct invocation.
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 coverage is 100% and the schema already documents each parameter thoroughly, so the baseline is 3; the description earns a 4 by adding worked examples that show meaningful parameter combinations (pattern alternation, date ranges with date_field, sort/limit pagination) and by reinforcing that result_set_id comes from the three named sibling tools. It does not deeply redefine parameters, but the examples add practical selection value.
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 first sentence states a specific verb and resource: filter and narrow results from an earlier legal-acts search. It further distinguishes itself by naming the predecessor tools (search_legal_acts, browse_acts, track_legal_changes) and describing the tool as a grep/filter over their result sets. This clearly separates it from sibling search and browse tools.
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?
The description has explicit 'Kiedy użyć' and two 'Kiedy NIE używać' sections, including the alternative to use search_legal_acts when new results are needed and the caveat about source_scope='page' making empty results inconclusive. This is direct, decision-relevant guidance that prevents misinvocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_act_detailsSzczegóły aktu prawnegoARead-onlyIdempotent
Pobierz szczegółowe informacje o akcie prawnym.
Zwraca metadane: tytuł, status, daty (ogłoszenia, wejścia w życie, uchylenia), słowa kluczowe, spis treści i dostępne formaty (HTML/PDF).
Ustaw load_content=True aby załadować treść — to wymagane przed użyciem read_act_content (czytanie sekcji) i search_in_act (wyszukiwanie w treści).
Kiedy użyć: Aby zobaczyć metadane aktu (status, daty, spis treści). Kiedy NIE używać: Aby czytać treść aktu → użyj read_act_content (po załadowaniu).
Przykłady:
get_act_details(eli="DU/2024/1692") - Metadane i spis treści
get_act_details(eli="DU/2024/1692", load_content=True) - Załaduj treść do analizy
get_act_details(eli="DU/2024/1716") - Sprawdź status, daty i referencje
get_act_details(eli="MP/2024/100") - Akt z Monitora Polskiego
get_act_details(eli="DU/2021/1500") - Sprawdź status i daty obowiązywania
| Name | Required | Description | Default |
|---|---|---|---|
| eli | Yes | Identyfikator ELI aktu. Format: "{wydawca}/{rok}/{pozycja}". Wydawcy: DU (Dziennik Ustaw), MP (Monitor Polski). Przykłady: "DU/2024/1716", "MP/2023/500", "DU/2024/1". | |
| load_content | No | Załaduj treść aktu do Document Store (pamięć). WYMAGANE przed użyciem: read_act_content, search_in_act. Lifecycle: załadowane → TTL 2h → wygasa → wymaga ponownego załadowania. Domyślnie False. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral context by disclosing that load_content=True loads content into the Document Store with a 2-hour TTL, and that this is required before dependent tools. No contradiction with annotations is present.
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 description is well organized with clear sections for purpose, return value, prerequisites, usage guidance, and examples. Each part supports selection and invocation without significant redundancy, and the most important information is front-loaded.
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?
Given 100% schema coverage, rich annotations, an output schema, and explicit cross-tool prerequisites, the description is complete for an agent to invoke the tool correctly. It covers metadata retrieval, content loading, status checks, and example identifiers.
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?
The input schema already describes both parameters in full, so the baseline is 3. The description adds extra value by explaining the load_content lifecycle, listing concrete ELI examples, and noting the required workflow relationship with read_act_content and search_in_act.
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 a specific verb ('Pobierz') and resource ('szczegółowe informacje o akcie prawnym'), then lists the returned metadata types. It explicitly contrasts with read_act_content, so an agent can clearly distinguish this tool from its siblings.
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?
The description provides a clear 'Kiedy użyć' block, an explicit 'Kiedy NIE używać' block naming read_act_content, and states that load_content=True is a prerequisite for read_act_content and search_in_act. This is direct, actionable guidance about when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_system_metadataMetadane systemu ELIARead-onlyIdempotent
Pobierz metadane systemu aktów prawnych.
Zwraca dostępne słowa kluczowe, wydawców, typy dokumentów, statusy i instytucje, które można wykorzystać do filtrowania i wyszukiwania aktów prawnych.
Przykłady:
get_system_metadata(category="keywords") - Dostępne słowa kluczowe do wyszukiwania
get_system_metadata(category="types") - Typy dokumentów (Ustawa, Rozporządzenie itp.)
get_system_metadata(category="publishers") - Wydawcy (DU, MP)
get_system_metadata(category="statuses") - Statusy aktów (obowiązujący, uchylony itp.)
get_system_metadata(category="all") - Wszystkie kategorie metadanych
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maksymalna liczba wartości metadanych na stronie odpowiedzi (domyślnie 20, maks. 100). | |
| offset | No | Nieujemne przesunięcie strony metadanych. | |
| category | No | Kategoria metadanych: 'keywords' (słowa kluczowe do wyszukiwania), 'publishers' (wydawcy: DU, MP), 'statuses' (statusy aktów), 'types' (typy dokumentów: Ustawa, Rozporządzenie itp.), 'institutions' (instytucje wydające), 'all' (wszystkie kategorie). Domyślnie 'all'. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds value by specifying what the tool returns and that these values support filtering/searching. It does not contradict the annotations and provides meaningful behavioral context beyond the schema.
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 description is well-structured and front-loaded: a one-sentence summary, then a return-value overview, then concrete examples. The example bullets are somewhat repetitive but still earn their place by clarifying expected values for the category parameter.
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?
Given the simple read-only metadata nature, full schema coverage for all three parameters, rich annotations, and presence of an output schema, the description is complete enough for an agent to select and invoke the tool correctly without additional context.
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%, with category, limit, and offset all documented. The description's examples reinforce the category parameter but do not add substantially new semantic meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
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 states the specific verb 'Pobierz' and the precise resource: metadata of the legal acts system. It clearly enumerates what is returned (keywords, publishers, document types, statuses, institutions), which distinguishes it from sibling tools that deal with documents, search, or filtering results.
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 explicitly states the metadata can be used for filtering and searching legal acts, giving the agent a clear context for when to call this tool. It does not name alternative sibling tools or exclusions, but the intended use is clearly implied through the examples and the phrase 'do filtrowania i wyszukiwania aktów prawnych'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_loaded_documentsDokumenty załadowane do pamięciARead-onlyIdempotent
Wyświetl dokumenty załadowane do pamięci (Document Store).
Dokumenty ładowane są przez get_act_details(eli=..., load_content=True). Każdy dokument ma TTL 2h — po tym czasie wymaga ponownego załadowania.
Zwraca jedną stronę listy wraz z metadanymi paginacji (page_info).
Kiedy użyć: Aby sprawdzić jakie akty są załadowane i dostępne do czytania/wyszukiwania. Kiedy NIE używać: Do wyszukiwania aktów → użyj search_legal_acts.
Przykłady:
list_loaded_documents() - Wyświetl pierwszą stronę załadowanych dokumentów
list_loaded_documents(limit=5) - Pierwsze pięć dokumentów
list_loaded_documents(limit=5, offset=5) - Kolejna strona
list_loaded_documents(limit=100) - Cała zawartość Document Store
list_loaded_documents(offset=0) - Jawne przesunięcie od początku
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maksymalna liczba dokumentów na stronie odpowiedzi (domyślnie 20, maks. 100). | |
| offset | No | Nieujemne przesunięcie strony dokumentów. Domyślnie 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses critical behavioral details: documents are loaded via get_act_details(eli=..., load_content=True), they have a 2-hour TTL requiring reload, and the tool returns a single page along with page_info. This provides context that the annotations (readOnly, idempotent) do not cover, making the tool's statefulness and lifecycle clear.
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 description is organized into purpose, lifecycle, return, usage, and examples—front-loaded with a clear one-sentence core. It is a bit longer than strictly necessary, but every sentence adds value, and the structured headers make it easy to scan. It could be tightened slightly, hence a high 4 rather than a 5.
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 an unpaged listing tool with no required parameters, the description is comprehensive: it explains what documents are included, how they get there, TTL, pagination, and returns page_info. Combined with the output schema, an agent has everything needed to invoke and interpret results correctly.
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 coverage is 100% for limit and offset, but the description elaborates on practical semantics through examples—showing how limit=100 retrieves the entire store, and mixing limit/offset for page navigation. This transforms the parameters from mechanical API attributes into a mental model for controlling pagination.
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 clearly states the tool's function as listing documents loaded into memory (Document Store), and it explicitly contrasts itself with search_legal_acts in the 'Kiedy NIE używać' section, so an agent can distinguish it from siblings without ambiguity.
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?
The description includes a dedicated 'Kiedy użyć' and 'Kiedy NIE używać' section, explicitly telling the agent to use this tool to inspect loaded acts and pointing to search_legal_acts for searching. It also provides multiple concrete examples covering basic usage, explicit offsets, and page limits, leaving no room for misinterpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_result_setsZestawy wyników w pamięciARead-onlyIdempotent
Wyświetl aktywne zestawy wyników przechowywane w pamięci.
Każde wyszukiwanie (search_legal_acts, browse_acts, track_legal_changes) oraz filtrowanie (filter_results) tworzy zestaw wyników z unikalnym result_set_id. To narzędzie pokazuje aktywne zestawy (TTL: 1h) wraz z metadanymi paginacji.
Kiedy użyć: Aby sprawdzić jakie result_set_id są dostępne do filtrowania. Kiedy NIE używać: Do wyszukiwania nowych aktów → użyj search_legal_acts.
Przykłady:
list_result_sets() - Pierwsza strona aktywnych zestawów
list_result_sets(limit=5) - Pięć najnowszych wpisów strony
list_result_sets(limit=5, offset=5) - Kolejna strona
list_result_sets(limit=100) - Wszystkie aktywne zestawy
list_result_sets(offset=0) - Jawne przesunięcie od początku
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maksymalna liczba zestawów na stronie odpowiedzi (domyślnie 20, maks. 100). | |
| offset | No | Nieujemne przesunięcie strony zestawów. Domyślnie 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds value by disclosing the TTL (1 hour) for active sets, the in-memory storage, and that it returns pagination metadata. These are behavioral traits not present in annotations, and there is no contradiction.
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 description is moderately long but well-structured: it leads with the core purpose, then adds context, usage guidance, and examples in a logical flow. Every section serves a purpose, and the examples are compact. It is slightly more verbose than strictly necessary but not wasteful.
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 tool with only 2 optional parameters, an output schema, and comprehensive annotations, the description covers all necessary aspects: purpose, usage, exclusions, examples, and behavioral details like TTL. Nothing an agent needs to call it correctly 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%, with both limit and offset fully documented in the input schema. The description's examples illustrate how to use them (e.g., limit=5, offset=5) but add no new semantic meaning beyond what the schema already provides. The baseline of 3 applies here.
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 clearly states the tool's function: it lists active result sets stored in memory, each with a unique result_set_id. It differentiates from siblings by explicitly noting it's for checking available result sets for filtering, and it names search_legal_acts as the alternative for new searches. This is a specific verb+resource with clear scope.
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?
The description provides explicit when-to-use (checking which result_set_id are available for filtering) and when-not-to-use (searching for new acts, use search_legal_acts). It also includes multiple usage examples with different parameter combinations, leaving no ambiguity about invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_act_contentCzytanie treści aktuARead-onlyIdempotent
Czytaj treść załadowanego aktu prawnego po sekcjach.
WYMAGANIE: Akt musi być wcześniej załadowany za pomocą get_act_details(eli=..., load_content=True).
Bez parametru section zwraca spis treści (listę sekcji). Z parametrem section zwraca treść wybranej sekcji.
Kiedy użyć: Aby czytać treść konkretnej sekcji załadowanego aktu. Kiedy NIE używać: Aby zobaczyć metadane → użyj get_act_details.
Przykłady:
read_act_content(eli="DU/2024/1692") - Spis treści (lista sekcji)
read_act_content(eli="DU/2024/1692", section="Art. 1") - Treść artykułu 1
read_act_content(eli="DU/2024/1692", section="Rozdział 1") - Treść rozdziału 1
read_act_content(eli="DU/2024/1692", section="Dział II") - Treść działu II
read_act_content(eli="MP/2024/100") - Spis treści aktu z MP
| Name | Required | Description | Default |
|---|---|---|---|
| eli | Yes | Identyfikator ELI aktu. Format: "{wydawca}/{rok}/{pozycja}". Wydawcy: DU (Dziennik Ustaw), MP (Monitor Polski). Przykłady: "DU/2024/1716", "MP/2023/500", "DU/2024/1". Akt MUSI być wcześniej załadowany przez get_act_details(eli=..., load_content=True). | |
| limit | No | Maksymalna liczba elementów lub znaków na stronie. Domyślnie zależy od trybu odczytu. | |
| offset | No | Nieujemne przesunięcie początku strony. Domyślnie 0. | |
| section | No | Identyfikator sekcji do odczytania. Można użyć surowego ID (np. 'art_1') lub formy czytelnej (np. 'Art. 1', 'Rozdział 1') - obsługiwane jest elastyczne dopasowanie. Aby poznać dostępne section_id, użyj get_act_details(load_content=true) i sprawdź tabelę treści. Jeśli None — zwraca spis treści z dostępnymi sekcjami. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and idempotentHint, and the description adds meaningful behavioral context: no section returns a table of contents, a section returns its content, and the act must be preloaded. This goes beyond the annotations without contradicting them.
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?
Well-structured, front-loaded with the core purpose, then requirements, usage guidance, and examples. Every block earns its place; the examples are compact and directly illustrate valid parameter combinations without unnecessary prose.
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?
Given the output schema exists and annotations cover safety, the description is complete: it states prerequisites, behavior variants, when to use/not use, and provides examples. Nothing critical is missing for an agent to invoke the tool correctly.
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 coverage is 100%, so the baseline is 3. The description adds value beyond the schema by giving disambiguating examples for the section parameter ('Art. 1', 'Rozdział 1', 'Dział II') and showing eli variants for both DU and MP publishers, clarifying intended usage.
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?
Description opens with a specific verb and resource: 'Czytaj treść załadowanego aktu prawnego po sekcjach.' It clearly differentiates from the sibling get_act_details by explicitly stating that metadata should be obtained there, making the scope unambiguous.
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?
Provides an explicit prerequisite (act must be loaded with get_act_details(eli=..., load_content=True)), a dedicated 'Kiedy użyć' section, a 'Kiedy NIE używać' section naming the alternative, and concrete invocation examples. This fully routes the agent to the correct tool and usage pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_in_actWyszukiwanie w treści aktuARead-onlyIdempotent
Wyszukaj termin w treści załadowanego aktu prawnego.
WYMAGANIE: Akt musi być wcześniej załadowany za pomocą get_act_details(eli=..., load_content=True).
Zwraca jedną stronę trafień z kontekstem, metadanymi paginacji i informacją o sekcji.
Przykłady:
search_in_act(eli="DU/2024/1692", query="straż") - Znajdź "straż" w akcie
search_in_act(eli="DU/2024/1692", query="obowiązek", context_chars=200) - Z krótszym kontekstem
search_in_act(eli="DU/2024/1692", query="art. 5", limit=10, offset=0) - Pierwsza strona trafień
search_in_act(eli="DU/2024/1692", query="kara", limit=5, offset=5) - Kolejna strona trafień
search_in_act(eli="DU/2024/1692", query="termin") - Domyślna strona (do 20 trafień)
| Name | Required | Description | Default |
|---|---|---|---|
| eli | Yes | Identyfikator ELI aktu. Format: "{wydawca}/{rok}/{pozycja}". Wydawcy: DU (Dziennik Ustaw), MP (Monitor Polski). Przykłady: "DU/2024/1716", "MP/2023/500", "DU/2024/1". Akt MUSI być wcześniej załadowany przez get_act_details(eli=..., load_content=True). | |
| limit | No | Maksymalna liczba trafień na stronie. Domyślnie 20, maksimum 100. | |
| query | Yes | Termin do wyszukania w treści aktu (np. 'podatek', 'obowiązek', 'art. 5'). Wielkość liter jest ignorowana. | |
| offset | No | Nieujemne przesunięcie początku strony. Domyślnie 0. | |
| context_chars | No | Liczba znaków kontekstu przed i po każdym trafieniu. Domyślnie 500. Maksymalnie 2000 — wartości większe są przycinane do 2000, a odpowiedź zawiera wtedy wskazówkę o przycięciu. Wywołanie nie kończy się błędem. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, and the description adds a stateful dependency (prior load required) that annotations cannot express. It also discloses the return shape — one page of hits with context, pagination metadata, and section info — plus clamping behavior for context_chars. This exceeds what the annotation hints alone provide.
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 description is front-loaded with purpose, then a single-line requirement, a compact return summary, and five examples that each demonstrate a distinct parameter combination. No sentence is wasted and the structure makes the requirement immediately scannable.
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?
With an output schema present, return values need not be detailed, yet the description still summarizes the response. The stateful prerequisite, pagination semantics, default limit, and case-insensitivity are all covered across description and schema, leaving no gaps for an agent to call it correctly.
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 the baseline is 3, but the examples add value beyond the schema by demonstrating parameter interplay: limit/offset paging patterns (limit=5, offset=5 as the next page) and context_chars usage. The default page of up to 20 hits is reinforced by example, aligning with the schema's default values.
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 opening sentence states a specific verb and resource: 'Wyszukaj termin w treści załadowanego aktu prawnego' (search a term in the content of a loaded legal act). The qualifier 'załadowanego' distinguishes it from sibling search_legal_acts, which searches the corpus, making the tool's scope unambiguous.
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?
The WYMAGANIE block gives an explicit prerequisite: the act must be loaded via get_act_details(eli=..., load_content=True) before searching. This is clear context, though the description does not name search_legal_acts as the alternative for corpus-wide searches or state explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_legal_actsWyszukiwanie aktów prawnychARead-onlyIdempotent
Wyszukaj polskie akty prawne z Dziennika Ustaw (DU) i Monitora Polskiego (MP).
UWAGA: Wszystkie słowa kluczowe muszą wystąpić jednocześnie (logika AND). Szukaj jednego słowa na raz dla logiki OR.
Kiedy użyć: Gdy znasz słowa kluczowe, tytuł, typ lub kryteria wyszukiwania. Kiedy NIE używać: Gdy chcesz przeglądać cały rocznik → użyj browse_acts.
Po wyszukiwaniu możesz użyć filter_results(result_set_id=...) aby dalej zawęzić wyniki (np. regex na tytułach, filtr po typie dokumentu).
Przykłady:
search_legal_acts(keywords=["podatek"], year=2024) - Akty podatkowe z 2024
search_legal_acts(act_type="Ustawa", title="zdrowotny") - Ustawy o zdrowiu
search_legal_acts(act_type="Rozporządzenie", year=2024, in_force=True) - Obowiązujące rozporządzenia z 2024
search_legal_acts(publisher="MP", year=2024, limit=10) - 10 aktów z MP z 2024
search_legal_acts(date_from="2024-01-01", date_to="2024-06-30") - Akty wchodzące w życie I poł. 2024
search_legal_acts(pub_date_from="2024-03-01", pub_date_to="2024-03-31") - Ogłoszone w marcu 2024
search_legal_acts(title="budżet", year=2024) - Akty budżetowe z 2024
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Rok publikacji (np. 2024). | |
| limit | No | Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Przydatne do ograniczenia dużych zbiorów. Nie jest przycinana do 100 jak w pozostałych narzędziach listujących, ponieważ trafia wprost do zapytania do api.sejm.gov.pl — publicznej usługi instytucji państwowej. Podawaj najmniejszą wystarczającą wartość. | |
| title | No | Szukaj w tytule aktu (dopasowanie podciągu). Np. 'budżet', 'przeciwpożarow', 'podatek dochodowy'. | |
| offset | No | Liczba wyników do pominięcia (paginacja). Użyj z parametrem limit. | |
| date_to | No | Data wejścia w życie DO (YYYY-MM-DD). Filtruje akty które weszły w życie do tej daty. | |
| act_type | No | Typ dokumentu (dokładne dopasowanie). Dostępne wartości: 'Ustawa', 'Rozporządzenie', 'Obwieszczenie', 'Komunikat', 'Uchwała', 'Zarządzenie', 'Wyrok', 'Postanowienie', 'Oświadczenie rządowe'. Użyj get_system_metadata(category='types') aby zobaczyć pełną listę. | |
| in_force | No | Filtruj po obowiązywaniu: true = tylko akty obecnie obowiązujące, false = tylko akty nieobowiązujące, None = wszystkie. | |
| keywords | No | Słowa kluczowe z systemu Sejmu (logika AND — wiele słów zawęża wyniki). Aby uzyskać logikę OR, wykonaj oddzielne wyszukiwanie dla każdego słowa. Użyj get_system_metadata(category='keywords') aby poznać dostępne słowa kluczowe. | |
| date_from | No | Data wejścia w życie OD (YYYY-MM-DD). Filtruje akty które weszły w życie od tej daty. | |
| publisher | No | Kod wydawcy: 'DU' (Dziennik Ustaw) lub 'MP' (Monitor Polski). Domyślnie 'DU'. | DU |
| pub_date_to | No | Data publikacji/ogłoszenia DO (YYYY-MM-DD). Filtruje po dacie ogłoszenia w dzienniku. | |
| detail_level | No | Poziom szczegółowości wyników: 'minimal' (ELI, tytuł, status), 'standard' (+ typ, daty, obowiązywanie), 'full' (wszystkie pola). Domyślnie 'standard'. | standard |
| pub_date_from | No | Data publikacji/ogłoszenia OD (YYYY-MM-DD). Filtruje po dacie ogłoszenia w dzienniku. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds valuable behavioral context by warning that all keywords must match (AND logic) and explaining how to achieve OR logic by searching one word at a time. It does not contradict annotations and supplements them meaningfully.
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 description is well-structured with a clear opening, a critical keyword-logic notice, explicit usage boundaries, a follow-up workflow hint, and compact labeled examples. Every section serves a distinct purpose and the examples are formatted for quick parsing, so the length is justified.
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 tool with 13 optional parameters, the description covers the primary search semantics, the AND/OR behavior, when to avoid the tool, how to refine results with filter_results, and realistic parameter combinations. With an output schema present and full schema descriptions for parameters, there is no missing information an agent needs to invoke this tool correctly.
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 coverage is 100%, so the description is not required to document each parameter. However, it goes beyond the schema by providing seven concrete example calls that illustrate valid combinations of keywords, act_type, title, year, in_force, publisher, date ranges, pub_date ranges, and limit. This makes parameter semantics much more actionable than a bare schema.
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 opens with a specific verb and resource: 'Wyszukaj polskie akty prawne z Dziennika Ustaw (DU) i Monitora Polskiego (MP).' It clearly defines the tool as a search over legal acts and differentiates it from browsing an entire yearbook by explicitly routing that case to browse_acts. The wording is unambiguous and action-oriented.
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?
The description provides explicit 'Kiedy użyć' and 'Kiedy NIE używać' guidance, including the exact alternative tool browse_acts for yearbook browsing. It also explains the follow-up use of filter_results(result_set_id=...) to narrow results, which helps an agent understand the intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_legal_changesŚledzenie zmian w prawieARead-onlyIdempotent
Śledź zmiany prawne i nowe publikacje w zakresie dat.
Zwraca akty prawne opublikowane lub zmienione w podanym zakresie dat. Wyniki zapisywane są do result_set_id — użyj filter_results aby je zawęzić (np. po typie dokumentu lub wzorcem regex w tytule).
Przykłady:
track_legal_changes(date_from="2025-01-01") - Zmiany od początku 2025
track_legal_changes(date_from="2024-01-01", date_to="2024-12-31") - Zmiany w 2024
track_legal_changes(date_from="2024-01-01", keywords=["podatek"]) - Zmiany podatkowe w 2024
track_legal_changes(date_from="2024-06-01", publisher="MP") - Zmiany w MP od czerwca 2024
track_legal_changes(date_from="2024-01-01", keywords=["zdrowotny"]) - Zmiany zdrowotne
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maksymalna liczba zmian na stronie odpowiedzi (domyślnie 20, maks. 100). | |
| offset | No | Nieujemne przesunięcie strony zmian. | |
| date_to | No | Data końcowa śledzenia (YYYY-MM-DD). Domyślnie dzisiejsza data. | |
| keywords | No | Słowa kluczowe do filtrowania zmian (logika AND). Np. ['podatek'], ['zdrowotny', 'ubezpieczenie']. | |
| date_from | Yes | Data początkowa śledzenia (YYYY-MM-DD). Np. '2024-01-01'. | |
| publisher | No | Kod wydawcy: 'DU' (Dziennik Ustaw) lub 'MP' (Monitor Polski). Domyślnie 'DU'. | DU |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The actual response data |
| hints | No | Suggested next steps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, open-world, idempotent, and non-destructive behavior. The description adds meaningful behavioral context by disclosing that results are saved to result_set_id and can be further filtered via filter_results. It also explains the matching rule: acts published or changed in the supplied date range.
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 description is front-loaded with the core purpose and then provides a clear result-set note followed by practical examples. The examples are somewhat repetitive but compact and helpful for understanding parameter usage. There is no filler or unnecessary explanation.
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 date-based legal-change listing tool, the description covers the essential behavior, the result_set_id handoff, and representative parameter usage. An output schema exists, so the return structure does not need to be repeated. It could more explicitly contrast with sibling tools, but that gap is mostly captured under usage guidelines.
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?
The input schema describes all six parameters with 100% coverage, so the baseline of 3 applies. The description's examples usefully illustrate valid combinations of date_from, date_to, keywords, and publisher, but they do not add significant meaning beyond the schema. Limit, offset, and date format are already handled by the schema.
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 states a specific verb and resource: it returns legal acts published or changed within a given date range. This clearly distinguishes it from sibling tools like search_legal_acts or browse_acts by its date-change focus. The examples reinforce the purpose without relying on the title alone.
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?
The description provides clear context: use this tool for legal changes/new publications by date, and then narrow results with filter_results. It gives concrete examples for date_from, date_to, keywords, and publisher. It does not explicitly name alternative sibling tools or state when not to use them, so it stops short of a 5.
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.
13 tool updates
v4.4.0- Changed
analyze_act_relationships1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
browse_acts1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
calculate_legal_date1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
compare_acts1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
filter_results1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
get_act_details1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
get_system_metadata1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
list_loaded_documents1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
list_result_sets1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
read_act_content1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
search_in_act1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
search_legal_acts1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
- Changed
track_legal_changes1 field changed- removed
Output schema / properties / metadataRemoved value: -{ - "additionalProperties": true, - "description": "Additional metadata", - "title": "Metadata", - "type": "object" -}
1 tool update
v4.3.0- Changed
get_act_details2 fields changed- added
Output schema / $defs / ActDetailOutput / properties / content_statusAdded value: +{ + "$ref": "#/$defs/ContentStatus", + "default": "not_requested", + "description": "Wynik ładowania treści. 'not_requested' — wywołanie nie prosiło o treść. 'loaded' — treść jest w pamięci (mogła zostać załadowana bieżącym albo wcześniejszym wywołaniem), można użyć read_act_content i search_in_act. 'unavailable' — akt trwale nie ma czytelnego tekstu w API; ponowne ładowanie nic nie zmieni." +} - added
Output schema / $defs / ContentStatusAdded value: +{ + "description": "Outcome of the content-loading half of `get_act_details`.\n\nDeliberately has no member for a transient upstream failure: that path\nends as a protocol error, so it never reaches a response body (D2, D6).", + "enum": [ + "not_requested", + "loaded", + "unavailable" + ], + "title": "ContentStatus", + "type": "string" +}
5 tool updates
v4.2.0- Changed
browse_acts5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maksymalna liczba wyników do zwrócenia. Domyślnie 20, maksymalnie 100 — wartości powyżej są przycinane, tak samo jak w pozostałych narzędziach listujących."New value: +"Maksymalna liczba wyników do zwrócenia. Domyślnie 20, maksymalnie 100 — wartości powyżej są przycinane, tak samo jak w pozostałych narzędziach listujących. Podawaj najmniejszą wystarczającą wartość." - added
Output schema / $defs / ActSummaryOutput / properties / effective_date / descriptionAdded value: +"Data wejścia w życie (entryIntoForce)." - added
Output schema / $defs / ResultSetScopeAdded value: +{ + "description": "Zasięg zestawu wyników względem korpusu, z którego pochodzi.", + "properties": { + "corpus_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rozmiar korpusu, z którego pochodzi zestaw. None, gdy nieznany — tak jest dla zestawu powstałego z filtrowania okna: wiadomo, ile rekordów trafiło w oknie, nie wiadomo, ile rekordów korpusu pasowałoby do tych samych kryteriów.", + "title": "Corpus Count" + }, + "scope": { + "$ref": "#/$defs/SetScope", + "description": "'complete' — zestaw zawiera każdy rekord pasujący do zapytania w chwili wywołania. 'page' — zestaw jest oknem wyciętym z większego korpusu, więc brak dopasowania w filter_results NIE dowodzi, że akt nie istnieje w zbiorze." + }, + "stored_count": { + "description": "Liczba rekordów w tym zestawie.", + "title": "Stored Count", + "type": "integer" + }, + "window_offset": { + "description": "Pozycja początku okna w korpusie. Zero dla zestawu kompletnego.", + "title": "Window Offset", + "type": "integer" + } + }, + "required": [ + "scope", + "stored_count", + "window_offset" + ], + "title": "ResultSetScope", + "type": "object" +} - added
Output schema / $defs / SearchOutput / properties / result_set_scopeAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ResultSetScope" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zasięg zapisanego zestawu wyników. None, gdy zestaw nie powstał (zero wyników). Wartość 'page' oznacza, że filter_results zawęża okno, a nie cały zbiór." +} - added
Output schema / $defs / SetScopeAdded value: +{ + "description": "Whether a stored result set is the whole answer or a window into it.", + "enum": [ + "complete", + "page" + ], + "title": "SetScope", + "type": "string" +}
- Changed
filter_results7 fields changed- added
Output schema / $defs / ActSummaryOutput / properties / effective_date / descriptionAdded value: +"Data wejścia w życie (entryIntoForce)." - added
Output schema / $defs / FilterOutput / properties / no_match_is_inconclusiveAdded value: +{ + "default": false, + "description": "True, gdy filtrowano okno i nic nie dopasowano. Wynik NIE rozstrzyga, czy akt istnieje w zbiorze — przeszukano tylko okno. Poszerz zestaw albo zawęź kryteria wyszukiwania przed wyciągnięciem wniosku.", + "title": "No Match Is Inconclusive", + "type": "boolean" +} - added
Output schema / $defs / FilterOutput / properties / result_set_scopeAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ResultSetScope" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zasięg zestawu powstałego z filtrowania. None, gdy nic nie dopasowano." +} - added
Output schema / $defs / FilterOutput / properties / source_scopeAdded value: +{ + "$ref": "#/$defs/ResultSetScope", + "description": "Zasięg zestawu, który filtrowano — decyduje, czego dowodzi pusty wynik." +} - changed
Output schema / $defs / FilterOutput / requiredPrevious value: -[ - "source_result_set_id", - "results", - "original_count", - "filtered_count", - "page_info" -]New value: +[ + "source_result_set_id", + "results", + "original_count", + "filtered_count", + "source_scope", + "page_info" +] - added
Output schema / $defs / ResultSetScopeAdded value: +{ + "description": "Zasięg zestawu wyników względem korpusu, z którego pochodzi.", + "properties": { + "corpus_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rozmiar korpusu, z którego pochodzi zestaw. None, gdy nieznany — tak jest dla zestawu powstałego z filtrowania okna: wiadomo, ile rekordów trafiło w oknie, nie wiadomo, ile rekordów korpusu pasowałoby do tych samych kryteriów.", + "title": "Corpus Count" + }, + "scope": { + "$ref": "#/$defs/SetScope", + "description": "'complete' — zestaw zawiera każdy rekord pasujący do zapytania w chwili wywołania. 'page' — zestaw jest oknem wyciętym z większego korpusu, więc brak dopasowania w filter_results NIE dowodzi, że akt nie istnieje w zbiorze." + }, + "stored_count": { + "description": "Liczba rekordów w tym zestawie.", + "title": "Stored Count", + "type": "integer" + }, + "window_offset": { + "description": "Pozycja początku okna w korpusie. Zero dla zestawu kompletnego.", + "title": "Window Offset", + "type": "integer" + } + }, + "required": [ + "scope", + "stored_count", + "window_offset" + ], + "title": "ResultSetScope", + "type": "object" +} - added
Output schema / $defs / SetScopeAdded value: +{ + "description": "Whether a stored result set is the whole answer or a window into it.", + "enum": [ + "complete", + "page" + ], + "title": "SetScope", + "type": "string" +}
- Changed
list_result_sets3 fields changed- added
Output schema / $defs / ResultSetInfo / properties / scopeAdded value: +{ + "$ref": "#/$defs/SetScope", + "description": "Zasięg zestawu: 'complete' (cały zbiór) albo 'page' (okno z większego zbioru)." +} - changed
Output schema / $defs / ResultSetInfo / requiredPrevious value: -[ - "result_set_id", - "query_summary", - "result_count", - "total_count", - "created_at" -]New value: +[ + "result_set_id", + "query_summary", + "result_count", + "total_count", + "scope", + "created_at" +] - added
Output schema / $defs / SetScopeAdded value: +{ + "description": "Whether a stored result set is the whole answer or a window into it.", + "enum": [ + "complete", + "page" + ], + "title": "SetScope", + "type": "string" +}
- Changed
search_legal_acts5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Przydatne do ograniczenia dużych zbiorów. Bez górnej granicy — w odróżnieniu od pozostałych narzędzi listujących, gdzie limit jest przycinany do 100."New value: +"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Przydatne do ograniczenia dużych zbiorów. Nie jest przycinana do 100 jak w pozostałych narzędziach listujących, ponieważ trafia wprost do zapytania do api.sejm.gov.pl — publicznej usługi instytucji państwowej. Podawaj najmniejszą wystarczającą wartość." - added
Output schema / $defs / ActSummaryOutput / properties / effective_date / descriptionAdded value: +"Data wejścia w życie (entryIntoForce)." - added
Output schema / $defs / ResultSetScopeAdded value: +{ + "description": "Zasięg zestawu wyników względem korpusu, z którego pochodzi.", + "properties": { + "corpus_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rozmiar korpusu, z którego pochodzi zestaw. None, gdy nieznany — tak jest dla zestawu powstałego z filtrowania okna: wiadomo, ile rekordów trafiło w oknie, nie wiadomo, ile rekordów korpusu pasowałoby do tych samych kryteriów.", + "title": "Corpus Count" + }, + "scope": { + "$ref": "#/$defs/SetScope", + "description": "'complete' — zestaw zawiera każdy rekord pasujący do zapytania w chwili wywołania. 'page' — zestaw jest oknem wyciętym z większego korpusu, więc brak dopasowania w filter_results NIE dowodzi, że akt nie istnieje w zbiorze." + }, + "stored_count": { + "description": "Liczba rekordów w tym zestawie.", + "title": "Stored Count", + "type": "integer" + }, + "window_offset": { + "description": "Pozycja początku okna w korpusie. Zero dla zestawu kompletnego.", + "title": "Window Offset", + "type": "integer" + } + }, + "required": [ + "scope", + "stored_count", + "window_offset" + ], + "title": "ResultSetScope", + "type": "object" +} - added
Output schema / $defs / SearchOutput / properties / result_set_scopeAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ResultSetScope" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zasięg zapisanego zestawu wyników. None, gdy zestaw nie powstał (zero wyników). Wartość 'page' oznacza, że filter_results zawęża okno, a nie cały zbiór." +} - added
Output schema / $defs / SetScopeAdded value: +{ + "description": "Whether a stored result set is the whole answer or a window into it.", + "enum": [ + "complete", + "page" + ], + "title": "SetScope", + "type": "string" +}
- Changed
track_legal_changes4 fields changed- added
Output schema / $defs / ActSummaryOutput / properties / effective_date / descriptionAdded value: +"Data wejścia w życie (entryIntoForce)." - added
Output schema / $defs / ChangesOutput / properties / result_set_scopeAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ResultSetScope" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zasięg zapisanego zestawu zmian: 'complete', gdy pierwsza strona mieści cały zakres dat, albo 'page', gdy zakres jest szerszy niż jedna strona — wtedy filter_results przeszukuje tylko to okno." +} - added
Output schema / $defs / ResultSetScopeAdded value: +{ + "description": "Zasięg zestawu wyników względem korpusu, z którego pochodzi.", + "properties": { + "corpus_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Rozmiar korpusu, z którego pochodzi zestaw. None, gdy nieznany — tak jest dla zestawu powstałego z filtrowania okna: wiadomo, ile rekordów trafiło w oknie, nie wiadomo, ile rekordów korpusu pasowałoby do tych samych kryteriów.", + "title": "Corpus Count" + }, + "scope": { + "$ref": "#/$defs/SetScope", + "description": "'complete' — zestaw zawiera każdy rekord pasujący do zapytania w chwili wywołania. 'page' — zestaw jest oknem wyciętym z większego korpusu, więc brak dopasowania w filter_results NIE dowodzi, że akt nie istnieje w zbiorze." + }, + "stored_count": { + "description": "Liczba rekordów w tym zestawie.", + "title": "Stored Count", + "type": "integer" + }, + "window_offset": { + "description": "Pozycja początku okna w korpusie. Zero dla zestawu kompletnego.", + "title": "Window Offset", + "type": "integer" + } + }, + "required": [ + "scope", + "stored_count", + "window_offset" + ], + "title": "ResultSetScope", + "type": "object" +} - added
Output schema / $defs / SetScopeAdded value: +{ + "description": "Whether a stored result set is the whole answer or a window into it.", + "enum": [ + "complete", + "page" + ], + "title": "SetScope", + "type": "string" +}
1 tool update
v4.0.2- Changed
browse_acts1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Bez górnej granicy — w odróżnieniu od pozostałych narzędzi listujących, gdzie limit jest przycinany do 100."New value: +"Maksymalna liczba wyników do zwrócenia. Domyślnie 20, maksymalnie 100 — wartości powyżej są przycinane, tak samo jak w pozostałych narzędziach listujących."
13 tool updates
v3.1.0- Changed
analyze_act_relationships11 fields changed- added
Input schema / properties / eli / titleAdded value: +"Eli" - added
Input schema / properties / relationship_type / titleAdded value: +"Relationship Type" - added
Input schema / titleAdded value: +"analyze_act_relationshipsArguments" - added
Output schema / $defsAdded value: +{ + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "RelationshipsOutput": { + "description": "Output for act relationships.", + "properties": { + "eli": { + "title": "Eli", + "type": "string" + }, + "relationship_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Relationship Type" + }, + "relationships": { + "additionalProperties": true, + "title": "Relationships", + "type": "object" + }, + "total_count": { + "title": "Total Count", + "type": "integer" + } + }, + "required": [ + "eli", + "relationships", + "total_count" + ], + "title": "RelationshipsOutput", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/RelationshipsOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[RelationshipsOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
browse_acts15 fields changed- added
Input schema / properties / detail_level / titleAdded value: +"Detail Level" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maksymalna liczba wyników do zwrócenia. Domyślnie 20."New value: +"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Bez górnej granicy — w odróżnieniu od pozostałych narzędzi listujących, gdzie limit jest przycinany do 100." - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Liczba wyników do pominięcia (paginacja). Użyj razem z limit. Domyślnie 0.", + "title": "Offset" +} - added
Input schema / properties / publisher / titleAdded value: +"Publisher" - added
Input schema / properties / year / titleAdded value: +"Year" - added
Input schema / titleAdded value: +"browse_actsArguments" - added
Output schema / $defsAdded value: +{ + "ActSummaryOutput": { + "description": "Formatted output for act summary.", + "properties": { + "effective_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Effective Date" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "in_force": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "In Force" + }, + "pos": { + "title": "Pos", + "type": "integer" + }, + "promulgation_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Promulgation Date" + }, + "publisher": { + "title": "Publisher", + "type": "string" + }, + "status": { + "title": "Status", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Type" + }, + "year": { + "title": "Year", + "type": "integer" + } + }, + "required": [ + "eli", + "publisher", + "year", + "pos", + "title", + "status" + ], + "title": "ActSummaryOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + }, + "SearchOutput": { + "description": "Output for search results.", + "properties": { + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "query_summary": { + "title": "Query Summary", + "type": "string" + }, + "result_set_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Result Set Id" + }, + "results": { + "items": { + "$ref": "#/$defs/ActSummaryOutput" + }, + "title": "Results", + "type": "array" + }, + "returned_count": { + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "title": "Total Count", + "type": "integer" + } + }, + "required": [ + "results", + "total_count", + "query_summary", + "returned_count", + "page_info" + ], + "title": "SearchOutput", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/SearchOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[SearchOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
calculate_legal_date19 fields changed- added
Input schema / properties / base_date / titleAdded value: +"Base Date" - changed
Input schema / properties / days / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "boolean" + } +] - changed
Input schema / properties / days / descriptionPrevious value: -"Liczba dni do dodania (+) lub odjęcia (-). Np. days=14 = za 14 dni, days=-14 = 14 dni temu. Domyślnie 0."New value: +"Liczba dni do dodania (+) lub odjęcia (-). Np. days=14 = za 14 dni, days=-14 = 14 dni temu. Domyślnie 0. Wartości logiczne (true/false) są niedozwolone." - added
Input schema / properties / days / titleAdded value: +"Days" - changed
Input schema / properties / months / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "boolean" + } +] - changed
Input schema / properties / months / descriptionPrevious value: -"Liczba miesięcy do dodania (+) lub odjęcia (-). Np. months=3 = za 3 miesiące, months=-6 = 6 miesięcy temu. Domyślnie 0."New value: +"Liczba miesięcy do dodania (+) lub odjęcia (-). Np. months=3 = za 3 miesiące, months=-6 = 6 miesięcy temu. Domyślnie 0. Wartości logiczne (true/false) są niedozwolone." - added
Input schema / properties / months / titleAdded value: +"Months" - changed
Input schema / properties / years / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "boolean" + } +] - changed
Input schema / properties / years / descriptionPrevious value: -"Liczba lat do dodania (+) lub odjęcia (-). Np. years=1 = za rok, years=-5 = 5 lat temu. Domyślnie 0."New value: +"Liczba lat do dodania (+) lub odjęcia (-). Np. years=1 = za rok, years=-5 = 5 lat temu. Domyślnie 0. Wartości logiczne (true/false) są niedozwolone." - added
Input schema / properties / years / titleAdded value: +"Years" - added
Input schema / titleAdded value: +"calculate_legal_dateArguments" - added
Output schema / $defsAdded value: +{ + "DateOutput": { + "description": "Output for date calculation.", + "properties": { + "base_date": { + "title": "Base Date", + "type": "string" + }, + "calculated_date": { + "title": "Calculated Date", + "type": "string" + }, + "days_offset": { + "title": "Days Offset", + "type": "integer" + }, + "description": { + "title": "Description", + "type": "string" + }, + "months_offset": { + "title": "Months Offset", + "type": "integer" + }, + "years_offset": { + "title": "Years Offset", + "type": "integer" + } + }, + "required": [ + "base_date", + "calculated_date", + "days_offset", + "months_offset", + "years_offset", + "description" + ], + "title": "DateOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/DateOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[DateOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
compare_acts11 fields changed- added
Input schema / properties / eli_a / titleAdded value: +"Eli A" - added
Input schema / properties / eli_b / titleAdded value: +"Eli B" - added
Input schema / titleAdded value: +"compare_actsArguments" - added
Output schema / $defsAdded value: +{ + "CompareOutput": { + "description": "Output for comparing two acts.", + "properties": { + "common_keywords": { + "items": { + "type": "string" + }, + "title": "Common Keywords", + "type": "array" + }, + "comparison": { + "additionalProperties": true, + "title": "Comparison", + "type": "object" + }, + "differences": { + "items": { + "type": "string" + }, + "title": "Differences", + "type": "array" + }, + "eli_a": { + "title": "Eli A", + "type": "string" + }, + "eli_b": { + "title": "Eli B", + "type": "string" + } + }, + "required": [ + "eli_a", + "eli_b", + "comparison", + "common_keywords", + "differences" + ], + "title": "CompareOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/CompareOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[CompareOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
filter_results26 fields changed- added
Input schema / properties / date_field / titleAdded value: +"Date Field" - added
Input schema / properties / date_from / titleAdded value: +"Date From" - added
Input schema / properties / date_to / titleAdded value: +"Date To" - changed
Input schema / properties / field / descriptionPrevious value: -"Pole do przeszukania wzorcem regex. Dostępne: 'title' (domyślne), 'eli', 'status', 'type', 'publisher'."New value: +"Pole do przeszukania wzorcem RE2. Dostępne: 'title' (domyślne), 'eli', 'status', 'type', 'publisher'." - added
Input schema / properties / field / titleAdded value: +"Field" - changed
Input schema / properties / limit / defaultPrevious value: -nullNew value: +20 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maksymalna liczba wyników do zwrócenia."New value: +"Maksymalna liczba wyników na stronie odpowiedzi (domyślnie 20, maks. 100)." - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie strony wyników.", + "title": "Offset" +} - changed
Input schema / properties / pattern / descriptionPrevious value: -"Wzorzec regex do przeszukania pola (obsługuje OR: 'podatek|VAT|akcyza'). Wielkość liter jest ignorowana. Przykłady: 'zdrow|Minister Zdrowia|apteka|lekar', 'budżet.*państw', 'transport|drogow'"New value: +"Wzorzec wyszukiwania w składni RE2. Wielkość liter jest ignorowana. Obsługiwany podzbiór składni: alternatywa (a|b), klasy znaków ([a-z], \\d, \\p{L}, [[:alpha:]]), kwantyfikatory (*, +, ?, {n,m}; maksymalnie 4 zmienne zakresy), kotwice (^, $), grupy nieprzechwytujące. Lookaround ((?=...), (?<=...), (?!...)) oraz backreferencje (\\1) nie są obsługiwane. Przykłady: 'zdrow|Minister Zdrowia|apteka|lekar', 'budżet.*państw', 'transport|drogow', '\\p{L}+ o ochronie'" - added
Input schema / properties / pattern / titleAdded value: +"Pattern" - added
Input schema / properties / result_set_id / titleAdded value: +"Result Set Id" - added
Input schema / properties / sort_by / titleAdded value: +"Sort By" - added
Input schema / properties / sort_desc / titleAdded value: +"Sort Desc" - added
Input schema / properties / status_equals / titleAdded value: +"Status Equals" - added
Input schema / properties / type_equals / titleAdded value: +"Type Equals" - added
Input schema / properties / year_equals / titleAdded value: +"Year Equals" - added
Input schema / titleAdded value: +"filter_resultsArguments" - added
Output schema / $defsAdded value: +{ + "ActSummaryOutput": { + "description": "Formatted output for act summary.", + "properties": { + "effective_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Effective Date" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "in_force": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "In Force" + }, + "pos": { + "title": "Pos", + "type": "integer" + }, + "promulgation_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Promulgation Date" + }, + "publisher": { + "title": "Publisher", + "type": "string" + }, + "status": { + "title": "Status", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Type" + }, + "year": { + "title": "Year", + "type": "integer" + } + }, + "required": [ + "eli", + "publisher", + "year", + "pos", + "title", + "status" + ], + "title": "ActSummaryOutput", + "type": "object" + }, + "FilterOutput": { + "description": "Output for filtered results.", + "properties": { + "filtered_count": { + "title": "Filtered Count", + "type": "integer" + }, + "filters_applied": { + "additionalProperties": true, + "default": {}, + "title": "Filters Applied", + "type": "object" + }, + "original_count": { + "title": "Original Count", + "type": "integer" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "result_set_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Result Set Id" + }, + "results": { + "items": { + "$ref": "#/$defs/ActSummaryOutput" + }, + "title": "Results", + "type": "array" + }, + "source_result_set_id": { + "title": "Source Result Set Id", + "type": "string" + } + }, + "required": [ + "source_result_set_id", + "results", + "original_count", + "filtered_count", + "page_info" + ], + "title": "FilterOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/FilterOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[FilterOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_act_details11 fields changed- added
Input schema / properties / eli / titleAdded value: +"Eli" - added
Input schema / properties / load_content / titleAdded value: +"Load Content" - added
Input schema / titleAdded value: +"get_act_detailsArguments" - added
Output schema / $defsAdded value: +{ + "ActDetailOutput": { + "description": "Output for detailed act information.", + "properties": { + "announcement_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Announcement Date" + }, + "change_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Change Date" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "entry_into_force": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Entry Into Force" + }, + "has_html": { + "default": false, + "title": "Has Html", + "type": "boolean" + }, + "has_pdf": { + "default": false, + "title": "Has Pdf", + "type": "boolean" + }, + "is_loaded": { + "default": false, + "title": "Is Loaded", + "type": "boolean" + }, + "keywords": { + "default": [], + "items": { + "type": "string" + }, + "title": "Keywords", + "type": "array" + }, + "pos": { + "title": "Pos", + "type": "integer" + }, + "promulgation_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Promulgation Date" + }, + "publisher": { + "title": "Publisher", + "type": "string" + }, + "references": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "References" + }, + "repeal_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Repeal Date" + }, + "status": { + "title": "Status", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "toc": { + "default": [], + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Toc", + "type": "array" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Type" + }, + "valid_from": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Valid From" + }, + "volume": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Volume" + }, + "year": { + "title": "Year", + "type": "integer" + } + }, + "required": [ + "eli", + "publisher", + "year", + "pos", + "title", + "status" + ], + "title": "ActDetailOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/ActDetailOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[ActDetailOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
get_system_metadata12 fields changed- added
Input schema / properties / category / titleAdded value: +"Category" - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 20, + "description": "Maksymalna liczba wartości metadanych na stronie odpowiedzi (domyślnie 20, maks. 100).", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie strony metadanych.", + "title": "Offset" +} - added
Input schema / titleAdded value: +"get_system_metadataArguments" - added
Output schema / $defsAdded value: +{ + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "MetadataOutput": { + "description": "Output for metadata.", + "properties": { + "category": { + "title": "Category", + "type": "string" + }, + "count": { + "title": "Count", + "type": "integer" + }, + "failed_categories": { + "default": [], + "items": { + "type": "string" + }, + "title": "Failed Categories", + "type": "array" + }, + "metadata": { + "additionalProperties": true, + "title": "Metadata", + "type": "object" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + } + }, + "required": [ + "category", + "metadata", + "count", + "page_info" + ], + "title": "MetadataOutput", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/MetadataOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[MetadataOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
list_loaded_documents11 fields changed- added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 20, + "description": "Maksymalna liczba dokumentów na stronie odpowiedzi (domyślnie 20, maks. 100).", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie strony dokumentów. Domyślnie 0.", + "title": "Offset" +} - added
Input schema / titleAdded value: +"list_loaded_documentsArguments" - added
Output schema / $defsAdded value: +{ + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "LoadedDocumentInfo": { + "description": "Info about a single loaded document.", + "properties": { + "eli": { + "title": "Eli", + "type": "string" + }, + "last_accessed": { + "title": "Last Accessed", + "type": "string" + }, + "loaded_at": { + "title": "Loaded At", + "type": "string" + }, + "section_count": { + "title": "Section Count", + "type": "integer" + }, + "size_bytes": { + "title": "Size Bytes", + "type": "integer" + } + }, + "required": [ + "eli", + "size_bytes", + "section_count", + "loaded_at", + "last_accessed" + ], + "title": "LoadedDocumentInfo", + "type": "object" + }, + "LoadedDocumentListOutput": { + "description": "Output for listing loaded documents.", + "properties": { + "count": { + "title": "Count", + "type": "integer" + }, + "documents": { + "items": { + "$ref": "#/$defs/LoadedDocumentInfo" + }, + "title": "Documents", + "type": "array" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + } + }, + "required": [ + "documents", + "count", + "page_info" + ], + "title": "LoadedDocumentListOutput", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/LoadedDocumentListOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[LoadedDocumentListOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
list_result_sets11 fields changed- added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 20, + "description": "Maksymalna liczba zestawów na stronie odpowiedzi (domyślnie 20, maks. 100).", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie strony zestawów. Domyślnie 0.", + "title": "Offset" +} - added
Input schema / titleAdded value: +"list_result_setsArguments" - added
Output schema / $defsAdded value: +{ + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + }, + "ResultSetInfo": { + "description": "Info about a single stored result set.", + "properties": { + "created_at": { + "title": "Created At", + "type": "string" + }, + "query_summary": { + "title": "Query Summary", + "type": "string" + }, + "result_count": { + "title": "Result Count", + "type": "integer" + }, + "result_set_id": { + "title": "Result Set Id", + "type": "string" + }, + "total_count": { + "title": "Total Count", + "type": "integer" + } + }, + "required": [ + "result_set_id", + "query_summary", + "result_count", + "total_count", + "created_at" + ], + "title": "ResultSetInfo", + "type": "object" + }, + "ResultSetListOutput": { + "description": "Output for listing result sets.", + "properties": { + "count": { + "title": "Count", + "type": "integer" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "sets": { + "items": { + "$ref": "#/$defs/ResultSetInfo" + }, + "title": "Sets", + "type": "array" + } + }, + "required": [ + "sets", + "count", + "page_info" + ], + "title": "ResultSetListOutput", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/ResultSetListOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[ResultSetListOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
read_act_content13 fields changed- added
Input schema / properties / eli / titleAdded value: +"Eli" - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maksymalna liczba elementów lub znaków na stronie. Domyślnie zależy od trybu odczytu.", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie początku strony. Domyślnie 0.", + "title": "Offset" +} - added
Input schema / properties / section / titleAdded value: +"Section" - added
Input schema / titleAdded value: +"read_act_contentArguments" - added
Output schema / $defsAdded value: +{ + "ContentOutput": { + "description": "Output for act content.", + "properties": { + "content": { + "title": "Content", + "type": "string" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "section_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Section Id" + }, + "section_title": { + "title": "Section Title", + "type": "string" + }, + "toc": { + "default": [], + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Toc", + "type": "array" + } + }, + "required": [ + "eli", + "section_title", + "content", + "page_info" + ], + "title": "ContentOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/ContentOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[ContentOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
search_in_act15 fields changed- changed
Input schema / properties / context_chars / descriptionPrevious value: -"Liczba znaków kontekstu przed i po każdym trafieniu. Domyślnie 500."New value: +"Liczba znaków kontekstu przed i po każdym trafieniu. Domyślnie 500. Maksymalnie 2000 — wartości większe są przycinane do 2000, a odpowiedź zawiera wtedy wskazówkę o przycięciu. Wywołanie nie kończy się błędem." - added
Input schema / properties / context_chars / titleAdded value: +"Context Chars" - added
Input schema / properties / eli / titleAdded value: +"Eli" - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "default": 20, + "description": "Maksymalna liczba trafień na stronie. Domyślnie 20, maksimum 100.", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie początku strony. Domyślnie 0.", + "title": "Offset" +} - added
Input schema / properties / query / titleAdded value: +"Query" - added
Input schema / titleAdded value: +"search_in_actArguments" - added
Output schema / $defsAdded value: +{ + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + }, + "SearchInActOutput": { + "description": "Output for search within act.", + "properties": { + "context_chars_applied": { + "default": 500, + "title": "Context Chars Applied", + "type": "integer" + }, + "context_chars_requested": { + "default": 500, + "title": "Context Chars Requested", + "type": "integer" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "matches": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Matches", + "type": "array" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "query": { + "title": "Query", + "type": "string" + }, + "total_matches": { + "title": "Total Matches", + "type": "integer" + } + }, + "required": [ + "eli", + "query", + "matches", + "total_matches", + "page_info" + ], + "title": "SearchInActOutput", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/SearchInActOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[SearchInActOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
search_legal_acts23 fields changed- added
Input schema / properties / act_type / titleAdded value: +"Act Type" - added
Input schema / properties / date_from / titleAdded value: +"Date From" - added
Input schema / properties / date_to / titleAdded value: +"Date To" - added
Input schema / properties / detail_level / titleAdded value: +"Detail Level" - added
Input schema / properties / in_force / titleAdded value: +"In Force" - added
Input schema / properties / keywords / titleAdded value: +"Keywords" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Przydatne do ograniczenia dużych zbiorów."New value: +"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Przydatne do ograniczenia dużych zbiorów. Bez górnej granicy — w odróżnieniu od pozostałych narzędzi listujących, gdzie limit jest przycinany do 100." - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / offset / titleAdded value: +"Offset" - added
Input schema / properties / pub_date_from / titleAdded value: +"Pub Date From" - added
Input schema / properties / pub_date_to / titleAdded value: +"Pub Date To" - added
Input schema / properties / publisher / titleAdded value: +"Publisher" - added
Input schema / properties / title / titleAdded value: +"Title" - added
Input schema / properties / year / titleAdded value: +"Year" - added
Input schema / titleAdded value: +"search_legal_actsArguments" - added
Output schema / $defsAdded value: +{ + "ActSummaryOutput": { + "description": "Formatted output for act summary.", + "properties": { + "effective_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Effective Date" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "in_force": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "In Force" + }, + "pos": { + "title": "Pos", + "type": "integer" + }, + "promulgation_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Promulgation Date" + }, + "publisher": { + "title": "Publisher", + "type": "string" + }, + "status": { + "title": "Status", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Type" + }, + "year": { + "title": "Year", + "type": "integer" + } + }, + "required": [ + "eli", + "publisher", + "year", + "pos", + "title", + "status" + ], + "title": "ActSummaryOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + }, + "SearchOutput": { + "description": "Output for search results.", + "properties": { + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "query_summary": { + "title": "Query Summary", + "type": "string" + }, + "result_set_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Result Set Id" + }, + "results": { + "items": { + "$ref": "#/$defs/ActSummaryOutput" + }, + "title": "Results", + "type": "array" + }, + "returned_count": { + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "title": "Total Count", + "type": "integer" + } + }, + "required": [ + "results", + "total_count", + "query_summary", + "returned_count", + "page_info" + ], + "title": "SearchOutput", + "type": "object" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/SearchOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[SearchOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
track_legal_changes15 fields changed- added
Input schema / properties / date_from / titleAdded value: +"Date From" - added
Input schema / properties / date_to / titleAdded value: +"Date To" - added
Input schema / properties / keywords / titleAdded value: +"Keywords" - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 20, + "description": "Maksymalna liczba zmian na stronie odpowiedzi (domyślnie 20, maks. 100).", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": 0, + "description": "Nieujemne przesunięcie strony zmian.", + "title": "Offset" +} - added
Input schema / properties / publisher / titleAdded value: +"Publisher" - added
Input schema / titleAdded value: +"track_legal_changesArguments" - added
Output schema / $defsAdded value: +{ + "ActSummaryOutput": { + "description": "Formatted output for act summary.", + "properties": { + "effective_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Effective Date" + }, + "eli": { + "title": "Eli", + "type": "string" + }, + "in_force": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "In Force" + }, + "pos": { + "title": "Pos", + "type": "integer" + }, + "promulgation_date": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Promulgation Date" + }, + "publisher": { + "title": "Publisher", + "type": "string" + }, + "status": { + "title": "Status", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Type" + }, + "year": { + "title": "Year", + "type": "integer" + } + }, + "required": [ + "eli", + "publisher", + "year", + "pos", + "title", + "status" + ], + "title": "ActSummaryOutput", + "type": "object" + }, + "ChangesOutput": { + "description": "Output for tracked changes.", + "properties": { + "changes": { + "items": { + "$ref": "#/$defs/ActSummaryOutput" + }, + "title": "Changes", + "type": "array" + }, + "date_range": { + "title": "Date Range", + "type": "string" + }, + "keywords": { + "items": { + "type": "string" + }, + "title": "Keywords", + "type": "array" + }, + "page_info": { + "$ref": "#/$defs/PageInfo" + }, + "publisher": { + "title": "Publisher", + "type": "string" + }, + "result_set_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Result Set Id" + }, + "total_count": { + "title": "Total Count", + "type": "integer" + } + }, + "required": [ + "date_range", + "publisher", + "keywords", + "changes", + "total_count", + "page_info" + ], + "title": "ChangesOutput", + "type": "object" + }, + "Hint": { + "description": "Hint for next actions or related tools.", + "properties": { + "message": { + "description": "Hint message", + "title": "Message", + "type": "string" + }, + "parameters": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Suggested parameters", + "title": "Parameters" + }, + "tool": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Related tool name", + "title": "Tool" + } + }, + "required": [ + "message" + ], + "title": "Hint", + "type": "object" + }, + "PageInfo": { + "description": "Metadata describing one bounded response page.", + "properties": { + "limit": { + "minimum": 0, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Next Offset" + }, + "offset": { + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned_count": { + "minimum": 0, + "title": "Returned Count", + "type": "integer" + }, + "total_count": { + "minimum": 0, + "title": "Total Count", + "type": "integer" + }, + "unit": { + "$ref": "#/$defs/PageUnit" + }, + "was_truncated": { + "title": "Was Truncated", + "type": "boolean" + } + }, + "required": [ + "limit", + "offset", + "returned_count", + "total_count", + "was_truncated", + "unit" + ], + "title": "PageInfo", + "type": "object" + }, + "PageUnit": { + "description": "Unit represented by a page.", + "enum": [ + "items", + "characters" + ], + "title": "PageUnit", + "type": "string" + } +} - added
Output schema / properties / dataAdded value: +{ + "$ref": "#/$defs/ChangesOutput", + "description": "The actual response data" +} - added
Output schema / properties / hintsAdded value: +{ + "description": "Suggested next steps", + "items": { + "$ref": "#/$defs/Hint" + }, + "title": "Hints", + "type": "array" +} - added
Output schema / properties / metadataAdded value: +{ + "additionalProperties": true, + "description": "Additional metadata", + "title": "Metadata", + "type": "object" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "data" +] - added
Output schema / titleAdded value: +"EnrichedResponse[ChangesOutput]" - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
26 tool updates
v1.0.2- Added
analyze_act_relationships - Added
browse_acts - Removed
calculate_date_offset - Added
calculate_legal_date - Added
compare_acts - Added
filter_results - Removed
get_act_comprehensive_details - Removed
get_act_content - Added
get_act_details - Removed
get_act_relationships - Removed
get_act_table_of_contents - Removed
get_current_date - Removed
get_legal_institutions - Removed
get_legal_keywords - Removed
get_legal_publishers - Removed
get_legal_statuses - Removed
get_legal_types - Removed
get_publisher_details - Removed
get_publisher_year_acts - Added
get_system_metadata - Added
list_loaded_documents - Added
list_result_sets - Added
read_act_content - Added
search_in_act - Changed
search_legal_acts19 fields changed- changed
Input schema / properties / act_type / descriptionPrevious value: -"Document type (e.g., 'Rozporządzenie', 'Ustawa')"New value: +"Typ dokumentu (dokładne dopasowanie). Dostępne wartości: 'Ustawa', 'Rozporządzenie', 'Obwieszczenie', 'Komunikat', 'Uchwała', 'Zarządzenie', 'Wyrok', 'Postanowienie', 'Oświadczenie rządowe'. Użyj get_system_metadata(category='types') aby zobaczyć pełną listę." - changed
Input schema / properties / date_from / descriptionPrevious value: -"Start date for effectiveness period (YYYY-MM-DD)"New value: +"Data wejścia w życie OD (YYYY-MM-DD). Filtruje akty które weszły w życie od tej daty." - changed
Input schema / properties / date_to / descriptionPrevious value: -"End date for effectiveness period (YYYY-MM-DD)"New value: +"Data wejścia w życie DO (YYYY-MM-DD). Filtruje akty które weszły w życie do tej daty." - added
Input schema / properties / detail_levelAdded value: +{ + "default": "standard", + "description": "Poziom szczegółowości wyników: 'minimal' (ELI, tytuł, status), 'standard' (+ typ, daty, obowiązywanie), 'full' (wszystkie pola). Domyślnie 'standard'.", + "type": "string" +} - changed
Input schema / properties / in_force / anyOfPrevious value: -[ - { - "type": "boolean" - }, - { - "type": "string" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Input schema / properties / in_force / descriptionPrevious value: -"Only return currently active acts. Type 'true' for active, 'false' for inactive"New value: +"Filtruj po obowiązywaniu: true = tylko akty obecnie obowiązujące, false = tylko akty nieobowiązujące, None = wszystkie." - changed
Input schema / properties / keywords / descriptionPrevious value: -"List of keywords to search in act content. ALL keywords must be present in the act (AND logic)"New value: +"Słowa kluczowe z systemu Sejmu (logika AND — wiele słów zawęża wyniki). Aby uzyskać logikę OR, wykonaj oddzielne wyszukiwanie dla każdego słowa. Użyj get_system_metadata(category='keywords') aby poznać dostępne słowa kluczowe." - changed
Input schema / properties / limit / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results (default: all matching)"New value: +"Maksymalna liczba wyników do zwrócenia. Domyślnie 20. Przydatne do ograniczenia dużych zbiorów." - changed
Input schema / properties / offset / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / offset / descriptionPrevious value: -"Skip first N results for pagination"New value: +"Liczba wyników do pominięcia (paginacja). Użyj z parametrem limit." - changed
Input schema / properties / pub_date_from / descriptionPrevious value: -"Start date for publication period (YYYY-MM-DD)"New value: +"Data publikacji/ogłoszenia OD (YYYY-MM-DD). Filtruje po dacie ogłoszenia w dzienniku." - changed
Input schema / properties / pub_date_to / descriptionPrevious value: -"End date for publication period (YYYY-MM-DD)"New value: +"Data publikacji/ogłoszenia DO (YYYY-MM-DD). Filtruje po dacie ogłoszenia w dzienniku." - added
Input schema / properties / publisherAdded value: +{ + "default": "DU", + "description": "Kod wydawcy: 'DU' (Dziennik Ustaw) lub 'MP' (Monitor Polski). Domyślnie 'DU'.", + "type": "string" +} - changed
Input schema / properties / title / descriptionPrevious value: -"Text fragment to search in act titles"New value: +"Szukaj w tytule aktu (dopasowanie podciągu). Np. 'budżet', 'przeciwpożarow', 'podatek dochodowy'." - changed
Input schema / properties / year / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / year / descriptionPrevious value: -"Publication year (e.g., 2020, 2023)"New value: +"Rok publikacji (np. 2024)." - removed
Output schema / properties / result / itemsRemoved value: -{} - changed
Output schema / properties / result / typePrevious value: -"array"New value: +"string"
- Added
track_legal_changes
1 tool update
v1.0.0- Changed
search_legal_acts1 field changed- changed
Input schema / properties / keywords / descriptionPrevious value: -"List of keywords to search in act content. ALL keywords must be present (AND logic)"New value: +"List of keywords to search in act content. ALL keywords must be present in the act (AND logic)"
14 tool updates
- First observed
calculate_date_offset - First observed
get_act_comprehensive_details - First observed
get_act_content - First observed
get_act_relationships - First observed
get_act_table_of_contents - First observed
get_current_date - First observed
get_legal_institutions - First observed
get_legal_keywords - First observed
get_legal_publishers - First observed
get_legal_statuses - First observed
get_legal_types - First observed
get_publisher_details - First observed
get_publisher_year_acts - First observed
search_legal_acts
TDQS
Scored across 13 tools
Most tools have clear, distinct roles and the descriptions include explicit guidance on when to use or avoid each tool. The main ambiguity is between search_legal_acts and track_legal_changes, since both accept date and keyword filters and return sets of acts, which could lead an agent to select the wrong one for date-based discovery.
All tool names use snake_case with a leading verb and a noun target, e.g. get_act_details, search_legal_acts, filter_results, compare_acts. Minor variations like search_in_act and list_loaded_documents are still consistent in style and do not break the overall predictable pattern.
13 tools is well within the ideal range for a legal-research server. Each tool covers a distinct part of the research workflow — discovery, loading, reading, searching, filtering, relationships, and date calculation — so none feels redundant or unnecessary.
The toolset covers the core legal-research lifecycle: browse/search acts, load and read content, search within documents, filter result sets, track changes, and compare metadata. Minor gaps include no direct way to fetch the advertised HTML/PDF document formats and no one-step tool for comparing full content between two versions of an act.
Maintenance
Related MCP Connectors
Semantic search over Polish law and case law, citing the exact in-force article.
Polish law: search statutes (ISAP), court rulings, verify citations. Free tier + paid plans + x402.
Verified Polish open data for AI agents: debt, budget, 460 MPs, votings, judiciary search, RAG.
Polish law via Ansvar Gateway. Cited, OAuth + paid tier.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables querying and analyzing Slovak legislation via natural language, including full-text search, provision retrieval, and EU law integration.38 npm2Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to access and search Slovak legal regulations from Slov-Lex.sk, including retrieving full law texts, paragraphs, and recent legislative updates.9-
- AlicenseAqualityBmaintenanceMCP server for Polish legislation (ISAP / Sejm) — search acts (Dz.U., M.P.) and fetch full texts with ELI identifiers and verifiable citations.348 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables semantic search over Polish court judgments and legislative acts via MCP. Allows LLMs to retrieve legal documents using natural language queries.Apache 2.0