Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Monday MCP server

Vendor MCP
Open markdown

The Monday MCP connector routes your AI agent's tool calls to Monday's own MCP server through Scalekit. Each user signs in to Monday once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 103 tools.

Tools
103
What they doRead · write · destructive
44 · 46 · 1344 read46 write13 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Manage boards and items: create boards, groups, columns, and items, and update item column values in bulk
  • Search and read workspaces: search boards, docs, and folders and read board structure, items, and activity
  • Post updates and notify: comment on items, read updates, and send notifications to users
  • Create docs and forms: write and edit monday docs, build forms, and submit form responses
  • Automate workflows: create, list, activate, or delete board automations and plan, build, and publish workflows
  • Analyze board data: calculate insights across board data and build dashboards and widgets

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Monday MCP connection

    In AgentKit > Connections, create a Monday MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Monday.com, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.

    Use your own OAuth app

    Monday MCP uses Dynamic Client Registration (DCR) with PKCE — no client ID or secret is needed. Scalekit registers the OAuth client automatically the first time a user authorizes the connection, so creating the connection in Scalekit is the only setup step.

    1. Create the Monday MCP connection in Scalekit

      In the Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find Monday MCP and click Create.

    2. Have your user authorize the connection

      Send the user through the connection’s authorization link (the magic link Scalekit generates, or the link returned by the SDK). The user signs in to monday.com and grants access.

      On first authorization, Scalekit completes Dynamic Client Registration and PKCE behind the scenes, then stores and refreshes tokens for every user who connects — no further configuration is needed.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'mondaymcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Monday MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'mondaymcp_allwidgetsschema',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • mondaymcp_agentcatalogBrowse the account-wide catalog of available trigger types and skills for monday platform agents.Read-only

    AgentCatalog

    Browse the account-wide catalog of available trigger types and skills for monday platform agents. READ-ONLY — no agent_id required. Use this tool to discover what's available BEFORE wiring anything to a specific agent. ACTIONS: - list_triggers: { block_reference_ids? } — returns available trigger types. Each entry has block_reference_id (required for manage_agent_triggers action:"add"), name, description, field_schemas (describes field_values shape), and required_fields (fields to collect from the user). Note: only triggers that can be added programmatically appear here. OAuth/3rd-party triggers (Slack, Gmail, Salesforce, etc.) require user setup in the monday.com UI and will not appear here. - list_skills: {} — returns available skills with id, name, description. Never guess or invent a skill id — always look it up here before calling manage_agent_skills action:"add". USAGE EXAMPLES: - List all trigger types: { "action": "list_triggers" } - Fetch specific trigger: { "action": "list_triggers", "block_reference_ids": ["some-block-ref-id"] } - List all skills: { "action": "list_skills" } RELATED TOOLS: - manage_agent_triggers — use block_reference_id from list_triggers to attach a trigger to a specific agent - manage_agent_skills — use skill id from list_skills, or action:"create" to author a new skill, then attach to an agent - manage_agent — manage the agent entity itself (create, update, delete, activate, etc.)

    Inputs

    actionstringrequired
    "list_triggers" — fetch available trigger types with block_reference_id, field_schemas, and required_fields. Call before using manage_agent_triggers action:"add". "list_skills" — fetch available skills with id, name, description. Call before using manage_agent_skills action:"add".one of list_triggerslist_skills
    block_reference_idsarray
    Used with action:"list_triggers". Fetch specific trigger types by block_reference_id. Omit to return all trigger types.
  • mondaymcp_allapireadExecute read-only GraphQL queries against the monday.com API.Read-only

    Run read-only Query on the monday.com API

    Execute read-only GraphQL queries against the monday.com API. Only queries are accepted — mutations are rejected with an error before the request is sent. Use get_graphql_schema and get_type_details tools first to understand the schema before crafting your query.

    Inputs

    querystringrequired
    Custom GraphQL query/mutation. you need to provide the full query / mutation
    variablesstringrequired
    JSON string containing the variables for the GraphQL operationdefault {}
  • mondaymcp_allwidgetsschemaFetch complete JSON Schema 7 definitions for all available widget types in monday.com.Read-only

    AllWidgetsSchema

    Fetch complete JSON Schema 7 definitions for all available widget types in monday.com. This tool is essential before creating widgets as it provides: - Complete schema definitions for all supported widgets - Required and optional fields for each widget type - Data type specifications and validation rules - Detailed descriptions of widget capabilities Use this tool when you need to: - Understand widget configuration requirements before creating widgets - Validate widget settings against official schemas - Plan widget implementations with proper data structures The response includes JSON Schema 7 definitions that describe exactly what settings each widget type accepts.

    Inputs

    This tool takes no inputs.

  • mondaymcp_boardinsightsThis tool allows you to calculate insights about board's data by filtering, grouping and aggregating columns.Read-only

    BoardInsights

    This tool allows you to calculate insights about board's data by filtering, grouping and aggregating columns. For example, you can get the total number of items in a board, the number of items in each status, the number of items in each column, etc. Use this tool when you need to get a summary of the board's data, for example, you want to know the total number of items in a board, the number of items in each status, the number of items in each column, etc.[REQUIRED PRECONDITION]: Before using this tool, if new columns were added to the board or if you are not familiar with the board's structure (column IDs, column types, status labels, etc.), first use get_board_info to understand the board metadata. This is essential for constructing proper filters and knowing which columns are available.[IMPORTANT]: For some columns, human-friendly label is returned inside 'LABEL_<column_id' field. E.g. for column with id 'status_123' the label is returned inside 'LABEL_status_123' field.

    Inputs

    boardIdnumberrequired
    The id of the board to get insights for
    aggregationsarray
    The aggregations to get. Before sending the aggregations, read guidelines.aggregation from get_column_type_info with fetchMode "guidelines" for a relevant column type on this board. Transformative functions and plain columns (no function) must be in group by.
    filtersarray
    The configuration of filters to apply on the items. Use get_board_info for column ids and types on the board. Before sending the filters, use get_column_type_info with fetchMode "guidelines" and use data.guidelines.filter (null if that type has no documented rules).
    filtersOperatorstring
    The operator to use for the filtersone of andordefault and
    groupByarray
    The columns to group by. All columns in the group by must be in the aggregations as well without a function.
    limitnumber
    The limit of the resultsdefault 1000
    orderByarray
    The columns to order by, will control the order of the items in the response
  • mondaymcp_exploremeetingsDiscover meetings by topic, or list/browse meetings by date and access.Read-only

    Explore Meetings

    Discover meetings by topic, or list/browse meetings by date and access. Returns meetings ranked by keyword relevance (matched against title and AI gist — not semantic). USE THIS FIRST for topic/theme questions ("what did we decide about pricing", "find meetings about the acme deal") AND for listing/browsing ("list my recent meetings", "meetings from last week", "my last 10 meetings"). When query is omitted, returns recent meetings filtered by date/access only — this is the tool for listing. Pass returned ids to get_meetings_content for full content, or to search_meetings_content for matching passages. Only indexed meetings are candidates.

    Inputs

    accessstring
    Filter by access level. OWN: meetings the user participated in or invited the bot to. SHARED_WITH_ME: shared with the user or their team. SHARED_WITH_ACCOUNT: shared with the entire account. ALL: all accessible meetings. Default: OWN.one of OWNSHARED_WITH_MESHARED_WITH_ACCOUNTALLdefault OWN
    limitinteger
    Maximum number of meetings to return (1-20). Keep small - the top-ranked few are usually enough.default 10
    querystring
    What to look for, matched against each meeting's title and AI gist and ranked by relevance. Omit or leave empty to browse by date/access filters only. Pass the core subject or entity, roughly 1-4 words (e.g. "pricing roadmap" or "acme renewal"), not the full question. Drop instruction words, filler, and synonyms, which dilute the ranking.default
    start_time_fromstring
    Only include meetings that started at or after this UTC ISO 8601 timestamp (e.g. 2026-07-28T00:00:00Z).
    start_time_tostring
    Only include meetings that started at or before this UTC ISO 8601 timestamp (e.g. 2026-07-28T23:59:59Z).
  • mondaymcp_get_activity_logsUse when the user asks what changed, who did something, or what happened on monday.com boards, items or users over a period of time.Read-only

    Get Activity Logs

    Use when the user asks what changed, who did something, or what happened on monday.com boards, items or users over a period of time. Reads the monday.com activity log: who changed what, and when. Requires at least one of board_ids, user_ids or correlation_ids. Narrow the query with item_ids, event_types, entities, search and a time range (last_hours, or from/to; at most the last 90 days) rather than paging through everything — the tighter the filters, the faster and cheaper the call. Returns newest events first; pass the returned cursor with the same filters to get the next page. Rows are compact by default; set include_data only when you need the event payload, such as column values before and after a change — payloads share a per-call size budget. Only events the user is allowed to see are returned.

    Inputs

    board_idsarray
    Board IDs to read activity from. Only boards the user can see return events.
    correlation_idsarray
    Correlation IDs grouping the events of one logical session, e.g. one agent conversation.
    cursorstring
    The cursor from a previous response, to fetch the next page with the same filters. It keeps the time window of the first page.
    entitiesarray
    Narrow to these entity types, e.g. "pulse" (item), "board", "update".
    event_typesarray
    Narrow to these event types, e.g. "create_pulse", "delete_pulse", "update_column_value".
    fromstring
    ISO 8601 start of the time range, inclusive. At most 90 days ago. Not with last_hours.
    include_databoolean
    Include each event's data payload (column values, names, before/after). Off by default. Payloads share a 256 KB budget per call; events past it come back with data_truncated: true — re-query those with narrower filters or a smaller limit.default false
    item_idsarray
    Narrow to events on these items. Combine with board_ids.
    last_hoursinteger
    Only events from the last N hours (max 2136). Use instead of "from" when you do not know the current time.
    limitinteger
    Maximum events to return, newest first (default 25, max 200).default 25
    searchstring
    Free-text prefix search over item names.
    tostring
    ISO 8601 end of the time range. Defaults to now.
    user_idsarray
    IDs of the users who performed the actions. Pass the current user's ID for "what did I do".
  • mondaymcp_get_run_once_trigger_entitiesLists the concrete entities (items, boards, docs, ...) the workflow's trigger can be fired on, so the workflow can be run once on one of them.Read-only

    Get Run Once Trigger Entities

    Lists the concrete entities (items, boards, docs, ...) the workflow's trigger can be fired on, so the workflow can be run once on one of them. Use this tool: - ALWAYS before calling run_workflow_once, to learn whether the trigger needs an entity and which entities are available. - When the user asks what the workflow would be run on. Do NOT use this tool for a board automation, such as one create_automation built: run-once applies to workflows only, and the id create_automation returns is not a workflowObjectId. Tell the user to trigger that automation on the board instead. The tool does NOT modify the workflow and does NOT run anything. The response is a JSON object: - status "ok": "requiresEntity" tells you whether run_workflow_once needs a triggerPayload, and "entities" is a list of { label, value } candidates. Show the labels to the user and let them pick; pass the picked entity's "value" object verbatim as run_workflow_once's triggerPayload. An empty "entities" list while requiresEntity is true means there is nothing to run on — tell the user instead of guessing a payload. - status "failed": "message" explains why the entities could not be listed. Relay it; do not call run_workflow_once.

    Inputs

    workflowObjectIdnumberrequired
    The identifier of a workflow object, found in the workflow URL or returned by create_workflow. A workflow object is the entity that is retained across published versions; users can create draft versions related to this workflow object. This is NOT an automation id: the workflowId returned by create_automation identifies a board automation, which these tools cannot address.
    workflowDraftIdinteger
    The identifier of a draft that belongs to the workflow object referenced by workflowObjectId. When omitted, it refers to the live version of the workflow.
  • mondaymcp_get_workflow_run_once_statusReports how a run started by run_workflow_once ended: whether it succeeded, and if not, which step failed and why.Read-only

    Get Workflow Run Once Status

    Reports how a run started by run_workflow_once ended: whether it succeeded, and if not, which step failed and why. Call this after run_workflow_once, passing the "automationId" it returned. The tool does NOT modify the workflow and does NOT run anything. It answers immediately with whatever is known so far, so a run in progress is a normal answer, not a problem: - "isTerminal": false — the run has NOT finished. This is NOT a failure. Wait "retryAfterMs" milliseconds and call this tool again with the same arguments. Keep doing that until isTerminal is true. Never report an outcome to the user while isTerminal is false; say the run is still going. - "isTerminal": true — the run is over and "state" is its final outcome. Report it and stop calling. Trust "isTerminal" over your own reading of "state". "state" is one of: - "success" — every step ran without error. - "failure" — a step failed. "errorReason" and the failing entry in "blocks" say which and why. - "exhausted" — the run gave up after retrying a step too many times. - "stopped" — the run was stopped before finishing, so the remaining steps never ran. - "zero_actions" — the trigger fired but the workflow's conditions matched nothing, so no step ran. Nothing is broken; the entity did not qualify. - "running" — a step is executing right now. - "waiting" — the run is parked on a wait step or waiting for a second event. This can last hours, which is why "retryAfterMs" is long here. Tell the user it is waiting rather than polling silently for hours. - "not_indexed_yet" — the run's record has not appeared yet, which is expected for the first few seconds after a run starts. It does NOT mean nothing ran. "blocks" lists the steps recorded so far, each with its own "state" and, when it failed, "errorReason". While isTerminal is false this list is partial and is progress, not a verdict. Use it to tell the user which step failed rather than only that the run failed. The response is a JSON object: - status "ok": the fields above. - status "failed": the status could not be read. "message" explains why. This says nothing about the run itself — do not report the run as failed because of it.

    Inputs

    workflowObjectIdnumberrequired
    The identifier of a workflow object, found in the workflow URL or returned by create_workflow. A workflow object is the entity that is retained across published versions; users can create draft versions related to this workflow object. This is NOT an automation id: the workflowId returned by create_automation identifies a board automation, which these tools cannot address.
    automationIdinteger
    The "automationId" that run_workflow_once returned for the run you are asking about. Omit it only if you no longer have it — the status of the workflow's most recent run is then returned, which may be a run someone else started.
    workflowDraftIdinteger
    The identifier of a draft that belongs to the workflow object referenced by workflowObjectId. When omitted, it refers to the live version of the workflow.

