{"id":26,"date":"2025-08-05T00:00:00","date_gmt":"2025-08-05T00:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2025\/08\/05\/agents-workers-agents-sdk-adds-mcp-elicitation-support-http-streamable-suppport-task-queues-email-integration-and-more\/"},"modified":"2025-08-05T00:00:00","modified_gmt":"2025-08-05T00:00:00","slug":"agents-workers-agents-sdk-adds-mcp-elicitation-support-http-streamable-suppport-task-queues-email-integration-and-more","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2025\/08\/05\/agents-workers-agents-sdk-adds-mcp-elicitation-support-http-streamable-suppport-task-queues-email-integration-and-more\/","title":{"rendered":"Agents, Workers &#8211; Agents SDK adds MCP Elicitation support, http-streamable suppport, task queues, email integration and more"},"content":{"rendered":"<p>The latest releases of <a href=\"https:\/\/github.com\/cloudflare\/agents\" target=\"_blank\">@cloudflare\/agents<\/a> brings major improvements to MCP transport protocols support and agents connectivity. Key updates include:<\/p>\n<h4>MCP elicitation support<\/h4>\n<p>MCP servers can now request user input during tool execution, enabling interactive workflows like confirmations, forms, and multi-step processes. This feature uses durable storage to preserve elicitation state even during agent hibernation, ensuring seamless user interactions across agent lifecycle events.<\/p>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>\/\/ Request user confirmation via elicitation<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>confirmation<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>elicitInput<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>message<\/span><span>:<\/span><span> <\/span><span>`Are you sure you want to increment the counter by <\/span><span>${<\/span><span>amount<\/span><span>}<\/span><span>?`<\/span><span>,<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>requestedSchema<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>type<\/span><span>:<\/span><span> <\/span><span>\"object\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>properties<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>confirmed<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>type<\/span><span>:<\/span><span> <\/span><span>\"boolean\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>title<\/span><span>:<\/span><span> <\/span><span>\"Confirm increment\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>description<\/span><span>:<\/span><span> <\/span><span>\"Check to confirm the increment\"<\/span><span>,<\/span><\/div><\/div><div><div><span>      <\/span><span>},<\/span><\/div><\/div><div><div><span>    <\/span><span>},<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>required<\/span><span>:<\/span><span> [<\/span><span>\"confirmed\"<\/span><span>]<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>Check out our <a href=\"https:\/\/github.com\/whoiskatrin\/agents\/tree\/main\/examples\/mcp-elicitation-demo\" target=\"_blank\">demo<\/a> to see elicitation in action.<\/p>\n<h4>HTTP streamable transport for MCP<\/h4>\n<p>MCP now supports HTTP streamable transport which is recommended over SSE. This transport type offers:<\/p>\n<ul>\n<li><strong>Better performance<\/strong>: More efficient data streaming and reduced overhead<\/li>\n<li><strong>Improved reliability<\/strong>: Enhanced connection stability and error recover- <strong>Automatic fallback<\/strong>: If streamable transport is not available, it gracefully falls back to SSE<\/li>\n<\/ul>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>export<\/span><span> <\/span><span>default<\/span><span> <\/span><span>MyMCP<\/span><span>.<\/span><span>serve<\/span><span>(<\/span><span>\"\/mcp\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>binding<\/span><span>:<\/span><span> <\/span><span>\"MyMCP\"<\/span><span>,<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>The SDK automatically selects the best available transport method, gracefully falling back from streamable-http to SSE when needed.<\/p>\n<h4>Enhanced MCP connectivity<\/h4>\n<p>Significant improvements to MCP server connections and transport reliability:<\/p>\n<ul>\n<li><strong>Auto transport selection<\/strong>: Automatically determines the best transport method, falling back from streamable-http to SSE as needed<\/li>\n<li><strong>Improved error handling<\/strong>: Better connection state management and error reporting for MCP servers<\/li>\n<li><strong>Reliable prop updates<\/strong>: Centralized agent property updates ensure consistency across different contexts<\/li>\n<\/ul>\n<h4>Lightweight .queue for fast task deferral<\/h4>\n<p>You can use <code>.queue()<\/code> to enqueue background work \u2014 ideal for tasks like processing user messages, sending notifications etc.<\/p>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>class<\/span><span> <\/span><span>MyAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>doSomethingExpensive<\/span><span>(<\/span><span>payload<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ a long running process that you want to run in the background<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>queueSomething<\/span><span>()<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>queue<\/span><span>(<\/span><span>\"doSomethingExpensive\"<\/span><span>,<\/span><span> <\/span><span>somePayload<\/span><span>)<\/span><span>;<\/span><span> <\/span><span>\/\/ this will NOT block further execution, and runs in the background<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>queue<\/span><span>(<\/span><span>\"doSomethingExpensive\"<\/span><span>,<\/span><span> <\/span><span>someOtherPayload<\/span><span>)<\/span><span>;<\/span><span> <\/span><span>\/\/ the callback will NOT run until the previous callback is complete<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ ... call as many times as you want<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>Want to try it yourself? Just define a method like processMessage in your agent, and you\u2019re ready to scale.<\/p>\n<h4>New email adapter<\/h4>\n<p>Want to build an AI agent that can receive and respond to emails automatically? With the new email adapter and onEmail lifecycle method, now you can.<\/p>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>EmailAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>onEmail<\/span><span>(<\/span><span>email<\/span><span>:<\/span><span> <\/span><span>AgentEmail<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>raw<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>email<\/span><span>.<\/span><span>getRaw<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>parsed<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>PostalMime<\/span><span>.<\/span><span>parse<\/span><span>(<\/span><span>raw<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>\/\/ create a response based on the email contents<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ and then send a reply<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>this<\/span><span>.<\/span><span>replyToEmail<\/span><span>(<\/span><span>email<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>fromName<\/span><span>:<\/span><span> <\/span><span>\"Email Agent\"<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>body<\/span><span>:<\/span><span> <\/span><span>`Thanks for your email! You've sent us \"<\/span><span>${<\/span><span>parsed<\/span><span>.<\/span><span>subject<\/span><span>}<\/span><span>\". We'll process it shortly.`<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>You route incoming mail like this:<\/p>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>export<\/span><span> <\/span><span>default<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>email<\/span><span>(<\/span><span>email<\/span><span>,<\/span><span> <\/span><span>env<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>await<\/span><span> <\/span><span>routeAgentEmail<\/span><span>(<\/span><span>email<\/span><span>,<\/span><span> <\/span><span>env<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>resolver<\/span><span>:<\/span><span> <\/span><span>createAddressBasedEmailResolver<\/span><span>(<\/span><span>\"EmailAgent\"<\/span><span>)<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>};<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>You can find a full example <a href=\"https:\/\/github.com\/cloudflare\/agents\/tree\/main\/examples\/email-agent\" target=\"_blank\">here<\/a>.<\/p>\n<h4>Automatic context wrapping for custom methods<\/h4>\n<p>Custom methods are now automatically wrapped with the agent&#8217;s context, so calling <code>getCurrentAgent()<\/code> should work regardless of where in an agent&#8217;s lifecycle it&#8217;s called. Previously this would not work on RPC calls, but now just works out of the box.<\/p>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>export<\/span><span> <\/span><span>class<\/span><span> <\/span><span>MyAgent<\/span><span> <\/span><span>extends<\/span><span> <\/span><span>Agent<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>async<\/span><span> <\/span><span>suggestReply<\/span><span>(<\/span><span>message<\/span><span>)<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>\/\/ getCurrentAgent() now correctly works, even when called inside an RPC method<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>{<\/span><span> <\/span><span>agent<\/span><span> <\/span><span>}<\/span><span> <\/span><span>=<\/span><span> <\/span><span>getCurrentAgent<\/span><span>()<\/span><span>!<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>return<\/span><span> <\/span><span>generateText<\/span><span>(<\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>prompt<\/span><span>:<\/span><span> <\/span><span>`Suggest a reply to: \"<\/span><span>${<\/span><span>message<\/span><span>}<\/span><span>\" from \"<\/span><span>${<\/span><span>agent<\/span><span>.<\/span><span>name<\/span><span>}<\/span><span>\"`<\/span><span>,<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>tools<\/span><span>:<\/span><span> [<\/span><span>replyWithEmoji<\/span><span>]<\/span><span>,<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>Try it out and tell us what you build!<\/p>","protected":false},"excerpt":{"rendered":"<p>The latest releases of @cloudflare\/agents brings major improvements to MCP transport protocols support and agents connectivity. Key updates include: MCP elicitation support MCP servers can now request user input during tool execution, enabling interactive workflows like confirmations, forms, and multi-step processes. This feature uses durable storage to preserve elicitation state even during agent hibernation, ensuring [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-26","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/26\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}