Skip to main content
Glama

Polish MCP servers

Glama

Local Model Context Protocol server for Polish public data. It speaks stdio and exposes 12 tools, one for each public Apify Actor by enterprising_hamster.

tools/list answers with no APIFY_TOKEN and no network. tools/call runs that Actor on your Apify account. Create a token at console.apify.com/settings/integrations and set APIFY_TOKEN. A call without a token returns an MCP tool error that points at that page.

Each call returns at most 100 dataset items and at most 256 KiB of JSON. Pass maxItems to ask for fewer. When the Actor schema already defaults maxItems to 100 or less, that default stands. The law tool defaults to 20, because that Actor's schema has no maxItems.

Tools

Tool

Returns

Actor

polish-law-mcp-server

One Polish law result. Set tool to search_legal_acts, get_legal_act, get_legal_act_text, list_changed_legal_acts, search_court_judgments, or get_court_judgment, and pass arguments.

Store

polish-legal-acts-eli

Dziennik Ustaw and Monitor Polski act metadata, with optional text.

Store

polish-court-judgments-saos

SAOS judgments with metadata and optional full text.

Store

polish-eu-funds-tenders-baza-konkurencyjnosci

EU-funds procurement notices from Baza Konkurencyjności.

Store

cee-public-tenders

Czech, Slovak, Hungarian, and Ukrainian public tenders.

Store

polish-ev-charging-stations-eipa

EIPA charging stations with location, connectors, power, and live status.

Store

polish-vehicle-registrations-cepik

Aggregated CEPiK registration counts. No VINs or owners.

Store

polish-building-permits-gunb

GUNB building permits and notifications. Private investors are anonymised.

Store

polish-land-parcels-uldk-zoning

ULDK parcel location and area, plus MPZP and POG zoning. No owners.

Store

polish-healthcare-facilities-rpwdl

RPWDL facilities with address, contact, specialties, and beds.

Store

polish-developer-apartment-prices

Developer apartment and house offers, with price per m², from dane.gov.pl.

Store

polish-electricity-market-pse

PSE electricity prices and grid rows (RCE, day-ahead, imbalance, load, generation).

Store

The full tool and parameter descriptions that clients see live in catalog/tool-descriptions.json. Every tool is annotated readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true: it only reads the public source, but each tools/call starts a paid Apify Actor run, billed pay-per-event to the Apify account behind APIFY_TOKEN, and waits up to 300 s for it.

polish-mcp-servers and polish-mcp list all 12. polish-law-mcp lists only polish-law-mcp-server. polish-public-registers lists the other 11, including cee-public-tenders.

Related MCP server: @m8t-jacob/mcp-polish-biz

Install

From GitHub, without an npm publish:

npx -y github:kamilkaczmareksolutions/polish-mcp-servers

Law only, or registers only:

npx -y --package github:kamilkaczmareksolutions/polish-mcp-servers polish-law-mcp
npx -y --package github:kamilkaczmareksolutions/polish-mcp-servers polish-public-registers

From a checkout, npm install compiles the server:

git clone https://github.com/kamilkaczmareksolutions/polish-mcp-servers.git
cd polish-mcp-servers
npm install
node dist/main.js

node dist/law.js and node dist/registers.js start the other two profiles.

Docker image. tools/list needs no secrets.

docker build -t polish-mcp-servers .
docker run --rm -i polish-mcp-servers

Pass the token only when you want tools/call to run an Actor.

docker run --rm -i -e APIFY_TOKEN=<YOUR_APIFY_TOKEN> polish-mcp-servers

Configure Claude Desktop and Cursor

Claude Desktop reads claude_desktop_config.json. Cursor reads ~/.cursor/mcp.json or .cursor/mcp.json in a project.

{
  "mcpServers": {
    "polish-mcp": {
      "command": "npx",
      "args": ["-y", "github:kamilkaczmareksolutions/polish-mcp-servers"],
      "env": {
        "APIFY_TOKEN": "<YOUR_APIFY_TOKEN>"
      }
    },
    "polish-law": {
      "command": "npx",
      "args": ["-y", "--package", "github:kamilkaczmareksolutions/polish-mcp-servers", "polish-law-mcp"],
      "env": {
        "APIFY_TOKEN": "<YOUR_APIFY_TOKEN>"
      }
    },
    "polish-public-registers": {
      "command": "npx",
      "args": ["-y", "--package", "github:kamilkaczmareksolutions/polish-mcp-servers", "polish-public-registers"],
      "env": {
        "APIFY_TOKEN": "<YOUR_APIFY_TOKEN>"
      }
    }
  }
}

Omit APIFY_TOKEN if you only want tools/list.

Hosted servers

The same data is also available as hosted MCP servers on Apify. Point your client at a URL and authenticate with your Apify account. Those servers still run as Apify Actors.

  • Polish Law MCP: Polish statutes from the Sejm ELI API (Dziennik Ustaw, Monitor Polski) and court judgments from SAOS.

  • Polish Public Registers: 10 official Polish registers (EU-funded tenders, EV charging stations, vehicle registrations, building permits, land parcels and zoning, healthcare facilities, developer apartment prices, electricity market, legal acts, court judgments).

Server

MCP Registry name

MCP URL (Streamable HTTP)

Polish Law MCP

io.github.kamilkaczmareksolutions/polish-law-mcp

https://mcp.apify.com/?tools=enterprising_hamster/polish-law-mcp-server

Polish Law MCP (direct, Apify Standby)

same entry, second remote

https://enterprising-hamster--polish-law-mcp-server.apify.actor/mcp

Polish Public Registers

io.github.kamilkaczmareksolutions/polish-public-registers

see full URL below

Polish Public Registers URL

https://mcp.apify.com/?tools=enterprising_hamster/polish-eu-funds-tenders-baza-konkurencyjnosci,enterprising_hamster/polish-ev-charging-stations-eipa,enterprising_hamster/polish-vehicle-registrations-cepik,enterprising_hamster/polish-building-permits-gunb,enterprising_hamster/polish-land-parcels-uldk-zoning,enterprising_hamster/polish-healthcare-facilities-rpwdl,enterprising_hamster/polish-developer-apartment-prices,enterprising_hamster/polish-electricity-market-pse,enterprising_hamster/polish-legal-acts-eli,enterprising_hamster/polish-court-judgments-saos

You can drop Actors from the tools= list to expose only the registers you need.

Polish Law MCP tools

Apify Actor: enterprising_hamster/polish-law-mcp-server

The hosted law server exposes six tools. The local server keeps them behind the single tool polish-law-mcp-server.

Tool

What it does

search_legal_acts

Search acts in Dziennik Ustaw and Monitor Polski (Sejm ELI). Returns act summaries with ELI ids.

get_legal_act

Metadata of one act: status, in-force flag, key dates, issuing body, implemented EU acts, newest consolidated text, references.

get_legal_act_text

Plain text of an act or a single article, current wording from the newest consolidated text, in bounded windows.

list_changed_legal_acts

Acts whose ELI record changed since a given time (new publications, amendments, status or reference updates).

search_court_judgments

Search judgments in SAOS (System Analizy Orzeczeń Sądowych).

get_court_judgment

Full judgment: metadata, legal bases, cited regulations (with ELI ids), cited cases, summary, text in bounded windows.

Through mcp.apify.com the same six tools are exposed with an Apify prefix (enterpri--polish-law-mcp-server--…). The Standby URL exposes them under the names above.

Pricing (pay per event, FREE/BRONZE Apify plan tier):

Event

Price

Tool call returning search results or metadata

$0.005

Tool call returning the full text of a legal act or court judgment

$0.015

Polish Public Registers tools

