Skip to main content
Glama

BORME MCP Server

MCP server for Spain's official company registry (BORME — Boletín Oficial del Registro Mercantil): 9.5M+ typed company events since 2009, updated every business day. Incorporations, director appointments, insolvencies, capital changes — 52 event kinds as English enums.

Hosted endpoint (no setup)

{
  "mcpServers": {
    "borme": {
      "url": "https://mcp.bormeapi.com/mcp"
    }
  }
}

Free, read-only, capped at 200 rows per query. Backed by the full 17-year corpus.

Related MCP server: handelsregister-mcp

Tools

Tool

What it does

search_events

Filter events by date range, province, act type, company name

company_history

Full timeline of one company (fuzzy name match)

daily_digest

One day's registry activity, aggregated

registry_stats

Corpus coverage and volume stats

list_act_types

The 52-enum vocabulary with Spanish originals

company_by_nif

Resolve a NIF/CIF tax ID to a company (cross-referenced from open official sources, ~560k companies — 17% of the corpus)

recent_signals

Sample of derived risk signals: insolvencies, phoenix companies, mass officer exits, AEAT debtors (last 7 days)

Example prompts

  • "Which companies declared insolvency in Valencia last week?"

  • "Show the corporate history of Telefónica Audiovisual Digital"

  • "How many new companies were incorporated in Madrid in June?"

Self-hosting

server.py is the complete server (FastMCP + psycopg). It expects a Postgres with the BORME schema and a read-only role:

BORME_DSN=postgresql://user:pass@host/borme \
BORME_MCP_TRANSPORT=streamable-http \
python server.py

Building the dataset yourself: see our engineering notes — You don't need to scrape BORME.

License

MIT (server code). The underlying data originates from boe.es open data (public sector information, Ley 37/2007).

Available Tools

3 tools
company_by_nifA

Look up a Spanish company by its NIF/CIF tax ID.

BORME itself prints no tax IDs — this mapping is cross-referenced from
open official sources (GLEIF, BDNS subsidies register, AEAT) and covers
a growing subset (~232k companies). A miss means "not matched yet",
not "does not exist". On a hit, follow up with company_history using
the returned slug.
ParametersJSON Schema
NameRequiredDescriptionDefault
nifYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must convey behavior. It adequately explains that the tool relies on cross-referenced open sources and covers only a subset (~232k companies). It does not mention authentication or rate limits but is transparent about lookups being non-destructive and the meaning of missing results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a clear first sentence stating purpose, followed by context and recommendations. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description adequately covers the tool's functionality, limitations, and suggested follow-up. It provides sufficient context for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% description coverage for the single parameter 'nif'. The description adds meaning by explaining it's a tax ID and tying it to the tool's purpose, but does not specify format or validation rules. Partial compensation for lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Look up a Spanish company by its NIF/CIF tax ID.' It provides specific context about the data source (BORME cross-referencing) and distinguishes itself from siblings like recent_signals and list_act_types by being a lookup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance on when to use and limitations: 'A miss means not matched yet, not does not exist.' It also recommends follow-up with company_history using the returned slug on a hit, providing a clear workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_act_typesA

All normalized event types (English enum + original Spanish label).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly details the output format (English enum + original Spanish label). As a read-only operation with no parameters, no hidden behavioral traits are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise sentence containing all essential information. No superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an output schema present, the description is sufficiently complete. It covers the single action the tool performs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and schema description coverage is trivially 100%. The baseline for 0 parameters is 4; the description does not need to add parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns all normalized event types with both the English enum and original Spanish label. This is specific and distinguishes it from sibling tools like search_events which filter data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a list of event types is needed, but it does not specify when to avoid using it or how it compares to siblings. No alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recent_signalsA

Sample of the latest derived risk signals (last 7 publication days, max 10 rows). Types: INSOLVENCY_FILED, ACCORDION, MASS_EXIT, OWNERSHIP_CHANGE, DISTRESS_COMBO, PHOENIX, ADDRESS_CLUSTER, AEAT_DEBTOR.

This is a teaser feed — the full historical signals firehose lives in the
hosted API's risk tier (https://bormeapi.com/#pricing).
ParametersJSON Schema
NameRequiredDescriptionDefault
signal_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses the tool's read-only nature (sample), the temporal and size limits, and the list of signal types. It also mentions the pricing/availability context via the hosted API link, which helps the agent understand its scope and limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences and a list of types. The first sentence immediately states the purpose and constraints, and the second sentence provides essential context for broader usage. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simple nature (one optional param, output schema exists), the description covers all necessary aspects: what it does, its limitations, the available signal types, and how to access more data. The presence of an output schema means return values need not be described, so this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only one optional parameter (signal_type) with no description or enum, but the description lists all valid values (INSOLVENCY_FILED, ACCORDION, etc.) and implies filtering capability. This adds significant meaning beyond the schema, compensating for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns a 'sample of the latest derived risk signals' with specific temporal (last 7 publication days) and size (max 10 rows) constraints, and lists the possible signal types. This provides a specific verb+resource with scope, distinguishing it from sibling tools like company_by_nif and list_act_types which have different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly notes this is a 'teaser feed' and directs users to the full historical signals firehose via the hosted API, providing clear context for when to use this limited sample versus the full dataset. It does not explicitly mention when not to use it, but the limitations are clear, making it a strong usage guide.

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.

  1. 6 tool updatesv1.1.0
    • Addedcompany_by_nif
    • Removedcompany_history
    • Removeddaily_digest
    • Addedrecent_signals
    • Removedregistry_stats
    • Removedsearch_events
  2. 5 tool updatesv0.1.0
    • First observedcompany_history
    • First observeddaily_digest
    • First observedlist_act_types
    • First observedregistry_stats
    • First observedsearch_events

TDQS

A4/5.0
Disambiguation5/5

Each tool serves a unique, non-overlapping purpose: company lookup by tax ID, recent risk signals, and listing event types. No ambiguity between them.

Naming Consistency4/5

All names use snake_case and are descriptive, but the pattern varies (noun_by_abbreviation, adjective_noun, verb_noun_noun). Still coherent and readable.

Tool Count2/5

Only 3 tools for a substantial domain like Spanish company registry (BORME). Missing core operations like company history, which is referenced but not exposed as a tool.

Completeness2/5

Domain coverage is minimal: company lookup (with incomplete NIF mapping), a teaser of recent signals, and event types. Critical workflows like full history, search, or filings are absent.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to search and retrieve structured data from the German Commercial Register, including company details, filed documents, and shareholder lists.
    7
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Search Spanish companies, directors and corporate relationships from official BORME registry filings — ~3.2M companies since 2009. Read-only, anonymous.
    MIT

Latest Blog Posts

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/george-kozlitin/borme-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server