# MCP server (/developers/mcp)



The Paragraph MCP server lets AI tools read and write your publication: draft and publish posts, upload short-form drafts, manage subscribers, and query analytics.

<Callout type="info">
  This page connects your AI tools to Paragraph. To connect other tools to your Paragraph agent instead, see [agent connections](/agent/connections).
</Callout>

## Connect the hosted server [#connect-the-hosted-server]

The hosted server at `https://mcp.paragraph.com/mcp` needs no install. The first time you connect, Paragraph opens in your browser so you can approve access.

<Tabs items="[&#x22;Claude Code&#x22;, &#x22;Claude Desktop and Cursor&#x22;, &#x22;VS Code&#x22;]">
  <Tab value="Claude Code">
    ```bash
    claude mcp add paragraph --transport http https://mcp.paragraph.com/mcp
    ```
  </Tab>

  <Tab value="Claude Desktop and Cursor">
    Add this to `claude_desktop_config.json`, or to `.cursor/mcp.json` in your project:

    ```json
    {
      "mcpServers": {
        "paragraph": { "url": "https://mcp.paragraph.com/mcp" }
      }
    }
    ```
  </Tab>

  <Tab value="VS Code">
    Add this to `.vscode/mcp.json` in your project:

    ```json
    {
      "servers": {
        "paragraph": { "url": "https://mcp.paragraph.com/mcp" }
      }
    }
    ```
  </Tab>
</Tabs>

## Run it locally [#run-it-locally]

The same server runs over stdio with `npx @paragraph-com/mcp` (Node.js 18 or later). It uses the `PARAGRAPH_API_KEY` environment variable if set, and otherwise the key saved by [`paragraph login`](/developers/cli#sign-in). For example, in Claude Desktop:

```json
{
  "mcpServers": {
    "paragraph": {
      "command": "npx",
      "args": ["@paragraph-com/mcp"],
      "env": { "PARAGRAPH_API_KEY": "your-api-key" }
    }
  }
}
```

Other clients take the same `command`, `args`, and `env`. Add `--http --port 3100` to serve over HTTP on `127.0.0.1` instead, with a health check at `GET /health`.

## Tools [#tools]

Reading public posts, publications, and search results works without signing in. Everything else needs access to your publication.

| Toolset          | Tools                                                                                                   |
| ---------------- | ------------------------------------------------------------------------------------------------------- |
| **posts**        | `get-post`, `list-posts`, `create-post`, `update-post`, `delete-post`, `send-test-email`                |
| **content**      | `create-content`, `list-content`, `get-content`, `update-content`, `archive-content`, `restore-content` |
| **buckets**      | `list-content-buckets`, `get-content-bucket`, `get-post-content-bucket`, `create-post-content-bucket`   |
| **publications** | `get-publication`, `update-publication`                                                                 |
| **subscribers**  | `list-subscribers`, `get-subscriber-count`, `add-subscriber`, `remove-subscriber`                       |
| **users**        | `get-user`                                                                                              |
| **search**       | `search-posts`, `search-blogs`                                                                          |
| **feed**         | `get-feed`                                                                                              |
| **me**           | `get-me`                                                                                                |
| **analytics**    | `analytics-query`, `analytics-schema`                                                                   |
| **emails**       | `send-custom-email`                                                                                     |

The **content** tools draft X posts and threads, LinkedIn posts, one-off emails, and X Articles into the library without sending them. The **buckets** tools group those drafts with the post they came from. See [Drafted content](/developers/content).

`update-post` can also email a post to subscribers without putting it on your website (`publishOnline: false`), or point its canonical URL at where it first appeared (`canonicalUrl`). Connected agents get this guidance automatically, so asking for it in plain words works.

To keep an agent's context small, load only the toolsets it needs:

```bash
npx @paragraph-com/mcp --toolsets posts,search
```

## Source [#source]

The server is open source on [GitHub](https://github.com/paragraph-xyz/paragraph-mcp) and published to [npm](https://www.npmjs.com/package/@paragraph-com/mcp).