Each Actor is exposed as one MCP tool that runs the Actor. The Apify MCP server also adds four helper tools: get-actor-run, get-dataset-items, get-key-value-store-record, abort-actor-run (14 tools in total).

Prices are per delivered result, FREE/BRONZE Apify plan tier. Higher plan tiers pay less; see each Actor page.

Register (source)

Apify Actor

Price per result

EU-funds tenders (Baza Konkurencyjności)

polish-eu-funds-tenders-baza-konkurencyjnosci

$0.003 announcement; $0.008 announcement with details

EV charging stations (EIPA / UDT)

polish-ev-charging-stations-eipa

$0.003 station; $0.001 station with anonymised private operator

Vehicle registrations (CEPiK open data, aggregates only)

polish-vehicle-registrations-cepik

$0.003 statistics row

Building permits (GUNB RWDZ)

polish-building-permits-gunb

$0.002 project; $0.006 project with organisation investor

Land parcels and zoning (GUGiK ULDK, MPZP, POG)

polish-land-parcels-uldk-zoning

$0.004 parcel; $0.02 parcel with zoning

Healthcare facilities (RPWDL)

polish-healthcare-facilities-rpwdl

$0.004 facility

Developer apartment prices (dane.gov.pl)

polish-developer-apartment-prices

$0.002 offer; $0.004 price change

Electricity market (PSE API)

polish-electricity-market-pse

$0.0003 market data row

Legal acts (Sejm ELI)

polish-legal-acts-eli

$0.002 act metadata; $0.008 act with text

Court judgments (SAOS)

polish-court-judgments-saos

$0.003 judgment metadata; $0.01 judgment with full text

Apify platform usage may be billed on top, depending on your Apify plan.

Authentication and billing

Both hosted servers run under your own Apify account, and you pay for the results you request.

  • OAuth via mcp.apify.com. Clients that support MCP OAuth sign you in to Apify. No token in the config.

  • Bearer token. Send Authorization: Bearer <YOUR_APIFY_TOKEN>. Get the token at console.apify.com/settings/integrations. Required for the Standby URL.

Requests without credentials get HTTP 401.

Hosted client configuration

Replace <YOUR_APIFY_TOKEN> with your token, or omit headers if your client supports OAuth.

Claude.ai and Claude Desktop. Settings → Connectors → Add custom connector, then paste the MCP URL (for example https://mcp.apify.com/?tools=enterprising_hamster/polish-law-mcp-server). Sign in to Apify when prompted.

Cursor, ~/.cursor/mcp.json or .cursor/mcp.json in a project:

{
  "mcpServers": {
    "polish-law": {
      "url": "https://mcp.apify.com/?tools=enterprising_hamster/polish-law-mcp-server",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    },
    "polish-public-registers": {
      "url": "https://mcp.apify.com/?tools=enterprising_hamster/polish-eu-funds-tenders-baza-konkurencyjnosci,enterprising_hamster/polish-ev-charging-stations-eipa,enterprising_hamster/polish-vehicle-registrations-cepik,enterprising_hamster/polish-building-permits-gunb,enterprising_hamster/polish-land-parcels-uldk-zoning,enterprising_hamster/polish-healthcare-facilities-rpwdl,enterprising_hamster/polish-developer-apartment-prices,enterprising_hamster/polish-electricity-market-pse,enterprising_hamster/polish-legal-acts-eli,enterprising_hamster/polish-court-judgments-saos",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}

VS Code, .vscode/mcp.json:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "apify-token",
      "description": "Apify API token",
      "password": true
    }
  ],
  "servers": {
    "polish-law": {
      "type": "http",
      "url": "https://mcp.apify.com/?tools=enterprising_hamster/polish-law-mcp-server",
      "headers": {
        "Authorization": "Bearer ${input:apify-token}"
      }
    }
  }
}

Add polish-public-registers the same way with its URL.

Official MCP Registry

  • io.github.kamilkaczmareksolutions/polish-law-mcp

  • io.github.kamilkaczmareksolutions/polish-public-registers

Look them up at https://registry.modelcontextprotocol.io/v0.1/servers?search=kamilkaczmareksolutions.

Data sources

All data comes from official Polish public registers and open-data APIs: Sejm ELI, SAOS, Baza Konkurencyjności, EIPA (UDT), CEPiK, GUNB, GUGiK ULDK, RPWDL, dane.gov.pl, PSE. Personal data is limited. Building-permit investors who are private persons are anonymised, private EV station operators are anonymised, CEPiK data is aggregated (no VINs or owners), and ULDK parcels come without owners.

License

This repository is released under the MIT License.

Available Tools

12 tools
cee-public-tendersCzech, Slovakia, Hungary & Ukraine Prozorro Tenders API – TEDA
Read-onlyIdempotent

Lists public tenders from Czechia, Slovakia, Hungary and Ukraine in one normalised schema, collected from the official Prozorro, Slovak Vestník and TED sources: title, CPV codes, value, deadline and status, with includeDetails adding lots, places of performance, document links and an EU-funding flag (charged at a higher rate). Filter by country, lastDays, keywords, CPV prefixes and onlyOpen. It does not cover Poland; for Polish EU-funded procurement use polish-eu-funds-tenders-baza-konkurencyjnosci. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/cee-public-tenders on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
onlyNewNoSkip (and do not charge) tenders already delivered by a previous run with the same state key. Use with a schedule for daily alerts.
cpvCodesNoOptional. CPV codes or prefixes; 45000000-7 matches every code starting with 45, 7226 matches 72260000 etc. A tender matches when any of its CPV codes starts with any prefix.
keywordsNoOptional. Keep tenders whose title, description or lot titles contain any of these words (case- and accent-insensitive, in the source language, e.g. software, stavba, építés, ремонт).
lastDaysNoWindow of publication dates, counted back from now. Slovakia uses the date a bulletin was released as open data.
maxItemsNoUpper limit of dataset items for each selected country.
onlyOpenNoKeep only calls for competition whose submission deadline is still in the future. Turn off to also get awards, cancellations, corrections and closed tenders.
stateKeyNoName of the remembered set of delivered tenders. Use different keys for different monitors.
countriesNoCountries to collect. Each country is fetched from its own official source and normalized into the same schema.
includeDetailsNoAdd description, lots with values and CPV codes, places of performance (NUTS or region), document and submission links and EU-funding flag. Charged as tender-with-details.
maxRequestsPerSecondNoPolite rate limit per source. Defaults to 3.

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/non-destructive/open-world, so the description focuses on what they cannot: APIFY_TOKEN requirement, a paid per-item pay-per-event run of a named Actor, a 300 s server wait, and the {items, truncated} return with a 256 KiB cap. It also clarifies that onlyNew touches only the caller's own stateKey and never writes to the registry, resolving a likely false-positive on the read-only hint. Only the concrete error/timeout failure modes are unstated.

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?

It is front-loaded: purpose, sources, fields, filters, exclusions come first, then the cost/auth/return caveats. It is dense prose in a single block rather than scannable bullets, and the includeDetails pricing note appears twice in substance (fields and rate), but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so by naming the {items, truncated} shape, the 256 KiB cap and the maxItems limit. Auth, billing and timeout are all covered. A short note on what happens on run failure or timeout would make it complete.

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; the description still adds real meaning by summarizing what each filter dimension selects and, importantly, by noting includeDetails is charged at a higher rate and that maxItems is capped at 100 with 256 KiB truncation. That is value beyond the schema, though the per-parameter details (CPV prefix matching, accent-insensitive keywords, stateKey) are repeats of the schema text.

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 a specific verb and resource ('Lists public tenders from Czechia, Slovakia, Hungary and Ukraine') with the exact sources (Prozorro, Slovak Vestník, TED), the normalized fields returned, and an explicit exclusion of Poland routed to the sibling 'polish-eu-funds-tenders-baza-konkurencyjnosci'. An agent can distinguish it from every listed sibling, which are all single-domain Polish datasets.

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?

