How do I add UFC data to Claude or ChatGPT with MCP?
Add https://api.ufcalendar.com/mcp as a custom connector in Claude or ChatGPT and sign in with your UFCalendar account, or register it in Claude Code, Cursor or Codex with your API key as a bearer token. The assistant then answers fight questions through 47 tools over the MMA Fight Data API, from events and results to round stats, rankings history and judges' scorecards, instead of from memory.
Free plan: 1,000 requests a month, no card. Paid plans from $19/mo.
Endpoints used
| Method & path | What it returns | Plan |
|---|---|---|
https://api.ufcalendar.com/mcp | Hosted MCP server over Streamable HTTP: one tool per job, the same data and plan limits as the REST endpoints, one request per tool call. | All plans |
GET /v1/events | MMA schedule + results API: full fight cards, venues, broadcasts, and a card-change diff log for late reshuffles. | All plans |
The code
Claude Code and Cursor need one config each. curl, Python and JavaScript call the server directly, which is how you test it or wire it into your own agent: list the tools, then call get_next_event.
Every block runs as shown with your API key in the UFCAL_API_KEY environment variable. Python uses pip install ufcalendar and JavaScript or TypeScript uses npm install @ufcalendar/sdk; any HTTP client works too.
claude mcp add --transport http ufcalendar https://api.ufcalendar.com/mcp \
--header "Authorization: Bearer $UFCAL_API_KEY"{
"mcpServers": {
"ufcalendar": {
"url": "https://api.ufcalendar.com/mcp",
"headers": { "Authorization": "Bearer ${UFCAL_API_KEY}" }
}
}
}curl "https://api.ufcalendar.com/mcp" \
-H "Authorization: Bearer $UFCAL_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": "get_next_event", "arguments": {"org": "ufc"}}}'# pip install requests
import os
import requests
MCP = "https://api.ufcalendar.com/mcp"
HEADERS = {
"Authorization": f"Bearer {os.environ['UFCAL_API_KEY']}",
"Accept": "application/json, text/event-stream",
}
def rpc(method, params=None):
body = {"jsonrpc": "2.0", "id": 1, "method": method, "params": params or {}}
resp = requests.post(MCP, json=body, headers=HEADERS, timeout=30)
resp.raise_for_status()
return resp.json()["result"]
tools = rpc("tools/list")["tools"]
print(len(tools), "tools, e.g.", ", ".join(t["name"] for t in tools[:5]))
result = rpc("tools/call", {"name": "get_next_event", "arguments": {"org": "ufc"}})
print(result["structuredContent"]["data"]["title"])// npm install @modelcontextprotocol/sdk
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(new URL("https://api.ufcalendar.com/mcp"), {
requestInit: { headers: { Authorization: `Bearer ${process.env.UFCAL_API_KEY}` } },
});
const client = new Client({ name: "my-fight-app", version: "1.0.0" });
await client.connect(transport);
const { tools } = await client.listTools();
console.log(tools.length, "tools");
const res = await client.callTool({ name: "get_next_event", arguments: { org: "ufc" } });
console.log(res.structuredContent.data.title);
await client.close();Sample response
A real response from the live API, trimmed for length. … marks removed fields.
{
"result": {
"content": [
{ "type": "text", "text": … }
],
"structuredContent": {
"data": {
"id": 2805,
"slug": "ufc-fight-night-2026-10-31",
"title": "UFC Fight Night: Moicano vs Nolan",
"short_title": "Fight Night",
"numbering": "Fight Night",
"org": "ufc",
"sport": "mma",
"starts_at": "2026-10-31T21:00:00.000Z",
"main_card_at": "2026-11-01T00:00:00.000Z",
"prelims_at": "2026-10-31T21:00:00.000Z",
"early_prelims_at": null,
"tz": "America/Los_Angeles",
"status": "announced",
"is_ppv": false,
"is_title_card": false
},
"meta": {
"org": "ufc",
"skipped_series": []
}
}
},
"jsonrpc": "2.0",
"id": 1
}Notes and pitfalls
- Chat apps sign in with OAuth, so there is no key to paste. Coding agents and your own code send Authorization: Bearer with an API key.
- One tool call counts as one request on your plan. The three discovery tools (plans, promotions and how to connect) answer without signing in.
- The tools wrap the REST endpoints, so the data and plan limits are the same as the API's: odds tools return the consensus line only, information and not betting advice, and webhook tools need Pro or Business.
- The server speaks Streamable HTTP, so nothing runs on your machine: no Docker image and no proxy. Plain JSON-RPC over HTTPS works too, as the curl and Python blocks show.
Related pages
More code guides
UFCalendar is an independent publication, not affiliated with UFC/Zuffa/TKO, PFL, OKTAGON MMA, BKFC, RIZIN FF or any promotion. Organization names are used to describe the data. Terms of service · Refund Policy