Skip to main content

A Model Context Protocol (MCP) server for accessing AllTrails hiking trail data

Project description

AllTrails MCP Client

A Model Context Protocol (MCP) server and Python package for searching hiking trails from AllTrails.com. Includes smart caching to avoid rate limiting.

⚠️ Important: Rate Limiting

AllTrails.com implements CAPTCHA and rate limiting. This package includes a caching system to minimize requests:

  • Cache-first: Stores up to 15 trails per park for 7 days
  • 🔄 Automatic refresh: Updates cache after expiration
  • 💾 SQLite storage: Local database (trails_cache.db)
  • 🚫 Use sparingly: Best for personal, low-volume usage

Features

  • 🥾 Search trails by US National Park (all 63 parks supported)
  • 📍 Get detailed trail information
  • 💾 Smart caching system (7-day cache)
  • 🤖 MCP server for Claude Desktop integration
  • 🛠️ CLI tools for quick searches
  • 🐍 Python API for programmatic access

Installation

From PyPI (when published)

pip install alltrails-mcp

Development Install

git clone https://github.com/dbrown540/alltrails-mcp-client.git
cd alltrails-mcp-client
pip install -e .

Quick Start

Python API

from alltrails_mcp import NationalPark, search_trails_with_cache

# Search with automatic caching
trails = search_trails_with_cache(NationalPark.YOSEMITE.value)

for trail in trails[:5]:
    print(f"{trail['name']} - {trail['difficulty']} - {trail['length']}")

CLI

# Search trails
alltrails-search search us/california/yosemite-national-park --limit 5

# Get trail details
alltrails-search details us/california/half-dome-trail

# Show cache info and location
alltrails-search cache

# Clear the cache
alltrails-search cache --clear

MCP Server (Claude Desktop)

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "alltrails": {
      "command": "/path/to/.venv/bin/python",
      "args": ["/path/to/alltrails-mcp-client/src/alltrails_mcp/server.py"]
    }
  }
}

Then ask Claude: "Find trails in Yosemite National Park"

National Parks

All 63 US National Parks are available via the NationalPark enum:

from alltrails_mcp import NationalPark, get_park_slug, list_parks

# Use enum
park = NationalPark.YOSEMITE
slug = park.value  # 'us/california/yosemite-national-park'

# Look up by name
slug = get_park_slug("Yellowstone")

# List all parks
all_parks = list_parks()

See PARKS_SUMMARY.md for complete list.

Cache Management

from alltrails_mcp import TrailCache

cache = TrailCache()

# Get cache info
info = cache.get_cache_info()
print(f"Parks cached: {info['total_parks']}")

# Clear specific park
cache.clear_cache("us/california/yosemite-national-park")

# Clear entire cache
cache.clear_cache()

# Force refresh (bypass cache)
from alltrails_mcp import search_trails_with_cache
trails = search_trails_with_cache(park_slug, force_refresh=True)

# Use custom cache location
from pathlib import Path
custom_cache = TrailCache(db_path=Path("/custom/path/cache.db"))

Cache Location:

  • Linux/macOS: ~/.cache/alltrails-mcp/trails_cache.db
  • Fallback: ~/.alltrails_mcp/trails_cache.db
  • Custom: Pass db_path to TrailCache()

The cache is automatically managed - users don't need to interact with it directly unless they want to clear it or customize the location.

Examples

See the examples/ directory:

  • demo.py - Simple demonstration of key features

Run with:

python examples/demo.py --park ZION
python examples/demo.py --stats
python examples/demo.py --clear-cache

Project Structure

alltrails-mcp-client/
├── src/alltrails_mcp/      # Main package
│   ├── __init__.py          # Package exports
│   ├── scraper.py           # AllTrails scraping logic
│   ├── cache.py             # SQLite caching system
│   ├── parks.py             # National Park enums
│   ├── server.py            # MCP server
│   └── cli.py               # Command-line interface
├── examples/                # Example scripts
├── pyproject.toml          # Package configuration
└── README.md               # This file

API Reference

Core Functions

search_trails_in_park(park_slug: str) -> List[Dict]

  • Search for trails (no caching)
  • Returns: List of trail dictionaries

search_trails_with_cache(park_slug: str, cache=None, force_refresh=False, limit=15) -> List[Dict]

  • Search with automatic caching
  • Returns cached data if valid (<7 days old)

get_trail_by_slug(slug: str) -> Dict

  • Get detailed trail information
  • Example slug: us/tennessee/alum-cave-trail

Trail Dictionary Format

{
    "name": "Half Dome Trail",
    "url": "https://www.alltrails.com/trail/...",
    "summary": "Experience this 14.2-mile...",
    "difficulty": "Hard",
    "length": "14.2 mi",
    "rating": "4.8"
}

Publishing to PyPI

See PUBLISHING.md for detailed instructions.

Quick steps:

# Build
python -m build

# Upload
twine upload dist/*

License

MIT License - See LICENSE.md

Acknowledgments

Disclaimer

This tool scrapes publicly available data from AllTrails. Use responsibly and respect AllTrails' terms of service. The caching system helps minimize requests.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

alltrails_mcp-0.1.5.tar.gz (20.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

alltrails_mcp-0.1.5-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file alltrails_mcp-0.1.5.tar.gz.

File metadata

  • Download URL: alltrails_mcp-0.1.5.tar.gz
  • Upload date:
  • Size: 20.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alltrails_mcp-0.1.5.tar.gz
Algorithm Hash digest
SHA256 3bcb0a47868a5aef8aab1dcc8a261b64cefd3b501aa1895332879f076c98c479
MD5 7aae10b178db598be6ea7eb8b2df0f57
BLAKE2b-256 14465dc8d3a89b17dde2a77221b40d2379fd646402e88ffd300d2e0a70df79f4

See more details on using hashes here.

File details

Details for the file alltrails_mcp-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: alltrails_mcp-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for alltrails_mcp-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bee93711703ce926895eece51929ddd7f323b2d2ce3388ed3f6e53466d59a0ba
MD5 c79ca2b8e624b96284eedb02741c2afa
BLAKE2b-256 e777f5e8ddb6e0dcf915d45374bbe7b9495c3eddef4f8b845118e489a942a282

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page