Caltopo
БесплатноНе проверенHTTP MCP server for managing CalTopo maps from headless agents, enabling map listing, folder management, marker operations, and GPX/KML import/export without a
Описание
HTTP MCP server for managing CalTopo maps from headless agents, enabling map listing, folder management, marker operations, and GPX/KML import/export without a browser.
README
HTTP MCP server for managing CalTopo maps from headless agents.
This server is designed for a Hermes/Codex-style agent that needs to list maps, create folders, manage markers, and import/export GPX/KML without using a browser session.
Status
- Uses CalTopo private-account activation credentials.
- Does not require Chrome, Playwright, a desktop login, or a UI session.
- Runs as a normal headless Node.js process.
- Exposes a local HTTP MCP endpoint.
- Tested against a private CalTopo account for read/write marker and folder operations.
CalTopo does not publicly document this private-account API for general third-party use. Treat the integration as pragmatic and test bulk writes on disposable maps first.
Repository
Canonical repository:
https://github.com/sttts/caltopo-mcp
Do not commit local credentials. Runtime secrets belong in .data/, environment variables, or a local secret manager.
Features
- Account auth check
- Map listing
- Raw map data retrieval
- Folder list/create/update/delete
- Marker list/create/update/delete
- GPX waypoint import as CalTopo markers
- KML point placemark import as CalTopo markers
- GPX/KML marker export
- Optional Bearer token on the MCP endpoint
- macOS LaunchDaemon template for headless operation
Requirements
- Node.js 22 or newer
- npm
- A CalTopo account
- CalTopo activation credentials
On the Hermes Mac mini, the bundled Node runtime is expected at:
/Users/hermes/.hermes/node/bin/node
Credentials
The server supports two credential modes.
Activation File
Preferred for local operation:
CALTOPO_ACTIVATION_FILE=.data/activation.local.json
The activation file has this shape:
{
"account": {
"id": "..."
},
"code": "...",
"key": "..."
}
Keep the file outside Git:
mkdir -p .data
chmod 700 .data
chmod 600 .data/activation.local.json
.data/ is ignored by Git.
Environment Variables
Alternative for service managers or secret stores:
CALTOPO_ACCOUNT_ID=...
CALTOPO_CREDENTIAL_ID=...
CALTOPO_CREDENTIAL_KEY=...
Never hardcode these values in source files, plist files, shell scripts, README examples, or committed config.
Getting Activation Credentials
Open an activation URL in a browser where you are logged in to CalTopo:
https://caltopo.com/app/activate/localhost/client/finish-activate?code=<CODE>&name=mcp
Then resolve the code locally:
CALTOPO_ACTIVATION_CODE=<CODE> python3 - <<'PY'
import os
import urllib.request
code = os.environ["CALTOPO_ACTIVATION_CODE"]
path = ".data/activation.local.json"
os.makedirs(".data", exist_ok=True)
with urllib.request.urlopen(f"https://caltopo.com/api/v1/activate?code={code}", timeout=20) as response:
data = response.read()
fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
with os.fdopen(fd, "wb") as handle:
handle.write(data)
print(f"wrote {path}")
PY
Local Development
npm install
npm run typecheck
npm run build
CALTOPO_ACTIVATION_FILE=.data/activation.local.json npm start
Default endpoint:
http://127.0.0.1:8788/mcp
Health check:
curl -sS http://127.0.0.1:8788/health
The health endpoint intentionally does not return credential values or account IDs.
Configuration
Environment variables:
CALTOPO_ACTIVATION_FILE=.data/activation.local.json
CALTOPO_ACCOUNT_ID=...
CALTOPO_CREDENTIAL_ID=...
CALTOPO_CREDENTIAL_KEY=...
CALTOPO_DOMAIN=caltopo.com
CALTOPO_MCP_HOST=127.0.0.1
CALTOPO_MCP_PORT=8788
CALTOPO_MCP_TOKEN=optional-bearer-token
CALTOPO_MCP_TOKEN protects the MCP endpoint with:
Authorization: Bearer <token>
Keep the server bound to 127.0.0.1 unless you also configure authentication and network-level access control.
MCP Tools
caltopo_auth_statuscaltopo_list_mapscaltopo_get_mapcaltopo_list_folderscaltopo_create_foldercaltopo_update_foldercaltopo_delete_foldercaltopo_list_markerscaltopo_create_markercaltopo_update_markercaltopo_delete_markercaltopo_import_markerscaltopo_export_markers
Example Tool Payloads
Create a marker:
{
"map_id": "ABCDE12",
"title": "Camp",
"lat": 65.90993,
"lon": -23.84598,
"description": "Overnight stop",
"color": "#00AAFF",
"symbol": "point"
}
Import GPX waypoints:
{
"map_id": "ABCDE12",
"format": "gpx",
"content": "<?xml version=\"1.0\"?><gpx><wpt lat=\"65.9\" lon=\"-23.8\"><name>Test</name></wpt></gpx>",
"dry_run": true
}
Use dry_run: true before bulk imports.
Headless Service Scripts
Manual operation:
bin/start-caltopo-mcp.sh
bin/status-caltopo-mcp.sh
bin/stop-caltopo-mcp.sh
Do not use cron for this service. On macOS, use the LaunchDaemon in deploy/local.caltopo-mcp.plist if the server must survive reboots without an active UI login.
Hermes Deployment
Recommended layout on the Mac mini:
/Users/hermes/Quellen/caltopo-mcp
/Users/hermes/Quellen/caltopo-mcp/.data/activation.local.json
Clone and build:
cd /Users/hermes/Quellen
git clone https://github.com/sttts/caltopo-mcp.git caltopo-mcp
cd caltopo-mcp
PATH=/Users/hermes/.hermes/node/bin:$PATH npm install
PATH=/Users/hermes/.hermes/node/bin:$PATH npm run build
Start manually:
cd /Users/hermes/Quellen/caltopo-mcp
bin/start-caltopo-mcp.sh
Register with Hermes:
/Users/hermes/.local/bin/hermes mcp add caltopo --url http://127.0.0.1:8788/mcp
/Users/hermes/.local/bin/hermes mcp test caltopo
macOS LaunchDaemon
For reboot-safe headless operation, install the LaunchDaemon as root:
cd /Users/hermes/Quellen/caltopo-mcp
sudo bin/install-launchdaemon.sh
The plist runs the process as hermes:
/Library/LaunchDaemons/local.caltopo-mcp.plist
Check the service:
launchctl print system/local.caltopo-mcp
bin/status-caltopo-mcp.sh
/Users/hermes/.local/bin/hermes mcp test caltopo
Remove it:
sudo launchctl bootout system /Library/LaunchDaemons/local.caltopo-mcp.plist
sudo rm -f /Library/LaunchDaemons/local.caltopo-mcp.plist
Updating
cd /Users/hermes/Quellen/caltopo-mcp
git pull --ff-only
PATH=/Users/hermes/.hermes/node/bin:$PATH npm install
PATH=/Users/hermes/.hermes/node/bin:$PATH npm run build
bin/stop-caltopo-mcp.sh
bin/start-caltopo-mcp.sh
If the LaunchDaemon is installed:
sudo launchctl kickstart -k system/local.caltopo-mcp
Security Checklist
.data/is ignored by Git.- Activation credentials are not present in source files.
- The health endpoint does not expose account IDs or credential metadata.
- The default bind address is
127.0.0.1. - Use
CALTOPO_MCP_TOKENbefore exposing the endpoint beyond loopback. - Prefer
dry_runfor imports before writing many markers.
Before publishing:
git status --short
git ls-files
rg -n "activation\\.local|CALTOPO_CREDENTIAL|credentialKey|Bearer|token|gmail|account_id" . \
-g '!node_modules' -g '!dist' -g '!.data' -g '!.git'
Установка Caltopo
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/sttts/caltopo-mcpFAQ
Caltopo MCP бесплатный?
Да, Caltopo MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Caltopo?
Нет, Caltopo работает без API-ключей и переменных окружения.
Caltopo — hosted или self-hosted?
Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.
Как установить Caltopo в Claude Desktop, Claude Code или Cursor?
Открой Caltopo на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Playwright
Browser automation, scraping, screenshots
автор: MicrosoftPuppeteer
Browser automation and web scraping.
автор: modelcontextprotocolopentabs-dev/opentabs
Plugin-based MCP server + Chrome extension that gives AI agents access to web applications through the user's authenticated browser session. 100+ plugins with a
автор: opentabs-devrobhunter/agentdeals
1,500+ developer infrastructure deals, free tiers, and startup programs across 54 categories. Search deals, compare vendors, plan stacks, and track pricing chan
автор: robhunterCompare Caltopo with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории browse
