Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ENC Charts MCP Servershow me navigation hazards near San Francisco Bay"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ENC Charts MCP Server
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.
Overview
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.
Features
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
Prerequisites
Node.js: Version 18 or higher
Python: Version 3.7 or higher (for S-57 parsing)
GDAL Python Bindings: Required for chart data parsing
Installation
Install the MCP server globally via npm:
Installing GDAL Dependencies
The server requires GDAL Python bindings for S-57 chart parsing:
macOS:
Ubuntu/Debian:
Windows:
Verify Installation
Configuration
Environment Variables
The server supports the following environment variables:
Variable | Description | Default |
| Directory for chart cache |
|
| Maximum cache size in GB |
|
| Cache expiration in days |
|
Claude Desktop Integration
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
Note: Adjust the cache directory path based on your preferences. The server will automatically create the directory if it doesn't exist.
Quick Start
After installation and configuration, restart Claude Desktop. You can then use the ENC charts tools in your conversations:
Find charts for a location:
Use the get_chart tool with coordinates: lat: 37.8, lon: -122.5 (San Francisco Bay)Search for charts in an area:
Use search_charts with a bounding box to find all charts between San Diego and Los AngelesGet navigation features:
Get all lights and buoys from chart US5CA12M
Available Tools
get_chart
Retrieve chart features for a specific area by chart ID or coordinates.
Parameters:
chartId(string, optional): Chart identifier (e.g., "US5CA12M")coordinates(object, optional): GPS coordinateslat(number): Latitude (-90 to 90)lon(number): Longitude (-180 to 180)
boundingBox(object, optional): Geographic bounds filterminLat,maxLat,minLon,maxLon(numbers)
featureTypes(array, optional): S-57 object classes to includedepthRange(object, optional): Depth filter in metersmin,max(numbers)
includeNearby(boolean, optional): Include nearby featureslimit(integer, optional): Maximum features to return (default: 100, max: 1000)offset(integer, optional): Number of features to skip for pagination (default: 0)
Example Request:
Example Response:
search_charts
Search available charts by various criteria.
Parameters:
query(string, optional): Search by name or areascale(object, optional): Scale range filtermin,max(numbers)
boundingBox(object, optional): Geographic search areaformat(string, optional): Chart format ("S-57" or "S-101")limit(integer, optional): Maximum charts to return (default: 50, max: 100)offset(integer, optional): Number of charts to skip for pagination (default: 0)
get_chart_metadata
Get detailed information about a specific chart.
Parameters:
chartId(string, optional): Chart identifiercoordinates(object, optional): GPS coordinates to find chart
get_object_classes
Get information about S-57 object classes and their representations.
Parameters:
category(string, optional): Filter by categoryOptions: "navAids", "depths", "areas", "infrastructure", "natural", "hazards"
search(string, optional): Search by acronym or descriptionincludeAttributes(boolean, optional): Include standard attributes
Data Sources
NOAA ENC Online
The server integrates with NOAA's Electronic Navigational Chart services:
XML Product Catalog: Charts metadata from
https://www.charts.noaa.gov/ENCs/ENCProdCat.xmlChart Downloads: Individual S-57 format ZIP files from
https://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.
How It Works
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
S-57 Object Classes
The server supports all 172 standard S-57 object classes. Key categories include:
Navigation Aids
LIGHTS- All lighted aids (lighthouses, beacons, lit buoys)BOYLAT- Lateral buoys (port/starboard markers)BOYSAW- Safe water buoysBCNLAT- Lateral beaconsDAYMAR- Day marks
Depth Information
DEPARE- Depth areas with rangesDEPCNT- Depth contour linesSOUNDG- Individual soundingsDRGARE- Dredged areas
Areas & Boundaries
FAIRWY- Navigation channelsANCHRG- Anchorage areasRESARE- Restricted areasTSSLPT- Traffic separation schemes
Hazards
OBSTRN- Underwater obstructionsWRECKS- ShipwrecksROCKS- Rocks and reefs
Usage Tips
Efficient Chart Queries
Use Feature Filtering: Specify
featureTypesto reduce response sizeApply Bounding Boxes: Limit geographic scope when possible
Leverage Pagination: Use
limitandoffsetfor large datasetsCache Warming: Frequently accessed areas benefit from pre-downloading
Common Feature Types
Navigation Aids:
LIGHTS,BOYLAT,BOYSAW,BCNLATDepths:
DEPARE,DEPCNT,SOUNDGHazards:
OBSTRN,WRECKS,ROCKSAreas:
FAIRWY,ANCHRG,RESARE
Common Use Cases
1. Navigation Planning
Find charts and extract navigation aids for route planning:
2. Anchorage Analysis
Find suitable anchoring spots with depth information:
3. Hazard Detection
Identify navigation hazards in an area:
4. Chart Discovery
Find all available charts for a region:
Troubleshooting
GDAL Installation Issues
"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 gdalOn 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 uses
python3)Some charts may require newer GDAL versions
Run
npm run gdal:validateto check your installation
Claude Desktop Issues
Server not appearing in Claude
Ensure the package is installed:
npm list -g enc-charts-mcpCheck 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
Cache Issues
Clearing the cache
Disk space issues
Adjust
ENC_CACHE_MAX_SIZE_GBin your configCharts can be 10-100MB each
Consider storing cache on a drive with more space
Development
Running Locally
Development Commands
npm run dev- Run in development mode with hot reloadnpm run build- Build TypeScript to JavaScriptnpm run test- Run unit testsnpm run test:e2e- Run end-to-end testsnpm run test:all- Run all test suitesnpm run lint- Run ESLintnpm run typecheck- Run TypeScript type checkingnpm run format- Format code with Prettier
GDAL Validation
npm run gdal:detect- Check if GDAL is properly installednpm run gdal:validate- Validate GDAL installation and environmentnpm run test:integration:check- Verify GDAL before running integration tests
Performance Considerations
Charts can be 10-100MB each
Initial downloads may take time
Cache warming recommended for frequently accessed areas
Spatial queries optimized for bounding boxes
Pagination
To prevent response size issues, the get_chart and search_charts tools 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 the limit and offset parameters to page through large result sets:
The response includes pagination metadata:
totalFeaturesortotalCount: Total number of available itemshasMore: Boolean indicating if more results existlimit: Number of items returnedoffset: Number of items skipped
License
ISC
Source Code
The source code is available on GitHub.
Contributing
Contributions are welcome! Please open an issue or submit a pull request on GitHub.
Acknowledgments
NOAA for providing free electronic navigational charts
IHO for the S-57 standard specification
GDAL contributors for S-57 format support