作为一名长期从事地理信息系统(GIS)开发的工程师,我一直在思考如何降低三维地图开发的门槛。直到去年接触到MCP协议,突然意识到:为什么不让AI直接理解人类对地图的操作意图?这就是cesium-mcp项目的起源。
想象一下这样的场景:你正在做一个智慧城市项目,需要快速验证几个地标建筑的展示效果。传统方式需要编写几十行CesiumJS代码,而现在只需要对AI说:"飞到陆家嘴上空500米,用蓝色高亮环球金融中心,再截张图发我"。三秒钟后,截图已经出现在你的聊天窗口里。
这就是cesium-mcp带来的变革——它建立了自然语言与三维地球之间的桥梁。通过标准化协议,任何支持MCP的AI助手(Claude、Copilot、Cursor等)都能直接操控CesiumJS场景,无需开发者手动编写每一行控制代码。
技术本质:项目包含三个核心组件,分别是运行在浏览器的bridge SDK、连接AI与浏览器的runtime服务,以及为开发者提供的dev工具包。它们共同实现了"自然语言→MCP协议→CesiumJS操作"的完整链路。
项目的架构设计遵循了"前后端分离+协议标准化"的原则:
code复制[AI智能体] ←MCP协议→ [Runtime服务] ←WebSocket→ [Browser SDK] ←→ [CesiumJS]
第一层:cesium-mcp-bridge
作为浏览器端SDK,它需要直接嵌入到你的Cesium应用中。其核心职责是:
第二层:cesium-mcp-runtime
这个Node.js服务是整个系统的中枢神经:
第三层:AI智能体集成
通过配置文件声明MCP服务器信息后,AI就能自动发现并调用cesium-mcp提供的工具。目前已经验证兼容:
MCP协议的核心是工具描述(tool definition)和调用规范。以flyTo工具为例,其描述如下:
json复制{
"name": "flyTo",
"description": "将相机飞行到指定经纬度和高度",
"parameters": {
"type": "object",
"properties": {
"longitude": {"type": "number", "description": "目标经度"},
"latitude": {"type": "number", "description": "目标纬度"},
"height": {"type": "number", "description": "相机高度(米)"}
},
"required": ["longitude", "latitude"]
}
}
当AI需要调用该工具时,会发送如下格式的请求:
json复制{
"tool": "flyTo",
"params": {"longitude": 116.4, "latitude": 39.9, "height": 1000}
}
这种标准化设计使得不同AI系统都能以统一方式理解和使用这些工具。
项目目前提供了19个开箱即用的工具,覆盖了Cesium开发的常见场景:
flyTo:平滑飞行到指定位置(支持duration参数控制时长)setView:立即切换视角(适合快速跳转)getView:获取当前相机参数(用于保存状态)zoomToExtent:缩放到包围盒(自动计算最佳视角)addGeoJsonLayer:加载GeoJSON数据(支持样式配置)addHeatmap:生成热力图(基于点数据)addMarker:添加点标记(可自定义图标)addLabel:添加文字标注load3dTiles:加载3D Tileset(支持Cesium ion资源)loadTerrain:启用地形(Cesium World Terrain)loadImageryService:接入影像服务(如ArcGIS、Bing Maps)实操技巧:使用
addGeoJsonLayer时,可以通过style参数实现条件渲染。例如对人口数据设置渐变色:"style": {"color": {"property": "population", "stops": [[0, "green"], [1000000, "red"]]}}
除了运行时工具,cesium-mcp-dev包为开发者提供了三个专用工具:
API查询工具
示例请求:"查询Camera.flyTo的参数说明"
返回结果包含方法签名、参数说明和代码示例。
代码生成工具
支持11种常见场景模板,如:
Entity构建器
通过对话式交互生成复杂Entity配置:
json复制{
"type": "polygon",
"positions": [[116.4,39.9], [116.5,39.9], [116.5,40.0]],
"material": {"type": "color", "color": "blue"},
"extrudedHeight": 100
}
假设你已经有一个运行中的Cesium应用,接入流程如下:
安装bridge包:
bash复制npm install cesium-mcp-bridge
在初始化代码中添加:
javascript复制import { CesiumMcpBridge } from 'cesium-mcp-bridge';
const viewer = new Cesium.Viewer('cesiumContainer');
const bridge = new CesiumMcpBridge(viewer, {
port: 9100, // 可自定义端口
logger: console // 指定日志输出
});
bridge.connect();
启动runtime服务(建议使用PM2守护):
bash复制npx cesium-mcp-runtime
配置AI客户端(以VS Code为例):
在.vscode/mcp.json中添加:
json复制{
"servers": {
"cesium": {
"command": "npx",
"args": ["cesium-mcp-runtime"]
}
}
}
我们提供了一个开箱即用的模板项目:
bash复制npx create-cesium-app my-project --template mcp
cd my-project
npm install
npm start
这个模板已经预置了:
需求:每天自动检查重点区域的3D模型显示状态。
传统方式需要编写复杂脚本,现在通过AI工作流实现:
对应的MCP工具调用序列:
json复制[
{"tool": "flyTo", "params": {"latitude": 31.23, "longitude": 121.47, "height": 2000}},
{"tool": "load3dTiles", "params": {"url": "./data/buildings"}},
{"tool": "screenshot", "params": {"saveTo": "./report/defects.png"}}
]
在地理课上,老师可以实时演示:
学生通过自然语言就能探索复杂的地理数据,无需学习专业GIS软件操作。
在实际使用中发现几个关键性能点:
WebSocket连接管理
每个bridge实例建议最多处理5个并发请求。超过时需要:
javascript复制// 示例:请求队列实现
class RequestQueue {
constructor(maxConcurrent = 5) {
this.queue = [];
this.active = 0;
}
async add(request) {
if (this.active >= maxConcurrent) {
await new Promise(resolve => this.queue.push(resolve));
}
this.active++;
try {
return await request();
} finally {
this.active--;
this.queue.shift()?.();
}
}
}
3D数据加载优化
使用load3dTiles时建议:
json复制{
"tool": "load3dTiles",
"params": {
"url": "tileset.json",
"options": {
"maximumScreenSpaceError": 16,
"skipLevelOfDetail": true
}
}
}
相机运动平滑处理
连续调用flyTo时,建议:
duration参数(默认2秒)cancelFlightOnNext避免冲突javascript复制// bridge内部实现示例
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
duration: params.duration || 2.0,
cancelOnNext: true
});
症状:AI无法发现工具
排查步骤:
典型错误:"Tool execution timeout"
解决方案:
场景:操作响应延迟高
优化建议:
要在bridge中添加新工具,只需注册处理器:
javascript复制bridge.registerTool('drawRoute', {
description: '绘制路径线',
parameters: {
type: 'object',
properties: {
positions: {type: 'array', items: {type: 'array', items: {type: 'number'}}}
}
},
handler: async (params) => {
const entity = viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray(params.positions.flat()),
width: 5
}
});
return {id: entity.id};
}
});
将cesium-mcp接入企业系统的建议方案:
javascript复制new CesiumMcpBridge(viewer, {
onConnect: (client) => {
if (!validateToken(client.token)) {
client.close();
}
}
});
javascript复制bridge.on('command', (cmd) => {
auditLog.write(`${cmd.tool} called by ${cmd.session}`);
});
javascript复制const rateLimiter = new RateLimiter(10); // 10次/分钟
bridge.setMiddleware(async (cmd) => {
await rateLimiter.check(cmd.session);
});
当前版本已实现核心功能,下一步重点:
社区贡献方向建议:
项目完全开源,采用MIT协议。我们相信通过社区协作,能让地理空间技术更易用、更智能。欢迎在GitHub提交PR或Issue。