返回市场
mcp数据政府我的

mcp数据政府我的

作者:hithereiamaliff2 星标更新:2025-09-11

项目介绍

马来西亚开放数据 MCP

smithery 徽章

MCP (模型上下文协议) 服务器用于马来西亚的开放数据 API,提供对政府数据集和集合的便捷访问。

请注意,这不是由马来西亚政府或马来西亚开放数据/Jabatan Digital Negara/数字部官方提供的 MCP 服务器。

功能

  • 增强统一搜索,支持灵活的分词和同义词扩展
    • 智能查询处理,包括词项规范化
    • 支持复数和常见前缀(例如,“epayment”中的“e”)
    • 不同数据类型的智能优先级排序
  • Parquet 文件支持,使用纯 JavaScript
    • 直接在浏览器或 Node.js 中解析 Parquet 文件
    • 支持 BROTLI 压缩
    • 对空日期对象进行智能日期字段处理
    • 提高行限制(最多 500 行)以全面检索数据
    • 解析失败时回退到元数据估算
    • 自动映射仪表板 URL 以进行可视化
  • 混合数据访问架构
    • 预生成静态索引以实现高效搜索
    • 动态 API 调用以获取详细元数据
  • 多提供商地理编码
    • 支持 Google 地图、GrabMaps 和 Nominatim(OpenStreetMap)
    • 根据位置和可用 API 密钥智能选择服务
    • 对马来西亚地区的 GrabMaps 进行优化
    • 提供商之间的自动回退
  • 综合数据源
    • 马来西亚的数据目录,具有丰富的元数据
    • 数据可视化交互式仪表板
    • 马来西亚统计局(DOSM)数据
    • 天气预报和警告
    • 公共交通和 GTFS 数据
  • 多提供商马来西亚地理编码
    • 优化针对马来西亚地址和位置
    • 三级地理编码系统:GrabMaps、Google 地图和 Nominatim
    • 优先使用本地知识的 GrabMaps 以获得更好的马来西亚覆盖
    • 在未提供 API 密钥时自动回退到 Nominatim

架构

此 MCP 服务器采用混合方法以实现高效数据访问:

  • 预生成静态索引用于列出和搜索数据集和仪表板
  • 动态 API 调用仅当请求特定数据集或仪表板详情时

这种方法提供了以下好处:

  • 更快的搜索和列出操作
  • 减少对外部服务的 API 调用
  • 一致的数据访问模式
  • 当需要时提供最新的详细信息

文档

  • TOOLS.md - 关于可用工具和最佳实践的详细信息
  • PROMPT.md - AI 集成指南和使用模式

AI 集成

在将此 MCP 服务器与 AI 模型集成时:

  1. 首先使用统一搜索工具 - 对于任何数据查询,请始终从 search_all 开始
  2. 遵循正确的 URL 模式 - 使用 https://data.gov.my/...https://open.dosm.gov.my/...
  3. 利用 Parquet 文件工具 - 使用 parse_parquet_file 直接访问数据或使用 get_parquet_info 获取元数据
  4. 使用混合方法 - 静态索引用于列出/搜索,API 调用用于详细信息
  5. 考虑仪表板可视化 - 对于复杂数据,使用 find_dashboard_for_parquet 提供的仪表板链接
  6. 利用多提供商马来西亚地理编码 - 对于马来西亚位置查询,系统会自动选择最佳提供商(GrabMaps、Google 地图或 Nominatim),并在未配置 API 密钥时回退到 Nominatim

参考 PROMPT.md 获取全面的 AI 集成指南。

安装

npm install

开发

要在开发模式下运行 MCP 服务器:

npx @smithery/cli dev

构建

要构建 MCP 服务器以部署:

npx @smithery/cli build

部署

此 MCP 设计为部署到 Smithery。请按照以下步骤进行部署:

  1. 确保已安装 Smithery CLI:

    npm install -g @smithery/cli
    
  2. 构建项目:

    npx @smithery/cli build
    
  3. 部署到 Smithery:

    npx @smithery/cli deploy
    

可用工具

数据目录

  • list_datasets:列出数据目录中的可用数据集
  • get_dataset:从数据目录中获取特定数据集的数据
  • search_datasets:在数据目录中搜索数据集

马来西亚统计局(DOSM)

  • list_dosm_datasets:列出 DOSM 的可用数据集
  • get_dosm_dataset:从特定 DOSM 数据集中获取数据

