addevent-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@addevent-mcp-serverCreate an event for project review on Monday 3pm"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
addevent-mcp-server
An MCP server that wraps the AddEvent Calendar & Events API v2, so Claude can create, search, retrieve, update, and delete events, calendars, and RSVP attendees on your AddEvent account.
Tools
Events — addevent_create_event, addevent_search_events, addevent_get_event, addevent_update_event, addevent_delete_event
Calendars — addevent_create_calendar, addevent_search_calendars, addevent_get_calendar, addevent_update_calendar, addevent_delete_calendar
RSVP attendees — addevent_create_rsvp, addevent_search_rsvps, addevent_get_rsvp, addevent_update_rsvp, addevent_delete_rsvp
Helper — addevent_list_timezones (looks up valid timezone values for events/calendars)
Related MCP server: google-calendar-mcp
1. Get your AddEvent API key
Sign in at dashboard.addevent.com, go to Settings > API, and copy the API token. This is the value the server sends as Authorization: Bearer <token> on every request.
2. Run it locally (stdio, for Claude Desktop)
npm install
cp .env.example .env # then paste your API key into ADDEVENT_API_KEY
npm run build
npm startTo use it from Claude Desktop, add it to your MCP config (Claude Desktop settings > Developer > Edit Config):
{
"mcpServers": {
"addevent": {
"command": "node",
"args": ["/absolute/path/to/addevent-mcp-server/dist/index.js"],
"env": {
"ADDEVENT_API_KEY": "your-api-token-here"
}
}
}
}3. Deploy to Vercel (remote connector, works from any device)
This mirrors your existing ghl-mcp-remote setup.
npm install -g vercel # if you don't already have it
vercel login
cd addevent-mcp-server
vercelThen, in the Vercel project dashboard: Settings > Environment Variables, add ADDEVENT_API_KEY with your token, and redeploy so the function picks it up.
Your MCP endpoint will be:
https://<your-project-name>.vercel.app/api/mcpAdd that URL as a custom connector in Claude (claude.ai > Settings > Connectors, or wherever your workspace manages MCP connectors), the same way ghl-mcp-remote.vercel.app shows up in your tool list now.
4. Test before connecting
The MCP Inspector is the fastest way to sanity-check tool calls before wiring the server into Claude:
npx @modelcontextprotocol/inspectorPoint it at node dist/index.js (stdio) or http://localhost:3000/mcp (after running TRANSPORT=http npm start locally).
Notes on the AddEvent API
Base URL:
https://api.addevent.com/calevent/v2. Auth is a Bearer token, not an API-key header.Search endpoints return up to
page_size(max 20) results per call — usepageto page through more.The AddEvent docs list the search-calendars response's array key as
calendar(singular), which is inconsistent witheventsandrsvpselsewhere. The client code (src/format.ts,extractArray) checks bothcalendarandcalendarsdefensively so this doesn't silently return an empty list — worth confirming against a real response the first time you runaddevent_search_calendars, and simplifying once confirmed.Deleting an event, calendar, or RSVP attendee is permanent — there's no undo or archive endpoint in this API.
RSVP creation only works on events created with
rsvp_enabled: true.
Extending this server
Not covered yet, but straightforward to add if you need them later: calendar subscribers, RSVP forms, and event/calendar landing page templates (all read-only list/search endpoints in the AddEvent API). Follow the pattern in src/tools/timezones.ts for a minimal read-only tool.
Available Tools
16 toolsaddevent_create_calendarCreate AddEvent CalendarA
Creates a new calendar (a container that events live inside).
Args:
title (string, required): The calendar's title.
timezone, weekday_begin, description, internal_name, calendar_color, landing_page_template_id, embeddable_calendar_template_id, custom_data: optional fields.
Returns: The created calendar object as JSON, including its calendar_id.
Examples:
"Set up a separate calendar for the WREIA meetups" -> title: "WREIA Meetups".
Don't use when: you just need to add an event to an existing calendar (use addevent_create_event with calendar_id instead).
Error Handling:
Returns "Error: Invalid request..." (400) if title is missing.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The calendar's title. Must be a non-empty, single-line string. | |
| timezone | No | Default timezone for events created on this calendar (e.g. 'America/Denver'). Defaults to 'America/Los_Angeles'. Use addevent_list_timezones for supported values. | |
| custom_data | No | Arbitrary key-value metadata to attach to the calendar. Use snake_case keys. | |
| description | No | Shown on the calendar's landing page. Accepts plain text or simplified HTML. | |
| internal_name | No | Internal-only label, never shown publicly. | |
| weekday_begin | No | First day of the week shown on the calendar. Default 'sunday'. | |
| calendar_color | No | Calendar color, 1 to 20. Default 1. | |
| landing_page_template_id | No | Custom calendar landing page template ID, or 'default'. | |
| embeddable_calendar_template_id | No | Custom embeddable calendar template ID, or 'default'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=false), the description discloses return value ('Returns the created calendar object as JSON, including its calendar_id') and error behavior ('Returns "Error: Invalid request..." (400) if title is missing'). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized with clear sections: what it does, args, returns, examples, don't-use guidance, and error handling. Each section earns its place without redundancy, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description covers return format, error handling, usage alternatives, and parameter guidance. For a 9-param tool with 100% schema coverage, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by providing a usage example for the title parameter and clearly separating required from optional fields, which helps the agent understand parameter selection in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Creates a new calendar (a container that events live inside).' It distinguishes from siblings by explicitly contrasting with addevent_create_event, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-not-to-use guidance: 'Don't use when: you just need to add an event to an existing calendar (use addevent_create_event with calendar_id instead).' Also includes a concrete example to illustrate when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_create_eventCreate AddEvent EventA
Creates a new event on an AddEvent calendar.
Args:
title (string, required): The event's title.
calendar_id (string, optional): Target calendar. Defaults to the account's default calendar. Use addevent_search_calendars to find IDs.
datetime_start (string, required): Start date/time, e.g. "2026-09-15 18:00" or "2026-09-15" for a date-only event.
datetime_end (string, optional): End date/time. Defaults to datetime_start + 1 hour.
all_day_event, timezone, recurring_rule, description, internal_name, location, location_id, organizer_name, organizer_email, reminder, color, free_busy, landing_page_template_id, rsvp_enabled, rsvp_form_id, custom_data: optional fields, see each field's description.
Returns: The created event object as JSON, including its event_id and public landing_page_url.
Examples:
"Create the Main Monthly meetup for Sept 15 at 6pm at [venue]" -> title, datetime_start, location set.
"Make it a recurring event, third Tuesday of every month" -> recurring_rule: "FREQ=MONTHLY;BYDAY=3TU".
Don't use when: the event already exists (use addevent_update_event instead).
Error Handling:
Returns a clear message if required fields are missing, the calendar_id doesn't exist, or the API rejects the request body (400).
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Event color, 1 to 20, matching the calendar's palette. Default 1. | |
| title | Yes | The event's title. Must be a non-empty, single-line string. | |
| location | No | Address or URL (e.g. a Zoom link). Mutually exclusive with location_id. | |
| reminder | No | Minutes before the event to send a reminder, 0 to 10800. Default 30. Only honored by Apple Calendar, Outlook desktop, and Office 365/Outlook.com. | |
| timezone | No | IANA-style timezone (e.g. 'America/Denver') or 'floating' for a time that stays the same on every viewer's local clock. Defaults to the calendar's timezone. Use addevent_list_timezones for supported values. | |
| free_busy | No | Whether the event blocks the attendee's calendar: 'free', 'busy', or 'default' (use their default setting). | |
| calendar_id | No | The calendar this event belongs to. Defaults to the account's default calendar if omitted. Use addevent_search_calendars to find calendar IDs. | |
| custom_data | No | Arbitrary key-value metadata to attach to the event, e.g. an external ID linking back to GHL. Use snake_case keys. | |
| description | No | Plain text or simplified HTML description. Keep to roughly 500 characters or fewer for cross-browser compatibility. | |
| location_id | No | ID of a saved location. Mutually exclusive with location. | |
| datetime_end | No | End date/time, same format as datetime_start. Defaults to datetime_start + 1 hour if omitted. | |
| rsvp_enabled | No | If true, attendees must RSVP before adding the event to their calendar. Default false. | |
| rsvp_form_id | No | Custom RSVP form ID, or 'default' for the standard form. | |
| all_day_event | No | If true, start/end times are ignored and only the date is used. Default false. | |
| internal_name | No | Internal-only label, never shown publicly. Useful for a human-readable label or an external ID linking back to another system. | |
| datetime_start | Yes | Start date/time, e.g. '2026-09-15 18:00' or '2026-09-15' for a date-only event. | |
| organizer_name | No | Organizer's name. Must be paired with organizer_email. | |
| recurring_rule | No | iCalendar RRULE string for a repeating event (e.g. 'FREQ=MONTHLY;BYDAY=3TU' for the third Tuesday of every month). Leave empty for a one-time event. datetime_start must align with the rule for strict clients like Outlook desktop and Apple Calendar. Not supported by Yahoo Calendar. | |
| organizer_email | No | Organizer's email. Must be paired with organizer_name. Including an organizer makes calendar clients like Outlook desktop treat this as a meeting rather than an appointment. | |
| landing_page_template_id | No | Custom event landing page template ID, or 'default' for the standard AddEvent template. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-read-only, non-idempotent behavior. The description adds valuable behavioral context: error handling for missing fields/invalid calendar_id/400 responses, default behaviors (datetime_end defaults to +1 hour), return value shape (event_id and landing_page_url), and caveats like recurring_rule alignment. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized for a complex 20-parameter tool. It is well-structured with clear sections: purpose, Args, Returns, Examples, Error Handling, and When-not-to-use. Every section serves a purpose and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity (20 params, no output schema), the description is remarkably complete. It explains return values, error handling, defaults, and use cases. It even addresses edge cases like all-day events and cross-client reminder limitations. The only minor gap is not discussing the openWorldHint annotation, but that is not essential for tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 20 parameters. The description adds a helpful Args summary and examples that map natural language to fields (e.g., 'third Tuesday' -> recurring_rule). While not fundamentally new, the examples and consolidated overview add value above the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Creates a new event on an AddEvent calendar' with a specific verb and resource. This clearly distinguishes it from sibling tools like addevent_update_event, addevent_delete_event, and addevent_search_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance through examples and an explicit 'Don't use when: the event already exists (use addevent_update_event instead).' This directly tells the agent when to avoid this tool and names the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_create_rsvpCreate AddEvent RSVP AttendeeA
Registers an RSVP attendee on an event. Only works on events created with rsvp_enabled: true.
Args:
event_id (string, required): The event to RSVP to.
email (string, required): Attendee's email. Must be unique per event.
attending ('going' | 'maybe' | 'not-going', optional): Default 'going'.
notify ('active', optional): Set to send confirmation/notification emails. Omitted by default (silent creation) — useful when backfilling attendees from another system.
rsvp_form_data (object, optional): Values for the event's RSVP form. The default form needs { "name": "..." }.
Returns: The created RSVP attendee object as JSON, including its attendee_id.
Examples:
"Add jane@example.com as attending the Main Monthly meetup" -> event_id, email set.
"Import these 20 signups from our spreadsheet without emailing them" -> omit notify.
Don't use when: the event doesn't have RSVP enabled (check with addevent_get_event first).
Error Handling:
Returns "Error: Invalid request..." (400) if the email is already registered for this event, or rsvp_form_data is missing a required field.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Attendee's email address. Must be unique per event; update and reminder emails are sent here. | ||
| notify | No | Set to 'active' to send the attendee a confirmation email and, if the event's RSVP settings call for it, notify the organizer. Omit to create the RSVP silently (no emails sent). | |
| event_id | Yes | The event to RSVP to. | |
| attending | No | Attendee's response. Default 'going'. | |
| rsvp_form_data | No | Values for the event's RSVP form fields. The default form requires a 'name' field, e.g. { "name": "Jane Doe" }. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavioral traits: default silent creation when notify is omitted, the uniqueness requirement for email per event, and error conditions (400 for duplicate email or missing rsvp_form_data fields). It also states the return value clearly. These details add substantial value over the minimal annotation set and do not contradict any hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (overview, Args, Returns, Examples, Error Handling) and uses bullet points for parameters. It is thorough but not verbose; every sentence contributes either context, example, or error information. This makes it easy to scan and process.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with 5 parameters, a nested object, and no output schema, this description covers all necessary aspects: purpose, prerequisites, every parameter, return value, error handling, and usage examples. It is fully actionable for an agent to invoke the tool correctly and understand the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds practical context, such as the 'backfilling attendees from another system' use case for omitting notify and the note that the default RSVP form requires a 'name' field. This enriches parameter understanding beyond the raw schema definitions, though most semantic weight is carried by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Registers an RSVP attendee on an event,' which uses a specific verb and resource, clearly distinguishing it from sibling tools like search_rsvps, get_rsvp, update_rsvp, and delete_rsvp. It further clarifies scope by stating it only works on events created with rsvp_enabled: true, removing any ambiguity about applicability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: 'Don't use when: the event doesn't have RSVP enabled (check with addevent_get_event first).' It also gives concrete examples of appropriate usage, such as adding an attendee or importing signups silently, making it easy for an agent to decide when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_delete_calendarDelete AddEvent CalendarADestructiveIdempotent
Permanently deletes a calendar. This cannot be undone, and affects any events still on it.
Args:
calendar_id (string, required): The calendar to delete.
Returns: A confirmation message.
Examples:
Before deleting, consider calling addevent_search_events with this calendar_id to check what's still on it.
Error Handling:
Returns "Error: Not found..." (404) if the calendar_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_id | Yes | The ID of the calendar to permanently delete. Check addevent_search_events first, since events on this calendar are affected too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the destructiveHint annotation by disclosing permanence ('cannot be undone'), the cascading effect on events, and specific error handling (404). This adds valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections for Args, Returns, Examples, and Error Handling. It is concise but the Returns line ('A confirmation message') adds little value and the Args section duplicates schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 1-parameter delete tool without an output schema, the description covers the essential context: purpose, permanence, cascading effects, return type, error behavior, and a pre-check recommendation. It is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage and a detailed description for calendar_id. The description's Args section merely restates the parameter with less detail, adding no new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Permanently deletes a calendar' with a specific verb and resource, and further clarifies that it affects events on the calendar. This distinguishes it from related tools like addevent_delete_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example suggests calling addevent_search_events first to check events, providing practical guidance. However, it doesn't explicitly state when not to use this tool or name alternatives for calendar deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_delete_eventDelete AddEvent EventADestructiveIdempotent
Permanently deletes an event. This cannot be undone.
Args:
event_id (string, required): The event to delete.
Returns: A confirmation message.
Examples:
"Delete the duplicate event we just created" -> event_id set.
Don't use when: you want to hide an event without losing it (there's no archive/unpublish option in this API; deletion is permanent).
Error Handling:
Returns "Error: Not found..." (404) if the event_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | The ID of the event to permanently delete. This cannot be undone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by emphasizing the permanence ('This cannot be undone'), detailing error handling for non-existent event IDs, and stating the return value. These are meaningful behavioral traits that are not fully captured by the destructiveHint and idempotentHint annotations, providing valuable context for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with sections for Args, Returns, Examples, and Error Handling. It front-loads the primary purpose and every sentence contributes useful information, avoiding redundancy or unnecessary length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter delete tool, the description covers all necessary aspects: purpose, parameter, return value, error handling, and usage examples. The annotations already provide safety and idempotency hints, and the description fills in the remaining behavioral details, making it complete for safe and correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full coverage of the only parameter (event_id) with a clear description. The description's Args section repeats similar information without adding new semantic details. The example given in the description is more about usage guidance than parameter semantics, so it does not meaningfully enhance understanding of the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Permanently deletes an event' with a specific verb and resource, and distinguishes itself from sibling tools like addevent_delete_calendar and addevent_delete_rsvp by targeting events. The title and description align, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete example ('Delete the duplicate event we just created') and an explicit 'Don't use when' exclusion for hiding events, noting there is no archive/unpublish option. This gives clear guidance on when to use the tool and when to avoid it, though it does not name an alternative sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_delete_rsvpDelete AddEvent RSVP AttendeeADestructiveIdempotent
Permanently deletes an RSVP attendee. This cannot be undone.
Args:
attendee_id (string, required): The RSVP attendee to delete.
Returns: A confirmation message.
Error Handling:
Returns "Error: Not found..." (404) if the attendee_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| attendee_id | Yes | The ID of the RSVP attendee to permanently delete. This cannot be undone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds 'cannot be undone' and specific error handling (404 with 'Not found'), giving additional context about permanence and failure behavior beyond the hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a clear front-loaded first sentence, followed by useful structured sections for args, returns, and errors. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete tool, the description fully covers purpose, return value, and error handling. Annotations cover destructive and idempotent behavior, so no gaps remain for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both the schema and description describe attendee_id as required and permanent. The description adds minimal meaning beyond the schema—it just restates the parameter's purpose without new details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Permanently deletes an RSVP attendee' with a specific verb and resource. This clearly distinguishes it from sibling tools like update_rsvp or get_rsvp, and the destructive nature is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the delete semantics, but the description does not explicitly state when to use this over alternatives (e.g., update_rsvp for changing attendee status). No exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_get_calendarRetrieve AddEvent CalendarARead-onlyIdempotent
Retrieves a single calendar by its calendar_id.
Args:
calendar_id (string, required): The calendar to retrieve.
Returns: The full calendar object as JSON.
Error Handling:
Returns "Error: Not found..." (404) if the calendar_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_id | Yes | The ID of the calendar to retrieve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable context by specifying the 404 error response and the JSON return format, without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sections (purpose, args, returns, error handling) with no redundancy; every line adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with a single parameter, the description covers the return format and error behavior. Combined with rich annotations, it is fully complete without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description merely paraphrases the schema's parameter description. No additional semantic meaning is provided beyond marking it required (already in schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'retrieves' and the specific resource 'single calendar by its calendar_id', distinguishing it from sibling search/update/delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when to use (when you have a calendar_id and need a single calendar), but does not explicitly name alternatives or exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_get_eventRetrieve AddEvent EventARead-onlyIdempotent
Retrieves a single event by its event_id.
Args:
event_id (string, required): The event to retrieve.
Returns: The full event object as JSON.
Examples:
"Show me the details for event evt_abc123" -> event_id: "evt_abc123".
Don't use when: you don't have the event_id yet (use addevent_search_events first).
Error Handling:
Returns "Error: Not found..." (404) if the event_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | The ID of the event to retrieve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds return format ('full event object as JSON') and a specific error-handling behavior ('Error: Not found...' on 404). This meaningfully extends the annotation context, though it does not cover potential auth or rate-limit details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Examples, Error Handling) and every sentence contributes new information. It is brief yet comprehensive, with the core purpose stated in the first sentence for immediate recognition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-entity retrieval tool with one parameter and no output schema, this description covers all essential aspects: what it retrieves, how to pass the parameter, what the return value looks like, and error behavior. It also points to the appropriate sibling for cases where the ID is unknown, fully equipping the agent to act correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes event_id with 100% coverage, so the baseline is 3. The description adds value by giving a concrete example mapping user language ('Show me the details for event evt_abc123') to the parameter value, which helps the agent extract the argument from natural language.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Retrieves a single event by its event_id', which clearly states the exact verb, resource, and identifier used. It also distinguishes itself from addevent_search_events by explicitly noting that this tool requires an event_id, making the purpose unmistakably specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Don't use when: you don't have the event_id yet (use addevent_search_events first)'. This names the alternative tool and tells the agent exactly when to avoid this tool, going beyond mere context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_get_rsvpRetrieve AddEvent RSVP AttendeeARead-onlyIdempotent
Retrieves a single RSVP attendee by attendee_id.
Args:
attendee_id (string, required): The RSVP attendee to retrieve.
Returns: The full RSVP attendee object as JSON.
Error Handling:
Returns "Error: Not found..." (404) if the attendee_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| attendee_id | Yes | The ID of the RSVP attendee to retrieve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context by stating the return format ('full RSVP attendee object as JSON') and the 404 error when not found, going beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured into purpose, args, returns, and error handling sections. Each section is brief and earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with one parameter, the description covers purpose, parameter, return format, and error handling. Given the annotations and absence of an output schema, this is complete and sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage for attendee_id, describing it as 'The ID of the RSVP attendee to retrieve.' The description's Args section essentially repeats this info, adding no new details about format, uniqueness, or usage beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves a single RSVP attendee by attendee_id, using a specific verb and resource. This distinguishes it from sibling tools like search_rsvps (which searches) and create/update/delete operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is used when you have an attendee_id and need the full attendee object. It does not explicitly mention alternatives like search_rsvps or when not to use, but the context is clear enough for a simple getter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_list_timezonesList AddEvent TimezonesARead-onlyIdempotent
Lists the timezone values supported by AddEvent's timezone field on events and calendars.
Args:
search (string, optional): Filter results to timezone names containing this text.
Returns: { "timezones": [...], "count": number }
Examples:
"What timezone value should I use for Salt Lake City?" -> search: "Denver" (Utah shares the America/Denver zone).
Use this before addevent_create_event or addevent_create_calendar if you're unsure of the exact timezone string.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Optional case-insensitive filter, matched against the timezone name (e.g. 'Denver' or 'America/'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds useful behavioral context by specifying the return shape ({ timezones, count }) and the filtering behavior, plus a concrete example. It does not go into edge cases or error behavior, but for a simple read-only lookup this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-sentence purpose, an Args section, a Returns section, and two useful examples. Every part earns its place without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description is complete. It includes the return shape, usage context, and a practical example, while annotations cover the safety profile. No additional information is needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents the 'search' parameter as an optional case-insensitive filter. The description reinforces this with an example, but adds little beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Lists') and identifies the resource as 'timezone values supported by AddEvent's timezone field on events and calendars.' It clearly distinguishes this from sibling tools, which operate on events, calendars, and RSVPs rather than timezone metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: before addevent_create_event or addevent_create_calendar if you're unsure of the exact timezone string. This provides clear contextual guidance and names the relevant alternative workflows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_search_calendarsSearch AddEvent CalendarsARead-onlyIdempotent
Searches calendars you've previously created. Does NOT create or modify calendars.
Args:
calendar_ids (string[], optional): Narrow to specific calendar IDs.
page (number, default 1), page_size (number, 1-20, default 10): Pagination.
sort_by ('created' | 'title'), sort_order ('asc' | 'desc'): Sorting.
Returns: { "calendars": [ ...calendar objects... ], "count": number, "page": number, "page_size": number } An empty "calendars" array means no matches, not an error.
Examples:
"What calendars do we have set up?" -> call with no filters to list them all.
"Find the calendar_id for the WREIA calendar" -> useful before addevent_create_event.
Error Handling:
Returns "Error: Invalid request..." (400) for an invalid sort combination.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number of results, starting at 1. | |
| sort_by | No | Field to sort by: 'created' or 'title'. | |
| page_size | No | Number of results per page, between 1 and 20. | |
| sort_order | No | Sort direction, 'asc' or 'desc'. Requires sort_by. | |
| calendar_ids | No | Limit results to these specific calendar IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only and idempotent behavior; the description adds valuable context: empty result semantics ('An empty "calendars" array means no matches, not an error'), error handling for invalid sort combinations, and pagination behavior. This exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (intro, Args, Returns, Examples, Error Handling). Each section is concise and serves a purpose; no redundant fluff. Front-loaded with the primary purpose and non-mutation guarantee.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description provides the return shape, pagination details, empty-result semantics, and error handling. For a 5-parameter tool with rich sibling context, this is fully self-contained and complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions (100%), so baseline is 3. The description adds value by explaining the sort_order dependency (error for invalid combination), showing how calendar_ids is used in an example, and clarifying pagination defaults. This warrants a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Searches calendars you've previously created' with an explicit exclusion 'Does NOT create or modify calendars.' This distinguishes it from mutation tools and other search/list tools in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear use cases via examples ('What calendars do we have set up?' and 'Find the calendar_id for the WREIA calendar') and explicitly notes it is not for creating/modifying. However, it does not directly contrast with get_calendar, so differentiation from a single-calendar fetch is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_search_eventsSearch AddEvent EventsARead-onlyIdempotent
Searches events you've previously created. Does NOT create or modify events.
Args:
calendar_ids, event_ids (string[], optional): Narrow to specific calendars or events.
datetime_min, datetime_max (string, optional): Filter by date range. datetime_min matches events ending on/after that time; datetime_max matches events starting on/before it.
search (string, optional): Free-text match against title, internal_name, description, and location.
custom_data_key / custom_data_value (string, optional): Filter by a custom_data key-value pair. Both must be provided together.
page (number, default 1), page_size (number, 1-20, default 10): Pagination.
sort_by ('created' | 'title' | 'calendar_id' | 'datetime_start'), sort_order ('asc' | 'desc'): Sorting.
Returns: { "events": [ ...event objects... ], "count": number, // events in this response "page": number, "page_size": number } An empty "events" array means no matches, not an error.
Examples:
"What events do we have next month?" -> datetime_min/datetime_max set to that month's range.
"Find the Main Monthly event" -> search: "Main Monthly".
Don't use when: you already have the event_id (use addevent_get_event, it's cheaper).
Error Handling:
Returns "Error: Invalid request..." if a filter combination is invalid (e.g. custom_data_key without custom_data_value).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number of results, starting at 1. | |
| search | No | Free-text search across title, internal_name, description, and location. Case-insensitive. | |
| sort_by | No | Field to sort by. Defaults to 'created', or 'datetime_start' if datetime_min/datetime_max is set. | |
| event_ids | No | Limit results to these specific event IDs. | |
| page_size | No | Number of results per page, between 1 and 20. | |
| sort_order | No | Sort direction, 'asc' or 'desc'. Requires sort_by. | |
| calendar_ids | No | Limit results to these calendar IDs. | |
| datetime_max | No | Only events starting on/before this datetime (naive comparison, timezone not considered). Same formats as datetime_start. | |
| datetime_min | No | Only events ending on/after this datetime (naive comparison, timezone not considered). Same formats as datetime_start. | |
| custom_data_key | No | Filter by a custom_data key. Must be paired with custom_data_value. | |
| custom_data_value | No | Filter by a custom_data value. Must be paired with custom_data_key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces this with 'Does NOT create or modify events' and adds valuable runtime behavior: return shape, empty array meaning, error handling for invalid filter combinations, and pagination semantics. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into Args, Returns, Examples, and Error Handling sections. It is longer than necessary given the schema coverage, but every section earns its place for providing a comprehensive overview, especially without an output schema. It is not overly verbose and remains easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 optional parameters and no output schema, the description covers the full picture: parameter semantics (via schema and description), return format, example use cases, error behavior, and when to use an alternative. It even clarifies that an empty events array is not an error, which is important for callers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description mostly restates schema descriptions (e.g., datetime_min matches events ending on/after, custom_data_key/value must be paired, page_size range). It adds minor examples but no substantial new parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Searches events you've previously created. Does NOT create or modify events.' This specifies the action (search), the resource (previously created events), and explicitly distinguishes it from mutation tools like create/update/delete. It also contrasts with addevent_get_event by noting the alternative is cheaper when an event_id is already known.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance with concrete examples: 'What events do we have next month?' maps to setting datetime_min/max, and 'Find the Main Monthly event' maps to search. It also gives a direct exclusion: 'Don't use when: you already have the event_id (use addevent_get_event, it's cheaper).' This clearly tells when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_search_rsvpsSearch AddEvent RSVP AttendeesARead-onlyIdempotent
Searches RSVP attendees you've previously created. Does NOT create or modify RSVPs.
Args:
calendar_ids, event_ids (string[], optional): Narrow to attendees of these calendars or events.
attending (array of 'going' | 'maybe' | 'not-going', optional): Filter by response.
page (number, default 1), page_size (number, 1-20, default 10): Pagination.
sort_by ('created' | 'event_id' | 'attending' | 'email'), sort_order ('asc' | 'desc'): Sorting.
Returns: { "rsvps": [ ...attendee objects... ], "count": number, "page": number, "page_size": number } An empty "rsvps" array means no matches, not an error.
Examples:
"Who's RSVP'd yes to the Main Monthly meetup?" -> event_ids: [that event's ID], attending: ["going"].
"How many people said maybe across all our events this month?" -> attending: ["maybe"], combined with an event_ids or calendar_ids filter.
Don't use when: you already have the attendee_id (use addevent_get_rsvp, it's cheaper).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number of results, starting at 1. | |
| sort_by | No | Field to sort by: 'created', 'event_id', 'attending', or 'email'. | |
| attending | No | Limit to attendees with these responses. | |
| event_ids | No | Limit to attendees of these specific events. | |
| page_size | No | Number of results per page, between 1 and 20. | |
| sort_order | No | Sort direction, 'asc' or 'desc'. Requires sort_by. | |
| calendar_ids | No | Limit to attendees of events on these calendars. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, but the description adds substantial behavioral context beyond that: return shape, pagination semantics, empty 'rsvps' array meaning 'no matches, not an error', and explicit statement that it works only on previously created RSVPs. This is rich supplementary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a one-sentence purpose, a concise Args list, Returns object, examples, and an explicit anti-use case. Every section earns its place, and the formatting makes it easy to scan. Despite its length, it avoids redundancy and is optimally organized for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters, no output schema, and a moderately complex search tool, the description is complete: it documents all parameters with meaning, specifies the full return structure, clarifies edge-case behavior (empty results), and provides usage examples. There are no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all 7 parameters (100% coverage), so the baseline is 3. The description adds value by grouping related parameters (calendar_ids/event_ids), clarifying the meaning of attending ('Filter by response'), and giving real-world examples that illustrate parameter combinations. This exceeds baseline but does not need to fully compensate for schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Searches RSVP attendees you've previously created.' It also explicitly distinguishes itself from mutation tools ('Does NOT create or modify RSVPs') and from the single-record sibling addevent_get_rsvp, making the scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit and actionable. The description includes a direct 'Don't use when' section pointing to addevent_get_rsvp as cheaper when attendee_id is already known, and provides concrete examples showing when to use filters like attending and event_ids. This exceeds simple context and gives clear decision rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_update_calendarUpdate AddEvent CalendarAIdempotent
Updates an existing calendar. Only the fields you provide are changed; everything else is left as-is.
Args:
calendar_id (string, required): The calendar to update.
Any other field from addevent_create_calendar is optional here — include only what's changing.
Returns: The updated calendar object as JSON.
Error Handling:
Returns "Error: Not found..." (404) if calendar_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | The calendar's title. Must be a non-empty, single-line string. | |
| timezone | No | Default timezone for events created on this calendar (e.g. 'America/Denver'). Defaults to 'America/Los_Angeles'. Use addevent_list_timezones for supported values. | |
| calendar_id | Yes | The ID of the calendar to update. | |
| custom_data | No | Arbitrary key-value metadata to attach to the calendar. Use snake_case keys. | |
| description | No | Shown on the calendar's landing page. Accepts plain text or simplified HTML. | |
| internal_name | No | Internal-only label, never shown publicly. | |
| weekday_begin | No | First day of the week shown on the calendar. Default 'sunday'. | |
| calendar_color | No | Calendar color, 1 to 20. Default 1. | |
| landing_page_template_id | No | Custom calendar landing page template ID, or 'default'. | |
| embeddable_calendar_template_id | No | Custom embeddable calendar template ID, or 'default'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotent, non-destructive), the description adds specific error behavior (404 when calendar_id not found), return format (updated calendar object as JSON), and partial-update behavior. This gives the agent practical expectations without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized into Summary, Args, Returns, and Error Handling sections. Every sentence adds operational value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with fully described schema and good annotations, the description supplies the missing context: partial update behavior, return type, and error handling. It is complete enough for an agent to invoke the tool correctly without further clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% field-level descriptions, so the baseline is 3. The description adds meta-semantics: only provided fields are changed, calendar_id identifies the target, and other fields map to addevent_create_calendar. This is useful guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Updates an existing calendar', using a specific verb and resource. It distinguishes itself from sibling tools like addevent_create_calendar and addevent_delete_calendar by emphasizing 'existing' and partial-update semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: calendar_id is required and only provided fields are changed, so callers should include only what's changing. It doesn't explicitly name alternatives, but the 'existing calendar' wording and sibling tools make the intended use evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_update_eventUpdate AddEvent EventAIdempotent
Updates an existing event. Only the fields you provide are changed; everything else is left as-is.
Args:
event_id (string, required): The event to update.
Any other field from addevent_create_event (title, datetime_start, datetime_end, location, description, etc.) is optional here — include only what's changing.
Returns: The updated event object as JSON.
Examples:
"Move the Main Monthly meetup to 7pm" -> event_id set, datetime_start updated.
"Change the location to the new venue" -> event_id set, location updated.
Don't use when: the event doesn't exist yet (use addevent_create_event).
Error Handling:
Returns "Error: Not found..." (404) if event_id doesn't exist, or "Error: Invalid request..." (400) if a field value fails validation.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Event color, 1 to 20, matching the calendar's palette. Default 1. | |
| title | No | The event's title. Must be a non-empty, single-line string. | |
| event_id | Yes | The ID of the event to update. | |
| location | No | Address or URL (e.g. a Zoom link). Mutually exclusive with location_id. | |
| reminder | No | Minutes before the event to send a reminder, 0 to 10800. Default 30. Only honored by Apple Calendar, Outlook desktop, and Office 365/Outlook.com. | |
| timezone | No | IANA-style timezone (e.g. 'America/Denver') or 'floating' for a time that stays the same on every viewer's local clock. Defaults to the calendar's timezone. Use addevent_list_timezones for supported values. | |
| free_busy | No | Whether the event blocks the attendee's calendar: 'free', 'busy', or 'default' (use their default setting). | |
| calendar_id | No | The calendar this event belongs to. Defaults to the account's default calendar if omitted. Use addevent_search_calendars to find calendar IDs. | |
| custom_data | No | Arbitrary key-value metadata to attach to the event, e.g. an external ID linking back to GHL. Use snake_case keys. | |
| description | No | Plain text or simplified HTML description. Keep to roughly 500 characters or fewer for cross-browser compatibility. | |
| location_id | No | ID of a saved location. Mutually exclusive with location. | |
| datetime_end | No | End date/time, same format as datetime_start. Defaults to datetime_start + 1 hour if omitted. | |
| rsvp_enabled | No | If true, attendees must RSVP before adding the event to their calendar. Default false. | |
| rsvp_form_id | No | Custom RSVP form ID, or 'default' for the standard form. | |
| all_day_event | No | If true, start/end times are ignored and only the date is used. Default false. | |
| internal_name | No | Internal-only label, never shown publicly. Useful for a human-readable label or an external ID linking back to another system. | |
| datetime_start | No | Start date/time, e.g. '2026-09-15 18:00' or '2026-09-15' for a date-only event. | |
| organizer_name | No | Organizer's name. Must be paired with organizer_email. | |
| recurring_rule | No | iCalendar RRULE string for a repeating event (e.g. 'FREQ=MONTHLY;BYDAY=3TU' for the third Tuesday of every month). Leave empty for a one-time event. datetime_start must align with the rule for strict clients like Outlook desktop and Apple Calendar. Not supported by Yahoo Calendar. | |
| organizer_email | No | Organizer's email. Must be paired with organizer_name. Including an organizer makes calendar clients like Outlook desktop treat this as a meeting rather than an appointment. | |
| landing_page_template_id | No | Custom event landing page template ID, or 'default' for the standard AddEvent template. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only, idempotent, non-destructive behavior. The description adds valuable context beyond that: partial-update semantics, 404/400 error handling, and the note that validation failures return an error. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Examples, Error Handling, Don't use when). It front-loads the core purpose and each sentence earns its place, providing useful examples and error details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 21 parameters, the description covers the essential context: partial updates, error handling, return type (updated event object as JSON), and usage examples. It could have elaborated on edge cases (e.g., mutually exclusive fields), but the schema handles those details, and no output schema exists, so the return-type statement is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter already has detailed meaning. The description adds a few example parameter uses (datetime_start, location) and clarifies that event_id is required while all others are optional, but it largely relies on the schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Updates an existing event'—a specific verb + resource. It also clarifies partial-update semantics ('Only the fields you provide are changed; everything else is left as-is'), which distinguishes it from a full replace or create, and explicitly contrasts with addevent_create_event in the 'Don't use when' note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('Only the fields you provide are changed... include only what's changing') and when not to ('Don't use when: the event doesn't exist yet'), naming the alternative (addevent_create_event). The examples (moving a meeting, changing location) further clarify common usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addevent_update_rsvpUpdate AddEvent RSVP AttendeeAIdempotent
Updates an existing RSVP attendee. Only the fields you provide are changed; everything else is left as-is.
Args:
attendee_id (string, required): The RSVP attendee to update.
email, attending, rsvp_form_data: optional — include only what's changing.
Returns: The updated RSVP attendee object as JSON.
Examples:
"Mark jane@example.com as not going anymore" -> attendee_id set, attending: "not-going".
Error Handling:
Returns "Error: Not found..." (404) if attendee_id doesn't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| No | New email address, if changing it. | ||
| attending | No | New response: 'going', 'maybe', or 'not-going'. | |
| attendee_id | Yes | The ID of the RSVP attendee to update. | |
| rsvp_form_data | No | Updated values for the event's RSVP form fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (non-read-only, non-destructive, idempotent), the description adds valuable behavioral details: partial updates preserve unspecified fields, returns the updated object as JSON, and returns a 404 error for missing attendee_id. No annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Examples, Error Handling) and a concise opening sentence. No superfluous content; each section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 4-parameter schema with full description and no output schema, the description covers the necessary return format and error behavior. The example and partial-update semantics make the tool fully understandable for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is described, so baseline is 3. The description adds value by explicitly framing optional parameters as 'include only what's changing' and by providing an example mapping natural language to attendee_id and attending values (not-going).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Updates an existing RSVP attendee' with a specific verb and resource. The title and content distinguish it from sibling tools like create_rsvp, delete_rsvp, and update_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the partial-update behavior ('Only the fields you provide are changed') and gives a concrete example. It does not explicitly state when to prefer this over alternatives, but the RSVP-specific scope is clear from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct resource-action pair (create/search/get/update/delete for events, calendars, and RSVPs, plus list_timezones). The descriptions include explicit 'Don't use when' guidance to further prevent confusion between similar tools like search_events and get_event.
All 16 tools follow the exact pattern `addevent_<verb>_<resource>` with verbs restricted to create, search, get, update, delete, and list. This uniform convention makes the tool's purpose immediately predictable from its name.
16 tools is at the upper boundary of typical well-scoped server size, but each tool serves a clear CRUD need for one of three related resources (events, calendars, RSVPs) plus a single timezone lookup helper. Given the three independent resource lifecycles, this count is justified and not bloated.
The tool set provides full create, read/search, update, and delete coverage for events, calendars, and RSVPs, with no obvious dead ends. The timezone listing tool fills the only metadata gap needed to correctly create events and calendars, making the surface complete for its domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Cronofy — read calendars, events and free/busy, and create, update or delete events.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
Eventify MCP server — manage events, attendees, sessions, speakers, sponsors, and analytics.
Related MCP Servers
- FlicenseBqualityDmaintenanceMCP server for Cal.com scheduling, providing ~70 tools to manage schedules, event types, bookings, calendars, webhooks, and teams. Enables natural language control of Cal.com from Claude or any MCP-compatible client.68
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server for Google Calendar integration with Claude Desktop. Create, update, delete, and manage calendar events with batch operations and enterprise-grade retry mechanisms.1MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that enables Claude to interact with Google Calendar, including listing, creating, updating, and deleting events, as well as checking availability.
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server that allows Claude and other MCP clients to interact with Google Calendar. This server enables AI assistants to manage your calendar events, check availability, and handle scheduling tasks.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/UtahREIA/addevent-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server