用于 ADK 的 e2a MCP 工具¶
e2a MCP 服务器将你的 ADK 智能体连接到 e2a——一个为 AI 智能体打造的认证邮件网关。此集成让智能体拥有自己的邮箱收件箱,可以使用自然语言发送、接收和回复邮件,并对入站邮件进行 SPF/DKIM/DMARC 验证,同时支持对出站消息进行可选的人工审批拦截。
该服务器托管在 https://api.e2a.dev/mcp,使用 Streamable HTTP 协议——无需本地安装或运行任何东西。
使用场景¶
-
为智能体提供专属收件箱:配置专用电子邮件地址(如
support-bot@your-domain.com),让智能体像团队成员一样收发邮件。 -
认证入站邮件:每条入站消息都携带 SPF、DKIM 和 DMARC 验证证据,因此智能体在处理邮件内容之前可以判断发件人是否属实。
-
人工审核环路:启用审核拦截后,出站消息会以
pending_review状态暂存,直到人工批准后才会发送——审批时还可以对主题、正文或收件人进行编辑。 -
自动化会话线程:回复时保留
In-Reply-To和References头信息,确保在收件人的邮件客户端中多轮对话的会话线程保持完整。
先决条件¶
- 一个免费的 e2a 账户以及从控制台获取的 API 密钥
与智能体配合使用¶
from google.adk.agents import Agent
from google.adk.tools.mcp_tool import McpToolset
from google.adk.tools.mcp_tool.mcp_session_manager import (
StreamableHTTPConnectionParams,
)
E2A_API_KEY = "YOUR_E2A_API_KEY"
root_agent = Agent(
model="gemini-flash-latest",
name="e2a_agent",
instruction=(
"You manage email through the e2a tools. Call whoami once to "
"learn your identity and inbox address. Use list_messages and "
"get_message to read; use reply_to_message when replying to an "
"existing thread (it preserves In-Reply-To and References), and "
"send_message only to start a new thread. Both 'accepted' and "
"'pending_review' are successful outcomes — never re-send after "
"either one."
),
tools=[
McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://api.e2a.dev/mcp",
headers={"Authorization": f"Bearer {E2A_API_KEY}"},
timeout=30,
),
)
],
)
import { LlmAgent, MCPToolset } from "@google/adk";
const E2A_API_KEY = "YOUR_E2A_API_KEY";
const rootAgent = new LlmAgent({
model: "gemini-flash-latest",
name: "e2a_agent",
instruction:
"You manage email through the e2a tools. Call whoami once to " +
"learn your identity and inbox address. Use list_messages and " +
"get_message to read; use reply_to_message when replying to an " +
"existing thread (it preserves In-Reply-To and References), and " +
"send_message only to start a new thread. Both 'accepted' and " +
"'pending_review' are successful outcomes — never re-send after " +
"either one.",
tools: [
new MCPToolset({
type: "StreamableHTTPConnectionParams",
url: "https://api.e2a.dev/mcp",
transportOptions: {
requestInit: {
headers: {
Authorization: `Bearer ${E2A_API_KEY}`,
},
},
},
}),
],
});
export { rootAgent };
生产环境中,请配合 e2a SDK 使用工具集
MCP 工具集将收件箱交给模型处理。将确定性的逻辑——验证 webhook 签名、处理至少一次投递保证、幂等发送——放在应用代码中,使用 Python 或 TypeScript SDK 实现。下面的 ADK webhook 示例就是这种架构的完整可运行版本。
可用工具¶
托管服务器提供 60 多个工具;调用端点的 tools/list 可获取权威工具列表。你看到的工具取决于你的密钥类型:智能体作用域密钥(e2a_agt_…)——推荐用于已部署的智能体——只能看到运行时工具,而账户作用域密钥(e2a_acct_…)还可以看到下面的管理工具。
运行时——收件箱工具¶
| 工具 | 描述 |
|---|---|
whoami |
返回认证身份:用户、凭证范围、计划和用量限制,以及智能体作用域凭证的 agent_email |
get_agent |
获取单个智能体的完整记录 |
list_messages |
列出收件箱或已发送邮件,支持按 direction、read_status、搜索过滤器和游标分页 |
get_message |
获取单条消息的完整正文、头部、附件元数据以及 SPF/DKIM/DMARC 验证证据 |
get_message_lifecycle |
获取单条消息的重建投递历史 |
get_attachment |
获取附件元数据,或使用 inline: true 获取内联字节 |
send_message |
发送新邮件;返回 accepted,或被审核拦截时返回 pending_review——两者均为成功,都不应重试 |
reply_to_message |
在会话线程中回复;保留 In-Reply-To 和 References |
forward_message |
将消息转发给新收件人 |
list_conversations / get_conversation |
浏览会话线程而非单条消息 |
update_message_labels |
在消息上添加或移除标签 |
delete_message / restore_message |
软删除到回收站,以及恢复 |
管理——配置与设置¶
| 工具 | 描述 |
|---|---|
list_agents、create_agent、update_agent、delete_agent、restore_agent |
管理智能体收件箱 |
get_protection、update_protection |
按智能体配置筛选和审核拦截 |
list_domains、register_domain、get_domain、verify_domain、delete_domain |
自定义域名注册和 DNS 验证 |
list_reviews、get_review、approve_review、reject_review |
处理人工审核队列 |
list_webhooks、create_webhook、update_webhook、delete_webhook、rotate_webhook_secret、test_webhook、list_webhook_deliveries |
Webhook 订阅和投递历史 |
list_events、get_event、redeliver_event |
事件日志和重放 |
list_templates、create_template、update_template、delete_template、validate_template |
服务端邮件模板(测试版) |
list_api_keys、create_api_key、delete_api_key |
API 密钥管理 |
配置¶
托管端点除了你的 API 密钥外不需要任何环境变量,ADK 通过上面所示的 Authorization 头传递该密钥。要使用自托管的 e2a 部署,只需将 url 改为该部署的 /mcp 端点。
交互式 MCP 客户端可以将 https://api.e2a.dev/mcp 添加为 OAuth 2.1 连接器,而无需粘贴密钥。要接收邮件,可以轮询 list_messages、使用 SDK 的 listen() 打开 WebSocket(无需公网 URL),或使用 create_webhook 订阅 HTTPS 端点。