Skip to main content
Glama
chrischall

OurFamilyWizard MCP

by chrischall

AllTrails MCP

CI npm license

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.

WARNING

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.

CAUTION

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

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 build

2. Add to Claude Desktop

Edit your Claude Desktop config file:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %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

ALLTRAILS_USER_ID

No

Numeric user id for the per-user tools; defaults to the signed-in user via /api/alltrails/me.

ALLTRAILS_WS_PORT

No

fetchproxy concentrator port (default 37149, shared by the whole fetchproxy fleet — override only for local dev/tests).

ALLTRAILS_LOCALE / ALLTRAILS_CALLER

No

Override the corresponding request headers.

ALLTRAILS_REQUEST_TIMEOUT_MS

No

Per-request timeout in ms (default 30000), applied on both paths.

ALLTRAILS_DEBUG_LOG

No

1/true/yes/on logs each request/response to stderr — method, path, status, response size, and a redacted 200-char request-body prefix (response bodies are never logged).

Available tools

All tools are read-only — this server never writes to AllTrails.

Tool

What it does

alltrails_search

Search AllTrails by trail or place name — free-text queries use the same suggestions endpoint as the alltrails.com search box (types: ["trail"] narrows to trails only)

alltrails_resolve_location

Resolve a place name to AllTrails location records (country/state/city/area/POI) with each one's kind, coordinates, slug, and disambiguation label

alltrails_get_trail

Trail details — name, overview, length, elevation gain, difficulty, rating, route type, location (detail: basic/medium/offline picks what AllTrails sends us)

alltrails_get_trail_reviews

User reviews for a trail — {user, rating, comment} each

alltrails_get_trail_photos

Photos for a trail — slim records with a fetchable image url

alltrails_get_trail_gpx

Export a trail's route as GPX 1.1 (track points + elevation)

alltrails_get_trail_weather

Weather overview for a trail

alltrails_get_profile

The signed-in user's profile

alltrails_list_user_lists

A user's saved lists / favorites

alltrails_get_list_items

The trails saved in a list, by list id — ordered {trailId, type, order, notes, addedAt}, hydrate each via get_trail

alltrails_list_completed_trails

A user's completed trails

alltrails_get_activity_feed

A user's activity feed (feed: local/timeline/personal for the items, omit for the directory; cursor paginates)

alltrails_healthcheck

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:

view

What you get

compact

The default. The slim projection described in the table above — the fields a caller acts on. Nothing to pass.

full

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.

view is not detail. alltrails_get_trail also takes detail (basic/medium/offline), and that one is a passthrough to AllTrails — it decides what the API sends us. view decides what this server hands you. Route geometry needs both: detail: "offline" to fetch it and view: "full" to keep it. The collision is exactly why the fleet parameter is named view.

One projection is not a subset: alltrails_get_trail_photos' url is derived by the compact rung (AllTrails' record carries no image URL), so view: "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.spyOn

Request 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 tools
alltrails_get_activity_feedGet AllTrails activity feedA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
feedNoWhich feed to read: local (nearby activity), timeline (people you follow), personal (own posts). Omit to list the available feeds.
viewNoResponse 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.
cursorNoOpaque nextCursor from a previous page, for pagination
userIdNoNumeric AllTrails user id. Defaults to the signed-in user.
maxItemsNoMax items per page (server-side)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 itemsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
listIdYesNumeric AllTrails list id

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 profileA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 trailA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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).
detailNoDetail level. "medium" (default) is a good overview; "offline" includes full route geometry.
trailIdYesNumeric AllTrails trail id (e.g. "10236086")

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 GPXA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
trailIdYesNumeric AllTrails trail id

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 photosA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
trailIdYesNumeric AllTrails trail id

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 reviewsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.)
limitNoMax reviews to return (default 20)
trailIdYesNumeric AllTrails trail id

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 weatherC
Read-onlyIdempotent

Get the weather overview for an AllTrails trail by its numeric trail id.

ParametersJSON Schema
NameRequiredDescriptionDefault
trailIdYesNumeric AllTrails trail id

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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-endA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 trailsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
userIdNoNumeric AllTrails user id. Defaults to the signed-in user.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 listsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
userIdNoNumeric AllTrails user id. Defaults to the signed-in user.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 locationA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoWhich place kinds to return (default: all — country, state, city, area, poi)
limitNoMax results to return (default 10)
queryYesPlace name to resolve, e.g. "portland oregon" or "zion"

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv3.1.9
    • Changedalltrails_get_activity_feed1 field changed
      • addedInput schema / properties / userId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_get_list_items1 field changed
      • addedInput schema / properties / listId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_get_profile2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_get_trail1 field changed
      • addedInput schema / properties / trailId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_get_trail_gpx1 field changed
      • addedInput schema / properties / trailId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_get_trail_photos1 field changed
      • addedInput schema / properties / trailId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_get_trail_reviews1 field changed
      • addedInput schema / properties / trailId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_get_trail_weather1 field changed
      • addedInput schema / properties / trailId / pattern
        Added value: +"^\\d+$"
    • Changedalltrails_list_completed_trails2 fields changed
      • addedInput schema / properties / userId / pattern
        Added value: +"^\\d+$"
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_list_user_lists2 fields changed
      • addedInput schema / properties / userId / pattern
        Added value: +"^\\d+$"
      • addedInput schema / properties / view
        Added 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"
        +}
  2. 12 tool updatesv3.0.0
    • Changedalltrails_get_activity_feed1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_get_list_items1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_get_trail1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_get_trail_gpx1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_get_trail_photos1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_get_trail_reviews1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_get_trail_weather1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_list_completed_trails1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_list_user_lists1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_resolve_location1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedalltrails_search1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. 6 tool updatesv2.3.1
    • Changedalltrails_get_activity_feed2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "description": "Return slim projections instead of the full records (default false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_get_list_items2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "description": "Return slim per-item entries sorted by order (default false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_get_trail2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "description": "Return a slim projection instead of the full record (default false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_get_trail_photos2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "description": "Return a slim projection per photo (default false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_get_trail_reviews2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "description": "Return a slim { user, rating, comment } per review (default false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedalltrails_search2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "description": "Return slim per-result summaries capped at limit instead of the full records (default false)",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added 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. 4 tool updatesv2.0.0
    • Addedalltrails_get_list_items
    • Removedalltrails_list_trails_by_country
    • Removedalltrails_list_trails_by_state
    • Addedalltrails_resolve_location
  5. 13 tool updatesv1.0.0
    • First observedalltrails_get_activity_feed
    • First observedalltrails_get_profile
    • First observedalltrails_get_trail
    • First observedalltrails_get_trail_gpx
    • First observedalltrails_get_trail_photos
    • First observedalltrails_get_trail_reviews
    • First observedalltrails_get_trail_weather
    • First observedalltrails_healthcheck
    • First observedalltrails_list_completed_trails
    • First observedalltrails_list_trails_by_country
    • First observedalltrails_list_trails_by_state
    • First observedalltrails_list_user_lists
    • First observedalltrails_search

TDQS

A3.7/5.0

Scored across 13 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness3/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers