# Connecting AI assistants (MCP)

Connect Claude, ChatGPT, Cursor, VS Code, Gemini or any MCP-capable client to your Postify workspace with the Postify MCP server.



Postify runs a remote MCP (Model Context Protocol) server, so AI assistants like Claude — and any MCP-capable client — can work with your workspace: list and read posts, create drafts, reschedule, check analytics, and more.

**Server URL:** `https://app.usepostify.com/api/mcp` (Streamable HTTP transport)

## Connect from any MCP client [#connect-from-any-mcp-client]

[![Add to Claude](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-claude-light.svg)](https://claude.ai/directory/79805368-b72a-4946-9a49-49b140bf64f2)

[![Add to ChatGPT](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-chatgpt-light.svg)](https://chatgpt.com/plugins/plugin_asdk_app_6a7ae2565a148191802be85a9bf06ab2)

[![Add to Cursor](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-cursor-light.svg)](https://cursor.com/install-mcp?name=postify&config=eyJ1cmwiOiJodHRwczovL2FwcC51c2Vwb3N0aWZ5LmNvbS9hcGkvbWNwIn0%3D)

[![Add to VS Code](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-vscode-light.svg)](https://insiders.vscode.dev/redirect/mcp/install?name=postify&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapp.usepostify.com%2Fapi%2Fmcp%22%7D)

[![Add to Kiro](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-kiro-light.svg)](https://kiro.dev/launch/mcp/add?name=postify&config=%7B%22url%22%3A%22https%3A%2F%2Fapp.usepostify.com%2Fapi%2Fmcp%22%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D)

[![Add to Replit](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-replit-light.svg)](https://replit.com/integrations?mcp=eyJkaXNwbGF5TmFtZSI6IlBvc3RpZnkiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hcHAudXNlcG9zdGlmeS5jb20vYXBpL21jcCJ9)

[![Add to Antigravity](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-antigravity-light.svg)](#connect-antigravity)

[![Add to Gemini](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-gemini-light.svg)](#connect-gemini)

[![Add to Codex](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-codex-light.svg)](#connect-chatgpt)

[![Add to Perplexity](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-perplexity-light.svg)](#connect-chat-apps)

[![Add to Mistral](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-mistral-light.svg)](#connect-chat-apps)

[![Add to Grok](https://cdn.jsdelivr.net/gh/DevinoSolutions/mcp-servers@main/badges/add-to-grok-light.svg)](#connect-chat-apps)

Buttons for Claude and ChatGPT open Postify's listing in that app's directory; the others install directly or jump to the instructions.

Postify's MCP server is a hosted Streamable HTTP endpoint with OAuth 2.1 sign-in. There is nothing to install or run: point the client at the URL below and sign in to Postify when the browser opens. Every client that supports remote MCP servers with OAuth works; the ones below are the common ones.

```
https://app.usepostify.com/api/mcp
```

No API key is needed. The client registers itself via dynamic client registration and walks an OAuth 2.1 flow in your browser, where you sign in and approve scopes on a consent screen. PKCE is required, and refresh tokens rotate on use. Discovery documents live at `/.well-known/oauth-protected-resource` and `/.well-known/oauth-authorization-server`.

### Claude (claude.ai, Claude Desktop, Claude Code) [#claude-claudeai-claude-desktop-claude-code]

* **Fastest: [Add to Claude](https://claude.ai/directory/79805368-b72a-4946-9a49-49b140bf64f2)** opens Postify in Claude's connector directory. Click *Connect*, then sign in. The connector syncs to Claude Desktop and mobile.
* **Manual (claude.ai / Claude Desktop):** Settings → Connectors → *Add custom connector*, paste the URL, then sign in — or [open the dialog pre-filled](https://claude.ai/customize/connectors?modal=add-custom-connector\&connectorName=Postify\&connectorUrl=https%3A%2F%2Fapp.usepostify.com%2Fapi%2Fmcp).
* **Claude Code:** `claude mcp add --transport http postify https://app.usepostify.com/api/mcp` then `/mcp` to sign in.

### ChatGPT and Codex [#connect-chatgpt]

* **ChatGPT — fastest:** [open Postify's ChatGPT app](https://chatgpt.com/plugins/plugin_asdk_app_6a7ae2565a148191802be85a9bf06ab2), add it and sign in.
* **Manual (ChatGPT):** Settings → Apps & Connectors → *Create* (developer mode), name it Postify, paste the URL, authentication *OAuth*.
* **Codex CLI:** add to `~/.codex/config.toml`:

```toml
[mcp_servers.postify]
url = "https://app.usepostify.com/api/mcp"
```

### Cursor [#cursor]

One click: [Add to Cursor](https://cursor.com/install-mcp?name=postify\&config=eyJ1cmwiOiJodHRwczovL2FwcC51c2Vwb3N0aWZ5LmNvbS9hcGkvbWNwIn0%3D). Or in `.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "postify": {
      "url": "https://app.usepostify.com/api/mcp"
    }
  }
}
```

### VS Code and GitHub Copilot [#vs-code-and-github-copilot]

One click: [Add to VS Code](https://insiders.vscode.dev/redirect/mcp/install?name=postify\&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapp.usepostify.com%2Fapi%2Fmcp%22%7D). Or run *MCP: Add Server* → *HTTP* and paste the URL, which writes to `.vscode/mcp.json`:

```json
{
  "servers": {
    "postify": {
      "type": "http",
      "url": "https://app.usepostify.com/api/mcp"
    }
  }
}
```

### Google Antigravity [#connect-antigravity]

Install the plugin from the repository (or from the Antigravity Marketplace once listed):

```bash
agy plugin install https://github.com/DevinoSolutions/mcp-servers/antigravity-plugins/postify
```

Or add the server by hand in `~/.gemini/config/mcp_config.json` (Antigravity requires the `serverUrl` key):

```json
{
  "mcpServers": {
    "postify": {
      "serverUrl": "https://app.usepostify.com/api/mcp"
    }
  }
}
```

### Gemini [#connect-gemini]

* **Gemini app:** Settings → Connected apps → *Custom apps* → *Add a custom app*, paste the URL, then mention `@Postify` in a chat. (Custom apps are currently limited to personal Google accounts in the US.)
* **Gemini CLI:** `gemini extensions install https://github.com/DevinoSolutions/mcp-servers` then `/mcp auth postify`, or add `{ "mcpServers": { "postify": { "httpUrl": "https://app.usepostify.com/api/mcp" } } }` to `~/.gemini/settings.json`.

### Kiro [#kiro]

One click: [Add to Kiro](https://kiro.dev/launch/mcp/add?name=postify\&config=%7B%22url%22%3A%22https%3A%2F%2Fapp.usepostify.com%2Fapi%2Fmcp%22%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D). Or in `.kiro/settings/mcp.json`:

```json
{
  "mcpServers": {
    "postify": {
      "url": "https://app.usepostify.com/api/mcp"
    }
  }
}
```

### Perplexity, Mistral Le Chat, Grok [#connect-chat-apps]

* **Perplexity** (Pro, Max, Enterprise): Settings → Connectors → *Custom connector*, paste the URL, authentication *OAuth*.
* **Mistral Le Chat** (all plans): Intelligence → Connectors → *Add Connector* → *Custom MCP Connector*, paste the URL.
* **Grok:** grok.com → Connectors → *New connector* → *Custom*, paste the URL.

### Other clients [#other-clients]

* **Replit:** [Add to Replit](https://replit.com/integrations?mcp=eyJkaXNwbGF5TmFtZSI6IlBvc3RpZnkiLCJiYXNlVXJsIjoiaHR0cHM6Ly9hcHAudXNlcG9zdGlmeS5jb20vYXBpL21jcCJ9), or Integrations → *Add MCP server*.
* **Devin, Windsurf, Zed, JetBrains Junie, Cline, OpenCode:** add a remote (HTTP) MCP server with the URL above; each prompts for the OAuth sign-in on first use. Cline can also install it from the [Cline marketplace entry](https://github.com/DevinoSolutions/mcp-servers/tree/main/postify) using its `llms-install.md`.

Tokens are scoped to what you approve on the consent screen; a tool you did not grant is never shown to the assistant. Revoke access at any time under Settings, then API Keys, then Connected AI apps — see [Managing connections](#managing-connections).

## Scopes [#scopes]

You approve exactly which scopes a client gets. Tools outside the granted scopes are not even listed to the client.

| Scope            | Grants                                                                                         |
| ---------------- | ---------------------------------------------------------------------------------------------- |
| `posts:read`     | List and read posts, search the media library                                                  |
| `posts:write`    | Create drafts and reschedule; publish/delete sit behind an extra toggle                        |
| `channels:read`  | List connected channels                                                                        |
| `channels:write` | Hand you the link to connect a social account (you approve the connection in your own browser) |
| `inbox:read`     | Read the inbox — mentions, comments and direct messages from connected accounts                |
| `analytics:read` | Read workspace analytics                                                                       |
| `ai:generate`    | AI suggestions (optimal posting times)                                                         |
| `offline_access` | Refresh tokens — stay connected without re-consenting                                          |

## Workspaces [#workspaces]

If you belong to more than one workspace, the consent screen also asks which ones the assistant may use: only the workspace you are working in (the default), a list you tick, or all of them. "All my workspaces" includes workspaces you join later, and access to any workspace ends when you leave it.

Every tool call acts on one workspace. A connection granted a single workspace never has to name it. A connection granted several calls `list_workspaces` and passes the chosen id as the `workspaceId` argument of every other tool.

## Tools [#tools]

| Tool                   | Scope            | What it does                                                                                                                      |
| ---------------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `list_posts`           | `posts:read`     | Recent posts with status and per-channel delivery outcomes                                                                        |
| `get_post`             | `posts:read`     | One post in full: variants, schedule, delivery attempts                                                                           |
| `get_schedule`         | `posts:read`     | Scheduled posts inside a date window — "what's going out this week"                                                               |
| `search_media_library` | `posts:read`     | Find images/videos in the workspace media library                                                                                 |
| `list_inbox_items`     | `inbox:read`     | Mentions, comments, replies and DMs synced from connected channels                                                                |
| `list_channels`        | `channels:read`  | Connected social accounts with platform and handle                                                                                |
| `get_connect_links`    | `channels:write` | The link to connect each social network to this workspace; see [Connecting a channel through an assistant](#connecting-a-channel) |
| `get_analytics`        | `analytics:read` | Workspace KPIs: published, scheduled, delivery success rate                                                                       |
| `create_draft`         | `posts:write`    | Create a draft (never publishes — a human reviews it in the app)                                                                  |
| `reschedule_post`      | `posts:write`    | Move a scheduled post to a new time                                                                                               |
| `suggest_optimal_time` | `ai:generate`    | AI-suggested best posting times for selected platforms                                                                            |
| `search_docs`          | —                | Search Postify's public API docs (endpoints, error codes, webhooks, scopes); available to every connected assistant               |
| `publish_now`          | `posts:write`    | Publish a post to its live channels immediately (dangerous)                                                                       |
| `delete_post`          | `posts:write`    | Soft-delete a post, history preserved (dangerous)                                                                                 |
| `list_workspaces`      | —                | The workspaces this connection may use (id, name, your role); available to every connected assistant                              |

## Connecting a channel through an assistant [#connecting-a-channel]

Ask the assistant to connect a network and it calls `get_connect_links`, then gives you a link. Open it in the browser where you are signed in to Postify:

* For most networks the link goes straight to the network's own sign-in and approval page, then back to Postify.
* For a network that has no such page (an app password, a bot token or a webhook URL), the link opens a short form in Postify's Channels page. You type the credential there, never into the chat.

The link holds no password or token. It connects whatever account you approve to the workspace your browser has open, and it is refused if that is not the workspace the assistant asked for. When you are done, the assistant calls `list_channels` to confirm the channel is connected. Networks marked coming soon cannot be connected yet.

## Dangerous operations [#dangerous-operations]

`publish_now` and `delete_post` are blocked for all connected AI credentials by default. A workspace owner opts in with the "Dangerous AI operations" switch under Settings, then API Keys. Even with the toggle on, each call is a two-step: the first call returns `CONFIRMATION_REQUIRED` with a `confirmToken`; after you explicitly confirm, the client re-calls with the same arguments plus the token. Tokens expire after 10 minutes and are bound to the exact tool and arguments they were minted for.

## Structured denials [#structured-denials]

A blocked tool call is not a transport error — it returns `isError: true` with machine-readable `structuredContent` the agent can act on, carrying a stable `code` and (where useful) a `settingsUrl`, a `requiredScope`, a `confirmToken`, and a `docs` link back to this page.

| Code                     | When you get it, and what resolves it                                                                                                                                                   |
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SCOPE_MISSING`          | The connection was never granted the scope this tool needs. Reconnect and approve the missing scope on the consent screen.                                                              |
| `DANGEROUS_OPS_DISABLED` | `publish_now` or `delete_post` while the workspace toggle is off. The denial's `settingsUrl` deep-links an owner straight to the switch.                                                |
| `CONFIRMATION_REQUIRED`  | A dangerous tool was called without a `confirmToken`. The denial carries a fresh token — confirm with the user, then re-call with the SAME arguments plus the token (valid 10 minutes). |
| `QUOTA_EXCEEDED`         | The workspace's monthly quota for the operation (posts, AI credits) is exhausted. Retrying is pointless until it resets.                                                                |
| `WORKSPACE_REQUIRED`     | The connection was granted several workspaces and the call named none. The denial lists them (`workspaces`); re-call with one as `workspaceId`.                                         |
| `WORKSPACE_NOT_FOUND`    | The `workspaceId` is not one this connection may use. The same answer is given for an id that does not exist at all.                                                                    |
| `NO_WORKSPACE_ACCESS`    | You no longer belong to any workspace this connection was granted. Reconnect to choose again.                                                                                           |
| `TOOL_EXECUTION_FAILED`  | Anything else — the generic failure. Details never include third-party error bodies.                                                                                                    |

## Managing connections [#managing-connections]

Connected clients — with their granted scopes and last-used time — are listed under Settings, then API Keys, then Connected AI apps. Disconnecting revokes consent and refresh tokens immediately; any access token the client still holds expires within the hour. Every tool call, allowed or denied, is written to the workspace audit trail.

