Skip to main content
Glama

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 claude

Windows native

install.cmd
install.cmd --run
run.cmd
.\install.ps1 --run
.\run.ps1 --site chatgpt

Install automatically:

  • MCP into Cursor / Claude Code / OpenCode / …

  • Skills (mailnotmilk-bridge, browser-relay) project + user-level

  • Playwright + Chromium / Firefox / WebKit (no manual npx playwright install)

Platform

Entrypoint

Browsers

Linux native

./install.sh

chromium, firefox, webkit + install-deps (best-effort)

Windows WSL

./install.sh

same (+ WSLg note for headed UI)

macOS

./install.sh

chromium, firefox, webkit

Windows native

install.cmd / install.ps1

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 firefox

Flow:

  1. Playwright opens DeepSeek/ChatGPT/… (Chrome or Firefox)

  2. Extracts chat turns from the page

  3. Forwards into a mailnotmilk chat for Claude/Cursor/OpenCode

  4. 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" --open

Paste the block into Claude Code.

License

MIT

Available Tools

36 tools
archive_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_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

    C2.7/5.0

    Scored across 36 tools

    Disambiguation2/5

    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.

    Naming Consistency3/5

    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.

    Tool Count2/5

    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.

    Completeness3/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers