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
| Endpoint | https://app.krafa.ai/api/mcp |
| Transport | Streamable HTTP |
| Server name | krafa-taste |
| Protocol version | 1.0.0 |
| Authentication | Authorization: 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.
| Response | Meaning |
|---|---|
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: #0a0a0aA 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.
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.
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" } }
}