MCP · PRIVATE BETA

Pliing MCP

Let your AI assistant notify you during work and ask for a choice in Pliing.

Connect your AI assistant

  1. Create a project and connect your PliingID. Approve notification permission under Senders in the app.
  2. Open the project in the console. Under “AI notifications with MCP”, choose the approved recipient and create a named MCP key. Copy it once.
  3. Add a remote MCP server to your AI client using the settings below. Store the key in the client’s secure credentials or environment configuration.
  4. Ask the assistant to send progress, notify completion/failure and use Pliing when it needs your input. Keep the request_id when waiting for an answer.
TransportStreamable HTTP
URLhttps://api.pliing.app/mcp
AuthorizationBearer <your MCP key>

This version uses manually configured Bearer authentication. Clients that only support browser OAuth sign-in need a later OAuth integration. Never paste the key into a conversation. To configure a personal app project through the API, pass mcp_recipient with your PliingID to the existing project token endpoint; ordinary sender keys cannot access MCP.

Codex and Claude Code

Create a separate MCP key for each client. Make PLIING_CODEX_MCP_TOKEN available to the Codex process and PLIING_CLAUDE_MCP_TOKEN available to Claude Code before starting them. The commands below store variable names, not the secrets. Restart or reconnect the client after setup. The Codex app must also have access to its variable; setting it in an unrelated terminal does not update an already running app.

Codex

codex mcp add pliing --url https://api.pliing.app/mcp \
  --bearer-token-env-var PLIING_CODEX_MCP_TOKEN

Equivalent config.toml entry:

[mcp_servers.pliing]
url = "https://api.pliing.app/mcp"
bearer_token_env_var = "PLIING_CODEX_MCP_TOKEN"

Claude Code

claude mcp add --transport http --scope user pliing \
  https://api.pliing.app/mcp \
  --header 'Authorization: Bearer ${PLIING_CLAUDE_MCP_TOKEN}'

Equivalent .mcp.json entry:

{
  "mcpServers": {
    "pliing": {
      "type": "http",
      "url": "https://api.pliing.app/mcp",
      "headers": {
        "Authorization": "Bearer ${PLIING_CLAUDE_MCP_TOKEN}"
      }
    }
  }
}

Official Codex documentation · Official Claude Code documentation

Suggested instruction

Use Pliing to notify me at meaningful milestones, on completion and on failure. When you need my choice, call pliing_ask, keep the request_id, and poll pliing_get_response at the returned interval. Continue only after an explicit answer that permits the requested action. Never treat pending, expired, errors or a timeout as approval. Follow your host’s approval rules.

Three tools

ToolBehavior
pliing_notifySends status, success or failure. Required: title, body, idempotency_key. Optional: level (info/important/critical), url and url_label for an HTTPS result link.
pliing_askAsks with 2–3 choices. Each has a stable value and a label in the user’s language. Returns a durable request_id.
pliing_get_responseReads the status and selected choice. Required: request_id. Pending and expired never mean approval.

The recipient is fixed by the key. Tools have no “to” argument. Accepted means stored by Pliing, not confirmed delivery or reading.

Status example: pliing_notify arguments

{
  "title": "Build complete",
  "body": "All tests passed.",
  "idempotency_key": "build-42-complete",
  "url": "https://ci.example.org/build/42",
  "url_label": "Open result"
}

Ask, wait and continue

Compatible clients negotiate MCP automatically. These curl examples use the supported 2025-11-25 protocol for a manual smoke test.

curl https://api.pliing.app/mcp \
  -H "Authorization: Bearer $PLIING_MCP_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pliing_ask",
    "arguments": {
      "title": "Should I continue?",
      "body": "The tests passed. Should I deploy build 42?",
      "choices": [
        {
          "value": "continue",
          "label": "Continue"
        },
        {
          "value": "cancel",
          "label": "Cancel"
        }
      ],
      "idempotency_key": "build-42-question",
      "context": "build-42",
      "expires_in_seconds": 900
    }
  }
}'

The tool result contains this object in structuredContent:

{
  "request_id": "94876911-92e1-4fa2-bb9c-a57018dc0af0",
  "status": "pending",
  "answer": null,
  "context": "build-42",
  "expires_at": "2026-10-19T12:15:00+00:00",
  "answered_at": null,
  "poll_after_seconds": 5
}

The recipient opens the notification in Pliing and taps one choice. Fetch the answer in a later MCP call:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "pliing_get_response",
    "arguments": {
      "request_id": "94876911-92e1-4fa2-bb9c-a57018dc0af0"
    }
  }
}

When status is answered, answer contains the selected value and label, for example {"value":"continue","label":"Continue"}. Continue only according to that value and the host’s own approval rules. Poll pending requests no more often than every five seconds. Stop polling when answered or expired.

Limits and important behavior

← API reference