Announcing CIMD support for MCP Client registration
Learn more

Monday MCP vs Monday API for AI Agents (2026)

TL;DR

  • monday's Platform MCP exposes 49 documented tools and is a wrapper over the same GraphQL API, so capability is not the real axis of comparison. Determinism is: curated tools have fixed schemas, while all_monday_api makes the model author GraphQL at runtime.
  • The coverage gap runs both ways. Automation and workflow management exist as MCP tools but are absent from the public GraphQL API. Webhooks and bulk item ingestion exist in the API and have no MCP tool.
  • monday OAuth access tokens do not expire and the flow issues no refresh tokens. Your monday problem is not refresh orchestration; it is revocation and blast radius on a non-expiring bearer credential.
  • Personal API tokens carry every permission scope. Only OAuth app tokens can be scoped, which makes the local MCP server and quick API scripts the least constrained paths in the entire comparison.
  • Every hosted MCP tool call consumes the account's daily API call limit, which is 1,000 calls on Free, Standard, and Basic plans. Neither path exempts you from it.
  • Scalekit ships both a monday.com connector and a Monday MCP connector on the same token vault, per-user scoping, and audit trail, so the MCP versus API decision does not change your credential infrastructure.

Your agent needs to read boards and write items in monday.com. monday ships a hosted Platform MCP server and a GraphQL Platform API, and the obvious assumption is that the MCP is a convenient subset of the API. That assumption is wrong in both directions: the MCP exposes automation and workflow tools the public GraphQL API does not, and it ships a tool that executes arbitrary GraphQL. Meanwhile the auth model has a property most teams discover in production rather than in the docs. Here is how to pick.

What monday Platform MCP and the monday API actually are

Two objects are being compared, and monday actually ships three things that answer to the name "MCP." Getting the naming straight first saves a wasted afternoon.

The Platform MCP

The Platform MCP is an open-source server maintained by monday's AI team and offered as a hosted endpoint at https://mcp.monday.com/mcp. It is preinstalled on all monday.com accounts and available on every plan at no additional cost.

monday's own MCP security overview is direct about what it is: a wrapper around the Platform API. Every capability is backed by the same GraphQL endpoint, and authentication, authorization, rate limits, and data handling follow the same platform standards.

The Platform API

The Platform API is a single GraphQL endpoint at https://api.monday.com/v2 covering boards, items, columns, groups, docs, users, teams, workspaces, webhooks, assets, activity logs, and bulk import.

It authenticates with either a personal API token or an OAuth app token, passed in the Authorization header. There are no LLM-specific affordances: schema handling, pagination, error semantics, and rate-limit backoff are yours.

The Apps MCP, which is a different product

monday also ships an Apps MCP, enabled with --mode apps, for managing app versions, features, deployments, and environment variables. It does not touch boards or items. If you are building an agent that works with monday data, it is not the server you want.

What each path exposes, according to the official tool lists

The template for this series calls for a capability table. For monday a table alone misleads, because the gap is bidirectional and one tool collapses most of it. Both directions are worth naming precisely.

The 49 tools in the Platform MCP

monday's Platform MCP tools reference documents 49 tools across boards and items, workspaces, docs, dashboards and widgets, forms, users and teams, updates and notifications, search and assets, AI agents, meetings, monday-dev sprints, low-level API access, and UI components.

Treat that number as a snapshot, not a constant. The documentation sidebar already enumerates tools the body tables have not absorbed, including view management, asset upload, automation, and workflow tools. The surface is moving.

What the MCP can do that the GraphQL API cannot

This is the direction almost nobody expects. monday's API coverage gaps page states that the API does not currently expose mutations to create, delete, update, or list board automations, and that automations can only be managed through the UI.

The MCP tool reference lists create_automation, list_automations, and manage_automations, alongside workflow tools such as plan_workflow, create_workflow, and publish_workflow, and platform agent tools including manage_agent and agent_catalog. If your agent's job includes configuring monday automations, the MCP is currently the documented path and the API is not.

