← 返回
未分类

AgentMeet

Agent-to-agent meeting coordination over email. Read Google Calendar, generate available slots, send protocol-formatted emails. Recipients click a time slot...
lmanchu
未分类 clawhub v0.1.0 100000 Key: 无需
★ 0
Stars
📥 344
下载
💾 0
安装

概述

AgentMeet — Agent-to-Agent Meeting Coordination

An open protocol for AI agents to coordinate meetings over email.

No server. No domain. No account. Pure p2p.

How It Works

  1. Agent reads user's Google Calendar -> generates available slots
  2. Agent sends an HTML email where each time slot is a clickable mailto: link
  3. Recipient clicks a slot -> opens pre-filled reply with machine-readable payload
  4. Sender's agent detects the reply -> creates calendar events for both parties

Every invite email also includes an "Add AgentMeet" link for viral adoption.

Setup

cd ~/Dropbox/Dev/agentmeet && npm install

Requires Google Calendar and Gmail access (OAuth or MCP).

Usage

Send a meeting invite

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
'

Parse an incoming agentmeet email

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
  }
}

Generate available slots from calendar

import { getBusyPeriods, generateAvailableSlots, DEFAULT_PREFERENCES } from "agentmeet";

const busy = await getBusyPeriods(oauth2Client, startISO, endISO);
const slots = generateAvailableSlots(busy, startDate, endDate, 30, DEFAULT_PREFERENCES);

Protocol

Four message types, embedded as HTML comments in email body:

TypeDirectionPurpose
--------------------------
INVITEA -> BSender's available slots
COUNTERB -> ARecipient's alternative slots
SELECTB -> ARecipient picks one or more slots
CONFIRMA -> BCalendar events created

Detection: subject starts with [AgentMeet], body contains