A tiny Model Context Protocol server that lets an AI assistant answer “who is in space right now?” and “where is the ISS?” using the free, no-API-key Open Notify service.
Great as a first MCP demo: two live tools, zero credentials, always-changing data. It also ships a live web map of both crewed space stations (see below).
🌐 Live map (GitHub Pages): https://andresapitt.github.io/ceai-mcp-iss/

| Tool | Arguments | Returns |
|---|---|---|
whos_in_space |
none | People currently in orbit, grouped by spacecraft |
iss_location |
none | Live latitude/longitude of the ISS + a map link |
space_briefing |
none | A composed summary (people + ISS position) from both sources — the “customer briefing” pattern |
npm install
npm run build
A web page that plots both crewed space stations — the ISS and China’s Tiangong (CSS) — on a world map. Hover a marker to see who’s on board. Each station has a coloured fading trail and the positions update every second.
npm run web
# then open http://localhost:3000
How it works:
web/server.mjs serves the page and proxies two free, no-key sources
server-side (so the browser never hits a CORS wall):
Open Notify (/api/astros — who is on each craft) and CelesTrak
(/api/tle?id=… — each station’s orbital elements, cached for an hour).PORT=8080 npm run web.GitHub Pages only serves static files over HTTPS — it can’t run the Node
proxy in web/server.mjs. So a static build lives in docs/ that talks
to the data sources directly:
docs/crew.json,
because Open Notify is HTTP-only and a browser on an HTTPS page blocks it as
“mixed content”. Crew changes only every few months.Enable it (one time): repo Settings → Pages → Build and deployment →
Source: Deploy from a branch → Branch: main, folder: /docs → Save.
After a minute the site is live at
https://andresapitt.github.io/ceai-mcp-iss/.
To refresh the crew snapshot (e.g. after a crew rotation):
curl -s http://api.open-notify.org/astros.json -o docs/crew.json
git commit -am "Update crew snapshot" && git push
The MCP server itself cannot run on Pages — it’s a stdio process an AI client launches, not a web page. Pages hosts only the visual map.
There are two ways to run it.
npm run demo
This launches the server, discovers the tools, calls each one, and prints the
live results. Uses the small MCP client in demo.mjs. Great for a quick
“it works” check or a screen-share where you narrate each tool call.
(npm start is also available — it starts the server on stdio and waits for
raw JSON-RPC on stdin, for manual testing.)
This is the version to present — you ask Claude a question and it calls your tool. See the next section for setup, then ask:
Claude shows a “used tool” indicator and answers from the live data.
Presenting tips
npm run demo open as a backup in case Claude Desktop is
slow to reconnect.Add this to your claude_desktop_config.json
(Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"whos-in-space": {
"command": "node",
"args": [
"C:\\Users\\andre\\OneDrive - vStream\\Documents\\Andrés\\courses\\AI in Business\\Customer Engagement and AI\\projects\\mcp\\dist\\index.js"
]
}
}
}
Steps:
notepad "$env:APPDATA\Claude\claude_desktop_config.json" in PowerShell).
Merge the whos-in-space entry into any existing mcpServers — don’t delete
what’s already there.whos-in-space
with 3 tools.If the tools don’t appear: recheck the path (double backslashes \\) and make
sure npm run build has been run so dist\index.js exists.
npx (no dist path to hardcode)After npm run build, you can let the client run the package by folder instead
of pointing at dist/index.js:
{
"mcpServers": {
"whos-in-space": {
"command": "npx",
"args": [
"C:\\Users\\andre\\OneDrive - vStream\\Documents\\Andrés\\courses\\AI in Business\\Customer Engagement and AI\\projects\\mcp"
]
}
}
}
npx <folder> resolves the bin entry in package.json and runs it.
src/index.ts creates an McpServer, registers two tools, and speaks the MCP
protocol over stdio (stdout = protocol, stderr = logs).fetch to Open Notify and formats the result as text.MIT © 2026 Andrés Apitt