# Create Shape — Mural

> Create 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 is triangle_smart and a diamond is…

- Key: `mural-create-shape`
- Type: Action (Write)
- Version: 0.0.2
- App: Mural (`mural`) — https://pipedream.com/apps/mural.md
- This page (HTML): https://pipedream.com/apps/mural/actions/create-shape
- Hints: open-world
- Source: https://github.com/PipedreamHQ/pipedream/blob/master/components/mural/actions/create-shape/create-shape.mjs

## Description

Create 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 is `triangle_smart` and a diamond is `rhombus_smart`. The legacy values `circle`, `diamond`, `hexagon`, `pentagon`, `square`, and `triangle` still work but are deprecated in favor of `ellipse`, `rhombus_smart`, `hexagon_smart`, `pentagon_smart`, `rectangle`, and `triangle_smart`. [See the documentation](https://developers.mural.co/public/reference/createshapewidget)

## Props

| Prop | Type | Required | Description |
|---|---|---|---|
| `workspaceId` | `string` | Yes | The ID of the Workspace. Options are loaded from the connected account. |
| `muralId` | `string` | Yes | The ID of the Mural. Options are loaded from the connected account. |
| `shape` | `string` | Yes | The shape of the shape widget |
| `xPosition` | `integer` | Yes | The horizontal position of the widget in px (e.g. 100). This is the distance from the left of the parent widget, such as an area. If the widget has no parent widget, this is the distance from the left of the mural. |
| `yPosition` | `integer` | Yes | The vertical position of the widget in px (e.g. 100). This is the distance from the top of the parent widget, such as an area. If the widget has no parent widget, this is the distance from the top of the mural. |
| `text` | `string` | No | The text in the widget |
| `title` | `string` | No | The title of the widget in the outline |
| `height` | `integer` | No | The height of the widget in px (e.g. 300) |
| `width` | `integer` | No | The width of the widget in px (e.g. 500) |
| `hidden` | `boolean` | No | If true, the widget is hidden from non-facilitators. Applies only when the widget is in the outline |
| `parentId` | `string` | No | The ID of the area widget that should contain this shape, for example 0-12345. When set, X Position and Y Position are measured from the area's top-left corner instead of the mural's. Options are loaded from the connected account. |

## Run it

**MCP**

```ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
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 accessToken = await pd.rawAccessToken

const transport = new StreamableHTTPClientTransport(
  new URL("https://remote.mcp.pipedream.net/v3"),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "x-pd-project-id": process.env.PIPEDREAM_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()

// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
  name: "mural-create-shape",
  arguments: {
    workspaceId: "Workspace ID",
    muralId: "Mural ID",
  },
})
```

**TypeScript**

```ts
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-shape",
  externalUserId: "{external_user_id}", // any stable ID for this user in your system
  configuredProps: {
    mural: { authProvisionId: "apn_xxxxxxx" },
    workspaceId: "Workspace ID",
    muralId: "Mural ID",
  },
})

console.log(result)
```

**cURL**

```bash
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-shape",
    "configured_props": {
      "mural": { "authProvisionId": "apn_xxxxxxx" },
      "workspaceId": "Workspace ID",
      "muralId": "Mural ID"
    }
  }'
```

---

- App: https://pipedream.com/apps/mural.md · All apps: https://pipedream.com/apps
