Kody weekly: Your agent can send and receive email
Kent C. Dodds · · 3 min read
Here is what shipped in Kody from April 25 to May 1, 2026. This week Kody gets email, and packages grow into long-running workloads with services, secrets, subscriptions, and search retrievers.
Your agent can send and receive email
What shipped
The new MCP email domain gives your agent inboxes. email_inbox_create makes
an inbox with a routable alias, and mail sent to it is parsed and stored.
email_message_list, email_message_get, and email_attachment_get read
stored messages, headers, threads, and attachments. email_send sends from a
verified sender identity (set one up with email_sender_identity_verify), and
email_reply replies to a stored message. Mail to unknown aliases is rejected,
and display names are not trusted: the envelope sender, parsed From, and
authentication headers are stored separately.
Packages can subscribe to email.message.received. A handler gets the message
id and receipt metadata, loads the body with email_message_get or
import { email } from 'kody:runtime', and can call normal capabilities such as
agent_chat_turn and email_reply.
Why it matters
Email is where many requests and notifications already arrive. With a Kody inbox your agent can receive a message, decide what to do with it, and reply, all from code you own in a package, instead of you forwarding mail into a chat by hand.
Example
Ask your agent, through execute:
- Call
email_inbox_createto make an inbox and note its alias. - Send a test message to that alias from your own mail client.
- Call
email_message_list, thenemail_message_getwith the new message id to read the parsed body.
More updates
- Packages: Adds package services. Declare
kody.servicesinpackage.jsonfor long-running, gateway-style workloads with MCP controls, status, auto-start, and a persistent mode. (#264, #267) - Automations: Adds declarative package subscriptions, so a package can react to events such as new email. (docs, #267)
- Credentials: Lets you approve a secret for specific packages, from the
account secrets page or with
allowedPackageson/connect/secret, and packages declare the secrets they need withsecretMounts. (docs, #267, #311) - Packages: Adds an external invocation API. Trusted callers can run a
package export with
POST /api/package-invocations/:package/:exportusing a token limited to a user, package, export, and source. (#275) - Packages: Adds
kody.retrievers, so a package can contribute results tosearchand automatic context. Retriever failures turn into warnings instead of failing search. (#280) - Packages: Supports named re-exports with export metadata from JSDoc and
signatures, and npm dependencies declared in
package.jsonthat resolve at bundle time. (#304, #306) - Credentials: Adds
jwt_sign, which signs a JWT you provide with a private key from a saved secret (RS256, with optional JSON field extraction for service account files). (#283) - MCP: Shows capability inputs and outputs in search as generated TypeScript types, including schema descriptions as JSDoc. (#279, #303)
Fixes
- MCP: Fixes capability search dropping literal name matches. (#272)
- Credentials: Fixes secret host approval links so validation errors show on the account secrets page and approving keeps you on the selected secret. (#276, #278)
- Credentials: Tightens how OAuth connector credentials are attached to requests. (#313)
- Email: Fixes outbound reply and thread headers, and empty HTML bodies no longer get filled with the subject. (#287)
- Platform: Fixes home connector websocket reconnects and gives clearer, retried errors for Bond and Lutron devices. (#288, #294, #277, #302, #289)
Try it
Create an inbox with email_inbox_create, send it a message, and ask your agent
to read it back with email_message_get.
Questions or feedback? Join us on the Kody Discord.