Koskamo

BORME API MCP

An official Model Context Protocol server provided by BORME API that allows AI assistants to access Spanish company registry data (BORME). It enables resolving companies, reconstructing published histories, searching by name or NIF, monitoring changes, and exposing officers and brands with official-source provenance.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

BORME API MCP logo, by BORME APIVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by BORME API
You need:Get a free Hosted API keysign in to your BORME API accountX-API-Key headeractive API key
MCP endpoint (Streamable HTTP)
https://mcp.bormeapi.com/mcp
Vendor documentation

What you can do with it

  • Resolve a company by NIF or registry sheet to get officers and status
  • Reconstruct published company history and timeline from gazette notices
  • Monitor companies for new published events or risk signals via webhooks
  • Search for companies by name or find trademarks and trading names

Source and maintenance

Vendor evidenceRegistry 2.1.0
Maintenance checked

Protocol and capabilities

Server
borme 0.1.0
MCP protocol
2025-06-18
Tools
10 advertised
Resources
3 advertised
Resource templates
1 advertised
Prompts
4 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Tools

10 advertised

search_events — Search registry events
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search BORME registry events (since 2009) across companies by publication date, province, act type and company name, newest first. Use it for questions about many companies ("insolvency notices in Valencia in September"). For one known company use company_history; to find a company use search_companies; for one day's totals use daily_digest. Returns JSON {count, events: [{event_id, date, borme_id, province, company_name, company_slug, acts: [{act_type, act_type_raw, roles, payload}], registral}]}, plus company_name_match, plan_window and hidden_by_plan when they apply. No next page: when count equals limit, narrow the filters. Read-only; one request per call against your daily quota. Without an API key (X-API-Key header, https://bormeapi.com/account) only the last 7 days are searched (plan_window). For an empty page with hidden_by_plan or company_name_match (matched_companies or suggested_companies), relay its note. Invalid dates, provinces or act types are refused with a reason.

