ChatPilot
For developers

Your inbox in Claude Code and other AI apps

Let an AI app on your computer read your chats through ChatPilot's own MCP server, with a key per app, and switch on what it may do.

ChatPilot is also an MCP server. Claude Code, Claude Desktop or any other app that speaks MCP can read your inbox through it, on the same computer: "what did they ask on WhatsApp today?", "find the invoice that came in last week". Where you allow it, the app can also write a reply draft, add a note, set a follow-up, change labels, mark a chat read or make a summary. It sends a draft only where you tick that and auto-answer is on for the chat.

Give an app a key

  1. Settings → MCP clients → Add a client.
  2. Give it a name you will recognise later, e.g. "Claude Code on my Mac", and press Make a key.
  3. The key is shown only now, ready to paste in three forms, each with a Copy button:
  4. Claude Code: a claude mcp add … line for a terminal.
  5. Claude Desktop and apps that start a command (JSON): an entry for the app's config file (Claude Desktop: Settings → Developer → Edit Config, inside "mcpServers"). The app starts chatpilot mcp serve, which passes everything on to ChatPilot.
  6. Apps that connect over HTTP (JSON): the same for apps that take an address.

Paste it into the app, restart the app if it asks, then press Done, I copied it.

For Claude Code the line looks like this:

claude mcp add --transport http chatpilot http://127.0.0.1:47821/mcp --header "Authorization: Bearer cpk_…"

For Claude Desktop the entry looks like this (the path is ChatPilot's own Python, filled in for you):

{
  "mcpServers": {
    "chatpilot": {
      "command": "/path/to/chatpilot/.venv/bin/python",
      "args": ["-m", "chatpilot", "mcp", "serve", "--url", "http://127.0.0.1:47821/mcp"],
      "env": {"CHATPILOT_MCP_KEY": "cpk_…"}
    }
  }
}

chatpilot mcp serve only passes messages on: ChatPilot itself has to be running, and the same key, rules and limits apply. If it isn't running, the app gets "ChatPilot isn't running". In Docker there is no command entry: use the Claude Code line or the HTTP entry.

Lost a key? Remove it and add the client again: ChatPilot keeps only a fingerprint of each key, so it can't show it twice.

What the app may read

Each key has its own May read boxes, all on for a new key:

AreaTools the app gets
Inbox: chats, messages, search, draftslist_chats, get_chat, search_messages, list_drafts, get_summary
People: contact cardsget_person
Today: waiting on you, follow-ups, tasks duelist_waiting

get_summary gives the What did I miss? summary ChatPilot already made for a chat, and says when newer messages came in since; it doesn't make one. Untick an area and the app no longer sees those tools. The card shows each key's last use and how many calls it made; Remove stops that app at once.

What the app may do

Each key also has May do boxes. They are all off for a new key: until you tick one, the app only reads.

BoxToolWhat it does
Write reply drafts (never sends them)draft_replyPuts a draft in the chat, marked Written by the app's name. It waits for you like any other draft: Send, edit or discard it.
Add notesadd_noteAdds a note to the chat's contact card, dated and signed with the app's name. In team mode it is a note for the team on the chat instead.
Set follow-upscreate_followupBrings the chat back to you at a time if they haven't answered your last message.
Add and remove labelsset_labelAdds or removes labels on a chat.
Mark chats readmark_readThe same as Done on the chat: its new messages are read and its follow-up goes. The app marks them read too only where you switched that on for the account.
Make new summaries (uses the AI)summarize_chatMakes a new What did I miss? summary of a chat. It uses your AI, like pressing the button yourself.
Send drafts, only in chats with auto-answer onsend_replySends a draft that is already there. ChatPilot asks first when you tick it. See below.

Everything an app does shows in the chat, between the messages, with the app's name ("Claude Code wrote a reply draft for you"), and under Lately on the card. A key may do at most 60 actions an hour.

Sending a draft

With Send drafts ticked, the app can send a draft without you pressing Send, but only where you already let ChatPilot answer by itself:

  • Auto-answer is on for that chat and may answer now: not paused because you are in the chat yourself, not switched off everywhere, and within its daily limit (what the app sends counts in it).
  • The chat isn't Always to me, and neither their new messages nor the draft is about one of your always-to-me topics.
  • Every amount, price, date and percentage in the draft is in the chat or in auto-answer's instructions for it.

It goes out as auto-answer's own message, with its mark (and its introduction the first time), and you get a Telegram message for each one. Anywhere else nothing is sent: the draft stays waiting for you, the app is told why, and the chat shows "wanted to send your draft" with the reason.

What it can't do

  • It sends only as above. In every other chat a reply it writes is a draft that waits for you. It can't run actions in your connected systems either.
  • It changes nothing you didn't tick under May do.
  • Only chats the AI may read. Chats set to ChatPilot can read this; never Saved, no AI, local-AI chats or chats that are off. See Choose which chats ChatPilot may read.
  • Only on this computer. It answers on 127.0.0.1 only: not through the phone link, not from another computer, and not from a web page.
  • Only with a key. The panel's own link isn't a key.
  • At most 120 calls a minute per key.
  • In team mode, a key sees only what the member who made it sees.

What your contacts wrote comes back marked as text from other people (untrusted_text), and the app is told not to take instructions from it. Still, ask the app before it acts on what a message says.

Checked against ChatPilot 0.1.0b1. Report a problem with this page