handelsregister-mcp
This server provides structured access to the German Commercial Register (Handelsregister) via handelsregister.de, enabling AI agents to search for companies, retrieve official documents, and parse shareholder data without dealing with the portal's complex web interface.
search_company— Search by name or keywords with exact, partial, phonetic/fuzzy matching, and wildcard support (*,?).get_company— Resolve a company name to its register record; returns best match or ranked suggestions for ambiguous queries.fetch_document— Download and parse register extracts by type: current (AD), chronological (CD), historical (HD), structured XJustiz XML (SI), announcements (VÖ), or holder data (UT). Returns structured fields including name, address, capital, business purpose, and a management table.list_filed_documents— List all documents on file for a company (e.g., shareholder lists, articles of association, annual accounts) grouped by category with dates.get_shareholders— Locate, download, and parse the Gesellschafterliste into a structured table with shareholder name, type, city, register, date of birth, shares, nominal total (EUR), and percentage. Includes OCR fallback for scanned PDFs.fetch_filed_document— Download a specific filed document by category; also parses shareholder tables for share lists.rate_limit_status— Check remaining requests in the current hour (limit: 60 requests/hour per portal terms).
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., "@handelsregister-mcpget register extract for Volkswagen AG"
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.
handelsregister-mcp
An open-source Model Context Protocol server for the German Commercial Register — handelsregister.de.
Give your AI agents first-class access to official German company data: search the register, read register extracts with management and capital, list filed documents, and pull the shareholder list (Gesellschafterliste) — all returned as structured data and tables, not raw HTML.
„Das Internet ist für uns alle Neuland.“
In 2013, a German Federal Chancellor stood next to the US President and described the internet as Neuland — uncharted new territory. The line became a national meme.
More than a decade later, the official Handelsregister is a living monument to that Neuland era: a JavaServer Faces application that threads a server-side ViewState through every click, a lazy-loaded PrimeFaces document tree, a strict 60-requests-per-hour limit baked into its terms of use, and no public API whatsoever. Since 2022 the data is free and public by law — yet it stays locked behind a portal that no machine was ever meant to talk to.
That gap is exactly why MCP servers need to exist. An LLM agent can reason brilliantly about a company — if something hands it the company's data. This project is that something: a small, deterministic bridge from a relic of Neuland to the agents of today.
Features
🔎 Company search — by name/keywords, with exact, all-keyword, and phonetic matching, plus fuzzy resolution that returns ranked suggestions when the name isn't exact.
📄 Register extracts (AD / CD / HD) — parsed into structured fields: name, register number, seat, address, capital, business purpose, dates, and a management table (Geschäftsführer / Vorstand with birthdates).
🧬 Structured XJustiz data (SI) — the machine-readable register payload, parsed.
👥 Shareholders as a table — finds and downloads the filed Gesellschafterliste and extracts
{shareholder, type, city, register, date_of_birth, shares, nominal_total_eur, percent}. Handles complex, multi-page, bilingual cap tables.🗂️ Filed-document register — list everything on file (shareholder lists, articles of association, annual accounts, …) and download any of it.
🧾 OCR fallback — scanned/image-only PDFs are run through Tesseract so text still comes out.
⏱️ Polite by design — a shared 60 req/hour limiter, on-disk caching, descriptive User-Agent.
🧱 Fully deterministic — no LLM lives inside the server (see Design).
Related MCP server: brreg-mcp-server
How it works
handelsregister.de exposes no REST API — only a JSF/PrimeFaces web form. Every request must carry a session cookie and a server-generated ViewState through a multi-step submission. This server reproduces that browser flow with mechanize and turns the rendered HTML/PDF/XML into clean structured data.
Since 1 August 2022 (the DiRUG law), both searches and document downloads are free of charge.
⚠️ Legal & rate limits — read this first
The Handelsregister is public, but not a free-for-all to scrape:
Its Nutzungsordnung (terms of use, per §9 HGB) forbids more than 60 retrievals per hour, and the portal FAQ warns that automated mass querying may be treated as a criminal offence (§§303a, b StGB).
This server enforces a shared 60 requests/hour limit by default. Do not raise it to abuse the portal. For high-volume or commercial use, use a licensed data provider (e.g. OpenRegister, handelsregister.ai) instead of scraping.
Register data contains personal data (managing directors, shareholders, birthdates). Handle it under the GDPR and use it only for the informational purposes the register is intended for.
This is a tool for legitimate, measured lookups — diligence, research, journalism, compliance — not bulk harvesting.
Install
git clone https://github.com/lexdoudkin/handelsregister-mcp.git
cd handelsregister-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e .
# optional: OCR for scanned documents
pip install -e ".[ocr]"
brew install tesseract tesseract-lang # macOS; provides the Tesseract binary + German packLicense note on the OCR extra:
[ocr]pulls in PyMuPDF, which is AGPL-3.0 / commercial dual-licensed. The core package (without[ocr]) is fully permissive. If you redistribute a product built on the OCR path, mind AGPL's terms or obtain a commercial PyMuPDF license.
Connect it to an MCP client
Claude Code
claude mcp add handelsregister -- handelsregister-mcpClaude Desktop — add to your MCP config (see examples/claude_desktop_config.json):
{
"mcpServers": {
"handelsregister": {
"command": "handelsregister-mcp",
"env": { "HANDELSREGISTER_MAX_PER_HOUR": "60" }
}
}
}Then just ask your agent things like "Who are the shareholders of Trade Republic Bank GmbH?" or "Get the register details and managing directors of GASAG AG."
Tools
Every tool returns structured data — search rows, parsed company fields, and shareholder/management tables — plus a ready-to-render markdown table for document tools.
Tool | What it does |
| Search by name/keywords. |
| Name lookup. Exact name → the record; inexact/ambiguous → |
| Shareholders as a table — resolves the name, downloads the filed Gesellschafterliste, and extracts structured rows. |
| List everything filed in the DK register, grouped by category, with dates. |
| Download any filed document by category (+ shareholder table for share lists). |
| Download a register extract. |
| Remaining requests in the current hour. |
Document types: AD current extract · CD chronological extract · HD historical extract · SI structured XML (XJustiz) · VÖ announcements · UT holder data. (DK, the filed-documents register, is reached via list_filed_documents / get_shareholders / fetch_filed_document.)
Example: get_shareholders
// get_shareholders("Trade Republic Bank GmbH")
{
"company": { "name": "Trade Republic Bank GmbH", "register_number": "HRB 244347" },
"source_document": { "label": "List of shareholders … on 15/06/2026", "date": "2026-06-15" },
"method": "pdfplumber",
"confidence": "high",
"stammkapital_eur": 96293600.0,
"shareholders": [
{ "shareholder": "Accel Holdings-TR LLC", "type": "company", "city": "Palo Alto, USA",
"nominal_total_eur": 13008200.0, "percent": "12,7936%" },
{ "shareholder": "Creandum V, L.P.", "type": "company", "city": "St. Peter Port",
"nominal_total_eur": 12936200.0, "percent": "12,7228%" }
// … 74 shareholders total
]
}Fuzzy name resolution
get_company and get_shareholders don't need the exact registered name. Exact match → they proceed; otherwise they fall back to keyword + phonetic search, rank the candidates, and return suggestions — e.g. get_shareholders("Trade Republic") → ["Trade Republic Bank GmbH", "Trade Republic Service GmbH", …].
Shareholder extraction (layered & deterministic)
The Gesellschafterliste has no standard layout, so extraction is layered — strongest engine first:
Coordinate-aware table parsing (
pdfplumber) — rebuilds columns from the PDF's ruling lines / text positions. Handles complex and bilingual cap tables (e.g. Trade Republic's 74-shareholder German/English list) that flat text extraction garbles.Text heuristic — the standard single-language notarial template.
The method field tells you which engine produced the table.
Shareholders are not in the register extract for a GmbH/UG — they exist only in this separately filed list, which
get_shareholdersdownloads and parses.
Design: a deterministic tool
An MCP server is consumed by an LLM agent — so it would be redundant (and non-deterministic) to call another LLM inside it. This server never calls an LLM. When neither parser is confident (confidence: "low"), it doesn't guess: it returns the raw_text and the downloaded PDF path, and the calling agent — which is already an LLM — reads those and extracts the table itself. Intelligence lives in the caller; the tool just fetches data, faithfully.
OCR is the one heavyweight step, and it's deterministic too: scanned PDFs are rasterised and run through Tesseract (German) so text still comes out.
Configuration
Env var | Default | Purpose |
|
| Hourly request cap. Do not exceed the portal limit. |
| system temp dir | Where downloaded documents are written. |
|
| OCR for scanned PDFs: |
|
| Tesseract language(s), e.g. |
Use as a library
from handelsregister_mcp import HandelsregisterClient
client = HandelsregisterClient()
hits = client.search("GASAG AG", match="exact")
doc = client.fetch_document(hits[0]["row_index"], "AD")
print(doc["structured"]["management"])Project layout
src/handelsregister_mcp/
├── server.py # MCP tools (FastMCP)
├── client.py # the JSF/PrimeFaces portal client (search + documents)
├── parsers.py # register extract, XJustiz SI, shareholder-list parsing
├── ocr.py # optional Tesseract OCR fallback
└── ratelimit.py # shared 60/hour limiterKnown limitations
Scanned tables: OCR recovers text but not table structure — those parse low-confidence and return
raw_textfor the caller. Coordinate-based OCR table reconstruction (Tesseract TSV) is a possible future improvement.Pagination: fuzzy suggestions are drawn from the first results page; a very common partial query may miss a match that sits on a later page.
Portal markup drift: the document-register flow depends on the live HTML; if the portal changes, parsing may need a tweak. PRs welcome.
Contributing
Issues and pull requests are welcome — especially for parser robustness across the many notarial Gesellschafterliste templates, and for additional register document types. Please keep changes deterministic and respectful of the portal's rate limits.
Credits
The portal search flow is adapted from the excellent bundesAPI/handelsregister / deutschland project (Apache-2.0), part of the bund.dev effort to document and open up Germany's public APIs.
License
Disclaimer
Not affiliated with the Handelsregister, the German Federal States, or any official body. Use it lawfully and within the portal's terms of use. The maintainers accept no liability for how the data is obtained or used.
Available Tools
7 toolsfetch_documentA
Retrieve a register document/extract for a company and return its text.
Runs a search, picks result_index from the hits, then downloads the requested
document type from that same portal session. Document types:
AD - current extract CD - chronological extract
HD - historical extract DK - filed documents register
SI - structured XML data VÖ - announcements UT - holder data
Returns the local file path, content_type, size_bytes, and (for PDF/XML)
extracted text. Document retrieval is the most fragile part of the portal flow;
if it fails, the error explains what happened.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| document_type | No | AD | |
| match | No | exact | |
| result_index | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that document retrieval is 'the most fragile part of the portal flow' and that errors explain what happened. It also outlines the steps (search, pick index, download) and document types. This adds behavioral context beyond a simple read operation, though it could mention if auth or rate limits apply.
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 well-structured with front-loaded purpose, a clear step-by-step process, and a bulleted list of document types. It is informative without being overly verbose, earning its sentences. Minor redundancy in the first sentence (repeats 'document/extract') but overall efficient.
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?
Given no output schema, the description explains return fields (path, content_type, size_bytes, text) and addresses fragility. It covers the search-to-download flow and document types. For a tool with 4 parameters and a moderate complexity, this provides sufficient completeness, though sibling differentiation is missing.
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 0%, so the description must compensate. It adds meaning to 'keywords' (used for search), 'result_index' (picked from hits), and 'document_type' (lists options), but does not explain the 'match' parameter. The description provides context but is not fully comprehensive for all 4 parameters.
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 clearly states the tool retrieves a register document/extract for a company and returns its text. It specifies the process: runs a search, picks a result index, downloads the document type. While the purpose is specific and distinct from generic document fetching, it does not explicitly differentiate from the sibling tool 'fetch_filed_document', which overlaps in functionality.
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 implies usage context through the document types and fragility warning, but it does not explicitly state when to use this tool versus alternatives like fetch_filed_document. No exclusions or prerequisites are mentioned, leaving the agent to infer use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_filed_documentA
Download a filed document of a given category from the DK document register.
category is matched case-insensitively as a substring against the categories
from list_filed_documents (e.g. "shareholders", "articles", "annual"). Returns
the local path and extracted text; for shareholder lists it also parses the table.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | ||
| category | Yes | ||
| which | No | latest | |
| match | No | exact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It discloses download behavior, return values (local path, text), and special handling for shareholder lists (table parsing). However, it does not mention auth needs, rate limits, or side effects (though presumably read-only). Adequate but not comprehensive.
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 two short paragraphs. First sentence states core purpose, second adds behavioral details. No extraneous text. Front-loaded and efficient.
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?
Despite no output schema, the description explains return values. But with 4 parameters and low schema coverage, leaving three unexplained is a significant gap. The relationship to list_filed_documents is helpful, but overall incomplete for parameter usage.
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 0%, so description must compensate. It explains the category parameter in detail (substring matching, examples), but does not describe company, which (default 'latest'), or match (default 'exact'). Only 1 of 4 parameters gets meaningful explanation.
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 clearly states the tool downloads a filed document from the DK document register, specifying verb, resource, and context. It distinguishes from siblings like list_filed_documents (listing vs downloading) and fetch_document (different register implied).
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 provides context on category matching (case-insensitive substring) and gives examples, but does not explicitly state when to use this tool vs alternatives like fetch_document or list_filed_documents. Missing when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_companyA
Look up a company by name and return the best match — or suggestions.
Tries an exact match first, then falls back to fuzzy + phonetic search. If the
name is precise enough it returns the company; if it's ambiguous or only close,
it returns found: false plus ranked suggestions so the caller can pick one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details the search logic (exact then fuzzy/phonetic) and the two possible outcomes (direct match or suggestions with found: false). Since no annotations are provided, this transparency is valuable. However, it does not disclose potential side effects or authentication needs, but for a read-only lookup this is sufficient.
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 two sentences long, front-loaded with the core purpose, and efficiently covers the process and outcomes without extraneous 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?
Given the single parameter and lack of output schema, the description adequately explains the return behavior (company vs. suggestions). However, it could mention the structure of suggestions or the company object to be fully complete.
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?
With 0% schema coverage, the description fully compensates by explaining that the 'name' parameter is the company name and describing how it is used in the matching process. It adds context beyond the schema by mentioning fuzzy and phonetic search.
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 clearly states it looks up a company by name and returns the best match or suggestions. It specifies the verb and resource, and the fallback logic helps distinguish it from potentially broader sibling tools like search_company. However, it does not explicitly differentiate from siblings.
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?
No explicit guidance on when to use this tool versus alternatives. The description implies use when you have a specific company name, but it does not mention when to avoid it or when to use sibling tools like search_company instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filed_documentsB
List the documents filed for a company in the DK document register.
Returns the filed documents grouped by category — e.g. "List of shareholders",
"Articles of Association / Rules / Statute", "Annual accounts / balance sheet" —
each with the available dated entries. Use the category + fetch_filed_document
(or get_shareholders) to download a specific one.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | ||
| match | No | exact | |
| result_index | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description only notes grouping by category. It lacks details on error handling, pagination, or read-only nature, leaving behavioral traits largely unspecified.
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?
Two sentences efficiently convey purpose and usage of results, though adding parameter details would improve conciseness without bloat.
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?
Given 3 parameters with 0% schema description, no output schema, and no annotations, the description is insufficient. It fails to explain parameters or return structure, leaving the agent underinformed.
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 0% and the description gives no explanation for 'company', 'match', or 'result_index'. The agent receives no guidance on how to provide valid input beyond the schema structure.
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 clearly states 'List the documents filed for a company' and distinguishes from sibling fetch tools by indicating this is for listing, not downloading.
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?
Explicitly tells when to use this tool (listing) and directs to 'fetch_filed_document' or 'get_shareholders' for downloading, effectively differentiating from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rate_limit_statusA
Report the remaining handelsregister.de request budget for this hour.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It discloses a read-only status check but omits details such as whether the budget resets, is per user or API key, or how to interpret the response. Minimal but not misleading.
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?
Single sentence, front-loaded with key information, no unnecessary words. Perfectly concise.
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?
Given no output schema and no annotations, the description explains the core purpose but lacks details like budget reset period or response structure. Adequate for a simple status tool but incomplete for full agent decision-making.
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?
The input schema has zero parameters, so schema coverage is 100%. The description adds no extra parameter information, but the baseline is 4 due to no parameters needing elaboration.
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 clearly states the verb 'Report' and the resource 'remaining handelsregister.de request budget for this hour', which is specific and distinct from sibling tools that fetch documents or company info.
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 does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or best practices like checking rate limits before making other requests. The usage is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companyA
Search the German commercial register (Handelsregister) for companies.
Args:
keywords: Company name or search terms. Wildcards * and ? are supported.
match: How keywords are matched — "all" (contains every keyword, default),
"min" (contains at least one), or "exact" (exact company name).
similar: Enable the portal's phonetic ("ähnlich lautende") matching to
tolerate typos and spelling variants.
max_results: Cap on returned rows (the portal page holds up to ~100).
Returns a dict with the query echo, a result count, the remaining hourly request
budget, and results: a list of companies with name, court, register_number,
state, status, historical names, and available_documents (the document types
that can be passed to fetch_document).
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| match | No | all | |
| similar | No | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral details: wildcard support, matching algorithms, phonetic matching, page size limit (~100), and hourly request budget. There is no contradiction with annotations.
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 well-structured with a concise intro, followed by clear parameter bullet points, and a summary of the return value. Every sentence adds value with no redundancy.
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?
Despite no output schema, the description thoroughly explains the return structure (dict with query echo, count, hourly budget, and results with detailed fields). It also notes the connection to fetch_document, making it complete for a search tool.
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?
The schema has 0% coverage, so the description must compensate. It provides exhaustive meaning for all 4 parameters: examples of wildcards, match options (all/min/exact), similar flag explanation, and max_results context about page size.
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 specifies the verb 'Search' and the resource 'German commercial register (Handelsregister) for companies', providing a precise and unambiguous purpose that distinguishes it from sibling tools.
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 offers clear guidance on parameter usage (keywords, match modes, similar, max_results) and mentions cross-reference to fetch_document, but lacks explicit when-not-to-use or alternative tool recommendations for queries that might be better served by get_company.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct purpose: search_company for searching, get_company for best-match lookup, fetch_document for general extracts, fetch_filed_document for specific filed documents, list_filed_documents for categories, get_shareholders for structured shareholder data, and rate_limit_status for budget info. No two tools do the same thing.
Most tools follow a verb_noun pattern (fetch_, get_, list_, search_). The naming is all lowercase with underscores, but rate_limit_status is a noun_noun_noun exception. Overall consistent and readable.
7 tools cover the German commercial register domain well: search, company details, multiple document retrieval types, filed document listing and download, and rate limit monitoring. The count feels well-scoped without unnecessary tools.
The tool set covers all major read operations: searching for companies, retrieving current/historical extracts, filed documents (including shareholder lists with structured output). No obvious gaps like missing document types or inability to fetch by register number.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
German Handelsregister + Austrian Firmenbuch for AI agents: master data, financials & ratios.
CompanyLens is a remote MCP server giving AI agents instant access to official company registry data across 19 jurisdictions in Europe, the Americas, and Asia-Pacific. Eighteen read-only tools let you search companies and people, look up officers and beneficial owners, map corporate networks through shared directors, screen names against the UK disqualified directors register, find every company at a registered address, and pull filing history — all from a single connector. Visit our website: https://companylens.io
Agent-native API for Finnish public company data via YTJ. Pay-per-call $0.01 USDC over x402.
French & European company registry for AI agents: KYB, sanctions, annual accounts. x402, no API key.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables AI assistants to search the Swiss Central Business Name Index (Zefix) for companies by name or UID, with optional filters, and retrieve full company details including address, legal form, history, and representatives.1235MIT
- AlicenseAqualityDmaintenanceEnables AI agents to search and retrieve Norwegian company data from the Brønnøysund Register Centre's open API, including company details, roles, and subunits.519MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to search and retrieve UK Companies House data including company profiles, officers, and filing history via the official API.41011MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to search and retrieve detailed profiles of 25 million French companies from the official government registry, including directors, activity codes, and establishment data, without requiring an API key.
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/lexdoudkin/handelsregister-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server