NL OpenData MCP服务器
全面 模型上下文协议(MCP) 用于访问荷兰政府公开数据的服务器 CBS(中央统计局) 和 数据.政府.nl.
这是一个小型的附带项目,旨在试验MCP,看看它是否有助于访问荷兰政府的开放数据。 它还没有准备好生产,不应该用于生产。
我用Claude Desktop和LM Studio测试过它,它运行得很好。它应该适用于大多数MCP客户端。 结果始终取决于您使用的模型的质量。前沿模型很好地理解数据和mcp工具,并产生了良好的结果。本地模型可能无法理解工具调用并产生意外结果。
对于局部模型,我使用Devstral2小模型获得了最佳结果,gpt-oss 20b紧随其后。上下文长度是局部模型的一个非常有限的因素。Yo需要至少30000个令牌上下文长度才能进行基本分析。
______________________________________________________________________
✨ 特性
- 📊 访问4800+CBS数据集 -浏览和查询人口、经济、健康、环境等统计数据
- 🔍 智能搜索 -使用本地缓存按标题、摘要或两者搜索数据集,以获得快速结果
- 📥 灵活的数据获取 -查询、过滤和下载CSV或Parquet格式的数据集
- 🦆 DuckDB集成 -将数据集直接保存到DuckDB,以实现高效的SQL查询
- 🐍 Python分析 -直接在数据集上执行Pandas代码,无需下载
- 🗂️ 双源支持 -检查CBS OData和data.overheid.nl的可用性
______________________________________________________________________
📦 安装
使用uvx(推荐)
# Run directly from PyPI
uvx nl-opendata-mcp
# Or run directly from GitHub
uvx --from git+https://github.com/soulnai/nl-opendata-mcp.git nl-opendata-mcp用pip/uv安装
# Install from PyPI
uv pip install nl-opendata-mcp
# Install from GitHub
uv pip install git+https://github.com/soulnai/nl-opendata-mcp.git来源(发展)
# Clone the repository
git clone https://github.com/soulnai/nl-opendata-mcp.git
cd nl-opendata-mcp
# Install dependencies and package in editable mode
uv sync
uv pip install -e .
# Run the server
uv run nl-opendata-mcp______________________________________________________________________
🔧 配置
克劳德桌面
添加到您的Claude Desktop配置(claude_desktop_config.json):
{
"mcpServers": {
"nl-opendata-mcp": {
"command": "uvx",
"args": ["nl-opendata-mcp"]
}
}
}LM 工作室
添加到LM Studio配置(mcp.json):
{
"mcpServers": {
"nl-opendata-mcp": {
"command": "uvx",
"args": ["nl-opendata-mcp"]
}
}
}使用环境变量
服务器支持不同的传输模式:
# Default: stdio transport
uvx nl-opendata-mcp
# HTTP transport (port 8000)
TRANSPORT=http uvx nl-opendata-mcp
# SSE transport (port 8000)
TRANSPORT=sse uvx nl-opendata-mcp______________________________________________________________________
🛠️ 可用工具
发现工具
| 工具 | 说明 |
|---|---|
cbs_list_datasets | 列出CBS目录中的可用数据集 |
cbs_search_datasets | 按关键字搜索数据集(在标题、摘要或两者中) |
cbs_check_dataset_availability | 检查数据集是否可通过CBS OData或data.overheid.nl获得 |
cbs_estimate_dataset_size | 在获取之前估计数据集大小(行、列、推荐策略) |
cbs_inspect_dataset_details | 获取全面的数据集摘要(元数据、结构、示例数据) |
元数据工具
| 工具 | 说明 |
|---|---|
cbs_get_metadata | 统一元数据工具-获取信息、结构、维度值或自定义端点 |
cbs_get_metadata 类型:
metadata_type="info"-数据集描述(表信息)metadata_type="structure"-列定义和数据类型(DataProperty)metadata_type="endpoints"-可用元数据端点metadata_type="dimensions"-带有过滤代码的维度值(需要endpoint_name)metadata_type="custom"-查询自定义终结点(需要endpoint_name)
数据获取工具
| 工具 | 说明 |
|---|---|
cbs_query_dataset | 通过过滤和列选择查询数据 |
cbs_save_dataset | 将数据集保存到CSV(使用 fetch_all=True 完整数据集) |
cbs_save_dataset_to_duckdb | 将数据集保存到DuckDB以进行SQL查询 |
分析工具(默认禁用)
| 工具 | 说明 |
|---|---|
cbs_analyze_remote_dataset | 在远程数据集上执行Python/Pandas代码 |
cbs_analyze_local_dataset | 在本地CSV文件上执行Python/Pandas代码 |
______________________________________________________________________
📖 使用示例
1.发现数据集
列出可用数据集:
Use cbs_list_datasets with top=20 to see the first 20 datasets搜索人口数据:
Use cbs_search_datasets with query="bevolking" to find population datasets仅在标题中搜索:
Use cbs_search_datasets with query="inflatie" and search_field="title"______________________________________________________________________
2.探索数据集
获取全面概述(建议的第一步):
Use cbs_inspect_dataset_details with dataset_id="85313NED"
# Returns:
# - Source confirmation (CBS OData or data.overheid.nl)
# - Title and description
# - Column definitions with types
# - Sample data (first 5 rows)在获取之前检查数据集大小:
Use cbs_estimate_dataset_size with dataset_id="85313NED"
# Returns:
# - Estimated row count
# - Column count
# - Recommended fetch strategy获取详细的列结构:
Use cbs_get_metadata with dataset_id="85313NED" and metadata_type="structure"
# Returns CSV with: Key, Type, Title, Description for each column______________________________________________________________________
3.查询数据
带分页的基本查询:
Use cbs_query_dataset with:
- dataset_id="85313NED"
- top=100
- skip=0使用OData筛选器进行查询:
Use cbs_query_dataset with:
- dataset_id="85313NED"
- filter="Perioden eq '2023JJ00'"
- top=50选择特定列:
Use cbs_query_dataset with:
- dataset_id="85313NED"
- select=["Perioden", "TotaleBevolking_1", "Mannen_2", "Vrouwen_3"]
- top=100多条件查询:
Use cbs_query_dataset with:
- dataset_id="85313NED"
- filter="Perioden eq '2023JJ00' and Leeftijd eq '10000'"______________________________________________________________________
4.下载完整数据集
将完整数据集保存到CSV:
Use cbs_save_dataset with:
- dataset_id="85313NED"
- file_name="population_data.csv"
- fetch_all=true保存到DuckDB进行SQL分析(支持列选择):
Use cbs_save_dataset_to_duckdb with:
- dataset_id="85313NED"
- table_name="population"
- fetch_all=true
# Creates datasets.db with table 'population'______________________________________________________________________
5.分析数据
注意:默认情况下,分析工具处于禁用状态。要启用它们,请设置 USE_PYTHON_ANALYSIS=true 在环境中。让模型在客户端机器上编写和执行Python代码存在安全风险。仅建议高级用户使用。最好让模型查询并将数据保存到文件中,并让您的CLI LLM编码工具通过编写和执行脚本来分析它。如果您在非CLI环境(如LM Studio)中运行它,并且仍然希望赋予它分析数据的能力,则可以通过设置来启用它 USE_PYTHON_ANALYSIS=true 在环境中。
使用Pandas分析远程数据集:
Use cbs_analyze_remote_dataset with:
- dataset_id="85313NED"
- analysis_code="print(df.describe())"统计计算:
Use cbs_analyze_remote_dataset with:
- dataset_id="85313NED"
- analysis_code="result = df['TotaleBevolking_1'].mean()"过滤器和骨料:
Use cbs_analyze_remote_dataset with:
- dataset_id="85313NED"
- analysis_code="""
filtered = df[df['Perioden'].str.contains('2023')]
result = filtered.groupby('Leeftijd')['TotaleBevolking_1'].sum()
print(result)
"""分析本地CSV文件:
Use cbs_analyze_local_dataset with:
- dataset_path="downloads/85313NED_full.csv"
- analysis_code="print(df.info())"______________________________________________________________________
6.使用元数据
获取分类代码(例如,性别类别):
Use cbs_get_metadata with:
- dataset_id="85313NED"
- metadata_type="dimensions"
- endpoint_name="Geslacht"获取时间段定义:
Use cbs_get_metadata with:
- dataset_id="85313NED"
- metadata_type="dimensions"
- endpoint_name="Perioden"______________________________________________________________________
🎯 常见工作流
工作流程1:快速数据探索
1. cbs_search_datasets(query="unemployment") # Find relevant datasets
2. cbs_inspect_dataset_details(dataset_id="82809NED") # Get overview
3. cbs_query_dataset(dataset_id="82809NED", top=10) # Preview data工作流程2:完整数据集分析
1. cbs_estimate_dataset_size(dataset_id="85313NED") # Check size
2. cbs_save_dataset_to_duckdb(dataset_id="85313NED") # Save to DuckDB
3. Query using DuckDB CLI or cbs_analyze_local_dataset工作流程3:筛选数据导出
1. cbs_get_metadata(dataset_id="85313NED", metadata_type="structure") # Get column names
2. cbs_get_metadata(dataset_id="85313NED", metadata_type="dimensions", endpoint_name="Perioden") # Get period codes
3. cbs_query_dataset(dataset_id="85313NED", filter="Perioden eq '2023JJ00'", select=["..."]) # Query
4. cbs_save_dataset(dataset_id="85313NED", file_name="filtered_data.csv") # Export______________________________________________________________________
📁 输出格式
| 格式 | 用例 |
|---|---|
| CSV文件 | 通用兼容性,适用于Excel、Pandas等。 |
| DuckDB | SQL查询,跨多个数据集连接 |
______________________________________________________________________
🔗 OData筛选器示例
CBS OData API使用OData v3语法进行筛选:
# Exact match
Perioden eq '2023JJ00'
# Substring match
substringof('Amsterdam', RegioS)
# Multiple conditions
Perioden eq '2023JJ00' and Leeftijd eq '10000'
# OR conditions
Geslacht eq '1100' or Geslacht eq '2000'
# Numeric comparisons
TotaleBevolking_1 gt 100000______________________________________________________________________
📚 资源
______________________________________________________________________
