OurFamilyWizard MCP
Summary: This server gives Claude read-only, natural-language access to AllTrails — searching trails, pulling trail details/reviews/photos/weather/GPX, and browsing your own profile, saved lists, completed trails, and activity feed.
Search & discovery —
alltrails_search(free-text trail/place search, optionaltypesfilter) andalltrails_resolve_location(resolve place names to country/state/city/area/POI records with coordinates and slugs).Trail details —
alltrails_get_trail(name, overview, length, elevation gain, difficulty, rating, route type, location;detailcontrols what AllTrails sends;view:"full"+detail:"offline"for route geometry).Trail media & conditions —
alltrails_get_trail_reviews,alltrails_get_trail_photos(with a derived fetchable imageurl), andalltrails_get_trail_weather.Route export —
alltrails_get_trail_gpxreturns a GPX 1.1 document (track points + elevation) ready for navigation apps.User data —
alltrails_get_profile,alltrails_list_user_lists,alltrails_get_list_items(trails in a saved list),alltrails_list_completed_trails, andalltrails_get_activity_feed(local/timeline/personal, with cursor pagination).Diagnostics —
alltrails_healthcheckprobes the fetchproxy bridge end-to-end and reports which hop (bridge, extension, or AllTrails) failed.Notes — All tools are read-only; responses default to a slim
compactprojection (view:"full"for raw records); per-user tools default to the signed-in user; authentication requires the ContextMint Bridge extension with a signed-in alltrails.com tab.
Provides natural-language access to AllTrails for searching trails, retrieving trail details, reviews, photos, weather, GPX export, and accessing user-specific data like saved lists and completed trails.
Click on "Deploy 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., "@OurFamilyWizard MCPWhat's on the kids' calendar this week?"
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.
AllTrails MCP
A Model Context Protocol server that connects Claude to AllTrails, giving you natural-language access to trail search, trail details, reviews, photos, weather, and your own saved lists and hiking history.
AI-developed project. This codebase was entirely built and is actively maintained by Claude. No human has audited the implementation. Review all code and tool permissions before use.
Unofficial and unsupported. AllTrails has no public API. This server reverse-engineers the internal API used by alltrails.com. That API is fronted by DataDome bot protection and governed by AllTrails' Terms of Service. It may break without notice, and automated access may violate their ToS — a prior third-party AllTrails project was disabled at AllTrails' request. Use this only for your own account, at your own discretion.
What you can do
Ask Claude things like:
"Find waterfall trails near Portland, Oregon"
"What's the AllTrails rating and length of trail 10236086?"
"Summarize the recent reviews for this trail"
"What trails have I marked completed?"
"Show me the trails on my saved 'weekend hikes' list"
Related MCP server: Cozi MCP Server
Requirements
Claude Desktop (or any MCP host)
Node.js 22.5 or later
The ContextMint Bridge browser extension and a signed-in alltrails.com tab (see Authentication)
Acknowledgement of Terms
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses AllTrails using your own signed-in session. It reuses the cookies from your own browser session; it cannot access anyone else's account or private data.
2. AllTrails' Terms of Service govern your use of this server, just as they govern your direct use of AllTrails. AllTrails restricts automated access and scraping, and fronts its API with bot protection. Automated use through this server may breach those terms. You are agreeing to AllTrails' terms every time you invoke a tool.
3. Personal use only. This project is not affiliated with, endorsed by, or sponsored by AllTrails, LLC. It is a personal automation tool. Do not use it to bulk-extract AllTrails' data, to build a competing product, or in any way that burdens their service.
4. You accept full responsibility for any consequences — technical (rate-limiting, CAPTCHA challenges, account action) or otherwise. The maintainer provides no warranty and no support.
This section is the maintainer's good-faith summary — it is not legal advice and does not modify or supersede AllTrails' actual ToS.
Installation
1. Clone and build
git clone https://github.com/chrischall/alltrails-mcp.git
cd alltrails-mcp
npm install
npm run build2. Add to Claude Desktop
Edit your Claude Desktop config file:
Mac:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add the alltrails entry inside "mcpServers" (create the key if it doesn't exist):
{
"mcpServers": {
"alltrails": {
"command": "node",
"args": ["/absolute/path/to/alltrails-mcp/dist/index.js"]
}
}
}Replace /absolute/path/to/alltrails-mcp with the path where you cloned the repo.
3. Restart Claude Desktop
Quit completely (Cmd+Q on Mac, not just close the window) and relaunch.
4. Verify
Ask Claude: "Search AllTrails for trails near me."
Authentication
AllTrails fronts its internal API with DataDome bot protection, and DataDome fingerprints the HTTP client itself — a cookie copied out of the browser and replayed from Node gets rejected even while the browser sails through. So the fetchproxy bridge is required: every API request runs as a same-origin fetch inside your own signed-in alltrails.com tab, reusing your authenticated session. There is no stored-cookie mode.
Requirements: the ContextMint Bridge browser extension installed (Chrome: download the chrome zip from the releases page and load it unpacked — use Chrome for now; Safari support will ship inside the ContextMint app, which has no public download yet), a signed-in alltrails.com tab open, and a one-time pair-code approval on first use (the trust persists).
ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (https://github.com/chrischall/fetchproxy#extension) points to it. Its source is public at https://github.com/nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the .sha256 file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).
The x-at-key app key AllTrails' own client sends is never stored in this repo or your config — the server captures the live value from your tab's own API traffic on first need, keeps it in memory only, and re-captures automatically if AllTrails rotates it. The alltrails_healthcheck tool round-trips a probe through the bridge and tells you which hop broke.
Configuration
Env var | Required | Purpose |
| No | Numeric user id for the per-user tools; defaults to the signed-in user via |
| No | fetchproxy concentrator port (default |
| No | Override the corresponding request headers. |
| No | Per-request timeout in ms (default |
| No |
|
Available tools
All tools are read-only — this server never writes to AllTrails.
Tool | What it does |
| Search AllTrails by trail or place name — free-text queries use the same suggestions endpoint as the alltrails.com search box ( |
| Resolve a place name to AllTrails location records (country/state/city/area/POI) with each one's kind, coordinates, slug, and disambiguation label |
| Trail details — name, overview, length, elevation gain, difficulty, rating, route type, location ( |
| User reviews for a trail — |
| Photos for a trail — slim records with a fetchable image |
| Export a trail's route as GPX 1.1 (track points + elevation) |
| Weather overview for a trail |
| The signed-in user's profile |
| A user's saved lists / favorites |
| The trails saved in a list, by list id — ordered |
| A user's completed trails |
| A user's activity feed ( |
| Round-trips a probe through the fetchproxy bridge and reports role/port/timing plus a plain-English hint about which hop broke |
The per-user tools default to the signed-in user (resolved via /api/alltrails/me or ALLTRAILS_USER_ID); pass userId to target a public profile.
Response shape: view
alltrails_search, alltrails_get_trail, alltrails_get_trail_reviews,
alltrails_get_trail_photos, alltrails_get_list_items and
alltrails_get_activity_feed take a view parameter with two rungs:
| What you get |
| The default. The slim projection described in the table above — the fields a caller acts on. Nothing to pass. |
| AllTrails' whole untouched record. |
Compact is the default deliberately. These projections existed before, behind
compact: false and a tool description asking the caller to please opt in — and
an efficiency that has to be requested is one that usually is not. Ask for
view: "full" when you need a field the projection drops; the commonest is
route geometry from alltrails_get_trail.
viewis notdetail.alltrails_get_trailalso takesdetail(basic/medium/offline), and that one is a passthrough to AllTrails — it decides what the API sends us.viewdecides what this server hands you. Route geometry needs both:detail: "offline"to fetch it andview: "full"to keep it. The collision is exactly why the fleet parameter is namedview.One projection is not a subset:
alltrails_get_trail_photos'urlis derived by the compact rung (AllTrails' record carries no image URL), soview: "full"does not contain it.
Troubleshooting
403 Forbidden — AllTrails' DataDome protection rejected the request. This usually means the tab isn't signed in (or DataDome is challenging it) — sign into alltrails.com in an open tab and retry.
"AllTrails bridge: …" — the bridge itself failed before reaching AllTrails (extension not running, pairing not approved, no tab). Run alltrails_healthcheck for a diagnosis, and check the ContextMint Bridge extension popup.
"AllTrails: capturing the x-at-key app key failed…" — the key is read off a request your tab makes while the call is waiting, and an idle tab makes none. Refreshing first does not help: the extension only listens for the duration of the call, so a reload that finished before it started happened while nothing was listening. Run the tool again and reload a signed-in www.alltrails.com tab while it is running.
Empty / unexpected results — the internal AllTrails endpoints are undocumented and change over time; responses may shift. Enable ALLTRAILS_DEBUG_LOG=1 to trace each request's method, path, status and response size on stderr.
Development
npm test # run the vitest suite
npm run build # tsc → dist/, then esbuild bundle → dist/bundle.js
npm run dev # node --env-file=.env dist/index.js (requires built dist)vitest.config.ts enforces 100% coverage on src/** (except the stdio entry point). Main is protected — all changes land via PR. See CLAUDE.md for the full PR + release flow.
Project structure
src/
index.ts MCP server entry (runMcp + StdioServerTransport)
protocol.ts Wire-level constants (BASE_URL, app key, headers)
transport.ts createAllTrailsTransport(): the fetchproxy bridge transport
client.ts AllTrailsClient — bridge requests, live x-at-key capture, 429 retry
config.ts Env parsing (api key, headers, timeout, port, user id, debug)
validate.ts parseAllTrails(): zod validation of responses at call sites
tools/
_shared.ts Response helpers + resolveUserId
trails.ts get_trail, reviews, photos, weather, gpx export
explore.ts search, list by state/country
user.ts profile, saved lists, completed trails, activity feed
healthcheck.ts alltrails_healthcheck (bridge diagnostics)
tests/ Mirrors src/; mocks AllTrailsClient.request via vi.spyOnRequest flow
Every API request runs as a same-origin fetch inside your signed-in alltrails.com tab, via the fetchproxy bridge (src/transport.ts, the shared createFetchproxyTransport factory). The browser carries its own cookies; the server attaches only the AllTrails protocol headers (x-at-key etc.), which an in-tab fetch doesn't add on its own. There is no Node-direct mode — DataDome fingerprints the HTTP client, so only in-tab requests are reliable.
See Authentication for installing the ContextMint Bridge extension.
License
MIT
Available Tools
13 toolsalltrails_get_activity_feedGet AllTrails activity feedARead-onlyIdempotent
Get an AllTrails user's activity feed (recorded hikes and posts). Defaults to the signed-in user; pass a userId to target a specific public profile. Without a feed argument this returns the feed DIRECTORY (the available feeds: local, timeline (following), personal (own posts)) — pass feed to get the actual items. Returns slim projections by default; pass view:"full" for the whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| feed | No | Which feed to read: local (nearby activity), timeline (people you follow), personal (own posts). Omit to list the available feeds. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { count, hasNextPage, nextCursor, items: [{ type, timestamp, description, user, trail, activity, review }] } — and the no-feed directory as { name, displayName } per feed; "full" returns AllTrails' whole records. | |
| cursor | No | Opaque nextCursor from a previous page, for pagination | |
| userId | No | Numeric AllTrails user id. Defaults to the signed-in user. | |
| maxItems | No | Max items per page (server-side) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuinely non-obvious behavior: that a missing feed argument returns a DIRECTORY rather than items, and that output is slim by default with an opt-in to full records. It does not mention permissions or rate limits, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler: identity/scope first, then the userId and feed branching, then the view default. Each sentence carries a distinct decision the caller must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to explain the two possible return shapes (directory vs items) and the compact/full projection. Pagination via cursor and maxItems is left to the schema, which is adequate, though a top-level note on paging would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions already explain feed values, the omit-to-list-feeds behavior, view compact/full shapes, and user id defaults. The description largely restates those semantics rather than adding new detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get an AllTrails user's activity feed') and immediately scopes it to 'recorded hikes and posts'. It is clearly distinguishable from siblings like get_profile, list_completed_trails, and list_user_lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit selection rules: omit userId to use the signed-in user, pass it to target a public profile, omit feed to get the directory and pass feed to get items. It doesn't name alternative sibling tools for related data, but the in-tool branching guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_list_itemsGet AllTrails list itemsARead-onlyIdempotent
Get the trails saved in an AllTrails list by its numeric list id (from alltrails_list_user_lists, or a public "list" record from alltrails_search). Items are sparse references: each carries a trailId (hydrate with alltrails_get_trail), the curator's order, and any notes — not trail details. Returns slim { trailId, type, order, notes, addedAt } entries sorted by order by default; pass view:"full" for the whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { count, items: [{ trailId, type, order, notes, addedAt }] } sorted by the curator's order; "full" returns AllTrails' whole list-item records in the order they arrived. | |
| listId | Yes | Numeric AllTrails list id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower. The description adds real context beyond them: items are sparse references rather than trail details, entries are sorted by curator order by default, and view:"full" returns raw records in arrival order. It does not mention pagination or item-count limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and id source, then the return-shape caveat. Two dense sentences with little waste, though the view explanation overlaps the schema's own description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to describe the returned fields, their sparsity, and sorting. An agent has enough to call it correctly and know it must hydrate trail details separately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the view enum is thoroughly documented in the schema itself, so the description's summary of compact/full largely restates it. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('get the trails saved in an AllTrails list') with the keying input (numeric list id). It explicitly differentiates from siblings by naming alltrails_list_user_lists and alltrails_search as id sources and alltrails_get_trail as the hydration path for trail details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear provenance for the list id and a routing rule ('hydrate with alltrails_get_trail'), plus when to switch to view:"full". It stops short of an explicit when-not-to-use statement, but the alternative-tool routing is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_profileGet AllTrails profileARead-onlyIdempotent
Get the signed-in AllTrails user profile (via /api/alltrails/me). Requires a signed-in session. Returns identity fields { id, username, slug, firstName, lastName, location, isPro } by default; pass view:"full" for the whole record (includes email and account settings).
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the identity fields only; "full" returns AllTrails' whole /me payload, including email and settings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds genuinely useful context beyond them: the auth requirement, the default response scope, and the fact that the full view exposes email and account settings (a sensitive-data disclosure the annotations don't convey).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and endpoint, followed by the precondition and the return-value/parameter detail. No filler and nothing repeated unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating the default identity fields and noting what the full view adds. Auth requirement, default behavior and the single parameter's effect are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by tying the enum choice to concrete output differences: compact yields only the listed identity fields while full returns email and settings. This makes the practical consequence of the parameter clear even without opening the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (the signed-in AllTrails user profile), and even names the backing endpoint (/api/alltrails/me). No sibling tool touches the user profile, so an agent can distinguish it immediately from the trail/list/feed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the precondition (requires a signed-in session) and when to choose the non-default behavior (pass view:"full" for the whole record). There is no competing sibling to name as an alternative, so the only missing piece is an explicit when-not-to-use clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_trailGet AllTrails trailARead-onlyIdempotent
Get details for a single AllTrails trail by its numeric trail id. Returns name, location, length, elevation gain, difficulty, rating, route type, and (at higher detail levels) route geometry. Returns a slim projection by default (name, overview, length in m+mi, elevation gain, difficulty, rating, route type, location); pass view:"full" for the whole record and geometry.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { name, overview, length in m+mi, elevation gain in m+ft, difficulty, rating, route type, location }, unwrapped from the one-element envelope; "full" returns the whole record, route geometry included (which also needs detail:"offline" to be fetched at all). | |
| detail | No | Detail level. "medium" (default) is a good overview; "offline" includes full route geometry. | |
| trailId | Yes | Numeric AllTrails trail id (e.g. "10236086") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description goes beyond them by disclosing that the response is a slim projection by default, what exactly that projection contains, and that route geometry is only fetched when both view:"full" and detail:"offline" are set — a genuinely useful behavioral detail. It does not cover error behavior for invalid ids.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, and appropriately sized. There is minor redundancy: the field list appears twice (once as the general return set, once again as the compact projection), which costs a few words without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by naming the returned fields and explaining the compact/full shapes and the geometry dependency, which is enough for an agent to call and interpret this read-only tool. Missing only edge-case behavior (invalid or unknown trail ids).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents trailId, view and detail in detail. The description largely restates the default projection and the view:"full" behavior that the view parameter's own schema text already specifies, adding only a mild emphasis on the view+detail interaction for geometry. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Get details for a single AllTrails trail by its numeric trail id") and enumerates the returned field set, which cleanly separates it from siblings like alltrails_get_trail_gpx, alltrails_get_trail_reviews, alltrails_get_trail_photos and alltrails_get_trail_weather. An agent can identify this as the canonical trail-detail call without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to choose view:"full" over the default projection, which is useful parameter-level guidance, but it never states when to call this tool instead of, or in addition to, its many siblings, nor any prerequisites (e.g. resolving a trail id first via alltrails_search). Usage is implied by the tool name rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_trail_gpxExport AllTrails trail GPXARead-onlyIdempotent
Export an AllTrails trail's route as a GPX 1.1 document (track points with per-point elevation), built from the trail's offline-detail route geometry. Returns raw GPX XML suitable for saving to a .gpx file or importing into navigation apps.
| Name | Required | Description | Default |
|---|---|---|---|
| trailId | Yes | Numeric AllTrails trail id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint). The description adds real behavioral context beyond them: the data is built from offline-detail route geometry, contains track points with per-point elevation, and returns raw XML rather than a JSON envelope. It stops short of noting failure modes (e.g., trails lacking route geometry) or payload size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. Purpose and format come first, the provenance detail second, and the return-value note last — a well front-loaded structure for the reader.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the burden of describing the return value (raw GPX XML, track points with elevation) and its intended destination. It is nearly complete; only edge cases like trails without geometry or output size limits are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required parameter (trailId, numeric string). The description adds no syntax or format detail beyond what the schema already documents, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export), resource (AllTrails trail's route), and output format (GPX 1.1 document with per-point elevation). This distinguishes it cleanly from sibling alltrails_get_trail, which serves structured trail data; the format-specific framing makes the boundary obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'suitable for saving to a .gpx file or importing into navigation apps' implies downstream usage, but there is no explicit when-to-use-this-vs-alltrails_get_trail guidance or exclusion criteria. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_trail_photosGet AllTrails trail photosARead-onlyIdempotent
Get photos for an AllTrails trail by its numeric trail id. Returns just { id, title, likeCount, user, uploadedAt, url } per photo by default — the url serves the actual image; pass view:"full" for the whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { count, photos: [{ id, title, likeCount, user, uploadedAt, url }] } — the url is DERIVED and signed here, so "full" (AllTrails' whole photo records) does not contain it. No route geometry either way — that is alltrails_get_trail. | |
| trailId | Yes | Numeric AllTrails trail id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, and the description still adds real behavior: the default shape is trimmed, and the 'url' is a derived/signed field that 'full' records do not contain. It stops short of stating auth needs or rate limits, but the response-shape nuance is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and identifier, then the response-shape caveat. No filler, though the second sentence is slightly run-on and mixes return format with parameter guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by naming the per-photo fields returned by default. It omits pagination or the enclosing count structure that the schema mentions, but an agent has enough to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum is already documented in the schema, so baseline is 3. The description does clarify that 'url' serves the actual image and that 'full' returns whole records, but this largely restates what the schema's view description already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get photos for an AllTrails trail') plus the identifier needed ('by its numeric trail id'). The resource is unambiguous against siblings like alltrails_get_trail_reviews or alltrails_get_trail_weather, but the description itself never names an alternative to route the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by describing the default response and when to switch to view:"full", but gives no when-to-use / when-not-to-use framing or pointer to sibling tools for adjacent data (reviews, gpx, weather). The agent must infer context from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_trail_reviewsGet AllTrails trail reviewsARead-onlyIdempotent
Get user reviews for an AllTrails trail by its numeric trail id. Returns just { user, rating, comment } per review by default; pass view:"full" for the whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { count, reviews: [{ user, rating, comment }] }; "full" returns AllTrails' whole review records. (No route geometry either way — that is alltrails_get_trail.) | |
| limit | No | Max reviews to return (default 20) | |
| trailId | Yes | Numeric AllTrails trail id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds default-vs-full response behavior, but no auth requirements, rate limits, pagination behavior, or failure modes beyond that, and the response detail it gives is already present in the schema's view description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core action plus return format are front-loaded. Nothing in the description is padding, even if the second clause partly mirrors the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description does useful work by naming the default per-review fields and the view:'full' alternative. It omits the wrapping 'count' field and any note on default limit/pagination, which a caller iterating over results would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the view enum is fully documented in the schema, including the compact field list and the note that no route geometry is returned. The description's restatement of the compact shape adds little beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get user reviews for an AllTrails trail') and keys it to a numeric trail id. The resource ('reviews') is clearly distinct from siblings like alltrails_get_trail_photos or alltrails_get_trail_weather, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it says to supply a numeric trail id. There is no statement of when to prefer this over alltrails_get_trail or how it relates to other trail-fetching siblings, so the agent must infer the selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_get_trail_weatherGet AllTrails trail weatherCRead-onlyIdempotent
Get the weather overview for an AllTrails trail by its numeric trail id.
| Name | Required | Description | Default |
|---|---|---|---|
| trailId | Yes | Numeric AllTrails trail id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds nothing behavioral beyond that: no indication of whether the weather is current conditions or a forecast, what time horizon or units apply, or how fresh the data is. For a data-fetch tool with no output schema, this leaves a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with zero filler. It is efficient, though arguably too terse to carry the missing behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter, no nesting) and annotations cover the safety profile, so the definition is minimally sufficient. However, with no output schema and no statement of what the weather overview contains (current vs. forecast, units, horizon), the agent cannot predict the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single trailId parameter is fully documented in the schema with a numeric pattern. The description's phrase 'by its numeric trail id' merely echoes the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get the weather overview for an AllTrails trail') and pins the identifier format to a numeric trail id. It is clearly distinct from sibling readers like get_trail_reviews or get_trail_photos, though it never explicitly differentiates itself from them or from alltrails_get_trail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alltrails_get_trail or the other trail sub-resource tools, and no prerequisites or exclusions are stated. The only usage signal an agent can infer is from the tool name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_healthcheckVerify the ContextMint Bridge connection end-to-endARead-onlyIdempotent
Round-trips a small public www.alltrails.com URL (/api/alltrails/v3/trails/10236086?detail=basic) through ContextMint Bridge (your signed-in browser tab) and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'this browser can't serve a capability' from 'real www.alltrails.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/openWorld/idempotent, and the description adds real value on top: 'Read-only, no auth required,' the enumerated diagnostic outputs (role, port, version, extension link states, elapsed time, hint), and the four failure modes the hint distinguishes. With no output schema, this disclosure is exactly what the agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and endpoint, then the return payload and trigger condition. It is a single very long sentence with nested parentheticals, which is dense to parse, but nearly every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter diagnostic tool with no output schema, yet the description fully describes the return payload and the meaning of each diagnostic state. Nothing needed to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case. The description correctly signals no inputs are needed, though there is nothing further to specify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Round-trips a small public URL through ContextMint Bridge') plus the exact endpoint used and the diagnostics it produces. It is unmistakably a connectivity/diagnostic tool and cannot be confused with any of the alltrails_* data siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it: 'Call this when a real tool fails and you want to know which hop broke.' The condition that selects this tool over the data-retrieval siblings is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_list_completed_trailsList AllTrails completed trailsARead-onlyIdempotent
List the trails an AllTrails user has marked completed. Defaults to the signed-in user; pass a userId to target a specific public profile. Returns slim trail summaries (name, length, elevation, difficulty, rating) by default; pass view:"full" for the whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { count, trails: [...] } in the same slim shape as alltrails_search trails; "full" returns AllTrails' whole trail records. | |
| userId | No | Numeric AllTrails user id. Defaults to the signed-in user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, so the bar is lower. The description adds real behavioral context: default response is slim summaries (name, length, elevation, difficulty, rating) and view:"full" returns whole records. It does not cover pagination or result limits for a potentially long completion history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler, front-loading the core action, then targeting rule, then return-shape control. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully pre-announces the return shape (slim summary fields vs full records) and the default user scoping, which is enough for correct invocation. Minor gap: no mention of pagination or how the trailing result set is bounded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both view and userId are already well documented (enum values, compact vs full shapes, numeric userId pattern). The description restates the userId default and view:'full' behavior but adds no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'List the trails an AllTrails user has marked completed.' This is clearly distinguishable from siblings like alltrails_search (discovery), alltrails_get_list_items (user lists), and alltrails_get_trail (single trail detail).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection context: defaults to the signed-in user, or pass a userId to target a specific public profile. It does not explicitly name an alternative tool or state when not to use this one (e.g., vs. alltrails_get_activity_feed), but the targeting rule is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_list_user_listsList AllTrails user listsARead-onlyIdempotent
List an AllTrails user's saved lists (favorites, custom lists). Defaults to the signed-in user; pass a userId to target a specific public profile. Returns slim { id, name, itemCount, visibility } entries by default (feed an id to alltrails_get_list_items); pass view:"full" for the whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns { count, lists: [{ id, name, itemCount, visibility }] }; "full" returns AllTrails' whole list records. | |
| userId | No | Numeric AllTrails user id. Defaults to the signed-in user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so safety is covered; the description adds real value on top by specifying the default response shape (slim { id, name, itemCount, visibility }) and that userId only resolves public profiles. It does not cover pagination or rate-limit behavior for a feed-style list, leaving a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose, targeting rule, and return-shape choice front-loaded in that order. Every clause carries information the agent needs and none is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the burden of explaining return values and does so for both view modes, while annotations handle safety. The only unaddressed element is pagination/limits for potentially long list sets, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description earns an extra point by adding the 'public profile' constraint on userId and by restating the compact-vs-full tradeoff in terms of the actual returned fields. It repeats the default values the schema already documents but adds a genuine targeting restriction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List an AllTrails user's saved lists') and immediately scopes it with examples ('favorites, custom lists'). It clearly separates itself from alltrails_get_list_items, which it points to for the item-level detail rather than duplicating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection context: omit userId for the signed-in user, pass userId to target a public profile, and use alltrails_get_list_items if you need the contents of a returned id. It stops short of stating any exclusion or when-not-to-use case, so it falls just under the 'explicit when/when-not' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_resolve_locationResolve AllTrails locationARead-onlyIdempotent
Resolve a place name to AllTrails location records — country / state / city / area / point of interest — with each one's kind, coordinates, URL slug, and disambiguation label. Useful for pinning down which "Oregon" (state vs the towns) or getting a place's coordinates/slug. NOTE: the returned id is an Algolia search id and is NOT the id the trail-listing tools take; to find trails for a place, feed the resolved name back into alltrails_search.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | Which place kinds to return (default: all — country, state, city, area, poi) | |
| limit | No | Max results to return (default 10) | |
| query | Yes | Place name to resolve, e.g. "portland oregon" or "zion" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and open-world, so safety is covered. The description adds genuinely non-obvious behavioral context: the returned id is an Algolia search id and is NOT accepted by the trail-listing tools. It omits pagination/result-count behavior, which the limit param partly implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return shape, then adds the disambiguation use case and the critical id caveat as a compact NOTE. No redundant or filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract (kind, coordinates, URL slug, disambiguation label) and warns about the misleading id field. That covers everything an agent needs to call it and correctly consume the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so query, kinds, and limit are fully documented in the schema with examples and defaults. The description restates the kinds set but adds no syntax or format detail beyond it, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource (resolve a place name to AllTrails location records) with the returned fields enumerated and the place kinds named. It clearly separates itself from alltrails_search, which handles trails rather than place resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when it is useful (disambiguating which 'Oregon', fetching coordinates/slug) and explicitly routes the agent elsewhere for trail lookup ('feed the resolved name back into alltrails_search'). Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alltrails_searchSearch AllTrailsARead-onlyIdempotent
Search AllTrails by name. A free-text query goes to the suggestions endpoint the alltrails.com search box itself uses — relevance is good and the limit is honored. Results may mix record types (trail, poi, area, city, …); pass types=["trail"] to narrow. lat/lng are accepted for backward compatibility but verified ignored by the API (2026-07-02) — results carry an implicit account/IP geo bias instead. Without a query this falls back to the legacy explore search, which returns trails anchored to the signed-in account's location. Results come back as slim per-result summaries, capped at limit client-side, by default; pass view:"full" for AllTrails' whole records.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Deprecated — the API ignores it (verified 2026-07-02) | |
| lng | No | Deprecated — the API ignores it (verified 2026-07-02) | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns slim per-result summaries capped at limit; "full" returns AllTrails' whole records. | |
| limit | No | Max results to return (default 20) | |
| query | No | Free-text search, e.g. "angels landing" or "waterfall trails" | |
| types | No | Record types to return (default: all). e.g. ["trail"] for trails only. Only applied when query is provided; silently ignored on the no-query legacy browse fallback. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/open-world/idempotent safety, yet the description adds material behavior beyond them: lat/lng are verified ignored by the API with a date-stamped verification, results carry an implicit account/IP geo bias instead, the no-query path falls back to legacy explore anchored to the signed-in account's location, and results are capped client-side. These are exactly the non-obvious traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded with the core search behavior before the caveats, and every clause carries real content (endpoint identity, type narrowing, deprecation, fallback, view modes). It is a single long block with em-dash-heavy nesting, which costs some scannability but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description steps up and describes return shape (slim per-result summaries capped at limit, or full AllTrails records under view:"full"). Combined with the fallback and geo-bias disclosures, an agent has everything needed to call this correctly given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description goes further by explaining that lat/lng are backward-compatibility only and effectively no-ops, and that the account/IP geo bias substitutes for them. The types-only-applied-with-query rule is largely mirrored in the schema, so the net gain over structured data is moderate rather than decisive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Search AllTrails by name") and immediately names the mechanism (the suggestions endpoint the site's own search box uses). This is clearly distinguishable from siblings like alltrails_get_trail, alltrails_resolve_location, or alltrails_list_user_lists, which are retrieval/filter tools rather than free-text search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operative guidance: pass types=["trail"] to narrow mixed record types, and pass view:"full" for whole records. It also explains the no-query fallback behavior, which tells the agent when the tool behaves differently. It does not, however, route the agent to a sibling alternative (e.g. resolve_location or get_trail), so the comparative guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v3.1.9- Changed
alltrails_get_activity_feed1 field changed- added
Input schema / properties / userId / patternAdded value: +"^\\d+$"
- Changed
alltrails_get_list_items1 field changed- added
Input schema / properties / listId / patternAdded value: +"^\\d+$"
- Changed
alltrails_get_profile2 fields changed- added
Input schema / $schemaAdded value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the identity fields only; \"full\" returns AllTrails' whole /me payload, including email and settings.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_get_trail1 field changed- added
Input schema / properties / trailId / patternAdded value: +"^\\d+$"
- Changed
alltrails_get_trail_gpx1 field changed- added
Input schema / properties / trailId / patternAdded value: +"^\\d+$"
- Changed
alltrails_get_trail_photos1 field changed- added
Input schema / properties / trailId / patternAdded value: +"^\\d+$"
- Changed
alltrails_get_trail_reviews1 field changed- added
Input schema / properties / trailId / patternAdded value: +"^\\d+$"
- Changed
alltrails_get_trail_weather1 field changed- added
Input schema / properties / trailId / patternAdded value: +"^\\d+$"
- Changed
alltrails_list_completed_trails2 fields changed- added
Input schema / properties / userId / patternAdded value: +"^\\d+$" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { count, trails: [...] } in the same slim shape as alltrails_search trails; \"full\" returns AllTrails' whole trail records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_list_user_lists2 fields changed- added
Input schema / properties / userId / patternAdded value: +"^\\d+$" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { count, lists: [{ id, name, itemCount, visibility }] }; \"full\" returns AllTrails' whole list records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
12 tool updates
v3.0.0- Changed
alltrails_get_activity_feed1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_get_list_items1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_get_trail1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_get_trail_gpx1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_get_trail_photos1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_get_trail_reviews1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_get_trail_weather1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_list_completed_trails1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_list_user_lists1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_resolve_location1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
alltrails_search1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
6 tool updates
v2.3.1- Changed
alltrails_get_activity_feed2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "description": "Return slim projections instead of the full records (default false)", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { count, hasNextPage, nextCursor, items: [{ type, timestamp, description, user, trail, activity, review }] } — and the no-feed directory as { name, displayName } per feed; \"full\" returns AllTrails' whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_get_list_items2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "description": "Return slim per-item entries sorted by order (default false)", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { count, items: [{ trailId, type, order, notes, addedAt }] } sorted by the curator's order; \"full\" returns AllTrails' whole list-item records in the order they arrived.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_get_trail2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "description": "Return a slim projection instead of the full record (default false)", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { name, overview, length in m+mi, elevation gain in m+ft, difficulty, rating, route type, location }, unwrapped from the one-element envelope; \"full\" returns the whole record, route geometry included (which also needs detail:\"offline\" to be fetched at all).", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_get_trail_photos2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "description": "Return a slim projection per photo (default false)", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { count, photos: [{ id, title, likeCount, user, uploadedAt, url }] } — the url is DERIVED and signed here, so \"full\" (AllTrails' whole photo records) does not contain it. No route geometry either way — that is alltrails_get_trail.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_get_trail_reviews2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "description": "Return a slim { user, rating, comment } per review (default false)", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns { count, reviews: [{ user, rating, comment }] }; \"full\" returns AllTrails' whole review records. (No route geometry either way — that is alltrails_get_trail.)", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
alltrails_search2 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "description": "Return slim per-result summaries capped at limit instead of the full records (default false)", - "type": "boolean" -} - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns slim per-result summaries capped at limit; \"full\" returns AllTrails' whole records.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
4 tool updates
v2.0.0- Added
alltrails_get_list_items - Removed
alltrails_list_trails_by_country - Removed
alltrails_list_trails_by_state - Added
alltrails_resolve_location
13 tool updates
v1.0.0- First observed
alltrails_get_activity_feed - First observed
alltrails_get_profile - First observed
alltrails_get_trail - First observed
alltrails_get_trail_gpx - First observed
alltrails_get_trail_photos - First observed
alltrails_get_trail_reviews - First observed
alltrails_get_trail_weather - First observed
alltrails_healthcheck - First observed
alltrails_list_completed_trails - First observed
alltrails_list_trails_by_country - First observed
alltrails_list_trails_by_state - First observed
alltrails_list_user_lists - First observed
alltrails_search
TDQS
Scored across 13 tools
Most tools target distinct resources (trails, reviews, photos, weather, lists), but several begin with 'alltrails_get_trail' and could be confused: get_trail vs get_trail_gpx, get_trail_reviews, get_trail_photos, get_trail_weather. Descriptions clarify the specific output, but the prefix overlap creates some ambiguity.
Tools consistently use snake_case with 'alltrails_' prefix and verb_noun structure (get_trail, list_user_lists, search, resolve_location). Slight inconsistency: 'alltrails_search' lacks an object (search what?), and 'alltrails_healthcheck' deviates from verb_noun pattern.
13 tools is within a reasonable range for an AllTrails integration covering trails, user data, and diagnostics. However, some tools like healthcheck mix operational concerns with domain tools, and a few (e.g., get_trail_weather) could be folded into get_trail with a parameter.
Core reads (trails, lists, completed, feed) are present, but the surface lacks write operations: no create/update/delete for lists, no marking trails completed, no posting to feed. For a signed-in user integration, these gaps will cause agent failures for common tasks.
Maintenance
Related MCP Connectors
Family calendars, tasks, reminders, and pickup coordination for your AI assistant.
Family schedules and household tools with OAuth. External calendars remain read-only.
Manage your family's calendars and lists in Cozi. View, create, and update appointments; organize…
Log baby feedings, diapers, and sleep; manage family tasks, meals, recipes, groceries, and trips.
Related MCP Servers
- -licenseAqualityNot gradedmaintenanceEnables management of Cozi Family Organizer shopping lists and todo lists through natural language. Supports creating, editing, and organizing family lists with real-time sync to the Cozi platform.9-
- AlicenseAqualityAmaintenanceEnables AI assistants to manage Cozi Family Organizer accounts, including creating and updating shopping/todo lists, managing calendar appointments, and accessing family member information.15136 npm4MIT
- AlicenseAqualityAmaintenanceConnects Claude to OurFamilyWizard for natural-language access to co-parenting messages, calendar, expenses, and journal.10431 npmMIT
- AlicenseAqualityAmaintenanceA Model Context Protocol server that connects Claude to OurFamilyWizard, giving you natural-language access to your co-parenting messages, calendar, expenses, and journal.11538 npm1MIT