It names the alternative for the Polish case explicitly and states the boundary ('It does not cover Poland'), then spells out the filtering axes (country, lastDays, keywords, CPV prefixes, onlyOpen) so an agent knows which knobs select which subset. The when-to-use includeDetails tradeoff is also given alongside its higher price.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-building-permits-gunbPoland Building Permits API – Pozwolenia na budowę (GUNB)A
Read-onlyIdempotent

Returns building permit decisions (pozwolenia na budowę) and construction notifications (zgłoszenia) from the official GUNB register (RWDZ), newest first: project name, Construction Law category, cubature, location and dates; investors are named only when they are organisations, never private persons. Defaults to permits in Mazowieckie; set voivodeships to ALL or pass TERYT codes for other areas. Use it for construction projects and leads; for parcel boundaries and zoning use polish-land-parcels-uldk-zoning. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-building-permits-gunb on your Apify account, billed pay-per-event per delivered project (named organisation investors cost more) plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
dateToNoLatest decision date (permits) or application date (notifications).
onlyNewNoSkip cases delivered by an earlier run with the same state key and unchanged since. Use with a schedule to get a daily feed of new permits.
dateFromNoEarliest decision date (permits) or application date (notifications).
daysBackNoOnly cases from the last N days (0 = no limit). Combined with 'From date', the later date wins.
keywordsNoAny of these words in the project name, e.g. 'hala', 'magazyn', 'fotowolta'. Case and Polish letters do not matter.
maxItemsNoNewest first. You pay per delivered result.
stateKeyNoName of the memory used by 'Only new or changed cases'. Use one key per monitored search.
registersNoPERMITS = building permit decisions (pozwolenia na budowę, with the investor where it is an organisation). NOTIFICATIONS = construction notifications without objection (zgłoszenia, whole country, no investor column). Empty = PERMITS.
categoriesNoConstruction Law categories. Empty = all.
terytCodesNoTERYT code prefixes: 2 digits for a voivodeship, 4 for a county (1465 = Warsaw, 1261 = Kraków, 3064 = Poznań, 0264 = Wrocław), 6-7 for a commune. When set, these replace the voivodeship list.
worksTypesNoEmpty = all.
minCubatureNoOnly projects at least this large (cubature as stated in the register; many entries have none).
voivodeshipsNoRegions to read. Not set = mazowieckie, so the first run is quick. Choose 'Whole country' for all 16. Ignored when TERYT codes are given.
investorTypesNoOnly permits whose investor is of these types (implies a named investor). Empty = any.
investmentKindsNoSingle-family house or anything else. Empty = both.
investorContainsNoText in the investor name, e.g. 'Dom Development' or 'Gmina'. Case and Polish letters do not matter. Implies a named investor.
onlyWithInvestorNoOnly permits whose investor is a company, public body, church, non-profit or housing community (named, with address and plots). Cases of private individuals are never named.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/openWorldHint annotations: discloses the APIFY_TOKEN requirement, that each call starts one paid Actor run billed pay-per-event (named-organisation investors cost more), the 300 s wait, and that onlyNew merely stores a stateKey memory in the caller's own Apify account. It also clarifies the privacy rule that private-person investors are never named, which affects result interpretation.

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?

Two long sentences, but front-loaded with what is returned before constraints, cost, and output shape. Some detail (billing breakdown, 256 KiB cap) is dense but each clause carries operational weight; slight over-packing in sentence two costs it a point.

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 17-parameter, zero-required scraping tool with no output schema, the description still supplies the return contract ({items, truncated}, at most maxItems up to 100 and 256 KiB), cost model, timeout, and auth requirement. Nothing an agent needs in order 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?

Schema coverage is 100%, so the baseline is 3; the description adds value by summarising the implicit default (Mazowieckie unless voivodeships/TERYT set) and the investor-naming caveat that governs investorTypes/investorContains/onlyWithInvestor. It does not restate the per-parameter interaction rules already in the schema (e.g. daysBack vs dateFrom), so it adds context rather than duplicating.

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?

States a specific verb and resource: returns building permit decisions (pozwolenia na budowę) and construction notifications (zgłoszenia) from the official GUNB RWDZ register, and enumerates the fields returned (project name, category, cubature, location, dates). It also names the sibling tool it is not (polish-land-parcels-uldk-zoning) for parcels/zoning, so an agent can route without opening either schema.

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?

Gives explicit when-to-use ('construction projects and leads') and when-not ('for parcel boundaries and zoning use polish-land-parcels-uldk-zoning'), plus the geographic default behaviour (Mazowieckie first run, ALL or TERYT codes for others). Nothing essential is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-court-judgments-saosPoland Court Judgments API – SAOS Case LawA
Read-onlyIdempotent

Searches Polish court judgments in the official SAOS database (System Analizy Orzeczeń Sądowych) by court type, date range, SAOS query phrase, subject keywords and judgment type; each item has case numbers, judges and keywords, and includeFullText adds the published anonymised text (charged at a higher rate). Coverage is uneven: common courts are current, Supreme Court data ends in 2016-06, the Constitutional Tribunal in 2015-12 and KIO in 2018-09, and administrative courts return nothing. Use it for bulk lists or onlyNew feeds; to read one judgment interactively use polish-law-mcp-server. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-court-judgments-saos on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
dateToNoInclusive end date, YYYY-MM-DD. Empty means no upper bound.
phraseNoSearches metadata and text using SAOS query language. Use double quotes for an exact phrase, for example "kredyt frankowy".
onlyNewNoSkip IDs retained in a named key-value store. Retains the most recent 50,000 delivered IDs. Does not detect edits. Avoid concurrent runs sharing stateKey.
dateFromNoInclusive start date, YYYY-MM-DD. Empty means no lower bound.
keywordsNoExact SAOS subject keywords. All supplied keywords must match (AND). Source keywords are available for common courts.
maxItemsNoHard cap on actual dataset rows. Skipped records do not count. Text filtering may require more search pages to fill this cap.
stateKeyNoPersistent ID set key. Use 1–100 letters, digits, underscores, or hyphens. Use different keys for independent feeds.
courtTypeNoANY searches all available courts. Coverage checked 2026-10-18: COMMON about 474k judgments through 2026; SUPREME latest June 2016; Constitutional Tribunal December 2015; National Appeal Chamber September 2018; ADMINISTRATIVE no results. SAOS is incomplete and freshness varies.ANY
sortOrderNoSort by judgment date. The source may contain invalid or future dates.newest
textFormatNoPlain text preserves paragraphs and published anonymisation markers. HTML preserves source markup.plain
maxTextCharsNoFull text character cap after formatting. Zero means unlimited. Capped HTML may end inside a tag. textLength reports the original formatted length.
onlyWithTextNoSkip empty search snippets before fetching details, saving rows, or charging. Defaults to true with includeFullText and false for metadata. Set false explicitly to include empty snippets. A nonempty snippet does not guarantee usable full text.
judgmentTypesNoInclude any selected judgment type (OR). Empty includes all types.
commonCourtTypeNoOptional. Requires courtType COMMON. Sent as ccCourtType.
includeFullTextNoFetch individual judgment details. Successful text costs $0.01 per delivered judgment; metadata and text failures cost $0.003. Search snippets alone are not full text.
skipInvalidDatesNoSkip malformed dates, years outside 1900–2100, and dates after the UTC scrape date. Skipped records are not charged.
maxRequestsPerSecondNoShared rate cap across search, details, and retries. Default 1 request/second; maximum 3. At most 2 requests in flight.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the description's added value is cost, latency, coverage and truncation: one paid Apify run, pay-per-event billing, 300 s wait, JSON {items, truncated} capped at maxItems (max 100) and 256 KiB, plus per-court data horizons and the ADMINISTRATIVE dead end. That's substantial context beyond the annotations. It stops short of noting anything about retry/failure semantics or what happens on timeout, which keeps it at 4 rather than 5.

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?

