Skip to main content
Real-time International Space Station location from a public API. Demonstrates the simplest MCP pattern: no authentication, just tools that return data. GitHub: poke-mcp-examples/iss-tracker Authentication: None Who should follow this: Developers new to MCP, building integrations for public APIs, or learning the basics of tool design.

What to Notice

1. No Authentication Configuration

from fastmcp import FastMCP

mcp = FastMCP("ISS Position Tracker")  # No auth parameter

@mcp.tool(description="Get ISS location with coordinates and altitude")
async def get_iss_location() -> str:
    # No token validation
    # No user context
    # Just fetch and return data
    async with httpx.AsyncClient() as client:
        response = await client.get("https://api.wheretheiss.at/v1/satellites/25544")
        data = response.json()
        # Format and return...
Why: Public API, no user-specific data, no credentials needed. FastMCP accepts all requests. This is the baseline - everything else adds complexity.

2. Human-Readable Responses for Conversational AI

Don’t return raw JSON. Format for natural language:
@mcp.tool(description="Get ISS location with coordinates and altitude")
async def get_iss_location() -> str:
    async with httpx.AsyncClient() as client:
        response = await client.get("https://api.wheretheiss.at/v1/satellites/25544")
        data = response.json()

        lat = data.get("latitude")
        lon = data.get("longitude")
        lat_dir = "N" if lat >= 0 else "S"
        lon_dir = "E" if lon >= 0 else "W"

        # Return natural language, not {"lat": 45.23, "lon": -122.45}
        return (
            f"The ISS is currently at {abs(lat):.2f}° {lat_dir}, {abs(lon):.2f}° {lon_dir}, "
            f"flying at an altitude of {data['altitude']:.2f} km "
            f"and traveling at {data['velocity']:.2f} km/h."
        )
Why: Poke’s task agents present this directly to users. No additional formatting. More natural for conversation.

3. Minimal Server (20 Lines)

from fastmcp import FastMCP
import httpx

mcp = FastMCP("ISS Position Tracker")

@mcp.tool(description="Get ISS location with coordinates and altitude")
async def get_iss_location() -> str:
    async with httpx.AsyncClient() as client:
        response = await client.get("https://api.wheretheiss.at/v1/satellites/25544")
        response.raise_for_status()  # FastMCP catches exceptions automatically
        data = response.json()

        lat, lon = data["latitude"], data["longitude"]
        lat_dir = "N" if lat >= 0 else "S"
        lon_dir = "E" if lon >= 0 else "W"

        return (
            f"The ISS is currently at {abs(lat):.2f}° {lat_dir}, {abs(lon):.2f}° {lon_dir}, "
            f"flying at {data['altitude']:.2f} km and traveling at {data['velocity']:.2f} km/h."
        )

if __name__ == "__main__":
    mcp.run(transport="http", host="0.0.0.0", port=8000, stateless_http=True)
Why: That’s it. A complete working MCP server. Define tools, return data, run. Perfect for learning.

Quick Start

# Clone
git clone https://github.com/InteractionCo/poke-mcp-examples.git
cd poke-mcp-examples/iss-tracker

# Environment
conda create -n iss-tracker python=3.12
conda activate iss-tracker

# Install
pip install -r requirements.txt

# Run
python src/server.py
Connect to Poke at http://localhost:8000/mcp (local testing) or deploy to Render for HTTPS. Deployment: See repo README for Render deployment.

Key Takeaway

Learning MCP? Start here. No authentication, no complexity - just tools that return data. Once you understand this, add auth patterns as needed. This is your baseline.