nip-krs-mcp
Click on "Install 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.
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.1)
Two tools:
lookup_by_nip— official Biała Lista MF entry. Returns: legal name, address, VAT status (Czynny / Zwolniony / Wykreślony), REGON, KRS, list of whitelisted bank accounts. Supports historical dates (up to 5 years back) — critical for tax-deductibility of past invoices.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 for v0.2:
lookup_by_regon— GUS BIR API (requires free API key)search_by_name— fuzzy search across biała lista and KRSbulk_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/nip-krs-mcp.git
cd nip-krs-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txtRegister 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 full 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.
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. Both APIs enforce rate limits (biała lista: 10 req/sec, KRS: similar). This client does not currently implement retry/backoff; a burst may return HTTP 429.
Data is public. Anything this MCP returns is already public information you could pull manually from https://www.podatki.gov.pl/wykaz-podatnikow-vat/ or https://ekrs.ms.gov.pl/.
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.
License
MIT — see LICENSE.
Related
honest-gmail-mcp — local Gmail MCP
honest-calendar-mcp — local Google Calendar MCP
ksef-mcp — Polish KSeF (e-invoicing) 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. Dates show when Glama detected each change.
2 tool updates
v0.1.0- First observed
lookup_by_krs - First observed
lookup_by_nip
TDQS
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). 9 MCP tools, no key.
Polish company registry: 4.4M firms, KRS/REGON data, VAT white list checks, financial statements
Hosted MCP server for real-world data: business registries, sanctions, companies, domains, crypto.
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.147MIT
- AlicenseAqualityBmaintenanceMCP server for the Polish company register (KRS) via the official Ministry of Justice API — entities, boards and shareholders with verifiable citations.3611MIT
- AlicenseNot gradedqualityCmaintenanceMCP 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.521MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bartosz-kuc/nip-krs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server