Koskamo

French Due Diligence MCP

A free, keyless MCP server providing read-only access to official open data for due diligence on French companies, dwellings, and product recalls. It validates SIREN/SIRET/VAT identifiers, checks insolvency and sanctions, retrieves public contracts, verifies rental compliance via DPE, and monitors product recalls in France and the EU.

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.

French Due Diligence MCP logo, by opendata-apisCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by opendata-apis
MCP endpoint (Streamable HTTP)
https://mcp-fr.opendata-apis.workers.dev/mcp
Vendor documentation

What its tools do

11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

11 of 11 have a description · 11 of 11 declare behavior hints · 4 of 11 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Validate French SIREN, SIRET, or VAT numbers for format and existence
  • Screen companies and officers against French national asset-freeze registers
  • Check rental compliance and energy performance (DPE) for French addresses
  • Search for recent product recalls in France or the EU by barcode

Source and maintenance

Community listingRegistry 0.5.0

Protocol and capabilities

Server
french-due-diligence 0.5.0
MCP protocol negotiated in check
2025-11-25
Tools
11 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

11 advertised

validate_identifier — Validate a French company identifier
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Checks a French SIREN (9 digits), SIRET (14 digits) or intra-EU VAT number (FR + 11 characters): format, checksum, and whether the registered company or establishment exists. Use it first when an identifier was typed by a person.

validate_identifier input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 32,
      "minLength": 9,
      "description": "SIREN, SIRET or FR VAT number; spaces allowed"
    }
  }
}
validate_identifier annotations
{
  "title": "Validate a French company identifier",
  "readOnlyHint": true,
  "openWorldHint": true
}
check_vat — Check a French VAT number in VIES
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Checks live in VIES, the European Commission's VAT register, whether a French VAT number (or the VAT number of a SIREN or SIRET) is valid, with the name and address declared for VAT, crossed with the French registry: company active, insolvency proceeding, and a name_matches consistency signal between the VIES name and the registered name (not a proof of ownership). To confirm the number belongs to a given company, compare the returned names with that company's name. Pass requester_vat (the user's own EU VAT number) to get a VIES consultation number, proof of the check. vies.status 'unavailable' means VIES could not answer: try again later, it does not mean invalid.

check_vat input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "number"
  ],
  "properties": {
    "number": {
      "type": "string",
      "maxLength": 32,
      "minLength": 9,
      "description": "FR VAT number, SIREN or SIRET; spaces allowed"
    },
    "requester_vat": {
      "type": "string",
      "maxLength": 32,
      "minLength": 4,
      "description": "The user's own EU VAT number, e.g. DE811569869, for a consultation number"
    }
  }
}
check_vat annotations
{
  "title": "Check a French VAT number in VIES",
  "readOnlyHint": true,
  "openWorldHint": true
}
search_companies — Search French companies
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Finds French companies by name, optionally narrowed by department (e.g. 75, 2A, 971), postal code or NAF activity code (e.g. 10.71C). Returns up to 10 companies with their SIREN. Use get_company next for the full profile.

search_companies input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 100,
      "minLength": 3,
      "description": "Company name, 3 characters minimum"
    },
    "department": {
      "type": "string",
      "pattern": "^(\\d{2}|2A|2B|97[1-6])$"
    },
    "postal_code": {
      "type": "string",
      "pattern": "^\\d{5}$"
    },
    "activity_code": {
      "type": "string",
      "pattern": "^\\d{2}\\.?\\d{2}[A-Z]$",
      "description": "NAF rév. 2 code"
    }
  }
}
search_companies annotations
{
  "title": "Search French companies",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_company — Get a French company's profile and insolvency status
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Profile of a French company by SIREN: legal name and form, activity, active or ceased, head office, officers (name and role), whether an insolvency proceeding is ongoing (in_insolvency) and its latest BODACC court announcements. Use it to answer 'can I do business with this company?'.

get_company input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "siren"
  ],
  "properties": {
    "siren": {
      "type": "string"
    }
  }
}
get_company annotations
{
  "title": "Get a French company's profile and insolvency status",
  "readOnlyHint": true,
  "openWorldHint": true
}
screen_sanctions — Screen a French company against asset freezes
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Screens a French company and its officers (people, with their month of birth, and companies) against the French national asset-freeze register (registre national des gels: UN, EU and French measures). result is clear, possible_match or strong_match; each match gives the register entry, its legal bases and its official page. A match is a lead to check on that page, not a decision; a different date of birth already rules namesakes out. strong: a person with the same name and year and month of birth, or a company whose own SIREN or SIRET the register entry lists; a same-named company without it is only possible. Beneficial owners, foreign lists (OFAC, UK) and politically exposed persons are not covered.

