From monday-com
Creates, updates, assigns, and manages items across monday.com boards. monday.com is a customizable AI work platform with dedicated products for work management, CRM, dev, service, and campaigns. Handles correct column value formatting for all column types. Use when user asks to "create a task", "add an item", "update status", "assign to", "change due date", "move item", "mark as done", "create a subitem", "add a comment", or "update the priority".
How this skill is triggered — by the user, by Claude, or both
Slash command
/monday-com:task-managementThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create, update, assign, and manage items on monday.com boards. In monday.com, every row on a board is an "item" - it could represent a task, a deal, a bug, a content piece, or any unit of work. This skill teaches the correct column value formatting required by monday.com's API - the most common source of errors when working with the platform programmatically.
Create, update, assign, and manage items on monday.com boards. In monday.com, every row on a board is an "item" - it could represent a task, a deal, a bug, a content piece, or any unit of work. This skill teaches the correct column value formatting required by monday.com's API - the most common source of errors when working with the platform programmatically.
Before creating or updating any item, ALWAYS call get_board_info first to retrieve the board's column definitions. You need:
status, date4, person)status, date, people)Without this step, column value writes will fail silently or set incorrect values.
If the user specifies a board name:
search with the board name to find itIf the user doesn't specify:
get_user_context to list their boardsCall get_board_info with the board ID. Note:
If you need to understand the exact format for a column type, call get_column_type_info with the column type. This returns the JSON schema and validation rules.
Call create_item with:
boardId: the target board IDgroupId: the group to place the item in (from Step 2)itemName: the item namecolumnValues: a JSON string with column values (see formatting guide below)After creation:
If the user provides an item name but not an ID:
get_board_info to understand the board structureget_board_items_page with a search query to find the itemget_board_items_page with searchTerm behaves as a relevance sort, not a strict name filter - when no true match exists, it still returns items, ranked by partial overlap. Before writing, scan the returned list for an exact (case-insensitive) or near-exact name match. If none of the returned items name-match the target, treat the search as a no-match result and route to step 4, even though the response was non-empty.Call get_board_info if not already done. You must know the column IDs and types before writing values.
Call change_item_column_values with:
boardId: the board IDitemId: the item IDcolumnValues: a JSON string with only the columns being changedReport what was changed in plain language: item name, which fields were updated, and the new values. Always include the direct URL. Don't describe which API tools were called.
Default to plain text confirmations. Reach for show-assign when the user asks to assign work and needs to pick from a long list of teammates - the widget renders a person picker that the user can interact with. For single-person assignments where the user has already named the assignee, just look up the user ID via list_users_and_teams and write directly without the widget.
Do not use show-table to confirm a single create or update - plain text plus the item URL is cleaner.
The columnValues parameter for create_item and change_item_column_values is a JSON string. Each column type requires a specific format. Getting this wrong is the #1 cause of failures.
For the complete formatting reference with all column types, see references/column-value-formats.md.
Quick reference for the most common types:
Status - Use {"label": "Done"} with the exact label string from get_board_info:
{"status_column_id": {"label": "Done"}}
Date - Use {"date": "YYYY-MM-DD"}:
{"date_column_id": {"date": "2025-06-15"}}
People - Use {"personsAndTeams": [{"id": USER_ID, "kind": "person"}]}:
{"person_column_id": {"personsAndTeams": [{"id": 12345678, "kind": "person"}]}}
Text - Plain string value:
{"text_column_id": "Some text value"}
Numbers - Plain string of the number:
{"numbers_column_id": "42"}
Email - Use {"email": "...", "text": "..."}:
{"email_column_id": {"email": "[email protected]", "text": "Contact"}}
Phone - Use {"phone": "...", "countryShortName": "..."}:
{"phone_column_id": {"phone": "+15551234567", "countryShortName": "US"}}
Dropdown - Use {"labels": ["Option 1", "Option 2"]}:
{"dropdown_column_id": {"labels": ["High Priority"]}}
Timeline - Use {"from": "YYYY-MM-DD", "to": "YYYY-MM-DD"}:
{"timeline_column_id": {"from": "2025-06-01", "to": "2025-06-30"}}
Checkbox - Use {"checked": "true"} or {"checked": "false"} (string, not boolean):
{"checkbox_column_id": {"checked": "true"}}
Combine multiple column updates in a single JSON string:
{
"status": {"label": "Working on it"},
"date4": {"date": "2025-06-15"},
"person": {"personsAndTeams": [{"id": 12345678, "kind": "person"}]},
"text0": "Implementation notes here"
}
To create a subitem, call create_item with the parentItemId parameter set to the parent item's ID. The subitem will be created on the parent item's subitem board.
Note: Subitem boards have their own column structure. Call get_board_info on the subitem board to get its column definitions before setting column values.
To add a comment or update to an item, call create_update with:
itemId: the item IDbody: the comment text (supports basic HTML: <b>, <i>, <a>, <ul>, <li>)Mark as done: Get the board's "done" status label from get_board_info, then call change_item_column_values with {"status_column_id": {"label": "Done"}}. After confirming the status change, check whether the board has a matching terminal group (Done, Closed, Completed, Resolved, Fixed, Won, Lost, Archived) and the item is not already in it. If so, offer it as a next step: "Want me to also move it to the Done group?" Do not auto-move - some boards intentionally keep items in their original group regardless of status, so always ask first.
Reassign: Get the new person's user ID from list_users_and_teams, then call change_item_column_values with the people column format.
Batch updates: When updating multiple items, call change_item_column_values for each item. There is no batch endpoint.
Move to group: The MCP toolkit has no direct "move item" tool (move_object is for boards/folders/overviews, not items). Use all_monday_api with the move_item_to_group mutation: mutation { move_item_to_group (item_id: <ID>, group_id: "<GROUP_ID>") { id } }. Do not use create_item with duplicateFromItemId for moves - that creates a copy in the new group and leaves the original in place.
When the user doesn't specify all values:
get_board_info. State the default in your response.To Do, Todo, Backlog, New, Open, Not Started, Inbox, Lead, Triage), use that. (2) Otherwise, use the top non-terminal group. A terminal group is one whose name matches a done-pattern (case-insensitive: Done, Closed, Completed, Complete, Verified, Resolved, Fixed, Won, Lost, Archived, Cancelled, Canceled). (3) If every group is terminal, ask the user which group to use rather than guess. Some monday boards return "Done" as the first group from the API, so do not blindly use groups[0]. Always state which group you used so the user can override.When creating or updating 5+ items in one request:
For bulk destructive operations (3+ updates that could be hard to reverse), confirm with the user before executing.
get_board_info first - never guess column IDs or status labelsstatus column and a color column use different formatslist_users_and_teams to get valid user IDs before assigning. Always pass the name parameter (or userIds if known) to scope the query. Calling list_users_and_teams with no parameters returns the entire account user list and will exceed token limits on large tenants. If the user provides an email, search by the local-part as a name first (e.g. "alex.po" for [email protected]); if no match, ask the user to provide the person's display nameWhen an MCP call fails, do not pass the raw error through. Diagnose and propose a fix:
get_user_context - find user's boardssearch - find boards by nameget_board_info - board structure, column IDs, status labels (REQUIRED before writes)get_column_type_info - detailed column type schema and validation rulesget_board_items_page - find items by name or filtercreate_item - create new items or subitemschange_item_column_values - update column values on existing itemscreate_update - add comments to itemsall_monday_api - for the move_item_to_group mutation when moving items between groupslist_users_and_teams - look up user IDs for people columnsshow-assign (selectively) - person-picker widget when user is choosing from many teammatesreferences/column-value-formats.md - Complete column value formatting reference for all monday.com column typesnpx claudepluginhub ai-integr8tor/anthropics-knowledge-work-plugins --plugin monday-comProvides C# and .NET testing patterns using xUnit, FluentAssertions, NSubstitute, Testcontainers, and WebApplicationFactory for unit and integration tests.