What the GraphQL API can do that the MCP cannot

Event subscriptions are the clearest case. Webhooks are created and deleted through GraphQL mutations gated on webhooks:read and webhooks:write, covering 21 board event types with a retry policy of once a minute for 30 minutes. No webhook tool appears in the 49.

High-volume ingestion is the second. The API reference now carries a Bulk Import surface with ingest_items and backfill_items. There is no MCP equivalent, and looping create_item through tool calls is not a substitute once you understand the daily call limit.

The capability table

Read this as a summary of the two subsections above, not as the argument itself.

Capability
Platform MCP
Platform API
Board and item CRUD
Yes
Yes
Column value updates
Yes
Yes
Board insights and aggregation
Yes
Yes
Docs read and write
Yes
Yes
WorkForms create and submit
Yes
Partial
Dashboards and widgets
Yes
Yes
monday-dev sprint summaries
Yes
Partial
Automation management
Yes
No
Workflow and platform agent management
Yes
No
Webhook create, list, delete
No
Yes
Bulk item ingestion and backfill
No
Yes
Receiving real-time events
No
Yes
Arbitrary GraphQL execution
Yes, via all_monday_api
Yes, natively

The escape hatch that changes the comparison

The MCP ships all_monday_api, documented as executing any GraphQL query or mutation, paired with get_graphql_schema and get_type_details so a model can introspect the schema before composing a call. Anything reachable by GraphQL is therefore reachable through the MCP.

That closes the capability gap and opens a different one. A curated tool has a fixed input schema you can validate and log against. all_monday_api has one meaningful parameter: a GraphQL string the model wrote. For an interactive assistant that is a feature. For a pipeline where an unexpected mutation is an incident, it is the thing to disable.

The auth path each one puts you on

Both paths run on the same monday identity model, and the auth choice is closer to orthogonal to the MCP versus API choice than most comparisons suggest. One property of that model matters more than everything else here.

MCP auth: OAuth with DCR and PKCE

monday documents the hosted MCP as using the OAuth 2.0 Authorization Code Grant with monday as the identity provider, with every tool call executing in the authenticated user's context and subject to that user's permissions. The endpoint supports Dynamic Client Registration and PKCE, which is how a client can register without a preconfigured client ID and secret.

The hosted endpoint also accepts a token directly in an Authorization header, and the local server authenticates with a personal API token and no OAuth at all. "MCP means OAuth" is a convenient simplification that does not survive contact with the configuration examples.

API auth: personal tokens carry every scope

OAuth app tokens are scoped, drawing from 21 permission scopes spanning boards, docs, updates, users, teams, workspaces, webhooks, and more. You request only what the agent needs.

Personal API tokens are not scoped. monday's authentication doc states that app tokens have permission scopes "while personal tokens have all permission scopes." A personal token mirrors everything that user can do in the UI, with no way to narrow it. That applies equally to the local MCP server, where the only available constraint is a --read-only flag that the hosted server does not offer.

The property that inverts the usual advice

Most agent auth writing, including ours, tells you to refresh proactively rather than waiting for a 401. For monday, that advice does not apply. The OAuth documentation states that access tokens "do not expire and are valid until the user uninstalls your app" and that the flow "does not support refresh tokens."

There is no expires_in to schedule against, no refresh rotation, and no natural expiry checkpoint. What you hold instead is a long-lived bearer credential whose only documented end state is the user uninstalling your app.

What this means for a multi-tenant agent

For a B2B agent serving 60 users across 12 monday accounts, that is 60 non-expiring credentials, each carrying whatever the authorizing user could do. Nothing ages them out. Nothing forces reauthorization. An engineer who left eight months ago still has a working token unless something in your system explicitly kills it.

This is the offboarding failure pattern, not the refresh failure pattern. Revocation has to be an event your infrastructure fires, because monday will not fire it for you. This is exactly the scenario covered in when an employee leaves and who revokes their AI agent's access.