Purpose and scope are front-loaded in the first clause, and every later sentence carries hard information (coverage cutoffs, billing, auth, output shape) rather than filler. However, it is delivered as one dense semicolon-chained block with no separation between purpose, caveats and billing, which makes it harder to scan than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter, no-output-schema tool it does a lot: it describes the return shape ({items, truncated}), the item size cap, truncation, the per-item fields, billing model and coverage horizons. What's missing is fail/timeout behavior (what happens after the 300 s wait) and any hint about output field names, which leaves a small residual gap for an agent planning a run.

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. The description adds real interpretive value on top: it frames phrase as the SAOS query language with quoted exact-phrase syntax, clarifies that keywords are AND-matched exact subject terms, that onlyNew just keeps a stateKey memory in the caller's own Apify account, and that includeFullText is charged at a higher rate. A few parameters (sortOrder, textFormat, maxTextChars, commonCourtType) are not touched in the prose, hence 4 not 5.

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?

States a specific verb (searches), the resource (Polish court judgments in SAOS), the source system, and the exact filter facets (court type, date range, phrase, keywords, judgment type). It also names the sibling it is not for (polish-law-mcp-server) and the bulk/feed use case, so an agent can distinguish it from every other sibling without opening a schema.

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?

Explicitly routes: "Use it for bulk lists or onlyNew feeds; to read one judgment interactively use polish-law-mcp-server." It also states the practical preconditions (APIFY_TOKEN env var required) and warns about the onlyNew/stateKey concurrency constraint, leaving little inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-developer-apartment-pricesPoland Apartment Prices API – Developer Price Lists dane.gov.plA
Read-onlyIdempotent

Returns new-build apartment and house offers from the developer price lists published on dane.gov.pl under the price transparency rules (jawność cen): one record per unit with price, price per m² and location, or, in priceChanges mode, only the differences from the developer's previous list. Filter by publication window (lastDays, or a date range of at most 14 days), voivodeship, city, developer, property type and availability. Use it for primary-market housing prices from developers; no sibling tool covers real estate. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-developer-apartment-prices on your Apify account, billed pay-per-event per delivered record (price changes cost more) plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
modeNoOffers returns each unit of the newest price list of every developer dataset published in the period. Price changes compares that list with the developer's previous one and returns only differences.offers
citiesNoKeep units whose city (miejscowość) or municipality (gmina) is one of these, e.g. Warszawa, Kraków. Case and Polish letters do not matter.
dateToNoLast publication date, inclusive, YYYY-MM-DD, Polish time.
onlyNewNoSkip price lists this Actor already delivered in an earlier run with the same state key. Use with a daily schedule.
dateFromNoFirst publication date, YYYY-MM-DD, Polish time. At most 14 days with dateTo.
lastDaysNoPrice lists published on dane.gov.pl in the last N×24 hours. Ignored when a date is set below. Developers republish lists daily, so 1 day already covers most active investments.
maxItemsNoStop after this many records. Each record is one charged event.
stateKeyNoSeparate memory for onlyNew, e.g. one key per schedule. Letters, digits, _ and -.
developersNoKeep units whose developer name, price-list title or investment name contains one of these fragments, e.g. Dom Development, Murapol.
voivodeshipsNoKeep units in these voivodeships (województwa). Units whose list gives no voivodeship are dropped by this filter.
maxPriceListsNoRead at most this many developer price lists, newest first. 0 means all.
onlyAvailableNoDrop units marked sold or reserved. Most lists do not state availability; those units are kept.
propertyTypesNoParking spaces, storage and commercial units are never returned as units; they appear as add-ons of a unit. Units whose type the list does not state are kept.
maxConcurrencyNoPrice lists read at the same time.
maxRequestsPerSecondNoPoliteness limit for file downloads. The dane.gov.pl API itself is always queried at 2 requests per second.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: discloses the required APIFY_TOKEN env var, that each call starts one paid Apify Actor run billed pay-per-event (price changes cost more), the 300 s wait cap, and the {items, truncated} return with 100-item / 256 KiB limits. It also clarifies that onlyNew only writes a stateKey memory in the caller's own account, consistent with readOnlyHint/idempotentHint rather than 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what is returned and the mode distinction, then packs filters, cost, auth and output contract into a dense block. It is a single long paragraph, which makes the billing/auth details harder to scan, but nearly every clause carries information an agent needs.

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 15-parameter tool with no output schema, the description supplies the missing contract ({items, truncated}, size and item caps) plus cost, auth and rate/timeout expectations. Nothing material an agent needs to call it safely is absent.

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, but the description adds real meaning beyond it: the 14-day maximum date window, the lastDays default covers most active investments, maxItems capped at 100, and the voivodeship/availability filter drop behavior. It stops short of explaining mode interaction with the filters in depth.

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?

States a specific verb and resource (returns new-build apartment/house offers from developer price lists on dane.gov.pl), names the two modes, and explicitly positions itself against siblings with 'no sibling tool covers real estate'. An agent can distinguish it from every listed sibling without opening the schema.

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?

Gives concrete usage context: primary-market developer prices, priceChanges mode for deltas versus previous lists, and onlyNew tied to a daily schedule. It lacks an explicit 'do not use this for X' exclusion (e.g. secondary-market or rental data), so it stops short of full when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-electricity-market-psePoland Electricity Prices API – PSE Day-Ahead RCEA
Read-onlyIdempotent

Returns Polish electricity market and grid data from the official PSE API (Polskie Sieci Elektroenergetyczne): RCE market price, day-ahead and imbalance prices, Kompas Energetyczny, load and generation mix, as 15-minute, hourly or daily rows. Filter by business-date range (history from 2024-06-14) or lastDays; next-day data appears once PSE publishes it, about 14:00 Europe/Warsaw. Use it for energy prices and grid statistics; no sibling tool covers electricity. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-electricity-market-pse on your Apify account, billed pay-per-event per delivered data row plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
dateToNoInclusive business date, YYYY-MM-DD. Empty means tomorrow.
onlyNewNoSkip rows whose values were already delivered by earlier runs with the same stateKey. A PSE revision of a value is delivered again.
datasetsNoPSE reports to download, processed in this order. maxItems applies to all of them together.
dateFromNoInclusive business date (doba handlowa), YYYY-MM-DD. Overrides lastDays. PSE history starts on 2024-06-14.
lastDaysNoBusiness days before dateTo (or before today) to include, used when dateFrom is empty. Without dateTo the window ends tomorrow, so day-ahead data appears once PSE publishes it (about 14:00 Europe/Warsaw).
maxItemsNoMaximum dataset rows and charged events in this run, across all datasets.
stateKeyNoName of the remembered-rows set used by onlyNew. Use different keys for independent schedules.
granularityNonative = rows as PSE publishes them (15 min, Kompas hourly). hour and day aggregate: mean of prices and power, sum of energy, maximum Kompas level. Aggregated rows carry intervalsCount and isComplete.native
maxRequestsPerSecondNoRate limit for PSE requests, including retries. One request at a time.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the tool is read-only, only queries the public source, never writes to the registry, and that onlyNew stores a stateKey memory in the user's Apify account. It also covers the APIFY_TOKEN requirement, paid-run billing model, actor identifier, 300-second server wait, and JSON response shape with truncation limits, which is unusually rich behavioral context.

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 core purpose and then adds the operational details an agent needs: date filtering, publication timing, use case, read-only behavior, auth, billing, runtime, and output limits. Although dense, every clause carries relevant information and there is no 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?

