Skip to content

MCP Endpoint

The MCP (Model Context Protocol) endpoint is the primary interface for AI agents to interact with Fizzy. It implements the MCP Streamable HTTP transport specification, enabling AI assistants like Claude, GPT-4, and custom agents to manage tasks in Fizzy.

40 Tools

Full access to all Fizzy operations: boards, cards, comments, columns, tags, and users.

Streamable HTTP

Supports both request/response and Server-Sent Events (SSE) for real-time updates.

JSON-RPC 2.0

Standard JSON-RPC protocol for reliable, typed communication.

Authenticated

Secure access via Fizzy Personal Access Tokens.

MethodEndpointDescription
POST/mcpMCP Streamable HTTP endpoint
GET/mcp/infoServer capabilities and tool list

POST /mcp Auth Required

Section titled “POST /mcp ”

The main MCP endpoint for sending JSON-RPC requests. Supports both synchronous responses and SSE streaming.

HeaderRequiredDescription
Content-TypeYesMust be application/json
AcceptYesapplication/json or text/event-stream
X-Fizzy-TokenYesYour Fizzy Personal Access Token
X-Fizzy-Account-SlugNoTarget account (e.g., /my-org)
X-API-KeyNoAlternative API key authentication

Standard JSON-RPC 2.0 request format:

{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "fizzy_list_boards",
"arguments": {}
}
}

JSON-RPC 2.0 response:

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "[{\"id\":\"brd_abc123\",\"name\":\"Product Roadmap\",\"cardCount\":42}]"
}
]
}
}

When Accept: text/event-stream is specified, the response is sent as Server-Sent Events:

HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
data: {"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"..."}]}}

  1. Initialize

    Send an initialize request to establish the session and receive server capabilities.

  2. List Tools

    Send tools/list to discover available tools and their schemas.

  3. Call Tools

    Use tools/call with the tool name and arguments to perform operations.

  4. Handle Responses

    Process the JSON-RPC response containing the tool result or error.


Before using tools, initialize the MCP session:

Terminal window
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Fizzy-Token: fz_xxxxxxxxxxxxx" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "my-ai-agent",
"version": "1.0.0"
}
}
}' \
https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"serverInfo": {
"name": "fizzy-mcp",
"version": "0.1.0"
},
"capabilities": {
"tools": {
"listChanged": false
}
}
}
}

Discover available tools and their input schemas:

Terminal window
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Fizzy-Token: fz_xxxxxxxxxxxxx" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}' \
https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"tools": [
{
"name": "fizzy_get_identity",
"description": "Get the current user identity and list of accessible Fizzy accounts.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
},
{
"name": "fizzy_list_boards",
"description": "List all Fizzy boards you have access to in the current account.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
},
{
"name": "fizzy_create_card",
"description": "Create a new Fizzy card on a board.",
"inputSchema": {
"type": "object",
"properties": {
"board_id": {
"type": "string",
"description": "The board ID to create the card on"
},
"title": {
"type": "string",
"description": "The card title",
"minLength": 1
},
"description": {
"type": "string",
"description": "Card description (supports markdown)"
}
},
"required": ["board_id", "title"]
}
}
]
}
}

Execute MCP tools to interact with Fizzy:

Terminal window
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Fizzy-Token: fz_xxxxxxxxxxxxx" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "fizzy_list_boards",
"arguments": {}
}
}' \
https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp
Terminal window
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Fizzy-Token: fz_xxxxxxxxxxxxx" \
-d '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "fizzy_create_card",
"arguments": {
"board_id": "brd_abc123",
"title": "Implement user authentication",
"description": "Add OAuth2 login with Google and GitHub providers.\n\n## Requirements\n- Social login buttons\n- Session management\n- Token refresh"
}
}
}' \
https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp
{
"jsonrpc": "2.0",
"id": 4,
"result": {
"content": [
{
"type": "text",
"text": "{\"id\":\"crd_xyz789\",\"number\":42,\"title\":\"Implement user authentication\",\"status\":\"published\"}"
}
]
}
}

Returns MCP server capabilities and available tools without authentication.

