Skip to main content
Glama

README.md

GPT Maps

AI-powered interactive map visualization built as an MCP Server + MCP App for Claude Desktop.

GPT Maps allows an LLM to control an interactive MapLibre map through custom MCP tools. Instead of only returning textual geographic information, the model can visualize locations, connect places with paths, and display geographic boundaries directly on the map.

Features

  • πŸ“ Markers β€” place locations on the map

  • πŸ›£οΈ Paths β€” connect multiple geographic points

  • πŸ—ΊοΈ Polygons β€” render geographic boundaries

  • 🌍 Country-aware camera positioning β€” intelligently adjusts the map view based on the countries associated with locations

  • πŸ”Ž Nominatim integration β€” resolves geographic boundaries using OpenStreetMap data

  • 🧩 MCP integration β€” exposes map operations as tools that an LLM can call

  • πŸ–₯️ Claude Desktop integration β€” renders the map inside a sandboxed MCP App

  • πŸ“¦ MCPB packaging β€” distributable as a Claude Desktop extension

  • πŸ”„ Scene-based rendering β€” represents map state using shared scene objects

  • πŸ›‘οΈ CSP-aware sandboxing β€” supports external MapLibre resources inside the MCP App sandbox


Related MCP server: mcp-media-engine

Example

A user can ask:

Show Delhi, Mumbai and Bangalore and connect them with a path.

The LLM can call the MCP tools to create the required scene:

User
  ↓
Claude
  ↓
MCP Tool Calls
  β”œβ”€β”€ createMarker
  β”œβ”€β”€ createMarker
  β”œβ”€β”€ createMarker
  └── createPath
        ↓
     Scene
        ↓
   SceneSerializer
        ↓
   MCP Resource
        ↓
   React + MapLibre
        ↓
 Interactive Map

The result is rendered directly inside the Claude Desktop interface.

Architecture

GPT Maps is structured as a TypeScript monorepo with separate shared, server, and web packages.

GPT Maps
β”‚
β”œβ”€β”€ packages/
β”‚   β”‚
β”‚   β”œβ”€β”€ shared/
β”‚   β”‚   β”œβ”€β”€ objects/
β”‚   β”‚   β”‚   β”œβ”€β”€ Marker
β”‚   β”‚   β”‚   β”œβ”€β”€ Path
β”‚   β”‚   β”‚   └── Polygon
β”‚   β”‚   β”‚
β”‚   β”‚   └── scene/
β”‚   β”‚       └── SceneBuilder
β”‚   β”‚
β”‚   β”œβ”€β”€ server/
β”‚   β”‚   β”œβ”€β”€ tools/
β”‚   β”‚   β”‚   β”œβ”€β”€ createMarker
β”‚   β”‚   β”‚   β”œβ”€β”€ createPath
β”‚   β”‚   β”‚   β”œβ”€β”€ createPolygon
β”‚   β”‚   β”‚   └── renderScene
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”‚   └── BoundaryService
β”‚   β”‚   β”‚
β”‚   β”‚   └── SceneSerializer
β”‚   β”‚
β”‚   └── web/
β”‚       β”œβ”€β”€ renderer/
β”‚       β”‚   └── MapRenderer
β”‚       β”œβ”€β”€ SceneDeserializer
β”‚       └── MCP App
β”‚
└── mcpb/
    └── Claude Desktop package
Data flow
LLM
 β”‚
 β”‚ MCP tool calls
 β–Ό
MCP Server
 β”‚
 β”œβ”€β”€ createMarker
 β”œβ”€β”€ createPath
 β”œβ”€β”€ createPolygon
 └── renderScene
 β”‚
 β–Ό
Scene Model
 β”‚
 β–Ό
SceneSerializer
 β”‚
 β–Ό
MCP Resource
 β”‚
 β–Ό
React MCP App
 β”‚
 β–Ό
MapLibre GL
 β”‚
 β–Ό
Interactive Map
MCP Tools
createMarker

Creates a geographic marker.

Supports an optional country hint used for intelligent camera positioning.

Example:

createMarker(
  latitude,
  longitude,
  label,
  country
)

For locations where a country cannot meaningfully be associated with the point, the model can use:

VAGUE
createPath

Creates a path connecting multiple geographic points.

createPath(
  points[]
)