Given a complex paid external-data tool with 9 parameters, no output schema, and annotations that only cover safety/open-world traits, the description fills the important gaps. It explains inputs, timing, auth, cost, runtime, output shape, truncation, and the absence of a sibling alternative, so an agent has enough context to invoke 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 coverage is 100%, so the schema already documents the parameters in detail. The description still adds useful meaning by clarifying date-range versus lastDays behavior, PSE publication timing, maxItems as a combined cap across datasets, and the stateKey memory used by onlyNew, though it does not need to and does not explain every advanced parameter such as maxRequestsPerSecond.

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 uses a specific verb, 'Returns', and names the exact resource: Polish electricity market and grid data from the official PSE API, including RCE prices, day-ahead and imbalance prices, Kompas Energetyczny, load, and generation mix. It also explicitly states that no sibling tool covers electricity, so an agent can distinguish it from the other Polish-domain tools without opening schemas.

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?

It gives clear usage context: filter by business-date range or lastDays, and use it for energy prices and grid statistics. It also explains the publication timing for next-day data around 14:00 Europe/Warsaw and states that no sibling tool covers electricity, which is an explicit alternative-routing statement for this tool set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-eu-funds-tenders-baza-konkurencyjnosciPoland EU Funds Tenders API – Baza KonkurencyjnościA
Read-onlyIdempotent

Lists procurement notices (zapytania ofertowe) published by EU-grant beneficiaries on the official Baza Konkurencyjności portal (archive from 2014-01-01), filtered by publication date, status, search query, category, CPV, region, beneficiary name or NIP and submission deadline; includeDetails adds orders, conditions, evaluation criteria, estimated values and attachments (charged at a higher rate). Use it for Polish EU-funded procurement; for Czech, Slovak, Hungarian or Ukrainian tenders use cee-public-tenders. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-eu-funds-tenders-baza-konkurencyjnosci on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
queryNoWords searched by the portal's own search (title and content), e.g. fotowoltaika.
dateToNoInclusive, YYYY-MM-DD. Empty means today.
onlyNewNoSkip announcement IDs delivered by earlier runs with the same stateKey (not charged). Use with schedules.
regionsNoVoivodeships or Poland-wide/abroad. Matches any of them.
categoryNoOrder category as defined by the portal.ANY
cpvCodesNoExact CPV codes with check digit, e.g. 45000000-7. Matches announcements tagged with any of them.
dateFromNoInclusive, YYYY-MM-DD. Overrides lastDays.
lastDaysNoPublication date window ending today (Europe/Warsaw), used when dateFrom and dateTo are empty. 0 means the whole archive (from 2014-01-01).
maxItemsNoHard cap of dataset items (and charged events).
onlyOpenNoOnly announcements whose submission deadline is today or later.
stateKeyNoName of the remembered-ID set; use different keys for independent feeds.
statusesNoOne search per status. PUBLISHED = open or awaiting result; RESOLVED = winner chosen; CANCELLED; CLOSED.
sortOrderNonewest = latest publication first; deadline = by submission deadline. Order applies within each publication-date window.newest
deadlineToNoInclusive, YYYY-MM-DD.
subcategoryNoOptional. Must belong to the selected category.
deadlineFromNoInclusive, YYYY-MM-DD.
advertiserNipNo10-digit Polish tax ID of the beneficiary.
advertiserNameNoPart of the beneficiary (ogłoszeniodawca) name.
includeDetailsNoFetch each announcement's details (orders, CPV, places, conditions, evaluation criteria, estimated values, projects, attachments). One extra request per item; charged as announcement-with-details.
maxRequestsPerSecondNoPoliteness limit towards the public portal, including retries.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/destructiveHint/idempotent, and the description stays consistent while adding the details annotations cannot carry: APIFY_TOKEN requirement, one paid Actor run on the caller's account, pay-per-event plus platform billing, a 300 s server wait, and the {items, truncated} return shape with a 100-item / 256 KiB cap. It also clarifies that onlyNew only writes a stateKey memory to your own Apify account — a precise disclosure of the one stateful side effect.

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?

Front-loaded with purpose then alternative then operational facts; every sentence earns its place. The opening sentence is long and filter-dense, but it is a scannable enumeration rather than 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 20-parameter, no-output-schema, open-world scraper this is fully sufficient: it supplies the alternative tool, auth requirement, cost model, run timeout, result shape and size caps. 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?

Schema coverage is 100%, so the baseline is 3; the description nonetheless adds value by summarizing the filter axes (date, status, query, category, CPV, region, beneficiary name/NIP, deadline) into a single readable set and framing includeDetails in cost terms ("charged at a higher rate"), which the schema states more obliquely. It does not add syntax or per-parameter nuance beyond the schema.

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?

States a specific verb (Lists), the exact resource (procurement notices / zapytania ofertowe), the source portal (Baza Konkurencyjności) and its archive depth, then explicitly names the sibling it is not (cee-public-tenders). An agent can distinguish it from every other Polish-domain sibling without opening the schema.

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?

"Use it for Polish EU-funded procurement; for Czech, Slovak, Hungarian or Ukrainian tenders use cee-public-tenders" gives an explicit when-to-use plus a named alternative with the condition that selects it. Scope boundaries are stated rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-ev-charging-stations-eipaPoland EV Charging Stations API – Official EIPAA
Read-onlyIdempotent