Terminal window
curl https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp/info
{
"name": "fizzy-mcp",
"version": "0.1.0",
"protocolVersion": "2024-11-05",
"transport": "streamable-http",
"capabilities": {
"tools": {
"listChanged": false
}
},
"toolCount": 40,
"toolCategories": {
"identity": 2,
"boards": 7,
"cards": 18,
"comments": 5,
"columns": 5,
"tags": 1,
"users": 2
},
"tools": [
{
"name": "fizzy_get_identity",
"description": "Get the current user identity and list of accessible Fizzy accounts.",
"category": "identity"
},
{
"name": "fizzy_get_account",
"description": "Get the current Fizzy account settings.",
"category": "identity"
}
],
"documentation": "https://fizzy.yogan.dev",
"endpoints": {
"mcp": "POST /mcp",
"info": "GET /mcp/info"
}
}

MCP errors are returned as JSON-RPC error responses:

{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32600,
"message": "Invalid Request",
"data": {
"details": "Missing required parameter: board_id"
}
}
}
CodeNameDescription
-32700Parse ErrorInvalid JSON
-32600Invalid RequestInvalid JSON-RPC request
-32601Method Not FoundUnknown method
-32602Invalid ParamsInvalid method parameters
-32603Internal ErrorServer error

When a tool fails, it returns an error in the result content:

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "Error: Card not found\nCode: NOT_FOUND_ERROR"
}
],
"isError": true
}
}

For long-running operations or real-time updates, use SSE:

Terminal window
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-H "X-Fizzy-Token: fz_xxxxxxxxxxxxx" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "fizzy_list_cards",
"arguments": {"board_ids": ["brd_abc123"]}
}
}' \
https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp

Here’s a complete example that initializes, lists boards, and creates a card:

const TOKEN = 'fz_xxxxxxxxxxxxx';
const MCP_URL = 'https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp';
async function mcpRequest(method, params = {}) {
const response = await fetch(MCP_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
'X-Fizzy-Token': TOKEN,
},
body: JSON.stringify({
jsonrpc: '2.0',
id: Date.now(),
method,
params,
}),
});
const data = await response.json();
if (data.error) throw new Error(data.error.message);
return data.result;
}
async function callTool(name, args = {}) {
const result = await mcpRequest('tools/call', { name, arguments: args });
const text = result.content.find((c) => c.type === 'text')?.text;
return text ? JSON.parse(text) : null;
}
// Main workflow
async function main() {
// 1. Initialize
console.log('Initializing MCP session...');
const init = await mcpRequest('initialize', {
protocolVersion: '2024-11-05',
capabilities: {},
clientInfo: { name: 'my-agent', version: '1.0.0' },
});
console.log(`Connected to ${init.serverInfo.name} v${init.serverInfo.version}\n`);
// 2. Get identity
const identity = await callTool('fizzy_get_identity');
console.log(`Logged in as: ${identity.user.name}`);
console.log(`Accounts: ${identity.accounts.map((a) => a.name).join(', ')}\n`);
// 3. List boards
const boards = await callTool('fizzy_list_boards');
console.log('Boards:');
boards.forEach((b) => console.log(` - ${b.name} (${b.cardCount} cards)`));
// 4. Create a card on the first board
if (boards.length > 0) {
const card = await callTool('fizzy_create_card', {
board_id: boards[0].id,
title: 'Task from AI Agent',
description: 'This card was created via the MCP endpoint.',
});
console.log(`\nCreated card #${card.number}: ${card.title}`);
}
}
main().catch(console.error);

Add to your Claude Desktop config:

{
"mcpServers": {
"fizzy": {
"command": "npx",
"args": [
"-y",
"@anthropic-ai/mcp-remote",
"https://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp"
],
"env": {
"X-Fizzy-Token": "fz_xxxxxxxxxxxxx"
}
}
}
}

Use the MCP SDK for your language:

Terminal window
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://fizzy-mcp-hosted.ryanyogan.workers.dev/mcp'),
{
requestInit: {
headers: {
'X-Fizzy-Token': 'fz_xxxxxxxxxxxxx',
},
},
},
);
const client = new Client({ name: 'my-agent', version: '1.0.0' });
await client.connect(transport);
const tools = await client.listTools();
console.log(
'Available tools:',
tools.tools.map((t) => t.name),
);