screen_sanctions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "number"
  ],
  "properties": {
    "number": {
      "type": "string",
      "maxLength": 32,
      "minLength": 9,
      "description": "SIREN, SIRET or FR VAT number; spaces allowed"
    }
  }
}
screen_sanctions annotations
{
  "title": "Screen a French company against asset freezes",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_public_contracts — Get the public contracts a French company won
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Public contracts a French company won (DECP, French public procurement data): their count, the summed maximum amounts (leaving out amounts the source flags as suspect or aberrant, given apart), first and latest notification, then the contracts newest first, 20 per page, with buyer, object, maximum amount, CPV code, procedure, duration and place; plus the company's name, whether it is active and whether an insolvency proceeding is ongoing. Amounts are ceilings declared by buyers (maximum estimated, excl. VAT), not spend or revenue; the count is approximate (computed by the source: a contract held by two establishments counts twice, and a holder whose identifier merely contains the SIREN may be included). Narrow with from and to (notification dates).

get_public_contracts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "siren"
  ],
  "properties": {
    "to": {
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      "description": "Notified on or before, YYYY-MM-DD"
    },
    "from": {
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
      "description": "Notified on or after, YYYY-MM-DD"
    },
    "page": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Page of 20 contracts, from 1"
    },
    "siren": {
      "type": "string"
    }
  }
}
get_public_contracts annotations
{
  "title": "Get the public contracts a French company won",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_establishment — Get a French establishment by SIRET
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One establishment of a French company by SIRET: address, NAF activity, open or closed, head office or not. Use it to check a supplier's or invoice's address.

get_establishment input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "siret"
  ],
  "properties": {
    "siret": {
      "type": "string"
    }
  }
}
get_establishment annotations
{
  "title": "Get a French establishment by SIRET",
  "readOnlyHint": true,
  "openWorldHint": true
}
check_rental_compliance — Check whether a French dwelling can be rented (DPE)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

For a French postal address, returns each dwelling's energy performance certificate (DPE) and its rental verdict under the Climate and Resilience law: rentable now or not, rent frozen or not, ban date (G 2025, F 2028, E 2034), DPE validity, and the label estimated under current electricity rules. Narrow with floor, surface or address complement. Information, not legal advice.

check_rental_compliance input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "address"
  ],
  "properties": {
    "floor": {
      "type": "integer",
      "maximum": 100,
      "minimum": 0
    },
    "address": {
      "type": "string",
      "maxLength": 200,
      "minLength": 5,
      "description": "Full address with house number, postcode and town"
    },
    "surface": {
      "type": "number",
      "maximum": 1000,
      "minimum": 1,
      "description": "Living area in m²"
    },
    "complement": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "e.g. 'Apt 12', 'Bât B'"
    }
  }
}
check_rental_compliance annotations
{
  "title": "Check whether a French dwelling can be rented (DPE)",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_dpe — Get a French DPE and its rental verdict by number
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

The dwelling of a French DPE (energy performance certificate) by its 13-character number (e.g. 2569E0160739C), with the same rental verdict as check_rental_compliance. Replaced DPEs are not available: the ADEME dataset drops them.

get_dpe input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "dpe_number"
  ],
  "properties": {
    "dpe_number": {
      "type": "string"
    }
  }
}
get_dpe annotations
{
  "title": "Get a French DPE and its rental verdict by number",
  "readOnlyHint": true,
  "openWorldHint": true
}
check_product_recall — Check whether a product was recalled (France and EU)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Checks whether a product was recalled in France (RappelConso) or the EU (Safety Gate, since 2022) by its barcode number (GTIN/EAN-13, UPC-A, EAN-8). recalled true lists each recall with its date, reason, risks, measures and the lots concerned (all_lots false means only those lots); compare the lots with the product at hand. recalled false comes with checked_at and each source's freshness. If a source's backfilled is false, its older recalls may still be missing.

check_product_recall input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "gtin"
  ],
  "properties": {
    "gtin": {
      "type": "string",
      "description": "Barcode number, 8 to 14 digits; spaces allowed"
    }
  }
}
check_product_recall annotations
{
  "title": "Check whether a product was recalled (France and EU)",
  "readOnlyHint": true,
  "openWorldHint": true
}
list_recent_recalls — List recent product recalls (France and EU)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Product recalls published since a date in France (RappelConso) and the EU (Safety Gate), newest first, 50 per page; follow next_cursor for more. Narrow by source, category or the notifying country. A French Safety Gate alert merged into its RappelConso fiche is not listed twice.

list_recent_recalls input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "since"
  ],
  "properties": {
    "since": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Published on or after, YYYY-MM-DD, 2018-01-01 or later"
    },
    "cursor": {
      "type": "string",
      "maxLength": 200,
      "description": "The next_cursor of the previous page"
    },
    "source": {
      "enum": [
        "rappelconso",
        "safety_gate"
      ],
      "type": "string"
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "description": "Notifying country, ISO 3166 alpha-2, e.g. FR"
    },
    "category": {
      "enum": [
        "food",
        "vehicles",
        "childcare",
        "toys",
        "home",
        "electrical",
        "cosmetics",
        "clothing",
        "sports",
        "communication",
        "other"
      ],
      "type": "string"
    }
  }
}
list_recent_recalls annotations
{
  "title": "List recent product recalls (France and EU)",
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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
257 ms
95th percentile latency
257 ms

Maintenance history

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

  • · probe · passed · 257 ms · metadata changed · 11 tool(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 french-due-diligence-mcp https://mcp-fr.opendata-apis.workers.dev/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 french-due-diligence-mcp --url https://mcp-fr.opendata-apis.workers.dev/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable french-due-diligence-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "french-due-diligence-mcp": {
      "url": "https://mcp-fr.opendata-apis.workers.dev/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "french-due-diligence-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp-fr.opendata-apis.workers.dev/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start french-due-diligence-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "french-due-diligence-mcp": {
      "type": "http",
      "url": "https://mcp-fr.opendata-apis.workers.dev/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 french-due-diligence-mcp https://mcp-fr.opendata-apis.workers.dev/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp-fr.opendata-apis.workers.dev/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": {
    "french-due-diligence-mcp": {
      "serverUrl": "https://mcp-fr.opendata-apis.workers.dev/mcp"
    }
  }
}

Let your agent find its tools

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