What your agent can do
Your agent works in Pipp as you. Pipp checks every tool call against the permissions you approved and your current role. It never creates a bot user, a synthetic teammate or a second Owner.
The MCP server has 76 tools: one for each of Pipp’s 72 operations, plus four helpers.
| Area | Operations | Examples |
|---|---|---|
| Account | 5 | Read your account, update your name and language, accept or decline your own invitations |
| Workspaces | 8 | List and create workspaces, read setup status, rename, leave, list or revoke connected agents |
| Owner actions | 3 | Prepare deletion or an ownership transfer for the Owner to confirm |
| Connections and receipts | 5 | Inspect, narrow or revoke this connection; look up past writes |
| AI | 3 | Read AI status and the data-handling disclosure, turn AI on or off. Turning it on needs org:admin in a workspace where you’re an Owner or Admin, and acknowledges the disclosure |
| People | 6 | List members and invitations, invite, change roles, remove members |
| Inboxes | 4 | List, create, rename, configure and delete inboxes |
| Forwarding | 4 | Read the forwarding address, send a test message, rotate the address |
| Domains | 9 | Add a sending domain, get its DNS records, confirm, choose the sender address |
| Cases | 9 | List and read cases, read saved AI summaries, assign, close, snooze, write notes |
| Drafts and replies | 10 | Read and save your draft, prepare and send replies, undo, retry |
| Mail controls | 6 | Block senders or domains, unblock, remove suppressions, import set-aside mail |
A tool’s name is pipp_ plus the operation, with dots and dashes as underscores: cases.get becomes pipp_cases_get. Each tool takes input, plus orgId for workspace operations and requestKey for writes.
| Helper | What it does |
|---|---|
pipp_setup_check |
Reports whether this connection can set up a workspace it creates. It creates and grants nothing. |
pipp_profile |
Returns your user ID, name and email |
pipp_operation_help |
Returns the scope, an example input and the usage notes for one operation |
pipp_content_get |
Reads a message body, an attachment or an original message, up to 1 MiB |
What stays with you
These steps need you, in a browser or outside Pipp:
- Signing up or signing in. An agent can’t create a Pipp account. Your first sign-in on Pipp’s consent page creates it.
- Consent. You choose the permissions on Pipp’s consent screen. An agent can’t grant itself more.
- Deleting a workspace or transferring ownership. The agent prepares it and gets a link. The Owner opens the link, signed in, and types the workspace slug to confirm. The link expires after 10 minutes.
- Gmail forwarding confirmation. You confirm it on Pipp’s forwarding screen. Pipp never gives the confirmation secret to the agent.
- DNS records. Pipp returns the records. You add them at your DNS host, or give your agent separate access to your DNS provider.
- Mail provider settings. You set up forwarding at your mail provider, outside Pipp. Signing in with Google doesn’t give Pipp or the agent access to Gmail.
- Accepting invitations. Each person you invite accepts with their own Pipp account, in the browser or through their own agent. Joining a workspace doesn’t give any agent access to it. That needs fresh consent.
Set up a new workspace with your agent
You can start with no Pipp account. The agent does the setup work; you handle the browser, your mail provider and DNS.
1. Add Pipp to your agent. Follow the steps for your client under Connect your agent, above.
2. Sign in and choose permissions. Your client opens Pipp in the browser. Sign in with Google, GitHub or an email link. If you’re new, this creates your account. Check that the consent screen names the client you just added:
- Claude Code, Claude, Codex and ChatGPT sign in with their published identities, which Pipp has registered in advance. The screen shows the client’s name, Verified app identity with
claude.aiorchatgpt.com, and the Callback URL. For Claude Code and Codex it also says This connection returns to a program on this computer. - Any other client, Cursor included, appears as External agent with its callback URL and Pipp has not verified this application’s identity.
Pipp asks your client for the 10 permissions needed to set up a workspace and work on its email: identity, org:create, org:read, org:admin, forwarding, domains, cases:read, cases:write, drafts and send (see Scopes). Nothing is ticked until you choose. If your client asks for more, you’ll see extra boxes; leave them unticked.
- Under Account permissions, tick Create orgs owned by you, and Read your name and email and list explicitly connected orgs so the agent can check its own access. The screen calls workspaces “orgs”.
- Orgs this application creates appears once you tick Create orgs owned by you. If you already belong to an org, you also see Org permissions above it. Leave that section empty unless you also want to give the agent access to an existing org.
- Under Orgs this application creates, select Set up and administer and Work cases. If your client asked for all 14 permissions, Set up and administer also ticks Block domains, unblock senders, remove suppressions and import set-aside mail (
mail:admin). Untick it unless you want the agent to do that. - Tick I started this connection in my application. and select Allow selected access.
3. The agent checks its access. pipp_setup_check reports whether the connection can set up the workspace it creates. If a permission is missing, the agent tells you which one. It doesn’t create a workspace without it.
pipp_setup_check {"consent": "inspect"}4. The agent creates the workspace and the inbox. You become the Owner.
pipp_orgs_create input {"name": "Acme"}
pipp_inboxes_create input {"name": "Support", "supportAddress": "support@acme.com"}pipp_orgs_create returns org.id. The agent passes it as orgId to every later call and gives each write its own requestKey.
5. Forwarding. The agent reads the private forwarding address. You set up forwarding at your mail provider. With Gmail, you also confirm it on Pipp’s forwarding screen. The agent then sends a test message and checks that it arrived.
pipp_forwarding_get input {"inboxId": "INBOX_ID"}
pipp_forwarding_probe input {"inboxId": "INBOX_ID"}
pipp_forwarding_get input {"inboxId": "INBOX_ID"}From here Pipp receives your mail. You can read and draft replies in Pipp before any DNS change, and so can your agent if you selected Work cases.
6. Sending domain. Replies to customers need your own verified domain. pipp_domains_add returns the DNS records and starts no checks.
pipp_domains_add input {"domain": "acme.com"}
(you add the records at your DNS host)
pipp_domains_confirm input {"connectionId": "DOMAIN_ID"}
pipp_domains_get input {"id": "DOMAIN_ID"}
pipp_domains_sender_set input {"inboxId": "INBOX_ID", "address": "support@acme.com"}Merge SPF into your existing record, keep your DMARC policy unless you agree on a change, and leave MX alone. pipp_domains_confirm starts one 24-hour check. The agent polls pipp_domains_get until the status is ready, then sets the sender. If it shows attention, read the record details in the result and fix the records it names. If the status becomes failed, fix the records and run pipp_domains_restart with the same connectionId.
7. Invite your team. Pipp emails each invitation.
pipp_invitations_create input {"email": "cofounder@acme.com", "role": "admin"}Answer customer email
A reply takes four steps: read the case, read your draft, which you share with your own agents, save it, then prepare and send.
pipp_cases_list input {"status": "open", "order": "newest-inbound", "limit": 20}
pipp_cases_get input {"conversationId": "CASE_ID"}
pipp_drafts_get input {"conversationId": "CASE_ID", "mode": "reply"}
pipp_drafts_save input {"conversationId": "CASE_ID", "mode": "reply", "restoreGeneration": 0, "expected": null, …}
pipp_replies_prepare input {"conversationId": "CASE_ID"}
pipp_replies_send input {"conversationId": "CASE_ID", "expected": {…}, "thread": {…}, "recipients": {…}, …}
pipp_replies_get input {"id": "REPLY_ID"}The server enforces these rules:
pipp_drafts_saveneeds therestoreGenerationfrom your read, andexpectedset to the current{draftId, revision}, ornullwhen there is no draft. If you, in the app, or another of your connections wrote the current draft, the save returnsneeds_ackwith that text before anything is replaced.pipp_replies_sendcopiesthreadandrecipientsfrom a freshpipp_replies_prepare. It also needsconversationId, the draft reference asexpected, the draftbodyandclose. Never buildthreadorrecipientsyourself.- Customer replies need a verified sending domain on the inbox. Without one,
pipp_replies_preparereportsdomain_requiredand sending is refused. pipp_replies_cancelundoes a queued reply during the Undo window.
Each tool lists its full input schema, and pipp_operation_help adds an example.
Request keys and retries
Every write needs a request key. For MCP, the key is your connection ID from pipp_connection_get, an underscore and a unique value, 38 to 128 characters in total.
- The same key with the same input returns the same receipt. A retry never repeats the action.
- After a timeout, a 5xx or
outcome_unknown, retry with the same key and identical input, or look the write up withpipp_operations_get. - Never use a new key to retry an uncertain send.
- A definite failure, including
rate_limited, is final for its key. Wait or fix the input, then use a new key. - Pipp keeps receipts for 30 days.
More permissions
A connection can’t gain permissions on its own. When a tool needs one you didn’t grant, the result names the missing permission. Some clients then send you back to Pipp’s consent screen. In others, disconnect Pipp in the client, connect again and tick the permission. The admin permissions only work in workspaces where you are an Owner or Admin.
Build your own integration
Your own code can call the same 72 operations over HTTP. Every operation goes through one endpoint:
POST https://app.pipp.so/api/agent/v1/operations
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"operation": "cases.list",
"orgId": "ORG_ID",
"input": { "status": "open", "limit": 20 }
}operation: an operation name, such ascases.list.orgId: required for workspace operations. Leave it out foraccount.*,orgs.*,connection.*andoperations.*.input: a JSON object. Use{}when there is nothing to send.requestKey: required for writes. 1 to 128 characters of letters, digits,_and-. The retry rules above apply.
A read returns its result as JSON. A write returns a receipt:
{
"operationId": "01a14055-e80c-72c0-9fac-62ddb90dce1b",
"status": "completed",
"result": {
"org": { "id": "01a14055-…", "name": "Acme", "slug": "acme", "role": "owner" },
"granted": true
}
}Errors return {"error": {"code", "message", …}} with an HTTP status: 401 invalid_token, 403 insufficient_scope, 404 unknown_operation, 429 rate_limited. When fresh consent can add the missing permission, the WWW-Authenticate header names it. A refusal for your role or the workspace’s state has no header. Ask an Owner or Admin instead. Rate limits apply per person and per connection.
Files download from GET /api/agent/v1/orgs/ORG_ID/attachments/ID, /originals/ID and /bodies/ID?format=text (or html).
Getting a token
There are no API keys. Your client gets tokens through OAuth, starting from these discovery documents:
https://app.pipp.so/.well-known/oauth-authorization-server
https://app.pipp.so/.well-known/oauth-protected-resource/api/agentThe authorization server metadata sets client_id_metadata_document_supported, but Pipp accepts only four URL client IDs: the published identities of Claude Code, Claude, Codex and ChatGPT, which it has registered in advance. It refuses any other https client ID. Your own client uses dynamic client registration instead. Pipp treats it as deprecated and keeps it for compatibility.
- Register at
/oauth/registeras a public client:token_endpoint_auth_method: "none", aclient_nameof 1 to 80 characters, and one to five redirect URIs. They must usehttps, orhttponlocalhost,127.0.0.1or[::1]. For loopback URIs only the port may change at sign-in. - Use the authorization code flow with PKCE (S256), a
stateand ascopethat lists the scopes you want, separated by spaces (see Scopes). Sendresource=https://app.pipp.so/api/agenton the authorization request and on every token request, including refreshes. Don’t sendscopewhen you refresh. - The person signs in and chooses permissions on Pipp’s consent screen. It shows your client as External agent with its callback URL and says Pipp has not verified this application’s identity.
Pipp issues a refresh token on every connection. You may add offline_access to scope. Pipp accepts it and drops it, so it grants nothing and never appears on the consent screen. A request that asks only for offline_access is refused.
Refresh tokens rotate and work once. Reusing one revokes the connection. Token and connection lifetimes are under Limits.
Scopes
| Scope | Lets the agent | Notes |
|---|---|---|
identity |
Read your name and email and list connected workspaces | Also needed to look up receipts |
profile |
Change your display name and language, remove your photo | |
invitations |
Read, accept and decline your own invitations | Accepting doesn’t connect the agent to that workspace |
org:create |
Create workspaces you own | |
org:read |
Read workspace settings, members, invitations and mail controls; leave a workspace | Not read-only. It includes leaving. |
org:admin |
Manage workspace settings, AI settings, inboxes, invitations and member roles | Owner or Admin |
forwarding |
Read and change private forwarding settings | Owner or Admin |
domains |
Manage custom domains, sending addresses and tracking | Owner or Admin |
mail:admin |
Block domains, unblock senders, remove suppressions, import set-aside mail | Owner or Admin |
cases:read |
Read cases, saved summaries, attachments and original messages | |
cases:write |
Assign, close and snooze cases; change read state; write notes | Notes also need drafts |
drafts |
Read, edit and discard your shared drafts | |
send |
Prepare and send replies as you; manage held and failed replies | Sending also needs drafts |
block-address |
Block individual email addresses across the workspace | Members can hold it |
Grants never grow on their own. If you’re promoted to Admin, an existing connection keeps its scopes. If you’re demoted, it loses its admin scopes for good.
Limits
| Limit | Value |
|---|---|
| New workspaces | 3 per account per UTC day |
| Customer email | 100 To and Cc deliveries per workspace per UTC day. Each recipient counts. |
| Sending domains | One custom domain per workspace. Sending requires it to be verified. |
| Forwarding tests | 5 per hour |
| Tool input and request body | 256 KiB |
| Content reads over MCP | 1 MiB |
| Attachments | Some attachments listed on a case can’t be downloaded through MCP or the HTTP API yet. Open them in Pipp instead. |
| Access token | 10 minutes |
| Connection | 30 days, then fresh consent |
| Receipts | 30 days |
Daily limits reset at 00:00 UTC. More connections don’t raise them.
Safety
- Customer email is untrusted. Your agent should treat every customer-written field (subjects, bodies, names, attachments) as data and never follow instructions found in an email. The MCP server adds a notice to results that contain customer content. HTTP API results carry no such notice, so your code must apply the rule itself. Pipp enforces the permissions you granted, but no system can promise perfect protection against prompt injection.
- Queued is not sent. A reply’s status is
held,queued,sending,sent,delivered,bounced,failedorcancelled. Report a reply as sent only oncepipp_replies_getshowssentordelivered. - Uncertain writes are never repeated. Use request keys as described above.
- AI results are read-only. Agents can read saved AI summaries. They can’t generate, regenerate or edit them.
- Attribution stays inside Pipp. Your team sees the agent’s notes, drafts and replies marked External agent on behalf of you. Customers get a normal reply from your inbox’s address, with no agent footer.
- Reads don’t mark cases read. Your agent never sees teammates’ drafts or private read state.
- Revocation holds sends. If you revoke a connection while its reply is queued, Pipp holds the reply for you to release, or cancels it if you’re no longer a member of the workspace. Mail the provider already accepted can’t be recalled.
Revoke access
Open Connected agents in Pipp settings to see each connection, its permissions and its recent actions. From there you can reduce permissions, disconnect a connection everywhere, or remove its access to one workspace. Owners and Admins also see every connection with access to their workspace.