regon-mcp
# regon-mcp
<!-- mcp-name: io.github.SmartMobileHouse/regon-mcp -->
A [Model Context Protocol](https://modelcontextprotocol.io) server that gives AI
assistants clean, typed access to the **Polish REGON business register** (GUS
BIR1). Look up any Polish company by **NIP**, **REGON**, or **KRS** and get back
structured data — name, address, legal form, activity codes — without touching
the underlying SOAP API.
The official [GUS BIR1 API](https://api.stat.gov.pl/Home/RegonApi) is a WCF SOAP
service with WS-Addressing, MTOM multipart responses, an HTTP-header session
token, and XML-nested-inside-XML result payloads. `regon-mcp` hides all of that
behind a handful of simple tools.
> Built and maintained by [Smart Mobile House](https://smartmobilehouse.com) —
> secure AI implementation for enterprise.
## Tools
| Tool | Description |
| --- | --- |
| `search_by_nip(nip)` | Look up an entity by 10-digit NIP (tax id). |
| `search_by_regon(regon)` | Look up an entity by 9- or 14-digit REGON. |
| `search_by_krs(krs)` | Look up an entity by 10-digit KRS (court register). |
| `search_bulk(identifiers, id_type)` | Look up up to 20 entities of one type at once. |
| `get_full_report(regon, report_type)` | Fetch a detailed report for one entity. |
| `list_report_types()` | List valid report names, with guidance on which to use. |
Every response includes a `source` block that names the register (REGON / GUS),
the environment, and a UTC `retrieved_at` timestamp — so downstream use can cite
the data correctly, as GUS requires.
## Quick start
No install needed — run it straight from the repo with
[uv](https://docs.astral.sh/uv/):
```bash
uvx --from git+https://github.com/SmartMobileHouse/regon-mcp regon-mcp
```
By default it uses the **public test key** against the anonymized GUS test
database, so it runs with zero setup. For live data, request a free `USER_KEY`
from `regon_bir@stat.gov.pl` and set the environment variables below.
### Use it in Claude Desktop / Claude Code
Add to your MCP config (e.g. `claude_desktop_config.json` or a project
`.mcp.json`):
```json
{
"mcpServers": {
"regon": {
"command": "uvx",
"args": ["--from", "git+https://github.com/SmartMobileHouse/regon-mcp", "regon-mcp"],
"env": {
"REGON_API_KEY": "your-user-key",
"REGON_ENV": "prod"
}
}
}
}
```
During development, point it at a local checkout instead:
```json
{
"mcpServers": {
"regon": {
"command": "uvx",
"args": ["--from", "/absolute/path/to/regon-mcp", "regon-mcp"],
"env": { "REGON_API_KEY": "abcde12345abcde12345" }
}
}
}
```
## Configuration
| Variable | Default | Description |
| --- | --- | --- |
| `REGON_API_KEY` | public test key | Your GUS BIR `USER_KEY`. |
| `REGON_ENV` | `test` | `test` (anonymized data) or `prod` (live data). |
| `REGON_TIMEOUT` | `30` | HTTP timeout in seconds. |
Use `REGON_ENV=prod` only with a real `USER_KEY`; the test key works only
against the test environment.
## Development
```bash
git clone https://github.com/SmartMobileHouse/regon-mcp
cd regon-mcp
uv sync # create the venv and install deps
uv run pytest # offline tests: validation, parsing, mocked client,
# and an in-memory MCP tool-discovery smoke test.
# (network tests are deselected by default)
uv run regon-mcp # run the server over stdio
# Live tests against the GUS endpoint (deselected unless opted in):
REGON_RUN_NETWORK=1 uv run pytest -m network # session lifecycle (test env)
REGON_PROD_KEY=<your-key> uv run pytest -m network # positive-control on live data
```
The client is a small hand-rolled SOAP layer over `httpx` (see
`src/regon_mcp/client.py`) — no heavyweight SOAP stack, no runtime WSDL fetch.
## Notes & limitations
- The **GUS test database is anonymized** and returns little or no entity data.
Meaningful results require a production `USER_KEY` with `REGON_ENV=prod`.
- Respect the GUS terms of use and rate limits. This project is an independent
open-source client and is not affiliated with or endorsed by GUS.
- Data belongs to GUS. When you present it, cite **REGON / GUS** with the
retrieval date (surfaced in every response's `source` block).
## License
[MIT](LICENSE) © Smart Mobile House
TDQS
Scored across 6 tools
Each tool has a distinct, well-defined purpose: three searches by specific identifiers (REGON, NIP, KRS), a bulk search, a detailed report fetcher, and a report type lister. There is no overlap or ambiguity between tools.
All tool names follow a consistent verb_noun pattern with snake_case: search_by_regon, search_by_nip, search_by_krs, search_bulk, get_full_report, list_report_types. The naming is predictable and uniform.
Six tools is well-scoped for a registry lookup service. Each tool is necessary and covers a core function without unnecessary extras or missing essential operations.
The tool set fully covers the domain of Polish business registry lookups: searching by all major identifiers, bulk lookup, and obtaining detailed reports. The list_report_types tool ensures users can correctly choose report types, and the flow from search to report is well-supported.