Returns EV, CNG/LNG and hydrogen stations in Poland from the official EIPA register run by UDT: operator, address, GPS, power in kW and connectors, with includeLiveData adding live point status and ad-hoc prices; stations of possibly private operators are anonymised or skipped. Without eipaToken it uses a shared EIPA demo account limited to 10 static downloads an hour, so it may be refused when busy; pass your own free EIPA reader token for regular use. Use it for charging infrastructure; for vehicle fleet statistics use polish-vehicle-registrations-cepik. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-ev-charging-stations-eipa on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
citiesNoOnly stations in these places (miejscowość), e.g. Warszawa, Kraków. Case and Polish letters do not matter.
onlyNewNoSkip stations delivered by an earlier run with the same state key whose data (including live status and prices, when included) has not changed.
maxItemsNoStop after this many stations (newest registrations first). The whole register has about 7,500.
stateKeyNoName of the memory used by 'Only new or changed'. Use a different key per schedule.
eipaTokenNoOptional: your own free EIPA reader token. Leave empty to try the Actor on its shared demo account, which all users share under EIPA's limit of 10 static downloads an hour, so it may be refused when busy. For regular or scheduled runs register an e-mail at https://eipa.udt.gov.pl/reader/register, confirm it, and paste the 32-character token (or any download link) from the e-mail EIPA sends. The Actor caches the static files in your account, so one account is enough for frequent runs.
operatorsNoOnly stations whose operator name, short name, EIPA code (e.g. PL-GRW) or site operator contains one of these, e.g. GreenWay, Orlen, Tesla. Private operators are never matched.
provincesNoOnly stations in these voivodeships. Empty = whole country.
minPowerKwNoOnly stations with at least one point of this power or more, e.g. 50 for fast DC, 150 for high-power charging. 0 = any.
communitiesNoOnly stations in these communes (gmina), as EIPA names them, e.g. Warszawa, Siemianowice Śląskie.
stationTypesNoELECTRIC = EV chargers, GAS = CNG/LNG, HYDROGEN = hydrogen. Empty = all.
connectorTypesNoOnly stations with at least one of these connectors. Empty = any.
includeLiveDataNoDownload EIPA's live file: point status (free, occupied, out of service) and ad-hoc prices. One extra download (limit 240 an hour).
onlyAvailableNowNoOnly stations where EIPA reports at least one point operational and free at download time. Needs live data.
onlyFreeChargingNoOnly stations that list free charging (bezpłatne ładowanie) as a payment method.
privateOperatorsNoStations whose operator may be a natural person (sole traders, civil partnerships, names without a legal form). ANONYMIZE = deliver them at commune level with technical data, prices and status only (no operator, address, coordinates, codes or notes). SKIP = leave them out.ANONYMIZE
staticCacheHoursNoReuse the register (operators, sites, stations, points) downloaded by an earlier run with the same token for this many hours, saving 5 of your 10 static downloads an hour. Live data is always fresh. 0 = always download.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far beyond the annotations: it discloses anonymisation/skipping of possibly-private operators, the shared demo-account rate limit and refusal behavior, the 300 s wait, the 100-item / 256 KiB truncation cap, and that each call starts a paid Apify run billed per delivered item. It also reconciles the read-only claim with the fact that onlyNew keeps a stateKey memory in the user's own account, which is exactly the nuance an agent needs. Minor gap: it does not spell out cache/live-download limits beyond the inline mention.

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 purpose is front-loaded, and each subsequent clause carries real information (auth fallback, anonymisation, billing, truncation). However, it is a single dense block that mixes purpose, credentials, billing, and return shape, so a reader must parse the whole paragraph to find the cost and token rules.

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 16-parameter tool with no output schema, the description still states the return shape ({items, truncated}), the item cap (maxItems ≤100, 256 KiB), the total register size (~7,500), and the auth/billing model. Combined with 100% schema coverage, an agent has everything needed to call it correctly and interpret the result.

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% with detailed per-parameter descriptions, so the baseline is 3, but the description adds cross-parameter semantics the schema treats locally: includeLiveData unlocks live point status and ad-hoc prices, onlyNew depends on stateKey memory, and privateOperators controls whether records arrive anonymised. It does not re-explain filters like cities or minPowerKw, which the schema already covers well.

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 names a specific resource (EV, CNG/LNG and hydrogen stations in Poland), the authoritative source (official EIPA register run by UDT), and the returned fields (operator, address, GPS, power, connectors). It also explicitly routes fleet statistics queries to polish-vehicle-registrations-cepik, so an agent can distinguish it from siblings without opening the schema.

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?

Explicitly states when to use it ('for charging infrastructure'), names the alternative for a different need ('for vehicle fleet statistics use polish-vehicle-registrations-cepik'), and gives operating guidance on credentials (without eipaToken it falls back to a shared demo account capped at 10 static downloads/hour, so pass your own free reader token for regular use). Cost and run-time prerequisites are also surfaced.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-healthcare-facilities-rpwdlPoland Healthcare Facilities API – Official RPWDL RegisterA
Read-onlyIdempotent

Returns Polish healthcare facilities from the official RPWDL register (Rejestr Podmiotów Wykonujących Działalność Leczniczą): address, phone, organisation e-mail, website, NIP/REGON, specialties and beds. Filter by voivodeship, TERYT code, city, facility kind, ownership, specialty code or keyword, name, NIP, available contacts and minimum beds; the whole register is about 24,000 facilities. Use it for hospital and clinic lookups or lead lists; no sibling tool covers healthcare. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-healthcare-facilities-rpwdl on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
nipsNoOnly facilities of providers with these tax IDs (10 digits).
citiesNoCity or village names as in the address, e.g. Warszawa, Kraków. Case and Polish letters do not matter.
minBedsNoOnly facilities with at least this many beds (0 = no limit).
onlyNewNoSkip facilities delivered in an earlier run with the same state key and unchanged data. Use it for scheduled runs that report new and changed entries.
maxItemsNoStop after this many facilities, and so this many charged events. The whole register is about 24,000 facilities.
stateKeyNoName of the memory used by 'Only new or changed'. Use one key per filter set.
ownershipNoPublic (SP ZOZ, budget units, research institutes, companies at least 51% public), private companies, non-profits or church entities. Empty = all.
terytCodesNoTERYT code prefixes: 4 digits for a county (e.g. 1465 = Warsaw, 1261 = Kraków), 6-7 digits for a commune. Combined with voivodeships: a facility in any listed area matches.
nameContainsNoText found in the facility, establishment or provider name, e.g. LUX MED or szpital.
voivodeshipsNoOnly facilities in these voivodeships (regions). Empty = all of Poland.
facilityKindsNoKind of healthcare establishment. Empty = all.
onlyWithEmailNoOnly facilities with an organisation e-mail address.
onlyWithPhoneNoOnly facilities with a phone number.
specialtyCodesNo4-digit ministry codes of cells (VIII part of the resort code), e.g. 1800 dental clinic, 4500 general surgery ward, 7210 ultrasound lab. A facility matches if any of its active cells has one.
onlyWithWebsiteNoOnly facilities with a website.
specialtyKeywordsNoWords found in specialty or medical field names, in Polish, e.g. stomatolog, kardiolog, rehabilitac, okulist. A facility matches if any word appears.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations: discloses that each call needs APIFY_TOKEN, starts one paid Apify Actor run billed per delivered item, blocks up to 300 s, returns {items, truncated} capped at maxItems (max 100) and 256 KiB, and clarifies that onlyNew merely keeps a stateKey memory in the caller's own account rather than touching the registry.

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?

Front-loads what is returned, then filters, then safety/billing/return shape — a sensible ordering. It is dense and well-sized for a 16-parameter paid tool, though the 'about 24,000 facilities' figure is repeated in a slightly compressed final sentence.

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 complex, paid, zero-required-parameter tool with no output schema, the description covers cost model, auth prerequisite, timeout, item cap, response envelope, and the tricky onlyNew/stateKey semantics — everything an agent needs to invoke it 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 schema already documents all 16 parameters thoroughly; the description mainly restates the filter list. It adds only the register scale (~24,000 facilities, echoed at maxItems) and the per-filter-set hint for stateKey, which are marginal beyond the schema.

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?

States a specific verb and resource (returns Polish healthcare facilities from the official RPWDL register) and enumerates the returned fields, plus explicitly notes that no sibling tool covers healthcare, so it is instantly distinguishable from the transport/tender/legal siblings.

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?

Gives clear usage contexts (hospital and clinic lookups, lead lists) and pre-empts the sibling-selection question by declaring no sibling covers healthcare. It lacks explicit when-not-to-use guidance, but the domain boundary is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-land-parcels-uldk-zoningPoland Land Parcels API – Official ULDK ZoningA
Read-onlyIdempotent

