brreg-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., "@brreg-mcpSearch for companies named 'Osloveien' in Oslo"
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.
brreg-mcp
MCP server for the Norwegian Central Coordinating Register for Legal Entities (Brønnøysundregistrene / Enhetsregisteret). Gives Claude Code and other MCP-compatible clients direct access to Norwegian company data — lookup, search, roles, subunits, and live updates.
No API key needed. Data is served by the free, public Brønnøysund Open Data API.
Why
Norwegian devs, accountants, and analysts constantly need to look up orgnumbers, find board members, or track subsidiary changes. Doing it through the web UI is slow; doing it with curl loses context. With this MCP, you just ask Claude.
Related MCP server: CompanyIQ MCP Server
Install
Claude Code
Add to your MCP config (~/.claude/settings.json or per-project .claude/settings.json):
{
"mcpServers": {
"brreg": {
"command": "npx",
"args": ["-y", "brreg-mcp"]
}
}
}Restart Claude Code. Verify with /mcp — you should see brreg listed with 5 tools.
Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"brreg": {
"command": "npx",
"args": ["-y", "brreg-mcp"]
}
}
}Cursor / Windsurf / Zed / any MCP client
Same command: npx, args: ["-y", "brreg-mcp"] configuration.
Local development
git clone https://github.com/hellosverre/brreg-mcp
cd brreg-mcp
npm install
npm run buildThen point your MCP client at node /absolute/path/to/brreg-mcp/dist/index.js.
Tools
Tool | What it does |
| Full details for one company by its 9-digit orgnr — name, address, NACE codes, employees, VAT status, bankruptcy, foundation date. |
| Search by name and optional filters (municipality, org form, industry code, VAT-registered, bankruptcy status). Paginated. |
| All registered roles (board, CEO, chair, auditor, sole proprietor) for a company. |
| Find subunits (branch offices, production sites) — scope to a parent company or by municipality/industry. |
| Feed of entity changes for monitoring new registrations, bankruptcies, status shifts. |
Example prompts
"Look up orgnr 984661177 and show me the board."
"Find all VAT-registered software consultancies (NACE 62.010) in Oslo."
"List every subunit of Vygruppen AS."
"What Norwegian companies were just registered in the last hour?"
Data source
All data comes from data.brreg.no. Per Brønnøysund's open data terms, the data is free to use. Some endpoints (roles with personal identification numbers) require Maskinporten authentication and are not exposed by this server.
Development
npm install # install deps
npm run dev # run server in watch mode via tsx
npm run smoke # hit the real brreg API to verify connectivity
npm run build # compile to dist/
npx tsx scripts/mcp-probe.ts # end-to-end stdio testLicense
MIT
Disclaimer
Not affiliated with Brønnøysundregistrene or the Norwegian government. This is an independent open-source project using the public open-data API.
Available Tools
5 toolsget_company_rolesGet roles (board, directors, auditor) of a companyA
Retrieves all registered roles — board members (styre), CEO (daglig leder), chair (styreleder), auditor (revisor), sole proprietor (innehaver), etc. — for a Norwegian company. Returns structured role groups with person or entity role-holders. Does NOT include personal identification numbers (that requires Maskinporten auth).
| Name | Required | Description | Default |
|---|---|---|---|
| orgnr | Yes | 9-digit Norwegian organization number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses a key exclusion (no personal identification numbers, which require Maskinporten auth) and describes the return format ('structured role groups with person or entity role-holders'). This goes beyond a simple retrieval statement, though it doesn't cover error handling or pagination.
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, front-loaded with the action and scope, and uses examples efficiently. No unnecessary jargon or repetition; every sentence contributes useful information.
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 tool's simplicity (one parameter, no output schema, no annotations), the description covers the main functional purpose, a significant exclusion, and the nature of the return value. It could mention error conditions or broader authentication requirements, but it is largely complete for a straightforward retrieval 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 fully documents the only parameter (orgnr as a 9-digit Norwegian organization number) with 100% coverage. The description adds minimal extra meaning beyond noting the Norwegian context, which is already implied by the schema. Baseline for high schema coverage is 3.
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 ('Retrieves') and identifies the exact resource ('all registered roles... for a Norwegian company'). It lists example roles, which clearly distinguishes it from sibling tools like lookup_company or search_companies that focus on other aspects of company data.
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 when a company's roles are needed and clarifies that personal identification numbers require separate auth, but it does not explicitly contrast with sibling tools or state when to prefer this tool over alternatives. There is no explicit 'when-to-use' or '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_recent_updatesGet recently updated companiesA
Fetches a feed of entities (companies) that were recently updated in the Norwegian business registry. Useful for monitoring changes to specific companies or watching for new registrations / status changes. Each update references the changed entity by orgnr along with the change type and timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| dato | No | ISO-8601 timestamp — return updates from this point onward (e.g. '2026-04-20T00:00:00Z') | |
| size | No | ||
| oppdateringsid | No | Continue from a specific update id (pagination cursor) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It communicates that the tool returns a feed and describes each update's content (orgnr, change type, timestamp), but it does not disclose ordering, pagination behavior, or any potential limitations. This is adequate but not rich.
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, front-loaded with the main action and resource, and each sentence provides meaningful context (use cases and output shape). No wasted words.
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 feed tool with three optional parameters and no output schema, the description covers the purpose, use cases, and the core return elements. It could mention pagination or result ordering, but the essentials are present and proportionate to the tool's complexity.
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 67% with descriptions for 'dato' and 'oppdateringsid', and 'size' is self-explanatory. The description adds no parameter-specific detail beyond what the schema provides, so it neither strongly compensates nor falls short.
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 action ('Fetches a feed') and the resource ('entities (companies) that were recently updated in the Norwegian business registry'). It also distinguishes itself from sibling tools like lookup_company and search_companies by emphasizing the update-feed nature and the inclusion of change type and timestamp.
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 explicit use cases: 'monitoring changes to specific companies' and 'watching for new registrations / status changes.' It does not explicitly mention alternatives or when not to use, but the context is clear enough for an agent to select this tool for update feeds versus lookup/search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_companyLook up Norwegian company by organization numberA
Retrieves full details of a Norwegian business entity from the Brønnøysund Register Centre (Enhetsregisteret) by its 9-digit organization number. Returns name, address, industry (NACE) codes, organization form, employee count, VAT registration status, bankruptcy status, foundation date, and more. Use this when the user provides or asks about a specific Norwegian orgnr.
| Name | Required | Description | Default |
|---|---|---|---|
| orgnr | Yes | 9-digit Norwegian organization number (organisasjonsnummer), e.g. '923609016' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the operation as a read ('Retrieves') and lists specific return fields (name, address, NACE codes, etc.), which is useful context. It does not mention error handling for invalid org numbers, but the scope is clear.
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: the first clearly states the function and output, the second provides usage guidance. No redundant wording, well-structured and front-loaded.
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?
With a single parameter and no output schema, the description provides a comprehensive list of return fields, the data source, and when to use it. It lacks explicit handling of invalid or missing org numbers or rate limits, but these are minor for a simple lookup 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?
Schema coverage is 100%, with the schema already describing 'orgnr' as a 9-digit Norwegian organization number with an example. The description adds no new parameter information beyond repeating the 9-digit format. Baseline 3 is appropriate.
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 full details of a Norwegian business entity by its 9-digit organization number. The verb 'Retrieves' and specific resource (Brønnøysund Register Centre) distinguish it from sibling tools like search_companies (search) and get_company_roles (roles).
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 says 'Use this when the user provides or asks about a specific Norwegian orgnr.' This gives clear context for when to invoke the tool. It doesn't explicitly mention alternatives, but the sibling tool names imply search for vague queries, and the condition is precise.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesSearch Norwegian companiesA
Searches the Norwegian business registry (Enhetsregisteret) by name and optional filters. Returns a paginated list of matching entities. Use this when the user wants to find a company by name, or filter by municipality, industry code, organization form, or registration status.
| Name | Required | Description | Default |
|---|---|---|---|
| navn | No | Company name or substring (case-insensitive) | |
| page | No | Page number (0-indexed, default 0) | |
| size | No | Results per page (1-100, default 20) | |
| konkurs | No | Filter by bankruptcy status (true = only bankrupt, false = only non-bankrupt) | |
| postnummer | No | 4-digit postal code filter | |
| naeringskode | No | NACE industry code filter (e.g. '62.010' for computer programming) | |
| kommunenummer | No | 4-digit municipality number (kommunenummer) to filter by location | |
| organisasjonsform | No | Filter by organization form code, e.g. 'AS' (aksjeselskap), 'ENK' (enkeltpersonforetak), 'ASA', 'DA', 'NUF' | |
| registrertIMvaregisteret | No | Filter to only VAT-registered companies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It discloses that results are paginated and that filters include municipality, industry code, organization form, and registration status. However, it does not explicitly state that the operation is read-only, nor does it mention error cases, result ordering, or rate limits. This is adequate but minimal.
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 consists of two sentences that are compact and front-loaded. The first sentence states the core function, and the second provides usage guidance. There is no wasted wording.
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 tool with 9 parameters and no output schema, the description gives sufficient context for selection and invocation. It covers what the tool does and when to use it, but it does not elaborate on the return structure beyond 'paginated list'. The rich schema compensates for most gaps.
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 the baseline is 3. The description summarizes the filters at a high level but does not add syntax or format details beyond the schema. It meets the minimum viable bar.
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's function with a specific verb ('Searches'), a resource ('Norwegian business registry'), and scope ('by name and optional filters'). It distinguishes itself from siblings by emphasizing search over lookup and mentioning paginated results.
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 explicitly provides usage context with 'Use this when the user wants to find a company by name, or filter by...' It does not explicitly name alternative tools or exclusions, but the guidance is clear enough for an agent to select this tool for search scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_subunitsSearch subunits (branch offices) of Norwegian companiesA
Searches subunits (underenheter — branch offices, departments, production sites) in the Norwegian business registry. Typically used to find all branches of a parent company, or to locate subunits in a specific municipality. A subunit shares the parent's organization but has its own orgnr for reporting purposes.
| Name | Required | Description | Default |
|---|---|---|---|
| navn | No | Subunit name or substring | |
| page | No | ||
| size | No | ||
| naeringskode | No | NACE industry code | |
| kommunenummer | No | 4-digit municipality number | |
| overordnetEnhet | No | 9-digit orgnr of the parent entity to list all its subunits |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains the entity concept ('A subunit shares the parent's organization but has its own orgnr for reporting purposes') and scopes the search to the registry, but does not disclose pagination, return format, authentication, or any side effects. This is adequate for a read-only search tool but not rich.
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 three sentences, each purposeful: the first defines the action, the second gives example use cases, and the third clarifies a domain-specific relationship. No redundant filler, front-loaded with the primary purpose.
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 search tool with 6 optional parameters, no output schema, and no annotations, the description provides a solid purpose and use cases but lacks details on result shape, pagination, and any prerequisites. It is sufficient for basic invocation but incomplete for a fully informed agent.
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 67% (4 of 6 parameters described). The description indirectly references filtering by municipality and parent company, aligning with 'kommunenummer' and 'overordnetEnhet', but does not add syntax or format details for these or the pagination parameters. The added domain context slightly improves understanding beyond the schema.
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 ('Searches') and identifies the resource ('subunits (underenheter — branch offices, departments, production sites)') in the Norwegian business registry. It clearly distinguishes from sibling tools like search_companies by focusing on subunits and their parent relationship.
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 gives clear typical usage contexts: 'find all branches of a parent company' or 'locate subunits in a specific municipality'. It does not explicitly mention when not to use the tool or name alternative tools, but the use cases strongly imply differentiation from general company search.
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.
5 tool updates
v0.1.1- First observed
get_company_roles - First observed
get_recent_updates - First observed
lookup_company - First observed
search_companies - First observed
search_subunits
TDQS
Each tool has a clearly distinct purpose: lookup by ID, search by name/filters, retrieve roles, search subunits, and get recent updates. The descriptions explicitly differentiate between main entities (enheter) and subunits (underenheter), eliminating any overlap confusion.
All tool names follow a consistent verb_noun pattern (lookup_company, search_companies, get_company_roles, search_subunits, get_recent_updates) using snake_case. Verb choices are appropriate and parallel, with minor pluralization differences but no stylistic inconsistency.
With 5 tools, the set is well-scoped for a read-only business registry API. Each tool covers a distinct need (lookup, search, roles, subunits, updates) without superfluous additions, fitting comfortably in the ideal 3-15 range.
The tool surface comprehensively covers the core operations for the Norwegian business register: retrieving a specific entity, searching for entities, accessing roles, exploring subunits, and monitoring updates. Given the read-only nature of the registry, there are no obvious gaps in lifecycle coverage.
Maintenance
Related MCP Connectors
Official company and director data: search, profiles, filings, and name normalization.
Norwegian company intelligence: ownership, roles, financials, risk, KYC/AML/PEP (multi-source)
Compliance infrastructure API connecting AI agents to Norwegian government systems (Altinn, BRREG).
Nordic company intelligence: look up companies, AI summaries, scores and signals via MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables comprehensive access to the Norwegian Business Registry API for querying company information, board members, subsidiaries, organizational data, and voluntary organizations. Provides real-time access to over 1 million registered Norwegian entities with detailed corporate structure and governance data.15198MIT
- FlicenseNot gradedqualityNot gradedmaintenanceProvides comprehensive Norwegian business intelligence through Brønnøysund and Statistics Norway APIs, enabling company search, financial analysis, ownership mapping, market research, and automated financial data extraction.-
- AlicenseBqualityCmaintenanceEnables interaction with the Norwegian Business Registry (Brønnøysundregistrene) API to search and retrieve detailed information about Norwegian companies, subunits, roles, organization forms, municipalities, and NACE industry codes.18191MIT
- AlicenseNot gradedqualityDmaintenanceProvides access to Norway's official business registry for searching companies, looking up organizational details, and identifying company roles and sub-units. It utilizes data from Brønnøysundregistrene to enable detailed queries by industry, municipality, or organization number.15MIT
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/hellosverre/brreg-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server