Vexa
Meeting bot and transcripts for Google Meet, Teams and Zoom. Live or after, speakers labelled.
作者提供的说明(英文原文)
Multiple Google accounts (Gmail, Calendar, Drive, Contacts, Tasks) in one Claude connector.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
适用于网页版、桌面版和手机版 Claude:
https://hub.grounders.app/mcp在终端中运行这条命令
claude mcp add --transport http hub https://hub.grounders.app/mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"hub": {
"url": "https://hub.grounders.app/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"hub": {
"type": "http",
"url": "https://hub.grounders.app/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
ChatGPT 只能连接互联网上的服务器:
https://hub.grounders.app/mcp菜单名称可能因套餐和版本不同而略有差异。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
我们还没有读取这个服务器的工具列表;我们会轮流检查各个端点。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 ItsBreeze 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
尚未检查;我们会轮流检查各个端点
尚未检查;我们会轮流检查各个端点
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
GitHub 仓库最后更新于–,最新版本(1.1.0)于42天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:Vexa, emailmd, MCP WhatsApp Cloud
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Meeting bot and transcripts for Google Meet, Teams and Zoom. Live or after, speakers labelled.
Render markdown into email-safe HTML, lint drafts for deliverability problems, and preview emails.
MCP server for WhatsApp Cloud API (Meta) — messages, media, and templates via Graph API
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A remote MCP server that gives Claude access to several Google accounts at once — Gmail, Calendar, Drive, Contacts and Tasks. Claude's built-in Google connectors each hold exactly one account; connecting a second replaces the first. This holds as many as you link, and every search tool fans out across all of them in a single call.
AOL mailboxes link too. They are reached over IMAP and SMTP with an app password, sit behind the same mail tools, and are searched together with Gmail — see AOL mailboxes.
Run it yourself and it holds your Google tokens in your own database, encrypted, and talks to Google directly — nothing passes through a third party. Or try the hosted one first.
Node and Postgres, six tables. Dependencies are Express, pg and jsonwebtoken, plus imapflow, mailparser and nodemailer for AOL — IMAP, MIME and SMTP are protocols, not parsing jobs, and each library is the maintained standard for its one. Document text extraction — PDF, Word, Excel, PowerPoint, OpenDocument — uses only Node's standard library.
Status: running in production against real mailboxes, with 564 automated checks. Built for one person's needs and published because the one-account limit is not unique to them. Treat it as working software with a small user base, not as a hardened product.
A copy runs at hub.grounders.app. It is in testing, and free while it is.
https://hub.grounders.app/mcp. ChatGPT, Cursor and other MCP clients take the same URL as a remote MCP server.Google's review of the app is still in progress, so you will see an "unverified app" screen the first time.
git clone https://github.com/ItsBreeze/google-multi-account-mcp.git
cd google-multi-account-mcp npm install cp .env.example .env # fill it in — see Setup below npm run migrate # creates the six tables npm start
Then deploy it somewhere with a public HTTPS URL (Railway, Fly, Render, a VPS — anything that runs Node and reaches Postgres) and follow Setup.
| Method | Path | Description |
|---|---|---|
| POST | /mcp | MCP Streamable HTTP endpoint (Bearer auth) |
| GET | /mcp/oauth/authorize | Consent screen — operator password |
| POST | /mcp/oauth/token | Token + refresh grants |
| POST | /mcp/oauth/register | RFC 7591 dynamic client registration |
| GET | /.well-known/oauth-protected-resource | RFC 9728 discovery |
| GET | /.well-known/oauth-authorization-server | RFC 8414 discovery |
| GET | /gmail/connect | Link an account (repeat per account) |
| GET/POST | /gmail/aol | Link an AOL mailbox with an app password (checked against AOL before it is stored) |
| POST | /gmail/unlink | Unlink one, revoking the grant at Google (or deleting the stored AOL app password) |
| GET/POST | /ai/k/ | Reply link for an AI agent without MCP: GET reads its thread, POST {"text"} answers |
Every tool takes an optional account. On a search, omitting it fans the call out across every linked account and merges the results — the thing no single-account connector can do. On a write it names the one account to act on, so "create this event" is never ambiguous about whose calendar it lands in.
| Area | Tools | Notes |
|---|---|---|
| Accounts | list_accounts | Which accounts are linked, with token health |
| Search | search_messages, search_threads | Gmail query syntax, merged and date-sorted across accounts. search_threads returns one row per conversation — subject, every participant, message and unread counts, last activity — for "where does my thread with X stand" without pulling bodies |
| Read | get_message, get_thread, get_attachment | Bodies flattened to text and capped at 60 KB; attachment metadata included. `get_attachment` extracts text from PDF, Word, Excel, PowerPoint and OpenDocument attachments, so an emailed contract or invoice is readable directly; anything else comes back base64 (2 MB cap) |
| Send | send_message, reply_to_message, forward_message | Replies thread via In-Reply-To/References; forwards carry attachments (10 MB cap, skipped ones named); optional from + fromName send as a verified Gmail send-as alias |
| Drafts | create_draft, list_drafts, get_draft, update_draft, send_draft, delete_draft | create_draft with reply_to_message_id drafts an in-thread reply for review — the safe path for AI-written mail; create_draft and send_draft also take from/fromName (send_draft rewrites the draft's From first, Gmail only) |
| Labels | modify_labels, list_labels, create_label, update_label, delete_label | modify_labels takes message_id or thread_id; removing INBOX archives |
| Trash & spam | trash_message, untrash_message, mark_spam | All take message_id or thread_id; trash is recoverable for 30 days; mark_spam with unmark: true restores |
| Area | Tools | Notes |
|---|---|---|
| Read | list_calendars, list_events, search_events, get_event | list_events merges every linked calendar into one timeline, defaulting to the next 7 days; recurring series are expanded into actual occurrences, so a weekly standup appears on each day it happens |
| Write | create_event, update_event, delete_event | Times are ISO 8601; a bare YYYY-MM-DD means all-day. update_event patches — unmentioned fields keep their value. Attendees are not emailed unless send_updates says so |
| Repeats | create_event, update_event, delete_event | repeat: "weekly" (with repeat_count or repeat_until) covers the ordinary cases; recurrence takes full RFC 5545 rules. On a repeating event, scope chooses one occurrence or the whole series — see below |
| RSVP | respond_to_event | accepted / declined / tentative, as the account that was invited; notifies the organiser by default |
| Scheduling | suggest_time | Free slots across every linked calendar at once — busy anywhere means busy. Returns whole gaps rather than chopping a 3-hour opening into six half-hour slots |
| Area | Tools | Notes |
|---|---|---|
| Find | search_files, list_recent_files, get_file_metadata, list_shared_drives | Text search over names and contents, with optional raw Drive query syntax in filter. Covers My Drive and every shared drive at once; drive_id narrows to one. Trashed files excluded unless you ask for them |
| Read | read_file_content, download_file_content | Docs, Sheets and Slides exported (Sheets as CSV); PDF, Word, Excel, PowerPoint and OpenDocument extracted to text; ocr: true routes scans and images through Google's own conversion; include_comments returns the comment threads. download_file_content takes export_as — turn a Doc into a PDF or docx, a Sheet into xlsx. Text caps at 60 KB, binaries at 2 MB base64 |
| Write | create_file, update_file, copy_file | Text via content, binary via content_base64. convert_to makes Drive convert the upload into an editable Doc, Sheet or Slides — or a folder. update_file renames, moves and describes; overwriting contents additionally needs replace_content: true. On a file you do not own it edits a private copy — see below |
| Comment | comment_on_file | Leave a comment on a draft, or reply to a thread — the review path that changes nothing in the document |
| Sharing | get_file_permissions, share_file, unshare_file | Shares with one named person at reader/commenter/writer. Domain-wide and public-link sharing are off unless DRIVE_ALLOW_PUBLIC_SHARING=true, and then still need confirm_public. `unshare_file` withdraws access — by person, by domain, or by removing the public link |
| Remove | trash_file, untrash_file | Trash and restore, within the 30-day window — see the scope note below |
| Area | Tools | Notes |
|---|---|---|
| Contacts | search_contacts, list_contacts | Read-only. Searches saved contacts and people the account has corresponded with, so "email Ann" resolves to an address instead of a guess |
| Tasks | list_task_lists, list_tasks, create_task, update_task, delete_task | list_id defaults to the account's first list. update_task with completed: true ticks a task off; false reopens it. Google Tasks has no trash, so delete_task is permanent |
AIs talk to each other through Hub instead of by email. Every message has a thread, a hop count and a read time, so nothing is lost to subject matching and a sender can see whether it was read.
| Area | Tools | Notes |
|---|---|---|
| Talk | ai_send, ai_inbox, ai_thread | ai_send with thread answers in place and to defaults to the other side. ai_inbox with wait_seconds (up to 50) holds until a reply arrives. Threads stop at hop 10 |
| Agents | ai_agents, ai_set_agent | An agent can be woken by email (one JSON object from a linked mailbox, subject template like Claude -> Lute (hop {hop})) or by webhook (POST {"text"}, headers stored encrypted). A failed wake keeps the message unread and tells the sender |
An agent without MCP needs no account: each wake carries a signed reply_url (30 days, one owner, one agent). POST {"text":"..."} to it to answer, GET it to read the thread, or POST {"new_thread":true,"to":"claude","text":"..."} to start a new conversation.
Link one at /gmail/aol with the address and an app password generated at AOL Account Security — AOL has no OAuth for third-party mail clients outside an approved partner list, so this is the only door. The password is signed in to IMAP before it is stored (one app password covers IMAP and SMTP), so a typo is reported on the link page, not on Claude's first tool call. It is stored AES-256-GCM encrypted under TOKEN_ENC_KEY, like the Google tokens. Hosts come from a preset in code (imap_providers.js), never from the request.
Sending goes through a relay where SMTP is blocked. Railway blocks outbound SMTP below its Pro plan, so hub.grounders.app hands each AOL submission over HTTPS to a Cloudflare Worker (smtp-relay/) that speaks SMTP to smtp.aol.com:465. The Worker stores and logs nothing and reaches only preset hosts. It is used when SMTP_RELAY_URL and SMTP_RELAY_TOKEN are set; without them the server talks SMTP directly, as a self-hosted copy that can reach port 465 should. Gmail sending is unaffected — it goes through Google's API.
The 23 mail tools work on an AOL mailbox unchanged, and a search with no account covers Gmail and AOL in one merged, date-sorted result. What differs is IMAP itself, and the tools say so rather than pretend:
| Gmail | AOL over IMAP |
|---|---|
| Labels, several per message | Folders, one per message. UNREAD/STARRED are flags; INBOX, SPAM, TRASH and folder names move the message. A change that would need two folders is refused; IMPORTANT and categories do not exist |
| Ids are permanent | An id is folder + UID, so a move gives the message a new id — every moving call returns it as new_message_id. An id from a folder the server renumbered is refused as stale, never resolved to a different message |
| Gmail query syntax | Translated to IMAP SEARCH: from: to: cc: bcc: subject: is:unread/read/starred has:attachment newer_than: older_than: after: before: in: label: larger: smaller:, phrases, OR, -, parentheses. Anything el
只显示了开头部分;其余内容请在仓库中阅读