Paths use the same underlying geographic point model as markers.

createPolygon

Creates a geographic polygon from a named region.

The server uses the Nominatim Search API with GeoJSON polygon output to retrieve the boundary.

Region
  ↓
Nominatim
  ↓
GeoJSON
  ↓
Point conversion
  ↓
Polygon
  ↓
MapLibre

Both Polygon and MultiPolygon GeoJSON geometries are handled.

renderScene

Serializes the current scene and sends it to the MCP App for rendering.

The scene contains objects such as:

Scene
 β”œβ”€β”€ Markers
 β”œβ”€β”€ Paths
 └── Polygons
Country-Aware Camera

GPT Maps uses country information associated with markers to improve the initial map viewport.

For example:

User:
Show Delhi

The marker can carry:

country = "India"

The server resolves the country's bounding box through Nominatim.

The renderer then combines:

Marker bounds
        +
Country bounds
        ↓
Combined LngLatBounds
        ↓
MapLibre fitBounds()

This prevents a single marker from producing an excessively zoomed-in view.

If:

the country is unavailable,
the value is VAGUE, or
Nominatim cannot resolve the country,

the renderer safely falls back to the geographic bounds of the scene objects.

Country requests are also deduplicated within each scene so multiple markers from the same country do not trigger repeated lookups.

Map Rendering

The frontend uses MapLibre GL for rendering.

The renderer maintains the map as a visual representation of the current scene.

Before rendering a new independent scene, existing map objects are cleared:

New renderScene()
       ↓
clearMap()
       ↓
Remove previous markers
Remove previous paths
Remove previous polygons
       ↓
Render new scene

This prevents objects from previous independent prompts from accumulating on the same map.

MCP App Sandbox

The MCP App runs inside a sandboxed iframe controlled by the MCP host.

A standard Vite build normally produces:

index.html
assets/
 β”œβ”€β”€ index.js
 └── index.css

However, those relative asset URLs are not directly accessible from the MCP App sandbox.

GPT Maps therefore produces a self-contained HTML resource with JavaScript and CSS bundled into the HTML document.

The resulting MCP resource contains:

<script>
  ...
</script>

<style>
  ...
</style>

with no required:

./assets/
 /assets/

references.

This allows the MCP host to load the entire application from a single HTML resource.

Content Security Policy

MapLibre requires external network access for map resources.

The MCP App therefore declares the required external domain through MCP resource CSP metadata.

For example:

connectDomains:
  https://demotiles.maplibre.org

The CSP metadata is included in the actual resources/read response so the MCP host can apply the required policy when loading the application.

Technology Stack
Backend
TypeScript
Node.js
MCP SDK
Nominatim / OpenStreetMap
GeoJSON
Frontend
React
TypeScript
MapLibre GL
HTML/CSS
Architecture
TypeScript monorepo
Shared domain models
Scene Builder
Serialization / deserialization pipeline
MCP resources and tools
Distribution
MCPB
Claude Desktop
Project Structure
packages/
β”œβ”€β”€ shared/
β”‚   └── Shared scene/domain models
β”‚
β”œβ”€β”€ server/
β”‚   β”œβ”€β”€ MCP server
β”‚   β”œβ”€β”€ MCP tools
β”‚   β”œβ”€β”€ BoundaryService
β”‚   └── SceneSerializer
β”‚
└── web/
    β”œβ”€β”€ React MCP App
    β”œβ”€β”€ MapRenderer
    └── SceneDeserializer
Running Locally
Requirements
Node.js
npm
Claude Desktop
MCPB CLI (for packaging)
Install
npm install
Build
npm run build
Package

The project can be packaged as an MCPB extension using the official MCPB CLI.

mcpb pack

The resulting package can then be installed into Claude Desktop.

MCPB

GPT Maps is distributed as a Claude Desktop MCPB extension.

The package contains:

map-renderer.mcpb
F
license - not found
-
quality - not tested
C
maintenance

Maintenance

–Maintainers
–Response time
–Release cycle
–Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • MCP server giving Claude AI access to 22+ NYC public-record databases for real estate due diligence

  • MCP server for AI dialogue using various LLM models via AceDataCloud

  • MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SiddharthGoel-07/GPT-MAPS'

If you have feedback or need assistance with the MCP directory API, please join our Discord server