Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Plain MCP connector

OAuth 2.1/DCRCustomer SupportProductivity

Connect to Plain MCP. Manage customer support threads, labels, tenants, Help Center articles, and thread field schemas directly from your AI workflows.

Plain MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. 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. quickstart.ts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENV_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'plainmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Plain MCP:', link)
    process.stdout.write('Press Enter after authorizing...')
    await new Promise(r => process.stdin.once('data', r))
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'plainmcp_getcustomers',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Upsertthreadfield records — Set or update a custom field value on a thread
  • Upserttenantfield records — Set or update a custom field value on a tenant
  • Upserttenant records — Create or update a tenant by external ID or tenant ID
  • Upserthelpcenterarticle records — Create or update a Help Center article by slug
  • Upsertcustomer records — Create or update a customer by external ID, email, or customer ID
  • Updatethreadtitle records — Update the title of an existing thread

Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.

plainmcp_addgeneratedreply#Add an AI-generated reply to a thread in Plain.1 param

Add an AI-generated reply to a thread in Plain.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_addlabels#Add one or more labels to a thread.1 param

Add one or more labels to a thread.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_archivelabeltype#Archive a label type so it can no longer be applied to threads.1 param

Archive a label type so it can no longer be applied to threads.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_assignthread#Assign a thread to a user or machine user.1 param

Assign a thread to a user or machine user.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_bulkupsertthreadfields#Create or update multiple thread field values in a single call.1 param

Create or update multiple thread field values in a single call.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_changethreadpriority#Update the priority of a thread. Valid priorities are 0 (urgent) through 3 (low).1 param

Update the priority of a thread. Valid priorities are 0 (urgent) through 3 (low).

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_createlabeltype#Create a new label type that can be applied to threads.1 param

Create a new label type that can be applied to threads.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_createnote#Add an internal note to a thread, visible only to workspace members.1 param

Add an internal note to a thread, visible only to workspace members.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_createthread#Open a new support thread for an existing customer. Does not send a message — follow up with replyToThread if needed.1 param

Open a new support thread for an existing customer. Does not send a message — follow up with replyToThread if needed.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_createthreadfieldschema#Create a new custom thread field schema for the workspace.1 param

Create a new custom thread field schema for the workspace.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_deletethreadfieldschema#Permanently delete a custom thread field schema by key.1 param

Permanently delete a custom thread field schema by key.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_getcustomerdetails#Fetch a customer's full profile including email, assignment, company, and timestamps.1 param

Fetch a customer's full profile including email, assignment, company, and timestamps.

NameTypeRequiredDescription
customerIdstringrequiredPlain customer ID (starts with c_). Get it from getCustomers or getCustomerDetails.
plainmcp_getcustomers#Return a paginated list of all customers in the workspace.2 params

Return a paginated list of all customers in the workspace.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_getcustomerthreads#Return all threads belonging to a specific customer, with optional status filtering.5 params

Return all threads belonging to a specific customer, with optional status filtering.

NameTypeRequiredDescription
customerIdstringrequiredPlain customer ID (starts with c_). Get it from getCustomers or getCustomerDetails.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
statusDetailsarrayoptionalFilter by status detail. Accepted values: CREATED, NEW_REPLY, WAITING_FOR_CUSTOMER, IN_PROGRESS.
statusesarrayoptionalFilter by thread status. Accepted values: TODO, SNOOZED, DONE.
plainmcp_gethelpcenterarticle#Fetch a single Help Center article by its ID.1 param

Fetch a single Help Center article by its ID.

NameTypeRequiredDescription
idstringrequiredUnique identifier of the resource.
plainmcp_gethelpcenterarticlebyslug#Fetch a Help Center article by its URL slug.2 params

Fetch a Help Center article by its URL slug.

NameTypeRequiredDescription
helpCenterIdstringrequiredPlain Help Center ID (starts with hc_). Get it from getHelpCenters.
slugstringrequiredURL slug of the Help Center article.
plainmcp_gethelpcenterarticlegroups#Return all article groups for a Help Center.3 params

