mailnotmilk
Agent & Presence Management: Register agents, list, set/get status, subscribe to rooms.
Messaging & Inbox: Send direct or broadcast messages, structured handoffs, turn summaries; reply in-thread, react, search, archive, mark unread; check inbox with priority sorting.
Chat Sessions: Create/join shared chats, generate join links, bridge to Claude Code, post messages and view history.
Browser Automation: Connect Chrome/Firefox via Playwright, navigate to AI sites (ChatGPT, DeepSeek, etc.), extract chat messages, send messages, take screenshots.
Relay: Execute automated relay cycles that extract messages from browser AI, forward to coding agent chat, and send replies back.
Utility: Mailbox statistics, status board, room listing and subscription.
Supports browser automation through Firefox, allowing the server to interact with AI chat web interfaces via the Firefox browser.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mailnotmilk Relay my DeepSeek browser chat to Claude Code"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mailnotmilk
Bridge any browser AI (ChatGPT, DeepSeek web, Gemini, Copilot, Claude.ai) with Claude Code / Cursor / OpenCode — MCP mailbox + Chrome/Firefox automation
Install
Linux / macOS / WSL
./install.sh # MCP + skills + browsers + auto Chrome extension
./run.sh # after one Chrome restart — any AI site
./run.sh --site deepseek --peer claudeWindows native
install.cmd
install.cmd --run
run.cmd.\install.ps1 --run
.\run.ps1 --site chatgptInstall automatically:
MCP into Cursor / Claude Code / OpenCode / …
Skills (
mailnotmilk-bridge,browser-relay) project + user-levelPlaywright + Chromium / Firefox / WebKit (no manual
npx playwright install)
Platform | Entrypoint | Browsers |
Linux native |
| chromium, firefox, webkit + |
Windows WSL |
| same (+ WSLg note for headed UI) |
macOS |
| chromium, firefox, webkit |
Windows native |
| chromium, firefox, webkit |
Skip browsers: --skip-browsers. Browsers only: mailnotmilk install --browsers-only.
Skip OS libs: --skip-deps. Force OS libs: --with-deps.
Related MCP server: Browserbeam MCP Server
Browser AI ↔ coding agent
mailnotmilk hub &
mailnotmilk relay --site deepseek --peer claude --browser chrome --wait 20000
# or firefox: --browser firefoxFlow:
Playwright opens DeepSeek/ChatGPT/… (Chrome or Firefox)
Extracts chat turns from the page
Forwards into a mailnotmilk chat for Claude/Cursor/OpenCode
When the coding agent replies, types it back into the browser composer
MCP tools: browser_connect, browser_open_ai, browser_extract_messages, browser_send_message, relay_tick, plus the chat/bridge tools.
Skills installed: mailnotmilk-bridge, browser-relay.
DeepSeek-in-Cursor → Claude Code (paste)
Still works when the “browser” is Cursor itself:
mailnotmilk bridge -t "fix auth" -m "help me" --openPaste the block into Claude Code.
License
MIT
Available Tools
36 toolsarchive_messageA
Archive a message (hides from default inbox/history).
Inputs: message_id (required).
bridge_to_claudeA
DeepSeek/Cursor → Claude Code bridge. Creates a chat and returns pasteForPeer — the human pastes that into Claude Code. Nothing auto-opens Claude.
Inputs: from, title, message.
browser_connectA
Connect Chrome or Firefox via Playwright (launch persistent profile, or CDP attach for Chrome).
Inputs: mode, browser, cdp_url, headless.
browser_disconnectA
Close the Playwright browser session.
Inputs: no named parameters.
browser_extract_messagesC
Parse visible chat turns from the open browser AI page.
Inputs: limit.
browser_open_aiA
Navigate the connected browser to ChatGPT, DeepSeek, Claude, Gemini, Copilot, or a custom URL.
Inputs: url, site.
browser_screenshotC
Screenshot the current browser page.
Inputs: path.
browser_send_messageB
Type a message into the browser AI composer and send it.
Inputs: text (required), submit.
browser_statusA
Show whether a browser session is connected and which site is open.
Inputs: no named parameters.
chat_historyC
List messages in a chat (chronological).
Inputs: chat_id (required), limit.
chat_linkA
Get the shareable join URL + peer prompt for a chat id.
Inputs: chat_id (required).
chat_sayC
Post a message into a chat room (by chat id).
Inputs: text (required), chat_id (required), to, from.
check_inboxC
List unread messages (DMs, broadcasts, @mentions). Priority-sorted. Optional short wait.
Inputs: room, limit, wait_ms, agent_id, +1 more.
create_chatA
Create a shared chat session and return a join link + peer prompt to paste into Claude/Cursor. (Mail does NOT auto-open the other app.)
Inputs: title (required), peer, members, created_by.
get_statusC
Get presence for an agent id.
Inputs: agent_id (required).
get_threadB
Fetch the full conversation thread for a message id.
Inputs: message_id (required), limit.
join_chatA
Join a chat via invite_token (from a shared link/prompt).
Inputs: invite_token (required), agent_id.
list_agentsC
List agents seen recently on the roster.
Inputs: since_minutes.
list_chatsC
List recent chat sessions.
Inputs: limit.
list_historyC
Recent messages (read or unread) for an agent or room.
Inputs: room, limit, agent_id.
list_roomsB
List active rooms with message counts.
Inputs: no named parameters.
mailbox_boardC
Human-readable status board: agents, rooms, urgent, recent.
Inputs: no named parameters.
mailbox_statsA
Aggregate mailbox stats (counts, priorities, live agents).
Inputs: no named parameters.
mark_unreadA
Remove the read receipt so a message shows up in inbox again.
Inputs: message_id (required), agent_id.
post_handoffB
Send a structured task handoff (title, objective, acceptance, files) to another agent.
Inputs: to (required), title (required), objective (required), from, +5 more.
post_messageA
Send markdown to an agent (DM) or omit to for room broadcast. Supports @mentions, priority, tags, file path attachments.
Inputs: text (required), to, from, room, +3 more.
post_turnB
Announce what this agent just finished so peers stay in sync (end-of-turn summary).
Inputs: summary (required), to, from, room, +2 more.
react_messageC
Add an emoji reaction to a message.
Inputs: emoji (required), message_id (required), agent_id.
read_messageB
Fetch a message and mark it read (ack).
Inputs: message_id (required), agent_id.
register_agentB
Register or refresh this agent's identity in the shared mailbox roster.
Inputs: id, role, status, display_name.
relay_tickC
One relay cycle: extract browser AI messages → mailnotmilk chat → optional wait for coding-agent reply → send back to browser.
Inputs: peer, site, title, chat_id, +1 more.
reply_messageC
Reply in-thread; routes back to the original sender.
Inputs: text (required), message_id (required), from, priority.
search_messagesC
Full-text search over message bodies.
Inputs: query (required), to, from, room, +1 more.
set_statusB
Set presence: idle | working | waiting.
Inputs: status (required), agent_id.
subscribe_roomC
Remember interest in a room (roster metadata).
Inputs: room (required), agent_id.
whoamiA
Show the auto-detected agent id for this MCP process.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Multiple tools have unclear boundaries: post_message vs chat_say vs browser_send_message all send messages but to different targets; check_inbox, list_history, and chat_history all retrieve messages but with different scopes. The many list/send variants make it hard for an agent to pick the right tool.
There are consistent clusters (e.g., browser_* prefixed tools, verb_noun like check_inbox, read_message), but the overall set mixes conventions: chat_link and chat_history are noun phrases, mailbox_stats is noun_noun, and relay_tick is noun_verb. Still readable, but not uniform.
With 36 tools, the server is overloaded, far beyond the typical well-scoped range. Even though it covers messaging, browser automation, and presence, the sheer number makes it unwieldy and suggests too many responsibilities for a single MCP server.
The messaging and presence lifecycle is fairly complete (send, read, reply, search, archive, react, status), but missing obvious operations like editing or deleting messages. Chat management is also thin (no leave/delete/rename), and browser automation is limited to AI pages. Notable gaps exist, but core workflows work.
Maintenance
Related MCP Connectors
Live browser debugging for AI assistants — DOM, console, network via MCP.
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server + Chrome extension that gives AI coding agents control of your real browser with existing sessions, logins, and cookies. Works with Cursor, Claude, Windsurf.24180 npm58MIT
- AlicenseNot gradedqualityDmaintenanceEnables real browser automation as tools in Cursor, Claude Desktop, Windsurf, and any MCP-compatible client, allowing AI agents to interact with web pages through natural language.9 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables browser automation (navigate, screenshot, click, type, etc.) for Claude Code via MCP protocol, with a Chrome extension for configuration.2MIT
- AlicenseAqualityDmaintenanceBridges any MCP client (like Claude Code, Zed, VS Code) to any ACP coding agent, enabling multi-agent orchestration from a single chat interface.24181 npm12Apache 2.0