epistole¶
epistole gives Claude access to your Gmail accounts. It can search and read mail, and create or update drafts. Its send_draft tool sends a draft only after you approve it. It runs as a local MCP server on your own computer, using a Google OAuth client that you create, so it works with several accounts at once, whichever Claude account is signed in.
Use it when¶
- You want Claude to find, read or draft mail across more than one Gmail account.
- You want one catch-up that covers every inbox, and the course site too when schole is installed.
Install¶
Needs¶
uv, and a Google OAuth client you create once. The first start downloads about 30 MB of Python packages. If /mcp shows epistole failed on that first start, reconnect it from /mcp once the download finishes.
Claude Code in the terminal or the desktop app. The plugin ships commands in bin/, and claude.ai and Cowork do not install a plugin that has one (plugin reference).
Set up¶
Ask Claude to run /epistole:setup. It guides you through creating the OAuth client, importing it, and signing each account in:
The setup runbook has every step, and the README covers university and Workspace accounts, signatures and the safety model.
Skills¶
| Skill | Use it to |
|---|---|
epistole:catch-me-up |
Sweep every account for mail since the last sweep and report what needs you. |
epistole:setup |
Create the Google OAuth client and sign each account in. |
Commands and tools¶
The MCP server's tools appear as mcp__plugin_epistole_epistole__<tool>.
| Tool | What it does |
|---|---|
accounts |
Shows whether the Google client is set up, and each account's address, sign-in state and send-as address. Never opens a browser. |
search |
Searches one account, or all, with Gmail query syntax. Takes max_results (1 to 50) and page_token, which works with one account. |
read_thread |
Reads a thread by id. full=true keeps quoted replies and lists more attachments per message. Bodies come back marked as untrusted content. |
create_draft |
Creates a draft in an account, optionally as a reply, with attachments from your allowed folders. A new draft gets the account's Gmail signature; a reply does not. |
update_draft |
Replaces a draft's content and keeps its thread. |
download_attachment |
Saves an attachment into your download folder. Never overwrites a file. |
send_draft |
Sends a draft after you approve it. |
Every id is account-qualified (alias:id), and a tool refuses an id whose account differs from the account you named.
Two commands run in a terminal, or in Claude Code after !:
| Command | What it does |
|---|---|
epistole-login --status |
Prints whether the client file is present and, per account, signed in, needs login: <reason> or could not check (network error). Exits 0 only when every account is signed in. |
epistole-login [--client FILE] <alias> |
Imports the Google client, or signs one account in. A new alias adds the account. With no arguments, or with --status and an alias together, it prints its usage and exits 2. |
epistole-since |
Prints the catch-up window: the last sweep time (or, with none, the start of yesterday, Friday on a Monday), the current time and a Gmail after: query. |
epistole-since --set EPOCH |
Records when a sweep read the inboxes. |
epistole-login and epistole-since exit 127 when uv is not on PATH.
Configuration¶
~/.config/epistole/accounts.toml records the accounts, the attachment folders and the download folder. Set EPISTOLE_HOME to move the folder; the value must be absolute or start with ~.
attach_dirs = ["~/Documents/outgoing"]
download_dir = "~/Downloads/epistole"
timezone = "America/New_York" # optional, an IANA name; else the machine's zone
[accounts]
personal = "user@example.com"
school = "user@g.example.edu"
- Attachments are off until you list folders in
attach_dirs. Attach paths must be absolute, and a file or the total may not exceed 25 MB. epistole-sincekeeps its time incatch-me-up.jsonin the same folder.XDG_CACHE_HOMEmoves the login environment from~/.cache/epistole. The MCP server's own environment lives in Claude Code's plugin data folder.
Privacy¶
epistole runs on your computer and sends nothing to its author. Read the epistole privacy policy, which is the policy for the Google OAuth app.
Troubleshooting¶
/mcpshows epistole failed, or theaccountstool is missing. The server starts throughuv. Runcommand -v uv; if it prints nothing, install uv withcurl -LsSf https://astral.sh/uv/install.sh | sh, then restart Claude Code, because the server takes its PATH from the session that starts it. If uv is installed, the first start was probably still downloading packages: reconnect epistole from/mcp.- An account
needs login. Run!epistole-login <alias>. Google stops honoring a token when you change your password, when it goes unused for 6 months, or when an administrator revokes the app. - Sign-in ends on a page saying access is blocked (
Error 400: admin_policy_enforced). An administrator limits third-party access to Gmail. Only the administrator can fix that, or use a personal account. epistole-loginsays uv is not on PATH. Install uv the same way, open a new terminal, and run the command again.