mcp-french-company-data
Click on "Deploy 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., "@mcp-french-company-dataFind Danone's SIREN and give me its head office and VAT number"
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.
mcp-french-company-data
An MCP server that lets Claude, Cursor or any MCP client look up French companies in official open data: identity and key figures from the API Recherche d'entreprises, and legal announcements (insolvency, deregistration, accounts filings, changes) from the BODACC, the official gazette of commercial notices.
No API key, no account, read-only. Python, official MCP Python SDK (v2), stdio transport.
Tools
Tool | What it does | Source |
| Find companies by name, brand, address words, SIREN or SIRET. Optional postal code, active-only filter, 1–25 results. | Recherche d'entreprises |
| Full public profile from a SIREN or SIRET: status, legal form, NAF code, size, head office, VAT number, latest published revenue and net income, labels (RGE, ESS, Qualiopi...). | Recherche d'entreprises |
| Latest BODACC notices for a company, newest first, optional category filter ( | BODACC (DILA) |
All tools are annotated readOnlyHint: true. SIREN/SIRET inputs are checked (Luhn key) before any
network call, and every answer carries its source and licence.
Related MCP server: MCP Recherche d'entreprises
Installation
Requires Python 3.10+.
git clone https://github.com/Kamelyoul/mcp-french-company-data
cd mcp-french-company-data
python -m venv .venv
# Windows: .venv\Scripts\activate macOS/Linux: source .venv/bin/activate
pip install -e ".[test]"
python examples/demo_client.py --list # starts the server over stdio and lists the toolsOr run it without cloning, with uv:
uvx --from git+https://github.com/Kamelyoul/mcp-french-company-data mcp-french-company-dataConfiguration
Claude Desktop
Edit claude_desktop_config.json (Settings > Developer > Edit Config), then restart Claude Desktop.
With uv (nothing to install by hand):
{
"mcpServers": {
"french-company-data": {
"command": "uvx",
"args": ["--from", "git+https://github.com/Kamelyoul/mcp-french-company-data", "mcp-french-company-data"]
}
}
}With the virtual environment created above (use the absolute path of your clone):
{
"mcpServers": {
"french-company-data": {
"command": "C:\\path\\to\\mcp-french-company-data\\.venv\\Scripts\\python.exe",
"args": ["-m", "french_company_data"]
}
}
}On macOS/Linux the command is /path/to/mcp-french-company-data/.venv/bin/python.
Cursor
Same block in ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
{
"mcpServers": {
"french-company-data": {
"command": "uvx",
"args": ["--from", "git+https://github.com/Kamelyoul/mcp-french-company-data", "mcp-french-company-data"]
}
}
}Claude Code
claude mcp add french-company-data -- uvx --from git+https://github.com/Kamelyoul/mcp-french-company-data mcp-french-company-dataExample prompts
"Find the SIREN of Danone and give me its head office address and VAT number."
"Is the company with SIRET 552 032 534 00703 still active? What was its last published revenue?"
"Check the BODACC for SIREN 552032534: any insolvency proceedings or deregistration?"
"Here are 10 supplier SIRENs. For each one, tell me if there is an insolvency notice in the BODACC."
Sample output of get_company (real call, 7 October 2026, abridged):
{
"company": {
"siren": "552032534",
"name": "DANONE",
"status": "active",
"legal_form": "SA with board of directors (5599)",
"activity_code_naf": "70.10Z",
"head_office": {"siret": "55203253400703", "address": "59-61 RUE LA FAYETTE 75009 PARIS"},
"vat_number": "FR27552032534",
"latest_published_accounts": {"year": "2025", "revenue_eur": 27376000000, "net_income_eur": 2100000000},
"page": "https://annuaire-entreprises.data.gouv.fr/entreprise/552032534"
},
"source": "Source: API Recherche d'entreprises (DINUM, annuaire-entreprises.data.gouv.fr), INSEE Sirene / RNE data, Licence Ouverte 2.0."
}python examples/demo_client.py runs the three tools against the live APIs (3 requests).
Limits (read before relying on it)
Rate limits are respected, not bypassed. Recherche d'entreprises allows at most 7 requests/second per IP (and 30/s per network); the server sends at most 4/s. BODACC on OpenDataSoft has an anonymous daily quota (20,000 calls/day observed in its
X-RateLimit-*headers); the server sends at most 2/s. On HTTP 429 it waits once ifRetry-Afteris ≤ 10 s, otherwise it returns a clear "rate limit reached" error to the model. Identical requests are cached in memory for 5 minutes. Requests carry a descriptiveUser-Agent, as the API asks.Not the full Sirene database. Companies that opted out of public listing (non-diffusibles) are not returned, by design of the API.
Freshness. Data may lag the official registries by a few days. BODACC entries for sole proprietors are sometimes not linked to a SIREN and can be missed.
No personal data on purpose. Company officers (names, birth dates) are not requested from the API. Sole proprietorships are named after a person: treat those results as personal data (GDPR).
Not legal or financial advice. For a decision (credit, claim filing deadline), open the official notice: every BODACC result includes its
bodacc.frURL.The BODACC OpenDataSoft endpoint is the one documented on data.gouv.fr today; DILA may move it. The URL is a single constant in
sources.py.
Tests
pytest # 27 offline tests: simulated HTTP + MCP client, plus a real stdio launch
LIVE=1 pytest -m live # 1 end-to-end test against the real APIs (3 requests)Offline tests use recorded API responses (tests/fixtures/, re-recorded with
python tests/record_fixtures.py). The insolvency example is a real announcement whose company
identity was replaced by a fictitious one (SAMPLE FLOORING SARL, SIREN 732829320).
Data sources and attribution
API Recherche d'entreprises, operated by DINUM for annuaire-entreprises.data.gouv.fr, built on INSEE Sirene and INPI RNE data. Documentation: https://recherche-entreprises.api.gouv.fr/docs/. Data under Licence Ouverte / Open Licence 2.0.
BODACC (Bulletin officiel des annonces civiles et commerciales), published by DILA, served at https://bodacc-datadila.opendatasoft.com. Data under Licence Ouverte / Open Licence 2.0.
This project is not affiliated with, or endorsed by, DINUM, INSEE, INPI or DILA.
Custom MCP servers
Need the same thing on your own database, internal API or SaaS tools (with authentication, tests and deployment)? Open an issue describing your use case.
License
MIT (code). Data remains under its own licence, see above.
Available Tools
3 toolsget_bodacc_announcementsARead-onlyIdempotent
Latest BODACC legal announcements for a company (official gazette of commercial notices): insolvency judgments, deregistration, accounts filings, changes, sales. Newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max announcements, newest first (1-20) | |
| siren | Yes | SIREN (9 digits) or SIRET (14 digits) | |
| category | No | Optional filter: collective (insolvency), radiation, dpc (accounts), modification, creation, immatriculation, vente, conciliation, retablissement_professionnel, divers |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description only adds the 'Newest first' ordering guarantee; it says nothing about data freshness, upstream gazette lag, or what happens when a company has no announcements. With annotations carrying the main burden, this is adequate but thin.
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?
Two compact clauses, front-loaded with the resource and its coverage, ending with the ordering guarantee. Every phrase earns its place and there is no filler.
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?
An output schema exists, so return-value documentation is not needed, and the description adequately conveys scope and ordering for a simple filtered read. A brief note on volume, freshness, or empty results would close the remaining gap.
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?
Schema description coverage is 100% — limit, siren and category all carry their own descriptions, including the category enum values. The description adds no format, defaulting, or filtering nuance beyond the schema, so the baseline 3 applies.
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?
Names a specific resource (BODACC legal announcements for a company) and enumerates its contents: insolvency judgments, deregistration, accounts filings, changes, sales. This is unmistakably distinct from the sibling tools search_companies and get_company, so an agent can select it without opening the schema.
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 never states when to reach for this tool versus the company siblings, or any precondition beyond the implicit need for a company identifier. There are no exclusions or alternative-routing hints, so usage must be inferred entirely from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_companyARead-onlyIdempotent
Full public profile of one French company: identity, status, head office, VAT number, latest published revenue and net income, labels (RGE, ESS, Qualiopi...).
| Name | Required | Description | Default |
|---|---|---|---|
| siren | Yes | SIREN (9 digits) or SIRET (14 digits); spaces allowed |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety and idempotency profile is fully covered without the description. The description adds only the scope of data returned, with no mention of behavior for unknown SIRENs, rate limits, or data freshness (e.g. 'latest published' revenue).
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?
A single front-loaded sentence that leads with the resource and scope before enumerating fields; there is no filler. The field list is somewhat long, but every item conveys what the caller receives.
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?
With one fully documented required parameter, a rich output schema, and annotations covering the safety profile, the definition supplies nearly everything an agent needs to call it correctly. The only gap is the absence of guidance on when to prefer it over its siblings.
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?
Schema description coverage is 100% and the single 'siren' parameter already documents the 9-digit SIREN / 14-digit SIRET format with spaces allowed. The description adds no parameter meaning at all, so the baseline 3 for schema-complete parameters applies.
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 gives a specific verb-like resource ('Full public profile of one French company') and enumerates the content returned (identity, status, head office, VAT, revenue, net income, labels), which clearly separates it from a list/search tool. It does not, however, name or explicitly contrast with the sibling search_companies or get_bodacc_announcements, so it falls short of a 5.
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 phrase 'one French company' implies this is a single-entity detail lookup rather than a discovery search, which suggests when to use it over search_companies. But there is no explicit when/when-not guidance, no mention of prerequisites, and no routing to the sibling tools for other needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesARead-onlyIdempotent
Search French companies, associations and public bodies by name, address or SIREN/SIRET.
Returns SIREN, name, status, activity code (NAF), legal form, size and head office. Personal data of company officers is intentionally not returned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (1-25) | |
| query | Yes | Company name, brand, address words, SIREN or SIRET | |
| active_only | No | Exclude ceased companies | |
| postal_code | No | Optional 5-digit French postal code |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuine non-obvious behavior beyond them: company-officer personal data is intentionally excluded from results, which prevents an agent from expecting it. It omits other behaviors such as the default exclusion of ceased companies (active_only=true).
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?
Three sentences, zero filler, and the core capability is front-loaded. The return-field enumeration is partly redundant given an output schema exists, costing it a point.
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?
With an output schema present, the description need not (and mostly does not need to) explain return values, and the privacy note plus coverage scope make it callable. Minor gap: it never discloses that ceased companies are excluded by default via active_only=true, a default that could surprise an agent.
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?
Schema description coverage is 100%, so all four parameters (query, limit, active_only, postal_code) are already documented in the schema. The description adds no syntax, format or defaults beyond what the schema provides; the mention of name/address/SIREN/SIRET merely restates the query field. Baseline 3 is appropriate.
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?
States a specific verb (Search) and resource (French companies, associations and public bodies), plus the searchable axes (name, address, SIREN/SIRET). The verb "search" inherently separates it from get_company, but the description never names or contrasts the sibling tools, so it stops short of the top band.
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?
Usage is only implied: the query accepts a name, address words or an identifier, so an agent can infer it is for discovery when you have partial input. It gives no when-to-use vs get_company (single-record lookup) and no exclusions, so an agent must derive the routing itself.
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.
3 tool updates
v0.1.0- First observed
get_bodacc_announcements - First observed
get_company - First observed
search_companies
TDQS
Scored across 3 tools
Each tool serves a clearly distinct purpose: search/list discovery (search_companies), single-entity detail (get_company), and time-ordered legal notices (get_bodacc_announcements). There is no overlap—one finds, one profiles, one retrieves announcements.
All three follow a consistent snake_case verb_noun pattern (search_companies, get_company, get_bodacc_announcements). The convention is predictable and readable throughout.
Three tools is slightly thin but well-scoped for a read-only company-data lookup: search, detail, and announcements cover the core surface. Nothing feels redundant, though a few optional filters could have justified more.
Search, full profile, and official legal announcements cover the primary read-only workflows well. Minor gaps exist (no advanced filtering by NAF/region, no historical financial series, no officer data by design), but agents can work around these.
Maintenance
Related MCP Connectors
French Companies MCP — recherche-entreprises.api.gouv.fr
BODACC MCP — French official business-events bulletin (keyless).
Search French companies: financials, directors, ownership, M&A and insolvency events.
INSEE MCP — France's SIRENE business registry (INSEE).
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables interaction with Datagouv APIs, primarily allowing users to search for up-to-date information about companies registered in France.11-
- AlicenseBqualityFmaintenanceEnables interaction with the French business search API from data.gouv.fr, allowing users to search for French companies by text or geographical criteria and access essential business information.213 npm19MIT
- FlicenseNot gradedqualityDmaintenanceMCP server to query the INSEE SIRENE API and search for French companies, supporting searches by SIREN, SIRET, and advanced filters like name, location, and activity.1-
- AlicenseNot gradedqualityBmaintenanceEnables querying French companies and establishments via SIREN or geographic proximity using the official French business register API.247 npmMIT