buzzabout docs
MCP

Authentication

Which auth method to use per MCP client — OAuth for standard assistants, x-api-key for Claude Code, Codex, and Cursor.

The buzzabout MCP server accepts two ways to authenticate on the same URL. Which one you use depends on your client — both end up as the same buzzabout account, and every tool (including ask) works either way.

Your clientUseWhat you do
Claude Desktop, Claude.ai, ChatGPTOAuthClick Connect / sign in — nothing to copy or store
Claude Code, Codex, Cursor, custom agentsx-api-keyPaste a key into the client's MCP config

Standard interactive assistants ship an OAuth flow, so use that — there's no reason to manage an API key for them. The CLI / IDE agents (Claude Code, Codex, Cursor) don't have a built-in OAuth flow for custom MCP servers, so they use an API key.

Per-client setup snippets are on Use in your agent; this page is just the auth choice and how to supply a key.

Endpoint

https://mcp.buzzabout.ai/mcp/

Streamable HTTP. The trailing slash is required.

OAuth — standard assistants

Claude Desktop, Claude.ai, and ChatGPT handle OAuth for you. Add the server URL in the client's connector settings and Connect / sign in with your buzzabout account; the client stores the token and replays it on every call. You don't configure anything else, and you don't need an API key. The per-client steps are on Use in your agent.

x-api-key — Claude Code, Codex, Cursor, custom

Mint a key in the web app under Settings → API keys → New key. Copy the value (bz_live_...) once — it's hashed and can't be retrieved again. (Lifecycle and rotation: REST authentication.)

Then add it to your client's MCP config as an x-api-key header — see Use in your agent for the exact config per client. For a custom agent, send the header on every request:

POST /mcp/ HTTP/1.1
Host: mcp.buzzabout.ai
x-api-key: bz_live_...
Content-Type: application/json
Accept: application/json,text/event-stream
agent.py
import asyncio
import os

from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client


async def main() -> None:
    headers = {"x-api-key": os.environ["BUZZABOUT_KEY"]}

    async with streamablehttp_client(
        "https://mcp.buzzabout.ai/mcp/",
        headers=headers,
    ) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            tools = await session.list_tools()
            for tool in tools.tools:
                print(tool.name)


asyncio.run(main())
agent.ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const transport = new StreamableHTTPClientTransport(
  new URL("https://mcp.buzzabout.ai/mcp/"),
  {
    requestInit: {
      headers: { "x-api-key": process.env.BUZZABOUT_KEY! },
    },
  },
);

const client = new Client({ name: "my-agent", version: "0.1.0" });
await client.connect(transport);
curl -X POST https://mcp.buzzabout.ai/mcp/ \
  -H "x-api-key: $BUZZABOUT_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json,text/event-stream" \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'

Tool errors

Tool errors come back inside the result as a structured JSON payload — the same error_code taxonomy as the REST API:

{
  "error": {
    "code": "dataset_not_found",
    "message": "Dataset not found",
    "status": 404
  }
}

Match on code (stable); show message to humans. status mirrors the HTTP status the equivalent REST call would return.

Transport errors (401, 429) come back as MCP transport errors, not tool-level errors — handle them at the SDK transport layer.

Next steps

On this page