osm-edit-mcp

skywinder/osm-edit-mcp

3.3

If you are the rightful owner of osm-edit-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

A comprehensive Model Context Protocol (MCP) server for editing OpenStreetMap (OSM) data, providing AI assistants with the ability to safely manage OSM data through a secure interface.

Tools
12
Resources
0
Prompts
0

OSM Edit MCP Server

CI PyPI version Python License: MIT Code style: black

A powerful Model Context Protocol (MCP) server that enables AI assistants to interact with OpenStreetMap data. Read, search, validate, and edit map data safely with built-in protections.

🌟 What Can You Do?

  • πŸ” Search Places: Find restaurants, cafes, hospitals, schools, and more
  • πŸ“ Validate Locations: Check coordinates and get detailed location info
  • πŸ—ΊοΈ Explore Areas: Discover what's in any geographic region
  • ✏️ Edit Safely: Make map edits on the development server first
  • πŸ€– Natural Language: Use plain English to describe what you want

πŸ“¦ Prerequisites

  • Python 3.10+
  • (Optional) uv for fast dependency management
    # Install uv (optional but recommended)
    curl -LsSf https://astral.sh/uv/install.sh | sh
    

πŸš€ Quick Start (5 Minutes)

1️⃣ Install

git clone https://github.com/skywinder/osm-edit-mcp
cd osm-edit-mcp
uv sync --dev  # Installs both base and development dependencies

2️⃣ Configure

cp .env.example .env
# No need to edit - defaults are ready to use!

3️⃣ Test

uv run python status_check.py

4️⃣ Connect to MCP Client

Important: MCP servers communicate via stdin/stdout with MCP clients. Don't run main.py directly!

Instead, configure the server in your MCP client:

  • Cursor IDE: Settings β†’ Features β†’ MCP
  • Claude Desktop: See
  • VSCode (Cline): Add to settings.json

To test functionality without a client:

uv run python test_comprehensive.py

πŸ” Enable Write Operations (Optional)

To create or edit map data, you need OAuth authentication:

Step 1: Create Dev Account

Visit https://api06.dev.openstreetmap.org and sign up (separate from main OSM).

Step 2: Create OAuth App

  1. Go to your dev account settings β†’ OAuth 2 Applications
  2. Register new application:
    • Name: OSM Edit MCP Dev
    • Redirect URI: https://localhost:8080/callback
    • Permissions: Select all checkboxes

Step 3: Add Credentials

Edit .env and add your OAuth credentials:

OSM_DEV_CLIENT_ID=your_client_id_here
OSM_DEV_CLIENT_SECRET=your_client_secret_here

Step 4: Authenticate

uv run python oauth_auth.py

Step 5: Verify

uv run python test_comprehensive.py

Expected: βœ… 19/19 tests passing

πŸ“– Available Tools

πŸ” Search & Discovery

ToolDescriptionExample
find_nearby_amenitiesFind places around a location"Find restaurants within 500m"
get_place_infoSearch places by name"Where is Central Park?"
search_osm_elementsText search for any element"Search for coffee shops"
smart_geocodeConvert address to coordinates"10 Downing Street, London"

πŸ“ Location Tools

ToolDescriptionExample
validate_coordinatesCheck if coordinates are valid51.5074, -0.1278
get_osm_elements_in_areaGet all elements in a box"What's in this area?"
get_osm_statisticsArea statistics"How many restaurants?"

πŸ—ΊοΈ OSM Data Access

ToolDescriptionExample
get_osm_nodeGet node by IDNode details
get_osm_wayGet way by IDStreet/building info
get_osm_relationGet relation by IDComplex features

✏️ Editing Tools (Requires Auth)

ToolDescriptionExample
create_changesetStart editing sessionRequired for edits
create_osm_nodeAdd new point"Add restaurant here"
create_place_from_descriptionNatural language creation"Add coffee shop called Bean There at..."

πŸ’‘ Usage Examples

Find Nearby Restaurants

