荷兰开放数据MCP服务器

一个用于访问荷兰政府开放数据的模型上下文协议(MCP)服务器,支持浏览、查询和分析4800多个CBS数据集。

  • by soulnai
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 soulnai/nl-opendata-mcp

使用说明

NL OpenData MCP服务器

全面 模型上下文协议(MCP) 用于访问荷兰政府公开数据的服务器 CBS(中央统计局) 和 数据.政府.nl.

这是一个小型的附带项目,旨在试验MCP,看看它是否有助于访问荷兰政府的开放数据。 它还没有准备好生产,不应该用于生产。

我用Claude Desktop和LM Studio测试过它,它运行得很好。它应该适用于大多数MCP客户端。 结果始终取决于您使用的模型的质量。前沿模型很好地理解数据和mcp工具,并产生了良好的结果。本地模型可能无法理解工具调用并产生意外结果。

对于局部模型,我使用Devstral2小模型获得了最佳结果,gpt-oss 20b紧随其后。上下文长度是局部模型的一个非常有限的因素。Yo需要至少30000个令牌上下文长度才能进行基本分析。


✨ 特征

  • 📊 访问4800+CBS数据集 -浏览和查询人口、经济、健康、环境等统计数据
  • 🔍 智能搜索 -使用本地缓存按标题、摘要或两者搜索数据集,以获得快速结果
  • 📥 灵活的数据获取 -查询、过滤和下载CSV或Parquet格式的数据集
  • 🐍 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_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

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(dataset_id="85313NED", fetch_all=True)    # Save full dataset to CSV
3. cbs_analyze_local_dataset(...)                            # Analyze locally with Pandas

工作流程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

📁 输出格式

格式 用例
逗号分隔值 通用兼容性,适用于Excel、Pandas等。

🔗 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

📚 资源