What you own in production

Both paths inherit the same platform limits, because the MCP executes as GraphQL underneath. These are the numbers that decide whether your agent survives its first real week.

Daily call limits break first

The rate limits page sets the daily call limit at 1,000 for Free, Standard, and Basic plans, 10,000 as a soft limit on Pro, and 25,000 as a soft limit on Enterprise, resetting at midnight UTC.

monday states explicitly that hosted MCP tool calls count toward that limit, since each tool call executes as a GraphQL request. An agentic turn that discovers a board, reads its schema, pages items, and writes a status is four calls before anything useful happens. On a Standard plan, a few dozen users doing that a few times a day exhausts the account.

Batching is the API path's real advantage

GraphQL lets you compose several operations into a single request, and a request typically deducts one call. Tool granularity gives you no such option: one tool call is one request.

Do not treat that as a free win. The same page lists high complexity queries as contributing one or more calls, so a heavily batched request can cost more than one. Complexity itself is capped at 5 million points per individual query, with a combined per-minute budget of 10 million for personal tokens, 5 million each for reads and writes with app tokens, and 1 million for trial, NGO, and free accounts.

Minute, concurrency, and IP limits

Per-minute request limits run 5,000 on Enterprise, 2,500 on Pro, and 1,000 elsewhere. Concurrency caps at 250, 100, and 40 respectively. A single IP address is capped at 5,000 requests per 10 seconds.

Responses carry IETF-format RateLimit-Policy and RateLimit headers reporting remaining quota and reset time. Throttle on the remaining value rather than reacting to errors, because failed requests still count against your limits.

Version pinning works on both paths, with one exception

monday guarantees at least three parallel API versions, ships a new one quarterly, and keeps any version stable for at least six months. As of this writing 2026-04 is current, 2026-01 is in maintenance, and 2026-07 is the release candidate. You pin with the API-Version header.

The same header works in a hosted MCP client configuration. What neither header pins is the MCP tool surface itself. Tool schemas change when monday ships new tools, and you consume that contract without controlling its cadence. That is the narrow, real versioning distinction, and it is the one that matters for deterministic pipelines.

The audit gap monday documents itself

monday's MCP security page states that self-service export of detailed MCP or API audit logs is not currently available, and directs organizations with compliance requirements to their monday representative. monday maintains internal logging for its own operational security.

For an agent that writes to customer boards on behalf of named users, that leaves the per-call, per-user record on your side of the line. The same page assigns secure token storage, refresh handling, and revocation to the customer, and states that the MCP server does not store or log customer OAuth tokens. Building audit trails for agent auth in B2B SaaS is therefore a customer responsibility, not a platform guarantee.

When to use MCP, when to use the API

Both lists below are specific to monday. Neither is generic MCP advice.

Use the Platform MCP when

  • Your agent is interactive and user-present: a project assistant that answers "what is stuck in this sprint and who owns it" using get_board_items_page and board_insights
  • You need automation, workflow, or platform agent management, which the public GraphQL API does not currently expose
  • You want monday's per-user permission enforcement without building your own board-level access checks
  • You are prototyping and want LLM-ready tool descriptions rather than hand-written GraphQL and schema plumbing

Use the Platform API when

  • Your agent is event-driven: webhooks are the only way to receive board events, and there is no MCP tool for creating or receiving them
  • You are ingesting at volume and need ingest_items or backfill_items rather than looping item creation through tool calls
  • You are close to the daily call limit and need to batch several operations into one request
  • You are running a deterministic pipeline where an LLM composing GraphQL through all_monday_api is an unacceptable failure mode

Building monday agents with Scalekit

Scalekit ships both paths as connectors on the same credential layer, which means the decision above does not propagate into your auth code. Both are listed in the agent connectors directory.

Two connectors, one credential layer

The monday.com connector covers the API path with 44 prebuilt tools, including monday_webhook_create and monday_webhooks_list, which the Platform MCP does not expose. It uses OAuth 2.0 with credentials from the monday Developer Center.

