Krafa
Dashboard
Dashboard
Getting Started
QuickstartHow it works
The Canvas
Canvas overviewPasting and node typesOrganizing a boardCommand menuKeyboard shortcuts
Design Taste
Taste memoriesExtractionConflictsCurating your profile
Using with Agents
Connecting an agentMCP server referenceClaude CodeCursorCodexKiroAntigravity
Imports
Imports overviewXPinterestDribbble
Reference
Plans and billingHTTP APISelf-hostingFAQ
KrafaAll systems operational
Using with Agents

MCP server reference

The transport, authentication, and complete tool schemas for the Krafa taste server.

Krafa serves a board's taste profile over a hosted MCP server. It's stateless: every request authenticates independently and is scoped to the single board its token belongs to.

Connection

Endpointhttps://app.krafa.ai/api/mcp
TransportStreamable HTTP
Server namekrafa-taste
Protocol version1.0.0
AuthenticationAuthorization: Bearer <token>

Tokens are minted per board from ⌘K → Connect AI Agent and look like krafa_ followed by a random suffix. They're read-only: nothing exposed over MCP can modify a board.

ResponseMeaning
401 { "error": "missing bearer token" }No Authorization header
401 { "error": "invalid token" }Token doesn't match any board, usually revoked or mistyped

Self-hosted instances serve the same endpoint at {your-origin}/api/mcp.

get_taste_profile

The designer's full curated design-taste profile for this board, as markdown. Read this first and follow it when designing anything for them.

Parameters: none.

Returns: one text block containing the profile as Markdown. Active memories only; anything superseded by a conflict resolution is excluded.

The document is titled with the board name, followed by a count, then one section per category in a fixed order: Typography, Color, Spacing & Density, Layout, Imagery, Motion, Voice & Tone, Components. Empty categories are omitted. Each memory is a bullet with its evidence indented beneath.

# Design Taste Profile — Product Surfaces

14 memories across 6 categories.

## Typography

- Numeric data is set in tabular figures at a heavier weight than surrounding copy
  - font-variant-numeric: tabular-nums
  - weight: 500 against 400 body

## Color

- Accents are a single saturated warm hue against near-neutral surfaces
  - accent: #ff5c00
  - surface: #0a0a0a

A board with nothing learned yet returns _No memories yet — the board hasn't been curated._

list_memories

Structured list of the designer's taste memories (statement + concrete evidence values), optionally filtered by category.

Parameters:

Prop

Type

Returns: a JSON array of active memories.

[
  {
    "id": "1f4a...",
    "category": "color",
    "statement": "Accents are a single saturated warm hue against near-neutral surfaces",
    "evidence": ["accent: #ff5c00", "surface: #0a0a0a"]
  }
]

Use this over get_taste_profile when the agent needs to reason about individual memories or cite one by id. For "just tell me how to design this," the Markdown profile is better: it's shorter and already organized.

get_exemplars

Up to five of the actual reference images the designer curated their taste from. Look at them to absorb the visual style directly.

Parameters: none.

Returns: a text header followed by up to five base64 image blocks, in board order.

Exemplars aren't a separate collection you manage. They're computed at read time: Krafa takes the nodes that produced the board's active memories, keeps the images among them, and returns the first five. Images over 3 MB and any that fail to load are skipped silently.

Boards with no image-backed memories return No image exemplars on this board yet.

Tip

For visual work, exemplars do more than the text profile. A vision-capable agent given five screenshots you personally selected infers density, rhythm, and restraint far more reliably than it does from a sentence describing them. Ask for both.

Usage and billing

Every tool call counts as one generation against your plan, whichever of the three it is. Connecting and calling tools/list cost nothing, so discovery is free and an idle client never spends.

Plans include 2,000 generations a period on Pro and 3,000 per seat on Teams, pooled across the workspace. Past that Krafa spends prepaid credits, then falls to overage at $0.02 each, and only refuses once the spend cap is reached. See Plans and billing for the full order.

A refusal is a tool error, not a transport error. The HTTP request still succeeds and the response carries isError with a plain-sentence explanation, which is what lets the agent relay the reason instead of failing opaquely:

{
  "isError": true,
  "content": [
    {
      "type": "text",
      "text": "This workspace has reached its monthly spend cap, so no more generations can be billed."
    }
  ]
}

Authentication failures are the exception and come back as 401 before any tool runs, as above.

Note

There are no request-rate limits on the endpoint. What bounds usage is the allowance and the spend cap, not requests per minute, so a burst of calls from a parallel agent run won't be throttled.

Calling it directly

Useful for debugging a connection outside a client:

curl -sS https://app.krafa.ai/api/mcp \
  -H "Authorization: Bearer krafa_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Streamable HTTP requires both media types in Accept; omitting text/event-stream is the most common reason a hand-rolled request fails against a client that works fine.

Swap the body for a tool call:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": { "name": "list_memories", "arguments": { "category": "typography" } }
}

On this page

Connectionget_taste_profilelist_memoriesget_exemplarsUsage and billingCalling it directly