# Find Italian restaurants near the Colosseum
result = await find_nearby_amenities(
    lat=41.8902, lon=12.4922,
    radius_meters=500,
    amenity_type="restaurant"
)

Validate Coordinates

# Check if coordinates are valid and get location info
result = await validate_coordinates(51.5074, -0.1278)
# Returns: "London, England, United Kingdom"

Natural Language Search

# Parse natural language requests
result = await parse_natural_language_osm_request(
    "Find coffee shops near the Eiffel Tower"
)

πŸ–₯️ MCP Client Integration

Quick Setup for Popular Clients

Cursor IDE
// With uv (Recommended)
{
  "mcpServers": {
    "osm-edit": {
      "command": "uv",
      "args": ["run", "python", "main.py"],
      "cwd": "/path/to/osm-edit-mcp",
      "env": {
        "OSM_USE_DEV_API": "true",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

// Alternative: Using wrapper script (if uv has path issues)
{
  "mcpServers": {
    "osm-edit": {
      "command": "/path/to/osm-edit-mcp/run_mcp.sh",
      "args": [],
      "env": {
        "OSM_USE_DEV_API": "true",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

Add to Cursor Settings β†’ Features β†’ MCP

Claude Desktop
// With uv (Recommended)
{
  "mcpServers": {
    "osm-edit": {
      "command": "uv",
      "args": ["run", "python", "main.py"],
      "cwd": "/path/to/osm-edit-mcp",
      "env": {
        "OSM_USE_DEV_API": "true",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

// Alternative: Using wrapper script (if uv has path issues)
{
  "mcpServers": {
    "osm-edit": {
      "command": "/path/to/osm-edit-mcp/run_mcp.sh",
      "args": [],
      "env": {
        "OSM_USE_DEV_API": "true",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (Mac)

Continue.dev
{
  "mcpServers": [
    {
      "name": "osm-edit",
      "command": "uv",
      "args": ["run", "python", "main.py"],
      "cwd": "/path/to/osm-edit-mcp"
    }
  ]
}

Add to ~/.continue/config.json

Cline (VSCode)
{
  "cline.mcpServers": {
    "osm-edit": {
      "command": "uv",
      "args": ["run", "python", "main.py"],
      "cwd": "./osm-edit-mcp"
    }
  }
}

Add to VSCode settings or .vscode/settings.json

πŸ“– - Detailed instructions for all clients

Example Queries

  • "Find restaurants near Times Square"
  • "What's at coordinates 48.8584, 2.2945?"
  • "Search for hospitals in Seattle"

πŸ›‘οΈ Safety Features

  • βœ… Development API by default - Safe testing environment
  • βœ… OAuth protection - Edits require authentication
  • βœ… Rate limiting - Respects API limits
  • βœ… Input validation - Prevents invalid data
  • βœ… Changeset management - Groups edits properly

πŸ“Š Project Status

  • Version: 0.1.0
  • Tests: 100% passing (19/19)
  • Python: 3.10+
  • License: MIT

🌐 Remote Deployment (Make it Accessible Anywhere)

The OSM Edit MCP Server can be deployed as a web service accessible from anywhere. This is useful for:

  • Team collaboration
  • Integration with web applications
  • Running on cloud servers
  • Access from multiple devices

πŸš€ Quick Deploy with Docker

1. Prerequisites
  • Docker and docker-compose installed
  • A server with public IP or domain name
  • SSL certificate (or use the self-signed cert for testing)
2. Deploy Steps
# Clone the repository
git clone https://github.com/skywinder/osm-edit-mcp
cd osm-edit-mcp

# Configure environment
cp .env.example .env
# Edit .env with your OAuth credentials and API_KEY

# Deploy with Docker
chmod +x deploy.sh
./deploy.sh

The deploy script will:

  • Build Docker containers
  • Generate SSL certificates (self-signed for development)
  • Start the web server on port 8000
  • Set up Nginx reverse proxy on port 443
3. Access Your Server

After deployment, access your server at:

  • https://your-server-ip/ (with Nginx SSL)
  • http://your-server-ip:8000/ (direct access)
  • API docs: http://your-server-ip:8000/docs

πŸ“‘ API Usage

All MCP functionality is exposed via REST API endpoints. Authenticate with your API key:

# Example: Find nearby amenities
curl -X POST https://your-server-ip/api/nearby-amenities \
  -H "Authorization: Bearer your-api-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "lat": 51.5074,
    "lon": -0.1278,
    "radius_meters": 500,
    "amenity_type": "restaurant"
  }'

πŸ” Security Configuration

  1. API Key: Set a strong API_KEY in your .env file
  2. SSL Certificate: Replace self-signed cert with a real one for production
  3. Firewall: Only expose necessary ports (80, 443)
  4. Rate Limiting: Configured via RATE_LIMIT_PER_MINUTE in .env

☁️ Cloud Platform Deployment

Deploy to AWS EC2
# Launch EC2 instance (Ubuntu 22.04 recommended)
# Install Docker
sudo apt update
sudo apt install docker.io docker-compose

# Clone and deploy
git clone https://github.com/skywinder/osm-edit-mcp
cd osm-edit-mcp
sudo ./deploy.sh
Deploy to DigitalOcean
# Create a Droplet with Docker pre-installed
# SSH into your droplet
ssh root@your-droplet-ip

# Clone and deploy
git clone https://github.com/skywinder/osm-edit-mcp
cd osm-edit-mcp
./deploy.sh
Deploy to Google Cloud Run
# Build and push to Container Registry
gcloud builds submit --tag gcr.io/PROJECT-ID/osm-edit-mcp

# Deploy to Cloud Run
gcloud run deploy osm-edit-mcp \
  --image gcr.io/PROJECT-ID/osm-edit-mcp \
  --platform managed \
  --allow-unauthenticated \
  --set-env-vars API_KEY=your-api-key

πŸ”§ Advanced Configuration

Custom Domain & SSL
# Update nginx.conf with your domain
server_name yourdomain.com;

# Use Let's Encrypt for free SSL
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com
Environment Variables

All configuration is done via environment variables. Key settings:

  • OSM_USE_DEV_API: Use dev (true) or production (false) API
  • API_KEY: Authentication key for API access
  • RATE_LIMIT_PER_MINUTE: API rate limiting
  • LOG_LEVEL: Logging verbosity
Monitoring
# View logs
docker-compose logs -f

# Check health
curl https://your-server/health

# Monitor resources
docker stats

πŸ“Š Production Checklist

  • Use production OSM API (OSM_USE_DEV_API=false)
  • Set strong API_KEY
  • Install real SSL certificate
  • Configure firewall rules
  • Set up monitoring/alerts
  • Enable automated backups
  • Configure log rotation
  • Set resource limits in docker-compose.yml

πŸ§ͺ Testing

# Quick test
python quick_test.py

# Full test suite
python test_comprehensive.py

# Check your edits
# Visit: https://api06.dev.openstreetmap.org/user/YOUR_USERNAME/history

🚨 Troubleshooting

IssueSolution
"Server hangs" when running main.pyThis is normal! MCP servers wait for client input. Use uv run python test_comprehensive.py instead
"401 Unauthorized"Run uv run python oauth_auth.py
"Client auth failed"Check OAuth credentials in .env
Import errorsRun uv sync --dev
Can't see changesetsCheck dev server URL (not main OSM)
uv: command not foundInstall uv: curl -LsSf https://astral.sh/uv/install.sh | sh
How do I use the server?Configure in MCP client or run uv run python explain_mcp_server.py

πŸ“š Documentation

  • - All commands on one page
  • - Cursor, Claude, VSCode, etc.
  • - Background, monitoring, auto-restart

🀝 Contributing

We welcome contributions! See for guidelines.

πŸ”— Links


Ready to explore the world's map data? Start with the Quick Start above! 🌍