An open protocol for AI agents to coordinate meetings over email.
No server. No domain. No account. Pure p2p.
Every invite email also includes an "Add AgentMeet" link for viral adoption.
cd ~/Dropbox/Dev/agentmeet && npm install
Requires Google Calendar and Gmail access (OAuth or MCP).
bun run -e '
import { buildInvite } from "~/Dropbox/Dev/agentmeet/src/invite";
import { writeFileSync } from "fs";
const result = await buildInvite({
from: { name: "YOUR_NAME", email: "YOUR_EMAIL" },
to: "RECIPIENT_EMAIL",
meeting: {
title: "Meeting Title",
duration_minutes: 30,
notes: "Optional description",
},
slots: [
{ start: "2026-03-25T10:00:00+08:00", end: "2026-03-25T10:30:00+08:00" },
],
});
// result.subject = email subject line
// result.html = email body (HTML with embedded protocol payload)
// Send via Gmail API or any email service
'
import { parseAgentMeetEmail, isAgentMeetSubject } from "agentmeet";
// Check subject line
if (isAgentMeetSubject(emailSubject)) {
const payload = parseAgentMeetEmail(emailHtmlBody);
if (payload) {
console.log(payload.type); // INVITE | COUNTER | SELECT | CONFIRM
console.log(payload.request_id); // am_xxx
console.log(payload.selected_slots); // for SELECT type
}
}
import { getBusyPeriods, generateAvailableSlots, DEFAULT_PREFERENCES } from "agentmeet";
const busy = await getBusyPeriods(oauth2Client, startISO, endISO);
const slots = generateAvailableSlots(busy, startDate, endDate, 30, DEFAULT_PREFERENCES);
Four message types, embedded as HTML comments in email body:
| Type | Direction | Purpose |
|---|---|---|
| ------ | ----------- | --------- |
| INVITE | A -> B | Sender's available slots |
| COUNTER | B -> A | Recipient's alternative slots |
| SELECT | B -> A | Recipient picks one or more slots |
| CONFIRM | A -> B | Calendar events created |
Detection: subject starts with [AgentMeet], body contains