Skip to main content
Glama

Athena Agent — live earthquake feed

An Athena AI agent backed by an MCP server. It pulls real seismic readings from the USGS public feed and renders them in an interactive widget inside the chat.

Run it

npm install
npm start          # http://localhost:8787/mcp

Verify before touching Athena:

npx @modelcontextprotocol/inspector@latest --server-url http://localhost:8787/mcp --transport http

You should see one tool, get_recent_earthquakes, and one resource, ui://widget/quakes.html, with mimeType text/html+skybridge.

Related MCP server: usgs-earthquakes

Expose over HTTPS

Athena requires HTTPS. For development:

ngrok http 8787

Register the agent at https://athenachat.bot/chatbot/mybots/create and set the MCP URL to https://<your-subdomain>.ngrok.app/mcp — the /mcp path is required.

For a URL that survives past the demo, push this repo and deploy to Render or Railway. Build command npm install, start command npm start. Both inject PORT, which the server reads.

Prompts that trigger the tool

  • "Show me recent earthquakes"

  • "Has there been any seismic activity today?"

  • "Any big quakes in the past week?"

What makes the widget interactive

Control

Behaviour

Magnitude slider

Filters instantly in the browser, no server call

Row click

Expands depth, coordinates, tsunami flag

Time window buttons

Calls get_recent_earthquakes again via window.openai.callTool and re-renders with fresh data

State survives re-render through window.openai.setWidgetState.

Adapting this to another data source

Two places change, both marked in the code.

  1. server.js — the fetchData function. Return { items: [...], meta: {...} }. Also update the tool name, description, and inputSchema to match the new domain.

  2. public/widget.html — the render function, and the two control handlers.

Everything else (transport, resource registration, CORS, metadata) is domain-agnostic.

Things that will waste your time

  • window.openai is undefined → the resource mimeType is not exactly text/html+skybridge.

  • callTool does nothing → the tool is missing _meta["openai/widgetAccessible"]: true.

  • Widget can't fetch an API directly → the iframe CSP blocks it. Fetch server-side.

  • Athena still shows old tools → Settings → Connectors → Refresh.

  • Athena's docs import @modelcontextprotocol/sdk/server/streamable-http.js. That path does not exist. It is streamableHttp.js.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides access to the USGS Quakes API within Claude Desktop, enabling users to retrieve earthquake data and details through natural language queries.
    3
    8 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to the USGS Earthquake Catalog for querying earthquake events via the FDSNWS API, enabling natural language questions about earthquake data.
    3 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server wrapping the USGS Earthquake Hazards API, enabling AI assistants to search the global earthquake catalog, look up event details, count quakes, find 'Did You Feel It' reports, and read realtime feeds.
    5
    MIT