---
title: MCP
status: current
phase: 5
order: 1
---

# MCP

Pluma has a remote [MCP](https://modelcontextprotocol.io) server. Your agent (Claude Code, Claude, Cursor, ChatGPT) connects to it once and then manages your content with tools, without writing `curl`.

```
https://pluma.so/mcp
```

`POST /mcp`

- **Streamable HTTP** transport, stateless: every request stands on its own.
- The tools are a thin layer over the same logic as the [Management API](../api/management.md): same validations, same errors with `fix` and `doc_url`.

## Authentication

Two ways, same result: a token for **one site**, and the tools work on that site.

- **OAuth** (the usual way): the client opens a Pluma screen, you pick the site and approve. See [MCP OAuth](oauth.md).
- **Direct token**: your agent's token (`pluma_agt_…`, from [step 2](../guides/invite-your-agent.md)) or a `management` key, as an `Authorization: Bearer …` header. For agents without a browser.

## Connect it

**Claude Code** (OAuth: then run `/mcp` and pick "Authenticate"):

```sh
claude mcp add --transport http pluma https://pluma.so/mcp
```

With a direct token:

```sh
claude mcp add --transport http pluma https://pluma.so/mcp --header "Authorization: Bearer $PLUMA_KEY"
```

**Cursor** (`.cursor/mcp.json`) and other clients with a JSON config:

```json
{
  "mcpServers": {
    "pluma": {
      "url": "https://pluma.so/mcp",
      "headers": { "Authorization": "Bearer pluma_agt_…" }
    }
  }
}
```

Then ask your agent, for example: "With Pluma, show me the draft events and publish the Open House."

## Errors

If a tool fails, the response is a result with `isError: true` and the same error JSON as the API:

```json
{ "error": { "code": "validation_failed", "message": "…", "fix": "…", "doc_url": "…", "details": { "fields": { "slug": ["is required to publish"] } } } }
```

A missing or bad token gives HTTP 401 with [`missing_key`](../errors/missing_key.md) or [`invalid_key`](../errors/invalid_key.md).

The list of tools is in [MCP tools](tools.md).