Looks up Polish land parcels (działki) in the official GUGiK ULDK service by full parcel ID, precinct name plus number, or GPS point, returning location, area and an optional GeoJSON boundary; includeZoning adds local zoning plans (MPZP) and general plan zones (POG) with building limits from Rejestr Urbanistyczny (charged at a higher rate). No owner data; with no input it looks up three example parcels. Use it for one parcel's geometry and zoning; for building permits use polish-building-permits-gunb. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-land-parcels-uldk-zoning on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
pointsNoCoordinates in decimal degrees, latitude first, for example "52.2297,21.0122" (as copied from Google Maps). Returns the parcel that contains each point.
onlyNewNoSkip parcels delivered by an earlier run with the same state key unless something about them changed (for example a new local plan or a plan entering into force). Skipped parcels are not charged. Use with a schedule to monitor zoning.
maxItemsNoHard cap on delivered (and charged) parcels in this run.
stateKeyNoName of the memory used by 'Only new or changed'. Use one key per watch list.
parcelIdsNoFull parcel identifiers from the Polish land register (EGiB), for example 141201_1.0001.6509 or 306401_1.0051.AR_26.32. If you leave parcel IDs, names and points all empty, the Actor looks up three example parcels in the municipality of Szemud and in Mińsk Mazowiecki.
parcelNamesNoA precinct (obręb) name followed by a parcel number, for example "Krzewina 134". Names repeat across Poland, so one entry can match several parcels; see 'Matches per name'.
includeZoningNoCheck each parcel against Rejestr Urbanistyczny: local zoning plans (MPZP) and general plan zones (POG) with building limits. Parcels with zoning found are charged as 'Parcel with zoning'.
minCoveragePctNoIgnore plans and zones that cover less than this share of the parcel. Plan boundaries and parcel boundaries come from different maps, so slivers below 1% are usually drawing noise.
includeGeometryNoAdd the parcel boundary as GeoJSON in WGS84 (longitude, latitude) to each item.
maxMatchesPerNameNoThe most parcels returned for one 'precinct name and number' entry. Extra matches are listed in the run summary, not delivered or charged.
maxRequestsPerSecondNoPolite request rate towards each public service (ULDK and the planning register).

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld/idempotent annotations: it discloses that no owner data is returned, that includeZoning triggers a higher billing rate, that onlyNew is just a local stateKey memory, that each call starts a paid Apify run needing APIFY_TOKEN, that the server blocks up to 300 s, and that results are capped by maxItems and 256 KiB. The only gap is that the exact failure modes (what happens on timeout or an unroutable parcel) are not stated.

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?

Purpose and variant (geometry vs zoning) are front-loaded before the billing and auth caveats, and the sibling hand-off is placed early. It is a single very dense block, though — the pricing/actor/run-mechanics clauses could be separated so a scanning agent can stop reading after the first clause.

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 11 optional parameters, no required fields, and no output schema, the description carries real weight: it explains the at-least-one-input expectation, the effective return envelope ({items, truncated}), the per-call cap, and the paid-run side effect. Nothing an agent needs to invoke this 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?

Schema description coverage is 100%, so the baseline is 3, and the description does add a layer on top: it flags that precinct names repeat across Poland (hence multi-match behavior), that onlyNew is a state key rather than a filter on the source, and that includeZoning changes the billed event type. It stops short of tying any of this to specific parameter names, so it is value-additive rather than fully compensating.

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?

States a specific verb (looks up), a specific resource (Polish land parcels / działki in GUGiK ULDK), and the three accepted input modes (parcel ID, precinct name + number, GPS point). It also names the sibling it is *not* (polish-building-permits-gunb), so an agent can route correctly without opening a schema.

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?

Explicitly scopes the tool to "one parcel's geometry and zoning", names the alternative for permits (polish-building-permits-gunb), and documents the degenerate case ("with no input it looks up three example parcels"). When-to-use, when-to-use-something-else, and edge behavior are all covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-law-mcp-serverPolish Statutes & Court Rulings MCP – Dziennik Ustaw, SAOSA
Read-onlyIdempotent

Makes one call to the Polish Law MCP Actor, which reads the official Sejm ELI API (Dziennik Ustaw, Monitor Polski) and the SAOS court judgments API live: set tool to search_legal_acts, get_legal_act, get_legal_act_text (current consolidated wording, optionally one article), list_changed_legal_acts, search_court_judgments or get_court_judgment, and pass that tool's arguments. Use it to find or read one specific act, article or judgment; for bulk filtered lists or onlyNew feeds use polish-legal-acts-eli or polish-court-judgments-saos. Read-only: it only queries the public sources and never writes to them. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-law-mcp-server on your Apify account, billed pay-per-event per successful tool call (calls returning full text cost more; failed or empty calls are free) plus any Apify platform usage. The server waits up to 300 s; ELI answers in about a second, SAOS searches take 1-20 s and one full SAOS judgment 15-60 s.

NameRequiredDescriptionDefault
toolNoWhich law tool to run once. search_legal_acts: find acts by title stem, publisher (DU or MP), year, type, keywords, in-force status or date range. get_legal_act: metadata, status and references of one act. get_legal_act_text: plain text of an act or one article (newest consolidated text), paged. list_changed_legal_acts: acts whose ELI record changed since a time. search_court_judgments: find SAOS judgments. get_court_judgment: full text and metadata of one judgment.search_legal_acts
maxItemsNoMaximum dataset items returned to the client (1-100), applied by this server to the run's dataset.
argumentsNoArguments object for the chosen tool, exactly as the hosted Polish Law MCP server takes them, e.g. {"title": "ochron danych", "limit": 5} for search_legal_acts, {"eli": "DU/1964/93", "article": "415"} for get_legal_act_text (an ELI id or a Dz.U. citation), or {"query": "art. 415 k.c.", "court_type": "SUPREME", "limit": 5} for search_court_judgments. Full argument lists: https://apify.com/enterprising_hamster/polish-law-mcp-server

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/destructiveHint annotations by disclosing operational cost and timing: APIFY_TOKEN required, one paid Apify run per call, pay-per-event billing where full-text calls cost more and failed/empty calls are free, plus a 300 s wait ceiling with ELI ~1 s vs SAOS 1-60 s expectations. It does not describe the shape of the returned dataset items, which is the remaining gap for a delegating wrapper.

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?

Front-loads the core dispatch action, then tool list, then alternatives, then cost/latency in a single dense paragraph with no filler. The billing and timing clauses are long but each carries decision-relevant information; a bulleted split would read better than one flowing block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter wrapper with no output schema, the description covers auth, billing, timeouts, latency per backend, read-only safety and sibling alternatives. It stops short of describing what the dataset result looks like or how errors surface, which would fully close the loop for a delegating tool.

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 baseline is 3; the description still adds routing value by explaining that `arguments` must match the hosted server's per-tool signature and by noting an ELI id may be given as a Dz.U. citation. Some example argument objects duplicate what the schema already shows, limiting the gain beyond baseline.

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?

States a specific verb and resource: one dispatch call to the Polish Law MCP Actor reading the Sejm ELI API and SAOS judgments API, enumerating the six sub-tools it can run. It also names the exact siblings (polish-legal-acts-eli, polish-court-judgments-saos) it is not, so an agent can route without opening a schema.

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?

Gives an explicit when-to-use rule: "Use it to find or read one specific act, article or judgment" versus bulk filtered lists or onlyNew feeds which belong to the sibling Actors. The enum-level text in the description also spells out what each of the six tools does, removing ambiguity about which value to set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

polish-vehicle-registrations-cepikPoland Car & EV Registrations API – CEPiK Official StatsA
Read-onlyIdempotent

Returns monthly vehicle registration counts from the official CEPiK open data API, grouped by brand, model, fuel, powertrain, origin, production year or county and filtered by vehicle type, fuel, origin, voivodeship and month range (at most 60 months per run); aggregates only, no VINs or owners. Defaults are electric passenger cars in Mazowieckie for the last complete month; all of Poland can take several minutes when CEPiK is busy. Use it for fleet and EV adoption statistics; for charging infrastructure use polish-ev-charging-stations-eipa. Read-only: it only queries the public source and never writes to the registry; onlyNew merely keeps a stateKey memory in your own Apify account. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-vehicle-registrations-cepik on your Apify account, billed pay-per-event per delivered item plus any Apify platform usage; the server waits up to 300 s for the run and returns JSON {items, truncated} with at most maxItems (max 100) items and 256 KiB.

