MCP · PRIVATE BETA
Pliing MCP
Let your AI assistant notify you during work and ask for a choice in Pliing.
Connect your AI assistant
- Create a project and connect your PliingID. Approve notification permission under Senders in the app.
- Open the project in the console. Under “AI notifications with MCP”, choose the approved recipient and create a named MCP key. Copy it once.
- 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.
- 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.
| Transport | Streamable HTTP |
|---|---|
| URL | https://api.pliing.app/mcp |
| Authorization | Bearer <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
| Tool | Behavior |
|---|---|
pliing_notify | Sends status, success or failure. Required: title, body, idempotency_key. Optional: level (info/important/critical), url and url_label for an HTTPS result link. |
pliing_ask | Asks with 2–3 choices. Each has a stable value and a label in the user’s language. Returns a durable request_id. |
pliing_get_response | Reads 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
- One key grants access to one project and one approved recipient. It cannot read the inbox, retrieve codes, manage accounts, send to another recipient or answer its own questions. Revocation and subscription rules still apply.
- A question accepts exactly one final choice. Repeating that choice is idempotent. A different choice returns 409; an unanswered expired question returns 410 when pressed.
- Questions expire after 15 minutes by default; choose 60–86400 seconds. Answered requests retain their final answer until the notification is removed by normal retention or account deletion.
- Reuse the same idempotency_key and arguments for retries. Changing arguments or expiry conflicts. Keys use 8–96 letters, numbers or _.:-. Choice values use 1–64 of those characters; labels are 1–30 characters without control characters. Titles: 160; body: 4000. All limits count characters.
- 60 MCP requests per minute per key, including polling and discovery. Honor HTTP 429 and Retry-After. Tool validation and business failures use isError=true; authentication failures use HTTP 401/403.
- Buttons currently appear inside the notification in the app. Lock-screen action buttons are not included. Pending or expired requests never resume work automatically. Automatic continuation depends on the AI host; this release uses durable polling and does not advertise MCP Tasks.
- Use Norwegian or English for the recipient’s text and labels. Avoid secrets or full conversation transcripts. A button records user input; Pliing does not execute commands, deploy changes or bypass the AI client’s approval rules.
- Browser clients must use an allowed Origin. The operator configures additional trusted origins with MCP_ALLOWED_ORIGINS. Native clients normally do not send Origin.