The Monday MCP connector covers the MCP path. Because the hosted endpoint supports Dynamic Client Registration, there is no OAuth app to register and no client ID or secret to paste. Scalekit negotiates the client with https://mcp.monday.com/mcp on first authorization, then stores and refreshes tokens per user.

One prerequisite applies to every snippet below: the connection_name string must match the connection name configured in your Scalekit dashboard exactly. This is the most common integration error in the entire setup.

The API path with LangChain in Python

Scalekit returns native LangChain StructuredTool objects, so the agent loop carries no Scalekit-specific logic beyond initialization. For a deeper look at how LangChain tool calling works and where it stops, see the dedicated guide.

import os import scalekit.client scalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENV_URL"), ) actions = scalekit_client.actions # "monday" must match the connection name in your Scalekit dashboard response = actions.get_or_create_connected_account( connection_name="monday", identifier="user_123", ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name="monday", identifier="user_123", ) print("Authorize monday.com:", link.link) input("Press Enter after authorizing...")

With the connected account active, retrieve the tools this user's account authorizes and run the loop.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier="user_123", connection_names=["monday"], page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [HumanMessage("Which items on the Q3 Roadmap board are stuck, and who owns each?")] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = tool_map[tc["name"]].invoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

A direct call, without a framework, uses execute_tool with the exact tool name from the connector's tool list.

result = actions.execute_tool( connection_name="monday", identifier="user_123", tool_name="monday_boards_list", tool_input={"limit": 10, "order_by": "used_at"}, ) print(result)

The MCP path with the Claude SDK in TypeScript

The MCP connector works the same way, with mondaymcp_ tool names. Scoping the surface before the model sees it is the point of listScopedTools.

import { ScalekitClient } from "@scalekit-sdk/node"; import Anthropic from "@anthropic-ai/sdk"; const sk = new ScalekitClient( process.env.SCALEKIT_ENV_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ); const anthropic = new Anthropic(); // "mondaymcp" must match the connection name in your Scalekit dashboard const { tools } = await sk.tools.listScopedTools("user_123", { filter: { connectionNames: ["mondaymcp"], toolNames: [ "mondaymcp_getboardinfo", "mondaymcp_getboarditemspage", "mondaymcp_createupdate", ], }, pageSize: 100, }); const llmTools = tools.map((t) => ({ name: t.tool.definition.name, description: t.tool.definition.description, input_schema: t.tool.definition.input_schema, }));

The tool result comes back through executeTool, which resolves the user's monday credential server-side. The credential never enters the model context.

const msg = await anthropic.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, tools: llmTools, messages: [{ role: "user", content: "Summarize open items on board 1234567890." }], }); for (const block of msg.content) { if (block.type !== "tool_use") continue; const { data } = await sk.tools.executeTool({ toolName: block.name, identifier: "user_123", params: block.input as Record, }); console.log(data); }

Method signatures across SDK versions are documented in the Node.js and Python SDK references.

Why the tool filter is the important line

The three tool names in that filter are the point. Handing a model the full monday surface, whether 44 connector tools or 49 MCP tools, is an accuracy problem before it is a security problem: LLMs select poorly from large tool sets, producing wrong selections, hallucinated parameters, and redundant sequential calls.

It is also a cost problem. As explored in the analysis of why MCP can be significantly more expensive than CLI, roughly 200 tokens per tool means about 8,000 tokens burned before the agent does any work. Scoping to five or ten tools cuts that overhead by around 80 percent. The fix is not better prompting. It is surface reduction.

Virtual MCP servers for multi-tool, multi-tenant monday agents

Most production monday agents are not monday-only. They read a board, check a Slack thread, and file a ticket. That is where a scoped, per-user MCP endpoint earns its place.

One server definition, per-user session tokens

A standard MCP server exposes every tool it has. Virtual MCP Servers invert that: you declare which connections and which tools an agent role can see, and you get a static mcp_server_url.

