Plain MCP
Vendor MCP63 toolsOAuth 2.1/DCRCustomer SupportProductivityConnect to Plain MCP. Manage customer support threads, labels, tenants, Help Center articles, and thread field schemas directly from your AI workflows.
Plain MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. 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> -
Authorize and make your first call
Section titled “Authorize and make your first call”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.actionsconst connector = 'plainmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { 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 callconst result = await actions.executeTool({connector,identifier,toolName: 'plainmcp_getcustomers',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "plainmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Plain MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="plainmcp_getcustomers",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Startsidekicksession records — Start a new Sidekick (Plain’s AI agent) session and return the handle used by every other Sidekick tool
- Sendsidekickmessage records — Send a follow-up message into an existing Sidekick session
- Searchthreadlinkcandidates records — Search a connected issue tracker for external entities that can be linked to a thread via createThreadLink
- Resolvesidekickapproval records — Approve or deny a Sidekick tool-call approval request
- Mergethread records — Merge one Plain thread into another (a MERGED_INTO native thread link)
- Listsidekicksessions records — List Sidekick sessions in the workspace, most recent activity first
Tool list
Section titled “Tool list”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.
inputstringrequiredNo description.plainmcp_addlabels#Add one or more labels to a thread.1 param
Add one or more labels to a thread.
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.
inputstringrequiredNo description.plainmcp_assignthread#Assign a thread to a user or machine user.1 param
Assign a thread to a user or machine user.
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.
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).
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.
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.
inputstringrequiredNo description.plainmcp_createsnippet#Create a new snippet (reusable reply template) in the workspace. name is what agents search for when inserting the snippet; text is the plain-text body (required). Optionally provide markdown for rich-text channels, and path (alphanumeric only) to place the snippet in a folder in the Plain app. Snippet bodies may include template variables such as {{ customer.email }}, {{ customer.fullName }}, {{ user.publicName }}, {{ thread.ref }}.1 param
Create a new snippet (reusable reply template) in the workspace. name is what agents search for when inserting the snippet; text is the plain-text body (required). Optionally provide markdown for rich-text channels, and path (alphanumeric only) to place the snippet in a folder in the Plain app. Snippet bodies may include template variables such as {{ customer.email }}, {{ customer.fullName }}, {{ user.publicName }}, {{ thread.ref }}.
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.
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.
inputstringrequiredNo description.plainmcp_createthreadlink#Link a thread to an external entity (e.g. a Linear issue, Jira issue, incident.io incident, or another Plain thread/task). Provide threadId plus exactly one way to identify the link target: linearIssue, jiraIssue, plainThread, plainTask, or sourceId+sourceType (use searchThreadLinkCandidates to discover sourceId for a given sourceType).1 param
Link a thread to an external entity (e.g. a Linear issue, Jira issue, incident.io incident, or another Plain thread/task). Provide threadId plus exactly one way to identify the link target: linearIssue, jiraIssue, plainThread, plainTask, or sourceId+sourceType (use searchThreadLinkCandidates to discover sourceId for a given sourceType).
inputstringrequiredNo description.plainmcp_deletethreadfieldschema#Permanently delete a custom thread field schema by key.1 param
Permanently delete a custom thread field schema by key.
inputstringrequiredNo description.plainmcp_deletethreadlink#Remove a link between a thread and an external entity. Pass the threadLinkId of the link to delete (the id returned by createThreadLink or listed under a thread's links in getThreadDetails).1 param
Remove a link between a thread and an external entity. Pass the threadLinkId of the link to delete (the id returned by createThreadLink or listed under a thread's links in getThreadDetails).
inputstringrequiredNo description.plainmcp_getattachmentdownloadurl#Generate a short-lived download URL for an attachment on a thread. Use attachment IDs returned by getThreadDetails. The returned downloadUrl expires after 3 minutes. Requires the attachment:download permission.1 param
Generate a short-lived download URL for an attachment on a thread. Use attachment IDs returned by getThreadDetails. The returned downloadUrl expires after 3 minutes. Requires the attachment:download permission.
attachmentIdstringrequiredAttachment ID from a thread's timeline entries (e.g. NoteEntry, ChatEntry, EmailEntry), returned by getThreadDetails.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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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_getsidekicksession#Poll a Sidekick session: read its status, its newest messages, and any approval it is blocked on. Call this repeatedly after startSidekickSession or sendSidekickMessage.3 params
Poll a Sidekick session: read its status, its newest messages, and any approval it is blocked on. Call this repeatedly after startSidekickSession or sendSidekickMessage.
discussionIdstringrequiredSidekick session handle (starts with thdis_) returned by startSidekickSession.beforestringoptionalPagination cursor to page backwards through older messages. Use pageInfo.startCursor from a previous response.lastnumberoptionalNumber of newest messages to return. Defaults to 10.plainmcp_getsnippet#Fetch a single snippet by ID, including soft-deleted snippets (where isDeleted is true). Use this when you already have a snippet ID from getSnippets or another tool.1 param
Fetch a single snippet by ID, including soft-deleted snippets (where isDeleted is true). Use this when you already have a snippet ID from getSnippets or another tool.
snippetIdstringrequiredSnippet ID (starts with sn_), from getSnippets or another tool.plainmcp_getsnippets#Fetch a paginated list of snippets from the workspace. Snippets are reusable reply templates that agents insert when composing replies. Soft-deleted snippets are excluded from this list.2 params
Fetch a paginated list of snippets from the workspace. Snippets are reusable reply templates that agents insert when composing replies. Soft-deleted snippets are excluded from this list.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.firstnumberoptionalNumber of results to return per page. Defaults to 50.plainmcp_gettenantdetails#Fetch full details for a specific tenant by its ID.1 param
Fetch full details for a specific tenant by its ID.
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.
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.
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.
cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.firstnumberoptionalNumber of results to return per page. Defaults to 10.plainmcp_getthreadknowledgesourcecitations#Fetch the knowledge sources cited by AI agent replies on a thread. Currently only Ari, Plain's AI support agent, produces citations. Correlate timelineEntryId with the timeline entry id values from getThreadDetails to see which reply cited which source. Returns an empty list when the thread has no citations.1 param
Fetch the knowledge sources cited by AI agent replies on a thread. Currently only Ari, Plain's AI support agent, produces citations. Correlate timelineEntryId with the timeline entry id values from getThreadDetails to see which reply cited which source. Returns an empty list when the thread has no citations.
threadIdstringrequiredPlain thread ID (starts with th_) to fetch citations for.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.
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.
emailstringrequiredEmail address of the user.plainmcp_listsidekicksessions#List Sidekick sessions in the workspace, most recent activity first. Use this to resume a session from an earlier conversation, check whether a session landed after a timeout, or find sessions that need attention. Pass agentStatuses: [NEEDS_INPUT] for sessions blocked on a human approval decision, or agentStatuses: [IN_PROGRESS] for ones still working. statuses is the session's own lifecycle (OPEN/RESOLVED) and does not overlap with agentStatuses.5 params
List Sidekick sessions in the workspace, most recent activity first. Use this to resume a session from an earlier conversation, check whether a session landed after a timeout, or find sessions that need attention. Pass agentStatuses: [NEEDS_INPUT] for sessions blocked on a human approval decision, or agentStatuses: [IN_PROGRESS] for ones still working. statuses is the session's own lifecycle (OPEN/RESOLVED) and does not overlap with agentStatuses.
afterstringoptionalPagination cursor from the previous response's pageInfo.endCursor.agentStatusesarrayoptionalFilter by agent activity. Known values: NEEDS_INPUT, IN_PROGRESS, IDLE, UNKNOWN.createdByUserIdsarrayoptionalFilter to sessions created by these Plain user IDs. Use getMyUser to find your own user id.firstnumberoptionalNumber of results to return per page.statusesarrayoptionalFilter by session lifecycle status. Accepted values: IN_PROGRESS, IDLE, RESOLVED, APPROVAL_REQUESTED.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.
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.
inputstringrequiredNo description.plainmcp_mergethread#Merge one Plain thread into another (a MERGED_INTO native thread link). The child thread is merged into the parent thread; on success the child thread is marked as done. For a non-merging association between threads or to an external entity, use createThreadLink instead.2 params
Merge one Plain thread into another (a MERGED_INTO native thread link). The child thread is merged into the parent thread; on success the child thread is marked as done. For a non-merging association between threads or to an external entity, use createThreadLink instead.
childThreadIdstringrequiredThread ID (starts with th_) of the thread to merge in. This thread will be marked as done.parentThreadIdstringrequiredThread ID (starts with th_) of the thread to merge into.plainmcp_movelabeltype#Reorder a label type within the workspace label list.1 param
Reorder a label type within the workspace label list.
inputstringrequiredNo description.plainmcp_removelabels#Remove one or more labels from a thread.1 param
Remove one or more labels from a thread.
inputstringrequiredNo description.plainmcp_reorderthreadfieldschemas#Change the display order of custom thread field schemas.1 param
Change the display order of custom thread field schemas.
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.
inputstringrequiredNo description.plainmcp_resolvesidekickapproval#Approve or deny a Sidekick tool-call approval request. ASK THE USER BEFORE CALLING THIS - show them the justification and every requested call from getSidekickSession's approval-request entry, and wait for an explicit instruction. Approving authorises Sidekick's own credentials (usually broader than the user's), not the user's own action. Denying is always safe and only reduces what Sidekick may do.3 params
Approve or deny a Sidekick tool-call approval request. ASK THE USER BEFORE CALLING THIS - show them the justification and every requested call from getSidekickSession's approval-request entry, and wait for an explicit instruction. Approving authorises Sidekick's own credentials (usually broader than the user's), not the user's own action. Denying is always safe and only reduces what Sidekick may do.
decisionstringrequiredApproval decision. APPROVED lets Sidekick run the requested calls; DENIED blocks them.leaseIdstringrequiredThe leaseId from the pending approval-request entry returned by getSidekickSession.reviewerNotestringoptionalOptional note explaining the decision, shown alongside the approval record.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.
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.
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_searchthreadlinkcandidates#Search a connected issue tracker for external entities that can be linked to a thread via createThreadLink. Scope the search to one issue tracker with sourceType (e.g. jira_issue, incidentio_incident, shortcut_story, rootly_incident, github_issue) and match against issue titles or identifiers with the free-text searchQuery. Requires a connected issue tracker integration for the given sourceType.4 params
Search a connected issue tracker for external entities that can be linked to a thread via createThreadLink. Scope the search to one issue tracker with sourceType (e.g. jira_issue, incidentio_incident, shortcut_story, rootly_incident, github_issue) and match against issue titles or identifiers with the free-text searchQuery. Requires a connected issue tracker integration for the given sourceType.
searchQuerystringrequiredFree-text search matched against issue titles or identifiers.sourceTypestringrequiredIssue tracker to search. Accepted values include jira_issue, incidentio_incident, shortcut_story, rootly_incident, github_issue.cursorstringoptionalPagination cursor from the previous response's pageInfo.endCursor.firstnumberoptionalNumber of results to return per page.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.
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_sendsidekickmessage#Send a follow-up message into an existing Sidekick session. Use this to answer a question from Sidekick, redirect it, or give it the next task in the same session. This tool returns as soon as the message is accepted - poll getSidekickSession for the reply.2 params
Send a follow-up message into an existing Sidekick session. Use this to answer a question from Sidekick, redirect it, or give it the next task in the same session. This tool returns as soon as the message is accepted - poll getSidekickSession for the reply.
discussionIdstringrequiredSidekick session handle (starts with thdis_) returned by startSidekickSession.markdownContentstringrequiredThe follow-up message to send into the session.plainmcp_snoozethread#Snooze a thread until a specified date and time.1 param
Snooze a thread until a specified date and time.
inputstringrequiredNo description.plainmcp_startsidekicksession#Start a new Sidekick (Plain's AI agent) session and return the handle used by every other Sidekick tool. Runs asynchronously; poll getSidekickSession with the returned discussion id to follow progress and collect the reply. On a timeout do NOT retry blindly - call listSidekickSessions first to check whether the first attempt landed.3 params
Start a new Sidekick (Plain's AI agent) session and return the handle used by every other Sidekick tool. Runs asynchronously; poll getSidekickSession with the returned discussion id to follow progress and collect the reply. On a timeout do NOT retry blindly - call listSidekickSessions first to check whether the first attempt landed.
markdownContentstringrequiredThe task for Sidekick, briefed as you would brief a colleague.additionalContextstringoptionalOptional free-form context about what the user is looking at.threadIdstringoptionalOptional. Attaches the session to a Plain thread (starts with th_) so Sidekick has that thread as context. Omit for a standalone session.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.
inputstringrequiredNo description.plainmcp_unassignthread#Remove the current assignee from a thread.1 param
Remove the current assignee from a thread.
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.
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.
inputstringrequiredNo description.plainmcp_updatethreadtitle#Update the title of an existing thread.1 param
Update the title of an existing thread.
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.
inputstringrequiredNo description.plainmcp_upserthelpcenterarticle#Create or update a Help Center article by slug.1 param
Create or update a Help Center article by slug.
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.
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.
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.
inputstringrequiredNo description.