search_events input schema
{
  "type": "object",
  "title": "search_eventsArguments",
  "properties": {
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 50,
      "description": "Maximum events returned, integer 1-200, e.g. 20 (default 50)."
    },
    "date_to": {
      "type": "string",
      "title": "Date To",
      "description": "Latest publication date, inclusive, YYYY-MM-DD, e.g. 2026-09-30. Optional; defaults to the latest day held."
    },
    "act_types": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Act Types",
      "description": "Optional list of act type enums; an event matches if it has any of them, e.g. [\"INCORPORATION\"] or [\"INSOLVENCY_DECLARATION\", \"INSOLVENCY_STATUS\"]. Full list: list_act_types. Barcelona prints some acts as free text under \"Otros conceptos\": recognised wording gets its own act type (act_type_raw stays \"Otros conceptos\"; fields.shareholder names a sole shareholder when the text does), and a same-entry revocation and reappointment becomes RE_ELECTIONS. Reprocessed events keep their event_id, but their acts can change."
    },
    "date_from": {
      "type": "string",
      "title": "Date From",
      "description": "Earliest publication date, inclusive, YYYY-MM-DD, e.g. 2026-09-01. Optional; data starts on 2009-01-02. Without a key it is moved up to 7 days ago (plan_window says so)."
    },
    "provinces": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Provinces",
      "description": "Optional list of BORME province names, accent- and case-insensitive, e.g. [\"MADRID\", \"CADIZ\", \"VIZCAYA\"]. An autonomous community stands for all of its provinces, e.g. [\"Basque Country\"] or [\"Cataluña\"]. Full list: the resource borme://provinces."
    },
    "company_name_contains": {
      "type": "string",
      "title": "Company Name Contains",
      "description": "Optional part of the company name, case- and accent-insensitive, e.g. \"mercadona\"; use at least 3 letters or digits for a selective search. % and _ match literally. It filters events; to look a company up by name, call search_companies first."
    }
  }
}
search_events annotations
{
  "title": "Search registry events",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company_history — Company registry timeline
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get one company's BORME timeline: its published registry events within your plan's window. Use it once the company is known (a slug from search_companies or company_by_nif); across many companies use search_events. A name is searched too: several matches return {ambiguous: true, candidates}, none returns {error, suggested_companies}. Returns JSON {company_slug, total_events, first_seen, last_seen, truncated, next_offset, count, events} (as in search_events), with former_slugs for a merged company (an old slug returns the merged timeline) and plan_window on a limited plan. total_events, first_seen and last_seen cover the whole timeline in your window, not this page. To page, keep limit and order and pass next_offset as offset (at most 10000) until it is null. Read-only; one request per call. Without an API key (X-API-Key header) only the last 7 days; basic covers 365 days, pro and risk the full history back to 2009. If all its events are outside your window, the refusal counts them.

company_history input schema
{
  "type": "object",
  "title": "company_historyArguments",
  "required": [
    "company"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 100,
      "description": "Events per page, integer 1-200, e.g. 20 (default 100)."
    },
    "order": {
      "type": "string",
      "title": "Order",
      "default": "desc",
      "description": "\"desc\" (default, newest first) or \"asc\" (oldest first), e.g. \"asc\" to start from the earliest event in your plan's window."
    },
    "offset": {
      "type": "integer",
      "title": "Offset",
      "default": 0,
      "description": "Events to skip, integer 0-10000 (default 0); pass the previous page's next_offset, e.g. 100."
    },
    "company": {
      "type": "string",
      "title": "Company",
      "description": "Company slug, e.g. vaz-metales-sl (from search_companies), or a name of at least 3 letters or digits, e.g. \"Mercadona\", searched case-insensitively."
    }
  }
}
company_history annotations
{
  "title": "Company registry timeline",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company_by_nif — Find a company by NIF
Advertised by the server during the last successful anonymous check.
Advertised read-only

Look up a Spanish company by its NIF/CIF tax ID. Use it when the user gives a tax ID (with a name use search_companies); on a hit, call company_history with the company_slug. Returns JSON {found, company_slug, company_name, current_name, status, province, nif_source, nif_caveat, ...}; use current_name. BORME has no dedicated tax-ID field: there are more than 580,000 NIF mappings from public sources and the text of BORME notices, covering a minority of companies, so a miss (reason nif_unmapped) means "not matched yet", not "does not exist". invalid_input true: not a NIF/CIF. reason nif_check_character_failed: wrong check character; relay tell_the_user and the did_you_mean candidates. reason not_registry_entity: explain entity_type as the note does. ambiguous true: ask which candidate. nif_caveat present: say the link is not settled. Read-only; one request per call. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account).

