TomTom MCP服务器——微软365和团队的交互式地图
概念验证 --连接托管 模型上下文协议(MCP) Azure上的服务器连接到Copilot Studio、Power Automation和Microsoft 365 Copilot,具有由TomTom Orbis Maps提供支持的交互式地图可视化功能。
v2.0中的新增功能
| 功能 | 详细信息 |
|---|---|
| TomTom奥比斯地图后端 | 升级自 tomtom-maps 到 tomtom-orbis-maps --更丰富的图块、矢量渲染和5个额外的地理空间工具 |
| 16个MCP工具(共11个) | 新工具:电动汽车路线、区域搜索、沿线搜索、电动汽车充电搜索、数据可视化 |
| 交互式地图网络应用程序 | Azure静态Web应用程序,具有完全缩放、平移、单击、标记、路由和流量覆盖功能 |
| 自适应卡集成 | 在Microsoft Teams对话中本机呈现的丰富地图卡 |
| 映射代理Azure功能 | 连接MCP服务器和Teams/Copilot Studio,生成自适应卡并通过URL提供地图图像 |
| 奥比斯测试套件 | 专用的18个测试套件,涵盖所有16个奥比斯工具以及安全和性能检查 |
| 电动汽车充电图索引 | Graph Connector现在可以将电动汽车充电站数据索引到Microsoft Search中 |
建筑
Azure
+-----------------------------------------------------------------+
| |
| Azure Container Apps Azure Static Web App |
| +---------------------------+ +-------------------------+ |
| | TomTom MCP Server | | Interactive Map App | |
| | (Orbis Maps backend) | | (TomTom Maps SDK + | |
| | | | MapLibre GL JS) | |
| | Image: ghcr.io/tomtom- | | | |
| | international/ | | Renders markers, routes,| |
| | tomtom-mcp:latest | | polygons, traffic via | |
| | | | URL query parameters | |
| | MAPS=tomtom-orbis-maps | +-------------------------+ |
| | 16 tools | Port 3000 | ^ |
| | 1.5 CPU, 3Gi RAM | | |
| | Replicas: 1-3 | "Open Interactive Map" |
| | | | |
| | Endpoints: | +-------------------------+ |
| | GET /health | | Azure Function App | |
| | POST /mcp +--->| Map Proxy API | |
| +---------------------------+ | | |
| | POST /api/generate- | |
| | map-card | |
| | GET /api/get-map-image | |
| | | |
| | Returns Adaptive Cards | |
| | + image URLs | |
| +------------+------------+ |
| | |
+-----------------------------------------------------------------+
|
HTTPS + API Key header |
+------------------------------+|
| | ||
Copilot Studio Power Automate Graph Connector
(Native MCP + (Custom (.NET 9 console)
Adaptive Cards) Connector)
| | |
+--------------+----------------+
|
M365 Copilot
(answers location queries)可用的MCP工具(16)
| # | 工具 | 描述 | 状态 |
|---|---|---|---|
| 1 | tomtom-geocode | 将地址转换为坐标 | |
| 2 | tomtom-reverse-geocode | 将坐标转换为地址 | |
| 3 | tomtom-fuzzy-search | 具有拼写容错功能的智能搜索 | |
| 4 | tomtom-poi-search | 查找特定业务类别 | |
| 5 | tomtom-nearby | 发现半径范围内的服务 | |
| 6 | tomtom-routing | 计算位置之间的最佳路线 | |
| 7 | tomtom-waypoint-routing | 具有可选最佳顺序的多站路线规划 | |
| 8 | tomtom-reachable-range | 按时间或距离确定可到达的覆盖区域 | |
| 9 | tomtom-traffic | 实时交通事故数据 | |
| 10 | tomtom-dynamic-map | 使用标记、路线、多边形进行高级地图渲染 | |
| 11 | tomtom-static-map | 生成自定义地图图像 | |
| 12 | tomtom-ev-routing | 具有电池/充电参数的电动汽车路线规划 | 新 |
| 13 | tomtom-search-along-route | 在具有最大绕行限制的给定路线上查找POI | 新 |
| 14 | tomtom-area-search | 在地理边界框内搜索 | 新 |
| 15 | tomtom-ev-search | 按位置和半径查找电动汽车充电站 | 新 |
| 16 | tomtom-data-viz | 在地图上可视化GeoJSON特征集合 | 新 |
注: 测试套件还验证 tomtom-waypoint-optimization 作为路由变体。先决条件
- 一 Azure订阅
- A. TomTom开发人员API密钥 (免费版可用)
- Azure命令行界面 安装
- .NET 9 SDK (适用于图形连接器)
- (适用于地图代理Azure功能)
- Azure功能核心工具v4 (用于本地功能应用程序开发)
- Azure静态Web应用CLI (可选,用于本地交互式地图开发)
- A. Microsoft 365租户 具有Copilot Studio访问权限
快速开始
1.部署MCP服务器(奥比斯)
使用奥比斯地图后端部署新的MCP服务器:
.\deploy\Deploy-TomTomMCP.ps1 -TomTomApiKey "" `
-SubscriptionId "" -TenantId ""或者将现有部署升级到奥比斯:
.\deploy\Deploy-OrbisUpgrade.ps1
.\deploy\Deploy-OrbisUpgrade.ps1 -TomTomApiKey ""这两个脚本都通过运行健康检查并确认所有16个工具都可用来验证部署。
2.部署交互式地图Web应用程序
创建一个Azure静态Web应用程序来托管交互式地图前端:
.\deploy\Deploy-InteractiveMap.ps1 -ResourceGroupName "rg-tomtom-mcp" -Location "uksouth"然后使用GitHub Actions或SWA CLI部署应用程序内容:
# Option: Manual deploy via SWA CLI
npm install -g @azure/static-web-apps-cli
cd interactive-map-app
swa deploy . --deployment-token 交互式地图接受标记、路线、中心、缩放和覆盖的URL查询参数,允许自适应卡按钮直接深度链接到配置的地图视图。
3.部署地图代理功能
部署连接MCP服务器和Teams/Copilot Studio的Azure功能应用程序:
.\deploy\Deploy-MapProxy.ps1 `
-TomTomApiKey "" `
-McpServerUrl "https://ca-tomtom-mcp.azurecontainerapps.io" `
-InteractiveMapUrl "https://swa-tomtom-map.azurestaticapps.net"然后部署函数代码:
cd map-proxy-api
npm install && npm run build
func azure functionapp publish func-tomtom-map-proxy代理暴露了两个端点:
| 端点 | 方法 | 目的 |
|---|---|---|
/api/generate-map-card | POST | 调用MCP工具,返回自适应卡JSON+摘要文本 |
/api/get-map-image | GET | 调用地图工具,直接返回PNG图像(URL可寻址) |
4.连接到Copilot工作室
- 打开 Copilot工作室 并选择您的代理
- 首选 行动 > +添加操作 > MCP 服务器
- 输入部署的服务器URL:
https://.azurecontainerapps.io/mcp - 身份验证:标头中的API密钥
tomtom-api-key - 所有16个工具都是使用键入的参数自动发现的
- 配置代理以调用地图代理,以便在团队中进行自适应卡响应
看 动力平台/COPILOT-AGENT-GUIDE.md 用于代理指令、示例提示和JSON正文示例。
5.通过Power Automation连接
- 导入
power-platform/TomTomMCP-connector.swagger.json作为自定义连接器 - 配置API密钥身份验证
- 使用
CallMcpTool行动在你的流动
看 电动平台/SETUP-GUIDE.md 获取分步说明。
6.将数据索引到Microsoft Graph中
# Create the Entra ID app registration
.\graph-connector\Setup-AppRegistration.ps1 -TenantId ""
# Copy the template and fill in your credentials
cp graph-connector/appsettings.template.json graph-connector/appsettings.json
# Edit appsettings.json with your tenantId, clientId, clientSecret, tomTomApiKey, mcpBaseUrl
# Run the connector to index location data
dotnet run --project graph-connector这将创建一个Microsoft Graph外部连接,注册一个搜索模式,抓取TomTom数据(办公室、附近的POI、地标、电动汽车充电站),并将项目推送到Microsoft搜索中。M365 Copilot可以原生回答以下问题 *“伦敦办公室附近有什么餐馆?”* 或 *“最近的电动汽车充电器在哪里?”*.
看 图形连接器/DEPLOYMENT-GUIDE.md 了解完整的演练和故障排除。
7.运行测试
原始烟雾测试 (11个工具,基本验证):
.\tests\Invoke-SmokeTests.ps1 -BaseUrl "https://.azurecontainerapps.io" -ApiKey ""奥比斯测试套件 (16个工具,完整的奥比斯验证):
.\tests\Invoke-OrbisTests.ps1 -BaseUrl "https://.azurecontainerapps.io"
# Run a subset of tests
.\tests\Invoke-OrbisTests.ps1 -BaseUrl "https://.azurecontainerapps.io" -TestFilter "*ev*"Orbis套件运行18个测试:健康检查、工具/列表验证、所有16个工具调用(地理代码、反向地理代码、模糊搜索、POI搜索、附近、路线、可达范围、交通、EV路线、沿线搜索、区域搜索、EV搜索、数据即),以及无效的API密钥拒绝和响应时间验证。
项目结构
TomTom/
+-- README.md # This file
+-- .gitignore
+-- deploy/
| +-- Deploy-TomTomMCP.ps1 # Full Azure deployment (Orbis by default)
| +-- Deploy-OrbisUpgrade.ps1 # Upgrade existing deployment to Orbis
| +-- Deploy-InteractiveMap.ps1 # Deploy Static Web App for interactive map
| +-- Deploy-MapProxy.ps1 # Deploy Azure Function App (map proxy)
| +-- Update-Container.ps1 # Update container to latest image
| +-- Remove-TomTomMCP.ps1 # Tear down all resources
+-- interactive-map-app/
| +-- index.html # Single-page interactive map (TomTom SDK + MapLibre)
| +-- package.json # App metadata and dev scripts
| +-- staticwebapp.config.json # Azure Static Web App routing and headers
+-- map-proxy-api/
| +-- package.json # Node.js 18 Azure Function project
| +-- tsconfig.json # TypeScript configuration
| +-- host.json # Azure Functions host settings
| +-- local.settings.json # Local development environment variables
| +-- src/
| +-- functions/
| | +-- generateMapCard.ts # POST endpoint: MCP tool -> Adaptive Card
| | +-- getMapImage.ts # GET endpoint: MCP tool -> PNG image
| +-- lib/
| +-- mcpClient.ts # MCP JSON-RPC client with SSE parsing
| +-- adaptiveCards.ts # Adaptive Card builders (search, route, traffic, map)
+-- tests/
| +-- Invoke-SmokeTests.ps1 # 13 smoke tests (original 11 tools)
| +-- Invoke-OrbisTests.ps1 # 18 Orbis tests (all 16 tools + security + perf)
+-- power-platform/
| +-- TomTomMCP-connector.swagger.json # OpenAPI definition for Power Automate
| +-- SETUP-GUIDE.md # Custom connector setup guide
| +-- COPILOT-AGENT-GUIDE.md # Agent instructions & examples
+-- graph-connector/
+-- TomTomGraphConnector.csproj # .NET 9 project
+-- Program.cs # Main entry point
+-- ConnectorConfig.cs # Configuration model
+-- GraphConnectorService.cs # Microsoft Graph external connection
+-- TomTomClient.cs # TomTom MCP API client
+-- LocationItem.cs # Data model for indexed items
+-- appsettings.template.json # Configuration template (copy to appsettings.json)
+-- Setup-AppRegistration.ps1 # Entra ID app registration script
+-- DEPLOYMENT-GUIDE.md # Full deployment & troubleshooting guide团队中的交互式地图
该项目使用 自适应卡+静态Web应用程序 在Microsoft Teams中提供交互式地图的方法:
User asks a location question in Teams
|
v
Copilot Studio agent receives the message
|
v
Agent calls MCP tool via the MCP server
(e.g., tomtom-dynamic-map, tomtom-routing, tomtom-poi-search)
|
v
MCP server returns tool result
(JSON data, and/or base64 PNG image)
|
v
Agent calls Map Proxy POST /api/generate-map-card
with the tool name + arguments
|
v
Map Proxy calls MCP server, parses the result,
and builds a typed Adaptive Card:
- Search results card (geocode, POI, fuzzy, nearby, area, EV search)
- Route card (routing, EV routing, waypoint optimization)
- Traffic card (traffic incidents)
- Dynamic map card (map images with overlays)
- Generic fallback (any other tool)
|
v
Adaptive Card is returned to Teams with:
- A static map image (embedded or via /api/get-map-image URL)
- Result summary text (distances, addresses, counts)
- "Open Interactive Map" button linking to the Static Web App
|
v
User sees the card in Teams and can:
[View the static map inline]
[Click "Open Interactive Map" to zoom/pan/explore in the browser]交互式地图web应用程序读取URL查询参数以配置其初始视图,因此自适应卡按钮可以深度链接到特定位置、缩放级别、标记集或路线。
部署脚本
| 脚本 | 描述 |
|---|---|
Deploy-TomTomMCP.ps1 | 完整的Azure部署:资源组、容器应用程序环境和带有奥比斯地图后端的MCP服务器容器。在完成时验证健康状况和工具数量。 |
Deploy-OrbisUpgrade.ps1 | 从以下位置对现有容器应用程序进行就地升级 tomtom-maps 到 tomtom-orbis-maps更新环境变量和映像,验证16个工具是否可用。 |
Deploy-InteractiveMap.ps1 | 创建用于托管交互式地图的Azure静态Web应用程序资源。输出GitHub Actions或SWA CLI部署的部署令牌和说明。 |
Deploy-MapProxy.ps1 | 创建存储帐户和Azure功能应用程序(Node.js 20、Linux、消费计划)。配置TomTom API密钥、MCP服务器URL、交互式地图URL和CORS的应用程序设置。 |
Update-Container.ps1 | 拉最新 ghcr.io/tomtom-international/tomtom-mcp 镜像并重新启动容器应用程序。 |
Remove-TomTomMCP.ps1 | 拆分资源组和所有关联的Azure资源。 |
认证
所有MCP请求都需要在 tomtom-api-key 头球
curl -X POST "https://.azurecontainerapps.io/mcp" \
-H "Accept: application/json,text/event-stream" \
-H "tomtom-api-key: " \
-H "Content-Type: application/json" \
-d '{
"method": "tools/call",
"params": {
"name": "tomtom-geocode",
"arguments": { "query": "Cardiff Castle, Wales" }
},
"jsonrpc": "2.0",
"id": 1
}'地图代理功能应用程序使用功能级身份验证(authLevel: "function")并从其自身的环境变量中读取TomTom API密钥,因此调用方不需要直接传递密钥。
关键环节
- TomTom MCP服务器(官方)
- TomTom开发者门户
- TomTom奥比斯地图
- 模型上下文协议规范
- Copilot Studio文档
- Microsoft图形连接器
- 联合副驾驶连接器
- 自适应卡架构
- Azure静态Web应用程序
贡献
这是一个概念验证项目。欢迎发布问题和PR。
