nip-krs-mcp
With the provided schema, this MCP server lets an AI look up Polish company and organization data from two public registries by NIP or KRS.
Look up an entity by 10-digit NIP on the Ministry of Finance Biała Lista: VAT status, legal name, address, REGON, KRS, and confirmed bank accounts.
Check historical VAT status by passing a date (YYYY-MM-DD; up to 5 years back), useful for tax deductibility.
Look up an organization by 10-digit KRS in the Krajowy Rejestr Sądowy: full current entry with name, legal form, address, share capital, board members, PKD codes, shareholders, and registration/change dates.
Choose the KRS register: P for businesses/companies or S for associations/NGOs/foundations.
Note: the README lists
check_bank_accountand planned tools, but the provided schema only exposeslookup_by_nipandlookup_by_krs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nip-krs-mcpCheck VAT status for NIP 5252344078"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
honest-nip-krs-mcp
MCP server for Polish company registries. Look up any Polish company by NIP (tax id) or KRS (court registry number) from Claude Code, Claude Desktop, or any MCP-compatible AI client.
Uses two public government APIs — no authentication required. Data flows only between your machine and the official Polish government endpoints (Ministry of Finance + Ministry of Justice).
Why this exists
Every Polish business, accountant, or developer working with Polish data eventually needs to:
Verify if a client's NIP is a real, active VAT payer
Check if a vendor's invoice can be tax-deducted (VAT status on the invoice date)
Look up a company's full legal registry entry — board members, capital, address history
Confirm a bank account belongs to a whitelisted vendor (to avoid split-payment penalties)
Doing this manually via web forms is tedious. This MCP lets an AI do it in one shot.
Related MCP server: mcp-krs
Features (v0.2)
Three tools:
lookup_by_nip— official Biała Lista MF entry. For companies (with a KRS number): legal name, address, VAT status (Czynny / Zwolniony / Wykreślony), REGON, KRS, registration and removal dates, whitelisted bank accounts. For sole traders and civil partnerships: a minimised answer (see Privacy). Supports historical dates (up to 5 years back) — critical for tax-deductibility of past invoices.check_bank_account— is this bank account on the Biała Lista for this NIP on this date? Answers TAK/NIE. The check a payer needs before paying an invoice.lookup_by_krs— full KRS registry entry. Returns: name, legal form, address, share capital, board members, PKD codes, shareholders. Supports both registers:P(Przedsiębiorcy — companies) andS(Stowarzyszenia — associations, foundations, NGOs).
Planned:
lookup_by_regon— GUS BIR API (requires free API key)bulk_check_accounts— verify many bank accounts against biała lista in one call
Requirements
Python 3.10+
No API keys. No accounts. No signup. Both APIs are fully public.
Setup
git clone https://github.com/bartosz-kuc/honest-nip-krs-mcp.git
cd honest-nip-krs-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txtOn Windows, create the venv with python -m venv venv and use venv\Scripts\pip and venv\Scripts\python instead of venv/bin/pip and venv/bin/python (here and in the configs below).
Register with Claude Code:
claude mcp add pl-registries /absolute/path/to/venv/bin/python /absolute/path/to/server.pyOr with Claude Desktop — edit claude_desktop_config.json:
{
"mcpServers": {
"pl-registries": {
"command": "/absolute/path/to/venv/bin/python",
"args": ["/absolute/path/to/server.py"]
}
}
}Tools appear as mcp__pl-registries__lookup_by_nip etc.
Example usage
"Check if Google Poland is an active VAT payer."
AI calls lookup_by_nip("5252344078") → returns the biała lista entry with VAT status.
"What was Orange Polska's VAT status on 2025-11-15?"
AI calls lookup_by_nip("5260250995", date="2025-11-15") — status as of that date, important for confirming tax deductibility of an invoice you're posting late.
"Who's on the board of KRS 0000006042?"
AI calls lookup_by_krs("0000006042", register="P") → returns full registry entry with board composition.
"Is PL61 1090 1014 0000 0712 1981 2874 the right account for NIP 5252344078?"
AI calls check_bank_account("5252344078", "PL61 1090 1014 0000 0712 1981 2874") → TAK or NIE.
Privacy — sole traders (JDG)
A sole trader's entry on the Biała Lista is about a natural person, and under the GDPR the address in it is often their home address. Since v0.2, for entities without a KRS number (sole traders, civil partnerships, and public bodies outside KRS) lookup_by_nip returns only what a payer needs to verify a counterparty:
name (for a sole trader — their full name), NIP, VAT status,
town (taken from the address; the street and number are not returned),
the number of whitelisted accounts, and a pointer to
check_bank_accountto verify a specific one.
Not returned: address, REGON, VAT registration and removal dates, the list of accounts, PESEL. The response carries a privacy object listing the hidden fields and a link to the official search engine, which still publishes the full entry.
For companies, representatives, proxies and partners are left out (the Ministry's API may include their PESEL numbers) — the board is available from KRS via lookup_by_krs.
Data flow
Your AI client
↕ MCP stdio
This server (Python, on your machine)
↕ HTTPS
Public Polish gov APIs (wl-api.mf.gov.pl, api-krs.ms.gov.pl)No third party in the middle. No accounts. Nothing to breach.
Security notes
Nothing to leak. No credentials, no tokens, no OAuth — this MCP has no secrets at all.
Rate limits. The Ministry of Finance allows 100 search queries a day (up to 30 entities each) and account checks for 5,000 entities; after that, access may be blocked until midnight (source). The KRS API also limits bursts. This client does not implement retry/backoff; a burst may return HTTP 429.
Data is public, and minimised for people. Everything this MCP returns is public information you could pull manually from https://www.gov.pl/web/kas/wykaz-podatnikow-vat or https://ekrs.ms.gov.pl/. For sole traders it returns less than the source does (see Privacy).
Author
Bartosz Kuć — Warsaw-based developer, JDG owner running skanfirmy.pl (Polish company verification tools).
Site: https://skanfirmy.pl
GitHub: https://github.com/bartosz-kuc
Email: firma@bartosza.pl
Consulting
Available for consulting on Polish tax and business integrations (KSeF, GUS/NFZ/GIOŚ APIs, mBank data), MCP server design, and AI-assisted tooling for JDGs and small teams. See skanfirmy.pl/uslugi for productized packages (audit 3k PLN, setup 8-15k PLN, retainer 2-4k PLN/mo), or reach out via email.
Changelog
0.2.0 (2026-09-27) — sole traders and civil partnerships: minimised
lookup_by_nipanswer (name, NIP, VAT status, town, number of accounts) with aprivacynote; newcheck_bank_accounttool; company answers use a field whitelist without representatives, proxies and partners. Output oflookup_by_nipchanged shape:{date, found, subject, privacy, requestId, requestDateTime}instead of the raw API response.0.1.0 —
lookup_by_nip,lookup_by_krs.
License
MIT — see LICENSE.
Related
honest-gmail-mcp — local Gmail MCP
honest-calendar-mcp — local Google Calendar MCP
Available Tools
2 toolslookup_by_krsA
Look up a Polish organization by KRS number in the Krajowy Rejestr Sądowy. Returns the full current registry entry: name, legal form, address, share capital, board members, PKD codes, shareholders (for companies), registration/change dates.
| Name | Required | Description | Default |
|---|---|---|---|
| krs | Yes | 10-digit KRS number | |
| register | No | P = Przedsiębiorcy (businesses/companies), S = Stowarzyszenia (associations/NGOs/foundations) | P |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It makes clear that this is a read operation ('Returns'), that the data is the current registry entry, and enumerates the returned fields. It does not cover error or not-found behavior, but for a read-only lookup tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the action and identifier, and the second sentence provides a useful field list. There is no filler, redundancy, or irrelevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter lookup tool with no output schema, the description gives sufficient return detail to set agent expectations. It lacks explicit edge-case behavior such as invalid or nonexistent KRS numbers, but the core invocation semantics are well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both krs and register already have detailed descriptions including format, enum values, and default. The MCP description adds no parameter-specific semantics beyond what the schema already provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Look up') and a specific resource ('Polish organization by KRS number in the Krajowy Rejestr Sądowy'), which clearly distinguishes it from the NIP-based sibling tool. It also states that the tool returns the full current registry entry, making the purpose concrete and action-oriented.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly communicates when to use the tool: when an organization needs to be looked up via KRS number. It does not explicitly mention the alternative lookup_by_nip or provide exclusion conditions, but the KRS-specific scope provides enough context for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_by_nipA
Look up a Polish company by NIP on the Biała Lista (official Ministry of Finance VAT payer list). Returns: legal name, address, VAT status (active/exempt/removed), REGON, KRS, list of confirmed bank accounts. Include a date to check historical status (default: today) — this matters for tax deductibility of costs paid to that vendor.
| Name | Required | Description | Default |
|---|---|---|---|
| nip | Yes | 10-digit Polish tax id (with or without dashes/spaces) | |
| date | No | YYYY-MM-DD, defaults to today. API supports dates up to 5 years back. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It conveys a read-only lookup by listing returned data and source, and adds the important historical-status behavior. It stops short of mentioning error/not-found behavior or rate limits, which would make it fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact, front-loaded sentences. The first sentence names the action and source, the second lists expected return data, and the third gives practical parameter guidance with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter lookup with no output schema, the description covers what it does, what it returns, and when to use the optional parameter. An agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by explaining why the date parameter matters (historical status and tax deductibility) and clarifying the default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Look up a Polish company by NIP'), names the authoritative resource (Biała Lista), and enumerates the returned fields. The by-NIP scope clearly differentiates it from the sibling lookup_by_krs, so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for the optional date parameter and why it matters ('tax deductibility of costs paid to that vendor'). It does not explicitly state 'use lookup_by_krs instead when you have a KRS', but the identifier-based distinction is strongly implied by the name and description.
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.
2 tool updates
v0.1.0- First observed
lookup_by_krs - First observed
lookup_by_nip
TDQS
Scored across 2 tools
The two tools are cleanly separated by identifier type and source: NIP queries the VAT/Biała Lista registry while KRS queries the court register. There is no overlap or ambiguity about which tool to select.
Both tools follow the same lookup_by_<identifier> snake_case pattern, making the naming scheme predictable. The verb and object structure is consistent.
Two tools is below the typical 3-15 range, but it matches the server's explicit NIP/KRS scope and each tool has a distinct purpose. The set is slightly thin rather than excessive.
For a read-only registry lookup server, the main NIP and KRS lookups are well covered and cross-reference useful identifiers like REGON and KRS. Minor gaps exist, such as no lookup by REGON or company name, but the stated two-identifier scope is essentially fulfilled.
Maintenance
Related MCP Connectors
MCP server for 3M+ Polish companies — KRS & CEIDG financials, ownership, and industry search.
Verify Polish companies by NIP/KRS/REGON + EU VAT (VIES). 14 MCP tools (9 no-key).
Polish company registry: 4.4M firms, KRS/REGON data, VAT white list checks, financial statements
Polish business register (REGON / BIR1.1) — resolve any Polish company by NIP, REGON or KRS number…
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server providing AI assistants access to Polish public registries (KRS, CEIDG) and statistical data (GUS BDL) for querying companies, sole proprietorships, and regional statistics.7MIT
- AlicenseAqualityBmaintenanceMCP server for the Polish company register (KRS) via the official Ministry of Justice API — entities, boards and shareholders with verifiable citations.3214 npm1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for verifying Polish business entities from the National Court Register (KRS) and VAT White List. Allows querying by KRS, NIP, or REGON to retrieve official company data including name, address, board, and capital.Apache 2.0
- AlicenseAqualityCmaintenanceMCP 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.511 npmMIT