company_by_nif input schema
{
  "type": "object",
  "title": "company_by_nifArguments",
  "required": [
    "nif"
  ],
  "properties": {
    "nif": {
      "type": "string",
      "title": "Nif",
      "description": "Spanish NIF/CIF, normally 9 characters, e.g. B12345674. Spaces, hyphens, dots and the ES VAT prefix (ESB12345674) are accepted; other country prefixes are not."
    }
  }
}
company_by_nif annotations
{
  "title": "Find a company by NIF",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
brand_owner — Find a brand's company
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find the Spanish company a trademark or trading name is linked to, in the Spanish patent office's (OEPM) trademark and commercial-name records we hold (the archive starts in 1987). Use it when the user names a brand; for a company's own name use search_companies, for a known company's brands use company_brands. Returns JSON {found, brand, matches: [{brand, kind, company_slug, company_name, company_status, file}], truncated, source, note}. kind commercial_name identifies a business; trademark distinguishes goods or services (NESCAFÉ is not another name for Nestlé): say which kind a hit is. Links come from holder-name matching (the office publishes no tax IDs); ambiguous holders stay unlinked: present a hit as a name match, not confirmed ownership. found false is not proof the brand is unused. On a hit, use company_history with the slug. Read-only; one request per call. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account).

brand_owner input schema
{
  "type": "object",
  "title": "brand_ownerArguments",
  "required": [
    "brand"
  ],
  "properties": {
    "brand": {
      "type": "string",
      "title": "Brand",
      "description": "Brand or trading name, or part of it, at least 3 letters or digits after punctuation is removed, case-insensitive, e.g. \"ZARA\"."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 20,
      "description": "Maximum matches, integer 1-200, e.g. 10 (default 20)."
    }
  }
}
brand_owner annotations
{
  "title": "Find a brand's company",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
company_brands — A company's brands
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the trademarks and trading names that the Spanish patent office (OEPM) records under a holder with this company's name. Use it for a known company (a slug from search_companies or company_history); to go from a brand to its company use brand_owner. Returns JSON {company_slug, commercial_names, trademarks (each {name, file, status, since}), counts, truncated, limit_per_kind, source, note}. The office publishes no tax IDs, so every link is a name match, not confirmed ownership. An empty result means none is linked in our data, not that the company holds none. limit applies to each kind separately, newest first; counts is what this answer lists, not the company's total, and truncated true for a kind means more are linked: raise limit. Read-only; one request per call. Needs the basic plan or higher: send your API key in the X-API-Key header (https://bormeapi.com/account).

company_brands input schema
{
  "type": "object",
  "title": "company_brandsArguments",
  "required": [
    "company"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 50,
      "description": "Maximum results per kind (trademarks, trading names), integer 1-200, e.g. 10 (default 50)."
    },
    "company": {
      "type": "string",
      "title": "Company",
      "description": "Company slug, as returned by search_companies or company_history, e.g. vaz-metales-sl."
    }
  }
}
company_brands annotations
{
  "title": "A company's brands",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
recent_signals — Recent risk signals
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a sample of the latest risk signals derived from BORME and public sources: at most 10 rows dated within the last 7 days. Use it for "what risk signals appeared this week"; not a per-company check (use company_history) and not the full feed (the hosted API's /v1/signals). Returns JSON {count, window, sample_cap, signals: [{signal_type, date, company_slug, company_name, province, details}], full_feed}. AEAT_DEBTOR comes from the AEAT's yearly debtors list (art. 95 bis LGT): details carry listed_on, list_year, is_current_list (true for 12 months from listed_on) and debt_eur, the published total at 31 December of the prior year. Say the company was on the list published on that date; never say the debt is still outstanding. count 0 means none in the window, not that a company is risk-free; an unknown signal_type is refused with the valid list. Read-only; one request per call. Needs the risk plan: send your API key in the X-API-Key header (https://bormeapi.com/account).

recent_signals input schema
{
  "type": "object",
  "title": "recent_signalsArguments",
  "properties": {
    "signal_type": {
      "type": "string",
      "title": "Signal Type",
      "description": "Optional, one of INSOLVENCY_FILED, ACCORDION, MASS_EXIT, OWNERSHIP_CHANGE, DISTRESS_COMBO, PHOENIX, ADDRESS_CLUSTER, AEAT_DEBTOR, PUBLIC_CONTRACT_AWARD, e.g. MASS_EXIT; omit for all types."
    }
  }
}
recent_signals annotations
{
  "title": "Recent risk signals",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
daily_digest — Daily BORME digest
Advertised by the server during the last successful anonymous check.
Advertised read-only

Summarise one BORME publication day: total events, counts by act type, the top 10 provinces and the day's insolvency-proceedings notices. Use it for "what was published today" or a day's figures; to read the notices use search_events with date_from = date_to = that day. Returns JSON {date, total_events, by_type, top_provinces, insolvencies: [{company, province}]}. insolvencies lists the events with INSOLVENCY_DECLARATION or INSOLVENCY_STATUS (not SUSPENSION_OF_PAYMENTS, BANKRUPTCY_LEGACY or PROVISIONAL_SHEET_CLOSURE_INSOLVENCY). An INSOLVENCY_STATUS notice can record any stage, from a request for a declaration to the conclusion: before saying a company was declared insolvent, read the act's payload with search_events. A day without a gazette (weekends, holidays) returns total_events 0. Read-only; one request per call. Without an API key only days within the last 7 days; send your key in the X-API-Key header (https://bormeapi.com/account) for your plan's window.

daily_digest input schema
{
  "type": "object",
  "title": "daily_digestArguments",
  "properties": {
    "date": {
      "type": "string",
      "title": "Date",
      "description": "Publication day, YYYY-MM-DD, e.g. 2026-10-27; omit for the latest day in the database."
    }
  }
}
daily_digest annotations
{
  "title": "Daily BORME digest",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_companies — Search companies by name
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find Spanish companies by name and return ranked company cards. Use it first when the user gives a company name, then company_history with its company_slug; with a tax ID use company_by_nif, with a brand use brand_owner. Matches current names, former names and variants, ignoring accents, case, punctuation and the legal form. Returns JSON {query, count, total, total_is_at_least, truncated, limit, offset, companies: [{company_slug, name, legal_form, province, municipality, status, in_insolvency, last_act_date, match, matched_on}]}. match is exact, prefix, contains or fuzzy (a lead, not an identification; say so). Ranked by match, then active companies, then newest act. Read-only; one request per call; not limited by the free plan's 7 days of history. The free plan shows at most the first 5 ranked cards; hidden_by_plan counts the rest: relay its note. The NIF is on the card from the basic plan up (X-API-Key header). An empty answer is not proof that a business does not exist.

search_companies input schema
{
  "type": "object",
  "title": "search_companiesArguments",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "title": "Name",
      "description": "The bare company name or part of it, at least 3 letters or digits and at most 200 characters, e.g. \"inditex\" or \"Talleres Jarama\": no city, parentheses or notes. Matching allows for case, accents and punctuation, and a legal form such as SL or SA can be left out. Do not repeat the same query unchanged after an empty answer: read note and hidden_by_plan if present."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 10,
      "description": "Cards per page, integer 1-50, e.g. 5 (default 10)."
    },
    "offset": {
      "type": "integer",
      "title": "Offset",
      "default": 0,
      "description": "Cards to skip, integer 0-200 (default 0), e.g. 10. At most 200 cards are ranked; truncated true means a candidate cap was reached or a search step ran out of time, so add another word from the name."
    },
    "status": {
      "type": "string",
      "title": "Status",
      "description": "Optional, one of active, dissolved, extinct, sheet_closed, e.g. active; applied like province."
    },
    "province": {
      "type": "string",
      "title": "Province",
      "description": "Optional province, accent-insensitive, e.g. MADRID or VIZCAYA, or an autonomous community for all of its provinces, e.g. Catalonia; several values separated by commas, e.g. BIZKAIA,GIPUZKOA. Applied to the candidates the search reads (2,000 with a filter), so a broad name can return fewer companies than match it."
    }
  }
}
search_companies annotations
{
  "title": "Search companies by name",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_act_types — List act types
Advertised by the server during the last successful anonymous check.
Advertised read-only

List every normalized BORME act type: the enum used by the act_types filter of search_events (act_type), its Spanish label (spanish) and its English label (english). Use it to choose act_types values or to translate act types in an answer; it reads no registry data. Returns a JSON array of {act_type, spanish, english}, sorted by act_type. Read-only, open to everyone, no key needed and not counted against a quota. The same list is the resource borme://act-types.

list_act_types input schema
{
  "type": "object",
  "title": "list_act_typesArguments",
  "properties": {}
}
list_act_types annotations
{
  "title": "List act types",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
registry_stats — Data coverage and freshness
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report the coverage and freshness of the BORME data behind this server. Use it to answer "how much data is there?", "how fresh is it?" and "can I trust date filters for period X?" before running searches; it says nothing about any one company. Returns JSON {events_approx, companies_approx, coverage: {from, to}, parse_completeness_last_30d, source}: exact event and company counts from the latest hourly snapshot (planner estimates if no snapshot exists), the first and latest publication day held (YYYY-MM-DD), and the event-weighted parse completeness over the 30 days up to the latest run (e.g. 0.9987). Takes no arguments. Read-only, open to everyone, no key needed and not counted against a quota. The same report is the resource borme://coverage.

registry_stats input schema
{
  "type": "object",
  "title": "registry_statsArguments",
  "properties": {}
}
registry_stats annotations
{
  "title": "Data coverage and freshness",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

4 advertised

company_due_diligence — Company due diligence

Advertised by the server during the last successful anonymous check.

Due-diligence brief on one Spanish company from the notices published in BORME: identification, published history, officer appointments and their later changes, and insolvency and status notices, each act cited with its BORME id, within your plan's history window. Uses search_companies or company_by_nif, then company_history.

company
Company name, slug (e.g. vaz-metales-sl) or NIF/CIF (e.g. A28015865). (required)
board_changes — Board changes

Advertised by the server during the last successful anonymous check.

Appointments, re-elections, terminations and resignations, revocations and ex officio cancellations of appointments of the directors and other officers of one Spanish company, from the notices published in BORME, optionally since a date, each change cited with its BORME id. Uses search_companies, then company_history.

company
Company name or slug, e.g. "Mercadona" or vaz-metales-sl. (required)
since
Earliest publication date to cover, YYYY-MM-DD, e.g. 2025-01-01; leave empty for the company's whole history within your plan.
new_companies_digest — New companies digest

Advertised by the server during the last successful anonymous check.

Companies whose incorporation notices were published in BORME on one day, for one Spanish province or autonomous community, with name, slug and BORME id, from search_events (act type INCORPORATION). Without a date, uses the latest publication day (daily_digest).

province
BORME province or autonomous community, e.g. MADRID, VIZCAYA, Catalonia. (required)
date
Publication day, YYYY-MM-DD, e.g. 2026-10-27; leave empty for the latest day in the database.
check_nif — Check a NIF

Advertised by the server during the last successful anonymous check.

Check a Spanish NIF/CIF tax ID against the BORME API's company-to-NIF links: the company linked to it in this data, any format or check-character problem the tool reports, and the linked company's latest published acts. Uses company_by_nif (Basic plan or higher), then company_history.

nif
NIF/CIF, a letter and 8 characters, e.g. B12345674; spaces, hyphens, dots and the ES prefix are accepted. (required)

Resources

3 advertised

act-types — BORME act types

Advertised by the server during the last successful anonymous check.

Every normalized BORME act type: the enum used by the act_types filters (act_type), its Spanish label (spanish) and its English label (english). The same list as the list_act_types tool. Open to everyone.

act-types URI
borme://act-types

MIME type: application/json

provinces — BORME provinces and autonomous communities

Advertised by the server during the last successful anonymous check.

The 52 province values BORME prints (Ceuta and Melilla among them), each with the spellings listed for it, plus Spain's autonomous communities and the autonomous cities, each with the names it accepts and the province values a filter on it covers. The same list as GET /v1/provinces. Open to everyone.

provinces URI
borme://provinces

MIME type: application/json

coverage — BORME data coverage and freshness

Advertised by the server during the last successful anonymous check.

How much BORME data this server holds and how fresh it is: exact event and company counts from the latest hourly snapshot (planner estimates if no snapshot exists), the first and latest publication day held, and the share of gazette text structured (weighted by events) over the 30 days up to the latest processed day. The same report as the registry_stats tool. Open to everyone.

coverage URI
borme://coverage

MIME type: application/json

company — BORME company timeline

Advertised by the server during the last successful anonymous check.

Up to 20 of the most recent published events of one company, by slug (e.g. vaz-metales-sl, as returned by search_companies), with total_events, first_seen and last_seen: the same answer as company_history with company set to the slug, limit 20 and order desc, under the same plan rules (without an API key, the last 7 days only) and counted as one request. For more, call company_history.

company URI template
borme://company/{slug}

MIME type: application/json

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1666 ms
95th percentile latency
1666 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1666 ms · metadata changed · 10 tool(s), 3 resource(s), 1 resource template(s), 4 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http borme-api-mcp https://mcp.bormeapi.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add borme-api-mcp --url https://mcp.bormeapi.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable borme-api-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "borme-api-mcp": {
      "url": "https://mcp.bormeapi.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "borme-api-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.bormeapi.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start borme-api-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "borme-api-mcp": {
      "type": "http",
      "url": "https://mcp.bormeapi.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http borme-api-mcp https://mcp.bormeapi.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "borme-api-mcp": {
      "url": "https://mcp.bormeapi.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "borme-api-mcp": {
      "serverUrl": "https://mcp.bormeapi.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like BORME API MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run BORME API MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing