Skip to content
Conduit

mcp server

indoor-imdf-mcp

MCP server for the full IMDF indoor mapping pipeline: acquire building footprint, extract floors from PDF, validate for Google Maps Content Partners, and package to ZIP

stephenangle/indoor-imdf-mcpcommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

This project does not publish an install method we can turn into a config. Follow the README instead.

README

synced Oct 23, 2026

🏛️ indoor-imdf-mcp

A Model Context Protocol (MCP) server that covers the full IMDF generation pipeline for any venue — from a PDF floor plan to a Google Maps Content Partners-ready ZIP archive.

🔁 Full Pipeline (6 Steps)

acquire_footprint  →  extract_floor_plan  →  [write_geojson_layer]
       ↓                     ↓                        ↓
  venue polygon          122 units              16 IMDF layers
                                                       ↓
                         validate_imdf_for_google  →  package_imdf_zip  →  ✅ ZIP

🛠️ Tools

StepToolDescription
1acquire_footprintGoogle Places API + OSM Overpass → venue building polygon (GeoJSON)
2extract_floor_planPDF → 16 complete IMDF layers. Runs PyMuPDF+Shapely via Python subprocess, georeferences using footprint
3/4list_indoor_datasets / read_geojson_layer / write_geojson_layerInspect and patch individual layers
5validate_imdf_for_googleValidates all 16 GMCP-required layers: structure, metadata, unit→level cross-refs, geometric alignment
6package_imdf_zipPackages GeoJSON + manifest into a delivery-ready ZIP

⚙️ Requirements

  • Node.js ≥ 18
  • Python 3 with pymupdf and shapely (pip3 install pymupdf shapely)
  • GOOGLE_MAPS_API_KEY environment variable set

🚀 Installation & Build

cd indoor-imdf-mcp
npm install
npm run build

Run tests:

npm test

🔌 MCP Client Configuration

{
  "mcpServers": {
    "indoor-imdf": {
      "command": "node",
      "args": ["/Users/angle/Documents/gmaps_project/indoor-imdf-mcp/build/server.js"],
      "env": {
        "GOOGLE_MAPS_API_KEY": "YOUR_KEY_HERE"
      }
    }
  }
}

📋 Usage Example — Any Venue

Step 1: Get the building footprint

{
  "tool": "acquire_footprint",
  "args": { "query": "Caesars Superdome, New Orleans, LA", "output_path": "/tmp/superdome_footprint.geojson" }
}

Step 2: Extract floors from PDF

{
  "tool": "extract_floor_plan",
  "args": {
    "pdf_path": "/path/to/floorplan.pdf",
    "pages": [0, 1, 2],
    "venue_footprint_geojson": { "...": "output from step 1" },
    "output_dataset_path": "/output/superdome_imdf",
    "level_names": ["Ground", "Loge Level", "Suite Level"],
    "venue_name": "Caesars Superdome"
  }
}

Step 3: Validate

{
  "tool": "validate_imdf_for_google",
  "args": {
    "dataset_path": "/output/superdome_imdf",
    "profile": "google_maps",
    "fail_on": "error"
  }
}

Step 4: Package

{
  "tool": "package_imdf_zip",
  "args": {
    "dataset_path": "/output/superdome_imdf",
    "output_zip_path": "/output/Superdome_IMDF.zip"
  }
}

📋 Validation Output Example

{
  "status": "pass",
  "summary": { "errors": 0, "warnings": 27, "score": 46 },
  "issues": [
    { "severity": "warning", "code": "POI_OUTSIDE_FOOTPRINT", "layer": "unit.geojson", ... }
  ],
  "suggested_fixes": [
    { "code": "MOVE_POI_INSIDE_FOOTPRINT", "message": "Move unit geometries within venue boundary." }
  ]
}

📁 IMDF Layer Reference (All 16 Required by GMCP)

LayerGeometryRequired
venuePolygon✅ Must have features
buildingnull (unlocated)✅ Must have features
footprintPolygon✅ Must have features
levelPolygon✅ Must have features
unitPolygon✅ Must have features
fixturePolygon✅ (empty ok)
sectionPolygon✅ (empty ok)
geofencePolygon✅ (empty ok)
kioskPolygon✅ (empty ok)
detailLineString✅ (empty ok)
openingLineString✅ (empty ok)
amenityPoint✅ (empty ok)
anchorPoint✅ (empty ok)
occupantnull (unlocated)✅ (empty ok)
addressnull (unlocated)✅ (empty ok)
relationshipnull/any✅ (empty ok)
↑↓ navigate openesc close