BioFlow

Connecting AI assistants (MCP)

Connect Claude, ChatGPT, Copilot or any MCP client to your BioFlow workspace over OAuth 2.1 — setup per client, the 12 tools, the 6 scopes, and the safety rails.

BioFlow ships a remote MCP (Model Context Protocol) server, so any MCP-capable AI assistant can read and edit your bio pages with your permission.

https://app.getbioflow.com/api/mcp

The transport is Streamable HTTP. Authentication is OAuth 2.1 with PKCE and dynamic client registration — no pre-shared API keys. Tokens are scoped to a single workspace, so an agent only ever sees the workspace you connected it to.

MCP access is included on every plan, including Free. Tool calls ride your plan's existing limits; over-limit calls get a structured QUOTA_EXCEEDED response instead of failing silently.

Supported clients

Any MCP client that speaks Streamable HTTP with OAuth works, including Claude (web and desktop, as a custom connector), Claude Code, ChatGPT, Microsoft Copilot, and MCP Inspector.

Claude Code — one command, then sign in when prompted:

claude mcp add --transport http bioflow https://app.getbioflow.com/api/mcp

Claude (web and desktop):

  1. Open Settings, then Connectors.
  2. Choose "Add custom connector".
  3. Paste the server URL above and connect.
  4. Approve the scopes on BioFlow's consent screen.

Everything else — ChatGPT, Copilot, MCP Inspector, your own agent framework: point the client at the same server URL. Registration is dynamic, so there is nothing to pre-provision on either side.

Available tools

The server exposes 12 tools, each guarded by one OAuth scope:

ToolWhat it doesScope
page.listList every bio page in the workspace: title, slug, publish status, block count, route, and themepages:read
page.getRead one page's draft and published state — blocks with ids, theme, route, and the draft updatedAt that write tools requirepages:read
analytics.summaryWorkspace analytics for the last 7/30/90 days: views, clicks, unique visitors, CTR, top links, referrers, and tip revenueanalytics:read
contacts.listList captured contacts and leads (newsletter signups, form submissions, gated downloads), newest firstcontacts:read
file.listList uploaded files (name, MIME type, public path) for wiring into image, file, carousel, or product blocksfiles:read
page.createCreate a new bio page as an unpublished draft — it never publishes; going live requires page.publishpages:write
page.update_draftEdit the draft's title, description, theme, or existing blocks by id — everything you don't mention is preservedpages:write
page.add_blockAppend one new block to the draft, preserving every existing block byte-for-bytepages:write
page.remove_blockDelete specific blocks from the draft by id; refuses to clear the entire pagepages:write
page.reorder_blocksRearrange the draft's blocks without editing their content — every block id listed exactly oncepages:write
page.publishPublish the draft to the live public page. Two-step: the first call returns a preview plus a confirmToken, the second commitspublish
page.schedule_publishSchedule the page to publish at a future time. Two-step confirm; the commit call must repeat the same startsAtpublish

page.publish and page.schedule_publish are the dangerous set: they change what real visitors see, so they need the publish scope AND a per-workspace "dangerous operations" toggle that ships OFF.

Scopes

You grant exactly what an app asked for. These are the descriptions shown on the consent screen:

ScopeWhat it grants
pages:readSee your bio pages, blocks, and themes
pages:writeCreate and edit drafts of your bio pages
analytics:readSee your page views, clicks, and traffic sources
contacts:readSee your captured contacts and leads
files:readSee your uploaded files and media
publishPublish changes to your live pages

An agent calling a tool outside its granted scopes gets a structured SCOPE_MISSING denial — never silent partial access.

Safety rails

  • Consent screen. You approve exactly which scopes an app gets when it connects, each listed in plain language.
  • Drafts stay drafts. Write tools only ever touch the draft; nothing an agent does reaches your live page on its own.
  • Publishing is off by default per workspace, and even after you enable it, every publish is a two-step flow: the first call returns a preview plus a short-lived confirm token (valid 10 minutes), and nothing commits until a second call with that token.
  • Optimistic concurrency. Every write tool requires the expectedUpdatedAt you read from page.get, so a stale draft is refused rather than clobbered. Writes also accept an optional idempotencyKey so a retried call cannot run twice.
  • Audit trail. Every tool call is logged; review it in Settings, under Connected AI apps.
  • Instant revocation. Revoke any connected app from Settings, under Connected AI apps — its access and refresh tokens stop working immediately.

Structured denials

Every refusal is a typed code an agent can act on, never a mystery error or a silent no-op:

CodeWhat it means
SCOPE_MISSINGThe tool needs a scope this connection was never granted. Reconnect and approve it.
DANGEROUS_OPS_DISABLEDA publish-class tool while the workspace toggle is off. The denial carries a deep link to that setting.
QUOTA_EXCEEDEDThe call would pass your plan's limits.
STALE_SNAPSHOTThe draft changed between the preview call and the commit call, so the commit was refused.
CONFIRM_TOKEN_INVALIDThe confirmToken was forged, expired, or minted for a different operation.

OAuth discovery

Discovery follows RFC 8414 (authorization server metadata) and RFC 9728 (protected resource metadata); clients register themselves through unauthenticated dynamic client registration per RFC 7591. The documents are served at:

  • https://app.getbioflow.com/.well-known/oauth-authorization-server
  • https://app.getbioflow.com/.well-known/oauth-protected-resource

On this page