Install
openclaw skills install monday-comManage monday.com boards, items, columns, groups, updates, and workflows via MCP server (preferred) and GraphQL API (fallback). Use when a user asks to creat...
openclaw skills install monday-comManage everything on monday.com: boards, items, columns, groups, updates, users, workspaces, webhooks, files, and AI features.
Navigate to https://auth.monday.com/users/sign_up_new?custom_flow=agent_bot
Solve Hatcha — an agent-verification challenge. Types you may see:
You have ~30 seconds. Submit your answer and click Verify.
Enter your email and select who it belongs to (you or your operator). Click Submit.
Set your agent name and password. Password rules:
Click Complete signup →
You'll land on the Agent Homepage — "Welcome to Monday for agents." This page has everything you need:
openclaw config set or your platform's secrets manager)Always use the MCP server first. It handles authentication, rate limiting, retries, and complexity budgets automatically. Only fall back to the GraphQL API when the MCP tools don't cover your operation.
monday.com has an official MCP server (@mondaydotcomorg/monday-api-mcp):
{
"mcpServers": {
"monday": {
"command": "npx",
"args": ["-y", "@mondaydotcomorg/monday-api-mcp@latest"],
"env": {
"MONDAY_API_TOKEN": "<your-api-token>"
}
}
}
}
If your platform supports MCP natively (e.g. Claude Desktop, Cursor), configure the server above and call tools directly (e.g. create_item, get_board_schema).
If your platform does not have native MCP support (e.g. OpenClaw agents executing via shell), you have two options:
npx, send JSON-RPC over stdin/stdout. This is complex and only worthwhile if you need the MCP server's built-in retry/complexity logic.For most agent use cases, GraphQL fallback is the practical choice when MCP isn't natively available.
| Tool | What It Does | When to Use |
|---|---|---|
create_board | Creates a new board with a name and kind (public/private/share) | User asks to set up a new project, tracker, pipeline, or workspace board |
get_board_schema | Returns board columns, groups, and structure | Before creating/updating items — always call this first to know column IDs and types |
create_group | Creates a new group on a board | Setting up phases, sprints, stages, or categories on a board |
create_column | Adds a new column to a board (status, date, people, numbers, etc.) | User wants to track a new field — priority, due date, assignee, budget, etc. |
create_item | Creates a new item (row) on a board with column values | Adding tasks, tickets, deals, contacts, or any new entry |
delete_item | Deletes an item by ID | User explicitly asks to remove an item (always confirm first) |
change_item_column_values | Updates one or more column values on an existing item | Changing status, reassigning, updating dates, marking complete |
move_item_to_group | Moves an item from one group to another | Progressing items through stages (e.g., "To Do" → "In Progress" → "Done") |
get_board_items_by_name | Searches for items on a board by name | Finding a specific task, deal, or ticket by its title |
create_update | Adds a comment/update to an item | Posting progress notes, status updates, handoff notes, or feedback |
get_board_schema to learn the board's columns and groups before writing datacreate_item / change_item_column_values for CRUD — the MCP server formats column values correctlycreate_update to leave a trail of context on items--enable-dynamic-api-tools true to args for full GraphQL schema exploration via MCPhttps://mcp.monday.com/sse for OAuth-based access without a local tokenBe proactive and useful:
https://<account>.monday.com/boards/{board_id}/pulses/{item_id}Memory & caching (platform-specific):
These patterns apply to agents with persistent memory (e.g. OpenClaw workspace). Adapt to your platform's memory model.
Use the GraphQL API directly when MCP tools don't cover the operation (webhooks, file uploads, subitems, pagination, user/workspace queries, activity logs).
https://api.monday.com/v2 (POST, JSON body with query field)https://api.monday.com/v2/file (multipart POST, max 500MB)API-Version: 2024-10 header. Check developer.monday.com/api-reference for the current stable version.For full GraphQL query and mutation examples, see
references/graphql-examples.md.
All operations use POST to the API endpoint with a query field. Key operations:
| Operation | Mutation/Query | Key Fields |
|---|---|---|
| List boards | { boards(limit: 25) { id name } } | order_by: used_at |
| Get board + items | { boards(ids: [...]) { columns groups items_page { ... } } } | Always fetch schema first |
| Create board | create_board(board_name, board_kind, workspace_id) | Kinds: public, private, share |
| Create item | create_item(board_id, group_id, item_name, column_values) | column_values = JSON string |
| Update columns | change_multiple_column_values(board_id, item_id, column_values) | Prefer over single-column updates |
| Create group | create_group(board_id, group_name, group_color) | — |
| Add comment | create_update(item_id, body) | Supports HTML |
| Create subitem | create_subitem(parent_item_id, item_name) | Returns subitem board ID |
| Move item | move_item_to_group(item_id, group_id) | — |
| Delete item | delete_item(item_id) | Always confirm first |
| Search by column | items_page_by_column_values(board_id, columns) | Column ID + value filter |
| Activity logs | boards(ids) { activity_logs(limit, from, to) } | Events: update_column_value, create_pulse, etc. |
| Create webhook | create_webhook(board_id, url, event) | Events: change_column_value, create_item, etc. |
| User info | { me { id name email account { slug } } } | Get account slug for URLs |
| Workspaces | { workspaces { id name kind } } | — |
Use cursor-based pagination for large datasets:
items_page(limit: 200) — returns a cursornext_items_page(limit: 200, cursor: "CURSOR_VALUE")Recommended page size: 200. Max: 500. Cursors expire after 60 minutes.
When setting column values, use these JSON formats:
| Column Type | JSON Format |
|---|---|
| Status | {"label": "Done"} or {"index": 1} |
| Date | {"date": "2026-03-15"} or {"date": "2026-03-15", "time": "14:30:00"} |
| Person | {"personsAndTeams": [{"id": 12345, "kind": "person"}]} |
| Numbers | "42" (string) |
| Text | "Hello world" |
| Dropdown | {"labels": ["Option A", "Option B"]} |
| Checkbox | {"checked": "true"} |
{"email": "[email protected]", "text": "Contact"} | |
| Phone | {"phone": "+15551234567", "countryShortName": "US"} |
| Link | {"url": "https://example.com", "text": "Click here"} |
| Timeline | {"from": "2026-03-01", "to": "2026-03-31"} |
| Long Text | {"text": "Detailed description here"} |
| Rating | {"rating": 4} |
| Hour | {"hour": 14, "minute": 30} |
| Week | {"week": {"startDate": "2026-03-09", "endDate": "2026-03-15"}} |
| Color | {"color": {"hex": "#FF5AC4"}} |
| Tags | {"tag_ids": [123, 456]} |
| Country | {"countryCode": "US", "countryName": "United States"} |
| Location | {"lat": "40.7128", "lng": "-74.0060", "address": "New York, NY"} |
All column values must be JSON-stringified when passed to mutations.
Build direct links for users:
https://{account}.monday.com/boards/{board_id}https://{account}.monday.com/boards/{board_id}/pulses/{item_id}https://{account}.monday.com/dashboards/{dashboard_id}Get the account slug from: { me { account { slug } } }
| Limit | Free | Standard | Pro | Enterprise |
|---|---|---|---|---|
| Per minute | 1,000 | 1,000 | 2,500 | 5,000 |
| Daily calls | 200 | 1,000 | 10,000 | 25,000 |
| Concurrency | 40 | 40 | 100 | 250 |
| Complexity/query | 5,000,000 | 5,000,000 | 5,000,000 | 5,000,000 |
| Complexity/min | 10,000,000 | 10,000,000 | 10,000,000 | 10,000,000 |
| IP limit | 5,000 per 10s | 5,000 per 10s | 5,000 per 10s | 5,000 per 10s |
When rate-limited (HTTP 429): read the Retry-After header and wait that many seconds. Rate-limited requests count as only 0.1 toward the daily limit.
Always include complexity { before after query } in queries to monitor budget.
monday.com returns errors in two ways:
errors array — application-level errors (invalid query, missing permissions)Common error codes:
InvalidColumnIdException — column ID doesn't exist on the boardInvalidBoardIdException — board doesn't exist or no accessItemsLimitationException — board reached item limitCorrectedValueException — value was auto-corrected (check corrected_value)ColumnValueException — invalid format for column typeUserUnauthorizedException — token doesn't have required permissionsComplexityException — query too expensive, simplify or paginateResourceNotFoundException — ID doesn't exist| Scenario | What to Do |
|---|---|
| "Create a project board" | Create board → add groups (phases/sprints) → add columns → report board URL |
| "Add tasks to my board" | Get board schema → create items with proper column values → return item URLs |
| "What's the status of project X?" | Query board items → summarize by status/group → highlight blockers |
| "Move done items to archive" | Search by status "Done" → move each to archive group |
| "Set up a sprint" | Create group → create items → assign people → set dates → return board link |
| "Track a bug" | Create item in dev board → set priority/status → assign → add description as update |
| "Create a CRM pipeline" | Create board with deal stages as groups → add contact/value/date columns |
| "Generate a weekly report" | Query multiple boards → aggregate by status → format as summary with metrics |
| "Automate status notifications" | Create webhook for status changes → explain how to connect to Slack/email |
| "What changed this week?" | Query activity logs → summarize by user/event type → highlight key changes |
| "Upload a spec to a task" | Upload file to item's files column via multipart POST → return file URL |
Data handling:
Permissions:
Rate limiting etiquette:
change_multiple_column_values instead of multiple single-column updatesRetry-After duration before retryingCompliance: