- Python clients now JSON-escape
$VARvalues.langchain-atomicmail,pydantic-ai-atomicmailand the Dify plugin substituted$VARvalues into the JMAP JSON unescaped, so a crafted inbound subject could add method calls to areply.jsonbatch (reachable since 0.3.30). Values are now escaped in string context, like the TypeScript runtime. Python callers who pre-escaped values (for example\nfor a newline) should now pass raw text. reply.jsonpicks its recipient like the hosted MCP server (first usable Reply-To, else From, else Sender) and replies to that one address only. Line breaks in the subject collapse to a space and an existingRe:is kept.- Send examples in
helpand the docs now file the sender's copy in Sent and clear$drafton success, like the bundled presets.
Changelog
Notable changes to the agent packages: AgentSkill, the MCP servers, presets and integrations. The source of truth is CHANGELOG.md in the repository; this page mirrors it.
- Sent mail no longer stays a draft in the inbox. The send presets (
send_mail.json,send_mail_attachment.json,send_mail_blob_attachment.json,reply.json) now file the sender's copy in Sent and clear$draftonce the message is submitted, so it is marked$sentinstead of looking unsent. Accounts without a Sent mailbox keep using the inbox. reply.jsonsends again, in the same thread. The server rejected it withinvalidProperties, so no reply ever went out. The client now looks up the original byMAIL_IDand replies to its Reply-To (else From), withRe:andinReplyToset. Inputs are unchanged (MAIL_ID,BODY), so the n8n and Dify reply actions work too.list_inbox.jsonshows only mail that arrived; the agent's own sent mail is no longer mixed in. Read it withlist_sent.json.