SkyFi MCP Server
A production-ready MCP server for SkyFi's satellite imagery Platform API. Search 150+ satellites from 12+ providers, compare pricing, and order archive or tasking imagery — all through natural language with any AI agent.
SkyFi aggregates imagery from Planet, Vantor, ICEYE, Umbra, Satellogic, and others into a single API with transparent pricing and no contracts. This MCP server makes that API accessible to Claude, GPT, Gemini, LangChain, and any MCP-compatible agent.
Architecture
graph LR
A[AI Agent] -->|MCP Protocol| B[SkyFi MCP Server]
B -->|REST API| C[SkyFi Platform API]
B -->|Nominatim| K[OpenStreetMap]
C --> D[Planet]
C --> E[Vantor]
C --> F[ICEYE]
C --> G[Umbra]
C --> H[Satellogic]
C --> I[Sentinel-1/2]
C --> J[12+ more...]
Quick Start (< 5 minutes)
1. Install
pip install skyfi-mcp
# or from source:
git clone https://github.com/jpwilson/skyfi-mcp.git
cd skyfi-mcp && pip install -e .
2. Configure
export SKYFI_API_KEY=your_api_key # Get one at https://app.skyfi.com
3. Run
# Remote server (production)
skyfi-mcp
# → Listening at http://localhost:8000/mcp
# Local stdio (development)
SKYFI_MCP_TRANSPORT=stdio skyfi-mcp
4. Connect your agent
Claude Desktop — add to claude_desktop_config.json: ``json { "mcpServers": { "skyfi": { "url": "http://localhost:8000/mcp" } } } ``
Claude Code: ``bash claude mcp add skyfi http://localhost:8000/mcp ``
5. Try it (free)
"Find free Sentinel-2 imagery over the Amazon basin"
This uses open data ($0) — no credit card needed.
Tools (20)
| Tool | Description | |---|---| | SkyFi API | | | skyfi_whoami | Check account status, budget, payment method | | skyfi_search_archives | Search archive imagery by location, date, sensor, provider | | skyfi_get_archive | Get full details for an archive image | | skyfi_get_pricing | Get pricing by AOI, product type, provider | | skyfi_create_feasibility | Create tasking feasibility check | | skyfi_get_feasibility | Poll feasibility results and provider windows | | skyfi_predict_passes | Satellite pass prediction for tasking timing | | skyfi_create_archive_order | Stage an archive order (shows price, requires confirmation) | | skyfi_create_tasking_order | Stage a tasking order (shows price, requires confirmation) | | skyfi_confirm_order | Execute a staged order (this commits money) | | skyfi_list_orders | List orders with status/type filters | | skyfi_get_order | Get order details | | skyfi_redeliver_order | Redeliver completed order to different cloud bucket | | skyfi_get_deliverables | Get download URLs for completed orders | | skyfi_create_notification | Set up AOI monitoring with webhook alerts | | skyfi_list_notifications | List active monitoring notifications | | skyfi_manage_notification | Get or delete a notification | | OpenStreetMap | | | osm_geocode | Convert place names to coordinates + SkyFi-ready WKT polygons | | osm_reverse_geocode | Convert coordinates to place names and addresses | | osm_search_nearby | Find features (airports, ports, etc.) near a location |
Ordering Safety
Orders use a two-step confirmation pattern:
- Stage —
skyfi_create_archive_orderorskyfi_create_tasking_ordercalls the API and returns a price summary - Confirm — Only
skyfi_confirm_ordermarks the order as human-approved
Order: VANTOR 30cm DAY, 12.4 sq km, $847. Deliver to S3. Confirm?
Free open-data orders ($0 Sentinel-1/2) still show confirmation but note "Free — no charge."
Tasking Workflow
1. skyfi_create_feasibility → get feasibility ID
2. skyfi_get_feasibility → poll for provider windows
3. skyfi_predict_passes → (optional) check satellite timing
4. skyfi_create_tasking_order → stage with selected provider/window
5. skyfi_confirm_order → execute after human approval
Provider-specific: Planet supports provider_window_id selection from feasibility results.
AI Provider Integration
| Provider | Method | Example | |---|---|---| | Claude Desktop | MCP config | Setup guide | | Claude Code | claude mcp add | Setup guide | | OpenAI | Function calling | examples/openai_example.py | | Anthropic SDK | Tool use | examples/anthropic_example.py | | Google Gemini | Function calling | examples/gemini_example.py | | Google ADK | MCPToolset | examples/adk_example.py | | LangChain | MCP adapter | examples/langchain_example.py | | Vercel AI SDK | MCP client | Setup guide |
Deployment
Railway (recommended for cloud)
railway login && railway init
railway variables set SKYFI_API_KEY=your_key
railway up
# → https://your-project.up.railway.app/mcp
Docker
docker build -t skyfi-mcp .
docker run -p 8000:8000 -e SKYFI_API_KEY=your_key skyfi-mcp
Or with docker-compose: ``bash echo "SKYFI_API_KEY=your_key" > .env docker-compose up ``
Configuration
Auth is resolved in priority order:
X-Skyfi-Api-Keyrequest header (cloud deployment)SKYFI_API_KEYenvironment variable- Config file at
~/.skyfi/config.json(orSKYFI_CONFIG_PATH)
Environment variables: | Variable | Default | Description | |---|---|---| | SKYFI_API_KEY | — | SkyFi Platform API key | | SKYFI_MCP_HOST | 0.0.0.0 | Server bind host | | SKYFI_MCP_PORT | 8000 | Server bind port | | SKYFI_MCP_TRANSPORT | streamable-http | Transport: streamable-http, sse, stdio | | SKYFI_API_BASE_URL | https://app.skyfi.com/platform-api | API base URL override |
AOI Constraints
- Format: WKT
POLYGON(convex) - Max vertices: 500
- Max area: 500,000 sq km
- Coordinates: longitude latitude (WGS84)
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=skyfi_mcp --cov-report=term-missing
# Lint
ruff check src/ tests/
# Type check
mypy src/
# Security scan
bandit -r src/
Documentation
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Write tests for new functionality
- Run the full test suite (
pytest) - Run linting and type checks (
ruff check . && mypy src/) - Commit with descriptive messages
- Open a pull request
License
MIT — see LICENSE.












