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

CI lint License CodeScene Average Code Health

¿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ísRegistroHerramientasFormato de ID
NoruegaBrønnøysundregistrene129 dígitos (p. ej., 923609016 o 923 609 016)
DinamarcaCVR58 dígitos (p. ej., 10150817 o DK-10150817)
FinlandiaPRH27+1 dígitos (p. ej., 0112038-9)
SueciaBolagsverket410 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)

HerramientaDescripción
norway_search_companiesBusca empresas por nombre
norway_get_companyObtén detalles de la empresa por número de organización
norway_get_rolesObtén miembros de la junta, director ejecutivo, auditores
norway_get_signature_rightsObtén derechos de firma y prokura
norway_batch_get_companiesConsulta múltiples empresas a la vez
norway_get_subunitsLista sucursales de una empresa
norway_get_subunitObtén detalles específicos de una sucursal
norway_search_subunitsBusca sucursales por nombre
norway_get_updatesObtén cambios recientes en el registro
norway_get_subunit_updatesObtén cambios recientes en sucursales
norway_list_municipalitiesLista códigos de municipio
norway_list_org_formsLista códigos de forma de organización (AS, ENK, etc.)

Dinamarca (CVR)

HerramientaDescripción
denmark_search_companiesBusca empresas por nombre (devuelve una sola mejor coincidencia)
denmark_get_companyObtén detalles de la empresa por número CVR
denmark_get_production_unitsLista unidades de producción (números P), paginado
denmark_search_by_phoneEncuentra empresa por número de teléfono
denmark_get_by_pnumberObté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)

HerramientaDescripción
finland_search_companiesBusca empresas por nombre (paginado, usa filtros para consultas amplias)
finland_get_companyObté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 por location para reducir los resultados.

Suecia (Bolagsverket)

Requiere credenciales OAuth2. Configura las variables de entorno BOLAGSVERKET_CLIENT_ID y BOLAGSVERKET_CLIENT_SECRET.

HerramientaDescripción
sweden_get_companyObtén detalles de la empresa por número de organización
sweden_get_document_listLista informes anuales (årsredovisningar)
sweden_download_documentDescarga informe anual por ID de documento
sweden_check_statusVerifica 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).

  1. Regístrate para la API värdefulla datamängder (envía el formulario de registro de cliente)
  2. Accede al Portal de Desarrolladores para obtener tus credenciales OAuth2
  3. 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 -token o la variable de entorno MCP_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-For de 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.

EndpointDescripciónAutenticación
/Protocolo MCP (HTTP Streamable)Requerida cuando hay token
/healthVerificación de actividadPública
/readyVerificación de preparación (verifica conectividad de API)Pública
/toolsLista todas las herramientas por paísRequerida cuando hay token
/statusEstadísticas del interruptor de circuitoRequerida cuando hay token
/metricsMétricas PrometheusRequerida 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

DocumentoDescripción
Guía de ConfiguraciónInstalación, configuración y solución de problemas
Referencia de APIReferencia completa de las 23 herramientas con parámetros, valores de retorno y ejemplos
ArquitecturaDiseño del sistema, flujo de solicitudes, patrones de resiliencia
Preparación para ProducciónContenedores 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:

  1. Abrir el caso en Public 360°
  2. Buscar manualmente la empresa en Brønnøysundregistrene
  3. Verificar que la empresa esté activa y no en quiebra
  4. Comprobar si el firmante tiene autoridad
  5. 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 RegistryPublic 360°Caso de uso
norway_get_companysif_get_enterprisesSincronizar datos de la empresa con contactos
norway_get_rolessif_get_contactsImportar miembros de la junta como contactos
*_search_companiessif_create_caseAutocompletar el caso con información verificada de la empresa
sweden_download_documentsif_upload_fileAdjuntar 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 empresaMiembros de la junta y roles
Informes anuales (årsredovisningar)Firmantes autorizados (firmatecknare)
Estado de la empresaHipotecas 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 empresaMiembros de la junta y directores gerentes
Estados financieros digitales (IXBRL)Firmantes autorizados
Notificaciones de registroTitulares 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:

ServidorDescripciónEstrellas
gleif-mcp-serverAccede a la base de datos GLEIF LEI. Consulta identidades de empresas, verifica entidades legales.GitHub stars
mediawiki-mcp-serverConecta IA a cualquier wiki de MediaWiki. Busca, lee, edita contenido de wiki.GitHub stars
miro-mcp-serverControla pizarras Miro con IA. Pizarras, diagramas, mapas mentales y más.GitHub stars
productplan-mcp-serverHabla con tus hojas de ruta de ProductPlan. Consulta OKRs, ideas, lanzamientos.GitHub stars
tilbudstrolden-mcpBúsqueda de ofertas de comestibles nórdicos. Encuentra ofertas, planifica comidas, controla gastos.GitHub stars

Licencia

Apache License 2.0

Créditos