Return all article groups for a Help Center.

NameTypeRequiredDescription
helpCenterIdstringrequiredPlain Help Center ID (starts with hc_). Get it from getHelpCenters.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_gethelpcenterarticles#Return a paginated list of articles in a Help Center.3 params

Return a paginated list of articles in a Help Center.

NameTypeRequiredDescription
helpCenterIdstringrequiredPlain Help Center ID (starts with hc_). Get it from getHelpCenters.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_gethelpcenters#Return all Help Centers in the workspace.2 params

Return all Help Centers in the workspace.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_getlabels#Return all label types available in the workspace.2 params

Return all label types available in the workspace.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_getmyassignedthreads#Return threads assigned to the authenticated user, with optional status and priority filters.6 params

Return threads assigned to the authenticated user, with optional status and priority filters.

NameTypeRequiredDescription
userIdstringrequiredPlain user ID (starts with u_). Get it from getUserByEmail or getMyUser.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
prioritiesarrayoptionalFilter by priority: 0 = urgent, 1 = high, 2 = normal, 3 = low.
statusDetailsarrayoptionalFilter by status detail. Accepted values: CREATED, NEW_REPLY, WAITING_FOR_CUSTOMER, IN_PROGRESS.
statusesarrayoptionalFilter by thread status. Accepted values: TODO, SNOOZED, DONE.
plainmcp_getmyuser#Return the profile of the currently authenticated workspace user.0 params

Return the profile of the currently authenticated workspace user.

plainmcp_getmyworkspace#Return details about the current workspace including its ID and name.0 params

Return details about the current workspace including its ID and name.

plainmcp_gettenantdetails#Fetch full details for a specific tenant by its ID.1 param

Fetch full details for a specific tenant by its ID.

NameTypeRequiredDescription
tenantIdstringrequiredPlain tenant ID (starts with t_). Get it from getCustomers.
plainmcp_gettenants#Return a paginated list of all tenants in the workspace.2 params

Return a paginated list of all tenants in the workspace.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_getthreaddetails#Fetch a thread's full details and timeline entries by thread ID.3 params

Fetch a thread's full details and timeline entries by thread ID.

NameTypeRequiredDescription
threadIdstringrequiredPlain thread ID (starts with th_). Get it from getThreads or searchThreads.
timelineCursorstringoptionalPagination cursor for the thread timeline from the previous pageInfo.endCursor.
timelineFirstnumberoptionalNumber of timeline entries to return per page.
plainmcp_getthreadfieldschemas#Return all custom thread field schemas defined in the workspace.2 params

Return all custom thread field schemas defined in the workspace.

NameTypeRequiredDescription
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_getthreads#Return threads with flexible filtering by status, priority, assignee, customer, labels, or date range.11 params

Return threads with flexible filtering by status, priority, assignee, customer, labels, or date range.

NameTypeRequiredDescription
assignedToUserarrayoptionalFilter threads assigned to these user IDs (start with u_).
createdAtAfterstringoptionalReturn only threads created after this ISO 8601 timestamp.
createdAtBeforestringoptionalReturn only threads created before this ISO 8601 timestamp.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
customerIdsarrayoptionalFilter by these Plain customer IDs (start with c_).
firstnumberoptionalNumber of results to return per page. Defaults to 10.
isAssignedbooleanoptionalPass true for assigned threads, false for unassigned, or omit for all.
labelTypeIdsarrayoptionalFilter by these label type IDs (start with lt_). Get them from getLabels.
prioritiesarrayoptionalFilter by priority: 0 = urgent, 1 = high, 2 = normal, 3 = low.
statusDetailsarrayoptionalFilter by status detail. Accepted values: CREATED, NEW_REPLY, WAITING_FOR_CUSTOMER, IN_PROGRESS.
statusesarrayoptionalFilter by thread status. Accepted values: TODO, SNOOZED, DONE.
plainmcp_getuserbyemail#Look up a workspace user by their email address.1 param

