---
title: "Plain MCP server for AI agents - actionlake"
description: "Give Claude 523 Plain actions through one MCP server: customer, account, user, thread. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/plain
updated: 2026-10-23
---

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.

[Connect Plain free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

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/mcp`

the first call

```
do {
  action: "plain.customer.list",
  intent: "check which Plain account is connected"
}
# List Plain customers · read · 1 upstream call
```

- 523 actions in one signed file
- 202 read look, never change
- 234 write create and update
- 87 wait for a yes destructive, confirmed first

Set up

## Connect Plain in three steps.

1. 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`
2. 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_key` Plain API key (plainApiKey_...)
   ```
   account { op: "connections.requirements", service: "plain" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "plain.customer.list" }
   # list plain customers · read · 1 upstream call
   check { 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 2026[plain.com](https://www.plain.com/docs/graphql/introduction) [core-api.uk.plain.com](https://core-api.uk.plain.com/graphql/v1/schema.graphql)

**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.

- **202** read look, never change
- **234** write create and update
- **87** destructive wait for a confirmation

1. ### Support
   523
   202 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.list` List Plain customers | Fetch a paginated list of all customers in the workspace | read | `crm.contact.list` 177 connectors |
| `plain.account.list` List Plain accounts | Returns a paginated list of accounts in the workspace | read | `crm.company.list` 162 connectors |
| `plain.user.list` List Plain users | List all human members of the workspace, with optional filters to narrow results by role assignability | read | `identity.user.list` 474 connectors |
| `plain.account.create` Plain account: create | Creates a new account | write | `crm.company.create` 142 connectors |
| `plain.thread.list` List Plain threads | List threads with optional filtering and sorting, returned as a paginated connection | read | `service.ticket.list` 56 connectors |
| `plain.customer.get` Get Plain customer | Fetch a single customer by their Plain customer ID | read | `crm.contact.get` 176 connectors |
| `plain.customer.delete` Plain customer: delete | Permanently deletes a customer and all associated data (threads, timeline entries, etc.) | destructive | `crm.contact.delete` 147 connectors |
| `plain.thread.create` Plain thread: create | Create a new thread for a customer | write | `service.ticket.create` 54 connectors |
| `plain.user.get` Get Plain user | Fetch a single workspace member by their ID | read | `identity.user.get` 399 connectors |
| `plain.task.create` Plain task: create | Create a new task | write | `work.task.create` 127 connectors |
| `plain.chat.send` Plain 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.add` Plain 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.

1. Read read
   Which Plain tickets have been open the longest? Show me the ten oldest with their status.
   calls `plain.thread.list`
2. Write write
   Plain account: create in Plain. Show me exactly what you will send before you save it.
   calls `plain.account.create`
3. Across systems read
   For each customer, how many tickets are in Plain and how many invoices in ConnectWise PSA?
   calls `plain.thread.list` `connectwise_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`, on `crm.company` · [ConnectWise PSA](https://actionlake.com/connectors/connectwise-psa)
- For each customer, how many tickets are in Plain and how many invoices in NetSuite?
  `plain.thread.list` + `netsuite.views.invoices`, on `crm.company` · [NetSuite](https://actionlake.com/connectors/netsuite)

Also mapped by other connectors `identity.user` **517** `crm.company` **227** `crm.contact` **192** `service.ticket` **62**

ask

```
ask {
  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"]
    } }
  ]
}
```

Example. Run it through check first: it validates the steps and prices them, and it is free.

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.

do plain.customer.delete confirm_policy: **human**

Plain customer: delete?

**intent:** the user asked me to plain customer: delete

run suspended · waiting for a named person · key _plain-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
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: "lead@example.com" },
    { match: "plain.account.delete", approver: "lead@example.com" },
    { match: "plain.user.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Plain only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

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.

- 1 upstream call per action all 523 Plain actions
- 72 actions page each page of a long list is one call
- 200 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Plain action.

523 actions by area: the id your agent calls, what it does, and its effect.

**Support 523**

- `plain.account.create` Plain account: create write
- `plain.account.delete` Plain account: delete destructive
- `plain.account.get` Get Plain account read
- `plain.account.import` Plain account: import write
- `plain.account.list` List Plain accounts read
- `plain.account.search` Search Plain accounts read
- `plain.account.update_tier` Plain account: update tier write
- `plain.account.upsert` Plain account: upsert write
- `plain.account_field.delete` Plain account field: delete destructive
- `plain.account_field.upsert` Plain account field: upsert write
- `plain.account_field_schema.delete` Plain account field schema: delete destructive
- `plain.account_field_schema.import` Plain account field schema: import write
- `plain.account_field_schema.import_from_service` Plain account field schema: import from service write
- `plain.account_field_schema.list` List Plain account field schemas read
- `plain.account_field_schema.remove_mapping` Plain account field schema: remove mapping destructive
- `plain.account_field_schema.setup_mapping` Plain account field schema: setup mapping write
- `plain.account_field_schema.upsert` Plain account field schema: upsert write
- `plain.agent_approval.resolve` Plain agent approval: resolve write
- `plain.agent_sandbox_tool_policy.list` List Plain agent sandbox tool policys read
- `plain.agent_sandbox_tool_policy.update` Plain agent sandbox tool policy: update write
- `plain.agent_session.stop_turn` Plain agent session: stop turn destructive
- `plain.agent_session_message.delete_queued` Plain agent session message: delete queued destructive
- `plain.agent_session_message.edit_queued` Plain agent session message: edit queued write
- `plain.ai_feedback.create` Plain ai feedback: create write
- `plain.ai_feedback.create_for_feature` Plain ai feedback: create for feature write
- `plain.ai_feedback.list` List Plain ai feedbacks read
- `plain.ai_tone_rule.create` Plain ai tone rule: create write
- `plain.ai_tone_rule.delete` Plain ai tone rule: delete destructive
- `plain.ai_tone_rule.enabled_text` Plain ai tone rule: enabled text read
- `plain.ai_tone_rule.generate_from_description` Plain ai tone rule: generate from description write
- `plain.ai_tone_rule.list` List Plain ai tone rules read
- `plain.ai_tone_rule.update` Plain ai tone rule: update write
- `plain.api_key.create` Plain api key: create write
- `plain.api_key.delete` Plain api key: delete destructive
- `plain.api_key.update` Plain api key: update write
- `plain.attachment.create_download_url` Plain attachment: create download url write
- `plain.attachment.create_upload_url` Plain attachment: create upload url write
- `plain.autoresponder.create` Plain autoresponder: create write
- `plain.autoresponder.delete` Plain autoresponder: delete destructive
- `plain.autoresponder.get` Get Plain autoresponder read
- `plain.autoresponder.list` List Plain autoresponders read
- `plain.autoresponder.reorder` Plain autoresponder: reorder write
- `plain.autoresponder.update` Plain autoresponder: update write
- `plain.billing.plans` Plain billing: plans read
- `plain.billing.rota` Plain billing: rota read
- `plain.billing.subscription` Plain billing: subscription read
- `plain.broadcast.create` Plain broadcast: create write
- `plain.broadcast.delete` Plain broadcast: delete destructive
- `plain.broadcast.duplicate` Plain broadcast: duplicate write
- `plain.broadcast.get` Get Plain broadcast read
- `plain.broadcast.list` List Plain broadcasts read
- `plain.broadcast.schedule` Plain broadcast: schedule write
- `plain.broadcast.search` Search Plain broadcasts read
- `plain.broadcast.send_test` Plain broadcast: send test write
- `plain.broadcast.target_recipients` Plain broadcast: target recipients read
- `plain.broadcast.update` Plain broadcast: update write
- `plain.broadcast_audience.create` Plain broadcast audience: create write
- `plain.broadcast_audience.delete` Plain broadcast audience: delete destructive
- `plain.broadcast_audience.get` Get Plain broadcast audience read
- `plain.broadcast_audience.import_channels` Plain broadcast audience: import channels write
- `plain.broadcast_audience.list` List Plain broadcast audiences read
- `plain.broadcast_audience.update` Plain broadcast audience: update write
- `plain.broadcast_recipient.resubscribe` Plain broadcast recipient: resubscribe write
- `plain.broadcast_recipient.unsubscribe` Plain broadcast recipient: unsubscribe destructive
- `plain.broadcast_recipient_unsubscribe.import` Plain broadcast recipient unsubscribe: import write
- `plain.broadcast_recipient_unsubscribe.list` List Plain broadcast recipient unsubscribes read
- `plain.business_hours.delete` Plain business hours: delete destructive
- `plain.business_hours.get` Get Plain business hours read
- `plain.business_hours.slots` Plain business hours: slots read
- `plain.business_hours.sync_slots` Plain business hours: sync slots write
- `plain.business_hours.upsert` Plain business hours: upsert write
- `plain.business_hours_override.create` Plain business hours override: create write
- `plain.business_hours_override.delete` Plain business hours override: delete destructive
- `plain.business_hours_override.get` Get Plain business hours override read
- `plain.business_hours_override.update` Plain business hours override: update write
- `plain.business_hours_schedule.create` Plain business hours schedule: create write
- `plain.business_hours_schedule.delete` Plain business hours schedule: delete destructive
- `plain.business_hours_schedule.get` Get Plain business hours schedule read
- `plain.business_hours_schedule.list` List Plain business hours schedules read
- `plain.business_hours_schedule.update` Plain business hours schedule: update write
- `plain.channel.test` Plain channel: test read
- `plain.chat.send` Plain chat: send write
- `plain.chat.send_as_customer` Plain chat: send as customer write
- `plain.chat_app.create` Plain chat app: create write
- `plain.chat_app.delete` Plain chat app: delete destructive
- `plain.chat_app.get` Get Plain chat app read
- `plain.chat_app.list` List Plain chat apps read
- `plain.chat_app.update` Plain chat app: update write
- `plain.chat_app_secret.create` Plain chat app secret: create write
- `plain.chat_app_secret.delete` Plain chat app secret: delete destructive
- `plain.chat_app_secret.get` Get Plain chat app secret read
- `plain.company.delete` Plain company: delete destructive
- `plain.company.get` Get Plain company read
- `plain.company.list` List Plain companys read
- `plain.company.search` Search Plain companys read
- `plain.company.update_tier` Plain company: update tier write
- `plain.company.upsert` Plain company: upsert write
- `plain.connected_discord_channel.list` List Plain connected discord channels read
- `plain.connected_discord_channel.refresh` Plain connected discord channel: refresh write
- `plain.connected_discord_channel.update` Plain connected discord channel: update write
- `plain.connected_ms_teams_channel.list` List Plain connected ms teams channels read
- `plain.connected_slack_channel.bulk_update` Plain connected slack channel: bulk update write
- `plain.connected_slack_channel.get` Get Plain connected slack channel read
- `plain.connected_slack_channel.list` List Plain connected slack channels read
- `plain.connected_slack_channel.update` Plain connected slack channel: update write
- `plain.credit.balance` Plain credit: balance read
- `plain.credit.spend` Plain credit: spend read
- `plain.credit.usage_by_day` Plain credit: usage by day read
- `plain.cursor_repository.list` List Plain cursor repositorys read
- `plain.custom_role.create` Plain custom role: create write
- `plain.custom_role.delete` Plain custom role: delete destructive
- `plain.custom_role.get` Get Plain custom role read
- `plain.custom_role.list` List Plain custom roles read
- `plain.custom_role.update` Plain custom role: update write
- `plain.customer.add_to_accounts` Plain customer: add to accounts write
- `plain.customer.add_to_customer_groups` Plain customer: add to customer groups write
- `plain.customer.add_to_tenants` Plain customer: add to tenants write
- `plain.customer.delete` Plain customer: delete destructive
- `plain.customer.get` Get Plain customer read
- `plain.customer.get_by_email` Plain customer: get by email read
- `plain.customer.get_by_external_id` Plain customer: get by external id read
- `plain.customer.import` Plain customer: import write
- `plain.customer.list` List Plain customers read
- `plain.customer.mark_as_spam` Plain customer: mark as spam write
- `plain.customer.remove_from_accounts` Plain customer: remove from accounts destructive
- `plain.customer.remove_from_customer_groups` Plain customer: remove from customer groups destructive
- `plain.customer.remove_from_tenants` Plain customer: remove from tenants destructive
- `plain.customer.resolve_for_ms_teams_channel` Plain customer: resolve for ms teams channel write
- `plain.customer.resolve_for_slack_channel` Plain customer: resolve for slack channel write
- `plain.customer.search` Search Plain customers read
- `plain.customer.set_accounts` Plain customer: set accounts write
- `plain.customer.set_tenants` Plain customer: set tenants write
- `plain.customer.unmark_as_spam` Plain customer: unmark as spam write
- `plain.customer.update_company` Plain customer: update company write
- `plain.customer.upsert` Plain customer: upsert write
- `plain.customer_card_config.create` Plain customer card config: create write
- `plain.customer_card_config.delete` Plain customer card config: delete destructive
- `plain.customer_card_config.get` Get Plain customer card config read
- `plain.customer_card_config.list` List Plain customer card configs read
- `plain.customer_card_config.reorder` Plain customer card config: reorder write
- `plain.customer_card_config.update` Plain customer card config: update write
- `plain.customer_card_instance.list` List Plain customer card instances read
- `plain.customer_card_instance.reload` Plain customer card instance: reload write
- `plain.customer_event.create` Plain customer event: create write
- `plain.customer_group.create` Plain customer group: create write
- `plain.customer_group.delete` Plain customer group: delete destructive
- `plain.customer_group.get` Get Plain customer group read
- `plain.customer_group.list` List Plain customer groups read
- `plain.customer_group.update` Plain customer group: update write
- `plain.customer_group.upsert` Plain customer group: upsert write
- `plain.customer_survey.create` Plain customer survey: create write
- `plain.customer_survey.delete` Plain customer survey: delete destructive
- `plain.customer_survey.get` Get Plain customer survey read
- `plain.customer_survey.list` List Plain customer surveys read
- `plain.customer_survey.reorder` Plain customer survey: reorder write
- `plain.customer_survey.update` Plain customer survey: update write
- `plain.discord_message.send` Plain discord message: send write
- `plain.discussion.create` Plain discussion: create write
- `plain.discussion.get` Get Plain discussion read
- `plain.discussion.list` List Plain discussions read
- `plain.discussion.send_message` Plain discussion: send message write
- `plain.discussion.stop_turn` Plain discussion: stop turn destructive
- `plain.discussion.update_agent_status` Plain discussion: update agent status write
- `plain.discussion_approval.resolve` Plain discussion approval: resolve write
- `plain.discussion_tool_call.request_approval` Plain discussion tool call: request approval write
- `plain.discussion_tool_call.upsert` Plain discussion tool call: upsert write
- `plain.email.create_preview_url` Plain email: create preview url write
- `plain.email.reply` Plain email: reply write
- `plain.email.send_bulk` Plain email: send bulk write
- `plain.email.send_new` Plain email: send new write
- `plain.email_suppression.delete` Plain email suppression: delete destructive
- `plain.email_suppression.get` Get Plain email suppression read
- `plain.embed_token.mint` Plain embed token: mint write
- `plain.escalation_path.create` Plain escalation path: create write
- `plain.escalation_path.delete` Plain escalation path: delete destructive
- `plain.escalation_path.get` Get Plain escalation path read
- `plain.escalation_path.list` List Plain escalation paths read
- `plain.escalation_path.update` Plain escalation path: update write
- `plain.generated_reply.add` Plain generated reply: add write
- `plain.generated_reply.list` List Plain generated replys read
- `plain.generated_reply.update` Plain generated reply: update write
- `plain.heatmap_metric.get` Get Plain heatmap metric read
- `plain.help_center.create` Plain help center: create write
- `plain.help_center.delete` Plain help center: delete destructive
- `plain.help_center.get` Get Plain help center read
- `plain.help_center.list` List Plain help centers read
- `plain.help_center.update` Plain help center: update write
- `plain.help_center.update_custom_domain` Plain help center: update custom domain write
- `plain.help_center.verify_custom_domain` Plain help center: verify custom domain write
- `plain.help_center_ai_conversation.get` Get Plain help center ai conversation read
- `plain.help_center_ai_conversation.list` List Plain help center ai conversations read
- `plain.help_center_article.delete` Plain help center article: delete destructive
- `plain.help_center_article.generate` Plain help center article: generate write
- `plain.help_center_article.get` Get Plain help center article read
- `plain.help_center_article.get_by_slug` Plain help center article: get by slug read
- `plain.help_center_article.upsert` Plain help center article: upsert write
- `plain.help_center_article_group.create` Plain help center article group: create write
- `plain.help_center_article_group.delete` Plain help center article group: delete destructive
- `plain.help_center_article_group.get` Get Plain help center article group read
- `plain.help_center_article_group.get_by_slug` Plain help center article group: get by slug read
- `plain.help_center_article_group.update` Plain help center article group: update write
- `plain.help_center_index.get` Get Plain help center index read
- `plain.help_center_index.update` Plain help center index: update write
- `plain.import_job.list` List Plain import jobs read
- `plain.import_job_definition.get` Get Plain import job definition read
- `plain.import_job_definition.update` Plain import job definition: update write
- `plain.import_sync.create` Plain import sync: create write
- `plain.importer.account_lists` Plain importer: account lists read
- `plain.importer.tenant_lists` Plain importer: tenant lists read
- `plain.indexed_document.create` Plain indexed document: create write
- `plain.indexed_document.list` List Plain indexed documents read
- `plain.interpolation_variable.list` List Plain interpolation variables read
- `plain.issue_tracker_field.list` List Plain issue tracker fields read
- `plain.issue_tracker_issue.create` Plain issue tracker issue: create write
- `plain.knowledge_gap.get` Get Plain knowledge gap read
- `plain.knowledge_gap.list` List Plain knowledge gaps read
- `plain.knowledge_source.create` Plain knowledge source: create write
- `plain.knowledge_source.delete` Plain knowledge source: delete destructive
- `plain.knowledge_source.get` Get Plain knowledge source read
- `plain.knowledge_source.list` List Plain knowledge sources read
- `plain.knowledge_source.reindex` Plain knowledge source: reindex write
- `plain.knowledge_source.search` Search Plain knowledge sources read
- `plain.knowledge_source_citation.list_by_thread` Plain knowledge source citation: list by thread read
- `plain.label.add` Plain label: add write
- `plain.label.remove` Plain label: remove destructive
- `plain.label_type.accept_suggested` Plain label type: accept suggested write
- `plain.label_type.archive` Plain label type: archive write
- `plain.label_type.create` Plain label type: create write
- `plain.label_type.dismiss_suggested` Plain label type: dismiss suggested destructive
- `plain.label_type.get` Get Plain label type read
- `plain.label_type.get_by_external_id` Plain label type: get by external id read
- `plain.label_type.list` List Plain label types read
- `plain.label_type.list_suggested` Plain label type: list suggested read
- `plain.label_type.move` Plain label type: move write
- `plain.label_type.unarchive` Plain label type: unarchive write
- `plain.label_type.update` Plain label type: update write
- `plain.linear_app_integration.delete` Plain linear app integration: delete destructive
- `plain.linear_app_integration.get` Get Plain linear app integration read
- `plain.machine_user.create` Plain machine user: create write
- `plain.machine_user.delete` Plain machine user: delete destructive
- `plain.machine_user.get` Get Plain machine user read
- `plain.machine_user.list` List Plain machine users read
- `plain.machine_user.update` Plain machine user: update write
- `plain.me.machine_user` Plain me: machine user read
- `plain.me.permissions` Plain me: permissions read
- `plain.me.workspace` Plain me: workspace read
- `plain.ms_teams_channel.list_members` Plain ms teams channel: list members read
- `plain.ms_teams_message.send` Plain ms teams message: send write
- `plain.note.create` Plain note: create write
- `plain.note.delete` Plain note: delete destructive
- `plain.note.update` Plain note: update write
- `plain.oauth_app.create` Plain oauth app: create write
- `plain.oauth_app.delete` Plain oauth app: delete destructive
- `plain.oauth_app.disable` Plain oauth app: disable destructive
- `plain.oauth_app.enable` Plain oauth app: enable write
- `plain.oauth_app.get` Get Plain oauth app read
- `plain.oauth_app.list` List Plain oauth apps read
- `plain.oauth_app.update` Plain oauth app: update write
- `plain.permissions.get` Get Plain permissions read
- `plain.plain_help_center.search` Search Plain plain help centers read
- `plain.role.list` List Plain roles read
- `plain.role.upsert_scopes` Plain role: upsert scopes write
- `plain.saved_threads_view.create` Plain saved threads view: create write
- `plain.saved_threads_view.delete` Plain saved threads view: delete destructive
- `plain.saved_threads_view.get` Get Plain saved threads view read
- `plain.saved_threads_view.list` List Plain saved threads views read
- `plain.saved_threads_view.update` Plain saved threads view: update write
- `plain.service_authorization.delete` Plain service authorization: delete destructive
- `plain.service_authorization.get` Get Plain service authorization read
- `plain.service_authorization.list` List Plain service authorizations read
- `plain.service_level_agreement.create` Plain service level agreement: create write
- `plain.service_level_agreement.delete` Plain service level agreement: delete destructive
- `plain.service_level_agreement.update` Plain service level agreement: update write
- `plain.service_level_agreement_policy.create` Plain service level agreement policy: create write
- `plain.service_level_agreement_policy.delete` Plain service level agreement policy: delete destructive
- `plain.service_level_agreement_policy.get` Get Plain service level agreement policy read
- `plain.service_level_agreement_policy.list` List Plain service level agreement policys read
- `plain.service_level_agreement_policy.update` Plain service level agreement policy: update write
- `plain.setting.delete` Plain setting: delete destructive
- `plain.setting.get` Get Plain setting read
- `plain.setting.update` Plain setting: update write
- `plain.sidekick_custom_skill.create` Plain sidekick custom skill: create write
- `plain.sidekick_custom_skill.delete` Plain sidekick custom skill: delete destructive
- `plain.sidekick_custom_skill.get` Get Plain sidekick custom skill read
- `plain.sidekick_custom_skill.update` Plain sidekick custom skill: update write
- `plain.sidekick_github.accessible_repos` Plain sidekick github: accessible repos read
- `plain.sidekick_github_config.get` Get Plain sidekick github config read
- `plain.sidekick_github_config.update` Plain sidekick github config: update write
- `plain.sidekick_mcp_server.create` Plain sidekick mcp server: create write
- `plain.sidekick_mcp_server.delete` Plain sidekick mcp server: delete destructive
- `plain.sidekick_mcp_server.get` Get Plain sidekick mcp server read
- `plain.sidekick_mcp_server.list` List Plain sidekick mcp servers read
- `plain.sidekick_mcp_server.refresh_tools` Plain sidekick mcp server: refresh tools write
- `plain.sidekick_mcp_server.update` Plain sidekick mcp server: update write
- `plain.sidekick_posthog_config.get` Get Plain sidekick posthog config read
- `plain.sidekick_posthog_config.update` Plain sidekick posthog config: update write
- `plain.sidekick_question.answer` Plain sidekick question: answer write
- `plain.sidekick_question.dismiss` Plain sidekick question: dismiss destructive
- `plain.sidekick_service_config.get` Get Plain sidekick service config read
- `plain.sidekick_service_config.update` Plain sidekick service config: update write
- `plain.sidekick_settings.get` Get Plain sidekick settings read
- `plain.sidekick_settings.update` Plain sidekick settings: update write
- `plain.sidekick_skill.list` List Plain sidekick skills read
- `plain.sidekick_slack_config.update` Plain sidekick slack config: update write
- `plain.sidekick_tool.arg_options` Plain sidekick tool: arg options read
- `plain.sidekick_tool.list_available` Plain sidekick tool: list available read
- `plain.single_value_metric.get` Get Plain single value metric read
- `plain.slack_auto_join_rule.list` List Plain slack auto join rules read
- `plain.slack_auto_join_rule.set` Plain slack auto join rule: set write
- `plain.slack_channel.bulk_join` Plain slack channel: bulk join write
- `plain.slack_channel_settings.bulk_update` Plain slack channel settings: bulk update write
- `plain.slack_message.send` Plain slack message: send write
- `plain.slack_message_reaction.toggle` Plain slack message reaction: toggle write
- `plain.slack_teammate.list_suggested` Plain slack teammate: list suggested read
- `plain.slack_user.get` Get Plain slack user read
- `plain.slack_user.search` Search Plain slack users read
- `plain.snippet.create` Plain snippet: create write
- `plain.snippet.delete` Plain snippet: delete destructive
- `plain.snippet.get` Get Plain snippet read
- `plain.snippet.list` List Plain snippets read
- `plain.snippet.update` Plain snippet: update write
- `plain.task.create` Plain task: create write
- `plain.task.delete` Plain task: delete destructive
- `plain.task.get` Get Plain task read
- `plain.task.get_by_ref` Plain task: get by ref read
- `plain.task.list` List Plain tasks read
- `plain.task.update` Plain task: update write
- `plain.team_settings.get` Get Plain team settings read
- `plain.team_settings.upsert` Plain team settings: upsert write
- `plain.tenant.create` Plain tenant: create write
- `plain.tenant.delete` Plain tenant: delete destructive
- `plain.tenant.get` Get Plain tenant read
- `plain.tenant.import` Plain tenant: import write
- `plain.tenant.list` List Plain tenants read
- `plain.tenant.search` Search Plain tenants read
- `plain.tenant.update_tier` Plain tenant: update tier write
- `plain.tenant.upsert` Plain tenant: upsert write
- `plain.tenant_field.delete` Plain tenant field: delete destructive
- `plain.tenant_field.upsert` Plain tenant field: upsert write
- `plain.tenant_field_schema.delete` Plain tenant field schema: delete destructive
- `plain.tenant_field_schema.import` Plain tenant field schema: import write
- `plain.tenant_field_schema.import_from_service` Plain tenant field schema: import from service write
- `plain.tenant_field_schema.list` List Plain tenant field schemas read
- `plain.tenant_field_schema.remove_mapping` Plain tenant field schema: remove mapping destructive
- `plain.tenant_field_schema.setup_mapping` Plain tenant field schema: setup mapping write
- `plain.tenant_field_schema.upsert` Plain tenant field schema: upsert write
- `plain.test_thread.create` Plain test thread: create write
- `plain.test_thread.create_all` Plain test thread: create all write
- `plain.test_thread.delete` Plain test thread: delete destructive
- `plain.test_thread.delete_all` Plain test thread: delete all destructive
- `plain.test_thread.list` List Plain test threads read
- `plain.thread.add_additional_assignees` Plain thread: add additional assignees write
- `plain.thread.assign` Plain thread: assign write
- `plain.thread.change_customer` Plain thread: change customer write
- `plain.thread.change_priority` Plain thread: change priority write
- `plain.thread.create` Plain thread: create write
- `plain.thread.create_from_slack_message` Plain thread: create from slack message write
- `plain.thread.delete` Plain thread: delete destructive
- `plain.thread.escalate` Plain thread: escalate write
- `plain.thread.fork` Plain thread: fork write
- `plain.thread.get` Get Plain thread read
- `plain.thread.get_by_external_id` Plain thread: get by external id read
- `plain.thread.get_by_ref` Plain thread: get by ref read
- `plain.thread.get_by_slack_message` Plain thread: get by slack message read
- `plain.thread.get_by_slack_permalink` Plain thread: get by slack permalink read
- `plain.thread.import` Plain thread: import write
- `plain.thread.import_messages` Plain thread: import messages write
- `plain.thread.list` List Plain threads read
- `plain.thread.list_by_external_id` Plain thread: list by external id read
- `plain.thread.list_deleted` Plain thread: list deleted read
- `plain.thread.list_related` Plain thread: list related read
- `plain.thread.lock` Plain thread: lock write
- `plain.thread.mark_as_done` Plain thread: mark as done write
- `plain.thread.mark_as_todo` Plain thread: mark as todo write
- `plain.thread.remove_additional_assignees` Plain thread: remove additional assignees destructive
- `plain.thread.reply` Plain thread: reply write
- `plain.thread.search` Search Plain threads read
- `plain.thread.share_to_user_in_slack` Plain thread: share to user in slack write
- `plain.thread.snooze` Plain thread: snooze write
- `plain.thread.unassign` Plain thread: unassign destructive
- `plain.thread.update_account` Plain thread: update account write
- `plain.thread.update_agent_status` Plain thread: update agent status write
- `plain.thread.update_escalation_path` Plain thread: update escalation path write
- `plain.thread.update_external_id` Plain thread: update external id write
- `plain.thread.update_sla_policy` Plain thread: update sla policy write
- `plain.thread.update_suggested_action_status` Plain thread: update suggested action status write
- `plain.thread.update_tenant` Plain thread: update tenant write
- `plain.thread.update_tier` Plain thread: update tier write
- `plain.thread.update_title` Plain thread: update title write
- `plain.thread_channel_association.create` Plain thread channel association: create write
- `plain.thread_channel_association.delete` Plain thread channel association: delete destructive
- `plain.thread_channel_association.update_account_membership_policy` Plain thread channel association: update account membership policy write
- `plain.thread_channel_association.update_tenant_membership_policy` Plain thread channel association: update tenant membership policy write
- `plain.thread_cluster.get` Get Plain thread cluster read
- `plain.thread_cluster.get_active` Plain thread cluster: get active read
- `plain.thread_cluster.list` List Plain thread clusters read
- `plain.thread_cluster.list_paginated` Plain thread cluster: list paginated read
- `plain.thread_discussion.change_status` Plain thread discussion: change status write
- `plain.thread_discussion.create` Plain thread discussion: create write
- `plain.thread_discussion.delete` Plain thread discussion: delete destructive
- `plain.thread_discussion.get` Get Plain thread discussion read
- `plain.thread_discussion.import` Plain thread discussion: import write
- `plain.thread_discussion.mark_read` Plain thread discussion: mark read write
- `plain.thread_discussion.send_message` Plain thread discussion: send message write
- `plain.thread_event.create` Plain thread event: create write
- `plain.thread_field.bulk_upsert` Plain thread field: bulk upsert write
- `plain.thread_field.delete` Plain thread field: delete destructive
- `plain.thread_field.upsert` Plain thread field: upsert write
- `plain.thread_field_schema.create` Plain thread field schema: create write
- `plain.thread_field_schema.delete` Plain thread field schema: delete destructive
- `plain.thread_field_schema.get` Get Plain thread field schema read
- `plain.thread_field_schema.list` List Plain thread field schemas read
- `plain.thread_field_schema.reorder` Plain thread field schema: reorder write
- `plain.thread_field_schema.update` Plain thread field schema: update write
- `plain.thread_heatmap_metric.get` Get Plain thread heatmap metric read
- `plain.thread_link.bulk_create` Plain thread link: bulk create write
- `plain.thread_link.bulk_delete` Plain thread link: bulk delete destructive
- `plain.thread_link.create` Plain thread link: create write
- `plain.thread_link.delete` Plain thread link: delete destructive
- `plain.thread_link_candidate.search` Search Plain thread link candidates read
- `plain.thread_link_group.list` List Plain thread link groups read
- `plain.thread_single_value_metric.get` Get Plain thread single value metric read
- `plain.thread_slack_user.get` Get Plain thread slack user read
- `plain.thread_slack_user.search` Search Plain thread slack users read
- `plain.thread_time_series_metric.get` Get Plain thread time series metric read
- `plain.tier.add_members` Plain tier: add members write
- `plain.tier.create` Plain tier: create write
- `plain.tier.delete` Plain tier: delete destructive
- `plain.tier.get` Get Plain tier read
- `plain.tier.list` List Plain tiers read
- `plain.tier.remove_members` Plain tier: remove members destructive
- `plain.tier.update` Plain tier: update write
- `plain.time_series_metric.get` Get Plain time series metric read
- `plain.timeline_entry.get` Get Plain timeline entry read
- `plain.timeline_entry.get_for_thread` Plain timeline entry: get for thread read
- `plain.timeline_entry.list` List Plain timeline entrys read
- `plain.user.add_labels` Plain user: add labels write
- `plain.user.assign_roles` Plain user: assign roles destructive
- `plain.user.change_status` Plain user: change status write
- `plain.user.delete` Plain user: delete destructive
- `plain.user.get` Get Plain user read
- `plain.user.get_by_email` Plain user: get by email read
- `plain.user.invite_to_workspace` Plain user: invite to workspace write
- `plain.user.list` List Plain users read
- `plain.user.remove_labels` Plain user: remove labels destructive
- `plain.user.slack_channel_memberships` Plain user: slack channel memberships read
- `plain.user.sync_working_hours` Plain user: sync working hours write
- `plain.webhook_delivery_attempt.list` List Plain webhook delivery attempts read
- `plain.webhook_event.sample_body` Plain webhook event: sample body read
- `plain.webhook_event_type.list` List Plain webhook event types read
- `plain.webhook_target.create` Plain webhook target: create write
- `plain.webhook_target.delete` Plain webhook target: delete destructive
- `plain.webhook_target.get` Get Plain webhook target read
- `plain.webhook_target.list` List Plain webhook targets read
- `plain.webhook_target.update` Plain webhook target: update write
- `plain.webhook_version.list` List Plain webhook versions read
- `plain.workflow.capabilities` Plain workflow: capabilities read
- `plain.workflow.create` Plain workflow: create write
- `plain.workflow.delete` Plain workflow: delete destructive
- `plain.workflow.export_template` Plain workflow: export template write
- `plain.workflow.get` Get Plain workflow read
- `plain.workflow.list` List Plain workflows read
- `plain.workflow.move` Plain workflow: move write
- `plain.workflow.trigger` Plain workflow: trigger destructive
- `plain.workflow.update` Plain workflow: update write
- `plain.workflow_execution.get` Get Plain workflow execution read
- `plain.workflow_execution.list` List Plain workflow executions read
- `plain.workflow_execution.list_by_entity` Plain workflow execution: list by entity read
- `plain.workflow_execution.list_for_workspace` Plain workflow execution: list for workspace read
- `plain.workflow_rule.create` Plain workflow rule: create write
- `plain.workflow_rule.delete` Plain workflow rule: delete destructive
- `plain.workflow_rule.get` Get Plain workflow rule read
- `plain.workflow_rule.list` List Plain workflow rules read
- `plain.workflow_rule.toggle_published` Plain workflow rule: toggle published write
- `plain.workflow_rule.trigger` Plain workflow rule: trigger destructive
- `plain.workflow_rule.update` Plain workflow rule: update write
- `plain.workflow_share_link.create` Plain workflow share link: create write
- `plain.workflow_share_link.get` Get Plain workflow share link read
- `plain.workflow_step.bulk_upsert` Plain workflow step: bulk upsert write
- `plain.workflow_step.create` Plain workflow step: create write
- `plain.workflow_step.delete` Plain workflow step: delete destructive
- `plain.workflow_step.update` Plain workflow step: update write
- `plain.workflow_template.get` Get Plain workflow template read
- `plain.workflow_template.list` List Plain workflow templates read
- `plain.workspace.get` Get Plain workspace read
- `plain.workspace.update` Plain workspace: update write
- `plain.workspace_chat_settings.get` Get Plain workspace chat settings read
- `plain.workspace_cursor_integration.delete` Plain workspace cursor integration: delete destructive
- `plain.workspace_cursor_integration.get` Get Plain workspace cursor integration read
- `plain.workspace_discord_channel_integration.delete` Plain workspace discord channel integration: delete destructive
- `plain.workspace_discord_channel_integration.get` Get Plain workspace discord channel integration read
- `plain.workspace_discord_channel_integration.list` List Plain workspace discord channel integrations read
- `plain.workspace_discord_integration.delete` Plain workspace discord integration: delete destructive
- `plain.workspace_discord_integration.get` Get Plain workspace discord integration read
- `plain.workspace_discord_integration.list` List Plain workspace discord integrations read
- `plain.workspace_email_domain_settings.create` Plain workspace email domain settings: create write
- `plain.workspace_email_domain_settings.delete` Plain workspace email domain settings: delete destructive
- `plain.workspace_email_settings.add_alternate_support_address` Plain workspace email settings: add alternate support address write
- `plain.workspace_email_settings.get` Get Plain workspace email settings read
- `plain.workspace_email_settings.remove_alternate_support_address` Plain workspace email settings: remove alternate support address destructive
- `plain.workspace_email_settings.update` Plain workspace email settings: update write
- `plain.workspace_email_settings.verify_dns` Plain workspace email settings: verify dns write
- `plain.workspace_email_settings.verify_forwarding` Plain workspace email settings: verify forwarding write
- `plain.workspace_file.create_download_url` Plain workspace file: create download url write
- `plain.workspace_file.create_upload_url` Plain workspace file: create upload url write
- `plain.workspace_file.delete` Plain workspace file: delete destructive
- `plain.workspace_hmac.get` Get Plain workspace hmac read
- `plain.workspace_hmac.regenerate` Plain workspace hmac: regenerate write
- `plain.workspace_invite.delete` Plain workspace invite: delete destructive
- `plain.workspace_invite.list` List Plain workspace invites read
- `plain.workspace_ms_teams_integration.delete` Plain workspace ms teams integration: delete destructive
- `plain.workspace_ms_teams_integration.get` Get Plain workspace ms teams integration read
- `plain.workspace_setup.get` Get Plain workspace setup read
- `plain.workspace_slack_channel_integration.delete` Plain workspace slack channel integration: delete destructive
- `plain.workspace_slack_channel_integration.get` Get Plain workspace slack channel integration read
- `plain.workspace_slack_channel_integration.list` List Plain workspace slack channel integrations read
- `plain.workspace_slack_channel_integration.refresh` Plain workspace slack channel integration: refresh write
- `plain.workspace_slack_integration.delete` Plain workspace slack integration: delete destructive
- `plain.workspace_slack_integration.get` Get Plain workspace slack integration read
- `plain.workspace_slack_integration.list` List Plain workspace slack integrations read
- `plain.workspace_slack_sidekick_integration.delete` Plain workspace slack sidekick integration: delete destructive
- `plain.workspace_slack_sidekick_integration.get` Get Plain workspace slack sidekick integration read
- `plain.workspace_slack_sidekick_integration.refresh` Plain workspace slack sidekick integration: refresh write

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.

## More connectors like Plain

Shares the most action names with

- [Zoho Desk 17](https://actionlake.com/connectors/zoho-desk)
- [SysAid 14](https://actionlake.com/connectors/sysaid)
- [Help Scout 10](https://actionlake.com/connectors/help-scout)
- [Gorgias 10](https://actionlake.com/connectors/gorgias)
- [Birdeye 8](https://actionlake.com/connectors/birdeye)
- [Tidio 6](https://actionlake.com/connectors/tidio)

Joins with, on shared entities

- [HaloPSA 4](https://actionlake.com/connectors/halopsa)
- [Salesforce Sales Cloud 4](https://actionlake.com/connectors/salesforce-sales-cloud)
- [Odoo 4](https://actionlake.com/connectors/odoo)
- [ERPNext (Frappe) 4](https://actionlake.com/connectors/erpnext-frappe)
- [Microsoft Dynamics 365 4](https://actionlake.com/connectors/microsoft-dynamics-365)
- [ServiceTitan 4](https://actionlake.com/connectors/servicetitan)

Browse

- [All Service desk & support connectors](https://actionlake.com/connectors/category/service-desk-and-support)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Plain; the name is the vendor's own. Counts are from the Plain service file, version 1.0.0.

## Give your agent Plain today.

[Connect Plain free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/plain
More: https://actionlake.com/llms.txt
