🚀 马来西亚开放数据MCP
马来西亚开放数据MCP(Model Context Protocol)服务器,为马来西亚开放数据API提供服务,可便捷访问政府数据集和集合。
请注意,这并非由马来西亚政府或马来西亚开放数据、数字部、数字事务部团队的任何人运营的官方MCP服务器。
🚀 快速开始
安装
npm install
开发模式运行
npx @smithery/cli dev
构建部署版本
npx @smithery/cli build
部署
此MCP设计为部署到Smithery,按以下步骤操作:
- 确保已安装Smithery CLI:
npm install -g @smithery/cli
- 构建项目:
npx @smithery/cli build
- 部署到Smithery:
npx @smithery/cli deploy
本地测试
在部署到Smithery之前进行本地测试:
npm run dev
npm run build
npm start
curl -X POST http://localhost:8182/invoke/hello -H "Content-Type: application/json" -d "{}"
也可以使用Smithery CLI进行本地开发:
npx @smithery/cli dev
npx @smithery/cli build
✨ 主要特性
- 增强的统一搜索:具备灵活的分词和同义词扩展功能
- 智能查询处理,可进行术语规范化
- 支持复数形式和常见前缀(如 “epayment” 中的 “e”)
- 针对不同数据类型进行智能优先级排序
- 纯JavaScript支持Parquet文件
- 可在浏览器或Node.js中直接解析Parquet文件
- 支持BROTLI压缩
- 解析失败时可回退到元数据估算
- 自动映射仪表板URL以进行可视化
- 混合数据访问架构
- 预先生成静态索引,实现高效搜索
- 动态API调用,获取详细元数据
- 多提供商地理编码
- 支持Google Maps、GrabMaps和Nominatim(OpenStreetMap)
- 根据位置和可用API密钥智能选择服务
- 针对马来西亚境内位置优化GrabMaps
- 提供商之间自动回退
- 全面的数据源
- 包含丰富元数据的马来西亚数据目录
- 用于数据可视化的交互式仪表板
- 马来西亚统计局(DOSM)数据
- 天气预报和预警
- 公共交通和GTFS数据
- 多提供商马来西亚地理编码
- 针对马来西亚地址和位置进行优化
- 三层地理编码系统:GrabMaps、Google Maps和Nominatim
- 优先使用GrabMaps以更好地覆盖马来西亚地区
- 未提供API密钥时自动回退到Nominatim
🔧 技术细节
此MCP服务器采用混合方法实现高效数据访问:
- 预先生成静态索引:用于列出和搜索数据集及仪表板
- 动态API调用:仅在请求特定数据集或仪表板详细信息时使用
这种方法带来以下好处:
- 更快的搜索和列表操作
- 减少对外部服务的API调用
- 一致的数据访问模式
- 需要时获取最新的详细信息
📚 详细文档
- TOOLS.md - 可用工具的详细信息和最佳实践
- PROMPT.md - AI集成指南和使用模式
📦 安装指南
依赖安装
npm install
开发环境
npx @smithery/cli dev
生产环境构建
npx @smithery/cli build
部署到Smithery
- 安装Smithery CLI:
npm install -g @smithery/cli
- 构建项目:
npx @smithery/cli build
- 部署:
npx @smithery/cli deploy
💻 使用示例
基础用法
获取天气预报
const result = await tools.get_weather_forecast({
location: "Kuala Lumpur",
days: 3
});
搜索数据集
const result = await tools.search_datasets({
query: "population",
limit: 5
});
高级用法
解析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"
});
📄 许可证
本项目采用MIT许可证,详情请参阅 LICENSE 文件。
🔧 可用工具
数据目录
list_datasets
:列出数据目录中的可用数据集
get_dataset
:获取数据目录中特定数据集的数据
search_datasets
:在数据目录中搜索数据集
马来西亚统计局(DOSM)
list_dosm_datasets
:列出DOSM的可用数据集
get_dosm_dataset
:获取特定DOSM数据集的数据
Parquet文件处理
parse_parquet_file
:解析并显示Parquet文件URL中的数据
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实时数据(协议缓冲区格式)
get_transit_routes
:从GTFS数据中提取路线信息
get_transit_stops
:从GTFS数据中提取站点信息,可根据路线进行过滤
测试
hello
:一个简单的测试工具,用于验证MCP服务器是否正常工作
⚙️ 配置
环境变量
本项目支持以下配置选项:
地理编码凭证(可选,仅在使用GTFS公交功能时需要):
以下凭证仅在计划使用需要地理编码服务的GTFS公交工具时需要。其他功能,如数据目录访问、天气预报和DOSM数据,不需要这些凭证。
- googleMapsApiKey:可选。如果提供,系统将使用Google Maps API将位置名称转换为坐标。
- grabMapsApiKey:可选。使用GrabMaps地理编码服务需要此凭证,该服务针对马来西亚境内位置进行了优化。
- awsAccessKeyId:使用GrabMaps集成时必需。用于GrabMaps API认证的AWS访问密钥。
- awsSecretAccessKey:使用GrabMaps集成时必需。用于GrabMaps API认证的AWS秘密密钥。
- awsRegion:使用GrabMaps集成时必需。GrabMaps API的AWS区域(例如,马来西亚地区为 'ap-southeast-5',新加坡地区为 'ap-southeast-1')。
如果未提供Google Maps或GrabMaps API密钥,GTFS公交工具将自动回退到使用Nominatim(OpenStreetMap)API进行地理编码,该服务免费且无需凭证。
可以通过以下两种方式设置这些配置选项:
- 通过Smithery的配置界面:在连接到MCP服务器时设置。
- 作为环境变量:在本地开发时设置(GOOGLE_MAPS_API_KEY、GRAB_MAPS_API_KEY)。
设置环境变量
本地开发:
项目在开发期间使用 dotenv
从 .env
文件加载环境变量。
- 在项目根目录创建一个
.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 # 新加坡地区
- 使用
npm run dev
本地运行服务器时,变量将自动加载。
Smithery部署:
通过Smithery连接到MCP服务器时:
- 点击 “Connect Malaysia Open Data MCP Server”。
- 会看到以下配置选项:
googleMapsApiKey
- Google Maps API密钥
grabMapsApiKey
- GrabMaps API密钥
awsAccessKeyId
- 用于GrabMaps的AWS访问密钥
awsSecretAccessKey
- 用于GrabMaps的AWS秘密密钥
awsRegion
- 用于GrabMaps的AWS区域(例如,马来西亚地区为 'ap-southeast-5',新加坡地区为 'ap-southeast-1')
- 在这些字段中输入API密钥和AWS凭证。
- 点击 “Get Link” 生成连接URL。
连接期间,API密钥将安全地传递给服务器。
注意:对于马来西亚境内位置,GrabMaps提供最准确的地理编码结果,其次是Google Maps,两者都需要API密钥。如果未提供任何API密钥,系统将自动使用Nominatim API,该服务免费,但对于马来西亚某些位置的结果可能不太准确。
重要:这些地理编码凭证仅适用于以下GTFS公交工具:
get_transit_routes
- 在将位置名称转换为坐标时使用。
get_transit_stops
- 在将位置名称转换为坐标时使用。
parse_gtfs_static
- 在对站点位置进行地理编码时需要。
关于GTFS实时工具的注意事项:parse_gtfs_realtime
工具目前正在开发中,可用性有限。通过此MCP进行实时数据访问是实验性的,可能并非所有提供商或路线都可用。如需最新的火车和公交时刻表、公交位置和实时到站信息,请使用官方公交应用,如Google Maps、MyRapid PULSE、Moovit或Lugo。
所有其他工具,如数据目录访问、仪表板搜索、天气预报和DOSM数据,不需要任何地理编码凭证。
🛠️ 故障排除
部署问题
如果遇到部署问题:
- 确保GitHub仓库是公开的,或者已正确连接到Smithery。
- 验证
Dockerfile
和 smithery.yaml
是否位于仓库根目录。
- 检查
index.js
文件是否导出有效的MCP服务器函数。
🙏 致谢