Skip to main content
Glama
gghez

mcp-gouv-fr

by gghez

mcp-gouv-fr

MCP server built with FastMCP for Claude Desktop, Cursor, and other clients. Use it to explore French public open data through ready-made tools instead of calling each portal yourself.

Source repository: github.com/gghez/mcp-gouv-fr

APIs

API

What you can do

data.gouv.fr

Search and open datasets: metadata, organization, and links to files or APIs.

geo.api.gouv.fr

Look up communes, departments, and regions (names, codes, and related geography).

INSEE API Sirene

Look up a legal entity (SIREN) or an establishment (SIRET); needs an INSEE API key.

Radio France Open API

Run GraphQL queries on Radio France open data; needs an API token.

data.gouv.fr

Tools use the datagouv_ prefix.

Tool

What it does

datagouv_search_datasets

Search datasets by title, description, or organization, with pagination.

datagouv_get_dataset

Full metadata and resource links for one dataset (id or slug).

geo.api.gouv.fr

Tools use the geo_ prefix.

Tool

What it does

geo_search_communes

Search communes by name, postal code, and/or department (at least one filter).

geo_get_commune

Commune details by INSEE municipality code.

geo_search_departements

List or search departments.

geo_get_departement

Department detail by code.

geo_search_regions

List or search regions.

geo_get_region

Region detail by code.

INSEE API Sirene

Tools use the insee_ prefix. Set MCP_GOUV_INSEE_API_KEY or these tools will report a configuration error.

Tool

What it does

insee_get_unite_legale

Legal unit (unité légale) by 9-digit SIREN.

insee_get_etablissement

Establishment (établissement) by 14-digit SIRET.

Radio France Open API

Tools use the radiofrance_ prefix. Set MCP_GOUV_RADIOFRANCE_API_TOKEN for radiofrance_graphql.

Tool

What it does

radiofrance_graphql

Execute a GraphQL query against Radio France public data.

Default transport is stdio for local MCP clients; streamable HTTP is optional for remote access (see Transports and CLI options).

Related MCP server: mcp-datagouv

Prerequisites

  • uv installed and available on your PATH (so uvx works).

  • This project targets Python 3.14 (requires-python in pyproject.toml). uv will provision a compatible interpreter when installing from Git or from a local checkout.

  • If you use uvx with a git+https://... URL (recommended install-from-GitHub flow below), Git must be installed and git must be on the PATH of the MCP subprocess. uv clones or updates the repo using Git; if Git is missing you get: Git executable not found. On Windows, Claude Desktop sometimes spawns MCP servers with a shorter PATH than your terminal: either use the clone + uv run setup, or extend PATH in the server env block (see below).

uvx runs the published console script mcp-gouv-fr in an isolated environment. You can point it at this repository with --from and a Git URL (no manual clone required).

Command shape:

uvx --from git+https://github.com/gghez/mcp-gouv-fr.git mcp-gouv-fr

Optional: pin a branch, tag, or commit after @ in the URL (see uv tools guide), for example git+https://github.com/gghez/mcp-gouv-fr.git@v0.1.0.

Claude Desktop (claude_desktop_config.json)

Typical path on Windows: %APPDATA%\Claude\claude_desktop_config.json.

{
  "mcpServers": {
    "mcp-gouv-fr": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/gghez/mcp-gouv-fr.git",
        "mcp-gouv-fr"
      ],
      "env": {
        "PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW"
      }
    }
  }
}

Restart Claude Desktop after editing. If uvx is not found, use the full path to the uv executable and run uv tool run instead of uvx, or add uv to your user PATH.

If uv fails with “Git executable not found” (common on Windows), the MCP host did not expose git on PATH. Fixes:

  1. System-wide (simplest): add C:\Program Files\Git\cmd (or your Git install) to the user or system PATH in Windows Settings so GUI apps (Claude Desktop) inherit it, then restart Claude.

  2. Per server: set env.PATH in the MCP JSON to a single string that lists every folder the process needs, in order — at minimum Git’s cmd and the folder containing uv.exe / uvx.exe (e.g. C:\Users\YOU\.local\bin). Some clients replace the process PATH entirely when env is set, so do not rely on ${PATH} expansion unless you verified your client merges variables.

  3. Avoid Git at MCP startup: use clone + uv run (uv run --directory … mcp-gouv-fr) after uv sync in that clone; uv then runs the project without cloning from Git on each start.

