Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
abeef3f
feat: generic Mapbox MCP App + migrate directions_tool
mattpodwysocki Jun 3, 2026
4ae2880
fix(map-app): deliver payload via structuredContent._mapApp
mattpodwysocki Jun 3, 2026
8e158b3
debug(map-app): dump the result shape when no payload is found
mattpodwysocki Jun 3, 2026
a56e68e
fix(map-app): include payload in the large-response (temp resource) path
mattpodwysocki Jun 3, 2026
e952b10
chore(map-app): remove diagnostic dump now that the delivery path is …
mattpodwysocki Jun 3, 2026
dcc6f84
feat: migrate six remaining tools to generic map-app payload
mattpodwysocki Jun 3, 2026
fdd55a8
fix(optimization): enforce roundtrip=false requires source='first' AN…
mattpodwysocki Jun 3, 2026
c46a417
fix(search): demote elicitation-unavailable to debug log
mattpodwysocki Jun 3, 2026
5dbc9a1
fix(search): silent elicitation catch — any notifications/message can…
mattpodwysocki Jun 3, 2026
91a744c
fix(search/optimization): silence info logs + strengthen optimization…
mattpodwysocki Jun 3, 2026
259369e
fix(search): emit a circle layer underneath result markers
mattpodwysocki Jun 3, 2026
c86cca7
fix(map-app): per-tool flavor URIs to avoid iframe dedup on chained c…
mattpodwysocki Jun 3, 2026
74d546c
feat: render_map_tool — single visualization primitive
mattpodwysocki Jun 3, 2026
c4ae9ce
feat(render-map): server-side payload refs (fixes 20-30s render latency)
mattpodwysocki Jun 3, 2026
c254205
fix: surface render hint in tool text + tighten polygon-op descriptions
mattpodwysocki Jun 3, 2026
10d82a0
fix(render-map): pass payload to iframe by ref, not inline (300KB pos…
mattpodwysocki Jun 3, 2026
3277cf5
fix: declare _mapApp on every data tool's output schema
mattpodwysocki Jun 3, 2026
44f37a5
fix(render-map): declare _mapApp on output schema
mattpodwysocki Jun 3, 2026
f73b1ea
fix: rename _mapApp → mapboxRender (drop underscore prefix)
mattpodwysocki Jun 3, 2026
430e669
debug(map-app): dump structuredContent keys when payload extraction f…
mattpodwysocki Jun 3, 2026
bf6cfa3
fix(render-map): embed ref in content[] (Claude Desktop strips struct…
mattpodwysocki Jun 3, 2026
0cb605f
debug(map-app): step-by-step loading text so we can see where the ifr…
mattpodwysocki Jun 3, 2026
00bbda5
debug(map-app): dump content[] preview when payload extraction fails
mattpodwysocki Jun 3, 2026
76511db
fix(render-map): drop inline rawHtml — Claude Desktop trims oversize …
mattpodwysocki Jun 3, 2026
5e9047b
test: add per-tool render payload coverage
mattpodwysocki Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,33 @@
## Unreleased

### New Features

- **`render_map_tool` — single visualization primitive** for Mapbox MCP. Takes
a `MapAppPayload` and displays a live Mapbox GL JS map. All other geo
tools (directions, isochrone, optimization, search, map-matching,
ground-location, polygon-ops) return a ready-to-render `_mapApp` payload
on their `structuredContent`; the LLM passes it to `render_map_tool` to
show a map. This is the only tool that declares `_meta.ui.resourceUri`,
so MCP App hosts (which only fully render the iframe for the last tool
in a chained sequence) always render successfully — the visualization
step is terminal by design.
- **`MapAppPayload` schema** (`src/utils/mapAppPayload.ts`) — the wire
format between data tools and `render_map_tool`. Thin pass-through over
Mapbox Style spec `paint`/`layout` objects so any layer/marker/legend
combination expressible in GL JS is expressible in the payload.
- **Per-tool payload builders** — `buildDirectionsMapPayload`,
`buildIsochroneMapPayload`, `buildOptimizationMapPayload`,
`buildSearchMapPayload`, `buildMapMatchingPayload`,
`buildGroundLocationPayload`, `buildPolygonOpsMapPayload`. Each is a
pure function over its tool's response: ~20-80 lines, no HTML, no
iframe wiring.
- **Shared `renderMapAppHtml`** (`src/resources/ui-apps/mapAppHtml.ts`) —
one ~330-line iframe template that consumes any `MapAppPayload`. Used
by both the MCP Apps resource (`MapAppUIResource`) and any client that
wants to bake initial data in.
- **Polyline decoding moves tool-side** via `decodePolyline` /
`decodePolylineWithFallback` so the iframe only ever receives GeoJSON.

### Security

- chore: upgrade @opentelemetry/\* packages to latest (fixes protobufjs GHSA-xq3m-2v4x-88gg critical CVE) (#183)
Expand Down
275 changes: 0 additions & 275 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@
"mcp"
],
"dependencies": {
"@mcp-ui/server": "^6.1.0",
"@modelcontextprotocol/ext-apps": "^1.1.1",
"@modelcontextprotocol/sdk": "^1.29.0",
"@opentelemetry/api": "^1.9.1",
Expand Down
Loading
Loading