polish-mcp-servers 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -12
- package/catalog/actors.json +127 -0
- package/catalog/tool-descriptions.json +45 -0
- package/dist/server.js +68 -9
- package/dist/stdio.test.js +13 -0
- package/package.json +8 -7
package/README.md
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://glama.ai/mcp/servers/kamilkaczmareksolutions/polish-mcp-servers)
|
|
4
4
|
|
|
5
|
-
Local [Model Context Protocol](https://modelcontextprotocol.io) server for Polish public data. It speaks stdio and exposes
|
|
5
|
+
Local [Model Context Protocol](https://modelcontextprotocol.io) server for Polish public data. It speaks stdio and exposes 13 tools, one for each public Apify Actor by [enterprising_hamster](https://apify.com/enterprising_hamster).
|
|
6
6
|
|
|
7
7
|
`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](https://console.apify.com/settings/integrations) and set `APIFY_TOKEN`. A call without a token returns an MCP tool error that points at that page.
|
|
8
8
|
|
|
9
|
+
AI agents without an Apify account can buy a prepaid Apify API token at [agi.apify.com](https://agi.apify.com) (x402, MPP or Skyfire; minimum $1, expires after 14 days, unused balance is not refunded) and set it as `APIFY_TOKEN`. See [Agentic payments with x402](https://docs.apify.com/integrations/x402).
|
|
10
|
+
|
|
9
11
|
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`.
|
|
10
12
|
|
|
11
13
|
## Tools
|
|
@@ -24,20 +26,31 @@ Each call returns at most 100 dataset items and at most 256 KiB of JSON. Pass `m
|
|
|
24
26
|
| `polish-healthcare-facilities-rpwdl` | RPWDL facilities with address, contact, specialties, and beds. | [Store](https://apify.com/enterprising_hamster/polish-healthcare-facilities-rpwdl) |
|
|
25
27
|
| `polish-developer-apartment-prices` | Developer apartment and house offers, with price per m², from dane.gov.pl. | [Store](https://apify.com/enterprising_hamster/polish-developer-apartment-prices) |
|
|
26
28
|
| `polish-electricity-market-pse` | PSE electricity prices and grid rows (RCE, day-ahead, imbalance, load, generation). | [Store](https://apify.com/enterprising_hamster/polish-electricity-market-pse) |
|
|
29
|
+
| `polish-new-companies-krs` | New and changed companies from the KRS bulletin with NIP, REGON, PKD, and share capital. No personal data. | [Store](https://apify.com/enterprising_hamster/polish-new-companies-krs) |
|
|
30
|
+
|
|
31
|
+
The full tool and parameter descriptions that clients see live in [`catalog/tool-descriptions.json`](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.
|
|
27
32
|
|
|
28
|
-
`polish-mcp-servers` and `polish-mcp` list all
|
|
33
|
+
`polish-mcp-servers` and `polish-mcp` list all 13. `polish-law-mcp` lists only `polish-law-mcp-server`. `polish-public-registers` lists the other 12, including `cee-public-tenders`.
|
|
29
34
|
|
|
30
35
|
## Install
|
|
31
36
|
|
|
32
|
-
From
|
|
37
|
+
From npm ([`polish-mcp-servers`](https://www.npmjs.com/package/polish-mcp-servers)):
|
|
33
38
|
|
|
34
39
|
```bash
|
|
35
|
-
npx -y
|
|
40
|
+
npx -y polish-mcp-servers
|
|
36
41
|
```
|
|
37
42
|
|
|
38
43
|
Law only, or registers only:
|
|
39
44
|
|
|
40
45
|
```bash
|
|
46
|
+
npx -y --package polish-mcp-servers polish-law-mcp
|
|
47
|
+
npx -y --package polish-mcp-servers polish-public-registers
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Alternative, straight from GitHub (latest `main`, no npm registry):
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npx -y github:kamilkaczmareksolutions/polish-mcp-servers
|
|
41
54
|
npx -y --package github:kamilkaczmareksolutions/polish-mcp-servers polish-law-mcp
|
|
42
55
|
npx -y --package github:kamilkaczmareksolutions/polish-mcp-servers polish-public-registers
|
|
43
56
|
```
|
|
@@ -75,21 +88,21 @@ Claude Desktop reads `claude_desktop_config.json`. Cursor reads `~/.cursor/mcp.j
|
|
|
75
88
|
"mcpServers": {
|
|
76
89
|
"polish-mcp": {
|
|
77
90
|
"command": "npx",
|
|
78
|
-
"args": ["-y", "
|
|
91
|
+
"args": ["-y", "polish-mcp-servers"],
|
|
79
92
|
"env": {
|
|
80
93
|
"APIFY_TOKEN": "<YOUR_APIFY_TOKEN>"
|
|
81
94
|
}
|
|
82
95
|
},
|
|
83
96
|
"polish-law": {
|
|
84
97
|
"command": "npx",
|
|
85
|
-
"args": ["-y", "--package", "
|
|
98
|
+
"args": ["-y", "--package", "polish-mcp-servers", "polish-law-mcp"],
|
|
86
99
|
"env": {
|
|
87
100
|
"APIFY_TOKEN": "<YOUR_APIFY_TOKEN>"
|
|
88
101
|
}
|
|
89
102
|
},
|
|
90
103
|
"polish-public-registers": {
|
|
91
104
|
"command": "npx",
|
|
92
|
-
"args": ["-y", "--package", "
|
|
105
|
+
"args": ["-y", "--package", "polish-mcp-servers", "polish-public-registers"],
|
|
93
106
|
"env": {
|
|
94
107
|
"APIFY_TOKEN": "<YOUR_APIFY_TOKEN>"
|
|
95
108
|
}
|
|
@@ -105,7 +118,7 @@ Omit `APIFY_TOKEN` if you only want `tools/list`.
|
|
|
105
118
|
The same data is also available as hosted MCP servers on [Apify](https://apify.com/enterprising_hamster). Point your client at a URL and authenticate with your Apify account. Those servers still run as Apify Actors.
|
|
106
119
|
|
|
107
120
|
- **Polish Law MCP**: Polish statutes from the Sejm ELI API (Dziennik Ustaw, Monitor Polski) and court judgments from SAOS.
|
|
108
|
-
- **Polish Public Registers**:
|
|
121
|
+
- **Polish Public Registers**: 11 official Polish registers (EU-funded tenders, EV charging stations, vehicle registrations, building permits, land parcels and zoning, healthcare facilities, developer apartment prices, electricity market, new companies from KRS, legal acts, court judgments).
|
|
109
122
|
|
|
110
123
|
| Server | MCP Registry name | MCP URL (Streamable HTTP) |
|
|
111
124
|
|---|---|---|
|
|
@@ -116,7 +129,7 @@ The same data is also available as hosted MCP servers on [Apify](https://apify.c
|
|
|
116
129
|
### Polish Public Registers URL
|
|
117
130
|
|
|
118
131
|
```
|
|
119
|
-
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
|
|
132
|
+
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-new-companies-krs,enterprising_hamster/polish-legal-acts-eli,enterprising_hamster/polish-court-judgments-saos
|
|
120
133
|
```
|
|
121
134
|
|
|
122
135
|
You can drop Actors from the `tools=` list to expose only the registers you need.
|
|
@@ -147,7 +160,7 @@ Pricing (pay per event, FREE/BRONZE Apify plan tier):
|
|
|
147
160
|
|
|
148
161
|
### Polish Public Registers tools
|
|
149
162
|
|
|
150
|
-
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` (
|
|
163
|
+
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` (15 tools in total).
|
|
151
164
|
|
|
152
165
|
Prices are per delivered result, FREE/BRONZE Apify plan tier. Higher plan tiers pay less; see each Actor page.
|
|
153
166
|
|
|
@@ -161,6 +174,7 @@ Prices are per delivered result, FREE/BRONZE Apify plan tier. Higher plan tiers
|
|
|
161
174
|
| Healthcare facilities (RPWDL) | [polish-healthcare-facilities-rpwdl](https://apify.com/enterprising_hamster/polish-healthcare-facilities-rpwdl) | $0.004 facility |
|
|
162
175
|
| Developer apartment prices (dane.gov.pl) | [polish-developer-apartment-prices](https://apify.com/enterprising_hamster/polish-developer-apartment-prices) | $0.002 offer; $0.004 price change |
|
|
163
176
|
| Electricity market (PSE API) | [polish-electricity-market-pse](https://apify.com/enterprising_hamster/polish-electricity-market-pse) | $0.0003 market data row |
|
|
177
|
+
| New and changed companies (KRS API, Ministry of Justice) | [polish-new-companies-krs](https://apify.com/enterprising_hamster/polish-new-companies-krs) | $0.004 company |
|
|
164
178
|
| Legal acts (Sejm ELI) | [polish-legal-acts-eli](https://apify.com/enterprising_hamster/polish-legal-acts-eli) | $0.002 act metadata; $0.008 act with text |
|
|
165
179
|
| Court judgments (SAOS) | [polish-court-judgments-saos](https://apify.com/enterprising_hamster/polish-court-judgments-saos) | $0.003 judgment metadata; $0.01 judgment with full text |
|
|
166
180
|
|
|
@@ -193,7 +207,7 @@ Cursor, `~/.cursor/mcp.json` or `.cursor/mcp.json` in a project:
|
|
|
193
207
|
}
|
|
194
208
|
},
|
|
195
209
|
"polish-public-registers": {
|
|
196
|
-
"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",
|
|
210
|
+
"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-new-companies-krs,enterprising_hamster/polish-legal-acts-eli,enterprising_hamster/polish-court-judgments-saos",
|
|
197
211
|
"headers": {
|
|
198
212
|
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
|
|
199
213
|
}
|
|
@@ -237,7 +251,7 @@ Look them up at `https://registry.modelcontextprotocol.io/v0.1/servers?search=ka
|
|
|
237
251
|
|
|
238
252
|
## Data sources
|
|
239
253
|
|
|
240
|
-
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),
|
|
254
|
+
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, KRS. 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), ULDK parcels come without owners, and KRS rows carry company-level fields only (no board members or shareholders).
|
|
241
255
|
|
|
242
256
|
## License
|
|
243
257
|
|
package/catalog/actors.json
CHANGED
|
@@ -2375,5 +2375,132 @@
|
|
|
2375
2375
|
}
|
|
2376
2376
|
}
|
|
2377
2377
|
}
|
|
2378
|
+
},
|
|
2379
|
+
{
|
|
2380
|
+
"actorId": "enterprising_hamster/polish-new-companies-krs",
|
|
2381
|
+
"name": "polish-new-companies-krs",
|
|
2382
|
+
"title": "Poland New Companies API – KRS Registrations Feed",
|
|
2383
|
+
"description": "New and changed Polish companies every day from the official KRS register (nowe spółki KRS): name, NIP, REGON, address, PKD, share capital, registration date. No personal data. For leads, KYC, CRM and AI agents (MCP). CSV, JSON, Excel.",
|
|
2384
|
+
"isPublic": true,
|
|
2385
|
+
"buildId": "3yawBGDegPz9hilZA",
|
|
2386
|
+
"buildNumber": "0.1.2",
|
|
2387
|
+
"inputSchema": {
|
|
2388
|
+
"title": "Poland new & changed companies (KRS)",
|
|
2389
|
+
"type": "object",
|
|
2390
|
+
"schemaVersion": 1,
|
|
2391
|
+
"properties": {
|
|
2392
|
+
"dateFrom": {
|
|
2393
|
+
"title": "From date",
|
|
2394
|
+
"type": "string",
|
|
2395
|
+
"editor": "textfield",
|
|
2396
|
+
"description": "First bulletin day (YYYY-MM-DD, Europe/Warsaw). Empty with dateTo empty means yesterday. One day when only dateFrom is set.",
|
|
2397
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
2398
|
+
},
|
|
2399
|
+
"dateTo": {
|
|
2400
|
+
"title": "To date",
|
|
2401
|
+
"type": "string",
|
|
2402
|
+
"editor": "textfield",
|
|
2403
|
+
"description": "Last bulletin day (inclusive). Must be used together with dateFrom. At most 31 days in the range.",
|
|
2404
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
2405
|
+
},
|
|
2406
|
+
"events": {
|
|
2407
|
+
"title": "Events",
|
|
2408
|
+
"type": "array",
|
|
2409
|
+
"editor": "select",
|
|
2410
|
+
"description": "New = registration date in the window. Changed = appeared on the bulletin but registered earlier. Last-entry date does not reclassify.",
|
|
2411
|
+
"items": {
|
|
2412
|
+
"type": "string",
|
|
2413
|
+
"enum": [
|
|
2414
|
+
"new",
|
|
2415
|
+
"changed"
|
|
2416
|
+
],
|
|
2417
|
+
"enumTitles": [
|
|
2418
|
+
"New registrations",
|
|
2419
|
+
"Changed companies"
|
|
2420
|
+
]
|
|
2421
|
+
},
|
|
2422
|
+
"default": [
|
|
2423
|
+
"new",
|
|
2424
|
+
"changed"
|
|
2425
|
+
]
|
|
2426
|
+
},
|
|
2427
|
+
"pkd": {
|
|
2428
|
+
"title": "PKD codes",
|
|
2429
|
+
"type": "array",
|
|
2430
|
+
"editor": "stringList",
|
|
2431
|
+
"description": "Match full PKD codes or prefixes (e.g. 93 matches 93.29.B). Empty = any activity.",
|
|
2432
|
+
"default": []
|
|
2433
|
+
},
|
|
2434
|
+
"voivodeships": {
|
|
2435
|
+
"title": "Voivodeships",
|
|
2436
|
+
"type": "array",
|
|
2437
|
+
"editor": "select",
|
|
2438
|
+
"description": "Registered seat must be in one of these voivodeships. Empty = whole country.",
|
|
2439
|
+
"items": {
|
|
2440
|
+
"type": "string",
|
|
2441
|
+
"enum": [
|
|
2442
|
+
"dolnośląskie",
|
|
2443
|
+
"kujawsko-pomorskie",
|
|
2444
|
+
"lubelskie",
|
|
2445
|
+
"lubuskie",
|
|
2446
|
+
"łódzkie",
|
|
2447
|
+
"małopolskie",
|
|
2448
|
+
"mazowieckie",
|
|
2449
|
+
"opolskie",
|
|
2450
|
+
"podkarpackie",
|
|
2451
|
+
"podlaskie",
|
|
2452
|
+
"pomorskie",
|
|
2453
|
+
"śląskie",
|
|
2454
|
+
"świętokrzyskie",
|
|
2455
|
+
"warmińsko-mazurskie",
|
|
2456
|
+
"wielkopolskie",
|
|
2457
|
+
"zachodniopomorskie"
|
|
2458
|
+
],
|
|
2459
|
+
"enumTitles": [
|
|
2460
|
+
"dolnośląskie",
|
|
2461
|
+
"kujawsko-pomorskie",
|
|
2462
|
+
"lubelskie",
|
|
2463
|
+
"lubuskie",
|
|
2464
|
+
"łódzkie",
|
|
2465
|
+
"małopolskie",
|
|
2466
|
+
"mazowieckie",
|
|
2467
|
+
"opolskie",
|
|
2468
|
+
"podkarpackie",
|
|
2469
|
+
"podlaskie",
|
|
2470
|
+
"pomorskie",
|
|
2471
|
+
"śląskie",
|
|
2472
|
+
"świętokrzyskie",
|
|
2473
|
+
"warmińsko-mazurskie",
|
|
2474
|
+
"wielkopolskie",
|
|
2475
|
+
"zachodniopomorskie"
|
|
2476
|
+
]
|
|
2477
|
+
},
|
|
2478
|
+
"default": []
|
|
2479
|
+
},
|
|
2480
|
+
"legalForms": {
|
|
2481
|
+
"title": "Legal forms",
|
|
2482
|
+
"type": "array",
|
|
2483
|
+
"editor": "stringList",
|
|
2484
|
+
"description": "Exact forma prawna strings after trimming. Empty = any form.",
|
|
2485
|
+
"default": []
|
|
2486
|
+
},
|
|
2487
|
+
"minShareCapital": {
|
|
2488
|
+
"title": "Minimum share capital",
|
|
2489
|
+
"type": "number",
|
|
2490
|
+
"editor": "number",
|
|
2491
|
+
"description": "Companies without share capital fail this filter when set.",
|
|
2492
|
+
"minimum": 0
|
|
2493
|
+
},
|
|
2494
|
+
"maxItems": {
|
|
2495
|
+
"title": "Max companies",
|
|
2496
|
+
"type": "integer",
|
|
2497
|
+
"editor": "number",
|
|
2498
|
+
"description": "Stop after this many companies are saved (default keeps Start runs cheap).",
|
|
2499
|
+
"default": 20,
|
|
2500
|
+
"minimum": 1,
|
|
2501
|
+
"maximum": 20000
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
}
|
|
2378
2505
|
}
|
|
2379
2506
|
]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"polish-law-mcp-server": {
|
|
3
|
+
"description": "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.",
|
|
4
|
+
"parameters": {
|
|
5
|
+
"tool": "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.",
|
|
6
|
+
"arguments": "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"
|
|
7
|
+
}
|
|
8
|
+
},
|
|
9
|
+
"polish-legal-acts-eli": {
|
|
10
|
+
"description": "Lists Polish legal acts from the official Sejm ELI API (Dziennik Ustaw or Monitor Polski), filtered by year or date range, title stem, ELI keywords, act type and in-force status; each item is act metadata, with includeDetails adding keywords, references, issuing bodies and inForce, and includeText adding extracted HTML/PDF text (no OCR, charged at a higher rate). Use it for bulk lists or monitoring of acts; to read one act or article 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-legal-acts-eli 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."
|
|
11
|
+
},
|
|
12
|
+
"polish-court-judgments-saos": {
|
|
13
|
+
"description": "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."
|
|
14
|
+
},
|
|
15
|
+
"polish-eu-funds-tenders-baza-konkurencyjnosci": {
|
|
16
|
+
"description": "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."
|
|
17
|
+
},
|
|
18
|
+
"cee-public-tenders": {
|
|
19
|
+
"description": "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."
|
|
20
|
+
},
|
|
21
|
+
"polish-ev-charging-stations-eipa": {
|
|
22
|
+
"description": "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."
|
|
23
|
+
},
|
|
24
|
+
"polish-vehicle-registrations-cepik": {
|
|
25
|
+
"description": "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."
|
|
26
|
+
},
|
|
27
|
+
"polish-building-permits-gunb": {
|
|
28
|
+
"description": "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."
|
|
29
|
+
},
|
|
30
|
+
"polish-land-parcels-uldk-zoning": {
|
|
31
|
+
"description": "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."
|
|
32
|
+
},
|
|
33
|
+
"polish-healthcare-facilities-rpwdl": {
|
|
34
|
+
"description": "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."
|
|
35
|
+
},
|
|
36
|
+
"polish-developer-apartment-prices": {
|
|
37
|
+
"description": "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."
|
|
38
|
+
},
|
|
39
|
+
"polish-electricity-market-pse": {
|
|
40
|
+
"description": "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."
|
|
41
|
+
},
|
|
42
|
+
"polish-new-companies-krs": {
|
|
43
|
+
"description": "Returns new and changed Polish companies from the official KRS register of entrepreneurs (Krajowy Rejestr Sądowy, rejestr przedsiębiorców) via the Ministry of Justice KRS API: for each KRS number on the daily bulletin in the date window (empty dates mean yesterday, at most 31 days) one item with name, KRS, NIP, REGON, legal form, seat address, main and other PKD codes, share capital, registration and last-entry dates and eventType new or changed. Filter by events, PKD code prefixes, voivodeships, legal forms and minimum share capital; company-level fields only, no personal data such as board members or shareholders. Use it for new-company lead lists, KYC and CRM monitoring; for healthcare providers use polish-healthcare-facilities-rpwdl. Read-only: it only queries the public source and never writes to the registry. Each call needs the APIFY_TOKEN env var and starts one paid run of the Apify Actor enterprising_hamster/polish-new-companies-krs on your Apify account, billed pay-per-event per delivered company 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."
|
|
44
|
+
}
|
|
45
|
+
}
|
package/dist/server.js
CHANGED
|
@@ -4,6 +4,8 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
5
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
6
6
|
const CATALOG_URL = new URL("../catalog/actors.json", import.meta.url);
|
|
7
|
+
const DESCRIPTIONS_URL = new URL("../catalog/tool-descriptions.json", import.meta.url);
|
|
8
|
+
const PACKAGE_URL = new URL("../package.json", import.meta.url);
|
|
7
9
|
const TOKEN_URL = "https://console.apify.com/settings/integrations";
|
|
8
10
|
const MISSING_TOKEN = `Missing APIFY_TOKEN. Create a token at ${TOKEN_URL} and set APIFY_TOKEN.`;
|
|
9
11
|
const DEFAULT_MAX_ITEMS = 20;
|
|
@@ -11,19 +13,26 @@ const ITEM_CEILING = 100;
|
|
|
11
13
|
const RESPONSE_BYTE_CAP = 256 * 1024;
|
|
12
14
|
const SYNC_TIMEOUT_SECS = 300;
|
|
13
15
|
const FETCH_ABORT_MS = 320_000;
|
|
14
|
-
const SERVER_VERSION = "0.1.0";
|
|
15
16
|
const LAW_INSTRUCTIONS = "One tool runs the law actor. Set tool to an enum value and pass arguments. maxItems caps returned dataset rows.";
|
|
16
17
|
const REGISTERS_INSTRUCTIONS = "Each tool runs one actor with that actor's input. maxItems caps dataset rows.";
|
|
18
|
+
// Every tool proxies a public read of an official register through an Apify Actor run.
|
|
19
|
+
const TOOL_ANNOTATIONS = {
|
|
20
|
+
readOnlyHint: true,
|
|
21
|
+
destructiveHint: false,
|
|
22
|
+
idempotentHint: true,
|
|
23
|
+
openWorldHint: true,
|
|
24
|
+
};
|
|
17
25
|
export async function serve(profile) {
|
|
18
|
-
const tools = selectProfile(loadCatalog(CATALOG_URL), profile);
|
|
26
|
+
const tools = selectProfile(loadCatalog(CATALOG_URL, DESCRIPTIONS_URL), profile);
|
|
19
27
|
const label = serverLabel(profile);
|
|
20
|
-
const server = new Server({ name: label.name, version:
|
|
28
|
+
const server = new Server({ name: label.name, version: readVersion(PACKAGE_URL) }, { capabilities: { tools: {} }, instructions: label.instructions });
|
|
21
29
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
22
30
|
tools: tools.map((tool) => ({
|
|
23
31
|
name: tool.name,
|
|
24
32
|
title: tool.title,
|
|
25
33
|
description: tool.description,
|
|
26
34
|
inputSchema: tool.inputSchema,
|
|
35
|
+
annotations: { title: tool.title, ...TOOL_ANNOTATIONS },
|
|
27
36
|
})),
|
|
28
37
|
}));
|
|
29
38
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -46,7 +55,38 @@ function serverLabel(profile) {
|
|
|
46
55
|
}
|
|
47
56
|
}
|
|
48
57
|
}
|
|
49
|
-
function
|
|
58
|
+
function readVersion(url) {
|
|
59
|
+
const parsed = JSON.parse(readFileSync(fileURLToPath(url), "utf8"));
|
|
60
|
+
if (!isObject(parsed)) {
|
|
61
|
+
throw new Error("package.json must be a JSON object.");
|
|
62
|
+
}
|
|
63
|
+
return requiredString(parsed.version, "version");
|
|
64
|
+
}
|
|
65
|
+
function loadToolTexts(url) {
|
|
66
|
+
const parsed = JSON.parse(readFileSync(fileURLToPath(url), "utf8"));
|
|
67
|
+
if (!isObject(parsed)) {
|
|
68
|
+
throw new Error("Tool descriptions must be a JSON object keyed by tool name.");
|
|
69
|
+
}
|
|
70
|
+
const texts = new Map();
|
|
71
|
+
for (const [name, entry] of Object.entries(parsed)) {
|
|
72
|
+
if (!isObject(entry)) {
|
|
73
|
+
throw new Error(`Tool description for ${name} must be an object.`);
|
|
74
|
+
}
|
|
75
|
+
const parameters = {};
|
|
76
|
+
if (entry.parameters !== undefined) {
|
|
77
|
+
if (!isObject(entry.parameters)) {
|
|
78
|
+
throw new Error(`Tool ${name} parameters must be an object.`);
|
|
79
|
+
}
|
|
80
|
+
for (const [key, text] of Object.entries(entry.parameters)) {
|
|
81
|
+
parameters[key] = requiredString(text, `${name}.parameters.${key}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
texts.set(name, { description: requiredString(entry.description, `${name}.description`), parameters });
|
|
85
|
+
}
|
|
86
|
+
return texts;
|
|
87
|
+
}
|
|
88
|
+
function loadCatalog(url, descriptionsUrl) {
|
|
89
|
+
const texts = loadToolTexts(descriptionsUrl);
|
|
50
90
|
const parsed = JSON.parse(readFileSync(fileURLToPath(url), "utf8"));
|
|
51
91
|
if (!Array.isArray(parsed)) {
|
|
52
92
|
throw new Error("Actor catalog must be a JSON array.");
|
|
@@ -57,7 +97,7 @@ function loadCatalog(url) {
|
|
|
57
97
|
if (!isObject(row) || row.isPublic !== true) {
|
|
58
98
|
continue;
|
|
59
99
|
}
|
|
60
|
-
const tool = bindTool(row);
|
|
100
|
+
const tool = bindTool(row, texts);
|
|
61
101
|
if (names.has(tool.name)) {
|
|
62
102
|
throw new Error(`Duplicate actor name ${tool.name}.`);
|
|
63
103
|
}
|
|
@@ -66,7 +106,7 @@ function loadCatalog(url) {
|
|
|
66
106
|
}
|
|
67
107
|
return tools;
|
|
68
108
|
}
|
|
69
|
-
function bindTool(row) {
|
|
109
|
+
function bindTool(row, texts) {
|
|
70
110
|
const name = requiredString(row.name, "name");
|
|
71
111
|
const actorId = requiredString(row.actorId, "actorId");
|
|
72
112
|
const slash = actorId.indexOf("/");
|
|
@@ -74,15 +114,34 @@ function bindTool(row) {
|
|
|
74
114
|
throw new Error(`Actor id ${actorId} must look like owner/name.`);
|
|
75
115
|
}
|
|
76
116
|
const title = requiredString(row.title, "title");
|
|
77
|
-
const
|
|
117
|
+
const text = texts.get(name);
|
|
118
|
+
if (text === undefined) {
|
|
119
|
+
throw new Error(`Tool ${name} has no entry in catalog/tool-descriptions.json.`);
|
|
120
|
+
}
|
|
121
|
+
const description = text.description;
|
|
78
122
|
const buildNumber = requiredString(row.buildNumber, "buildNumber");
|
|
79
123
|
if (!isObject(row.inputSchema) || row.inputSchema.type !== "object") {
|
|
80
124
|
throw new Error(`Actor ${name} inputSchema must be a JSON object schema.`);
|
|
81
125
|
}
|
|
82
126
|
const router = isLawRouter(row.inputSchema);
|
|
83
|
-
const { inputSchema, cap } = listSchema(row.inputSchema);
|
|
127
|
+
const { inputSchema, cap } = listSchema(describeParameters(name, row.inputSchema, text.parameters));
|
|
84
128
|
return { name, title, description, inputSchema, actorId, buildNumber, router, cap };
|
|
85
129
|
}
|
|
130
|
+
function describeParameters(name, schema, texts) {
|
|
131
|
+
const properties = schema.properties;
|
|
132
|
+
if (!isObject(properties)) {
|
|
133
|
+
throw new Error(`Actor ${name} inputSchema.properties must be an object.`);
|
|
134
|
+
}
|
|
135
|
+
const described = { ...properties };
|
|
136
|
+
for (const [key, description] of Object.entries(texts)) {
|
|
137
|
+
const property = properties[key];
|
|
138
|
+
if (!isObject(property)) {
|
|
139
|
+
throw new Error(`Tool ${name} describes unknown parameter ${key}.`);
|
|
140
|
+
}
|
|
141
|
+
described[key] = { ...property, description };
|
|
142
|
+
}
|
|
143
|
+
return { ...schema, properties: described };
|
|
144
|
+
}
|
|
86
145
|
function isLawRouter(schema) {
|
|
87
146
|
if (!isObject(schema.properties)) {
|
|
88
147
|
return false;
|
|
@@ -118,7 +177,7 @@ function listSchema(schema) {
|
|
|
118
177
|
maxItems: {
|
|
119
178
|
type: "integer",
|
|
120
179
|
title: "Maximum items",
|
|
121
|
-
description: "Maximum dataset items returned to the client.",
|
|
180
|
+
description: "Maximum dataset items returned to the client (1-100), applied by this server to the run's dataset.",
|
|
122
181
|
default: cap.fallback,
|
|
123
182
|
minimum: cap.min,
|
|
124
183
|
maximum: cap.max,
|
package/dist/stdio.test.js
CHANGED
|
@@ -7,6 +7,8 @@ import { fileURLToPath } from "node:url";
|
|
|
7
7
|
const TOKEN_URL = "https://console.apify.com/settings/integrations";
|
|
8
8
|
const LAW_TOOL = "polish-law-mcp-server";
|
|
9
9
|
const root = fileURLToPath(new URL("..", import.meta.url));
|
|
10
|
+
const descriptions = JSON.parse(readFileSync(new URL("../catalog/tool-descriptions.json", import.meta.url), "utf8"));
|
|
11
|
+
const packageVersion = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
|
|
10
12
|
const catalog = JSON.parse(readFileSync(new URL("../catalog/actors.json", import.meta.url), "utf8"))
|
|
11
13
|
.filter((row) => row.isPublic);
|
|
12
14
|
function childEnv(token) {
|
|
@@ -56,11 +58,22 @@ function schemaOf(tool) {
|
|
|
56
58
|
test("tools/list works without a token", async () => {
|
|
57
59
|
await withClient("dist/main.js", childEnv(), async (client) => {
|
|
58
60
|
assert.equal(client.getServerVersion()?.name, "polish-mcp");
|
|
61
|
+
assert.equal(client.getServerVersion()?.version, packageVersion);
|
|
59
62
|
const listed = await client.listTools();
|
|
60
63
|
assert.deepEqual(listed.tools.map((tool) => tool.name), catalog.map((row) => row.name));
|
|
61
64
|
for (const tool of listed.tools) {
|
|
62
65
|
const row = catalog.find((entry) => entry.name === tool.name);
|
|
63
66
|
assert.ok(row);
|
|
67
|
+
const text = descriptions[tool.name];
|
|
68
|
+
assert.ok(text, `${tool.name} has a description entry`);
|
|
69
|
+
assert.equal(tool.description, text.description);
|
|
70
|
+
for (const phrase of ["Read-only", "APIFY_TOKEN", "paid run", "300 s"]) {
|
|
71
|
+
assert.equal(tool.description?.includes(phrase), true, `${tool.name} description mentions ${phrase}`);
|
|
72
|
+
}
|
|
73
|
+
assert.equal(tool.annotations?.readOnlyHint, true);
|
|
74
|
+
assert.equal(tool.annotations?.destructiveHint, false);
|
|
75
|
+
assert.equal(tool.annotations?.idempotentHint, true);
|
|
76
|
+
assert.equal(tool.annotations?.openWorldHint, true);
|
|
64
77
|
const listedProperties = schemaOf(tool).properties ?? {};
|
|
65
78
|
const catalogProperties = row.inputSchema.properties ?? {};
|
|
66
79
|
assert.equal(listedProperties.maxItems !== undefined, true);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "polish-mcp-servers",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "MCP stdio server for Polish public law and registers. Lists
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "MCP stdio server for Polish public law and registers. Lists 13 Apify Actor tools without a token and runs them with APIFY_TOKEN.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Kamil Kaczmarek",
|
|
7
7
|
"homepage": "https://github.com/kamilkaczmareksolutions/polish-mcp-servers#readme",
|
|
@@ -21,17 +21,18 @@
|
|
|
21
21
|
"open-data",
|
|
22
22
|
"eli",
|
|
23
23
|
"saos",
|
|
24
|
-
"cepik"
|
|
24
|
+
"cepik",
|
|
25
|
+
"krs"
|
|
25
26
|
],
|
|
26
27
|
"type": "module",
|
|
27
28
|
"engines": {
|
|
28
29
|
"node": ">=20"
|
|
29
30
|
},
|
|
30
31
|
"bin": {
|
|
31
|
-
"polish-mcp-servers": "
|
|
32
|
-
"polish-mcp": "
|
|
33
|
-
"polish-law-mcp": "
|
|
34
|
-
"polish-public-registers": "
|
|
32
|
+
"polish-mcp-servers": "dist/main.js",
|
|
33
|
+
"polish-mcp": "dist/main.js",
|
|
34
|
+
"polish-law-mcp": "dist/law.js",
|
|
35
|
+
"polish-public-registers": "dist/registers.js"
|
|
35
36
|
},
|
|
36
37
|
"files": [
|
|
37
38
|
"dist",
|