Two objects drive the model. The virtual MCP server is created once per agent role. The session token is minted before each run, short-lived and bound to one specific user's connected accounts. The endpoint is static; the identity is not.

Wiring it to a Mastra agent

Generate the per-user URL on your backend, then hand it to the agent.

inst_response = actions.mcp.ensure_instance( config_name="monday-sprint-agent", user_identifier="user_123", ) mcp_url = inst_response.instance.url

Never share one URL across users. Each is pre-authenticated for a single user, so a process-wide value runs every request as that user.

import { Agent } from "@mastra/core/agent"; import { MCPClient } from "@mastra/mcp"; import { openai } from "@ai-sdk/openai"; const mcpUrl = await getMcpUrlForUser(currentUserId); const mcp = new MCPClient({ servers: { scalekit: { url: new URL(mcpUrl) } }, }); const agent = new Agent({ name: "sprint_assistant", instructions: "You help engineering leads track sprint health in monday.com.", model: openai("gpt-4o"), tools: await mcp.getTools(), }); const result = await agent.generate("Which items slipped this sprint, and who owns them?"); console.log(result.text); await mcp.disconnect();

Why this matters specifically for monday

Because monday tokens do not expire, tool-level least privilege is the main lever you have. A sprint reporting agent that only ever needs getboardinfo and getboarditemspage should not be able to reach createautomation or allmondayapi, and a declared allowlist is how you guarantee that rather than hope for it.

The daily call limit reinforces the same choice. A narrower tool surface produces fewer speculative calls, and fewer speculative calls is directly fewer of your 1,000 or 10,000 daily requests. This principle applies across any single-tenant to multi-tenant tool calling transition.

The credential problem that exists on both paths

Both paths give you a token per user. Neither gives you a vault, a revocation flow, or a queryable record of what the agent did. That infrastructure is yours regardless of which path you chose.

Non-expiring tokens are a revocation problem

A shared personal token looks fine in a demo. In production it carries every scope its owner has, appears in audit trails as one person, and never expires. A per-user OAuth token fixes attribution and scope but keeps the expiry property: nothing ages it out.

When a user leaves, disabling their identity provider account does not invalidate a monday token issued eight months ago. The agent does not decide to keep using it. It just does. Revocation has to be an event your system fires on offboarding, tied to the connected account. Understanding who holds the token across agent tool-calling patterns is essential to designing that revocation flow correctly.

The observability gap

monday documents that self-service export of detailed MCP or API audit logs is not currently available. If your security reviewer asks which user authorized the tool call that moved 40 items last Tuesday, the answer has to come from your side.

Scalekit resolves the per-user credential on every tool call and logs it, so downstream tool calls carry the identity of the human who authorized them rather than a service account, with 90 days of queryable history. Credentials are resolved at request time and never enter the agent runtime or the model context.

Where Scalekit fits

Scalekit's monday.com and Monday MCP connectors handle the OAuth flow, per-user token storage, and revocation for both paths, so the MCP versus API decision does not change your auth infrastructure.

Which one to build against

If your agent is interactive, user-present, and mostly reading and summarizing monday data, start with the Platform MCP. It is the only documented path to automation and workflow management, the permission model is already per-user, and you write no GraphQL.

If your agent is event-driven, ingests at volume, or runs as a deterministic pipeline where a model composing GraphQL is unacceptable, build against the Platform API directly. Webhooks and bulk import exist only there, and batching is the only real lever you have against the daily call limit.

Most production monday agents will use both: the assistant on MCP, the pipeline on the API. The credential problem is identical either way, and non-expiring tokens make it more urgent here than on most platforms. That is the part that needs production-grade infrastructure. For a broader look at secure token management for AI agents at scale, the pattern applies directly here.

Talk to other monday agent builders

Building agents on monday.com and want to compare notes on tool scoping, call limits, or revocation? Join the Scalekit Slack community, or talk to an engineer if you need help now.

Browse the Scalekit monday.com connector or read the connector docs.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.