If you're building AI agents that need to handle email, this toolkit gives you pre-built tools for the major frameworks instead of wiring up SMTP yourself. It covers both TypeScript (Vercel AI SDK, LangChain, Clawdbot) and Python (OpenAI Agents SDK, LangChain, LiveKit), with tools for creating inboxes, sending and receiving messages, managing threads, and handling attachments. The Node version includes draft support with six additional tools, while Python ships eleven core tools. Configuration is straightforward: drop in your AgentMail API key and call getTools(). It's a clean abstraction if you want agents that can actually manage an inbox without building the plumbing from scratch.
npx -y skills add agentmail-to/agentmail-skills --skill agentmail-toolkit --agent claude-codeInstalls into .claude/skills of the current project.
Install the toolkit for the selected language and set AGENTMAIL_API_KEY.
npm install agentmail-toolkit
pip install agentmail-toolkit
The TypeScript and Python packages can expose different tool sets and can release on different schedules. Discover the installed package's tool catalog at runtime instead of trusting a hardcoded list:
new AgentMailToolkit().getTools().map((tool) => tool.name)
[tool.name for tool in AgentMailToolkit().get_tools()]
import { openai } from "@ai-sdk/openai";
import { streamText } from "ai";
import { AgentMailToolkit } from "agentmail-toolkit/ai-sdk";
const toolkit = new AgentMailToolkit();
const result = await streamText({
model: openai(process.env.OPENAI_MODEL!),
messages,
system: "Use email tools only when the user authorizes the external action.",
tools: toolkit.getTools(),
});
import { createAgent } from "langchain";
import { AgentMailToolkit } from "agentmail-toolkit/langchain";
const agent = createAgent({
model: process.env.LANGCHAIN_MODEL!,
tools: new AgentMailToolkit().getTools(),
systemPrompt: "Use email tools only when the user authorizes the external action.",
});
import { AgentMailToolkit } from "agentmail-toolkit/mcp";
const tools = new AgentMailToolkit().getTools();
Each tool provides a name, title, description, input schema, output schema, callback, and complete annotations for registration on your own MCP server. On a successful call the MCP adapter returns structuredContent (validated against the output schema) alongside the JSON text block; on failure it returns an isError result. The Python package does not ship an MCP adapter.
import { AgentMailClient } from "agentmail";
import { AgentMailToolkit } from "agentmail-toolkit/ai-sdk";
const client = new AgentMailClient({ apiKey: process.env.AGENTMAIL_API_KEY });
const toolkit = new AgentMailToolkit(client);
The toolkit constructor takes an existing SDK client as its only argument — it does not accept an { apiKey } options object directly. Construct the SDK client first, then pass it in.
from agentmail_toolkit.openai import AgentMailToolkit
from agents import Agent
agent = Agent(
name="Email Agent",
instructions="Use email tools only when the user authorizes the external action.",
tools=AgentMailToolkit().get_tools(),
)
from agentmail import AgentMail
from agentmail_toolkit.openai import AgentMailToolkit
client = AgentMail()
toolkit = AgentMailToolkit(client=client)
The toolkit constructor takes an existing SDK client as its only argument — it does not accept an api_key option directly. Construct the SDK client first, then pass it in.
import os
from agentmail_toolkit.langchain import AgentMailToolkit
from langchain.agents import create_agent
agent = create_agent(
model=os.environ["LANGCHAIN_MODEL"],
tools=AgentMailToolkit().get_tools(),
system_prompt="Use email tools only when the user authorizes the external action.",
)
from agentmail import AgentMail
from agentmail_toolkit.livekit import AgentMailToolkit
from livekit.agents import Agent
class EmailAssistant(Agent):
def __init__(self) -> None:
client = AgentMail()
super().__init__(
instructions="Handle email only when explicitly requested.",
tools=AgentMailToolkit(client=client).get_tools(),
)
Subclass the LiveKit Agent and pass instructions and toolkit tools through super().__init__.
Requires toolkit TypeScript >= 0.5.0 or Python >= 0.3.0.
structuredContent plus a matching JSON text block on success; void operations (deletes) return a stable { success: true } object.isError: true. Do not treat a returned value as an error string; catch the thrown error or check isError.| Framework | TypeScript Import | Python Import |
|---|---|---|
| Vercel AI SDK | from 'agentmail-toolkit/ai-sdk' | - |
| LangChain | from 'agentmail-toolkit/langchain' | from agentmail_toolkit.langchain import AgentMailToolkit |
| Clawdbot | from 'agentmail-toolkit/clawdbot' | - |
| OpenAI Agents SDK | - | from agentmail_toolkit.openai import AgentMailToolkit |
| LiveKit Agents | - | from agentmail_toolkit.livekit import AgentMailToolkit |
juliusbrussee/caveman
mattpocock/skills
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills