datagouv-mcp
让AI助手通过MCP协议实时查询法国50,000+政府开放数据集的工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
让AI助手通过MCP协议实时查询法国50,000+政府开放数据集的工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有没有过这种体验:问 AI 一个需要实时数据的问题,它要么一本正经地胡说八道,要么一脸茫然地说"我的知识截止到..."?这背后有一个根本矛盾——大模型的知识是"快照",而真实世界的数据每分每秒都在变化。
datagouv-mcp 解决的就是这个问题。它是一个基于 Model Context Protocol(MCP)的服务器,由法国国家开放数据门户 data.gouv.fr 官方维护,作用是让 AI 助手(如 Claude、ChatGPT、Cursor 等)能够实时查询、分析法国政府的公共数据集。简单来说,它是一把通往真实世界数据的「API 钥匙」,AI 不再靠记忆回答问题,而是真正去数据源抓答案。
打个比方:如果传统 AI 像是靠背诵地图集回答地理问题,那么 datagouv-mcp 就是给 AI 装上了 GPS,让它随时查阅实时路况。
data.gouv.fr 是法国的国家级开放数据平台,由 Etalab(法国政府数字化转型部门)运营,类似于中国的「国家数据共享交换平台」与「开放云」的结合体。平台收录的数据涵盖:
平台目前收录了数万个数据集(datasets),每个数据集下又包含多个资源文件(resources),格式涵盖 CSV、JSON、GeoJSON、XML、PDF 等。
datagouv-mcp 基于 Model Context Protocol(MCP) 构建。MCP 是 Anthropic 主导提出的开放协议,旨在标准化 AI 助手与外部工具之间的交互方式。在 MCP 框架下,服务器提供一组「工具」(Tools),AI 模型根据用户指令选择调用哪些工具,并接收结构化的返回结果。
这和传统的 Function Calling 有什么区别?Function Calling 是各家厂商各自为政,MCP 则是一套通用标准。一旦某个 MCP 服务器实现了接入,你的 Claude Desktop 可以用,Cursor 可以用,ChatGPT 也可以用——工具只需要实现一次。
项目采用 mcp/server/fastmcp 框架作为服务端核心,这是一个构建在 ASGI 之上的轻量级 MCP 服务器框架。相比直接实现 MCP 协议的低层细节,FastMCP 提供了工具注册、中间件管理、健康检查等开箱即用的能力。
服务端整体架构如下:
用户请求(自然语言)
↓
MCP 客户端(Claude/Cursor 等)
↓ MCP 协议(JSON-RPC over HTTP/SSE)
FastMCP 服务器(main.py)
↓
工具注册层(tools/__init__.py)
↓
API 客户端层(helpers/datagouv_api_client.py)
↓
data.gouv.fr REST API
所有外部 API 调用(data.gouv.fr、Metrics、Tabular 等)均基于 httpx.AsyncClient 实现异步 HTTP 请求。这意味着即使需要同时查询多个数据集,服务端也能以非阻塞方式并发处理,效率远高于同步阻塞方案。
项目在 tools/ 目录下实现了 10 个 MCP 工具,覆盖了从搜索到深度分析的全链路:
| 工具名 | 功能 | 典型场景 |
|---|---|---|
search_datasets | 关键词搜索数据集 | "帮我找房价相关的数据" |
search_organizations | 搜索数据发布机构 | "找 INSEE 发布的数据" |
search_dataservices | 搜索 API 类数据服务 | "找可编程访问的地理数据" |
get_dataservice_info | 获取数据服务的元信息 | 查看某 API 的接入说明 |
get_dataservice_openapi_spec | 获取 OpenAPI 规范 | 了解某 API 的接口定义 |
get_dataset_info | 获取数据集详情 | 查看某数据集的完整描述 |
list_dataset_resources | 列出数据集下的资源文件 | 查看某数据集有哪些 CSV/JSON |
get_resource_info | 获取资源文件信息 | 查看某文件的大小、格式、更新频率 |
query_resource_data | 查询资源实际数据 | 读取 CSV/表格数据内容 |
get_metrics | 获取使用统计指标 | 了解某数据集的访问热度 |
其中 query_resource_data 是最核心的工具——它可以读取 CSV、Excel 等结构化数据并返回给 AI,AI 拿到真实数据后才能做统计分析、趋势预测等高级操作。
一个很细节但很有价值的设计在 tools/search_datasets.py 中:clean_search_query 函数会自动移除用户查询中的「停用词」。
这是因为 data.gouv.fr 的搜索 API 采用严格的 AND 逻辑检索,用户随口说的"给我找一些数据文件"中的"数据"(données)、"文件"(fichiers)这些词实际上不会出现在元数据中,但会严重干扰搜索结果。datagouv-mcp 会自动清理这些噪声词,避免用户搜出零结果。
helpers/ 目录下有两个关键 API 客户端:
datagouv_api_client.py(约 15KB):封装了 data.gouv.fr 的 v1/v2 API,包括数据集搜索、资源元数据获取、数据服务查询等核心功能。这是所有工具的底层依赖。
tabular_api_client.py(约 7KB):专门处理表格类数据的读取。data.gouv.fr 提供了一个专门的 Tabular API 来统一读取 CSV、Excel 等格式的数据文件,客户端负责处理数据解析、类型推断和错误重试。
crawler_api_client.py:用于处理爬虫类数据请求,封装了爬虫端到端的数据拉取逻辑。
main.py 中配置了严格的 TransportSecuritySettings:
enable_dns_rebinding_protection=True:防止 DNS 重绑定攻击allowed_hosts 白名单:仅允许 mcp.data.gouv.fr、localhost 等指定域名连接allowed_origins 白名单:验证 HTTP Origin 头,阻止跨站请求这是 MCP 协议 1.23+ 版本的安全强制的标准配置,体现了项目对生产安全的重视。
FastMCP(..., stateless_http=True) 是一个务实的选择。很多 MCP 客户端(Claude Code、Cline、OpenAI Codex)在某些场景下无法正确维护 mcp-session-id 头,导致有状态模式下出现"Session not found"错误。切换为无状态模式后,服务端不再依赖 session 状态,服务端也可以做水平扩展——代价是无法使用服务器主动发起的通知(notifications),但 datagouv-mcp 本身不需要这个能力。
集成了 Sentry SDK 用于生产环境错误追踪,集成 Matomo 用于访问统计分析。这两者的配置均支持通过环境变量注入,生产部署时无需修改代码即可开启监控。
这是 datagouv-mcp 做得非常好的地方:部署极其简单。
无需任何安装,直接配置你的 AI 客户端连接 https://mcp.data.gouv.fr/mcp 即可。项目 README 中详细列出了在 AnythingLLM、ChatGPT、Claude Desktop、Cursor、Windsurf、VS Code 等主流工具中的配置方法,每个平台都有傻瓜式步骤说明。
git clone https://github.com/datagouv/datagouv-mcp.git
cd datagouv-mcp
docker compose up -d
一条命令即可启动服务。docker-compose.yml 配置了健康检查(/health 端点)、环境变量注入(MCP_HOST、MCP_PORT、DATAGOUV_API_ENV)、以及 restart: unless-stopped,生产可用。
项目使用 uv 作为包管理器(pyproject.toml + uv.lock),Python 版本要求 3.13:
git clone https://github.com/datagouv/datagouv-mcp.git
cd datagouv-mcp
uv sync --frozen
uv run python main.py
依赖只有 4 个核心包:httpx(HTTP 客户端)、mcp(MCP 协议框架)、pyyaml(配置解析)、sentry-sdk(错误追踪),非常轻量。
硬件需求:无 GPU 要求,512MB RAM + 200MB 磁盘即可流畅运行。
项目在 tests/ 目录下有 12 个测试文件,覆盖了所有 API 客户端、工具函数和环境配置。测试框架使用 pytest + pytest-asyncio + pytest-httpx,异步测试支持良好。
CircleCI 流水线配置在 .circleci/config.yml,但注意 README 中标注了"stress"和"health_check"两类测试默认跳过,需要服务运行才能执行——这意味着 CI 中实际上并未完整覆盖这些场景,是一个小遗憾。
代码质量工具:使用 ruff 做 linting,配置了 isort 风格的 import 排序检查,在 pre-commit 中配置了自动格式化。
局限一:Python 3.13 要求——一个过于超前的选择
项目 requires-python = ">=3.13,<3.15",但 Python 3.13 于 2024 年 10 月发布,当前(2026 年)仍属较新版本。很多生产环境的 Python 运行时还停留在 3.10-3.12,这个版本要求意味着大多数开发者需要额外安装环境,或者在 Docker 内运行。这增加了使用门槛。
局限二:仅支持法国数据
这是设计选择而非缺陷,但值得明确:datagouv-mcp 接入的只是法国政府的开放数据平台。如果你的应用场景需要多国数据,需要部署多个 MCP 服务器(各国通常都有对应的开放数据门户)。
局限三:依赖 data.gouv.fr API 的可用性
所有查询最终都依赖 data.gouv.fr 的后端 API,若该平台出现故障或限流,MCP 服务也会受到影响。项目中没有实现缓存层(Redis 等),频繁查询相同数据时会重复请求上游。
datagouv-mcp 背后反映了一个更大的趋势:AI 应用正在从「知识检索」走向「实时数据查询」。
传统 RAG(检索增强生成)解决的是知识新鲜度问题,但 datagouv-mcp 解决的是更深层的问题:AI 能不能直接操作数据库级别的结构化数据?答案是「能」,前提是有人把这条路铺好。
法国政府开放数据 + MCP 协议这个组合非常有价值。它意味着:
这个模式可以复制到任何有开放数据 API 的国家——英国、加拿大、德国、欧盟都有自己的 open data portal,datagouv-mcp 作为先行者,证明了这条路是走得通的。