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 an inline MCP image content block. No PNG URL is returned.
{
"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 },
"customization": {
"radar": {
"comparison_mode": "overlay",
"style": { "grid_shape": "circular", "metric_label_size": 13 },
"header": { "subtitle": "2025/2026 · per 90", "alignment": "center" }
}
},
"idempotency_key": "report-2025-08-26-01"
}Create a pizza PNG
Pizza charts profile one player with 3-16 selected metrics using the same circular chart component as the website.
{
"chart_type": "pizza",
"series": [{ "player_id": "PLAYER_ID", "season": "2025/2026" }],
"metric_ids": ["goals", "assists", "expected_goals", "key_passes", "progressive_carries"],
"normalization": "per90",
"visual_style_id": "fbplot-default",
"aspect_ratio": "feed"
}Create a scatterplot PNG
For scatterplots, the first two metric IDs are the X and Y axes. Add an optional radius metric and highlight up to 12 series labels.
{
"chart_type": "scatterplot",
"series": [
{ "player_id": "PLAYER_ID_1", "season": "2025/2026" },
{ "player_id": "PLAYER_ID_2", "season": "2025/2026" }
],
"metric_ids": ["goals", "assists"],
"radius_metric_id": "minutes",
"highlighted_player_ids": ["PLAYER_ID_1", "PLAYER_ID_2"],
"normalization": "per90",
"visual_style_id": "fbplot-default",
"aspect_ratio": "feed"
}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. The PNG is delivered inline through MCP. The private stored copy remains owner-scoped and expires; no public share URL is created.
https://mcp.fbplot.com/mcp