Parquet 文件处理

  • parse_parquet_file:解析并显示来自 Parquet 文件 URL 的数据
    • 支持最多 500 行以进行全面数据分析
    • 自动处理空日期对象并适当格式化
    • 处理 BigInt 值以进行适当的 JSON 序列化
  • get_parquet_info:获取有关 Parquet 文件的元数据和结构信息
  • find_dashboard_for_parquet:查找对应于 Parquet 文件的仪表板 URL

天气

  • get_weather_forecast:获取马来西亚的天气预报
  • get_weather_warnings:获取马来西亚当前的天气警告
  • get_earthquake_warnings:获取马来西亚的地震警告

交通

  • list_transport_agencies:列出具有 GTFS 数据的可用交通机构
  • get_transport_data:获取特定交通机构的 GTFS 数据

GTFS 解析

  • parse_gtfs_static:解析特定交通提供商的 GTFS 静态数据(包含 CSV 数据的 ZIP 文件)
  • parse_gtfs_realtime:解析特定交通提供商的 GTFS 实时数据(Protocol Buffer 格式的车辆位置)
  • get_transit_routes:从 GTFS 数据中提取路线信息
  • get_transit_stops:从 GTFS 数据中提取站点信息,可选地按路线过滤

测试

  • hello:一个简单的测试工具,验证 MCP 服务器是否正常工作

数据目录信息检索

MCP 服务器提供了强大的数据目录信息检索处理:

Parquet 文件中的日期处理

  • 空日期对象:系统自动检测并处理 Parquet 文件中的空日期对象
  • 特定数据集处理:对已知数据集如 employment_sector 进行特殊处理,该数据集包含从 2001 年到 2022 年的年度数据
  • 模式识别:检测现有数据中的日期模式以保持一致的格式
  • 增加行限制:支持最多 500 行(从 100 行增加)以进行全面数据分析

BigInt 处理

  • 自动序列化:BigInt 值自动转换为字符串以进行适当的 JSON 序列化
  • 类型保留:原始类型在模式信息中得到保留

模式检测

  • 自动类型推断:检测列类型,包括对日期字段的特殊处理
  • 一致表示:确保日期字段始终作为字符串表示

使用示例

获取天气预报

const result = await tools.get_weather_forecast({
  location: "吉隆坡",
  days: 3
});

搜索数据集

const result = await tools.search_datasets({
  query: "人口",
  limit: 5
});

解析 GTFS 数据

// 解析 GTFS 静态数据
const staticData = await tools.parse_gtfs_static({
  provider: "ktmb"
});

// 获取实时车辆位置
const realtimeData = await tools.parse_gtfs_realtime({
  provider: "prasarana",
  category: "rapid-rail-kl"
});

// 获取路线信息
const routes = await tools.get_transit_routes({
  provider: "mybas-johor"
});

// 获取特定路线的站点
const stops = await tools.get_transit_stops({
  provider: "prasarana",
  category: "rapid-rail-kl",
  route_id: "LRT-KJ"
});

API 速率限制

请注意底层 API 的速率限制。过多的请求可能会被节流。

项目结构

  • src/index.ts:主要的 MCP 服务器实现和工具注册
  • src/datacatalogue.tools.ts:数据目录 API 工具
  • src/dashboards.tools.ts:仪表板访问和搜索工具
  • src/dosm.tools.ts:马来西亚统计局工具
  • src/unified-search.tools.ts:增强的统一搜索,支持分词和同义词扩展
  • src/parquet.tools.ts:Parquet 文件解析和元数据工具
  • src/weather.tools.ts:天气预报和警告工具
  • src/transport.tools.ts:交通和 GTFS 数据工具
  • src/gtfs.tools.ts:GTFS 解析和分析工具
  • src/flood.tools.ts:洪水预警和监控工具
  • Dockerfile:Smithery 的 Docker 配置
  • smithery.yaml:Smithery 配置
  • package.json:项目依赖和脚本
  • tsconfig.json:TypeScript 配置

本地测试

在部署到 Smithery 之前进行本地测试:

# 启动开发服务器
npm run dev

# 或构建并运行生产版本
npm run build
npm start

# 在另一个终端中测试 hello 工具
curl -X POST http://localhost:8182/invoke/hello -H "Content-Type: application/json" -d "{}"

您也可以使用 Smithery CLI 进行本地开发:

# 在开发模式下运行
npx @smithery/cli dev

# 构建生产版本
npx @smithery/cli build

故障排除

部署问题

