Integration
Microsoft Agent Framework Email Integration
Give Agent Framework agents full email capabilities through native MCP support — or wrap the Python SDK in a custom function tool. The upgrade path for AutoGen and Semantic Kernel email.
Coming from AutoGen or Semantic Kernel? Microsoft Agent Framework reached 1.0 GA in April 2026 and is the official successor absorbing both projects — their READMEs now redirect new work to it. If you have existing AutoGen code, our legacy AutoGen adapter keeps working. For new projects, use the Agent Framework setup on this page.
How It Works
Agent Framework treats MCP servers as first-class tool sources. Dead Simple Email runs a hosted MCP server at https://api.deadsimple.email/mcp that authenticates with your API key in an Authorization header. Point MCPStreamableHTTPTool at it and your agent discovers all 14 email tools automatically — no tool schemas, no API glue code.
To be clear about what ships where: we do not publish a dedicated agent-framework adapter package as of August 2026. You don't need one — MCP is the integration surface Microsoft built for exactly this, and it works with both the Python and .NET versions of Agent Framework. If you prefer explicit code over MCP, the custom function tool section below wraps our Python SDK directly.
Quick Start: MCP
Install Agent Framework, then connect the hosted MCP server:
pip install agent-framework
import asyncio from agent_framework import ChatAgent, MCPStreamableHTTPTool from agent_framework.openai import OpenAIChatClient async def main(): email_tools = MCPStreamableHTTPTool( name="deadsimple-email", url="https://api.deadsimple.email/mcp", headers={"Authorization": "Bearer dse_your_api_key"}, ) async with email_tools: agent = ChatAgent( chat_client=OpenAIChatClient(model_id="gpt-4o"), name="email_agent", instructions="You manage email with Dead Simple Email.", tools=email_tools, ) result = await agent.run("Create an inbox and send a hello email to team@example.com") print(result) asyncio.run(main())
The async with block opens the MCP connection, discovers the tools, and closes cleanly when done. The agent decides which tools to call — here it will chain create_inbox and send_email on its own.
Available Tools
The MCP server exposes 14 tools covering the full agent email workflow:
| Tool | Description |
|---|---|
create_inbox | Create a new inbox with its own email address |
list_inboxes | List all inboxes on the account |
delete_inbox | Delete an inbox and its messages |
send_email | Send an email from an inbox |
read_messages | List recent messages in an inbox |
read_message | Read a single message with full body |
reply_to_message | Reply in-thread (threading handled automatically) |
forward_message | Forward a message to another address |
wait_for_email | Block until a matching email arrives |
get_verification_code | Wait for and extract an OTP / verification code |
get_verification_link | Wait for and extract a verification / magic link |
list_threads | List conversation threads |
read_thread | Read a full conversation thread |
get_usage | Check plan usage and limits |
If you run agents locally and prefer a subprocess over a remote connection, the same server runs over stdio: python -m deadsimple.mcp with the DSE_API_KEY environment variable set (requires pip install deadsimple-email[mcp]).
Alternative: Custom Function Tool
Agent Framework converts plain Python functions into tool schemas from type annotations. If you want tighter control than MCP — one narrowly-scoped tool instead of fourteen — wrap the Python SDK yourself:
# pip install agent-framework deadsimple-email from typing import Annotated from pydantic import Field from agent_framework import ChatAgent from agent_framework.openai import OpenAIChatClient from deadsimple import DeadSimple client = DeadSimple(api_key="dse_your_api_key") def send_email( inbox_id: Annotated[str, Field(description="ID of the sending inbox")], to: Annotated[str, Field(description="Recipient email address")], subject: Annotated[str, Field(description="Subject line")], body: Annotated[str, Field(description="Plain-text body")], ) -> str: """Send an email from a Dead Simple Email inbox.""" result = client.messages.send(inbox_id, to, subject, text_body=body) return f"Sent ({result.message_id})" agent = ChatAgent( chat_client=OpenAIChatClient(model_id="gpt-4o"), instructions="You send email follow-ups for the team.", tools=[send_email], )
The same pattern works for any SDK call — client.inboxes.create(), client.messages.wait_for(), client.messages.reply(), and so on. Mix custom function tools and the MCP toolset freely in the same tools list.
Frequently Asked Questions
Yes. Agent Framework has native MCP support, and Dead Simple Email runs a hosted MCP server at https://api.deadsimple.email/mcp. Point MCPStreamableHTTPTool at it with your API key in an Authorization header and your agent gets 14 email tools with zero glue code.
Not yet. As of August 2026 the recommended path is MCP, which Agent Framework treats as a first-class tool source. You can also wrap the Python SDK (pip install deadsimple-email) in plain function tools — Agent Framework builds the tool schemas from your type annotations automatically.
Agent Framework reached 1.0 GA in April 2026 and is Microsoft's official successor to both — the AutoGen and Semantic Kernel READMEs now point new work at it. Our legacy AutoGen adapter (deadsimple.integrations.autogen) keeps working for existing code; new projects should use Agent Framework with MCP.
Yes. MCP is language-agnostic — the .NET version of Agent Framework connects to the same hosted server with its own MCP tool classes, using the same URL and Authorization: Bearer dse_... header. The code on this page shows the Python idiom.
Yes. The free tier includes 5 inboxes and 5,000 emails per month, requires no credit card, and does not expire.