Look up a workspace user by their email address.

NameTypeRequiredDescription
emailstringrequiredEmail address of the user.
plainmcp_markthreadasdone#Mark a thread as done, moving it out of the active queue.1 param

Mark a thread as done, moving it out of the active queue.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_markthreadastodo#Mark a thread as todo, returning it to the active queue.1 param

Mark a thread as todo, returning it to the active queue.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_movelabeltype#Reorder a label type within the workspace label list.1 param

Reorder a label type within the workspace label list.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_removelabels#Remove one or more labels from a thread.1 param

Remove one or more labels from a thread.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_reorderthreadfieldschemas#Change the display order of custom thread field schemas.1 param

Change the display order of custom thread field schemas.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_replytothread#Send a reply to the last message in a thread via email, Slack, or chat.1 param

Send a reply to the last message in a thread via email, Slack, or chat.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_searchcustomers#Search customers by name or email and return a paginated list of matches.3 params

Search customers by name or email and return a paginated list of matches.

NameTypeRequiredDescription
searchstringrequiredSearch query to filter results by text.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_searchtenants#Search tenants by name and return matching results.3 params

Search tenants by name and return matching results.

NameTypeRequiredDescription
searchTermstringrequiredSearch text to filter tenant results.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
firstnumberoptionalNumber of results to return per page. Defaults to 10.
plainmcp_searchthreads#Search threads by text with optional filters for status, priority, assignee, customer, and labels.9 params

Search threads by text with optional filters for status, priority, assignee, customer, and labels.

NameTypeRequiredDescription
searchQuerystringrequiredSearch text to match against thread title, description, or messages.
assignedToUserarrayoptionalFilter threads assigned to these user IDs (start with u_).
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.
customerIdsarrayoptionalFilter by these Plain customer IDs (start with c_).
firstnumberoptionalNumber of results to return per page. Defaults to 10.
labelTypeIdsarrayoptionalFilter by these label type IDs (start with lt_). Get them from getLabels.
prioritiesarrayoptionalFilter by priority: 0 = urgent, 1 = high, 2 = normal, 3 = low.
statusDetailsarrayoptionalFilter by status detail. Accepted values: CREATED, NEW_REPLY, WAITING_FOR_CUSTOMER, IN_PROGRESS.
statusesarrayoptionalFilter by thread status. Accepted values: TODO, SNOOZED, DONE.
plainmcp_snoozethread#Snooze a thread until a specified date and time.1 param

Snooze a thread until a specified date and time.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_unarchivelabeltype#Restore an archived label type so it can be applied to threads again.1 param

Restore an archived label type so it can be applied to threads again.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_unassignthread#Remove the current assignee from a thread.1 param

Remove the current assignee from a thread.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_updatelabeltype#Update the name or color of an existing label type.1 param

Update the name or color of an existing label type.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_updatethreadfieldschema#Update the label or options of an existing thread field schema.1 param

Update the label or options of an existing thread field schema.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_updatethreadtitle#Update the title of an existing thread.1 param

Update the title of an existing thread.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_upsertcustomer#Create or update a customer by external ID, email, or customer ID.1 param

Create or update a customer by external ID, email, or customer ID.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_upserthelpcenterarticle#Create or update a Help Center article by slug.1 param

Create or update a Help Center article by slug.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_upserttenant#Create or update a tenant by external ID or tenant ID.1 param

Create or update a tenant by external ID or tenant ID.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_upserttenantfield#Set or update a custom field value on a tenant.1 param

Set or update a custom field value on a tenant.

NameTypeRequiredDescription
inputstringrequiredNo description.
plainmcp_upsertthreadfield#Set or update a custom field value on a thread.1 param

Set or update a custom field value on a thread.

NameTypeRequiredDescription
inputstringrequiredNo description.