Pulsebook / docs

MCP server

Connect an AI assistant to your Pulsebook workspace so it can read brands, edit sections, upload assets and publish. The server speaks MCP over Streamable HTTP, statelessly (no session id) with JSON responses, at https://pulsebook.app/api/mcp.

Tokens and scopes

Create a token in Settings, API tokens, and send it as Authorization: Bearer pb_…. OAuth is not offered yet. Tokens can expire and can be revoked, and every write is recorded in the workspace audit log with the token as actor. A missing, unknown, revoked or expired token gets 401; a token without the scope a tool needs gets 403. Keep the token in an environment variable and never commit it.

read
list_brands, get_brand, scan_tokens_from_url
write
create_brand, update_brand, update_section, set_sections, upload_asset_from_url, generate_draft, delete_brand
publish
publish_brand, unpublish_brand

Tools

Arguments marked ? are optional. Section content follows the schema in /docs/brand-json/schema.json.

list_brands read
none
Every brand in the workspace: id, name, slug, status, public URL, last change.
get_brand read
brandId
One brand in full: settings, tokens, all sections with content, uploaded assets with ids and URLs.
scan_tokens_from_url read
url
Colors and font families read from the page's CSS (nothing is rendered), ready to pass as tokens.
create_brand write
name, slug?, brief?, sourceUrl?, tokens?
The new brand with empty sections.
update_brand write
brandId, name?, slug?, tagline?, indexable?, password? (null clears), tokens?
The updated brand.
update_section write
brandId, type, content, enabled?
The saved section. type is intro, logo, color, typography, motion, voice, moodboard, applications or assets; content follows the section schema.
set_sections write
brandId, order?, enabled?
The resulting order and visibility of the sections.
upload_asset_from_url write
brandId, url, kind (image, logo, font, download, video), alt?, fileName?
The stored asset: id and hosted URL, to reference from section content.
generate_draft write
brandId, brief?, url?
The brand with a generated first draft.
delete_brand write
brandId, confirm: true
Confirmation that the brand was deleted.
publish_brand publish
brandId
The public URL. Uses one publish credit; the first is free.
unpublish_brand publish
brandId
The brand, back to draft.

Claude Code

export PULSEBOOK_TOKEN=pb_...
claude mcp add --transport http pulsebook https://pulsebook.app/api/mcp \
  --header "Authorization: Bearer $PULSEBOOK_TOKEN"

# available in every project instead of only this one
claude mcp add --scope user --transport http pulsebook https://pulsebook.app/api/mcp \
  --header "Authorization: Bearer $PULSEBOOK_TOKEN"

Without a flag the server is added for you in the current project only. For a project file shared with the team, put this in .mcp.json; ${PULSEBOOK_TOKEN} is expanded from the environment, so the token stays out of the file.

{
  "mcpServers": {
    "pulsebook": {
      "type": "http",
      "url": "https://pulsebook.app/api/mcp",
      "headers": {
        "Authorization": "Bearer ${PULSEBOOK_TOKEN}"
      }
    }
  }
}

Check the connection with claude mcp list or /mcp. If the server rejects a static header with 401, Claude Code shows it as failed rather than asking you to sign in: fix the token.

Cursor

Put the server in .cursor/mcp.json (one project) or ~/.cursor/mcp.json (everywhere). Cursor detects Streamable HTTP from the URL and sends the headers on every request; environment variables are expanded in url and headers.

{
  "mcpServers": {
    "pulsebook": {
      "url": "https://pulsebook.app/api/mcp",
      "headers": {
        "Authorization": "Bearer ${PULSEBOOK_TOKEN}"
      }
    }
  }
}

Claude Desktop and claude.ai

Custom connectors have a Request headers field for fixed credentials. Add a custom connector with the URL https://pulsebook.app/api/mcp, leave OAuth empty, and add the header Authorization with the value Bearer pb_…. On Team and Enterprise plans everyone using the connector shares that token, so give it only the scopes they need.

Example

You say: “Create a brand called Lumen from https://example.com, write the intro, publish it.” The assistant calls, in order:

  1. list_brands: optional: see what exists and whether the slug is taken.
  2. scan_tokens_from_url: reads colors and fonts off https://example.com.
  3. create_brand: name Lumen, with sourceUrl and the scanned tokens. A draft is free; a workspace holds at most three unpublished drafts.
  4. generate_draft: optional: a first pass of every section from the brief.
  5. get_brand: read the current intro before replacing it, because a section write replaces its content.
  6. update_section: type intro with the new content. Sections that use files (logo, moodboard, assets) need upload_asset_from_url first; put the returned asset id or URL in the content.
  7. publish_brand: needs the publish scope and one publish credit (the first is free). Returns the public URL.

A 403 on the create or publish step means the token lacks the write or publish scope.