Skip to main content
Glama

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.

Python version License Version

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.0 and MCPServer; STDIO and stateless Streamable HTTP transports

  • Async 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

# 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 dev

Using 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-scrapper

Quick 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-scrapper

Configure 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_mcp

Configure 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-mcp

Or 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 up

CI 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

LAW_MCP_TRANSPORT

stdio

Transport: stdio or streamable-http

LAW_MCP_HOST

127.0.0.1

HTTP server host (when using streamable-http). Binding beyond loopback requires LAW_MCP_AUTH_MODE — see "Authenticated remote deployment"

LAW_MCP_PORT

7683

HTTP server port (when using streamable-http)

LAW_MCP_SHUTDOWN_GRACE

15

Graceful shutdown window in whole seconds for the HTTP server (a fractional value is rejected at startup rather than silently rounded). Keep stop_grace_period in docker-compose.yml at or above twice this value — nothing in the code enforces the relation.

LAW_MCP_API_TIMEOUT

30.0

HTTP request timeout in seconds

LAW_MCP_API_MAX_CONCURRENT

8

Concurrent light API requests (JSON metadata and search)

LAW_MCP_API_MAX_CONCURRENT_CONTENT

2

Concurrent heavy API requests (act HTML and PDF downloads)

LAW_MCP_API_RATE_PER_SECOND

5.0

Sustained outbound request rate towards the Sejm API; accepted range 0.1100, non-finite values rejected

LAW_MCP_API_RATE_BURST

10

Requests allowed back-to-back before the rate applies; accepted range 11000

LAW_MCP_API_MAX_SERVER_PAUSE

60.0

Longest pause, in seconds, that a Retry-After sent by the Sejm API may hold all outbound traffic; a larger header value is clamped to this and logged. Accepted range above 0 up to 600

LAW_MCP_API_MAX_ATTEMPTS

3

Attempts per operation, retries included; accepted range 120

LAW_MCP_API_RETRY_BUDGET

45.0

Seconds the retry sequence of one operation may plan to wait

LAW_MCP_CACHE_METADATA_TTL

86400

Metadata cache TTL (24 hours)

LAW_MCP_CACHE_SEARCH_TTL

600

Search results cache TTL (10 minutes)

LAW_MCP_CACHE_BROWSE_TTL

3600

Browse results cache TTL (1 hour)

LAW_MCP_CACHE_DETAILS_TTL

3600

Act details cache TTL (1 hour)

LAW_MCP_CACHE_CHANGES_TTL

300

Changes tracking cache TTL (5 minutes)

LAW_MCP_CACHE_MAX_ENTRIES

1000

Maximum cache entries

LAW_MCP_DOC_STORE_MAX_DOCUMENTS

10

Maximum documents in Document Store

LAW_MCP_DOC_STORE_MAX_SIZE_BYTES

5242880

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 Content-Length), so the server never holds a larger body in memory.

LAW_MCP_DOC_STORE_TTL

7200

Document Store TTL (2 hours)

LAW_MCP_CIRCUIT_BREAKER_THRESHOLD

5

Failures before circuit breaker opens

LAW_MCP_CIRCUIT_BREAKER_RECOVERY_TIMEOUT

60.0

Seconds before trying recovery

LAW_MCP_CIRCUIT_BREAKER_HALF_OPEN_MAX_CALLS

3

Test calls in half-open state

LAW_MCP_MAX_PATTERN_LENGTH

512

Max filter_results pattern length, clamped to 64-4096

LAW_MCP_FILTER_MAX_RECORDS

100

Max records filter_results processes per call; floor 1, no ceiling (very high values lengthen the synchronous but linear scan)

LAW_MCP_ERROR_MESSAGE_MAX_CHARS

500

Cap on error-message length for categories whose message text is built from an exception's own string (validation, not_found, precondition, content_too_large, unavailable), which can be of unbounded length; accepted range 80-10000. Truncation is announced in the message rather than silent; a message that ends in a URL (the source PDF of an oversized act) keeps that URL whole when the rest of the text can absorb the cut, otherwise the plain cut applies so the cap always holds

LAW_MCP_ALLOWED_HOSTS

127.0.0.1:*, localhost:*, [::1]:*

