交互式地图服务

TomTom MCP Server是一个基于Azure的交互式地图服务平台,为Microsoft 365和Teams提供地理编码、路线规划、POI搜索等16种地图工具,并通过Adaptive Cards和静态Web应用实现地图可视化。

  • by ITSpecialist111
  • HTML
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 ITSpecialist111/CopilotStudio_TomTom_Map_MCP_POC

使用说明

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中

v3.0的新增功能——微软Copilot Cowork插件

功能 详细信息
Copilot Cowork自定义插件 新 cowork-plugin/ 软件包(M365清单v1.28),带有6个相关的代理技能+一个MCP连接器,可通过以下方式部署 M365管理中心→ 副驾驶→ 代理→ 所有代理商→ 添加代理.
MCP网关 新 POST /api/mcp 地图代理上的路线(map-proxy-api/src/lib/mcpGateway.ts)将Cowork与官方TomTom MCP联系起来,注入 tomtom-api-key 服务器端(Cowork连接器身份验证= None).
render_live_map 工具 合成网关工具返回内联地图图像 和 实时交互式地图链接(平移/缩放/交通),因此地图可以直接在Cowork中渲染
相关技能 位置搜索、路线规划、实时交通、电动汽车行程、实时地图和(可选)MOVE交通分析——每一项都交给 tomtom-live-map.
钥匙泄漏硬化 网关过滤上游 tomtom-get-api-key 工具无法发现并阻止对它的调用
在Cowork中渲染实时地图(MCP Apps/SEP-1865) 网关提供自己的独立服务 MCP应用程序小部件 并将服务器渲染的地图图像烘焙到其中(通过 Mcp-Session-Id),所以动态的实时TomTom地图在Cowork中渲染。请参阅 docs/COWORK-MCP-APPS-ADAPTATION.md.

看 cowork插件/README.md,the 部署指南,设计 计划,以及 实施日志.

MCP服务器如何适应Cowork(实时地图): docs/COWORK-MCP-APPS-ADAPTATION.md.

建筑

                                    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 作为路由变体。

先决条件

快速开始

1.部署MCP服务器(奥比斯)

使用奥比斯地图后端部署新的MCP服务器:

