01 / AGENTS

Storm data for your AI agent

MCP is a standard way for AI apps such as Claude, Cursor and ChatGPT-style clients to call outside tools. Add one URL and the assistant can look up storm history, forecast risk and live weather on its own.

If you would rather write the loop yourself, there is a plain agent loop with a hard spending cap and a LangChain example. Agents with a crypto wallet can pay per call in USDC on Base with no signup: see x402. Agents that research prediction markets should read the Kalshi weather bot notes first.

MCP endpoint
server URL
https://mcp.atlasunited.io/mcp

Server name atlasunited-weather-data, version 2.5.1, six tools. Read from a live initialize and tools/list call on October 3, 2026. Free previews need no key.

02 / SET UP MCP

Connect your client

The server speaks standard MCP over HTTP. Menus and button names change between app versions, so treat these as the shape of the setup and check your client's own MCP docs.

Easiest: in Claude, add a custom connector and paste the URL above (look under Settings, Connectors). Or edit claude_desktop_config.json and use the mcp-remote bridge, which needs Node.js:

claude_desktop_config.json
{
  "mcpServers": {
    "getfixn-storm-data": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.atlasunited.io/mcp"]
    }
  }
}

Restart the app after saving. Not tested by us in Claude Desktop.

About keys

Free previews work with no key. Paid, address-level pulls need either your own GetFixn API key or an x402 payment (the tools take an x_payment argument for that). How your client passes a key to an MCP server differs by client and we have not documented every one, so for paid pulls the reliable route is the REST API with Authorization: Bearer YOUR_KEY, as in the agent loop below.

03 / THE TOOLS

Six tools

What each tool does, by our product names. The server lists the same tools.

ToolWhat it doesCost
get_weather_dataAny dataset. Call it with no arguments to get the full menu. Also coverage, facilities, wildfire, at_risk, daily, and multi-county roll-ups.Free preview by default. addresses=true needs your key or an x402 payment.
get_storm_historyPast Storm Leads by Address, last 365 days: free preview of reported and radar-detected events, address-level on the paid pull: counts, storm types, measured severities, repeat-hit properties.Free
get_risk_forecastML Storm Forecast by Address: per-peril machine-learning forecasts, address-level, 24 hours to 10 days, with structure replacement value and people per address. County grade in the free preview as a teaser. Could happen, not will.Free
get_property_storm_history_reportStorm History by Address: Reported and Radar-Detected Events Since 2003, one property. Optional date_of_loss.Preview is free and shows the price. Paid report: $0.05 per line, $10 minimum, with a key or x402.
get_current_weatherModel-Based Weather by Address, and with hours_ahead Model-Based Hourly Forecast by Address (1 to 48 hours): conditions, rain outlook and severe alerts for a US coordinate.Lean response free. details=true is $0.0002 per call.
get_address_reportOne property: 365-day storm snapshot near the exact address plus current county forecast grade.See the tool description and the free preview first.

Storm data means reported and radar-detected events matched to addresses. Forecast risk means it could happen, not that it will. Neither is an inspection or damage assessment. US coverage.

04 / PROMPTS

Prompts you can paste

Start with these once the server is connected. They only use free previews unless you say otherwise.

Free forecast for a county
paste into your assistant
Use the get_risk_forecast tool for Dallas County, TX and explain the result in plain English. Remind me this is a forecast of what could happen, not what will, and it can be wrong.
Free storm history preview
paste into your assistant
Use get_storm_history for Travis County, TX over the last 30 days. Tell me the event counts by storm type. Describe them as reported and radar-detected storms.
Live weather at a point
paste into your assistant
Use get_current_weather for latitude 35.47, longitude -97.52. Give me temperature, wind and any active severe weather alerts.
What does a full report cost?
paste into your assistant
Use get_property_storm_history_report for 891 Lake Hollow Blvd SW, Marietta, GA 30064 with addresses left false, so it is only the free preview. Tell me the line count and the exact price. Do not buy anything.
Menu of everything
paste into your assistant
Call get_weather_data with no arguments and show me the full menu exactly as returned.
Standing rules for a storm-data agent
paste into your assistant
You help me look up storm data using the GetFixn tools. Always start with free previews. Before any paid pull, tell me the price and wait for me to say yes. Say reported and radar-detected. Forecasts show what could happen, not what will. You provide data, not trading or investment advice, and you never suggest trades.

05 / CODE

Agent loop with a spending cap

The tool-calling loop below gives an LLM two tools backed by the REST API. Every call has a known price, so the loop adds up the spend and refuses to go past MAX_USD. It uses the same gf_client.py as the bots, which handles 402 and backoff.

ArchitectureYour questionpython agent_loop.pymessages + toolsLLMAnthropic SDK, swap as you liketool_useagent_loop.pychecks the budget firstPOST /v1/portfolio/risk, /v1/weather/batchGetFixn APIdata.truefixr.com
Cost

$0.05 per place for grades, $0.0002 per place for weather, plus whatever your LLM provider charges. The cap stops GetFixn spend at $1.00 by default.