Host header allowlist for streamable-http (DNS-rebinding protection). Widening beyond loopback requires an auth mode — see "Authenticated remote deployment"

LAW_MCP_ALLOWED_ORIGINS

http://127.0.0.1:*, http://localhost:*, http://[::1]:*

Origin header allowlist for streamable-http. Same auth-mode requirement as LAW_MCP_ALLOWED_HOSTS

LAW_MCP_AUTH_JWKS_URI

unset

Override the JWKS URI discovered from LAW_MCP_AUTH_ISSUER's OIDC discovery document; needed only when a provider's discovery document omits or misreports it

LAW_MCP_AUTH_REQUIRED_SCOPES

[] (none)

Scopes a presented token must carry, checked by RequireAuthMiddleware. Meaningful in oauth mode only: under bearer the static verifier would grant exactly these scopes to every holder of the token, so the check could never restrict anything — a non-empty value with LAW_MCP_AUTH_MODE=bearer is therefore rejected at startup

LAW_MCP_AUTH_ALGORITHMS

RS256, ES256

JWT signature algorithm allowlist passed to the decoder; never read from the token header

LAW_MCP_AUTH_JWKS_CACHE_TTL

3600

Seconds a fetched JWKS key set is cached before re-fetching

LAW_MCP_RATE_LIMIT_ENABLED

true

Whether the per-client rate limiter wraps the HTTP app. /health is exempt only when the caller is a loopback peer (container healthchecks); any other peer is metered like every other request

LAW_MCP_RATE_LIMIT_REQUESTS

60

Requests allowed per LAW_MCP_RATE_LIMIT_WINDOW before throttling

LAW_MCP_RATE_LIMIT_WINDOW

60.0

Rate limit window in seconds

LAW_MCP_RATE_LIMIT_BURST

10

Token bucket capacity — how many requests can arrive back-to-back before 429

LAW_MCP_LOG_LEVEL

INFO

Log level: DEBUG, INFO, WARNING, ERROR or CRITICAL (case-insensitive). Aliases such as WARN are rejected at startup on both transports instead of working on one and crashing the other. httpx's own request lines, which carry the full query URL, never go below WARNING regardless of this setting

LAW_MCP_LOG_FORMAT

text

Log format: text or json

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=86400

Authenticated 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-scrapper

In 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

LAW_MCP_AUTH_ISSUER

Microsoft Entra ID

https://login.microsoftonline.com/<tenant>/v2.0

Google

https://accounts.google.com

AWS Cognito

https://cognito-idp.<region>.amazonaws.com/<pool-id>

Okta

https://<org>.okta.com/oauth2/<server-id>

Auth0

https://<tenant>.auth0.com/

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-scrapper

Reachable through a reverse proxyLAW_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-scrapper

Providers 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

get_system_metadata

Metadane systemu ELI

true

true

search_legal_acts

Wyszukiwanie aktów prawnych

true

true

browse_acts

Przeglądanie aktów z rocznika

true

true

filter_results

Filtrowanie wyników wyszukiwania

true

false

get_act_details

Szczegóły aktu prawnego

true

true

read_act_content

Czytanie treści aktu

true

false

search_in_act

Wyszukiwanie w treści aktu

true

false

analyze_act_relationships

Powiązania aktu prawnego

true

true

track_legal_changes

Śledzenie zmian w prawie

true

true

calculate_legal_date

Obliczanie terminu prawnego

true

false

compare_acts

Porównanie dwóch aktów

true

true

list_result_sets

Zestawy wyników w pamięci

true

false

