What is MCP?
The Model Context Protocol (MCP) is an open standard that lets an application call external tools in a consistent way. An app that connects to MCP servers is called an MCP client. Most AI assistants, such as Claude and ChatGPT, act as the MCP client here. Plane provides an MCP server that exposes a set of tools for your workspace, so your MCP client can look up your data on your behalf instead of you clicking through screens. You do not install anything. Plane’s MCP server is remote: you point your MCP client at one URL and sign in.What is a connector?
A connector is how an MCP client registers an MCP server. Different clients name it differently. Claude calls it a connector, and ChatGPT calls it an app. Either way the setup is the same: you add Plane as a custom connector by entering its URL, the client handles sign-in, and then it discovers the tools Plane exposes.Plane shows only the tasks available to your connection.
Prerequisites
- A Plane account with admin or manager access to the workspace
- An MCP client that supports remote HTTP MCP servers, such as Claude or ChatGPT
- OAuth support in your client, or a Plane API key for the manual fallback
Endpoint
Point your MCP client at:/mcp URL.
A toolset is a second URL with its own permissions. An admin creates one
from Developers > Toolsets, picks what it may read and write family by
family, and sees the tools that grant exposes before saving. Its URL has this
shape:
compensations:write to expose compensations_create; the URL
still requires normal Plane authentication, and a member never gets more
through a toolset than their own role allows. Deleting a toolset revokes every
client connected through it.
Connect your client
OAuth is the recommended way to connect. You add Plane as a connector, sign in through the browser, and the client receives a short-lived access token scoped to your Plane permissions. Pick your client below.- Claude
- ChatGPT
1
Open connectors
In Claude, click Customize, then Connectors.
2
Add a custom connector
Click the + button and choose Add custom connector (not Browse
connectors). When prompted, enter a name such as
Plane and set the
remote MCP server URL to https://api.plane.com/mcp.3
Sign in to Plane
Complete the Plane sign-in flow in the browser when Claude prompts you.
4
Use Plane in a chat
Start a new conversation, make sure the Plane connector is enabled, and
try
List the first 10 workers in Plane.Claude calls
workers_list and returns the result.Connect over OAuth only when you want the client to work with live workspace
data. To experiment safely, use a sandbox API key with the manual fallback.
Try it
Once connected, start with prompts that read data:List the workers we paid in May.How much did we pay [contractor name] this year?Show me the most recent payroll and what it totaled.Which payments are still pending?Pull a list of contractors hired in the last 90 days.
Record a USD 2,500 commission for [worker name] in the pay period containing August 31, 2026, with the reason "Q3 sales commission".
List requested leave, then approve lvr_123 with the reason "Coverage confirmed".
The same applies to expense reports: review the report and its expenses before
you approve or reject it. For example: Show me pending expense reports, then approve exr_123. Rejections require a reason.
What you can do today
When your client connects, Plane advertises the tools available to that connection. Each tool comes with its input schema, and your assistant calls it directly. You do not need to know tool names to ask questions. The catalog also includesfeedback. Your assistant uses it to report an unmet
request when no available tool can satisfy it.
Underlying tool names follow {resource}_{action}, for example workers_list
or payments_get. List tools accept pagination arguments: limit, cursor,
starting_after, and ending_before.
To review onboarding, first find the worker with workers_list. Then call
projects_list with the worker ID and status: "all". Call projects_get
with the project ID to see all tasks that you can read, including blocked and
completed tasks. Without a status, projects_list returns active projects.
When a company task in W-2, contractor, or EOR onboarding has a subject
with object: "form", pass the subject id to forms_get.
The response contains the current frame: instructions, fields, options, values,
and validation errors. It also states whether your connection can submit it.
To submit a frame, call forms_submit with the form ID, the unchanged
continuation, and editable field values. A continuation expires after one
hour. Each submission returns the next form state or the resulting task.
Correct validation errors before you submit again. If the form is already
complete, an authorized repeated submission returns the task without another write.
Form tools require an active company member in the task’s workspace, signed in
through OAuth. They do not support memberless API keys or routines.
Reads require tasks:read and workers:read. Submissions also require
workers:write. Neither tasks:write nor forms:* is required.
Your connection still needs access to the task and its form.
Worker and Plane tasks cannot be submitted through these tools. Signatures,
file uploads, identity verification, and unsupported frames return a
product_only reason and a task URL. Complete those steps in Plane.
Form submissions cannot be proposed as change sets.
All available tools
All available tools
Manage offers
An MCP toolset withoffers:write can create, update, send, resend, extend, and
void offers. The authenticated member or API key must also have permission to
manage offers. Offers must be enabled for the workspace.
Use a toolset with offers:read and offers:write for the full workflow. The
default /mcp connection is read-only. The built-in Plane Agent cannot execute
these writes under its default grant. Offer writes do not have _request
tools for approval proposals.
Draft and send
- Call
offers_createwith the recipient and proposed terms. The result is a draft, not a delivered offer. - Call
offers_getto review the draft. - If the draft needs changes, call
offers_update. - Before delivery, confirm the recipient, role, start date, compensation options, benefits, expiration, and whether onboarding starts on acceptance with the user.
- Call
offers_sendwith the draft ID.
label, such as Option A or
Option B, under terms.compensations. The accepted decision preserves these
labels in its terms snapshot.
Ask the user whether onboarding should start when the recipient accepts. Pass
starts_onboarding: true to offers_create, or to offers_update on a draft,
for that: acceptance then creates the worker, sets their compensation, starts
their onboarding, and invites them to Plane. Without it, acceptance creates the
worker and an admin starts onboarding from the worker page, or you call
workers_invite. offers_get returns starts_onboarding, so check it when you
review the draft. A template does not copy this choice, so pass it again when
you revise an offer.
If the recipient’s email matches an existing worker, acceptance links that
worker. It starts their onboarding only when the worker has no onboarding, has
a personal email, and has the accepted employment type, country, and start
date. Otherwise the acceptance is recorded, onboarding stays null, and the
offer page in Plane tells the admin why.
Revise a sent offer
A sent offer cannot be edited withoffers_update. Revision requires separate
read, void, create, and send calls.
- Call
offers_getwith the original offer ID to read its recipient and terms. - Confirm the revised terms and the reason for replacement with the user.
- Call
offers_voidwith the original ID and the reason. - Call
offers_createwith the original offer ID astemplate. - Include the recipient and only the terms that changed.
- Call
offers_getwith the new draft ID to review the replacement. - Call
offers_sendwith the new draft ID.
Read offer ofr_123. Prepare a replacement with a November 15 start date and the same compensation options. Confirm the changes before you void the original or send the replacement.
Retries and delivery
- Each
offers_createcall creates a new draft. After an uncertain result, useoffers_listandoffers_getto confirm the result before another create call. - A repeated
offers_sendcall for an already sent offer returns it without another delivery email. - Each
offers_resendcall sends another email. Repeat it only when the user wants another delivery. - A repeated
offers_updatecall with the same values leaves the draft in the same state. A repeatedoffers_extendcall with the same future expiration leaves that expiration unchanged. - After an uncertain
offers_voidresult, calloffers_getto confirm the current status before the next step.
Follow projects and tasks
Starting an onboarding creates a project of tasks, and the event feed reports each step. A client with its own schedule, such as an agent framework or a cron job, can follow every hire from the feed without polling each project.- Call
events_listwithtypeset to the events you follow, such asproject.created,task.opened,task.completed, andproject.completed, andcreated_afterset to thecreatedof the newest event from the last complete run, exactly as returned. It carries microseconds, and a shortened copy returns that event again. Page withcursoruntil it is empty. Events come newest first, so keep thecreatedof the first event on the first page, and save it only after the last page. If a run stops early, the next run starts from the old value and returns some events again, so handle each event ID once. - For each event, read the project with
projects_get. For a project event, the project ID is the event’ssubject. For a task event, it isdata.project. The project’ssubjectandworkersay which hire it concerns. Each task carriesparty:companytasks are yours to complete,workertasks wait on the hire, andplanetasks wait on Plane. - Call
projects_list, filtered by a worker or a status, to see every hire at once. Each item carriestask_countsby party and status.
actor and via, so a run can tell its own changes from a
person’s. A client that holds request permission sees changeset.applied
when an approved proposal is applied. The built-in Plane Agent reads the same
feed under its default grant.
Manual API key fallback
Use an API key only when your client cannot complete OAuth, only supports static headers, or you are testing the endpoint directly. Create live API keys from Developers > API keys in Plane; see API access. For test keys, create a sandbox first and generate a key from inside it; see Your first API call. Send the key as a bearer token:Claude Desktop config
On macOS, Claude Desktop stores local MCP configuration at~/Library/Application Support/Claude/claude_desktop_config.json. Open Claude
Desktop, go to Settings > Developer, and click Edit Config. Add Plane as
an HTTP MCP server:
plane entry inside the
existing mcpServers object rather than replacing the file. Fully quit and
restart Claude Desktop to load the change.
Advanced: test the endpoint with curl
You can verify the endpoint without a full MCP client by sending a JSON-RPC request with an API key. List the available tools — the response advertises every tool available to your key, each with its input schema:structuredContent as machine-readable JSON.
Treat cursors as opaque: if the response includes a cursor, pass it back
unchanged as the cursor argument to fetch the next page. When cursor is
absent, you have reached the end of the list.
To record compensation, call compensations_create directly through a toolset
that grants compensations:write. This example records a one-time commission:
status is accepted
when it flows straight into payroll, or pending when Plane must review it
first. A regular compensation also requires unit, such as year or hour.
Troubleshooting
The OAuth flow doesn't start
The OAuth flow doesn't start
Confirm your client supports remote HTTP MCP servers with OAuth. Some clients
only support local stdio servers or static API-key headers. If yours cannot
complete OAuth, use the manual API key fallback.
Tools don't appear in my client
Tools don't appear in my client
Restart the client after adding the connector. If tools still don’t show,
confirm the OAuth flow completed and that your account has access to the
workspace.
Tool calls return empty results
Tool calls return empty results
Empty
data arrays are normal in new or empty workspaces. Confirm your
credential has access to the workspace you expect. If you are using an API
key, verify it is from the right workspace (sandbox keys start with
sk_test_, live keys with sk_live_).I get permission errors on some tools
I get permission errors on some tools
MCP tools are limited by both the credential and the selected toolset. If a
tool fails a permission check, confirm the toolset grants the resource
permission and the underlying user or API key has access to it. Review the
credential’s role in Members and roles.
I want to test without touching live data
I want to test without touching live data
Use a sandbox API key with the manual fallback. Create a sandbox from
Developers > Sandboxes, generate a key inside it (prefix
sk_test_),
and configure your client with that key. See
Your first API call.Next steps
Using Plane Agent
Ask Plane Agent questions about your workspace directly inside Plane.
Your first API call
Make a direct API call without MCP, using cURL, Node.js, or Python.
Authentication
Review API-key authentication for the manual fallback.
API reference
Browse every endpoint and object the API exposes.