Monday.com MCP Server
by sakce
Verified
- src
- mcp_server_monday
import logging
from enum import Enum
from typing import Sequence, Union
import mcp.types as types
from mcp.server import Server
from monday import MondayClient
from mcp_server_monday.board import (
handle_monday_get_board_columns,
handle_monday_get_board_groups,
handle_monday_list_boards,
)
from mcp_server_monday.item import (
handle_monday_create_item,
handle_monday_create_update_on_item,
handle_monday_get_item_by_id,
handle_monday_list_items_in_groups,
handle_monday_list_subitems_in_items,
handle_monday_update_item,
)
logger = logging.getLogger("mcp-server-monday")
class ToolName(str, Enum):
LIST_BOARDS = "monday-list-boards"
GET_BOARD_GROUPS = "monday-get-board-groups"
GET_BOARD_COLUMNS = "monday-get-board-columns"
CREATE_ITEM = "monday-create-item"
UPDATE_ITEM = "monday-update-item"
CREATE_UPDATE = "monday-create-update"
LIST_ITEMS_IN_GROUPS = "monday-list-items-in-groups"
LIST_SUBITEMS_IN_ITEMS = "monday-list-subitems-in-items"
GET_ITEM_BY_ID = "monday-get-items-by-id"
ServerTools = [
types.Tool(
name=ToolName.CREATE_ITEM,
description="Create a new item in a Monday.com Board. Optionally, specify the parent Item ID to create a Sub-item.",
inputSchema={
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Monday.com Board ID that the Item or Sub-item is on.",
},
"itemTitle": {
"type": "string",
"description": "Name of the Monday.com Item or Sub-item that will be created.",
},
"groupId": {
"type": "string",
"description": "Monday.com Board's Group ID to create the Item in. If set, parentItemId should not be set.",
},
"parentItemId": {
"type": "string",
"description": "Monday.com Item ID to create the Sub-item under. If set, groupId should not be set.",
},
"columnValues": {
"type": "object",
"description": "Dictionary of column values to set {column_id: value}",
},
},
"required": ["boardId", "itemTitle"],
},
),
types.Tool(
name=ToolName.GET_ITEM_BY_ID,
description="Fetch specific Monday.com item by its ID",
inputSchema={
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "ID of the Monday.com item to fetch.",
},
},
"required": ["itemId"],
},
),
types.Tool(
name=ToolName.UPDATE_ITEM,
description="Update a Monday.com item's or sub-item's column values.",
inputSchema={
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Monday.com Board ID that the Item or Sub-item is on.",
},
"itemId": {
"type": "string",
"description": "Monday.com Item or Sub-item ID to update the columns of.",
},
"columnValues": {
"type": "object",
"description": "Dictionary of column values to update the Monday.com Item or Sub-item with. ({column_id: value})",
},
},
"required": ["boardId", "itemId", "columnValues"],
},
),
types.Tool(
name=ToolName.GET_BOARD_COLUMNS,
description="Get the Columns of a Monday.com Board.",
inputSchema={
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Monday.com Board ID that the Item or Sub-item is on.",
},
},
"required": ["boardId"],
},
),
types.Tool(
name=ToolName.GET_BOARD_GROUPS,
description="Get the Groups of a Monday.com Board.",
inputSchema={
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Monday.com Board ID that the Item or Sub-item is on.",
},
},
"required": ["boardId"],
},
),
types.Tool(
name=ToolName.CREATE_UPDATE,
description="Create an update (comment) on a Monday.com Item or Sub-item.",
inputSchema={
"type": "object",
"properties": {
"itemId": {"type": "string"},
"updateText": {
"type": "string",
"description": "Content to update the Item or Sub-item with.",
},
},
"required": ["itemId", "updateText"],
},
),
types.Tool(
name=ToolName.LIST_BOARDS,
description="Get all Boards from Monday.com",
inputSchema={
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "Maximum number of Monday.com Boards to return.",
}
},
},
),
types.Tool(
name=ToolName.LIST_ITEMS_IN_GROUPS,
description="List all items in the specified groups of a Monday.com board",
inputSchema={
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Monday.com Board ID that the Item or Sub-item is on.",
},
"groupIds": {"type": "array", "items": {"type": "string"}},
"limit": {"type": "integer"},
"cursor": {"type": "string"},
},
"required": ["boardId", "groupIds"],
},
),
types.Tool(
name=ToolName.LIST_SUBITEMS_IN_ITEMS,
description="List all Sub-items of a list of Monday.com Items",
inputSchema={
"type": "object",
"properties": {
"itemIds": {"type": "array", "items": {"type": "string"}},
},
"required": ["itemIds"],
},
),
]
def register_tools(server: Server, monday_client: MondayClient) -> None:
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
return ServerTools
@server.call_tool()
async def handle_call_tool(
name: str, arguments: dict | None
) -> Sequence[Union[types.TextContent, types.ImageContent, types.EmbeddedResource]]:
try:
match name:
case ToolName.CREATE_ITEM:
return await handle_monday_create_item(
boardId=arguments.get("boardId"),
itemTitle=arguments.get("itemTitle"),
groupId=arguments.get("groupId"),
parentItemId=arguments.get("parentItemId"),
columnValues=arguments.get("columnValues"),
monday_client=monday_client,
)
case ToolName.GET_BOARD_COLUMNS:
return await handle_monday_get_board_columns(
boardId=arguments.get("boardId"), monday_client=monday_client
)
case ToolName.GET_BOARD_GROUPS:
return await handle_monday_get_board_groups(
boardId=arguments.get("boardId"), monday_client=monday_client
)
case ToolName.CREATE_UPDATE:
return await handle_monday_create_update_on_item(
itemId=arguments.get("itemId"),
updateText=arguments.get("updateText"),
monday_client=monday_client,
)
case ToolName.UPDATE_ITEM:
return await handle_monday_update_item(
boardId=arguments.get("boardId"),
itemId=arguments.get("itemId"),
columnValues=arguments.get("columnValues"),
monday_client=monday_client,
)
case ToolName.LIST_BOARDS:
return await handle_monday_list_boards(monday_client=monday_client)
case ToolName.LIST_ITEMS_IN_GROUPS:
return await handle_monday_list_items_in_groups(
boardId=arguments.get("boardId"),
groupIds=arguments.get("groupIds"),
limit=arguments.get("limit"),
cursor=arguments.get("cursor"),
monday_client=monday_client,
)
case ToolName.LIST_SUBITEMS_IN_ITEMS:
return await handle_monday_list_subitems_in_items(
itemIds=arguments.get("itemIds"), monday_client=monday_client
)
case ToolName.GET_ITEMS_BY_ID:
return await handle_monday_get_item_by_id(
itemIds=arguments.get("itemId"), monday_client=monday_client
)
case _:
raise ValueError(f"Undefined behaviour for tool: {name}")
except Exception as e:
logger.error(f"Error calling tool {name}: {e}")
raise