list_loaded_documents

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 metadata

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 filter

  • type (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 scanning

3. 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 year

  • detail_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 year

4. 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 year

  • date_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 descending

  • limit (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 results

Result-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 reading

  • detail_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_content was not set and the act was not already in the Document Store

  • loaded - content is in the Document Store, ready for read_act_content / search_in_act

  • unavailable - 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 comparison

6. 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 chapters

7. 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 references

8. analyze_act_relationships(eli, relationship_type)

Analyze legal relationships and references of an act (amendments, references, etc.).

Parameters:

  • eli (string) - Act identifier

  • relationship_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 network

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 range

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 periods

11. 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 acts

12. 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

  1. Load an act - Call get_act_details(eli="DU/2024/1", load_content=true) to load the act into the Document Store

  2. Read sections - Use read_act_content(eli="DU/2024/1", section="Art. 1") to read specific sections

  3. Search 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 file

Docker

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-mcp

docker-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 down

Migration guide (v1 to v2)

If upgrading from v1.0.2, note these breaking changes:

v1.0.2 (old)

v2.0.0 (new)

Notes

get_current_date

calculate_legal_date()

Call with no parameters for current date

calculate_date_offset

calculate_legal_date(days/months/years)

Use intuitive +future/-past sign convention

get_legal_keywords

get_system_metadata(category="keywords")

Consolidated into one tool

get_legal_publishers

get_system_metadata(category="publishers")

Consolidated into one tool

get_legal_statuses

get_system_metadata(category="statuses")

Consolidated into one tool

get_legal_types

get_system_metadata(category="types")

Consolidated into one tool

get_legal_institutions

get_system_metadata(category="institutions")

Consolidated into one tool

get_publisher_details

N/A

Use get_system_metadata(category="publishers")

search_legal_acts

search_legal_acts

Enhanced with detail_level parameter

get_publisher_year_acts

browse_acts

Renamed for clarity

get_act_comprehensive_details

get_act_details

Added load_content and detail_level

get_act_content

read_act_content

Requires pre-loading with get_act_details

get_act_table_of_contents

get_act_details

TOC included in details response

get_act_relationships

analyze_act_relationships

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.0 and MCPServer[AppContext]

  • Native structured responses — Tools return EnrichedResponse with outputSchema and object structuredContent (no JSON strings)

  • Protocol-visible errors — Tool failures surface as isError=true instead of in-body error fields

  • Stateless Streamable HTTP/mcp endpoint only; legacy event-stream transport removed

  • PaginationPageInfo model exposed as the page_info field with limit/offset on search, browse, metadata, changes, TOC, sections, and in-act search

  • Typed AppContext — Lifespan resources accessed via ctx.request_context.lifespan_context

  • Domain servicesComparisonService, RelationshipService, and DateService extracted from tool adapters

  • Transport tests — Real STDIO subprocess, loopback HTTP, and MCP conformance in CI

  • Explicit Host/Origin allowlist on HTTPtransport_security is 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

result.content JSON string

structuredContent object

Parse native MCP structured payload

EnrichedResponse.error in success body

isError=true

Check result.is_error before reading content

v2.x in-process client

Official mcp.Client

In-memory and transport tests use SDK client

v2.x direct lifespan access

ctx.request_context.lifespan_context

Typed AppContext dataclass

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_route for /health

  • Integration 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 defined when running via uvx --from "git+https://github.com/numikel/law-scrapper-mcp" law-scrapper. Removed from __future__ import annotations from compare.py so parameter type hints resolve correctly during tool registration.

What's new in v2.3.0

  • 3 new toolscompare_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_errors decorator with error classification and full tracebacks

  • asyncio.Lock migration — All stores use asyncio.Lock for proper async compatibility

  • Default search limit — Search/browse return max 20 results by default to limit token usage

  • Health endpoint/health for Docker deployments with streamable-http transport

  • Polish 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 dev

Running 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 -v

MCP 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/ -v

Layer 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 integration

Layer 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 integration

Full integration suite:

uv run pytest tests/integration/ -v -m integration

What the tests verify:

  • All 13 tools registered with preserved public arguments

  • Native structuredContent payloads with outputSchema (not JSON strings)

  • isError=true on tool execution failures

  • page_info (PageInfo) pagination metadata on paginated outputs

  • Stateful 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.Client from the Python MCP SDK

  • Helpers: tests/mcp_helpers.py (parse_tool_result for structuredContent assertions)

  • 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_mcp

Contributing

  1. Fork the repository

  2. Create your feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes using Conventional Commits format

  4. Add tests for new functionality

  5. Ensure all tests pass and coverage is maintained

  6. Push to the branch (git push origin feature/amazing-feature)

  7. 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

@numikel

Developed with help from:

Cursor Claude Code

And with models:

Claude Opus 4.6 Claude Opus 4.5 Claude Sonnet 4.5 Claude Haiku 4.5


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 tools
analyze_act_relationshipsPowiązania aktu prawnegoA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
eliYesIdentyfikator 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_typeNoFiltruj 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

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 rocznikaA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYesRok publikacji (np. 2024).
limitNoMaksymalna 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ść.
offsetNoLiczba wyników do pominięcia (paginacja). Użyj razem z limit. Domyślnie 0.
publisherYesKod wydawcy: 'DU' (Dziennik Ustaw) lub 'MP' (Monitor Polski).
detail_levelNoPoziom szczegółowości: 'minimal' (ELI, tytuł, status), 'standard' (+ typ, daty, obowiązywanie), 'full' (wszystkie pola). Domyślnie 'standard'.standard

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

compare_actsPorównanie dwóch aktówA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
eli_aYesIdentyfikator ELI pierwszego aktu. Format: "{wydawca}/{rok}/{pozycja}". Przykłady: "DU/2024/1716", "MP/2023/500".
eli_bYesIdentyfikator ELI drugiego aktu do porównania. Format: "{wydawca}/{rok}/{pozycja}". Przykłady: "DU/2024/1692", "DU/2020/1444".

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 wyszukiwaniaA
Read-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ą

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNoPole do przeszukania wzorcem RE2. Dostępne: 'title' (domyślne), 'eli', 'status', 'type', 'publisher'.title
limitNoMaksymalna liczba wyników na stronie odpowiedzi (domyślnie 20, maks. 100).
offsetNoNieujemne przesunięcie strony wyników.
date_toNoKoniec zakresu dat (YYYY-MM-DD). Wymaga ustawienia date_field.
patternNoWzorzec 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_byNoPole do sortowania: 'title', 'year', 'pos', 'promulgation_date', 'effective_date', 'type', 'status'.
date_fromNoPoczątek zakresu dat (YYYY-MM-DD). Wymaga ustawienia date_field.
sort_descNoSortuj malejąco (True) lub rosnąco (False, domyślnie).
date_fieldNoPole daty do filtrowania zakresem: 'promulgation_date' (data ogłoszenia) lub 'effective_date' (data wejścia w życie).
type_equalsNoFiltruj po typie dokumentu (dokładne dopasowanie). Wartości: 'Ustawa', 'Rozporządzenie', 'Obwieszczenie', 'Komunikat', 'Uchwała', 'Zarządzenie', 'Wyrok', 'Postanowienie', 'Oświadczenie rządowe'
year_equalsNoFiltruj po roku publikacji (dokładne dopasowanie). Np. 2024.
result_set_idYesIdentyfikator 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_equalsNoFiltruj 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

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 prawnegoA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
eliYesIdentyfikator 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_contentNoZał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

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ELIA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaksymalna liczba wartości metadanych na stronie odpowiedzi (domyślnie 20, maks. 100).
offsetNoNieujemne przesunięcie strony metadanych.
categoryNoKategoria 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

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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ęciA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaksymalna liczba dokumentów na stronie odpowiedzi (domyślnie 20, maks. 100).
offsetNoNieujemne przesunięcie strony dokumentów. Domyślnie 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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ęciA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaksymalna liczba zestawów na stronie odpowiedzi (domyślnie 20, maks. 100).
offsetNoNieujemne przesunięcie strony zestawów. Domyślnie 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 aktuA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
eliYesIdentyfikator 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).
limitNoMaksymalna liczba elementów lub znaków na stronie. Domyślnie zależy od trybu odczytu.
offsetNoNieujemne przesunięcie początku strony. Domyślnie 0.
sectionNoIdentyfikator 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

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 aktuA
Read-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ń)

ParametersJSON Schema
NameRequiredDescriptionDefault
eliYesIdentyfikator 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).
limitNoMaksymalna liczba trafień na stronie. Domyślnie 20, maksimum 100.
queryYesTermin do wyszukania w treści aktu (np. 'podatek', 'obowiązek', 'art. 5'). Wielkość liter jest ignorowana.
offsetNoNieujemne przesunięcie początku strony. Domyślnie 0.
context_charsNoLiczba 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

ParametersJSON Schema
NameRequiredDescription
dataYesThe actual response data
hintsNoSuggested next steps

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv4.4.0
    • Changedanalyze_act_relationships1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedbrowse_acts1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedcalculate_legal_date1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedcompare_acts1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedfilter_results1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedget_act_details1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedget_system_metadata1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedlist_loaded_documents1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedlist_result_sets1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedread_act_content1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedsearch_in_act1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedsearch_legal_acts1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
    • Changedtrack_legal_changes1 field changed
      • removedOutput schema / properties / metadata
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Additional metadata",
        -  "title": "Metadata",
        -  "type": "object"
        -}
  2. 1 tool updatev4.3.0
    • Changedget_act_details2 fields changed
      • addedOutput schema / $defs / ActDetailOutput / properties / content_status
        Added 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."
        +}
      • addedOutput schema / $defs / ContentStatus
        Added 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"
        +}
  3. 5 tool updatesv4.2.0
    • Changedbrowse_acts5 fields changed
      • changedInput schema / properties / limit / description
        Previous 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ść."
      • addedOutput schema / $defs / ActSummaryOutput / properties / effective_date / description
        Added value: +"Data wejścia w życie (entryIntoForce)."
      • addedOutput schema / $defs / ResultSetScope
        Added 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"
        +}
      • addedOutput schema / $defs / SearchOutput / properties / result_set_scope
        Added 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."
        +}
      • addedOutput schema / $defs / SetScope
        Added value: +{
        +  "description": "Whether a stored result set is the whole answer or a window into it.",
        +  "enum": [
        +    "complete",
        +    "page"
        +  ],
        +  "title": "SetScope",
        +  "type": "string"
        +}
    • Changedfilter_results7 fields changed
      • addedOutput schema / $defs / ActSummaryOutput / properties / effective_date / description
        Added value: +"Data wejścia w życie (entryIntoForce)."
      • addedOutput schema / $defs / FilterOutput / properties / no_match_is_inconclusive
        Added 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"
        +}
      • addedOutput schema / $defs / FilterOutput / properties / result_set_scope
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/ResultSetScope"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Zasięg zestawu powstałego z filtrowania. None, gdy nic nie dopasowano."
        +}
      • addedOutput schema / $defs / FilterOutput / properties / source_scope
        Added value: +{
        +  "$ref": "#/$defs/ResultSetScope",
        +  "description": "Zasięg zestawu, który filtrowano — decyduje, czego dowodzi pusty wynik."
        +}
      • changedOutput schema / $defs / FilterOutput / required
        Previous 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"
        +]
      • addedOutput schema / $defs / ResultSetScope
        Added 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"
        +}
      • addedOutput schema / $defs / SetScope
        Added value: +{
        +  "description": "Whether a stored result set is the whole answer or a window into it.",
        +  "enum": [
        +    "complete",
        +    "page"
        +  ],
        +  "title": "SetScope",
        +  "type": "string"
        +}
    • Changedlist_result_sets3 fields changed
      • addedOutput schema / $defs / ResultSetInfo / properties / scope
        Added value: +{
        +  "$ref": "#/$defs/SetScope",
        +  "description": "Zasięg zestawu: 'complete' (cały zbiór) albo 'page' (okno z większego zbioru)."
        +}
      • changedOutput schema / $defs / ResultSetInfo / required
        Previous 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"
        +]
      • addedOutput schema / $defs / SetScope
        Added value: +{
        +  "description": "Whether a stored result set is the whole answer or a window into it.",
        +  "enum": [
        +    "complete",
        +    "page"
        +  ],
        +  "title": "SetScope",
        +  "type": "string"
        +}
    • Changedsearch_legal_acts5 fields changed
      • changedInput schema / properties / limit / description
        Previous 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ść."
      • addedOutput schema / $defs / ActSummaryOutput / properties / effective_date / description
        Added value: +"Data wejścia w życie (entryIntoForce)."
      • addedOutput schema / $defs / ResultSetScope
        Added 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"
        +}
      • addedOutput schema / $defs / SearchOutput / properties / result_set_scope
        Added 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."
        +}
      • addedOutput schema / $defs / SetScope
        Added value: +{
        +  "description": "Whether a stored result set is the whole answer or a window into it.",
        +  "enum": [
        +    "complete",
        +    "page"
        +  ],
        +  "title": "SetScope",
        +  "type": "string"
        +}
    • Changedtrack_legal_changes4 fields changed
      • addedOutput schema / $defs / ActSummaryOutput / properties / effective_date / description
        Added value: +"Data wejścia w życie (entryIntoForce)."
      • addedOutput schema / $defs / ChangesOutput / properties / result_set_scope
        Added 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."
        +}
      • addedOutput schema / $defs / ResultSetScope
        Added 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"
        +}
      • addedOutput schema / $defs / SetScope
        Added value: +{
        +  "description": "Whether a stored result set is the whole answer or a window into it.",
        +  "enum": [
        +    "complete",
        +    "page"
        +  ],
        +  "title": "SetScope",
        +  "type": "string"
        +}
  4. 1 tool updatev4.0.2
    • Changedbrowse_acts1 field changed
      • changedInput schema / properties / limit / description
        Previous 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."
  5. 13 tool updatesv3.1.0
    • Changedanalyze_act_relationships11 fields changed
      • addedInput schema / properties / eli / title
        Added value: +"Eli"
      • addedInput schema / properties / relationship_type / title
        Added value: +"Relationship Type"
      • addedInput schema / title
        Added value: +"analyze_act_relationshipsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/RelationshipsOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[RelationshipsOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedbrowse_acts15 fields changed
      • addedInput schema / properties / detail_level / title
        Added value: +"Detail Level"
      • changedInput schema / properties / limit / description
        Previous 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."
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / offset
        Added 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"
        +}
      • addedInput schema / properties / publisher / title
        Added value: +"Publisher"
      • addedInput schema / properties / year / title
        Added value: +"Year"
      • addedInput schema / title
        Added value: +"browse_actsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/SearchOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[SearchOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcalculate_legal_date19 fields changed
      • addedInput schema / properties / base_date / title
        Added value: +"Base Date"
      • changedInput schema / properties / days / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "boolean"
        +  }
        +]
      • changedInput schema / properties / days / description
        Previous 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."
      • addedInput schema / properties / days / title
        Added value: +"Days"
      • changedInput schema / properties / months / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "boolean"
        +  }
        +]
      • changedInput schema / properties / months / description
        Previous 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."
      • addedInput schema / properties / months / title
        Added value: +"Months"
      • changedInput schema / properties / years / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "boolean"
        +  }
        +]
      • changedInput schema / properties / years / description
        Previous 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."
      • addedInput schema / properties / years / title
        Added value: +"Years"
      • addedInput schema / title
        Added value: +"calculate_legal_dateArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/DateOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[DateOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedcompare_acts11 fields changed
      • addedInput schema / properties / eli_a / title
        Added value: +"Eli A"
      • addedInput schema / properties / eli_b / title
        Added value: +"Eli B"
      • addedInput schema / title
        Added value: +"compare_actsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/CompareOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[CompareOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedfilter_results26 fields changed
      • addedInput schema / properties / date_field / title
        Added value: +"Date Field"
      • addedInput schema / properties / date_from / title
        Added value: +"Date From"
      • addedInput schema / properties / date_to / title
        Added value: +"Date To"
      • changedInput schema / properties / field / description
        Previous 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'."
      • addedInput schema / properties / field / title
        Added value: +"Field"
      • changedInput schema / properties / limit / default
        Previous value: -nullNew value: +20
      • changedInput schema / properties / limit / description
        Previous value: -"Maksymalna liczba wyników do zwrócenia."New value: +"Maksymalna liczba wyników na stronie odpowiedzi (domyślnie 20, maks. 100)."
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie strony wyników.",
        +  "title": "Offset"
        +}
      • changedInput schema / properties / pattern / description
        Previous 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'"
      • addedInput schema / properties / pattern / title
        Added value: +"Pattern"
      • addedInput schema / properties / result_set_id / title
        Added value: +"Result Set Id"
      • addedInput schema / properties / sort_by / title
        Added value: +"Sort By"
      • addedInput schema / properties / sort_desc / title
        Added value: +"Sort Desc"
      • addedInput schema / properties / status_equals / title
        Added value: +"Status Equals"
      • addedInput schema / properties / type_equals / title
        Added value: +"Type Equals"
      • addedInput schema / properties / year_equals / title
        Added value: +"Year Equals"
      • addedInput schema / title
        Added value: +"filter_resultsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/FilterOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[FilterOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_act_details11 fields changed
      • addedInput schema / properties / eli / title
        Added value: +"Eli"
      • addedInput schema / properties / load_content / title
        Added value: +"Load Content"
      • addedInput schema / title
        Added value: +"get_act_detailsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/ActDetailOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[ActDetailOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedget_system_metadata12 fields changed
      • addedInput schema / properties / category / title
        Added value: +"Category"
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie strony metadanych.",
        +  "title": "Offset"
        +}
      • addedInput schema / title
        Added value: +"get_system_metadataArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/MetadataOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[MetadataOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_loaded_documents11 fields changed
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie strony dokumentów. Domyślnie 0.",
        +  "title": "Offset"
        +}
      • addedInput schema / title
        Added value: +"list_loaded_documentsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/LoadedDocumentListOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[LoadedDocumentListOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedlist_result_sets11 fields changed
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie strony zestawów. Domyślnie 0.",
        +  "title": "Offset"
        +}
      • addedInput schema / title
        Added value: +"list_result_setsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/ResultSetListOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[ResultSetListOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedread_act_content13 fields changed
      • addedInput schema / properties / eli / title
        Added value: +"Eli"
      • addedInput schema / properties / limit
        Added 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"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie początku strony. Domyślnie 0.",
        +  "title": "Offset"
        +}
      • addedInput schema / properties / section / title
        Added value: +"Section"
      • addedInput schema / title
        Added value: +"read_act_contentArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/ContentOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[ContentOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_in_act15 fields changed
      • changedInput schema / properties / context_chars / description
        Previous 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."
      • addedInput schema / properties / context_chars / title
        Added value: +"Context Chars"
      • addedInput schema / properties / eli / title
        Added value: +"Eli"
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    }
        +  ],
        +  "default": 20,
        +  "description": "Maksymalna liczba trafień na stronie. Domyślnie 20, maksimum 100.",
        +  "title": "Limit"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie początku strony. Domyślnie 0.",
        +  "title": "Offset"
        +}
      • addedInput schema / properties / query / title
        Added value: +"Query"
      • addedInput schema / title
        Added value: +"search_in_actArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/SearchInActOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[SearchInActOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedsearch_legal_acts23 fields changed
      • addedInput schema / properties / act_type / title
        Added value: +"Act Type"
      • addedInput schema / properties / date_from / title
        Added value: +"Date From"
      • addedInput schema / properties / date_to / title
        Added value: +"Date To"
      • addedInput schema / properties / detail_level / title
        Added value: +"Detail Level"
      • addedInput schema / properties / in_force / title
        Added value: +"In Force"
      • addedInput schema / properties / keywords / title
        Added value: +"Keywords"
      • changedInput schema / properties / limit / description
        Previous 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."
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / offset / title
        Added value: +"Offset"
      • addedInput schema / properties / pub_date_from / title
        Added value: +"Pub Date From"
      • addedInput schema / properties / pub_date_to / title
        Added value: +"Pub Date To"
      • addedInput schema / properties / publisher / title
        Added value: +"Publisher"
      • addedInput schema / properties / title / title
        Added value: +"Title"
      • addedInput schema / properties / year / title
        Added value: +"Year"
      • addedInput schema / title
        Added value: +"search_legal_actsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/SearchOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[SearchOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedtrack_legal_changes15 fields changed
      • addedInput schema / properties / date_from / title
        Added value: +"Date From"
      • addedInput schema / properties / date_to / title
        Added value: +"Date To"
      • addedInput schema / properties / keywords / title
        Added value: +"Keywords"
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 20,
        +  "description": "Maksymalna liczba zmian na stronie odpowiedzi (domyślnie 20, maks. 100).",
        +  "title": "Limit"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": 0,
        +  "description": "Nieujemne przesunięcie strony zmian.",
        +  "title": "Offset"
        +}
      • addedInput schema / properties / publisher / title
        Added value: +"Publisher"
      • addedInput schema / title
        Added value: +"track_legal_changesArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / data
        Added value: +{
        +  "$ref": "#/$defs/ChangesOutput",
        +  "description": "The actual response data"
        +}
      • addedOutput schema / properties / hints
        Added value: +{
        +  "description": "Suggested next steps",
        +  "items": {
        +    "$ref": "#/$defs/Hint"
        +  },
        +  "title": "Hints",
        +  "type": "array"
        +}
      • addedOutput schema / properties / metadata
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Additional metadata",
        +  "title": "Metadata",
        +  "type": "object"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "data"
        +]
      • addedOutput schema / title
        Added value: +"EnrichedResponse[ChangesOutput]"
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
  6. 26 tool updatesv1.0.2
    • Addedanalyze_act_relationships
    • Addedbrowse_acts
    • Removedcalculate_date_offset
    • Addedcalculate_legal_date
    • Addedcompare_acts
    • Addedfilter_results
    • Removedget_act_comprehensive_details
    • Removedget_act_content
    • Addedget_act_details
    • Removedget_act_relationships
    • Removedget_act_table_of_contents
    • Removedget_current_date
    • Removedget_legal_institutions
    • Removedget_legal_keywords
    • Removedget_legal_publishers
    • Removedget_legal_statuses
    • Removedget_legal_types
    • Removedget_publisher_details
    • Removedget_publisher_year_acts
    • Addedget_system_metadata
    • Addedlist_loaded_documents
    • Addedlist_result_sets
    • Addedread_act_content
    • Addedsearch_in_act
    • Changedsearch_legal_acts19 fields changed
      • changedInput schema / properties / act_type / description
        Previous 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ę."
      • changedInput schema / properties / date_from / description
        Previous 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."
      • changedInput schema / properties / date_to / description
        Previous 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."
      • addedInput schema / properties / detail_level
        Added 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"
        +}
      • changedInput schema / properties / in_force / anyOf
        Previous value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / in_force / description
        Previous 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."
      • changedInput schema / properties / keywords / description
        Previous 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."
      • changedInput schema / properties / limit / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / limit / description
        Previous 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."
      • changedInput schema / properties / offset / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N results for pagination"New value: +"Liczba wyników do pominięcia (paginacja). Użyj z parametrem limit."
      • changedInput schema / properties / pub_date_from / description
        Previous 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."
      • changedInput schema / properties / pub_date_to / description
        Previous 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."
      • addedInput schema / properties / publisher
        Added value: +{
        +  "default": "DU",
        +  "description": "Kod wydawcy: 'DU' (Dziennik Ustaw) lub 'MP' (Monitor Polski). Domyślnie 'DU'.",
        +  "type": "string"
        +}
      • changedInput schema / properties / title / description
        Previous value: -"Text fragment to search in act titles"New value: +"Szukaj w tytule aktu (dopasowanie podciągu). Np. 'budżet', 'przeciwpożarow', 'podatek dochodowy'."
      • changedInput schema / properties / year / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / year / description
        Previous value: -"Publication year (e.g., 2020, 2023)"New value: +"Rok publikacji (np. 2024)."
      • removedOutput schema / properties / result / items
        Removed value: -{}
      • changedOutput schema / properties / result / type
        Previous value: -"array"New value: +"string"
    • Addedtrack_legal_changes
  7. 1 tool updatev1.0.0
    • Changedsearch_legal_acts1 field changed
      • changedInput schema / properties / keywords / description
        Previous 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)"
  8. 14 tool updates
    • First observedcalculate_date_offset
    • First observedget_act_comprehensive_details
    • First observedget_act_content
    • First observedget_act_relationships
    • First observedget_act_table_of_contents
    • First observedget_current_date
    • First observedget_legal_institutions
    • First observedget_legal_keywords
    • First observedget_legal_publishers
    • First observedget_legal_statuses
    • First observedget_legal_types
    • First observedget_publisher_details
    • First observedget_publisher_year_acts
    • First observedsearch_legal_acts

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables querying and analyzing Slovak legislation via natural language, including full-text search, provision retrieval, and EU law integration.
    38 npm
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables semantic search over Polish court judgments and legislative acts via MCP. Allows LLMs to retrieve legal documents using natural language queries.
    Apache 2.0