Workflows

Get items from a board

Use mondaymcp_getboarditemspage to fetch items from a monday.com board. You need the board’s numeric ID, which you can find in the board URL (https://mycompany.monday.com/boards/<BOARD_ID>).

const items = await actions.executeTool({
connector: 'mondaymcp',
identifier: 'user_123',
toolName: 'mondaymcp_getboarditemspage',
toolInput: {
boardId: 1234567890,
limit: 50,
},
});
console.log(items);

Create an item and add an update

Use mondaymcp_createitem to add a new item to a board, then mondaymcp_createupdate to post a comment or status update on it.

// Step 1 — create the item
const newItem = await actions.executeTool({
connector: 'mondaymcp',
identifier: 'user_123',
toolName: 'mondaymcp_createitem',
toolInput: {
boardId: 1234567890,
name: 'Fix login bug',
columnValues: '{}',
groupId: 'topics',
},
});
const itemId = newItem.id;
// Step 2 — post an update on the item
await actions.executeTool({
connector: 'mondaymcp',
identifier: 'user_123',
toolName: 'mondaymcp_createupdate',
toolInput: {
itemId,
body: 'Assigned to the auth team. Expected fix in next sprint.',
},
});

Update column values on an item

Use mondaymcp_changeitemcolumnvalues to set structured column data — such as status, date, or assignee — on an existing item.

await actions.executeTool({
connector: 'mondaymcp',
identifier: 'user_123',
toolName: 'mondaymcp_changeitemcolumnvalues',
toolInput: {
boardId: 1234567890,
itemId: 9876543210,
// Column values are JSON-encoded per the monday.com column type
columnValues: JSON.stringify({
status: { label: 'In Progress' },
date4: { date: '2025-08-01' },
}),
},
});

Search across monday.com

Use mondaymcp_search to find boards, items, docs, or workspaces by keyword.

const results = await actions.executeTool({
connector: 'mondaymcp',
identifier: 'user_123',
toolName: 'mondaymcp_search',
toolInput: {
searchTerm: 'Q3 roadmap',
searchType: 'BOARD',
},
});
console.log(results);