Production MCP endpoint
https://mcp.fbplot.com/mcpTransport: Streamable HTTP; OAuth 2.1 Authorization Code + PKCE; protocol negotiation supported.
Resolve, then inspect
Ask the client to call resolve_players when it has a display name. Confirm the candidate before passing its stable ID onward.
{
"name": "Lamine Yamal",
"season": "2025/2026",
"limit": 5
}Create a website-parity radar PNG
The idempotency key makes retries safe for the same normalized request. The response includes explicit chart_id, edit_url, and short-lived png_url fields.
{
"chart_type": "radar",
"series": [
{ "player_id": "PLAYER_ID_1", "season": "2025/2026" },
{ "player_id": "PLAYER_ID_2", "season": "2025/2026" }
],
"metric_ids": ["goals", "assists", "expected_goals", "key_passes", "progressive_carries"],
"normalization": "per90",
"score_mode": "percentile",
"visual_style_id": "fbplot-default",
"aspect_ratio": "feed",
"branding": { "watermark": true },
"idempotency_key": "report-2025-08-26-01"
}OpenAI API example
Keep approval enabled for a chart write and let the client complete OAuth rather than embedding a user token in application code.
import OpenAI from "openai"
const response = await new OpenAI().responses.create({
model: "gpt-5.6",
tools: [{
type: "mcp",
server_label: "fbplot",
server_url: "https://mcp.fbplot.com/mcp",
require_approval: "always"
}],
input: "Compare these two players in a radar chart"
})Style and branding rules
- FBPlot default. Uses the Analyst Studio palette, supported chart fonts, accessible grid/axis contrast, and the FBPlot watermark.
- Brand-led. Can use a saved account brand kit. Logos are selected only from owned FBPlot assets; external logo URLs and base64 input are rejected.
- High contrast. Increases contrast and keeps line/marker differences for comparison beyond color alone.
- Asset privacy. PNG links are signed, expire, and do not create a public share URL.
https://mcp.fbplot.com/mcp