An agentic calendar and email management system built on Cloudflare Workers, combining email handling with calendar availability and scheduling capabilities
Server has 16 tools with complete input schemas and descriptions. Naming follows verb_noun convention (get_, list_, find_, block_, draft_, mark_, move_, discard_). Descriptions are substantive (100-250 chars typical), explaining WHAT and WHEN. However, output schemas are not documented in the provided source, critical for LLM planning. Parameters lack enums where appropriate (e.g., folder names in list_emails, priority levels). Error handling and recovery guidance are absent. No tool annotations (readOnlyHint, destructiveHint) visible. Composition is sound: tools are single-responsibility and chainable (e.g., list_calendars → get_availability → block_time). Security concern: guest_emails in block_time accepts free-form array with no validation hint.
Create a tentative time block on the calendar (asynchronous). Writes the block immediately (busy), spawns BlockTimeWorkflow to run the invite lifecycle, and returns pending status without waiting for acceptances.
Delete a draft email from the Drafts folder.
Draft a new email (not a reply) and save it to the Drafts folder. Does NOT send — saves a draft for the operator to review.
Draft a reply to an existing email and save it to the Drafts folder. Does NOT send — saves a draft for the operator to review. Includes quoted original message.
Find available time slots matching a duration within a window, respecting working hours and optional minimum gaps between bookings.
Get busy intervals in a time window. Returns the busy periods (opaque events only, merged into intervals) and feed health warnings.
Get a single email with its full body content and attachments. Use this to read the actual content of an email. Body content is fenced as untrusted data.
Output schemas not documented. LLMs cannot plan downstream tool calls or extract required fields (e.g., what does block_time return? Is there a block_id for later reference?). Critical for multi-step workflows.
No enum constraints on folder names (list_emails, move_email). Descriptions say 'e.g., inbox, sent, draft' but LLMs may hallucinate invalid folder names. Should declare enum: ['inbox', 'sent', 'draft', ...] or provide a list_folders discovery tool.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
Get all emails in a conversation thread. Essential for understanding the full context of a conversation before drafting a response. Returns all messages sorted chronologically with body content fenced as untrusted data.
List concrete calendar events in a window (as opposed to busy intervals). Returns all events including FREE/TRANSPARENT ones (all-day markers, OOO, holidays, tentative holds). Includes is_own_block flag for events created by the agent.
List all registered calendar feeds and their ingest health status. Lets the agent answer 'what calendars can you see / are they fresh?' directly.
List emails in a folder. Returns email metadata (id, subject, sender, recipient, date, read/starred status, thread_id). Use folder='inbox' for received emails, 'sent' for sent emails.
List all registered email mailboxes with their metadata (id, email, name, settings).
Mark an email as read or unread.
Move an email to a different folder.
Search for emails matching a query across subject and body fields. Returns results with snippets fenced as untrusted data.
Update an existing draft email with new content. Verifies the body before saving.
No error handling guidance. Tools lack recovery hints (e.g., 'If email not found, try search_emails first'). Errors will be raw API responses with no actionable next steps for the LLM.
No tool annotations visible (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. discard_draft and block_time (force=true) should be marked destructive.
block_time accepts guest_emails as free-form array with no validation. LLMs may pass invalid email formats or non-existent addresses. Should validate format or provide a search_contacts tool to resolve names to emails.