BORME MCP Server
The BORME MCP Server provides access to Spain's official commercial registry (BORME), covering 9.5M+ company events since 2009, updated every business day. Here's what you can do:
Search registry events: Filter across all BORME events by date range, province, act type (e.g. incorporations, dissolutions, insolvencies), and company name — up to 200 results.
Get a company's full history: Retrieve the complete chronological timeline of registry events for a specific company using its name or slug.
Look up a company by tax ID: Resolve a Spanish NIF/CIF to a company record, cross-referenced from GLEIF, BDNS, and AEAT (~232k companies covered).
Get a daily digest: View a summary of any publication day's registry activity, including event totals by type, top provinces, and insolvency declarations.
Monitor risk signals: Access derived risk indicators from the last 7 days — insolvencies, phoenix companies, mass officer exits, accordion operations, and AEAT debtors.
List all event types: Browse the full vocabulary of 52 normalized event type enums with their original Spanish labels.
Check dataset coverage: Get statistics on total events, total companies, date range covered, and data freshness/completeness.
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., "@BORME MCP ServerShow me new companies incorporated in Barcelona last month."
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.
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 |
| Filter events by date range, province, act type, company name |
| Full timeline of one company (fuzzy name match) |
| One day's registry activity, aggregated |
| Corpus coverage and volume stats |
| The 52-enum vocabulary with Spanish originals |
| Resolve a NIF/CIF tax ID to a company (cross-referenced from open official sources, ~560k companies — 17% of the corpus) |
| 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.pyBuilding the dataset yourself: see our engineering notes — You don't need to scrape BORME.
Related
REST API with webhooks & watchlists: bormeapi.com
Apify actor (pay-per-event feed): Spain Company Registry — BORME Events
License
MIT (server code). The underlying data originates from boe.es open data (public sector information, Ley 37/2007).
Available Tools
3 toolscompany_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.
| Name | Required | Description | Default |
|---|---|---|---|
| nif | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| signal_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 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.
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.
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.
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.
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.
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.
6 tool updates
v1.1.0- Added
company_by_nif - Removed
company_history - Removed
daily_digest - Added
recent_signals - Removed
registry_stats - Removed
search_events
5 tool updates
v0.1.0- First observed
company_history - First observed
daily_digest - First observed
list_act_types - First observed
registry_stats - First observed
search_events
TDQS
Each tool serves a unique, non-overlapping purpose: company lookup by tax ID, recent risk signals, and listing event types. No ambiguity between them.
All names use snake_case and are descriptive, but the pattern varies (noun_by_abbreviation, adjective_noun, verb_noun_noun). Still coherent and readable.
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.
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
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
Search Spanish companies and directors from the official BORME registry and map their links.
French & European company registry for AI agents: KYB, sanctions, annual accounts. x402, no API key.
Official company and director data: search, profiles, filings, and name normalization.
Normalized search over public-sector tenders in TED (EU official procurement notices) -- Spain + EU
Related MCP Servers
- AlicenseAqualityCmaintenanceStructured business intelligence for AI agents. 5.5M verified entities across 34 countries, 40.3M BORME mercantile acts, EU VAT validation, GLEIF, healthcare registries. 20 tools.61MIT
- AlicenseAqualityBmaintenanceEnables AI agents to search and retrieve structured data from the German Commercial Register, including company details, filed documents, and shareholder lists.71Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables searching and retrieving details of over 500,000 Spanish government grants and subsidies from the official BDNS database, without requiring an API key.-
- AlicenseNot gradedqualityBmaintenanceSearch Spanish companies, directors and corporate relationships from official BORME registry filings — ~3.2M companies since 2009. Read-only, anonymous.MIT
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/george-kozlitin/borme-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server