The Whimsical MCP connector routes your AI agent's tool calls to Whimsical's own MCP server through Scalekit. Each user signs in to Whimsical once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 18 tools.
- Tools
- 18
- What they doRead · write · destructive
- 7 · 6 · 57 read6 write5 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Generate diagrams: create flowcharts, mind maps, and sequence diagrams from structured data, markdown, or Mermaid
- Design wireframes: generate and edit wireframes with containers, buttons, inputs, and other UI elements
- Create and edit files: make boards, docs, and folders, edit their contents, auto-layout flowcharts, and move files to trash
- Find and read content: search the workspace, browse folders, and fetch boards or docs with an optional image snapshot
- Work with comments: read, create, reply to, edit, resolve, and delete comment threads on boards and docs
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Whimsical MCP connection
In AgentKit > Connections, create a Whimsical MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Whimsical MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'whimsicalmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Whimsical MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'whimsicalmcp_file_tree',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "whimsicalmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Whimsical MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="whimsicalmcp_file_tree",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolwhimsicalmcp_comment_readRead all comment threads on a board item, including author, timestamp, and thread content.Read-onlyComment Read
Read all comment threads on a board item, including author, timestamp, and thread content.
Inputs
item_idstringrequired- Board, doc, board-object, doc-block, or table-row id (short-id, base58, or UUID).
cell_idstring- Optional column id (short-id of the table column) to narrow results to a single cell. Only meaningful alongside a table-row `item_id`. Reuse the `:cell` value from a previous comment_read response.
limitinteger- Maximum number of threads to return (default 50).
whimsicalmcp_fetchFetch the content of a Whimsical board, doc, or folder by ID, optionally returning a PNG snapshot.Read-onlyFetch
Fetch the content of a Whimsical board, doc, or folder by ID, optionally returning a PNG snapshot.
Inputs
idstringrequired- File or object ID (6-char short-id, UUID, or base58) from search results or a previous tool call, or a Whimsical link. A link to a doc block, board object, or board position reads just that part.
board_idstring- Parent board ID — required when fetching a table object. The table_id goes in 'id'.
crop_idsarray- Specific object IDs to crop the image to (image mode only).
cursorstring- Boards only: the cursor a previous board read gave, to read its next page. Repeat the same scope, select_kinds, grep_text and expand_groups with it.
detailstring- Detail level (boards only). "simple" (default): type, id, text only. "detailed": includes x, y, width, height, color, styling as `[props: {...}]` (deco, font_size, text_align, icon_name, icon_placement, state, named as edit takes them), and the board's color palette. Task rows surface assignee, tags, and description-present as inline markers in the text column: `[@name, #tag, 📝]`; wireframe options, dropdown values and form labels show as `[options: [...]]`, `[selected: "..."]` and `[label: "..."]` in both levels.one of
simpledetailed expand_groupsboolean- Show all objects flat instead of collapsing groups into summaries (boards only).
formatstring- Docs only. "ednl" (default): each block as hiccup. "markdown": each block's text as markdown with tags for mentions, item links, highlights and comments, which update_block takes back unchanged; see how_to('doc').one of
ednlmarkdown grep_textarray- Filter to items whose text contains any of these terms (boards and docs, case-insensitive).
imageboolean- Return a rendered PNG image instead of text (boards only). Use scope, crop_ids, or viewport to crop.
include_metadataboolean- Include the file's creation and update timestamps and display names.
limitinteger- Max rows/blocks to return (default: 50 for boards, 200 for docs, max: 200). On a board, a collapsed group counts as one row, and a page ends early when its rows' connectors would pass the limit.
scopestring- IMPORTANT for editing: ID of a compound diagram (flowchart, mindmap, sequence diagram) to drill into. Returns the actual node/shape text instead of the board overview summary. You MUST use scope before find_replace — board overview shows summaries like 'Root (5 nodes)' that won't match actual text.
select_idsarray- Return only items with these IDs (boards and docs)
select_kindsarray- Filter by type (boards and docs). For boards: shape, note, text, icon, frame, link, task, table, attachment, image, w-annotation, sd-actor. Groups: flowchart, mindmap, wireframe, sequence-diagram, stack, section. For docs: block element tags (p, h1, h2, ul, ol, etc.), plus nest for nested files (boards, docs, folders) embedded in the doc.
spatialboolean- Include spatial annotations (boards only, requires detail: detailed). Default: false.
viewportobject- Bounding box in board coordinates to crop the image to (image mode only).
whimsicalmcp_file_treeBrowse the workspace file hierarchy to list folders, boards, and docs with optional depth and type filtering.Read-onlyFile Tree
Browse the workspace file hierarchy to list folders, boards, and docs with optional depth and type filtering.
Inputs
depthinteger- How many levels deep to show (default 2, max 5)
filterstring- Set to "teams" to list only the workspace's teams (name + id) without descending into files — use it to resolve a team name like "Trips" to its id. Ignored when folder_id is set.one of
teams folder_idstring- Folder, section, or team id (base58 or UUID) to browse — returns the file tree below it. Team ids come from filter="teams". Omit to see the whole workspace tree.
include_metadataboolean- Add creation/update metadata below browsed item rows. Workspace and section/team navigation headings are unchanged.
whimsicalmcp_get_board_itemsFetch board objects by file ID for rendering in the Whimsical widget.Read-onlyGet Board Items
Fetch board objects by file ID for rendering in the Whimsical widget.
Inputs
fileIdstringrequired- Board file ID (base58 or UUID)
fieldsarray- Object fields to include (omit for all). Lightweight: rect, objectType, text, fillColor, parentId, url. Heavy: gfx, rgfx, overlayGfx, hitboxes, shadowPathD.
limitinteger- Max objects per page (omit for all)
offsetinteger- Object offset for pagination (default 0)
whimsicalmcp_get_theme_dataFetch the board theme's dark color map for Whimbed rendering in the widget.Read-onlyGet Theme Data
Fetch the board theme's dark color map for Whimbed rendering in the widget.
Inputs
fileIdstringrequired- Board file ID (base58 or UUID)
whimsicalmcp_how_toLook up Whimsical-specific syntax, examples, and guides for creating diagrams and wireframes.Read-onlyHow To
Look up Whimsical-specific syntax, examples, and guides for creating diagrams and wireframes.
Inputs
domainstring- Structured lookup that returns JSON (vs `topic` which returns markdown). Use {type:'icon', query:'database'} for ranked icon names with aliases, {type:'color', query?} for the canonical palette with aliases and descriptions, {type:'font-size'} for valid font sizes, {type:'kinds'} for the canonical add-op type list used by edit. When `domain` is provided, `topic` is ignored.
topicstring- Topic keyword (e.g. 'flowchart', 'table', 'colors') or search query
whimsicalmcp_searchSearch workspace files and content by name or full-text query.Read-onlySearch
Search workspace files and content by name or full-text query.
Inputs
querystringrequired- Search text. Optional when at least one date bound is supplied.
created_afterstring- Only return items created strictly after this UTC timestamp. Seconds are required; up to 9 fractional digits are accepted.
created_beforestring- Only return items created strictly before this UTC timestamp. Seconds are required; up to 9 fractional digits are accepted.
include_metadataboolean- Include created_at, created_by, updated_at, and updated_by on every result.
modestring- "all" (default) ranks titles and content together. "files" narrows to file/folder/section titles only — use when you need to pick a board to open and want to filter out object/text matches.one of
filesall updated_afterstring- Only return items updated strictly after this UTC timestamp. Seconds are required; up to 9 fractional digits are accepted.
updated_beforestring- Only return items updated strictly before this UTC timestamp. Seconds are required; up to 9 fractional digits are accepted.
whimsicalmcp_add_board_contentAdd a diagram, sticky notes, a table or a wireframe to an existing board.WriteAdd Board Content
Add a diagram, sticky notes, a table or a wireframe to an existing board. Create the board first with create_file(type:'board'). Steps/decisions/process → flowchart; hierarchy/outline → mindmap; actors exchanging messages → sequence_diagram; clustered short notes → sticky_notes; tabular data → table; UI screen → wireframe. These lay themselves out; for freeform shapes, text and connectors at absolute positions use edit's add operations instead. Mind maps: pass data.markdown directly (no how_to needed). Sequence diagrams: use data.diagram with arrow syntax (A -> B: msg) — no how_to needed for basic diagrams. Flowcharts: MUST call how_to('flowchart') first for the structured format. Wireframes: MUST call how_to('wireframe') first. To change an existing wireframe use wireframe_edit.
Inputs
board_idstringrequired- The board to add it to
typestringrequired- What to addone of
flowchartmindmapsequence_diagramsticky_notestablewireframe datastring- Content payload, by type. Mindmap: {markdown: "Root\n- Child\n - Grandchild", layout?: "horizontal"|"vertical"} (indented bullets). Sequence diagram: {diagram: "A -> B: msg"}. Sticky notes: {notes: [{content, color?}]}. Table: {markdown: "| A | B |\n|---|---|\n| 1 | 2 |"} or {columns: ["A","B"], rows: [["1","2"]]}. Flowchart and wireframe: call how_to(type) for the format. Field names are snake_case.
placementobject- Position relative to a previous diagram's bbox (returned in every creation response). Use direction 'right' or 'below' to build grids. Mutually exclusive with x/y.
titlestring- Title for the content, e.g. a wireframe frame's. A mind map's is its root only when the markdown has several top-level items, or its top line is empty once a leading 'Title:' is dropped; otherwise the top line is the root.
xnumber- X position on board. Mutually exclusive with placement.
ynumber- Y position on board. Mutually exclusive with placement.
whimsicalmcp_add_doc_contentAppend markdown to the end of an existing doc — headings, lists, links, code blocks, tables, and tags for mentions (@[Name]), item links, highlights and callouts (see how_to('doc')).WriteAdd Doc Content
Append markdown to the end of an existing doc — headings, lists, links, code blocks, tables, and tags for mentions (@[Name]), item links, highlights and callouts (see how_to('doc')). To change or insert blocks elsewhere in the doc, use edit with its doc operations (see how_to('doc')).
Inputs
doc_idstringrequired- The doc to append to
markdownstringrequired- Markdown to append
whimsicalmcp_copyCopy a Whimsical board, doc, folder or multipage, with everything in it, as the app's Duplicate does.WriteCopy
Copy a Whimsical board, doc, folder or multipage, with everything in it, as the app's Duplicate does. Pass ids from a previous file_tree or search result. Without parent_id the copy goes into the same folder as the original, titled "<title> (copy)"; with one, it goes at the end of that folder, section, team, multipage or doc. The copy is made at once; its contents are copied in the background and usually arrive within seconds, longer for large folders. Comments and sharing settings are not copied. Both items must live in the connected workspace.
Inputs
idstringrequired- Id of the board, doc, folder or multipage to copy. Accepts UUID or base58 form (as returned by file_tree or search).
parent_idstring- Id of the folder, multipage, section, team or doc to copy into. Defaults to the folder the original is in.
titlestring- Title for the copy. Defaults to the original's, with " (copy)" when it goes next to the original.
whimsicalmcp_create_fileCreate a board, doc or folder in Whimsical.WriteCreate File
Create a board, doc or folder in Whimsical. Boards start empty: add diagrams, sticky notes, tables and wireframes with `add_board_content`, or individual shapes, text and connectors with `edit` (see how_to('board')). Files start empty: fill a doc with `add_doc_content`. Pass add_page_to_id to add the new file as a page next to an existing one: added to it if it is a multipage, to its multipage if it is a page of one, otherwise the file is first turned into a multipage holding it as the first page — the same as Add page in the app. Use it when the user asks for a new page, tab or sheet of an existing file.
Inputs
titlestringrequired- Name of the new file or folder
typestringrequired- What to createone of
boarddocfolder add_page_to_idstring- Id of a file or multipage to add the new file next to, as a new page (see description).
parent_idstring- Folder, team, multipage or doc id (base58) to create in. A doc id nests the new file inside that doc's body. Find ids with file_tree or search. Defaults to the Private section. Can't be combined with add_page_to_id.
whimsicalmcp_moveMove a Whimsical file, folder, or doc into another folder or doc — for reorganising a workspace or archiving finished work.WriteMove
Move a Whimsical file, folder, or doc into another folder or doc — for reorganising a workspace or archiving finished work. Pass ids from a previous file_tree or search result. The destination must be a folder, a multipage, a section, a team, or a doc — not a board. Moving into a doc nests the item at the end of the doc; reposition it with the `edit` tool's `move_block`. Moving out of a doc removes it from the doc. Both items must live in the same workspace.
Inputs
idstringrequired- Id of the file, folder, or doc to move. Accepts UUID or base58 form (as returned by file_tree or search).
parent_idstringrequired- Id of the destination folder, multipage, section, team, or doc. Accepts UUID or base58 form (as returned by file_tree or search).
whimsicalmcp_renameRename a Whimsical board, doc, folder or multipage: the title shown in the file tree, its tab and links to it.WriteRename
Rename a Whimsical board, doc, folder or multipage: the title shown in the file tree, its tab and links to it. Pass an id from a previous file_tree, search or create result. For a doc this is its title; comments on words that stay keep their place. The title is used as written, on one line: no markdown. Board objects and doc blocks are renamed with `edit`; teams and sections in Whimsical.
Inputs
idstringrequired- Id of the board, doc, folder or multipage to rename. Accepts UUID or base58 form (as returned by file_tree or search).
titlestringrequired- The new title, on one line.
whimsicalmcp_auto_layoutRe-arrange shapes on a Whimsical flowchart using the auto-layout engine, with connectors re-routed automatically.DestructiveAuto Layout
Re-arrange shapes on a Whimsical flowchart using the auto-layout engine, with connectors re-routed automatically.
Inputs
board_idstringrequired- Board file ID
orientationstring- Layout direction (td=top-to-bottom, lr=left-to-right, bt=bottom-to-top, rl=right-to-left). Inferred from connector flow when omitted.one of
tdlrbtrl parent_idstring- Optional: scope layout to descendants of this object id (e.g. a group/container). Omit to lay out all root-level shapes on the file.
spacingstring- Spacing preset; defaults to 'default'.one of
compactdefault
whimsicalmcp_comment_editCreate, reply to, edit, resolve, or delete comment threads on a Whimsical board or doc.DestructiveComment Edit
Create, reply to, edit, resolve, or delete comment threads on a Whimsical board or doc.
Inputs
actionstringrequired- Which comment operation to perform.one of
createreplyeditresolveunresolvedelete cell_idstring- For create on a table cell: the column id (short-id of the table column). Combined with a table-row `item_id` to target a single cell. Reuse a `:cell` short-id from a previous comment_read response.
comment_idstring- For edit/delete: id of the specific comment to modify.
contentstring- For create/reply/edit: markdown content for the comment.
item_idstring- For create: id of the board, doc, board object, or table row to attach the thread to.
thread_idstring- For reply/resolve/unresolve: id of the root comment of the thread.
whimsicalmcp_deleteMove a Whimsical file, folder, or doc to trash, restoring it later from the Whimsical UI.DestructiveDelete
Move a Whimsical file, folder, or doc to trash, restoring it later from the Whimsical UI.
- Idempotent
Inputs
idstringrequired- Id of the file, folder, or doc to delete. Accepts UUID or base58 form (as returned by file_tree or search).
whimsicalmcp_editEdit a Whimsical board or doc by applying an array of add, update, or delete operations to its objects.DestructiveEdit
Edit a Whimsical board or doc by applying an array of add, update, or delete operations to its objects.
Inputs
idstringrequired- Board or doc ID (from create, fetch, or a previous tool response)
operationsarrayrequired- Array of operations to perform
whimsicalmcp_wireframe_editReflow or edit Whimsical wireframe elements using operations or a flexbox layout tree.DestructiveWireframe Edit
Reflow or edit Whimsical wireframe elements using operations or a flexbox layout tree.
Inputs
board_idstringrequired- Board file ID
target_idstringrequired- Wireframe frame ID to edit (from board_read or create)
frame_typestring- Override frame type if auto-detection fails. Valid: plain, desktop, iphone-14, iphone-x, iphone-8, ipad, android, android-tablet, apple-watch
layoutarray- Layout mode: JSON layout tree for structural changes with flexbox reflow. Cannot be used with operations.
operationsarray- Operations mode: direct property edits and deletes. Cannot be used with layout.
titlestring- Frame title (preserves existing if omitted)
No tools match.