Connectors · Service desk & support
Plain MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Plain and the rest of your systems. It gives your agent 523 Plain actions (202 reads, 234 writes and 87 that wait for a confirmation) and holds the Plain credential itself, so the agent never does. It paces Plain's limits and records every call.
100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.
claude mcp add --transport http actionlake https://connect.actionlake.com/mcpdo { action: "plain.customer.list", intent: "check which Plain account is connected"}# List Plain customers · read · 1 upstream call- 523actionsin one signed file
- 202readlook, never change
- 234writecreate and update
- 87wait for a yesdestructive, confirmed first
Set up
Connect Plain in three steps.
- 01
Add actionlake to Claude.
Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
https://connect.actionlake.com/mcp - 02
Connect Plain.
Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
api_keyPlain API key (plainApiKey_...)
account { op: "connections.requirements", service: "plain" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "plain.customer.list" }# list plain customers · read · 1 upstream callcheck { action: "plain.account.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
Plain at a glance
- Sign-in
- Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.
- You provide
api_key- Limits we pace to
- 600 calls a minute, per connection
- API covered
- Plain API graphql-v1
core-api.uk.plain.com - Built from
- Plain's documentation, read 23 October 2026plain.comcore-api.uk.plain.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 200 of 202 reads, for up to an hour; a write clears what it affects
- Shared entities
- 4, so ask can line Plain up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in Plain.
523 actions in 1 area. Every one carries its effect, so a key can allow the reads and hold the rest.
- 202readlook, never change
- 234writecreate and update
- 87destructivewait for a confirmation
Support
523202 read · 234 write · 87 destructive
List Plain customers · List Plain accounts · List Plain users · Plain account: create
Top actions
The Plain API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 24 of Plain's 24 action names are shared with at least one other connector, so an agent learns them once.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
plain.customer.listList Plain customers | Fetch a paginated list of all customers in the workspace | read | crm.contact.list177 connectors |
plain.account.listList Plain accounts | Returns a paginated list of accounts in the workspace | read | crm.company.list162 connectors |
plain.user.listList Plain users | List all human members of the workspace, with optional filters to narrow results by role assignability | read | identity.user.list474 connectors |
plain.account.createPlain account: create | Creates a new account | write | crm.company.create142 connectors |
plain.thread.listList Plain threads | List threads with optional filtering and sorting, returned as a paginated connection | read | service.ticket.list56 connectors |
plain.customer.getGet Plain customer | Fetch a single customer by their Plain customer ID | read | crm.contact.get176 connectors |
plain.customer.deletePlain customer: delete | Permanently deletes a customer and all associated data (threads, timeline entries, etc.) | destructive | crm.contact.delete147 connectors |
plain.thread.createPlain thread: create | Create a new thread for a customer | write | service.ticket.create54 connectors |
plain.user.getGet Plain user | Fetch a single workspace member by their ID | read | identity.user.get399 connectors |
plain.task.createPlain task: create | Create a new task | write | work.task.create127 connectors |
plain.chat.sendPlain chat: send | Send a chat message from a support agent (or machine user) to a customer on a CHAT-channel thread | write | this connector |
plain.label.addPlain label: add | Add one or more labels to a thread | write | this connector |
Try it
Prompts to paste into Claude.
Each one names the Plain actions it will call, so you know what it reads and what it changes before you send it.
- Readread
Which Plain tickets have been open the longest? Show me the ten oldest with their status.
calls
plain.thread.list - Writewrite
Plain account: create in Plain. Show me exactly what you will send before you save it.
calls
plain.account.create - Across systemsread
For each customer, how many tickets are in Plain and how many invoices in ConnectWise PSA?
calls
plain.thread.listconnectwise_manage.invoices.list
Across your systems
Plain, joined to the rest of your business.
One ask fetches from Plain and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.
For each customer, how many tickets are in Plain and how many invoices in ConnectWise PSA?
plain.thread.list+connectwise_manage.invoices.list, oncrm.company· ConnectWise PSAFor each customer, how many tickets are in Plain and how many invoices in NetSuite?
plain.thread.list+netsuite.views.invoices, oncrm.company· NetSuite
identity.user 517crm.company 227crm.contact 192service.ticket 62ask { intent: "for each customer, how many tickets are in Plain and how many invoices in ConnectWise PSA", steps: [ { action: "plain.thread.list", as: "tix", input: {}, limit: 100, max_pages: 5 }, { action: "connectwise_manage.invoices.list", as: "inv", input: {}, limit: 100, max_pages: 5 }, { join: { left: "tix", right: "inv", on: "crm.company", group_by: "tix.company_name", select: ["tix.company_name", "count(tix.id) as tickets", "count(inv.id) as invoices"] } } ]}Governance for Plain
Destructive actions wait for a yes.
87 Plain actions are destructive. The first 10:
- Plain customer: delete
plain.customer.delete - Plain account: delete
plain.account.delete - Plain user: delete
plain.user.delete - Plain thread: delete
plain.thread.delete - Plain task: delete
plain.task.delete - Plain note: delete
plain.note.delete - Plain tier: delete
plain.tier.delete - Plain label: remove
plain.label.remove - Plain tenant: delete
plain.tenant.delete - Plain api key: delete
plain.api_key.delete
A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.
Plain customer: delete?
intent: the user asked me to plain customer: delete
account { op: "keys.create", name: "plain-agent", allowed_actions: ["plain.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "plain.customer.delete", approver: "[email protected]" }, { match: "plain.account.delete", approver: "[email protected]" }, { match: "plain.user.delete", approver: "[email protected]" } ]}Cost
What Plain costs on actionlake.
Every Plain action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call Plain refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
- 1upstream call per actionall 523 Plain actions
- 72actions pageeach page of a long list is one call
- 200reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every Plain action.
523 actions by area: the id your agent calls, what it does, and its effect.
Support523
plain.account.createPlain account: createwriteplain.account.deletePlain account: deletedestructiveplain.account.getGet Plain accountreadplain.account.importPlain account: importwriteplain.account.listList Plain accountsreadplain.account.searchSearch Plain accountsreadplain.account.update_tierPlain account: update tierwriteplain.account.upsertPlain account: upsertwriteplain.account_field.deletePlain account field: deletedestructiveplain.account_field.upsertPlain account field: upsertwriteplain.account_field_schema.deletePlain account field schema: deletedestructiveplain.account_field_schema.importPlain account field schema: importwriteplain.account_field_schema.import_from_servicePlain account field schema: import from servicewriteplain.account_field_schema.listList Plain account field schemasreadplain.account_field_schema.remove_mappingPlain account field schema: remove mappingdestructiveplain.account_field_schema.setup_mappingPlain account field schema: setup mappingwriteplain.account_field_schema.upsertPlain account field schema: upsertwriteplain.agent_approval.resolvePlain agent approval: resolvewriteplain.agent_sandbox_tool_policy.listList Plain agent sandbox tool policysreadplain.agent_sandbox_tool_policy.updatePlain agent sandbox tool policy: updatewriteplain.agent_session.stop_turnPlain agent session: stop turndestructiveplain.agent_session_message.delete_queuedPlain agent session message: delete queueddestructiveplain.agent_session_message.edit_queuedPlain agent session message: edit queuedwriteplain.ai_feedback.createPlain ai feedback: createwriteplain.ai_feedback.create_for_featurePlain ai feedback: create for featurewriteplain.ai_feedback.listList Plain ai feedbacksreadplain.ai_tone_rule.createPlain ai tone rule: createwriteplain.ai_tone_rule.deletePlain ai tone rule: deletedestructiveplain.ai_tone_rule.enabled_textPlain ai tone rule: enabled textreadplain.ai_tone_rule.generate_from_descriptionPlain ai tone rule: generate from descriptionwriteplain.ai_tone_rule.listList Plain ai tone rulesreadplain.ai_tone_rule.updatePlain ai tone rule: updatewriteplain.api_key.createPlain api key: createwriteplain.api_key.deletePlain api key: deletedestructiveplain.api_key.updatePlain api key: updatewriteplain.attachment.create_download_urlPlain attachment: create download urlwriteplain.attachment.create_upload_urlPlain attachment: create upload urlwriteplain.autoresponder.createPlain autoresponder: createwriteplain.autoresponder.deletePlain autoresponder: deletedestructiveplain.autoresponder.getGet Plain autoresponderreadplain.autoresponder.listList Plain autorespondersreadplain.autoresponder.reorderPlain autoresponder: reorderwriteplain.autoresponder.updatePlain autoresponder: updatewriteplain.billing.plansPlain billing: plansreadplain.billing.rotaPlain billing: rotareadplain.billing.subscriptionPlain billing: subscriptionreadplain.broadcast.createPlain broadcast: createwriteplain.broadcast.deletePlain broadcast: deletedestructiveplain.broadcast.duplicatePlain broadcast: duplicatewriteplain.broadcast.getGet Plain broadcastreadplain.broadcast.listList Plain broadcastsreadplain.broadcast.schedulePlain broadcast: schedulewriteplain.broadcast.searchSearch Plain broadcastsreadplain.broadcast.send_testPlain broadcast: send testwriteplain.broadcast.target_recipientsPlain broadcast: target recipientsreadplain.broadcast.updatePlain broadcast: updatewriteplain.broadcast_audience.createPlain broadcast audience: createwriteplain.broadcast_audience.deletePlain broadcast audience: deletedestructiveplain.broadcast_audience.getGet Plain broadcast audiencereadplain.broadcast_audience.import_channelsPlain broadcast audience: import channelswriteplain.broadcast_audience.listList Plain broadcast audiencesreadplain.broadcast_audience.updatePlain broadcast audience: updatewriteplain.broadcast_recipient.resubscribePlain broadcast recipient: resubscribewriteplain.broadcast_recipient.unsubscribePlain broadcast recipient: unsubscribedestructiveplain.broadcast_recipient_unsubscribe.importPlain broadcast recipient unsubscribe: importwriteplain.broadcast_recipient_unsubscribe.listList Plain broadcast recipient unsubscribesreadplain.business_hours.deletePlain business hours: deletedestructiveplain.business_hours.getGet Plain business hoursreadplain.business_hours.slotsPlain business hours: slotsreadplain.business_hours.sync_slotsPlain business hours: sync slotswriteplain.business_hours.upsertPlain business hours: upsertwriteplain.business_hours_override.createPlain business hours override: createwriteplain.business_hours_override.deletePlain business hours override: deletedestructiveplain.business_hours_override.getGet Plain business hours overridereadplain.business_hours_override.updatePlain business hours override: updatewriteplain.business_hours_schedule.createPlain business hours schedule: createwriteplain.business_hours_schedule.deletePlain business hours schedule: deletedestructiveplain.business_hours_schedule.getGet Plain business hours schedulereadplain.business_hours_schedule.listList Plain business hours schedulesreadplain.business_hours_schedule.updatePlain business hours schedule: updatewriteplain.channel.testPlain channel: testreadplain.chat.sendPlain chat: sendwriteplain.chat.send_as_customerPlain chat: send as customerwriteplain.chat_app.createPlain chat app: createwriteplain.chat_app.deletePlain chat app: deletedestructiveplain.chat_app.getGet Plain chat appreadplain.chat_app.listList Plain chat appsreadplain.chat_app.updatePlain chat app: updatewriteplain.chat_app_secret.createPlain chat app secret: createwriteplain.chat_app_secret.deletePlain chat app secret: deletedestructiveplain.chat_app_secret.getGet Plain chat app secretreadplain.company.deletePlain company: deletedestructiveplain.company.getGet Plain companyreadplain.company.listList Plain companysreadplain.company.searchSearch Plain companysreadplain.company.update_tierPlain company: update tierwriteplain.company.upsertPlain company: upsertwriteplain.connected_discord_channel.listList Plain connected discord channelsreadplain.connected_discord_channel.refreshPlain connected discord channel: refreshwriteplain.connected_discord_channel.updatePlain connected discord channel: updatewriteplain.connected_ms_teams_channel.listList Plain connected ms teams channelsreadplain.connected_slack_channel.bulk_updatePlain connected slack channel: bulk updatewriteplain.connected_slack_channel.getGet Plain connected slack channelreadplain.connected_slack_channel.listList Plain connected slack channelsreadplain.connected_slack_channel.updatePlain connected slack channel: updatewriteplain.credit.balancePlain credit: balancereadplain.credit.spendPlain credit: spendreadplain.credit.usage_by_dayPlain credit: usage by dayreadplain.cursor_repository.listList Plain cursor repositorysreadplain.custom_role.createPlain custom role: createwriteplain.custom_role.deletePlain custom role: deletedestructiveplain.custom_role.getGet Plain custom rolereadplain.custom_role.listList Plain custom rolesreadplain.custom_role.updatePlain custom role: updatewriteplain.customer.add_to_accountsPlain customer: add to accountswriteplain.customer.add_to_customer_groupsPlain customer: add to customer groupswriteplain.customer.add_to_tenantsPlain customer: add to tenantswriteplain.customer.deletePlain customer: deletedestructiveplain.customer.getGet Plain customerreadplain.customer.get_by_emailPlain customer: get by emailreadplain.customer.get_by_external_idPlain customer: get by external idreadplain.customer.importPlain customer: importwriteplain.customer.listList Plain customersreadplain.customer.mark_as_spamPlain customer: mark as spamwriteplain.customer.remove_from_accountsPlain customer: remove from accountsdestructiveplain.customer.remove_from_customer_groupsPlain customer: remove from customer groupsdestructiveplain.customer.remove_from_tenantsPlain customer: remove from tenantsdestructiveplain.customer.resolve_for_ms_teams_channelPlain customer: resolve for ms teams channelwriteplain.customer.resolve_for_slack_channelPlain customer: resolve for slack channelwriteplain.customer.searchSearch Plain customersreadplain.customer.set_accountsPlain customer: set accountswriteplain.customer.set_tenantsPlain customer: set tenantswriteplain.customer.unmark_as_spamPlain customer: unmark as spamwriteplain.customer.update_companyPlain customer: update companywriteplain.customer.upsertPlain customer: upsertwriteplain.customer_card_config.createPlain customer card config: createwriteplain.customer_card_config.deletePlain customer card config: deletedestructiveplain.customer_card_config.getGet Plain customer card configreadplain.customer_card_config.listList Plain customer card configsreadplain.customer_card_config.reorderPlain customer card config: reorderwriteplain.customer_card_config.updatePlain customer card config: updatewriteplain.customer_card_instance.listList Plain customer card instancesreadplain.customer_card_instance.reloadPlain customer card instance: reloadwriteplain.customer_event.createPlain customer event: createwriteplain.customer_group.createPlain customer group: createwriteplain.customer_group.deletePlain customer group: deletedestructiveplain.customer_group.getGet Plain customer groupreadplain.customer_group.listList Plain customer groupsreadplain.customer_group.updatePlain customer group: updatewriteplain.customer_group.upsertPlain customer group: upsertwriteplain.customer_survey.createPlain customer survey: createwriteplain.customer_survey.deletePlain customer survey: deletedestructiveplain.customer_survey.getGet Plain customer surveyreadplain.customer_survey.listList Plain customer surveysreadplain.customer_survey.reorderPlain customer survey: reorderwriteplain.customer_survey.updatePlain customer survey: updatewriteplain.discord_message.sendPlain discord message: sendwriteplain.discussion.createPlain discussion: createwriteplain.discussion.getGet Plain discussionreadplain.discussion.listList Plain discussionsreadplain.discussion.send_messagePlain discussion: send messagewriteplain.discussion.stop_turnPlain discussion: stop turndestructiveplain.discussion.update_agent_statusPlain discussion: update agent statuswriteplain.discussion_approval.resolvePlain discussion approval: resolvewriteplain.discussion_tool_call.request_approvalPlain discussion tool call: request approvalwriteplain.discussion_tool_call.upsertPlain discussion tool call: upsertwriteplain.email.create_preview_urlPlain email: create preview urlwriteplain.email.replyPlain email: replywriteplain.email.send_bulkPlain email: send bulkwriteplain.email.send_newPlain email: send newwriteplain.email_suppression.deletePlain email suppression: deletedestructiveplain.email_suppression.getGet Plain email suppressionreadplain.embed_token.mintPlain embed token: mintwriteplain.escalation_path.createPlain escalation path: createwriteplain.escalation_path.deletePlain escalation path: deletedestructiveplain.escalation_path.getGet Plain escalation pathreadplain.escalation_path.listList Plain escalation pathsreadplain.escalation_path.updatePlain escalation path: updatewriteplain.generated_reply.addPlain generated reply: addwriteplain.generated_reply.listList Plain generated replysreadplain.generated_reply.updatePlain generated reply: updatewriteplain.heatmap_metric.getGet Plain heatmap metricreadplain.help_center.createPlain help center: createwriteplain.help_center.deletePlain help center: deletedestructiveplain.help_center.getGet Plain help centerreadplain.help_center.listList Plain help centersreadplain.help_center.updatePlain help center: updatewriteplain.help_center.update_custom_domainPlain help center: update custom domainwriteplain.help_center.verify_custom_domainPlain help center: verify custom domainwriteplain.help_center_ai_conversation.getGet Plain help center ai conversationreadplain.help_center_ai_conversation.listList Plain help center ai conversationsreadplain.help_center_article.deletePlain help center article: deletedestructiveplain.help_center_article.generatePlain help center article: generatewriteplain.help_center_article.getGet Plain help center articlereadplain.help_center_article.get_by_slugPlain help center article: get by slugreadplain.help_center_article.upsertPlain help center article: upsertwriteplain.help_center_article_group.createPlain help center article group: createwriteplain.help_center_article_group.deletePlain help center article group: deletedestructiveplain.help_center_article_group.getGet Plain help center article groupreadplain.help_center_article_group.get_by_slugPlain help center article group: get by slugreadplain.help_center_article_group.updatePlain help center article group: updatewriteplain.help_center_index.getGet Plain help center indexreadplain.help_center_index.updatePlain help center index: updatewriteplain.import_job.listList Plain import jobsreadplain.import_job_definition.getGet Plain import job definitionreadplain.import_job_definition.updatePlain import job definition: updatewriteplain.import_sync.createPlain import sync: createwriteplain.importer.account_listsPlain importer: account listsreadplain.importer.tenant_listsPlain importer: tenant listsreadplain.indexed_document.createPlain indexed document: createwriteplain.indexed_document.listList Plain indexed documentsreadplain.interpolation_variable.listList Plain interpolation variablesreadplain.issue_tracker_field.listList Plain issue tracker fieldsreadplain.issue_tracker_issue.createPlain issue tracker issue: createwriteplain.knowledge_gap.getGet Plain knowledge gapreadplain.knowledge_gap.listList Plain knowledge gapsreadplain.knowledge_source.createPlain knowledge source: createwriteplain.knowledge_source.deletePlain knowledge source: deletedestructiveplain.knowledge_source.getGet Plain knowledge sourcereadplain.knowledge_source.listList Plain knowledge sourcesreadplain.knowledge_source.reindexPlain knowledge source: reindexwriteplain.knowledge_source.searchSearch Plain knowledge sourcesreadplain.knowledge_source_citation.list_by_threadPlain knowledge source citation: list by threadreadplain.label.addPlain label: addwriteplain.label.removePlain label: removedestructiveplain.label_type.accept_suggestedPlain label type: accept suggestedwriteplain.label_type.archivePlain label type: archivewriteplain.label_type.createPlain label type: createwriteplain.label_type.dismiss_suggestedPlain label type: dismiss suggesteddestructiveplain.label_type.getGet Plain label typereadplain.label_type.get_by_external_idPlain label type: get by external idreadplain.label_type.listList Plain label typesreadplain.label_type.list_suggestedPlain label type: list suggestedreadplain.label_type.movePlain label type: movewriteplain.label_type.unarchivePlain label type: unarchivewriteplain.label_type.updatePlain label type: updatewriteplain.linear_app_integration.deletePlain linear app integration: deletedestructiveplain.linear_app_integration.getGet Plain linear app integrationreadplain.machine_user.createPlain machine user: createwriteplain.machine_user.deletePlain machine user: deletedestructiveplain.machine_user.getGet Plain machine userreadplain.machine_user.listList Plain machine usersreadplain.machine_user.updatePlain machine user: updatewriteplain.me.machine_userPlain me: machine userreadplain.me.permissionsPlain me: permissionsreadplain.me.workspacePlain me: workspacereadplain.ms_teams_channel.list_membersPlain ms teams channel: list membersreadplain.ms_teams_message.sendPlain ms teams message: sendwriteplain.note.createPlain note: createwriteplain.note.deletePlain note: deletedestructiveplain.note.updatePlain note: updatewriteplain.oauth_app.createPlain oauth app: createwriteplain.oauth_app.deletePlain oauth app: deletedestructiveplain.oauth_app.disablePlain oauth app: disabledestructiveplain.oauth_app.enablePlain oauth app: enablewriteplain.oauth_app.getGet Plain oauth appreadplain.oauth_app.listList Plain oauth appsreadplain.oauth_app.updatePlain oauth app: updatewriteplain.permissions.getGet Plain permissionsreadplain.plain_help_center.searchSearch Plain plain help centersreadplain.role.listList Plain rolesreadplain.role.upsert_scopesPlain role: upsert scopeswriteplain.saved_threads_view.createPlain saved threads view: createwriteplain.saved_threads_view.deletePlain saved threads view: deletedestructiveplain.saved_threads_view.getGet Plain saved threads viewreadplain.saved_threads_view.listList Plain saved threads viewsreadplain.saved_threads_view.updatePlain saved threads view: updatewriteplain.service_authorization.deletePlain service authorization: deletedestructiveplain.service_authorization.getGet Plain service authorizationreadplain.service_authorization.listList Plain service authorizationsreadplain.service_level_agreement.createPlain service level agreement: createwriteplain.service_level_agreement.deletePlain service level agreement: deletedestructiveplain.service_level_agreement.updatePlain service level agreement: updatewriteplain.service_level_agreement_policy.createPlain service level agreement policy: createwriteplain.service_level_agreement_policy.deletePlain service level agreement policy: deletedestructiveplain.service_level_agreement_policy.getGet Plain service level agreement policyreadplain.service_level_agreement_policy.listList Plain service level agreement policysreadplain.service_level_agreement_policy.updatePlain service level agreement policy: updatewriteplain.setting.deletePlain setting: deletedestructiveplain.setting.getGet Plain settingreadplain.setting.updatePlain setting: updatewriteplain.sidekick_custom_skill.createPlain sidekick custom skill: createwriteplain.sidekick_custom_skill.deletePlain sidekick custom skill: deletedestructiveplain.sidekick_custom_skill.getGet Plain sidekick custom skillreadplain.sidekick_custom_skill.updatePlain sidekick custom skill: updatewriteplain.sidekick_github.accessible_reposPlain sidekick github: accessible reposreadplain.sidekick_github_config.getGet Plain sidekick github configreadplain.sidekick_github_config.updatePlain sidekick github config: updatewriteplain.sidekick_mcp_server.createPlain sidekick mcp server: createwriteplain.sidekick_mcp_server.deletePlain sidekick mcp server: deletedestructiveplain.sidekick_mcp_server.getGet Plain sidekick mcp serverreadplain.sidekick_mcp_server.listList Plain sidekick mcp serversreadplain.sidekick_mcp_server.refresh_toolsPlain sidekick mcp server: refresh toolswriteplain.sidekick_mcp_server.updatePlain sidekick mcp server: updatewriteplain.sidekick_posthog_config.getGet Plain sidekick posthog configreadplain.sidekick_posthog_config.updatePlain sidekick posthog config: updatewriteplain.sidekick_question.answerPlain sidekick question: answerwriteplain.sidekick_question.dismissPlain sidekick question: dismissdestructiveplain.sidekick_service_config.getGet Plain sidekick service configreadplain.sidekick_service_config.updatePlain sidekick service config: updatewriteplain.sidekick_settings.getGet Plain sidekick settingsreadplain.sidekick_settings.updatePlain sidekick settings: updatewriteplain.sidekick_skill.listList Plain sidekick skillsreadplain.sidekick_slack_config.updatePlain sidekick slack config: updatewriteplain.sidekick_tool.arg_optionsPlain sidekick tool: arg optionsreadplain.sidekick_tool.list_availablePlain sidekick tool: list availablereadplain.single_value_metric.getGet Plain single value metricreadplain.slack_auto_join_rule.listList Plain slack auto join rulesreadplain.slack_auto_join_rule.setPlain slack auto join rule: setwriteplain.slack_channel.bulk_joinPlain slack channel: bulk joinwriteplain.slack_channel_settings.bulk_updatePlain slack channel settings: bulk updatewriteplain.slack_message.sendPlain slack message: sendwriteplain.slack_message_reaction.togglePlain slack message reaction: togglewriteplain.slack_teammate.list_suggestedPlain slack teammate: list suggestedreadplain.slack_user.getGet Plain slack userreadplain.slack_user.searchSearch Plain slack usersreadplain.snippet.createPlain snippet: createwriteplain.snippet.deletePlain snippet: deletedestructiveplain.snippet.getGet Plain snippetreadplain.snippet.listList Plain snippetsreadplain.snippet.updatePlain snippet: updatewriteplain.task.createPlain task: createwriteplain.task.deletePlain task: deletedestructiveplain.task.getGet Plain taskreadplain.task.get_by_refPlain task: get by refreadplain.task.listList Plain tasksreadplain.task.updatePlain task: updatewriteplain.team_settings.getGet Plain team settingsreadplain.team_settings.upsertPlain team settings: upsertwriteplain.tenant.createPlain tenant: createwriteplain.tenant.deletePlain tenant: deletedestructiveplain.tenant.getGet Plain tenantreadplain.tenant.importPlain tenant: importwriteplain.tenant.listList Plain tenantsreadplain.tenant.searchSearch Plain tenantsreadplain.tenant.update_tierPlain tenant: update tierwriteplain.tenant.upsertPlain tenant: upsertwriteplain.tenant_field.deletePlain tenant field: deletedestructiveplain.tenant_field.upsertPlain tenant field: upsertwriteplain.tenant_field_schema.deletePlain tenant field schema: deletedestructiveplain.tenant_field_schema.importPlain tenant field schema: importwriteplain.tenant_field_schema.import_from_servicePlain tenant field schema: import from servicewriteplain.tenant_field_schema.listList Plain tenant field schemasreadplain.tenant_field_schema.remove_mappingPlain tenant field schema: remove mappingdestructiveplain.tenant_field_schema.setup_mappingPlain tenant field schema: setup mappingwriteplain.tenant_field_schema.upsertPlain tenant field schema: upsertwriteplain.test_thread.createPlain test thread: createwriteplain.test_thread.create_allPlain test thread: create allwriteplain.test_thread.deletePlain test thread: deletedestructiveplain.test_thread.delete_allPlain test thread: delete alldestructiveplain.test_thread.listList Plain test threadsreadplain.thread.add_additional_assigneesPlain thread: add additional assigneeswriteplain.thread.assignPlain thread: assignwriteplain.thread.change_customerPlain thread: change customerwriteplain.thread.change_priorityPlain thread: change prioritywriteplain.thread.createPlain thread: createwriteplain.thread.create_from_slack_messagePlain thread: create from slack messagewriteplain.thread.deletePlain thread: deletedestructiveplain.thread.escalatePlain thread: escalatewriteplain.thread.forkPlain thread: forkwriteplain.thread.getGet Plain threadreadplain.thread.get_by_external_idPlain thread: get by external idreadplain.thread.get_by_refPlain thread: get by refreadplain.thread.get_by_slack_messagePlain thread: get by slack messagereadplain.thread.get_by_slack_permalinkPlain thread: get by slack permalinkreadplain.thread.importPlain thread: importwriteplain.thread.import_messagesPlain thread: import messageswriteplain.thread.listList Plain threadsreadplain.thread.list_by_external_idPlain thread: list by external idreadplain.thread.list_deletedPlain thread: list deletedreadplain.thread.list_relatedPlain thread: list relatedreadplain.thread.lockPlain thread: lockwriteplain.thread.mark_as_donePlain thread: mark as donewriteplain.thread.mark_as_todoPlain thread: mark as todowriteplain.thread.remove_additional_assigneesPlain thread: remove additional assigneesdestructiveplain.thread.replyPlain thread: replywriteplain.thread.searchSearch Plain threadsreadplain.thread.share_to_user_in_slackPlain thread: share to user in slackwriteplain.thread.snoozePlain thread: snoozewriteplain.thread.unassignPlain thread: unassigndestructiveplain.thread.update_accountPlain thread: update accountwriteplain.thread.update_agent_statusPlain thread: update agent statuswriteplain.thread.update_escalation_pathPlain thread: update escalation pathwriteplain.thread.update_external_idPlain thread: update external idwriteplain.thread.update_sla_policyPlain thread: update sla policywriteplain.thread.update_suggested_action_statusPlain thread: update suggested action statuswriteplain.thread.update_tenantPlain thread: update tenantwriteplain.thread.update_tierPlain thread: update tierwriteplain.thread.update_titlePlain thread: update titlewriteplain.thread_channel_association.createPlain thread channel association: createwriteplain.thread_channel_association.deletePlain thread channel association: deletedestructiveplain.thread_channel_association.update_account_membership_policyPlain thread channel association: update account membership policywriteplain.thread_channel_association.update_tenant_membership_policyPlain thread channel association: update tenant membership policywriteplain.thread_cluster.getGet Plain thread clusterreadplain.thread_cluster.get_activePlain thread cluster: get activereadplain.thread_cluster.listList Plain thread clustersreadplain.thread_cluster.list_paginatedPlain thread cluster: list paginatedreadplain.thread_discussion.change_statusPlain thread discussion: change statuswriteplain.thread_discussion.createPlain thread discussion: createwriteplain.thread_discussion.deletePlain thread discussion: deletedestructiveplain.thread_discussion.getGet Plain thread discussionreadplain.thread_discussion.importPlain thread discussion: importwriteplain.thread_discussion.mark_readPlain thread discussion: mark readwriteplain.thread_discussion.send_messagePlain thread discussion: send messagewriteplain.thread_event.createPlain thread event: createwriteplain.thread_field.bulk_upsertPlain thread field: bulk upsertwriteplain.thread_field.deletePlain thread field: deletedestructiveplain.thread_field.upsertPlain thread field: upsertwriteplain.thread_field_schema.createPlain thread field schema: createwriteplain.thread_field_schema.deletePlain thread field schema: deletedestructiveplain.thread_field_schema.getGet Plain thread field schemareadplain.thread_field_schema.listList Plain thread field schemasreadplain.thread_field_schema.reorderPlain thread field schema: reorderwriteplain.thread_field_schema.updatePlain thread field schema: updatewriteplain.thread_heatmap_metric.getGet Plain thread heatmap metricreadplain.thread_link.bulk_createPlain thread link: bulk createwriteplain.thread_link.bulk_deletePlain thread link: bulk deletedestructiveplain.thread_link.createPlain thread link: createwriteplain.thread_link.deletePlain thread link: deletedestructiveplain.thread_link_candidate.searchSearch Plain thread link candidatesreadplain.thread_link_group.listList Plain thread link groupsreadplain.thread_single_value_metric.getGet Plain thread single value metricreadplain.thread_slack_user.getGet Plain thread slack userreadplain.thread_slack_user.searchSearch Plain thread slack usersreadplain.thread_time_series_metric.getGet Plain thread time series metricreadplain.tier.add_membersPlain tier: add memberswriteplain.tier.createPlain tier: createwriteplain.tier.deletePlain tier: deletedestructiveplain.tier.getGet Plain tierreadplain.tier.listList Plain tiersreadplain.tier.remove_membersPlain tier: remove membersdestructiveplain.tier.updatePlain tier: updatewriteplain.time_series_metric.getGet Plain time series metricreadplain.timeline_entry.getGet Plain timeline entryreadplain.timeline_entry.get_for_threadPlain timeline entry: get for threadreadplain.timeline_entry.listList Plain timeline entrysreadplain.user.add_labelsPlain user: add labelswriteplain.user.assign_rolesPlain user: assign rolesdestructiveplain.user.change_statusPlain user: change statuswriteplain.user.deletePlain user: deletedestructiveplain.user.getGet Plain userreadplain.user.get_by_emailPlain user: get by emailreadplain.user.invite_to_workspacePlain user: invite to workspacewriteplain.user.listList Plain usersreadplain.user.remove_labelsPlain user: remove labelsdestructiveplain.user.slack_channel_membershipsPlain user: slack channel membershipsreadplain.user.sync_working_hoursPlain user: sync working hourswriteplain.webhook_delivery_attempt.listList Plain webhook delivery attemptsreadplain.webhook_event.sample_bodyPlain webhook event: sample bodyreadplain.webhook_event_type.listList Plain webhook event typesreadplain.webhook_target.createPlain webhook target: createwriteplain.webhook_target.deletePlain webhook target: deletedestructiveplain.webhook_target.getGet Plain webhook targetreadplain.webhook_target.listList Plain webhook targetsreadplain.webhook_target.updatePlain webhook target: updatewriteplain.webhook_version.listList Plain webhook versionsreadplain.workflow.capabilitiesPlain workflow: capabilitiesreadplain.workflow.createPlain workflow: createwriteplain.workflow.deletePlain workflow: deletedestructiveplain.workflow.export_templatePlain workflow: export templatewriteplain.workflow.getGet Plain workflowreadplain.workflow.listList Plain workflowsreadplain.workflow.movePlain workflow: movewriteplain.workflow.triggerPlain workflow: triggerdestructiveplain.workflow.updatePlain workflow: updatewriteplain.workflow_execution.getGet Plain workflow executionreadplain.workflow_execution.listList Plain workflow executionsreadplain.workflow_execution.list_by_entityPlain workflow execution: list by entityreadplain.workflow_execution.list_for_workspacePlain workflow execution: list for workspacereadplain.workflow_rule.createPlain workflow rule: createwriteplain.workflow_rule.deletePlain workflow rule: deletedestructiveplain.workflow_rule.getGet Plain workflow rulereadplain.workflow_rule.listList Plain workflow rulesreadplain.workflow_rule.toggle_publishedPlain workflow rule: toggle publishedwriteplain.workflow_rule.triggerPlain workflow rule: triggerdestructiveplain.workflow_rule.updatePlain workflow rule: updatewriteplain.workflow_share_link.createPlain workflow share link: createwriteplain.workflow_share_link.getGet Plain workflow share linkreadplain.workflow_step.bulk_upsertPlain workflow step: bulk upsertwriteplain.workflow_step.createPlain workflow step: createwriteplain.workflow_step.deletePlain workflow step: deletedestructiveplain.workflow_step.updatePlain workflow step: updatewriteplain.workflow_template.getGet Plain workflow templatereadplain.workflow_template.listList Plain workflow templatesreadplain.workspace.getGet Plain workspacereadplain.workspace.updatePlain workspace: updatewriteplain.workspace_chat_settings.getGet Plain workspace chat settingsreadplain.workspace_cursor_integration.deletePlain workspace cursor integration: deletedestructiveplain.workspace_cursor_integration.getGet Plain workspace cursor integrationreadplain.workspace_discord_channel_integration.deletePlain workspace discord channel integration: deletedestructiveplain.workspace_discord_channel_integration.getGet Plain workspace discord channel integrationreadplain.workspace_discord_channel_integration.listList Plain workspace discord channel integrationsreadplain.workspace_discord_integration.deletePlain workspace discord integration: deletedestructiveplain.workspace_discord_integration.getGet Plain workspace discord integrationreadplain.workspace_discord_integration.listList Plain workspace discord integrationsreadplain.workspace_email_domain_settings.createPlain workspace email domain settings: createwriteplain.workspace_email_domain_settings.deletePlain workspace email domain settings: deletedestructiveplain.workspace_email_settings.add_alternate_support_addressPlain workspace email settings: add alternate support addresswriteplain.workspace_email_settings.getGet Plain workspace email settingsreadplain.workspace_email_settings.remove_alternate_support_addressPlain workspace email settings: remove alternate support addressdestructiveplain.workspace_email_settings.updatePlain workspace email settings: updatewriteplain.workspace_email_settings.verify_dnsPlain workspace email settings: verify dnswriteplain.workspace_email_settings.verify_forwardingPlain workspace email settings: verify forwardingwriteplain.workspace_file.create_download_urlPlain workspace file: create download urlwriteplain.workspace_file.create_upload_urlPlain workspace file: create upload urlwriteplain.workspace_file.deletePlain workspace file: deletedestructiveplain.workspace_hmac.getGet Plain workspace hmacreadplain.workspace_hmac.regeneratePlain workspace hmac: regeneratewriteplain.workspace_invite.deletePlain workspace invite: deletedestructiveplain.workspace_invite.listList Plain workspace invitesreadplain.workspace_ms_teams_integration.deletePlain workspace ms teams integration: deletedestructiveplain.workspace_ms_teams_integration.getGet Plain workspace ms teams integrationreadplain.workspace_setup.getGet Plain workspace setupreadplain.workspace_slack_channel_integration.deletePlain workspace slack channel integration: deletedestructiveplain.workspace_slack_channel_integration.getGet Plain workspace slack channel integrationreadplain.workspace_slack_channel_integration.listList Plain workspace slack channel integrationsreadplain.workspace_slack_channel_integration.refreshPlain workspace slack channel integration: refreshwriteplain.workspace_slack_integration.deletePlain workspace slack integration: deletedestructiveplain.workspace_slack_integration.getGet Plain workspace slack integrationreadplain.workspace_slack_integration.listList Plain workspace slack integrationsreadplain.workspace_slack_sidekick_integration.deletePlain workspace slack sidekick integration: deletedestructiveplain.workspace_slack_sidekick_integration.getGet Plain workspace slack sidekick integrationreadplain.workspace_slack_sidekick_integration.refreshPlain workspace slack sidekick integration: refreshwrite
Questions
The Plain MCP server, answered.
Is there a Plain MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 523 Plain actions, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Plain.
What do I need to connect Plain?
Plain API key (plainApiKey_...). The free call account { op: "connections.requirements", service: "plain" } lists exactly what to paste.
Can an AI agent delete or change things in Plain?
Only if its key allows it, and only with an explicit confirmation. 87 Plain actions are destructive, including plain customer: delete, plain account: delete and plain user: delete. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.
Will an AI agent use up my Plain API limit?
actionlake paces every call to the limits in the Plain service file: 600 calls a minute per connection. Repeated reads are answered from cache (200 Plain actions can be), which never reaches Plain.
What does a Plain action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (72 Plain actions page). Cache hits, searches, dry runs and calls Plain refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
Which Plain API does it cover?
The Plain API graphql-v1 at core-api.uk.plain.com. It is built from Plain's documentation as read on 23 October 2026. 523 actions in 1 area, each one in the signed service file (version 1.0.0).
Can I combine Plain with my other systems?
Yes. ask joins Plain to ConnectWise PSA or NetSuite on the same customer and returns the answer rather than every row. Plain maps crm.company, which 227 other connectors also map.
Does actionlake keep my Plain data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Plain credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.
Which AI clients can use it?
Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.
Give your agent Plain today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.