outdooriq-mcp

outdooriq-mcp

Provides lake conditions, fish-stocking records, fishing-favorability scoring, and live weather for outdoor recreation AI agents, powering trip-planning and fishing apps with 72,000+ US lakes and 293,000+ stocking events.

Category
访问服务器

README

OutdoorIQ MCP — Outdoor Recreation Intelligence

Powered by 72,000+ US lakes and 293,000+ stocking events across 12 states.

OutdoorIQ MCP is a paid MCP server that exposes lake conditions, fish-stocking records, fishing-favorability scoring, and live weather to AI agents. It is built on the CastIQ dataset (the same data that powers fishing-seo.pages.dev and the CastIQ catalog APIs).

If you're building a trip-planning assistant, a fishing app, a travel concierge, or an outdoor-brand agent that needs to recommend lakes, time visits to recent stocking events, or pull a fishing report on demand, this is the data layer you wire up.

For consumer-facing AI products, OutdoorIQ replaces a ten-source ETL with one authenticated MCP endpoint — and bills predictably so you don't get a surprise S3 invoice the first weekend traffic spikes.


Pricing

Tier Price Limits
Free $0 outdooriq-dev-key-001, 50 calls/day
Pro $14/mo Unlimited
Pay-as-you-go $0.01/call No monthly minimum

Listing & checkout: https://mcpize.com/outdooriq-mcp


Install in Claude

Live URL: https://mcp.castiq.net/mcp (Railway fallback: https://web-production-9b8950.up.railway.app/mcp)

The fastest path uses mcp-remote as a stdio→HTTP bridge:

claude mcp add outdooriq-mcp -- npx -y mcp-remote \
  https://mcp.castiq.net/mcp \
  --header "X-API-Key:outdooriq-dev-key-001"

Or configure manually:

{
  "mcpServers": {
    "outdooriq-mcp": {
      "url": "https://mcp.castiq.net/mcp",
      "headers": { "X-API-Key": "outdooriq-dev-key-001" }
    }
  }
}

Anthropic MCP Registry entry: io.github.bch1212/outdooriq-mcp — listed at https://registry.modelcontextprotocol.io.

Example agent prompt:

"Find top 5 trout lakes near Chicago for this weekend."

The agent calls get_nearby_lakes (lat/lng of Chicago, radius 200mi), filters for species: trout via get_top_lakes, then pulls get_fishing_report_summary for the top match.


Tool Reference

Tool Args Returns
search_lakes name?, state?, county?, min_acres?, max_acres?, limit? List of matching lakes
get_lake_details lake_id Coords, acreage, depth, species, facilities
get_stocking_data lake_id?, species?, year?, limit? Recent stocking events
get_fishing_score lake_id 0-100 score with bucket breakdown
get_nearby_lakes lat, lng, radius_miles?, min_score?, limit? Lakes near GPS, sorted by score
get_weather_for_lake lake_id Current + 7-day forecast (Open-Meteo)
get_top_lakes state?, species?, limit? Highest-scoring lakes
get_stocking_schedule state?, species?, month?, limit? Most-recent matching events as a planning prior
search_species state?, season? Actively-stocked species
get_fishing_report_summary lake_id Natural-language report

Architecture

client (Claude / agent)
        │  HTTP POST /mcp  (JSON-RPC 2.0)
        ▼
   FastAPI app (server.py)
        │  X-API-Key auth + per-day rate limiter
        ▼
  Tool registry (10 tools)
        │
        ▼
  db.connection.py  ──────┐
        │ Postgres mode  │  → CastIQ Postgres (72k lakes, 293k stockings)
        │ SQLite fallback│  → bundled seed (100+ lakes, ~150 stockings)
        ▼
  tools.* (lakes, stocking, scoring, weather, reports)
        │
        ▼
  Open-Meteo (no key)

Postgres vs SQLite mode

The server picks a backend at startup:

  1. If DATABASE_URL is set, it tries asyncpg.create_pool. On success → logs [OutdoorIQ] Running in Postgres mode.
  2. If the pool fails (timeout, bad creds, DB down) or DATABASE_URL is unset, the server seeds an in-memory SQLite DB with 100+ real lakes and logs [OutdoorIQ] Running in SQLite fallback mode.

The server always starts, regardless of Postgres availability.

Capability Postgres mode SQLite fallback
Lake catalog 72,669 (12 states) ~106 (WI, MN, IL, IA, MO)
Stocking events 293,821 historical ~150 templated, recency-tuned
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)
Year-over-year analysis Yes — multi-year stockings Limited — events are anchored relative to "now"
Stocking-schedule tool Real historical patterns Approximated from seed
Weather, scoring, reports Identical Identical

Local development

git clone <this repo>
cd mcp-outdoors
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# Run with SQLite fallback (no DATABASE_URL needed)
python -m run

# OR run against the CastIQ Postgres
export DATABASE_URL=postgresql://vikinetic:vikinetic_dev@localhost:5444/vikinetic
python -m run

Then:

curl -s http://localhost:8080/health
curl -s -X POST http://localhost:8080/mcp \
  -H "X-API-Key: outdooriq-dev-key-001" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tests

pytest -v

The test suite covers both the SQLite fallback path and the Postgres dispatch path (via a mocked asyncpg pool), plus auth, rate limits, all 10 tools, JSON-RPC initialize / list / call, and the scoring algorithm's bucket math.


Deploy to Railway

A deploy.sh script is included at the repo root. Run it on your Mac (the Cowork sandbox can't reach Railway/Stripe/Cloudflare APIs):

./deploy.sh

It expects RAILWAY_API_TOKEN (or RAILWAY_TOKEN exported as RAILWAY_API_TOKEN), points the project at nixpacks.toml, and sets the DATABASE_URL env var if you've also provisioned the CastIQ Postgres on Railway.

Railway gotcha (already handled): Railway exec's startCommand without a shell, so $PORT doesn't expand. We use python -m run and read PORT from os.environ inside run.py.


MCPize listing copy

OutdoorIQ MCP — the data layer for outdoor-rec AI agents. 72,000+ US lakes, 293,000+ fish-stocking events, and live weather behind one authenticated endpoint. Search lakes by name, state, or acreage; pull stocking history filtered by species and month; compute a 0-100 fishing-favorability score that bakes in recency, species diversity, lake size, and current conditions. One JSON-RPC call replaces a multi-source ETL.

Built for fishing apps, trip-planning assistants, travel concierges, and outdoor-brand agents. $14/mo Pro for unlimited use, or pay $0.01 per call. Free dev tier (50 calls/day) lets you ship a prototype before opening your wallet. Install with claude mcp add outdooriq-mcp --url https://mcp-outdoors.up.railway.app/mcp.


License

MIT. See LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选