{
  "markdown": "# OutdoorIQ MCP — Outdoor Recreation Intelligence\n\n> **Powered by 72,000+ US lakes and 293,000+ stocking events across 12 states.**\n\nOutdoorIQ MCP is a paid MCP server that exposes lake conditions, fish-stocking\nrecords, fishing-favorability scoring, and live weather to AI agents. It is\nbuilt on the CastIQ dataset (the same data that powers\n[fishing-seo.pages.dev](https://fishing-seo.pages.dev) and the CastIQ catalog\nAPIs).\n\nIf you're building a **trip-planning assistant**, a **fishing app**, a\n**travel concierge**, or an **outdoor-brand agent** that needs to recommend\nlakes, time visits to recent stocking events, or pull a fishing report on\ndemand, this is the data layer you wire up.\n\nFor consumer-facing AI products, OutdoorIQ replaces a ten-source ETL with one\nauthenticated MCP endpoint — and bills predictably so you don't get a surprise\nS3 invoice the first weekend traffic spikes.\n\n---\n\n## Pricing\n\n| Tier  | Price        | Limits                            |\n|-------|--------------|-----------------------------------|\n| Free  | $0           | `outdooriq-dev-key-001`, 50 calls/day |\n| Pro   | **$14/mo**   | Unlimited                         |\n| Pay-as-you-go | **$0.01/call** | No monthly minimum         |\n\nListing & checkout: <https://mcpize.com/outdooriq-mcp>\n\n---\n\n## Install in Claude\n\n**Live URL:** `https://mcp.castiq.net/mcp` (Railway fallback: `https://web-production-9b8950.up.railway.app/mcp`)\n\nThe fastest path uses [`mcp-remote`](https://github.com/geelen/mcp-remote) as a stdio→HTTP bridge:\n\n```bash\nclaude mcp add outdooriq-mcp -- npx -y mcp-remote \\\n  https://mcp.castiq.net/mcp \\\n  --header \"X-API-Key:outdooriq-dev-key-001\"\n```\n\nOr configure manually:\n\n```json\n{\n  \"mcpServers\": {\n    \"outdooriq-mcp\": {\n      \"url\": \"https://mcp.castiq.net/mcp\",\n      \"headers\": { \"X-API-Key\": \"outdooriq-dev-key-001\" }\n    }\n  }\n}\n```\n\n**Anthropic MCP Registry entry:** `io.github.bch1212/outdooriq-mcp` —\nlisted at <https://registry.modelcontextprotocol.io>.\n\n**Example agent prompt:**\n> \"Find top 5 trout lakes near Chicago for this weekend.\"\n\nThe agent calls `get_nearby_lakes` (lat/lng of Chicago, radius 200mi),\nfilters for `species: trout` via `get_top_lakes`, then pulls\n`get_fishing_report_summary` for the top match.\n\n---\n\n## Tool Reference\n\n| Tool | Args | Returns |\n|------|------|---------|\n| `search_lakes` | `name?, state?, county?, min_acres?, max_acres?, limit?` | List of matching lakes |\n| `get_lake_details` | `lake_id` | Coords, acreage, depth, species, facilities |\n| `get_stocking_data` | `lake_id?, species?, year?, limit?` | Recent stocking events |\n| `get_fishing_score` | `lake_id` | 0-100 score with bucket breakdown |\n| `get_nearby_lakes` | `lat, lng, radius_miles?, min_score?, limit?` | Lakes near GPS, sorted by score |\n| `get_weather_for_lake` | `lake_id` | Current + 7-day forecast (Open-Meteo) |\n| `get_top_lakes` | `state?, species?, limit?` | Highest-scoring lakes |\n| `get_stocking_schedule` | `state?, species?, month?, limit?` | Most-recent matching events as a planning prior |\n| `search_species` | `state?, season?` | Actively-stocked species |\n| `get_fishing_report_summary` | `lake_id` | Natural-language report |\n\n---\n\n## Architecture\n\n```\nclient (Claude / agent)\n        │  HTTP POST /mcp  (JSON-RPC 2.0)\n        ▼\n   FastAPI app (server.py)\n        │  X-API-Key auth + per-day rate limiter\n        ▼\n  Tool registry (10 tools)\n        │\n        ▼\n  db.connection.py  ──────┐\n        │ Postgres mode  │  → CastIQ Postgres (72k lakes, 293k stockings)\n        │ SQLite fallback│  → bundled seed (100+ lakes, ~150 stockings)\n        ▼\n  tools.* (lakes, stocking, scoring, weather, reports)\n        │\n        ▼\n  Open-Meteo (no key)\n```\n\n### Postgres vs SQLite mode\n\nThe server picks a backend at startup:\n\n1. If `DATABASE_URL` is set, it tries `asyncpg.create_pool`. On success →\n   logs `[OutdoorIQ] Running in Postgres mode`.\n2. If the pool fails (timeout, bad creds, DB down) **or** `DATABASE_URL` is\n   unset, the server seeds an in-memory SQLite DB with 100+ real lakes and\n   logs `[OutdoorIQ] Running in SQLite fallback mode`.\n\nThe server **always starts**, regardless of Postgres availability.\n\n| Capability | Postgres mode | SQLite fallback |\n|------------|--------------|-----------------|\n| Lake catalog | 72,669 (12 states) | ~106 (WI, MN, IL, IA, MO) |\n| Stocking events | 293,821 historical | ~150 templated, recency-tuned |\n| Species coverage | All states/species in CastIQ | Curated subset (walleye, bass, musky, trout, crappie, perch, pike, panfish, salmon, lake_trout, sauger, white_bass, sturgeon, catfish, bluegill, smallmouth_bass) |\n| Year-over-year analysis | Yes — multi-year stockings | Limited — events are anchored relative to \"now\" |\n| Stocking-schedule tool | Real historical patterns | Approximated from seed |\n| Weather, scoring, reports | Identical | Identical |\n\n---\n\n## Local development\n\n```bash\ngit clone <this repo>\ncd mcp-outdoors\npython3 -m venv .venv && source .venv/bin/activate\npip install -r requirements.txt\n\n# Run with SQLite fallback (no DATABASE_URL needed)\npython -m run\n\n# OR run against the CastIQ Postgres\nexport DATABASE_URL=postgresql://vikinetic:vikinetic_dev@localhost:5444/vikinetic\npython -m run\n```\n\nThen:\n\n```bash\ncurl -s http://localhost:8080/health\ncurl -s -X POST http://localhost:8080/mcp \\\n  -H \"X-API-Key: outdooriq-dev-key-001\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'\n```\n\n### Tests\n\n```bash\npytest -v\n```\n\nThe test suite covers both the SQLite fallback path and the Postgres dispatch\npath (via a mocked `asyncpg` pool), plus auth, rate limits, all 10 tools,\nJSON-RPC initialize / list / call, and the scoring algorithm's bucket math.\n\n---\n\n## Deploy to Railway\n\nA `deploy.sh` script is included at the repo root. Run it on your Mac (the\nCowork sandbox can't reach Railway/Stripe/Cloudflare APIs):\n\n```bash\n./deploy.sh\n```\n\nIt expects `RAILWAY_API_TOKEN` (or `RAILWAY_TOKEN` exported as `RAILWAY_API_TOKEN`),\npoints the project at `nixpacks.toml`, and sets the `DATABASE_URL` env var if\nyou've also provisioned the CastIQ Postgres on Railway.\n\n> **Railway gotcha (already handled):** Railway exec's `startCommand`\n> without a shell, so `$PORT` doesn't expand. We use `python -m run` and read\n> `PORT` from `os.environ` inside `run.py`.\n\n---\n\n## MCPize listing copy\n\n> **OutdoorIQ MCP — the data layer for outdoor-rec AI agents.** 72,000+ US\n> lakes, 293,000+ fish-stocking events, and live weather behind one\n> authenticated endpoint. Search lakes by name, state, or acreage; pull\n> stocking history filtered by species and month; compute a 0-100\n> fishing-favorability score that bakes in recency, species diversity, lake\n> size, and current conditions. One JSON-RPC call replaces a multi-source\n> ETL.\n>\n> Built for fishing apps, trip-planning assistants, travel concierges, and\n> outdoor-brand agents. $14/mo Pro for unlimited use, or pay $0.01 per call.\n> Free dev tier (50 calls/day) lets you ship a prototype before opening your\n> wallet. Install with `claude mcp add outdooriq-mcp --url\n> https://mcp-outdoors.up.railway.app/mcp`.\n\n---\n\n## License\n\nMIT. See `LICENSE`.\n",
  "bytes": 7164,
  "sha": "a27267eead5d6e36b47fe1904cb43cf07cb9fced8964f8d603f06010c2dbfb22",
  "repo_slug": "bch1212/outdooriq-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_bch1212_outdooriq_mcp_2cf468a7/readme"
}