agent_loop.pyDownload
"""A plain tool-calling agent loop over GetFixn, with a hard spending cap. No agent framework.
pip install anthropic requests
export ANTHROPIC_API_KEY=...  ANTHROPIC_MODEL=<a model id you have access to>  GETFIXN_KEY=tfx_live_...
python agent_loop.py "Which of my saved places has the worst county forecast grade today?"
Each grade lookup costs $0.05, each weather lookup $0.0002. The loop stops at MAX_USD (default $1.00).
Any LLM with tool calling works the same way: swap the call in step().
"""
import json
import os
import sys

import gf_client as gf

LOCS = gf.load_locations(os.environ.get("LOCATIONS", "locations.json"))
PRICE = {"forecast_grades": 0.05, "live_weather": 0.0002}  # per location
TOOLS = [
    {"name": "forecast_grades", "description": "county forecast grade A (low) to F (extreme) for saved places. A forecast, not a certainty. $0.05 per place.",
     "input_schema": {"type": "object", "properties": {"places": {"type": "array", "items": {"type": "string"}}}, "required": ["places"]}},
    {"name": "live_weather", "description": "Live temperature and active severe alerts for saved places. $0.0002 per place.",
     "input_schema": {"type": "object", "properties": {"places": {"type": "array", "items": {"type": "string"}}}, "required": ["places"]}},
]


def run_tool(name, args, spent, cap):
    locs = [gf.pick(LOCS, p) for p in args["places"]]
    cost = PRICE[name] * len(locs)
    if spent + cost > cap:
        return "REFUSED: this would exceed the $%.2f budget. Answer with what you already have." % cap, 0.0
    try:
        out = gf.grades(locs) if name == "forecast_grades" else gf.weather(locs)
    except (gf.LowBalance, ValueError, RuntimeError) as e:
        return "ERROR: %s" % e, 0.0
    return json.dumps(out), cost


def step(client, model, messages):
    return client.messages.create(model=model, max_tokens=1024, tools=TOOLS, messages=messages,
                                  system="Storm data assistant. Use the tools. Say it is a forecast and can be wrong. "
                                         "You give data, never trading or investment advice.")


def main(question, client=None, cap=float(os.environ.get("MAX_USD", "1.00"))):
    if client is None:
        import anthropic
        client = anthropic.Anthropic()
    model, spent = os.environ.get("ANTHROPIC_MODEL", ""), 0.0
    messages = [{"role": "user", "content": question}]
    for _ in range(6):  # hard limit on loop turns
        resp = step(client, model, messages)
        if resp.stop_reason != "tool_use":
            return "".join(b.text for b in resp.content if b.type == "text"), spent
        messages.append({"role": "assistant", "content": resp.content})
        results = []
        for b in resp.content:
            if b.type == "tool_use":
                text, cost = run_tool(b.name, b.input, spent, cap)
                spent += cost
                results.append({"type": "tool_result", "tool_use_id": b.id, "content": text})
        messages.append({"role": "user", "content": results})
    return "stopped: too many turns", spent


if __name__ == "__main__":
    answer, spent = main(" ".join(sys.argv[1:]) or "Which saved place has the worst county forecast grade?")
    print(answer, "\n[spent about $%.4f]" % spent)

LangChain with the MCP server

Or let LangChain load the MCP tools directly. This is the shape from the langchain-mcp-adapters docs. We have not run it against this server, so test with the free preview first.

langchain_agent.py (untested)
# pip install langchain-mcp-adapters langgraph "langchain[anthropic]"
# export ANTHROPIC_API_KEY=...   (use any chat model LangChain supports)
import asyncio, os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent

async def main():
    client = MultiServerMCPClient({
        "storm": {"url": "https://mcp.atlasunited.io/mcp", "transport": "streamable_http"},
    })
    tools = await client.get_tools()          # the six tools listed above
    agent = create_react_agent(os.environ["LLM"], tools)   # e.g. "anthropic:<model id you have>"
    out = await agent.ainvoke({"messages": [("user",
        "Using only the free preview tools, give me the storm forecast risk for Dallas County, TX. "
        "Say it is a forecast and can be wrong.")]})
    print(out["messages"][-1].content)

asyncio.run(main())

06 / AGENT SAFETY

Let agents spend, but cap it

Budget in code
Do not rely on the model to count. Put the cap in your code, as the loop above does, and stop the run when it is reached.
Free first, ask before paying
Previews are free on every dataset and show the count and the price. Have the agent show the price and wait for a yes before any paid pull.
No keys in chat
Never paste an API key or a wallet key into a chat with a model. Use environment variables on your own machine.

GetFixn sells data, not trading advice. Nothing here is investment advice. Forecasts can be wrong. You are responsible for your own strategies, for the agents you build, and for following the rules of any exchange or market you use. Not affiliated with NOAA or the National Weather Service. Kalshi is a trademark of its owner; we have no partnership with or endorsement from any exchange. Heavy or commercial/trading volume? Email admin@truefixr.com.