CONNECT APP
Build with Excalidraw
Productivity
- API key
MCP
Give your agent Excalidraw tools
Every Excalidraw action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Excalidraw account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "excalidraw",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Create Collection:
const result = await mcp.callTool({
name: "excalidraw-create-collection",
arguments: {
collectionName: "Name",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "excalidraw",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Create Collection:
result = await session.call_tool("excalidraw-create-collection", {
"collectionName": "Name",
})API PROXY
Call the Excalidraw API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Excalidraw API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://api.excalidraw.com/api/v1/collections",
})
// Any allowed Excalidraw endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://api.excalidraw.com/api/v1/collections
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkuZXhjYWxpZHJhdy5jb20vYXBpL3YxL2NvbGxlY3Rpb25z?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Excalidraw actions from your backend
Connect a user's Excalidraw account once, then run Create Collection on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "excalidraw-create-collection",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
excalidraw: { authProvisionId: "apn_xxxxxxx" },
collectionName: "Name",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="excalidraw-create-collection",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"excalidraw": {"authProvisionId": "apn_xxxxxxx"},
"collectionName": "Name",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "excalidraw-create-collection",
"configured_props": {
"excalidraw": { "authProvisionId": "apn_xxxxxxx" },
"collectionName": "Name"
}
}'TOOLS
Excalidraw actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Create Collection
actionCreates a new collection (folder) in the Excalidraw Plus workspace for organizing scenes. Returns the new collection's ID — pass it to Create Scene or Update Scene to add scenes to this collection. See the documentationWritev0.0.2 -
Create Scene
actionCreates a new scene (whiteboard) in the Excalidraw Plus workspace. The API requires a collection — if nocollectionIdis provided, the scene is placed in the default (Main) collection automatically. Use List Collections to find the collection ID if the user wants the scene in a specific folder. Returns the new scene's ID and metadata. See the documentationWritev0.0.2 -
Delete Scene
actionPermanently deletes an Excalidraw scene and all its drawing content. This action cannot be undone. Use List Scenes to find the scene ID before calling this tool. See the documentationWritev0.0.2 -
Get Current User
actionReturns the current workspace context from Excalidraw Plus, including workspace ID, name, user IDs, and roles. Use this when the user asks 'who am I', 'what workspace am I in', or needs the workspace ID or user role. See the documentationRead-onlyv0.0.2 -
Get Scene
actionReturns metadata for a specific Excalidraw scene, and optionally its full drawing content (elements JSON). Use this when the user asks to view, inspect, or read a specific scene. Use List Scenes first to find the scene ID by name. SetincludeContentto true only when the user explicitly asks for the drawing data — the content can be large. See the documentationRead-onlyv0.0.2 -
List Collections
actionReturns all collections (folders) in the Excalidraw Plus workspace. Use this to discover available collection IDs and names before filtering scenes by collection or creating a scene in a specific collection. Cross-reference: pass a collection ID from this result to List Scenes or Create Scene. See the documentationRead-onlyv0.0.2 -
List Scenes
actionReturns scenes (whiteboards) in the Excalidraw Plus workspace. Optionally filter by collection ID or apply a name substring filter (applied client-side, since the API has no server-side search). When the user says 'scenes in [collection]', use List Collections first to get the collection ID, then pass it ascollectionIdhere. UsenameFilter(andlimit) to narrow results when the user asks for a scene by name — the tool fetches up tolimitscenes and returns only those whose name contains the filter string. See the documentationRead-onlyv0.0.2 -
Update Scene
actionUpdates an existing Excalidraw scene's name or collection membership. Use List Scenes to find the scene ID, and List Collections to find a collection ID if moving the scene. Only the fields you provide are updated — omitted fields remain unchanged. Note: the Excalidraw API does not support a description field on scenes. See the documentationWritev0.0.2
EVENTS
Excalidraw triggers
Event sources your backend can deploy for users and receive through a webhook.
No Excalidraw triggers are available yet.
- App slug
- excalidraw
- Authentication
- API key
- Categories
- Productivity
- Actions
- 8
- Triggers
- 0
- API proxy
- Available