.\deploy\Deploy-TomTomMCP.ps1 -TomTomApiKey "<YOUR_KEY>" `
    -SubscriptionId "<YOUR_SUB>" -TenantId "<YOUR_TENANT>"

或者将现有部署升级到奥比斯:

.\deploy\Deploy-OrbisUpgrade.ps1
.\deploy\Deploy-OrbisUpgrade.ps1 -TomTomApiKey "<YOUR_NEW_KEY>"

这两个脚本都通过运行健康检查并确认所有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 <TOKEN>

交互式地图接受标记、路线、中心、缩放和覆盖的URL查询参数,允许自适应卡按钮直接深度链接到配置的地图视图。

3.部署地图代理功能

部署连接MCP服务器和Teams/Copilot Studio的Azure功能应用程序:

.\deploy\Deploy-MapProxy.ps1 `
    -TomTomApiKey "<YOUR_KEY>" `
    -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工作室

  1. 打开 Copilot工作室 并选择您的代理
  2. 首选 行动 > +添加操作 > MCP服务器
  3. 输入部署的服务器URL: https://<your-app>.azurecontainerapps.io/mcp
  4. 身份验证:标头中的API密钥 tomtom-api-key
  5. 所有16个工具都是使用键入的参数自动发现的
  6. 配置代理以调用地图代理,以便在团队中进行自适应卡响应

看 动力平台/COPILOT-AGENT-GUIDE.md 用于代理指令、示例提示和JSON正文示例。

5.通过Power Automation连接

  1. 导入 power-platform/TomTomMCP-connector.swagger.json 作为自定义连接器
  2. 配置API密钥身份验证
  3. 使用 CallMcpTool 行动在你的流动

看 电动平台/SETUP-GUIDE.md 获取分步说明。

6.将数据索引到Microsoft Graph中

# Create the Entra ID app registration
.\graph-connector\Setup-AppRegistration.ps1 -TenantId "<YOUR_TENANT_ID>"

# 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://<your-app>.azurecontainerapps.io" -ApiKey "<YOUR_KEY>"

奥比斯测试套件 (16个工具,完整的奥比斯验证):

.\tests\Invoke-OrbisTests.ps1 -BaseUrl "https://<your-app>.azurecontainerapps.io"

# Run a subset of tests
.\tests\Invoke-OrbisTests.ps1 -BaseUrl "https://<your-app>.azurecontainerapps.io" -TestFilter "*ev*"

Orbis套件运行18个测试:健康检查、工具/列表验证、所有16个工具调用(地理代码、反向地理代码、模糊搜索、POI搜索、附近、路线、可达范围、交通、EV路线、沿线搜索、区域搜索、EV搜索、数据即),以及无效的API密钥拒绝和响应时间验证。

Cowork插件测试 (静态包验证+可选的实时网关烟雾):

# Static only (validates manifest/skills, builds the .zip)
.\tests\Invoke-CoworkPluginTests.ps1

# With live gateway checks
.\tests\Invoke-CoworkPluginTests.ps1 -GatewayUrl "https://<map-proxy>/api/mcp"

8.构建并部署Cowork插件

# Deploy the gateway to the map-proxy Container App
.\deploy\Deploy-CoworkGateway.ps1 -TomTomApiKey "<YOUR_KEY>"

# Validate + package the plugin into an uploadable .zip
.\cowork-plugin\Build-CoworkPlugin.ps1

然后上传 cowork-plugin/dist/tomtom-cowork-plugin-1.0.0.zip 通过M365管理中心 (副驾驶→ 代理→ 所有代理商→ 添加代理).看 co-work插件/cowork-DEPLOYMENT-GUIDE.md.

项目结构

TomTom/
+-- README.md                                  # This file
+-- .gitignore
+-- docs/
|   +-- COWORK-PLUGIN-PLAN.md                  # Cowork plugin design plan + alignment checklist
|   +-- COWORK-IMPLEMENTATION-LOG.md           # Running change log + test evidence
+-- cowork-plugin/
|   +-- manifest.json                          # M365 app manifest v1.28 (skills + connector)
|   +-- color.png / outline.png                # Plugin icons (192x192 / 32x32)
|   +-- New-Icons.ps1                          # Icon generator
|   +-- Build-CoworkPlugin.ps1                 # Validate + package the .zip
|   +-- README.md                              # Plugin overview
|   +-- COWORK-DEPLOYMENT-GUIDE.md             # Register -> package -> upload -> enable -> test
|   +-- skills/                                # 6 Agent Skills (live-map, search, route, traffic, ev, analytics)
+-- 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
|   +-- Deploy-CoworkGateway.ps1               # Redeploy map-proxy w/ Cowork MCP gateway
|   +-- 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
|       |   +-- mcpGateway.ts                  # POST /api/mcp -- Cowork MCP gateway route
|       +-- lib/
|           +-- mcpClient.ts                   # MCP JSON-RPC client with SSE parsing
|           +-- mcpGateway.ts                  # Gateway logic + render_live_map tool
|           +-- 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)
|   +-- Invoke-CoworkPluginTests.ps1           # Cowork package validation + live gateway smoke
+-- 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://<your-app>.azurecontainerapps.io/mcp" \
  -H "Accept: application/json,text/event-stream" \
  -H "tomtom-api-key: <YOUR_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密钥,因此调用方不需要直接传递密钥。

关键环节

贡献

这是一个概念验证项目。欢迎发布问题和PR。

许可证

本项目按原样提供,用于演示目的。TomTom MCP服务器由以下人员维护 TomTom国际 根据自己的许可。参见 TomTom的条件 API使用。