Cursor and other editors

Use the same JSON shape in your MCP servers configuration: command uvx, args as above. For stdio, do not pass extra arguments unless you need non-default transport (see below).

If uvx is not on PATH (Windows)

Use the full path to uv.exe and the equivalent invocation:

{
  "mcpServers": {
    "mcp-gouv-fr": {
      "command": "C:\\Users\\YOU\\AppData\\Local\\Programs\\uv\\uv.exe",
      "args": [
        "tool",
        "run",
        "--from",
        "git+https://github.com/gghez/mcp-gouv-fr.git",
        "mcp-gouv-fr"
      ]
    }
  }
}

Adjust the command path to match your uv installation.

Alternative: clone the repo and run with uv

For a fixed checkout or local changes:

git clone https://github.com/gghez/mcp-gouv-fr.git
cd mcp-gouv-fr
uv sync
uv run mcp-gouv-fr

MCP JSON (stdio) — set --directory to your clone:

{
  "mcpServers": {
    "mcp-gouv-fr": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "C:\\path\\to\\mcp-gouv-fr",
        "mcp-gouv-fr"
      ]
    }
  }
}

Transports and CLI options

Default is stdio (suitable for Claude Desktop and Cursor).

uvx --from git+https://github.com/gghez/mcp-gouv-fr.git mcp-gouv-fr --transport stdio

Streamable HTTP (bind address, port, path can be changed):

uvx --from git+https://github.com/gghez/mcp-gouv-fr.git mcp-gouv-fr --transport streamable-http --host 127.0.0.1 --port 8765 --path /mcp

Environment variables (optional): MCP_GOUV_TRANSPORT, MCP_GOUV_HOST, MCP_GOUV_PORT, MCP_GOUV_HTTP_PATH, MCP_GOUV_APIS (comma-separated API ids; default: all), MCP_GOUV_LOG_LEVEL (logging level for stderr; default: INFO).

Environment variables (API behavior)

Variable

Description

MCP_GOUV_APIS

Comma-separated API ids to load (datagouv, geo, insee, radiofrance); default is all

MCP_GOUV_DATAGOUV_API_BASE

data.gouv API base URL (default: https://www.data.gouv.fr/api/1)

MCP_GOUV_GEO_API_BASE

Geo API base URL (default: https://geo.api.gouv.fr)

MCP_GOUV_INSEE_API_KEY

INSEE portal consumer key for Sirene (required for insee_* tools; from portail-api.insee.fr)

MCP_GOUV_INSEE_SIRENE_API_BASE

Sirene 3.11 API base (default: https://api.insee.fr/api-sirene/3.11)

MCP_GOUV_RADIOFRANCE_GRAPHQL_URL

Radio France GraphQL endpoint (default: https://openapi.radiofrance.fr/v1/graphql)

MCP_GOUV_RADIOFRANCE_API_TOKEN

Radio France Open API key (x-token); required for radiofrance_graphql (portal)

MCP_GOUV_HTTP_TIMEOUT

Outbound HTTP timeout in seconds (default: 30)

MCP_GOUV_USER_AGENT

User-Agent header for HTTP requests

MCP_GOUV_LOG_LEVEL

Stderr log level for the server process (DEBUG, INFO, WARNING, …; default: INFO)

In MCP JSON, set these under env next to command / args if your client supports it.

INSEE Sirene (API key required)

Unlike data.gouv and geo.api.gouv.fr, Sirene lookups will not work until you set an API key. Subscribe to the Sirene API on the INSEE developer portal, generate a consumer key, and expose it to the MCP process as MCP_GOUV_INSEE_API_KEY. The server sends it as the X-INSEE-Api-Key-Integration header to api.insee.fr. If this variable is missing or empty, the insee_* tools return an error that asks you to configure it.

When using Claude Desktop or Cursor, add MCP_GOUV_INSEE_API_KEY to the server’s environment (e.g. env in the MCP JSON config) so the subprocess inherits it.

Development

Contributors: tests and lint live in the repo. Run uv run pytest and uv run ruff check src. Install Git hooks with uv run pre-commit install (runs ruff check --fix on commit). Tool outputs use Pydantic models (JSON Schema for MCP clients). See AGENTS.md for layout conventions (nested tests next to the code they cover).

License

Not set yet (no LICENSE file in this repository).

Available Tools

11 tools
datagouv_get_datasetA

Return dataset metadata and resources for one dataset.

Args: dataset_id: Dataset id or slug.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesDataset UUID.
slugNoURL slug; can be used as dataset identifier.
titleNoDataset title.
licenseNoLicense identifier or title as returned by the API (e.g. ODbL, fr-lo).
frequencyNoUpdate frequency label when provided (e.g. annual, quarterly).
resourcesNoFiles and API endpoints attached to the dataset; use URLs to fetch data.
descriptionNoLonger dataset description from the portal.
organizationNoOrganization that publishes this dataset.
temporal_coverageNoTemporal coverage object or string from the API, if any.

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Return', which implies a read operation, but does not explicitly state that it is read-only, nor does it disclose error behavior, authentication needs, rate limits, or side effects. This is a minimal gap for a GET-like tool but still below the bar.

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 short and front-loaded with the primary purpose, followed by a structured args line. No wording is wasted, though the 'Args' block partially overlaps with the input schema. Overall it is appropriately sized.

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

Completeness3/5

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

For a single-parameter tool with an output schema, the core mechanics are covered: what it returns and what the parameter means. However, the absence of explicit usage guidance, behavioral safety disclosure, and error handling leaves the description only minimally viable for an agent to confidently use it in a broader workflow.

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?

Schema description coverage is 0%, but the description compensates with 'dataset_id: Dataset id or slug'. This adds crucial semantic meaning beyond the raw schema's 'type: string' by clarifying that both a dataset ID and a human-readable slug are accepted.

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 states a clear verb ('Return') and resource ('dataset metadata and resources') and explicitly scopes the operation to one dataset. The distinction from the sibling datagouv_search_datasets is apparent: this retrieves one known dataset rather than discovering many.

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 when to use the tool by indicating it returns a single dataset and requires a dataset_id or slug. However, it does not explicitly state when not to use it, mention prerequisites like knowing the ID, or recommend datagouv_search_datasets for finding datasets.

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

datagouv_search_datasetsA

Search datasets (title, description, organization).

Args: query: Free-text search query. page: Page number (1-based). page_size: Page size (keep reasonably small, e.g. ≤ 100).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
queryYes
page_sizeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageNoCurrent 1-based page index returned by the API.
totalNoTotal matching datasets reported by the API, if available.
datasetsNoDatasets matching the query for this page (API key 'data' mapped here).
next_pageNoAbsolute URL to fetch the next page, or null when there is no next page.
page_sizeNoNumber of items requested per page (may cap server-side).

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It adds useful search-scope details and a page_size guard ('keep reasonably small, e.g. ≤ 100'), but it does not disclose authentication needs, rate limits, result ordering, or whether search is fuzzy/exact.

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 main purpose is front-loaded in one line, followed by compact and complete Args entries. Every sentence earns its place, and there is no repetition of schema defaults or irrelevant detail.

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?

For a simple 3-parameter search tool with an output schema, the core calling contract (free-text query, pagination, size limit) is fully covered. The main missing context is explicit differentiation from sibling toolsarkan otherwise minor gap given the output schema covers return shape.

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

Parameters5/5

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

Schema description coverage is 0%, but the description compensates fully for all three parameters: query is labeled 'free-text search', page is '1-based', and page_size gets explicit sizing guidance. This adds real meaning beyond the raw schema property names and defaults.

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 states 'Search datasets' and specifically lists the searchable fields (title, description, organization), making the tool's action and resource clear. This clearly differentiates it from the sibling datagouv_get_dataset, which is a direct fetch rather than a search.

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?

It implies this is the dataset discovery/search tool, but it never explicitly says when to use it versus datagouv_get_dataset or the geo/insee search siblings. No alternatives, exclusions, or routing conditions are stated.

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

geo_get_communeA

Return one commune by INSEE municipality code.

Args: code: INSEE code commune (5 characters for mainland; includes Corsica 2A/2B departments' communes with standard 5-digit codes).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nomYesCommune name.
codeYesINSEE municipality code (``code commune``), 5 characters for mainland.
_scoreNoRelevance score for fuzzy name search; absent on exact or non-search calls.
regionNoParent region when nested in the payload.
surfaceNoArea in hectares when provided by the API.
populationNoPopulation figure when requested via ``fields`` on the detail endpoint.
departementNoParent department when nested in the payload.
codesPostauxNoPostal codes served by this commune when the API includes them.

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It usefully explains the code format and the Corsica 2A/2B edge case, but it does not describe behavior for invalid or not-found codes, or any other runtime traits. This is moderate but incomplete.

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 compact: one sentence states the core purpose, and the second sentence explains the parameter format. There is no filler or repetition.

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?

For a single-parameter get-by-code tool with an output schema, the description is nearly complete. It could additionally mention using geo_search_communes when a code is not known, but that is a minor enhancement rather than a critical gap.

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

Parameters5/5

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

The schema only defines 'code' as a required string, while the description adds substantial meaning: it is an INSEE commune code, exactly 5 characters, with a specific note about Corsica. This fully compensates 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 uses a specific verb ('Return') with a precise resource ('one commune') and identifier ('INSEE municipality code'). This clearly distinguishes it from sibling tools like geo_search_communes, which search, and geo_get_departement, which targets a different geographic entity.

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 usage context is clear: call this tool when you have a specific INSEE commune code and need the corresponding commune. It does not explicitly name alternatives or exclusions, so it falls just short of a 5, but the get-by-code framing leaves little ambiguity.

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

geo_get_departementA

Return one department by code, including its region when available.

Args: code: Official department code (e.g. 13, 75, 2A).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nomYesDepartment name.
codeYesOfficial department code (e.g. ``75``, ``2B``).
_scoreNoRelevance score when filtering departments by ``nom``.
regionNoParent region when the API nests it.

TDQS

A3.7/5.0
Behavior3/5

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

The description adds the conditional behavior 'including its region when available,' which is useful context beyond the schema. With no annotations, it does not disclose error handling for unknown codes or explicitly confirm it is read-only, but for a simple getter this is a modest gap.

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 very short, front-loads the core behavior, and contains no filler. The Args section efficiently communicates the parameter meaning and examples.

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?

For a one-parameter getter with an output schema, the description covers what is returned, how to specify the department, and the region condition. It lacks a note about unknown-code behavior, but the tool's simplicity and output schema reduce the need.

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 schema only declares code as a string, so the description's 'Official department code' with examples '13, 75, 2A' adds essential formatting and domain meaning. It compensates well for the 0% schema coverage on the single parameter.

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

Purpose4/5

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

The description states a specific verb and resource: 'Return one department by code' and mentions the region inclusion. It implies a distinct exact-code lookup compared to sibling search tools, but it does not explicitly name or contrast itself with geo_search_departements.

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 phrase 'by code' clearly implies this tool is for callers who already have an official department code. However, it gives no explicit guidance about when to prefer a search sibling or when this tool should not be used.

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

geo_get_regionA

Return one region by code.

Args: code: Official region code (e.g. 11 for Île-de-France).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nomYesRegion name.
codeYesOfficial region code (two digits as string).
_scoreNoRelevance score when filtering regions by ``nom``.

TDQS

A4/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden. It does disclose the core behavior: the tool retrieves and returns one region by code, and it adds that the code is an 'Official region code.' It does not mention what happens for unknown or malformed codes, or any other edge behavior, but for a simple read-style getter the disclosed behavior is adequate though incomplete.

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 two sentences, front-loaded with the core action, and includes only the one parameter explanation that matters. There is no filler or repetition of the tool name beyond the docstring-style parameter label.

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?

For a single-parameter lookup with an output schema, the description is nearly complete: it states what is returned, by what key, and gives an example. The main missing context is routing guidance toward the sibling search tool and clarifying not-found behavior, but these are minor for a simple getter.

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 only declares that code is a string with no description, so the description adds meaningful value by calling it an official region code and giving the concrete example '11' for Île-de-France. With only one parameter and a degenerate schema, this is strong compensation for the 0% schema 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 uses a specific verb and resource combination: 'Return one region by code.' It is clearly distinguished from sibling geo_search_regions, which implies searching multiple regions, because this tool fetches a single region by an official code. For a simple getter this is exactly the level of specificity an agent needs.

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 intended usage is implied rather than explicit: it is appropriate when a region code is known and exactly one region is wanted. However, the description does not mention the alternative geo_search_regions or state when not to use this tool, so the agent must infer the decision boundary.

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

geo_search_communesA

Search communes by name, postal code, and/or parent department.

At least one of nom, code_postal, or code_departement must be non-empty so the query stays bounded (the upstream API can return very large slices without filters).

Args: nom: Substring or fuzzy name (e.g. Paris); optional if other filters are set. code_postal: Five-digit postal code; optional if other filters are set. code_departement: Department code (e.g. 75); optional if other filters are set. boost_population: When true, rank name search by population (upstream boost param). limit: Maximum number of results (keep small, e.g. ≤ 50).

ParametersJSON Schema
NameRequiredDescriptionDefault
nomNo
limitNo
code_postalNo
boost_populationNo
code_departementNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
communesNoMatching communes in API order (often best match first when searching by name).

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It does add valuable context: the upstream API can return large slices, hence the bounded-query requirement, and explains the boost_population ranking effect. However, it does not mention authentication, rate limits, or whether this is a read-only operation (trivially implied by 'search'). Some behavioral aspects like pagination or error handling are absent, though the output schema may cover returns.

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 compact and well-organized: a one-line purpose, a critical usage constraint, and then a clean Args list. Every sentence earns its place; the most important operational caveat (bounded query) is highlighted early. No redundancy or fluff.

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?

The description covers all parameters, their optionality, the mandatory filter requirement, and safe usage limits. Since an output schema exists, not describing the return format is acceptable. The only minor gap is lack of explicit differentiation from geo_get_commune, but the search semantics are clear. Overall, an agent can correctly call this tool with confidence.

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

Parameters5/5

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

The description includes an explicit Args section that explains every parameter: nom (substring/fuzzy), code_postal (five-digit), code_departement (department code), boost_population (ranking by population), and limit (maximum results). It also states the interdependency constraint (at least one of the three filters). The input schema provides no descriptions of its own, so this description adds substantial meaning beyond types and defaults.

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 opens with 'Search communes by name, postal code, and/or parent department' – a clear verb, resource, and search criteria. This immediately differentiates it from siblings like geo_search_departements or geo_search_regions, which target different geographies. The purpose is unambiguous.

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 clearly states a required precondition ('At least one of nom, code_postal, or code_departement must be non-empty') and gives guidance on limit ('keep small, e.g. ≤ 50'). It does not explicitly contrast with geo_get_commune (which likely retrieves by ID), but the search-oriented purpose is implied clearly enough from the name and context. No misleading exclusions.

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

geo_search_departementsA

List all departments or fuzzy-search them by name.

Args: nom: When set, filters departments by name; when omitted, returns the full list (subject to limit). limit: Cap on returned rows (default covers all mainland + overseas departments).

ParametersJSON Schema
NameRequiredDescriptionDefault
nomNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
departementsNoDepartments returned for this query (full list when ``nom`` is omitted).

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It discloses fuzzy-search behavior, optional name filtering, and that limit defaults to cover all mainland and overseas departments. It does not mention read-only status or edge cases, but the key behaviors are transparent.

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 concise and front-loaded with the primary purpose stated first, followed by a compact Args section. Every sentence adds value with no filler.

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?

For a simple two-parameter search tool with no required parameters and an existing output schema, the description covers purpose, parameter behavior, and default behavior. The agent has enough to call the tool correctly without missing guidance.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully compensates. It explains nom as a name filter and limit as a row cap, adding meaning beyond the raw schema types and defaults.

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 states a specific verb and resource: 'List all departments or fuzzy-search them by name.' This clearly distinguishes it from sibling tools like geo_get_departement, which targets a single department by code, and geo_search_communes, which targets communes.

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 provides clear context for when to use it: when listing all departments or fuzzy-search by name, and explains nom set vs omitted. However, it does not explicitly mention alternatives or exclusions relative to sibling tools like geo_get_departement.

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

geo_search_regionsA

List all regions or fuzzy-search them by name.

Args: nom: When set, filters regions by name; when omitted, returns every region. limit: Cap on returned rows (France has fewer than 20 regions).

ParametersJSON Schema
NameRequiredDescriptionDefault
nomNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
regionsNoRegions returned for this query (full list when ``nom`` is omitted).

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It explains the fuzzy-search behavior, the all-regions default when 'nom' is omitted, and the row cap with a useful real-world sizing detail about France's region count.

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 compact, front-loaded with the main purpose, and uses brief bullet-style argument explanations. Every sentence adds useful information without unnecessary detail.

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?

For a low-complexity search/list tool with only two optional parameters and an output schema, the description covers the key behavior and edge cases. It does not mention pagination or exact-match alternatives, but those are not essential for correct invocation here.

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?

Schema coverage is 0%, so parameter documentation in the description is essential. It adds meaningful semantics: 'nom' filters by name when set and returns everything when omitted, and 'limit' caps results.

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 uses clear verbs 'List' and 'fuzzy-search' with a clear resource ('regions'), making it clear this tool is for listing all regions or searching by name. It also distinguishes itself from sibling tools targeting different geographic objects such as communes and departements.

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?

It gives clear parameter-level guidance: set 'nom to filter by name, omit it to return all regions, and use 'limit' to cap rows. However, it does not explicitly contrast this tool with siblings like 'geo_get_region' or explain when to prefer this search tool over exact-lookup alternatives.

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

insee_get_etablissementA

Return the establishment (établissement) for one 14-digit SIRET.

Use this for a specific branch or address (SIRET includes the SIREN plus a NIC). Requires a valid portal API key.

Args: siret: Fourteen-digit SIRET (spaces optional).

ParametersJSON Schema
NameRequiredDescriptionDefault
siretYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
etablissementYesFull establishment (établissement) object as returned by INSEE; structure matches official Sirene 3.11 documentation (nested camelCase fields).

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses that a valid portal API key is required, which is useful. However, it doesn't describe the return format, error behavior, or rate limits. The description adds some behavioral context but not comprehensive detail.

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 compact and front-loaded. The first sentence states the core purpose, the second gives usage context, and the third covers the parameter. Every sentence earns its place with no 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?

For a single-parameter lookup tool with an output schema present, the description covers the key aspects: what it returns, when to use it, the parameter format, and the auth requirement. It doesn't mention error cases or response structure, but the output schema likely covers the return shape. Minor gap: no explicit mention of what happens for invalid SIRETs.

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?

Schema description coverage is 0%, so the description must compensate. It does: it explains the siret parameter is a 14-digit SIRET with spaces optional, and explains the SIREN+NIC composition. This adds meaning beyond the bare schema type string.

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 an establishment for a 14-digit SIRET, and distinguishes it from the sibling insee_get_unite_legale by explaining that SIRET includes SIREN plus NIC. This is a specific verb+resource with enough detail to differentiate it from related tools.

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 explains when to use this tool (for a specific branch or address) and implicitly contrasts it with the SIREN-based sibling. It doesn't explicitly name the alternative or state when not to use it, but the SIRET vs SIREN distinction provides clear context.

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

insee_get_unite_legaleA

Return the legal unit (unité légale) for one 9-digit SIREN.

Use this to resolve a company identifier to its official INSEE record (status, denomination, activity codes, etc.). Requires a valid portal API key.

Args: siren: Nine-digit SIREN (spaces optional).

ParametersJSON Schema
NameRequiredDescriptionDefault
sirenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
uniteLegaleYesFull legal unit (unité légale) object as returned by INSEE; structure matches official Sirene 3.11 documentation (nested camelCase fields).

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses a meaningful operational requirement ('Requires a valid portal API key') and sketches what is returned (status, denomination, activity codes). Yet it stays silent on failure behavior (e.g., unknown SIREN), rate limits, and whether the response is a raw records envelope. Decent but not exhaustive for an unannotated tool.

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?

Compact and well-ordered: the purpose is front-loaded in the first line, followed by a single usage sentence and an Args block. No filler, every sentence earns its place.

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?

Low complexity (one required parameter) with an output schema present, so return-value detail is not needed. The description covers the data returned, the parameter format, and the auth requirement. Housekeeping details like error semantics and rate limits are the only gaps, which are minor for a simple lookup tool.

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?

Schema description coverage is 0%, so the description must compensate, and it does: 'Nine-digit SIREN (spaces optional)' documents the expected format and normalizability beyond the bare string type in the schema. This is genuinely added value for the only parameter.

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

Purpose4/5

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

The description states a specific verb and resource: 'Return the legal unit (unité légale) for one 9-digit SIREN.' It implicitly differentiates itself from sibling insee_get_etablissement by keying on SIREN vs. SIRET, and the use case 'resolve a company identifier to its official INSEE record' sharpens the intent. It doesn't explicitly name the sibling, but the purpose is unmistakable.

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?

'Use this to resolve a company identifier to its official INSEE record' gives a clear when-to-use context. However, there is no mention of the natural alternative insee_get_etablissement, no exclusions, and no guidance on when NOT to use this tool. The when-to is present, but the when-not-to is absent.

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

radiofrance_graphqlA

Execute a GraphQL query or mutation against the Radio France Open API.

The upstream API is documented at https://developers.radiofrance.fr/ (programs, channels, podcasts). Use introspection or the hosted explorer (with your API token) to discover fields and types.

Args: query: GraphQL document (query or mutation). variables: Optional variables object; omit or pass empty dict when the query has none.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
variablesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoParsed `data` object from the GraphQL response when present; shape depends on the submitted query.
errorsNoGraphQL-level errors (validation, resolver failures). An empty list means no errors were returned in the payload.

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are present, so the description carries the full behavioral burden. It explicitly discloses that mutations are possible, which is important, and mentions using an API token in the hosted explorer. However, it does not explain authentication requirements for actual execution, rate limits, error behavior, or side effects beyond the word 'mutation'.

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 well structured and appropriately sized: it front-loads the purpose, provides the documentation link, gives discovery guidance, and then clearly documents both parameters. Every sentence contributes useful information 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 tool's simplicity, the presence of an output schema, and only two parameters, the description covers the essential aspects: what the tool does, how to discover the GraphQL schema, and how to supply parameters. It could be more explicit about authentication for API calls, but the mention of an API token in the explorer partially addresses this.

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?

Schema description coverage is 0%, so the description must compensate. It does so by explaining that 'query' is a GraphQL document and that 'variables' is optional and should be omitted or an empty dict when unused. This adds meaningful semantic guidance beyond the bare schema types.

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 executes a GraphQL query or mutation against the Radio France Open API, naming the specific resource and action. This differentiates it from the sibling tools, which target unrelated data sources and APIs.

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 provides clear context by linking to the upstream API documentation and directing users to use introspection or the hosted explorer to discover fields and types. It does not explicitly contrast with alternatives, but there are no similar GraphQL siblings, so the context is sufficient.

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.

  1. 11 tool updatesv0.1.0
    • First observeddatagouv_get_dataset
    • First observeddatagouv_search_datasets
    • First observedgeo_get_commune
    • First observedgeo_get_departement
    • First observedgeo_get_region
    • First observedgeo_search_communes
    • First observedgeo_search_departements
    • First observedgeo_search_regions
    • First observedinsee_get_etablissement
    • First observedinsee_get_unite_legale
    • First observedradiofrance_graphql

TDQS

A4.1/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct resource and action: datasets, communes, departements, regions, legal units, establishments, and a generic GraphQL access point are all cleanly separated. Search vs. get operations are unambiguous within each domain, and no two tools appear to overlap in purpose.

Naming Consistency5/5

Tool names follow a consistent domain_verb_noun pattern: datagouv_search/get, geo_search/get, insee_get, and radiofrance_graphql. snake_case is used uniformly, and the verbs search/get clearly indicate whether a tool lists/filters or fetches a single entity.

Tool Count4/5

11 tools is a reasonable, well-scoped count for a public-data server covering datasets, administrative geography, and company records. The radiofrance_graphql tool is a broad catch-all that slightly expands the server's scope, but it is still a single coherent integration point.

Completeness4/5

The dataset and geography domains have solid search/get coverage for their core entities, and INSEE identifiers map directly to legal units and establishments. Missing search-by-name for INSEE and some administrative geography depth (e.g., arrondissements) are minor gaps for a read-only public-data server.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables interaction with Datagouv APIs, primarily allowing users to search for up-to-date information about companies registered in France.
    11
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for accessing Strasbourg Open Data (data.strasbourg.eu). Allows searching datasets, retrieving metadata, and querying records with ODSQL.
    2 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for querying and exploring Issy-les-Moulineaux open data datasets (city services, mobility, environment) via OpenDataSoft API.
    3 npm
    MIT