NameRequiredDescriptionDefault
topNNoKeep only the N largest groups per month and area. 0 = all groups.
brandNoOptional exact make as registered, e.g. TOYOTA (case does not matter).
modelNoOptional exact model as registered, e.g. MODEL Y.
originNoCount only vehicles of this origin, e.g. new cars bought in Poland or used imports.ANY
groupByNoColumns to count by. Empty = one total per month and area (fastest: counts come straight from the API without reading records).
monthToNoLast month, YYYY-MM. Months are reported newest first. At most 60 months per run.
onlyNewNoSkip rows already delivered by an earlier run with the same state key and the same count. Useful for schedules.
fuelTypeNoCount only this primary fuel. Hybrids are registered with petrol or diesel as primary fuel; use groupBy powertrain to see them.ELECTRIC
maxItemsNoHard cap of dataset rows (each row is one charged event).
stateKeyNoName of the remembered set of delivered rows (letters, digits, - and _).
areaLevelNoReport one total for Poland (or for the selected voivodeships together) or one block of rows per voivodeship.POLAND
dateBasisNoWhich registration date puts a vehicle in a month.FIRST_REGISTRATION_IN_POLAND
monthFromNoFirst month, YYYY-MM (e.g. 2026-01). Leave both months empty for the last complete month. With only From, the range runs to the current month (marked partialPeriod).
vehicleTypeNoCount only this vehicle type (exact CEPiK value).PASSENGER_CAR
voivodeshipsNoDefault: 14 MAZOWIECKIE. Clear the field (empty list) for all of Poland (all 16 voivodeships plus records with no voivodeship, code XX); all of Poland reads 17 voivodeships and takes several minutes when CEPiK is busy.
cacheTtlHoursNoReuse breakdowns that needed more than 1,000 records and were read by an earlier run of yours within this many hours. 0 = always ask CEPiK.
minRegistrationsNoSkip groups smaller than this.
maxRequestsPerSecondNoPoliteness limit towards api.cepik.gov.pl. Requests are always sent one at a time.
onlyCurrentlyRegisteredNoCEPiK's default: count only vehicles that are registered today. Turn off to include vehicles deregistered since.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/destructive/openWorld, but the description goes well beyond: costs (paid Apify run, pay-per-event billing plus platform usage), required APIFY_TOKEN env var, 300 s server wait, the {items, truncated} return shape with maxItems 100 and 256 KiB caps, the 60-month limit, and the fact that onlyNew only stores a stateKey in the caller's own account. That is unusually complete disclosure for a hosted-actor wrapper.

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?

Front-loaded with what it returns and how, then usage routing, then cost/latency/return-shape caveats. It is a dense single paragraph and billing details are somewhat packed together, but no sentence is padding and each adds decision-relevant information.

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 19-parameter, zero-required tool with no output schema, the description supplies the return envelope, size caps, latency expectations, auth requirement, billing model and default behavior. An agent can call this correctly and predict cost/latency without opening anything else.

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, but the description adds real value: it explains the defaults (electric passenger cars, Mazowieckie, last complete month), that an empty groupBy is fastest because counts come straight from the API, and the semantics of the month range. It does not re-explain every parameter, but the ones that drive cost and runtime are covered.

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?

States a specific verb and resource (monthly vehicle registration counts from CEPiK open data), enumerates the grouping and filter dimensions, and explicitly names the sibling tool for charging infrastructure so the agent can tell them apart. Defaults are also stated, which sharpens the mental model.

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?

Gives an explicit use case ('fleet and EV adoption statistics') and an explicit alternative with the condition that selects it ('for charging infrastructure use polish-ev-charging-stations-eipa'). It also warns that all-of-Poland queries can take several minutes, letting the agent choose scope deliberately.

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. 1 tool update
    • Changedpolish-law-mcp-server3 fields changed
      • changedInput schema / properties / arguments / description
        Previous value: -"Arguments for the tool as a JSON object, exactly as an MCP client would send them. See the README for every tool's parameters."New value: +"Arguments object for the chosen tool, exactly as the hosted Polish Law MCP server takes them, e.g. {\"title\": \"ochron danych\", \"limit\": 5} for search_legal_acts, {\"eli\": \"DU/1964/93\", \"article\": \"415\"} for get_legal_act_text (an ELI id or a Dz.U. citation), or {\"query\": \"art. 415 k.c.\", \"court_type\": \"SUPREME\", \"limit\": 5} for search_court_judgments. Full argument lists: https://apify.com/enterprising_hamster/polish-law-mcp-server"
      • changedInput schema / properties / maxItems / description
        Previous value: -"Maximum dataset items returned to the client."New value: +"Maximum dataset items returned to the client (1-100), applied by this server to the run's dataset."
      • changedInput schema / properties / tool / description
        Previous value: -"The MCP tool to call once."New value: +"Which law tool to run once. search_legal_acts: find acts by title stem, publisher (DU or MP), year, type, keywords, in-force status or date range. get_legal_act: metadata, status and references of one act. get_legal_act_text: plain text of an act or one article (newest consolidated text), paged. list_changed_legal_acts: acts whose ELI record changed since a time. search_court_judgments: find SAOS judgments. get_court_judgment: full text and metadata of one judgment."
  2. 12 tool updatesv0.1.0
    • First observedcee-public-tenders
    • First observedpolish-building-permits-gunb
    • First observedpolish-court-judgments-saos
    • First observedpolish-developer-apartment-prices
    • First observedpolish-electricity-market-pse
    • First observedpolish-eu-funds-tenders-baza-konkurencyjnosci
    • First observedpolish-ev-charging-stations-eipa
    • First observedpolish-healthcare-facilities-rpwdl
    • First observedpolish-land-parcels-uldk-zoning
    • First observedpolish-law-mcp-server
    • First observedpolish-legal-acts-eli
    • First observedpolish-vehicle-registrations-cepik

TDQS

A4.5/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a clearly distinct public-data domain, and the descriptions explicitly cross-reference sibling tools for adjacent cases such as bulk legal acts vs. interactive law lookup vs. court judgments, or Polish EU tenders vs. CEE tenders. I found no pair where an agent could reasonably misselect based on the stated purposes.

Naming Consistency4/5

Almost all names use a consistent kebab-case, source/domain-oriented convention with a polish- prefix; cee-public-tenders is the one clear prefix outlier. The names are descriptive and predictable, though several are long and they describe resources rather than following a verb_noun action pattern.

Tool Count5/5

Twelve tools is well within a reasonable range for a multi-source public-data server, and each tool corresponds to a distinct official dataset or service. There is no obvious filler or redundant tool.

Completeness4/5

For a read-only public-data aggregation server, the surface is broad and each listed source has a usable query tool with filters and detail options. Minor gaps remain for a server claiming general Polish data coverage—e.g., no company-registry or unified cross-source search—but agents can work around these within the exposed domains.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Search official US government data from any MCP client: building permits from 10 city open-data portals, federal contract opportunities from SAM.gov with contracting-officer contacts, and the CMS NPI healthcare-provider registry. Open-source TypeScript server; data delivered via Apify's pay-per-result actors using your own Apify token.
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server that provides AI agents with Polish business data tools: identifier validation (NIP, PESEL, REGON, KRS, IBAN), VAT whitelist checks, EU VIES lookups, and NBP exchange rates.
    5
    7 npm
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    MCP server providing access to Polish business registers (KRS, CRBR) via the rejestr.io API, enabling search, retrieval of organizations, beneficial owners, financial documents, and more.
    12
    -
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for querying live Polish court case law (orzecznictwo) via the SAOS API, offering tools to search judgments, fetch full cases, find judgments citing specific statutory provisions, and check Constitutional Tribunal citations.
    7
    Apache 2.0