如果遇到部署问题:

  1. 确保您的 GitHub 存储库是公开的或正确连接到 Smithery
  2. 验证您的 Dockerfilesmithery.yaml 是否位于存储库根目录
  3. 检查 index.js 文件是否导出有效的 MCP 服务器函数

配置

环境变量

此项目支持以下配置选项:

地理编码凭证(可选。仅适用于 GTFS 交通功能使用)

以下凭证仅在计划使用需要地理编码服务的 GTFS 交通工具时才需要。其他功能如数据目录访问、天气预报和 DOSM 数据不需要这些凭证。

  • googleMapsApiKey:可选。如果提供,系统将使用 Google 地图 API 将地点名称转换为坐标。
  • grabMapsApiKey:可选。对于 GrabMaps 地理编码,需要此密钥,该密钥针对马来西亚地区进行了优化。
  • awsAccessKeyId:对于 GrabMaps 集成,需要此 AWS 访问密钥进行 GrabMaps API 身份验证。
  • awsSecretAccessKey:对于 GrabMaps 集成,需要此 AWS 秘密密钥进行 GrabMaps API 身份验证。
  • awsRegion:对于 GrabMaps 集成,需要此 AWS 区域(例如,'ap-southeast-5' 用于马来西亚区域或 ap-southeast-1 用于新加坡区域)。

如果未提供 Google 地图或 GrabMaps API 密钥,GTFS 交通工具将自动回退到使用 Nominatim(OpenStreetMap)API 进行地理编码,该 API 是免费且不需要凭证的。

您可以通过以下两种方式设置这些配置选项:

  1. 通过 Smithery 的配置界面连接到 MCP 服务器时
  2. 作为环境变量(GOOGLE_MAPS_API_KEY, GRAB_MAPS_API_KEY)进行本地开发

设置环境变量

对于本地开发

项目使用 dotenv 在开发期间从 .env 文件加载环境变量。

  1. 在根目录创建一个 .env 文件,内容如下:
GOOGLE_MAPS_API_KEY=your_google_api_key_here
GRAB_MAPS_API_KEY=your_grab_api_key_here
AWS_ACCESS_KEY_ID=your_aws_access_key_for_grabmaps
AWS_SECRET_ACCESS_KEY=your_aws_secret_key_for_grabmaps
AWS_REGION=ap-southeast-5 # 马来西亚区域或 ap-southeast-1 # 新加坡区域
  1. 当您使用 npm run dev 本地运行服务器时,这些变量将自动加载

对于 Smithery 部署

通过 Smithery 连接到您的 MCP 服务器时:

  1. 单击“连接马来西亚开放数据 MCP 服务器”
  2. 您将看到以下配置选项:
    • googleMapsApiKey - Google 地图 API 密钥
    • grabMapsApiKey - GrabMaps API 密钥
    • awsAccessKeyId - GrabMaps 的 AWS 访问密钥
    • awsSecretAccessKey - GrabMaps 的 AWS 秘密密钥
    • awsRegion - GrabMaps 的 AWS 区域(例如 ap-southeast-5 用于马来西亚区域或 ap-southeast-1 用于新加坡区域)
  3. 在这些字段中输入您的 API 密钥和 AWS 凭证
  4. 单击“获取链接”以生成您的连接 URL

API 密钥将在连接过程中安全传递给服务器。

注意:对于马来西亚位置,GrabMaps 提供最准确的地理编码结果,其次是 Google 地图,两者都需要 API 密钥。如果您不提供任一 API 密钥,系统将自动使用 Nominatim API,该 API 是免费的但可能对马来西亚某些位置的结果不太准确。

重要:这些地理编码凭证仅适用于以下 GTFS 交通工具:

  • get_transit_routes - 当将地点名称转换为坐标时
  • get_transit_stops - 当将地点名称转换为坐标时
  • parse_gtfs_static - 当需要对站点位置进行地理编码时

关于 GTFS 实时工具的注意事项parse_gtfs_realtime 工具目前处于开发阶段,可用性有限。通过此 MCP 访问实时数据是实验性的,可能并非所有提供商或路线都可用。对于最新列车和公交车时刻表、公交车位置和实时到达情况,请使用官方交通应用如 Google 地图、MyRapid PULSE、Moovit 或 Lugo。

所有其他工具如数据目录访问、仪表板搜索、天气预报和 DOSM 数据都不需要任何地理编码凭证。

许可证

MIT - 详情见 LICENSE 文件。

致谢