MCP server
One read-only Model Context Protocol server at https://mcp.mountaya.com/ that gives AI agents the Mountaya Data API as tools. Connect an assistant over OAuth, or send an API key pair from a client you configure yourself.
The Mountaya MCP server exposes the read-only Data API to AI agents over the Model Context Protocol, served as MCP Streamable HTTP at the host root. The public endpoint is https://mcp.mountaya.com/ (the bare host root, with a trailing slash). Point any MCP client at it and the agent gains read-only tools for outdoor routing, places, and geometry analysis, plus a resource that serves the full Data API schema. No tool creates, updates, or deletes anything.
There are two ways to authenticate, on the same endpoint:
- An interactive assistant connects over OAuth. Claude, ChatGPT, and other MCP-compatible assistants connect through a sign-in screen, with no keys in a config file. See Connect your assistant (OAuth).
- A non-interactive client sends an API key pair. A client you configure yourself sends a publishable and secret key pair on every request, and the server brokers session tokens for it. See Connect a non-interactive client (key pair).
Same endpoint, same tools.
What you can do
The server exposes the read-only Data API operations as tools. Grouped by what they do:
RoutingCompute directions between waypoints, generate route suggestions shaped to a target distance, draw reachability isochrones, and build travel-time and distance matrices, each for a chosen activity. Suggestions never propose a route through a tollway or an access-restricted way; directions can, and says so.
PlacesGeocode free text into named places, reverse-geocode a coordinate, list points of interest in an area, run a unified search across places, points of interest, ways, and the itineraries, collections, and zones your credential may view, read one of those itineraries back in full, and prepare a download of one as a route file.
AnalysisClassify the surface, way type, and slope of an existing line for an activity, and read the terrain itself — elevation, slope, and aspect at points, along a line, or across an area, with the same steepness bands the map legend uses.
Coordinates are [longitude, latitude] in WGS 84, distances are in meters, and durations are in seconds, the same conventions as the Data API. For the exact parameters of each tool, see Tools below.
Connect your assistant (OAuth)
Use this path for an interactive assistant like Claude or ChatGPT: you connect once through a sign-in screen, with no app to register and no keys to paste into a config file. The connector URL is the bare MCP host root, https://mcp.mountaya.com/, with a trailing slash and no path after it. The assistant discovers the protocol and the OAuth server from it.
Connect once
Connecting is a one-time browser flow. After it, the assistant holds a token and calls the tools on its own; you do not sign in again per request.
1
In your assistant's connector settings, add a new MCP server and paste the connector URL (https://mcp.mountaya.com/). The per-assistant steps are in Set up your assistant below.
2
The assistant reads the connector and discovers Mountaya's OAuth server automatically, then registers itself with Dynamic Client Registration. There is no app to create and no client id or secret to copy: the assistant handles registration for you.
3
The flow opens a Mountaya sign-in page in your browser. Sign in with the same account you use for the app. This proves who you are; it does not yet decide which data the assistant can read.
4
After signing in you land on a consent screen. It names the assistant that is asking and what it will be able to do, and asks you to choose which publishable key the assistant should use. The picker groups your keys by organization and shows them by name, so you select a key without ever seeing its raw value. If you have no usable key yet, you can create one inline (it is created with the mcp scope it needs) when you are an owner or admin of an organization.
5
Choose a key and select Authorize. The browser returns to your assistant, which stores the connection. From here the assistant can call the read-only Data API tools whenever your conversation needs them.
How access is scoped
The assistant acts with the publishable key you chose on the consent screen, and nothing wider.
- One organization. A publishable key belongs to one organization, so the assistant can read only that organization's data. To let an assistant work with a different organization, connect again and pick a key in that organization.
- Metered to that organization. Calls the assistant makes count against the chosen key's organization under the same rate limits as any other Data API call.
- No secret key, ever. The flow binds a publishable key, by id, never its raw value and never a secret key. The assistant cannot see or use your secret key, and the consent screen never exposes one.
- Read-only. Every tool is a read; nothing in the tool set creates, updates, or deletes your data.
For the full model, see OAuth for MCP connectors in the authentication guide.
Set up your assistant
The connect flow is the same everywhere: paste the connector URL, sign in, pick a key, authorize. Each assistant just exposes that field in a slightly different place, and a few have quirks worth knowing.
Use Claude.ai or Claude Desktop, both of which support custom connectors.
- Open Settings → Connectors (Claude.ai) or the connector settings in Claude Desktop.
- Choose to add a custom connector and paste the connector URL (
https://mcp.mountaya.com/). - Complete the sign-in and consent flow when Claude opens it, and pick the publishable key the connector should use.
The Claude Code CLI cannot complete this OAuth flow today; see Troubleshooting to connect the CLI with a key pair instead.
Connect a non-interactive client (key pair)
Prefer this path for a non-interactive client you configure yourself: a local agent, a CLI, or a server-side runtime that authenticates without a person signing in. The client sends a publishable key in X-API-Key and a secret key in X-Secret-Key on every request. The server validates the pair, mints (or reuses a cached) Data API session token on your behalf, and proxies the operation, so your client never calls the session endpoint itself. A missing or malformed key pair is rejected at the edge with 401 Unauthorized.
Add the server to your client with the public endpoint and your key pair. Keep the two keys as placeholders below and replace them with your own. Create keys in your Mountaya app, by opening your organization and its API keys tab, and enable the mcp scope. It is the scope the connector needs; data authorizes querying the Data API directly and is a separate product.
Register the server with the claude mcp add command. The --transport http flag selects MCP Streamable HTTP, and each --header carries one credential.
The client sends both keys and the server does the rest:
X-API-Keypk_…
Your publishable key. Identifies your organization and must carry the mcp scope — not data, which authorizes querying the Data API directly. Sent on every request.
X-Secret-Keysk_…
Your secret key. The server uses it to mint a short-lived session token for the Data API. Sent on every request.
See authentication for how the underlying key pair and session tokens work.
Tools
The server registers read-only tools, each proxying one Data API GraphQL query. Coordinates are [longitude, latitude] in WGS 84, distances are in meters, and durations are in seconds. A GraphQL-level failure is returned as a tool error carrying the Data API's {message, path, extensions} envelope, so the agent can read the error code and self-correct.
Routing
directions→ directions
Compute directions between waypoints for an activity. Returns one or more routes with distance, duration, geometry, and analysis. Parameters: activity, waypoints ([[lng, lat], …], two to 45, required); speed (km/h), avoid (TOLLWAY, RESTRICTED_ACCESS) (optional). The only routing tool that can return a route through a tollway or a restricted way — read analysis.advisories and avoidance on each route.
suggestions→ suggestions
Generate route suggestions shaped to a target distance for an activity. Returns multiple candidates with elevation data, none of which crosses a tollway or an access-restricted way. Parameters: activity, distance (meters), start ([lng, lat]), end, ascent, candidates (1 to 10).
isochrones→ isochrones
Compute reachability polygons from one or more locations for an activity. Parameters: activity, locations ([[lng, lat], …]), range (values in seconds or meters), rangeType (TIME or DISTANCE).
matrix→ matrix
Compute a time-distance matrix between locations for an activity. Parameters: activity, locations ([[lng, lat], …], at least two), sources and destinations (index arrays, optional), metrics (DURATION, DISTANCE).
Places
geocode→ geocode
Forward geocode free text into ranked named places. Parameters: query (required); language, limit (1 to 50), focus ([lng, lat]), bbox, layers, categories (optional).
reverseGeocode→ reverseGeocode
Reverse geocode a [lng, lat] point into the closest named places. Parameters: point (required); language, radiusMeters, limit, layers (optional).
pois→ pois
List points of interest matching categories inside a bounding box or a buffered geometry. Parameters: categories (required, 1 to 20); bbox or buffered (mutually exclusive); language, limit (optional).
search→ search
Unified full-text search across places, POIs, ways, and your own itineraries, collections, and zones. Parameters: query (required); targets (per-target enable flags, at least one true); language, limit, focus, bbox (optional). Owned-entity results are scoped to what your credential may view.
itinerary→ itinerary
Read one itinerary in full — its segments with geometry and elevation figures, and its waypoints. Parameters: id (required). This is the companion to the itineraries target of search, which returns references only. Access follows the same visibility rules as everything else: an itinerary your credential may not view comes back as not found, so a response never confirms that an id exists.
exportItinerary→ exportItinerary
Prepare a download of one of your itineraries as a route file. Parameters: id, format (GPX, KML, KMZ, GEOJSON, CSV, FIT, TCX, required); variant (COURSE or ACTIVITY, FIT and TCX only, defaults to COURSE). Returns a short-lived signed URL rather than the bytes: the file is of no use read into a reply, and a URL can be handed straight to the user. The URL names one itinerary in one format, expires within minutes, and re-checks your access when it is fetched, so a link that leaks after your access changed is already dead. Nothing is stored: this creates no share.
Pair itinerary with terrainProfile or analyzeGeometry on a segment's geometry to answer questions about the ground a saved route actually covers.
Analysis
analyzeGeometry→ analyzeGeometry
Classify the surface, way type, and slope of an existing line. Parameters: activity, coordinates ([[lng, lat], …], required).
terrainSamples→ terrainSamples
Read elevation, slope, and aspect at specific points. Parameters: locations ([[lng, lat], …], required, 1 to 100).
terrainProfile→ terrainProfile
Read the surface along a line — an elevation profile as data. Parameters: coordinates ([[lng, lat], …], required); spacingMeters (optional, 10 to 1000, defaults to 100; a target rather than a guarantee).
terrainGrid→ terrainGrid
Read the surface across an area, for finding high ground or a slope facing a given direction. Parameters: bbox ([minLng, minLat, maxLng, maxLat], required); cols, rows (optional, 2 to 64, default 16).
Every terrain result carries zoom and resolutionMeters, so a reading can be reproduced, and coveredCount alongside count. Points outside DEM coverage come back with a null elevation, slope, and aspect rather than a placeholder value — weight any average by coveredCount.
slope is in degrees and aspect is a downhill compass bearing (0-360, 0 = north). aspectOctant and steepnessBand use the same vocabulary as the aspect and steepness overlays, so a value you read here matches the legend a user sees on the map.
A terrainProfile sample carries its own distanceMeters along the line. Read it rather than multiplying the index by spacingMeters, which is a target in both directions: input vertices are always retained, so the interval across a bend is shorter, and a very long line is sampled coarser so one profile cannot return an unbounded number of points.
Prompts
The server exposes reusable procedures as MCP prompts. Each one names the tools to call and the order to call them in, so an assistant does not have to work out the sequence from tool descriptions alone. Clients that support the prompts primitive list them the way they list tools; how you invoke one depends on your client.
plan-a-routeRoute between named places for an activity, and say what the result actually involves.
suggest-routesPropose routes near a place that match a distance and ascent target.
compare-alternative-routesCompare two or more route options on distance, ascent and terrain.
analyze-terrain-along-routeReport elevation, slope and aspect along a route.
find-reachable-areaFind how far you can get from a point within a time or distance budget.
export-a-routeExport a route to a file in one of the supported formats.
These are written for an external assistant and only use tools this server exposes. The co-pilot inside Mountaya Studio follows its own procedures, which additionally drive the map and the editor — capabilities that have no equivalent here.
Schema resource
The server also exposes the Data API schema as an MCP resource, so a client can fetch the full SDL the tools are generated from.
URImountaya://data/schema
The Data API schema (SDL). Served as application/graphql. This is the same schema documented in the Data API reference.
Limits
The MCP surface inherits the Data API's behavior.
- Read-only. Every tool is a query. There are no mutations.
- Rate limits. Calls count against the same rate limits as the Data API, keyed to your organization. See authentication for limits and the
429response. - Error parity. Tool errors carry the Data API's GraphQL error envelope verbatim, including each entry's
codeandpath, so a failure surfaces the same machine-readable detail you would get calling the Data API directly. - Terrain bounds. A grid is capped at 64 columns by 64 rows per call and sampled at a fixed DEM zoom. Narrow the bounding box rather than raising the resolution: past the DEM's own resolution a denser grid returns the same ground twice. Point queries take up to 100 locations at once, which is cheaper than the same count one at a time.
Troubleshooting
If an OAuth-connected assistant's Mountaya tools start failing, the connection's key or organization has changed out from under it. A connection is bound to the specific publishable key you chose, so it breaks when:
- the key was revoked or deleted,
- the key lost MCP access (its
mcpscope was removed, or the organization's Outdoor Intelligence access was), - the organization was deactivated, or
- you were removed from the organization.
The fix is to reconnect and choose another key. A token refresh alone keeps the old binding, so it will keep failing for the same reason; an explicit reconnect is what lets you bind a different, working key.
1
In your assistant, remove the Mountaya connector (or sign it out), so the next add starts a fresh sign-in rather than reusing the stale binding.
2
Add the connector URL again, sign in, and on the consent screen choose a key that still carries the Data product in an organization you are an active member of. Create one inline if you need to. Authorize, and the tools come back.
See also
Data API
The read-only GraphQL API the MCP tools proxy: directions, suggestions, isochrones, matrices, places, and geometry analysis.
Authentication
How the publishable and secret key pair, scopes, OAuth for connectors, session tokens, and rate limits fit together.
Agent skills
Drop-in skills that teach a coding assistant to generate Mountaya integration code.