用于 ADK 的 e2a MCP 工具¶
ADK 支持PythonTypeScript
e2a MCP 服务器 将你的 ADK 智能体连接到 e2a,一个专为 AI 智能体构建的认证邮件网关。此集成为你的智能体提供自己的电子邮件收件箱,使其能够使用自然语言发送、接收和回复消息,支持 SPF/DKIM 验证的入站邮件以及可选的出站消息人工审批流程。
使用场景¶
-
为智能体提供专属收件箱:配置专用电子邮件地址(如
support-bot@your-domain.com),让智能体像团队成员一样收发邮件。 -
认证入站:每封入站消息都附带 SPF 和 DKIM 验证结果,以便智能体知道发件人是否真实。
-
人工审批流程:在任何智能体上配置 HITL(人在回路)后,出站消息将被保留在待审批队列中,直到审核人批准,并可在发送前选择性编辑主题、正文或收件人。
-
自动线程对话:回复收到的电子邮件时,保留正确的 In-Reply-To 和 References 标头,确保跨多轮的线程保持完整。
先决条件¶
- 一个免费的 e2a 账号 及控制台中的 API 密钥
- Node.js 18+(仅本地 MCP 服务器需要)
与智能体配合使用¶
from google.adk.agents import Agent
from google.adk.tools.mcp_tool import McpToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams
from mcp import StdioServerParameters
E2A_API_KEY = "YOUR_E2A_API_KEY"
E2A_AGENT_EMAIL = "your-bot@your-domain.com" # 可选的默认收件箱
root_agent = Agent(
model="gemini-flash-latest",
name="e2a_agent",
instruction=(
"你通过 e2a 工具管理邮件。调用 whoami "
"查找你的收件箱地址。使用 list_messages 和 "
"get_message 来阅读邮件;在回复现有线程时使用 "
"reply_to_message(而非 send_email),以保留线程标头。"
),
tools=[
McpToolset(
connection_params=StdioConnectionParams(
server_params=StdioServerParameters(
command="npx",
args=["-y", "@e2a/mcp-server"],
env={
"E2A_API_KEY": E2A_API_KEY,
"E2A_AGENT_EMAIL": E2A_AGENT_EMAIL,
},
),
timeout=30,
),
)
],
)
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=(
"你通过 e2a 工具管理邮件。调用 whoami "
"查找你的收件箱地址。使用 list_messages 和 "
"get_message 来阅读邮件;在回复现有线程时使用 "
"reply_to_message(而非 send_email),以保留线程标头。"
),
tools=[
McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://mcp.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 E2A_AGENT_EMAIL = "your-bot@your-domain.com"; // 可选的默认收件箱
const rootAgent = new LlmAgent({
model: "gemini-flash-latest",
name: "e2a_agent",
instruction:
"你通过 e2a 工具管理邮件。调用 whoami " +
"查找你的收件箱地址。使用 list_messages 和 " +
"get_message 来阅读邮件;在回复现有线程时使用 " +
"reply_to_message(而非 send_email),以保留线程标头。",
tools: [
new MCPToolset({
type: "StdioConnectionParams",
serverParams: {
command: "npx",
args: ["-y", "@e2a/mcp-server"],
env: {
E2A_API_KEY: E2A_API_KEY,
E2A_AGENT_EMAIL: E2A_AGENT_EMAIL,
},
},
}),
],
});
export { rootAgent };
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:
"你通过 e2a 工具管理邮件。调用 whoami " +
"查找你的收件箱地址。使用 list_messages 和 " +
"get_message 来阅读邮件;在回复现有线程时使用 " +
"reply_to_message(而非 send_email),以保留线程标头。",
tools: [
new MCPToolset({
type: "StreamableHTTPConnectionParams",
url: "https://mcp.e2a.dev/mcp",
transportOptions: {
requestInit: {
headers: {
Authorization: `Bearer ${E2A_API_KEY}`,
},
},
},
}),
],
});
export { rootAgent };
可用工具¶
身份管理¶
| 工具 | 描述 |
|---|---|
whoami |
返回默认智能体的完整记录(当账号有多个智能体时需要 E2A_AGENT_EMAIL) |
list_agents |
列出认证用户拥有的每个智能体收件箱 |
create_agent |
在共享域上使用 slug 注册新收件箱;默认为 local 模式,智能体通过轮询接收邮件,无需 webhook |
update_agent |
更新现有智能体的 webhook URL、模式或 HITL 设置 |
delete_agent |
永久删除智能体(需要 confirm: true),并停止接受该地址的邮件 |
云端模式智能体必须验证 webhook 签名
使用 agent_mode: "cloud" 创建的智能体通过 webhook 而不是轮询接收邮件。你的 webhook 处理器必须在每次投递时验证 HMAC 签名。有关包含签名验证的完整设置,请参见云端模式 webhook 示例。
消息¶
| 工具 | 描述 |
|---|---|
send_email |
发送新邮件;启用 HITL 时返回 status: pending_approval 而非 sent |
reply_to_message |
回复入站消息;保留 In-Reply-To 和 References 标头 |
list_messages |
列出带 status 过滤器(unread / read / all)和分页的入站邮件 |
get_message |
获取单条消息的完整正文、标头和附件元数据 |
get_attachment_data |
通过消息 ID 和基于 0 的附件索引下载附件的字节数据(以 base64 返回) |
人工审批流程¶
| 工具 | 描述 |
|---|---|
list_pending_messages |
列出等待人工审批的出站邮件,按即将过期时间排序 |
get_pending_message |
获取待审批消息的完整草稿(主题、收件人、正文) |
approve_pending_message |
发送暂存的消息,可选择附带审核人编辑(主题/正文/收件人) |
reject_pending_message |
丢弃暂存的消息;可选的 reason 参数用于审计记录 |
域名管理¶
| 工具 | 描述 |
|---|---|
list_domains |
列出认证用户注册的每个自定义域名及其验证状态 |
register_domain |
添加自定义域名,并接收证明所有权所需的 DNS 记录 |
verify_domain |
在记录配置完成后,对已注册域名重新运行 DNS 验证 |
delete_domain |
移除自定义域名(需要 confirm: true;共享域上的智能体不受影响) |
Configuration¶
| 变量 | 必填 | 默认值 | 描述 |
|---|---|---|---|
E2A_API_KEY |
是 | — | 你的 e2a API 密钥 |
E2A_AGENT_EMAIL |
否 | — | 默认智能体收件箱;限定工具范围,使 LLM 无需在每次调用时指定 |
E2A_BASE_URL |
否 | https://e2a.dev |
自托管部署 URL(仅本地 MCP 服务器) |