ENC Charts MCP Server
About
Programmatically access and parse NOAA Electronic Navigational Charts (ENC) in S-57 format.
Details
- Author
- tonybentley
- Categories
- Developer Tools
Jump to
Setup
Install ENC Charts MCP Server in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/tonybentley/enc-charts-mcp
Follow the installation instructions in the repository README, then restart your MCP client.
Programmatically access and parse NOAA Electronic Navigational Charts (ENC) in S-57 format.
An MCP (Model Context Protocol) server for Electronic Navigational Charts (ENC) data, providing programmatic access to NOAA electronic navigational charts with S-57 format parsing capabilities.
This MCP server enables AI assistants to access and analyze electronic navigational charts from NOAA. It automatically downloads, caches, and parses S-57 format chart data, making it available through a standardized API. The server supports coordinate-based chart discovery, feature extraction, and navigation-focused queries.
- S-57 Chart Parsing: Full support for IHO S-57 format electronic navigational charts
- NOAA Integration: Automatic chart discovery and downloading from NOAA REST APIs
- Coordinate-Based Queries: Find and retrieve charts based on GPS coordinates
- Smart Caching: Efficient local caching with configurable size and age limits
- Feature Filtering: Extract specific navigation features (lights, buoys, depths, etc.)
- 172 Object Classes: Complete support for S-57 object catalog
- Depth Analysis: Filter features by depth ranges for navigation safety
- Spatial Queries: Bounding box filtering for area-specific data
- Node.js: Version 18 or higher
- Python: Version 3.7 or higher (for S-57 parsing)
- GDAL Python Bindings: Required for chart data parsing
Install the MCP server globally via npm:
The server requires GDAL Python bindings for S-57 chart parsing:
# Using Homebrew brew install gdal pip3 install gdal==$(gdal-config --version)
sudo apt-get update sudo apt-get install gdal-bin libgdal-dev pip3 install gdal==$(gdal-config --version)
# Using conda (recommended) conda install -c conda-forge gdal
# Check if the server is installed enc-charts-mcp --version # Test GDAL availability python3 -c "from osgeo import ogr; print('GDAL installed successfully')"
The server supports the following environment variables:
Add the following to your Claude Desktop configuration file:
macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%\Claude\claude_desktop_config.json
{ "mcpServers": { "enc-charts": { "command": "npx", "args": ["enc-charts-mcp"], "transport": { "type": "stdio" }, "env": { "ENC_CACHE_DIR": "~/.enc-charts/cache", "ENC_CACHE_MAX_SIZE_GB": "20", "ENC_CACHE_MAX_AGE_DAYS": "14" } } } }
Note:Adjust the cache directory path based on your preferences. The server will automatically create the directory if it doesn't exist.
After installation and configuration, restart Claude Desktop. You can then use the ENC charts tools in your conversations:
Use the get_chart tool with coordinates: lat: 37.8, lon: -122.5 (San Francisco Bay)
Use search_charts with a bounding box to find all charts between San Diego and Los Angeles
Get all lights and buoys from chart US5CA12M
Retrieve chart features for a specific area by chart ID or coordinates.
- chartId(string, optional): Chart identifier (e.g., "US5CA12M")
- coordinates(object, optional): GPS coordinates
- lat(number): Latitude (-90 to 90)
- lon(number): Longitude (-180 to 180)
- minLat,maxLat,minLon,maxLon(numbers)
{ "coordinates": { "lat": 37.8, "lon": -122.5 }, "featureTypes": ["LIGHTS", "BOYLAT", "DEPARE"], "depthRange": { "min": 0, "max": 20 } }
{ "chartId": "US5CA12M", "features": [ { "id": "LIGHTS.123", "type": "LIGHTS", "geometry": { "type": "Point", "coordinates": [-122.5295, 37.8156] }, "properties": { "COLOUR": ["1"], "LITCHR": 8, "SIGPER": 4, "VALNMR": 18 } } ], "featureCount": 42, "totalFeatures": 150, "hasMore": true, "limit": 100, "offset": 0, "source": "NOAA ENC" }
Search available charts by various criteria.
- query(string, optional): Search by name or area
- scale(object, optional): Scale range filter
- min,max(numbers)
Get detailed information about a specific chart.
- chartId(string, optional): Chart identifier
- coordinates(object, optional): GPS coordinates to find chart
Get information about S-57 object classes and their representations.
- category(string, optional): Filter by category
- Options: "navAids", "depths", "areas", "infrastructure", "natural", "hazards"
The server integrates with NOAA's Electronic Navigational Chart services:
- XML Product Catalog: Charts metadata fromhttps://www.charts.noaa.gov/ENCs/ENCProdCat.xml
- Chart Downloads: Individual S-57 format ZIP files fromhttps://www.charts.noaa.gov/ENCs/
- Update Frequency: Weekly for most charts
- Coverage: US waters and territories
- No Authentication Required: All NOAA resources are publicly accessible
Charts are automatically downloaded on-demand when queried by coordinates and cached locally for performance. The XML catalog is cached for 24 hours to reduce API calls.
- Chart Discovery: The server queries NOAA's XML product catalog to find charts based on coordinates or search criteria
- Automatic Download: Charts are downloaded on-demand from NOAA when requested
- Local Caching: Downloaded charts are cached locally to improve performance
- S-57 Parsing: Chart data is parsed from S-57 format using GDAL Python bindings
- Feature Extraction: Navigation features (lights, buoys, depths, etc.) are extracted and returned as GeoJSON
The server supports all 172 standard S-57 object classes. Key categories include:
- LIGHTS- All lighted aids (lighthouses, beacons, lit buoys)
- BOYLAT- Lateral buoys (port/starboard markers)
- BOYSAW- Safe water buoys
- BCNLAT- Lateral beacons
- DAYMAR- Day marks
- DEPARE- Depth areas with ranges
- DEPCNT- Depth contour lines
- SOUNDG- Individual soundings
- DRGARE- Dredged areas
- FAIRWY- Navigation channels
- ANCHRG- Anchorage areas
- RESARE- Restricted areas
- TSSLPT- Traffic separation schemes
- OBSTRN- Underwater obstructions
- WRECKS- Shipwrecks
- ROCKS- Rocks and reefs
- Use Feature Filtering: SpecifyfeatureTypesto reduce response size
- Apply Bounding Boxes: Limit geographic scope when possible
- Leverage Pagination: Uselimitandoffsetfor large datasets
- Cache Warming: Frequently accessed areas benefit from pre-downloading
- Navigation Aids:LIGHTS,BOYLAT,BOYSAW,BCNLAT
- Depths:DEPARE,DEPCNT,SOUNDG
- Hazards:OBSTRN,WRECKS,ROCKS
- Areas:FAIRWY,ANCHRG,RESARE
Find charts and extract navigation aids for route planning:
// Get charts for Golden Gate area { "coordinates": { "lat": 37.8199, "lon": -122.4783 }, "featureTypes": ["LIGHTS", "BOYLAT", "BOYSAW", "BCNLAT"], "includeNearby": true }
Find suitable anchoring spots with depth information:
// Search for anchorages with specific depth range { "chartId": "US5CA12M", "featureTypes": ["DEPARE", "ANCHRG", "SOUNDG"], "depthRange": { "min": 5, "max": 15 }, "boundingBox": { "minLat": 37.8, "maxLat": 37.82, "minLon": -122.52, "maxLon": -122.5 } }
// Get all hazards near a route { "coordinates": { "lat": 32.7157, "lon": -117.1611 }, "featureTypes": ["OBSTRN", "WRECKS", "ROCKS", "UWTROC"], "includeNearby": true }
// Search charts between San Diego and Los Angeles { "boundingBox": { "minLat": 32.5, "maxLat": 34.0, "minLon": -118.5, "maxLon": -117.0 }, "scale": { "max": 50000 } // Detailed charts only }
"GDAL Python bindings not found"
- Ensure Python 3 is in your PATH
- Match GDAL versions exactly:pip install gdal==$(gdal-config --version)
- On macOS, use Homebrew:brew install gdal
- On Windows, use conda for easier installation
"Failed to parse S-57 chart data"
- Verify GDAL is properly installed:python3 -c "from osgeo import ogr"
- Check that Python 3 is in your PATH (the server specifically usespython3)
- Some charts may require newer GDAL versions
- Runnpm run gdal:validateto check your installation
- Ensure the package is installed:npm list -g enc-charts-mcp
- Check your config file path is correct
- Restart Claude Desktop after configuration changes
- Verify the npx command works:npx enc-charts-mcp --version
"No charts found for coordinates"
- Verify coordinates are in US waters (NOAA coverage area)
- Check internet connection for NOAA API access
- Try different coordinates or use a known chart ID
# Default cache location rm -rf ~/.enc-charts/cache/ # Or your custom cache directory rm -rf $ENC_CACHE_DIR/
- AdjustENC_CACHE_MAX_SIZE_GBin your config
- Charts can be 10-100MB each
- Consider storing cache on a drive with more space
# Clone the repository git clone https://github.com/tonybentley/enc-charts-mcp.git cd enc-charts-mcp # Install dependencies npm install # Build the project npm run build # Run in development mode (with hot reload) npm run dev # Run production build npm start
- npm run dev- Run in development mode with hot reload
- npm run build- Build TypeScript to JavaScript
- npm run test- Run unit tests
- npm run test:e2e- Run end-to-end tests
- npm run test:all- Run all test suites
- npm run lint- Run ESLint
- npm run typecheck- Run TypeScript type checking
- npm run format- Format code with Prettier
- npm run gdal:detect- Check if GDAL is properly installed
- npm run gdal:validate- Validate GDAL installation and environment
- npm run test:integration:check- Verify GDAL before running integration tests
- Charts can be 10-100MB each
- Initial downloads may take time
- Cache warming recommended for frequently accessed areas
- Spatial queries optimized for bounding boxes
To prevent response size issues, theget_chartandsearch_chartstools implement pagination:
- get_chart: Returns up to 100 features by default (max: 1000)
- search_charts: Returns up to 50 charts by default (max: 100)
Use thelimitandoffsetparameters to page through large result sets:
// First page { "chartId": "US5CA12M", "limit": 100, "offset": 0 } // Next page { "chartId": "US5CA12M", "limit": 100, "offset": 100 }
The response includes pagination metadata:
- totalFeaturesortotalCount: Total number of available items
- hasMore: Boolean indicating if more results exist
- limit: Number of items returned
- offset: Number of items skipped
The source code is available onGitHub.
Contributions are welcome! Please open an issue or submit a pull request on GitHub.
- NOAA for providing free electronic navigational charts
- IHO for the S-57 standard specification
- GDAL contributors for S-57 format support
This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.
Create crafted UI components inspired by the best 21st.dev design engineers.
Bring agent evaluations, observability, and synthetic test set generation directly into your IDE for free with Galileo's new MCP server
An MCP server to help AI assistants to answer questions and generate AccelByte Extend SDK code more effectively .
MCP server for AI Diagram Maker — generate beautiful software engineering diagrams directly inside Cursor, Claude Desktop, Claude Code, or any MCP-compatible AI agent
ALAPI MCP Tools,Call hundreds of API interfaces via MCP
AI-powered SVG animation generator that transforms static files into animated SVG components using the Allyson platform
MCP server that gives AI assistants on-demand access to 1,500+ amCharts docs, ~300 code examples, and 1000+ class API references.
APIMatic MCP Server is used to validate OpenAPI specifications using APIMatic. The server processes OpenAPI files and returns validation summaries by leveraging APIMatic’s API.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





