Nordic Registry MCP Server
Consulta empresas, miembros de juntas directivas y roles comerciales en los registros oficiales de empresas de Noruega, Dinamarca, Finlandia y Suecia.
Documentación
Nordic Registry MCP Server
¿Qué es esto?
Verifica la legitimidad de empresas en Noruega, Dinamarca, Finlandia y Suecia en segundos. Consulta estado de quiebra, miembros de la junta, autoridad de firma y datos financieros de registros oficiales, sin cambiar entre cuatro sitios web gubernamentales.
23 herramientas que envuelven las APIs públicas de Brønnøysundregistrene, CVR, PRH y Bolagsverket. Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente MCP.
Lo que hace:
- Busca empresas por nombre en cuatro países nórdicos
- Obtén detalles de la empresa: estado, empleados, industria, direcciones
- Consulta miembros de la junta, directores ejecutivos, auditores y roles
- Verifica quién puede firmar legalmente en nombre de una empresa
- Accede a informes anuales suecos (årsredovisningar)
- Consultas por lotes para validar listas de ID de empresas
Lo que no hace:
- Modificar datos del registro (solo lectura)
- Almacenar o cachear datos personales más allá de la sesión
- Requerir pago (todas las APIs subyacentes son gratuitas)
Países Compatibles
| País | Registro | Herramientas | Formato de ID |
|---|---|---|---|
| Noruega | Brønnøysundregistrene | 12 | 9 dígitos (p. ej., 923609016 o 923 609 016) |
| Dinamarca | CVR | 5 | 8 dígitos (p. ej., 10150817 o DK-10150817) |
| Finlandia | PRH | 2 | 7+1 dígitos (p. ej., 0112038-9) |
| Suecia | Bolagsverket | 4 | 10 dígitos (p. ej., 5560125790 o 556012-5790) |
Todas las APIs son gratuitas. Noruega, Dinamarca y Finlandia no requieren autenticación. Suecia utiliza la API värdefulla datamängder que requiere credenciales OAuth2 (registro gratuito).
¿Qué Puedes Hacer?
Una vez conectado, solo pregunta a tu IA:
| Tú dices... | Qué sucede |
|---|---|
| "Encuentra empresas noruegas llamadas Equinor" | Busca en Brønnøysundregistrene |
| "Obtén detalles del número de organización 923609016" | Devuelve información completa de la empresa |
| "¿Quién está en la junta de 923609016?" | Lista miembros de la junta, director ejecutivo, roles |
| "Encuentra la empresa danesa Novo Nordisk" | Busca en el registro CVR |
| "Consulta la empresa finlandesa Nokia" | Busca en el registro PRH |
| "Obtén la empresa 0112038-9 de Finlandia" | Devuelve los detalles completos de Nokia |
| "Obtén la empresa sueca 5560125790" | Devuelve información de la empresa desde Bolagsverket |
| "Lista informes anuales de la empresa sueca X" | Lista los årsredovisningar disponibles |
Casos de Uso
Procesamiento de Casos: Verificar Empresas Solicitantes
Al procesar solicitudes de permisos, renovaciones de licencias o solicitudes de subvenciones, verifica que la empresa solicitante exista y esté en buen estado.
You: "A company applied for an environmental permit. Org number 923609016.
Check if they're active and who can sign on their behalf."
AI: Let me verify the company and check signing authority.
→ norway_get_company("923609016")
→ norway_get_signature_rights("923609016")
Result: Equinor ASA - Active since 1972, registered for VAT, 21,200 employees.
Authorized signatories: [Name 1] (CEO), [Name 2] + [Name 3] (joint signature).
The application signature matches an authorized signatory.
Adquisiciones: Validar Proveedores Antes de Adjudicar Contratos
Antes de adjudicar un contrato municipal, verifica que las empresas licitantes sean legítimas y no estén en quiebra.
You: "We received bids from three Danish companies for the IT contract.
CVR numbers: 10150817, 25063783, 37553472. Are they all legitimate?"
AI: I'll verify each company's status.
→ denmark_get_company("10150817")
→ denmark_get_company("25063783")
→ denmark_get_company("37553472")
Result:
- 10150817: Novo Nordisk A/S - Active, 47,000+ employees ✓
- 25063783: Mærsk A/S - Active, established company ✓
- 37553472: [Company name] - BANKRUPT ✗
Recommendation: Exclude 37553472 from consideration.
Administración de Subvenciones: Verificar Estado de Organizaciones Sin Fines de Lucro
Al procesar solicitudes de subvenciones de organizaciones voluntarias, verifica su registro en Frivillighetsregisteret.
You: "An organization applied for cultural funding.
They claim to be a registered non-profit. Org number 971274808."
AI: Let me check their voluntary organization status.
→ norway_get_company("971274808")
Result: Norges Røde Kors - Registered in Frivillighetsregisteret since 2009.
Organization form: FLI (Forening/lag/innretning).
Activity: Humanitarian aid and emergency response.
Confirmed as eligible non-profit organization.
Supervisión Regulatoria: Monitorear Cambios en la Industria
Rastrea nuevos registros de empresas o cambios de estado en sectores regulados.
You: "I need to monitor new companies in the financial sector.
What relevant registrations happened this week?"
AI: Let me check recent registry updates.
→ norway_get_updates(since="2024-01-08T00:00:00Z", size=100)
Result: 12 new registrations in financial services sector:
- 3 new AS companies (aksjeselskap)
- 2 new NUF branches of foreign financial institutions
- 7 updates to existing financial companies
[List with org numbers for follow-up]
Coordinación Transfronteriza: Rastrear Presencia Multinacional
Al coordinar con otras autoridades nórdicas, identifica la presencia de una empresa en varias jurisdicciones.
You: "We're investigating a company that may operate across Nordic countries.
Check if Volvo has registered entities in Norway and Denmark."
AI: Let me search both registries.
→ norway_search_companies("Volvo")
→ denmark_search_companies("Volvo")
Result: Found registered entities:
- Norway: Volvo Norge AS (org 923609016) - 450 employees, automotive
- Denmark: Volvo Danmark A/S (CVR 12345678) - 320 employees
Both are subsidiaries of Swedish parent company.
Calidad de Datos: Validar Envíos al Registro
Al recibir envíos de datos masivos que referencian identificadores de empresas, valídalos contra los registros oficiales.
You: "A ministry submitted a list of 50 org numbers for a new subsidy program.
Validate which ones are current and active."
AI: I'll validate them against Brønnøysundregistrene.
→ norway_batch_get_companies([list of 50 org numbers])
Result:
- 47 companies: Active and valid ✓
- 2 companies: Marked as bankrupt - may need review
- 1 org number: Not found in registry - possibly incorrect
Flagged entries exported for manual review.
Estadísticas: Demografía Empresarial por Municipio
Apoya el análisis de políticas examinando la composición empresarial en áreas específicas.
You: "How many AS companies are registered in Oslo municipality?"
AI: Let me search with municipality filter.
→ norway_search_companies(query="*", org_form="AS", municipality="0301")
Result: Found 45,231 AS companies registered in Oslo (municipality 0301).
Paginated results available for detailed analysis.
Debida Diligencia: Verificar Composición de la Junta
Antes de aprobar ayudas estatales o contratos por encima del umbral, verifica el gobierno corporativo de la empresa.
You: "Check the board composition of company 914778271.
We need this for the state aid application review."
AI: Let me retrieve their roles.
→ norway_get_company("914778271")
→ norway_get_roles("914778271")
Result: [Company name] - AS registered 2015
Board members:
- [Name 1] - Styreleder (Chair)
- [Name 2] - Styremedlem
- [Name 3] - Styremedlem
- [Name 4] - Daglig leder (CEO)
Auditor: [Audit firm name]
Recuperación de Documentos: Acceder a Informes Anuales Suecos
Al revisar empresas suecas para asuntos transfronterizos, consulta la documentación financiera disponible.
You: "A Swedish company applied for recognition in Norway.
What financial reports are available for org 5560125790?"
AI: Let me check Bolagsverket for filed documents.
→ sweden_get_company("5560125790")
→ sweden_get_document_list("5560125790")
Result: [Company name] - Active Swedish AB
Available årsredovisningar: 8 annual reports (2016-2023)
Most recent: Financial year ending 2023-06-30, filed 2023-08-15.
Inicio Rápido
Opción 1: Descargar Binario
Ve a Releases y descarga para tu plataforma.
Opción 2: Compilar desde el Código Fuente
git clone https://github.com/olgasafonova/nordic-registry-mcp-server.git
cd nordic-registry-mcp-server
go build .
Requiere Go 1.24+
Configuración
Cursor Marketplace
/add-plugin nordic-registry
Claude Code CLI
claude mcp add nordic-registry ./nordic-registry-mcp-server
Claude Desktop
Agrega a ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"nordic-registry": {
"command": "/path/to/nordic-registry-mcp-server"
}
}
}
Reinicia Claude Desktop después de los cambios.
¿No funciona? Cuéntanos qué fue difícil — incluso una frase ayuda.
Todas las Herramientas
Noruega (Brønnøysundregistrene)
| Herramienta | Descripción |
|---|---|
norway_search_companies | Busca empresas por nombre |
norway_get_company | Obtén detalles de la empresa por número de organización |
norway_get_roles | Obtén miembros de la junta, director ejecutivo, auditores |
norway_get_signature_rights | Obtén derechos de firma y prokura |
norway_batch_get_companies | Consulta múltiples empresas a la vez |
norway_get_subunits | Lista sucursales de una empresa |
norway_get_subunit | Obtén detalles específicos de una sucursal |
norway_search_subunits | Busca sucursales por nombre |
norway_get_updates | Obtén cambios recientes en el registro |
norway_get_subunit_updates | Obtén cambios recientes en sucursales |
norway_list_municipalities | Lista códigos de municipio |
norway_list_org_forms | Lista códigos de forma de organización (AS, ENK, etc.) |
Dinamarca (CVR)
| Herramienta | Descripción |
|---|---|
denmark_search_companies | Busca empresas por nombre (devuelve una sola mejor coincidencia) |
denmark_get_company | Obtén detalles de la empresa por número CVR |
denmark_get_production_units | Lista unidades de producción (números P), paginado |
denmark_search_by_phone | Encuentra empresa por número de teléfono |
denmark_get_by_pnumber | Obtén empresa por número P |
Nota: La búsqueda danesa devuelve solo un resultado. Las grandes empresas suelen tener múltiples entidades. Prueba variaciones como "[Empresa] Dinamarca", "[Empresa] A/S" o nombres previos a la fusión si el primer resultado parece incorrecto.
Finlandia (PRH)
| Herramienta | Descripción |
|---|---|
finland_search_companies | Busca empresas por nombre (paginado, usa filtros para consultas amplias) |
finland_get_company | Obtén detalles de la empresa por ID de negocio |
Nota: Nombres comunes como "Nokia" devuelven más de 900 resultados. Usa el nombre legal exacto ("Nokia Oyj"), filtra por
company_form(OY/OYJ) o filtra porlocationpara reducir los resultados.
Suecia (Bolagsverket)
Requiere credenciales OAuth2. Configura las variables de entorno BOLAGSVERKET_CLIENT_ID y BOLAGSVERKET_CLIENT_SECRET.
| Herramienta | Descripción |
|---|---|
sweden_get_company | Obtén detalles de la empresa por número de organización |
sweden_get_document_list | Lista informes anuales (årsredovisningar) |
sweden_download_document | Descarga informe anual por ID de documento |
sweden_check_status | Verifica disponibilidad de la API y estado de OAuth2 |
Nota: Suecia no tiene búsqueda por nombre en esta API: debes tener el número de organización.
Ejemplos de Prompts
Búsqueda de Empresas
- "Encuentra empresas noruegas llamadas Telenor"
- "Busca empresas AS en Oslo"
- "Encuentra empresas danesas llamadas Carlsberg"
- "Consulta la empresa finlandesa Kone"
- "Encuentra organizaciones voluntarias llamadas Røde Kors"
Detalles de Empresa
- "Obtén detalles de la organización noruega 923609016"
- "Consulta CVR 10150817"
- "Obtén la empresa finlandesa 0112038-9"
Junta y Roles (solo Noruega)
- "¿Quién está en la junta de 923609016?"
- "Encuentra al director ejecutivo de Equinor"
- "Lista todos los directores de la organización 914778271"
Derechos de Firma (solo Noruega)
- "¿Quién puede firmar por la empresa 923609016?"
- "Obtén derechos de firma para Equinor"
- "¿Quién tiene prokura para 914778271?"
Sucursales
- "¿Qué sucursales tiene 923609016?"
- "Busca sucursales llamadas Equinor"
- "Lista unidades de producción para CVR 10150817"
Actualizaciones del Registro (solo Noruega)
- "¿Qué empresas cambiaron desde ayer?"
- "Obtén actualizaciones recientes del registro"
- "¿Qué sucursales cambiaron recientemente?"
Operaciones por Lote (solo Noruega)
- "Consulta estas empresas: 923609016, 914778271, 985399077"
- "Valida estos números de organización de mi hoja de cálculo"
- "Obtén detalles de múltiples empresas noruegas a la vez"
Datos de Referencia (solo Noruega)
- "Lista todos los municipios noruegos"
- "¿Cuál es el código de municipio de Oslo?"
- "¿Qué significa AS?"
- "Lista códigos de forma de organización"
Búsqueda por Teléfono y Número P (Dinamarca)
- "Encuentra empresa con teléfono 33121212"
- "Consulta la unidad de producción con número P 1234567890"
Búsquedas en Suecia
- "Obtén la empresa sueca 5560125790"
- "Consulta el número de organización de Volvo en Suecia"
- "¿Qué informes anuales están disponibles para 5560125790?"
- "Lista årsredovisningar para la empresa sueca X"
- "¿Está funcionando la API sueca?"
Configuración de Suecia
La API de Bolagsverket en Suecia requiere autenticación OAuth2 (gratuita).
- Regístrate para la API värdefulla datamängder (envía el formulario de registro de cliente)
- Accede al Portal de Desarrolladores para obtener tus credenciales OAuth2
- Configura las variables de entorno:
export BOLAGSVERKET_CLIENT_ID="your-client-id" export BOLAGSVERKET_CLIENT_SECRET="your-client-secret"
El servidor registrará si las credenciales de Suecia están configuradas al iniciar. Si no están configuradas, las herramientas de Suecia simplemente no se registran.
Modo HTTP
Para acceso remoto o integración con otras herramientas:
# Start HTTP server
./nordic-registry-mcp-server -http :8080
# With authentication
./nordic-registry-mcp-server -http :8080 -token "your-secret-token"
# Full production setup
./nordic-registry-mcp-server -http :8080 \
-token "your-secret-token" \
-origins "https://app.example.com" \
-rate-limit 60 \
-trusted-proxies "10.0.0.0/8"
Características de Seguridad
- Autenticación Bearer Token: Autenticación opcional mediante el flag
-tokeno la variable de entornoMCP_AUTH_TOKEN. La vinculación a una dirección que no sea de loopback sin token se rechaza al iniciar; las vinculaciones de loopback (127.0.0.1,localhost) siguen funcionando sin token para desarrollo local. - Protección CORS: Restringe orígenes mediante el flag
-origins(separados por comas) - Limitación de Tasa: Limitación por IP mediante
-rate-limit(solicitudes por minuto) - Proxies de Confianza: Respeta
X-Forwarded-Forde redes confiables mediante-trusted-proxies - Límites de Tamaño de Solicitud: 2MB por defecto, 10MB máximo para el cuerpo de la solicitud
Endpoints
Cada endpoint excepto las sondas /health y /ready comparte la misma ruta de autenticación: cuando se establece un token, /, /metrics, /status y /tools lo requieren. Las sondas permanecen sin autenticación para que los orquestadores puedan acceder a ellas.
| Endpoint | Descripción | Autenticación |
|---|---|---|
/ | Protocolo MCP (HTTP Streamable) | Requerida cuando hay token |
/health | Verificación de actividad | Pública |
/ready | Verificación de preparación (verifica conectividad de API) | Pública |
/tools | Lista todas las herramientas por país | Requerida cuando hay token |
/status | Estadísticas del interruptor de circuito | Requerida cuando hay token |
/metrics | Métricas Prometheus | Requerida cuando hay token |
Arquitectura
nordic-registry-mcp-server/
├── main.go # Entry point, HTTP/stdio transport, security middleware
├── internal/
│ ├── base/ # Shared HTTP client with resilience
│ │ └── client.go # Connection pooling, retries, rate limiting
│ ├── errors/ # Shared error types
│ │ └── errors.go # NotFoundError, ValidationError
│ ├── infra/ # Resilience infrastructure
│ │ ├── cache.go # LRU cache with TTL
│ │ └── resilience.go # Circuit breaker, request deduplication
│ ├── norway/ # Norwegian registry (Brønnøysundregistrene)
│ ├── denmark/ # Danish registry (CVR)
│ ├── finland/ # Finnish registry (PRH)
│ └── sweden/ # Swedish registry (Bolagsverket, OAuth2)
├── tools/
│ ├── definitions.go # Tool specifications (23 tools)
│ ├── handlers.go # MCP tool registration
│ └── registry.go # Tool metadata types
├── metrics/ # Prometheus metrics (namespace: nordic_registry_mcp)
└── tracing/ # OpenTelemetry tracing
Características de Resiliencia
- Caché LRU: TTL varía según el tipo de endpoint (búsquedas: 2 min, detalles: 5-15 min, documentos: 30 min, datos de referencia: 24 h)
- Interruptor de Circuito: Se abre después de 5 fallos consecutivos, tiempo de recuperación de 30 s
- Desduplicación de Solicitudes: Solicitudes concurrentes idénticas comparten una sola llamada a la API
- Limitación de Tasa: Control de concurrencia basado en semáforos (15 solicitudes concurrentes)
- Reintento con Retroceso: Retroceso exponencial con jitter en fallos transitorios
- Límites de Tamaño de Respuesta: 10MB para respuestas de API, 100MB para descargas de documentos
- Eficiencia de Tokens: Respuestas paginadas (20 resultados por defecto) para minimizar el uso de contexto del LLM
Documentación
| Documento | Descripción |
|---|---|
| Guía de Configuración | Instalación, configuración y solución de problemas |
| Referencia de API | Referencia completa de las 23 herramientas con parámetros, valores de retorno y ejemplos |
| Arquitectura | Diseño del sistema, flujo de solicitudes, patrones de resiliencia |
| Preparación para Producción | Contenedores Linux, Docker, Kubernetes, monitoreo |
Desarrollo
# Build
go build .
# Test
go test ./...
# Lint (requires golangci-lint)
golangci-lint run
Visión Futura: Integración con Public 360°
Este servidor está diseñado para funcionar junto con public360-mcp-server, que proporciona acceso de IA a los sistemas de gestión de documentos y casos de Public 360° utilizados por organizaciones del sector público nórdico. El escenario de integración:
Un gestor de casos recibe una solicitud de permiso de una empresa. El flujo de trabajo actual:
- Abrir el caso en Public 360°
- Buscar manualmente la empresa en Brønnøysundregistrene
- Verificar que la empresa esté activa y no en quiebra
- Comprobar si el firmante tiene autoridad
- Copiar los detalles relevantes de vuelta al caso
Con ambos servidores MCP conectados:
You: "I received permit application case 2024/12345.
The applicant is org 923609016. Verify the company
and check if the signature is valid."
AI: [Calls public360: sif_get_cases to get case details]
[Calls nordic-registry: norway_get_company to verify company]
[Calls nordic-registry: norway_get_signature_rights to check authority]
Result: Case 2024/12345 - Environmental permit application
Applicant: Equinor ASA (923609016) - ACTIVE
Signed by: [Name] - Authorized signatory ✓
Recommendation: Signature is valid. Company is in good standing.
Puntos de integración planificados:
| Nordic Registry | Public 360° | Caso de uso |
|---|---|---|
norway_get_company | sif_get_enterprises | Sincronizar datos de la empresa con contactos |
norway_get_roles | sif_get_contacts | Importar miembros de la junta como contactos |
*_search_companies | sif_create_case | Autocompletar el caso con información verificada de la empresa |
sweden_download_document | sif_upload_file | Adjuntar informes anuales a los casos |
Esto convierte dos fuentes de datos separadas en un flujo de trabajo conectado donde la IA puede verificar datos externos y actualizar sistemas internos en una sola conversación.
Datos de Registro Mejorados (Futuro)
La implementación actual utiliza API abiertas y gratuitas. Se dispone de datos más completos a través de servicios premium:
Suecia (Bolagsverket)
| Actual (Gratis) | Potencial Premium |
|---|---|
| Información básica de la empresa | Miembros de la junta y roles |
| Informes anuales (årsredovisningar) | Firmantes autorizados (firmatecknare) |
| Estado de la empresa | Hipotecas de empresa (företagsinteckningar) |
| Actualizaciones en tiempo real (no por lotes diarios) | |
| Cambios históricos en la junta |
La API de conjuntos de datos valiosos gratuita que usamos hoy proporciona información básica de la empresa e informes anuales. Bolagsverket ofrece servicios electrónicos adicionales para firmantes autorizados e hipotecas de empresa. Agregadores de terceros como Roaring.io proporcionan conjuntos de datos enriquecidos que combinan múltiples fuentes.
Finlandia (PRH)
| Actual (Gratis) | Servicio Virre |
|---|---|
| Detalles básicos de la empresa | Miembros de la junta y directores gerentes |
| Estados financieros digitales (IXBRL) | Firmantes autorizados |
| Notificaciones de registro | Titulares de procuración |
| Estados financieros no digitales | |
| Extractos traducidos del Registro Mercantil | |
| Estatutos sociales |
La PRH Open Data API gratuita proporciona información básica de la empresa actualizada diariamente. El Virre Information Service ofrece detalles de miembros de la junta, información de firmantes y compra de documentos. Los clientes con contrato obtienen tarifas reducidas para acceso de alto volumen.
Por qué esto es importante:
Noruega ya proporciona miembros de la junta, roles y autoridad de firma a través de la API gratuita de Brønnøysundregistrene. Añadir datos premium de Suecia y Finlandia daría una cobertura consistente en los cuatro países para:
- Verificar quién puede firmar contratos
- Comprobar la composición de la junta para la debida diligencia
- Acceder a documentación financiera completa
Más Servidores MCP
Echa un vistazo a mis otros servidores MCP:
| Servidor | Descripción | Estrellas |
|---|---|---|
| gleif-mcp-server | Accede a la base de datos GLEIF LEI. Consulta identidades de empresas, verifica entidades legales. | |
| mediawiki-mcp-server | Conecta IA a cualquier wiki de MediaWiki. Busca, lee, edita contenido de wiki. | |
| miro-mcp-server | Controla pizarras Miro con IA. Pizarras, diagramas, mapas mentales y más. | |
| productplan-mcp-server | Habla con tus hojas de ruta de ProductPlan. Consulta OKRs, ideas, lanzamientos. | |
| tilbudstrolden-mcp | Búsqueda de ofertas de comestibles nórdicos. Encuentra ofertas, planifica comidas, controla gastos. |
Licencia
Apache License 2.0
Créditos
- Construido con Go MCP SDK
- Datos de Brønnøysundregistrene, CVR, PRH, Bolagsverket