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 client | Use | What you do |
|---|---|---|
| Claude Desktop, Claude.ai, ChatGPT | OAuth | Click Connect / sign in — nothing to copy or store |
| Claude Code, Codex, Cursor, custom agents | x-api-key | Paste 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-streamimport 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())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
- Use in your agent — per-client setup.
- Tools reference — every tool, with parameters.
- REST authentication — the same
bz_live_...key works forhttps://api.buzzabout.ai/v1/*.