Skip to content

用于 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 服务器)

其他资源