CONNECT APP
Build with Mural
Work better together with Mural's visual work platform.
This integration with Pipedream is part of an independent third-party project and is not affiliated with, endorsed by, sponsored by, maintained by, or approved by Mural or Tactivos, Inc. "Mural" is a trademark of Tactivos, Inc. Use of the Mural name is solely for descriptive purposes to identify the integration's intended functionality.
Productivity
- OAuth
MCP
Give your agent Mural tools
Every Mural 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 Mural 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": "mural",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Create Image:
const result = await mcp.callTool({
name: "mural-create-image",
arguments: {
workspaceId: "Workspace ID",
muralId: "Mural ID",
},
})# 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": "mural",
}
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 Image:
result = await session.call_tool("mural-create-image", {
"workspaceId": "Workspace ID",
"muralId": "Mural ID",
})API PROXY
Call the Mural API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Mural 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://app.mural.co/api/public/v1/users/me",
})
// Any allowed Mural 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://app.mural.co/api/public/v1/users/me
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcHAubXVyYWwuY28vYXBpL3B1YmxpYy92MS91c2Vycy9tZQ?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Mural actions from your backend
Connect a user's Mural account once, then run Create Image 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: "mural-create-image",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
mural: { authProvisionId: "apn_xxxxxxx" },
workspaceId: "Workspace ID",
muralId: "Mural ID",
},
})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="mural-create-image",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"mural": {"authProvisionId": "apn_xxxxxxx"},
"workspaceId": "Workspace ID",
"muralId": "Mural ID",
},
)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": "mural-create-image",
"configured_props": {
"mural": { "authProvisionId": "apn_xxxxxxx" },
"workspaceId": "Workspace ID",
"muralId": "Mural ID"
}
}'TOOLS
Mural actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Create Image
actionUpload an image and create an image widget on a mural. The image is uploaded to Mural's storage first and the widget is created from the uploaded asset, so the file must be reachable when the action runs. Onlybmp,ico,gif,jpeg,jpg,png, andwebpfiles are accepted; the format is detected from the file extension, falling back to the content type. See the documentationWritev0.0.2 -
Create Mural
actionCreate a new mural within a specified workspace. See the documentationWritev0.0.3 -
Create Room
actionCreate a new room to group related murals within a workspace. Choose anopenroom to let any workspace member join, or aprivateroom to restrict access to invited members only. Confidential rooms add a further layer of security but are Enterprise-only and cannot have share links. Requires therooms:writeOAuth scope. See the documentationWritev0.0.2 -
Create Shape
actionCreate a new shape widget within a given mural, useful for diagram nodes, callouts, and arrows drawn on the canvas. Shape names are the API's own enum values rather than display names, so a triangle istriangle_smartand a diamond isrhombus_smart. The legacy valuescircle,diamond,hexagon,pentagon,square, andtrianglestill work but are deprecated in favor ofellipse,rhombus_smart,hexagon_smart,pentagon_smart,rectangle, andtriangle_smart. See the documentationWritev0.0.2 -
Create Sticky
actionCreate a new sticky note within a given mural. See the documentationWritev0.0.3 -
Create Textbox
actionCreate a new textbox widget within a given mural. Use a textbox for section headings, instructions, or longer prose that should read as plain text on the canvas rather than as a sticky note. Position is set in pixels and, unless Parent ID is given, is measured from the top-left corner of the mural. See the documentationWritev0.0.2 -
Invite to Mural
actionShare a mural by inviting a user to it. Supply either Email or Username: an email invitation must be accepted by the recipient before they gain access, while inviting by username adds the user to the mural immediately. Users invited to a mural without being members of its room become restricted members, meaning they can open only that mural and cannot create murals in the room. See the documentationWritev0.0.2 -
List Murals
actionList murals in a workspace. See the documentationRead-onlyv0.0.1 -
List Rooms
actionList rooms in a workspace. See the documentationRead-onlyv0.0.1 -
List Widgets
actionList widgets in a mural. See the documentationRead-onlyv0.0.1 -
Search Murals
actionSearch murals in a workspace. See the documentationRead-onlyv0.0.1 -
Update Sticky
actionUpdate or move an existing sticky note on a mural. Every field except the mural and widget is optional, and only the fields you set are sent, so you can reposition a note by supplying just X Position and Y Position or reword it by supplying just Text. At least one updatable field must be set. See the documentationWritev0.0.2
- App slug
- mural
- Authentication
- OAuth
- Categories
- Productivity
- Actions
- 12
- Triggers
- 3
- API proxy
- Available
OAuth scopes
These are the scopes Pipedream's managed Mural OAuth client requests when one of your users connects an account. Supply your own OAuth client to request a different set.
- workspaces:read
- users:read
- murals:write
- murals:read
- rooms:read
- identity:read
- templates:read