Multi Calendar
Server Details
Outlook.com, Microsoft 365, Google calendars: free time, events, invitations, booking pages, polls.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 21 tools
Tools mostly target distinct resources and actions, but the scheduling-surface tools (booking_links_create, booking_page_set, polls_create, free_times_find) share conceptual overlap that could cause hesitation. The detailed descriptions clarify scope, so misselection risk is low but not zero.
Names are consistently snake_case with a resource_action pattern (events_create, calendars_list, polls_book), which is predictable and readable. However, polls_results breaks the pattern by ending in a noun rather than a verb, and a few names are notably long.
21 tools for a feature-rich multi-calendar scheduling domain covering events, booking, polls, circles, preferences, and busy copies is on the high side but each tool appears to cover a distinct operation. Slightly heavy but reasonable for the scope.
Core event lifecycle, booking links/pages, polls, circles, preferences, and busy-time mirroring are covered, giving broad CRUD-like support. Minor gaps include no explicit tool to delete a circle, remove circle members, or permanently delete events, though agents can work around these via cancellation or manual cleanup.
Available Tools
21 toolsbooking_links_createMake a booking linkAInspect
Make a link offering times free_times_find found for a named meeting, for the person to send to one guest. The guest, with no account, picks one of these times in their own time zone and gives a name and address; the time is checked again against every calendar and the person's working hours, buffers, notice and daily maximum, and booked once, in the calendar the person named to receive bookings; a time no longer free is replaced by others up to the link's last, within those hours - Monday to Friday 09:00-17:00 where they stored none. The answer names the link's id and when it closes, 14 days after it is made, and a time after then is refused. The page a guest opens names nobody but the meeting, so put the person's own name in subject, e.g. Intro call with Sam Lee. An event holds its time as its provider's own free/busy shows it: on Google unless shown as available or declined - an invitation not yet answered or answered maybe included - and on Outlook only when shown busy or away, so an Outlook tentative answer leaves its time free; a cancelled event holds none.
| Name | Required | Description | Default |
|---|---|---|---|
| times | Yes | Each time offered, its start with its offset. | |
| minutes | No | Meeting length in minutes; the stored one where omitted. | |
| subject | Yes | The meeting's name, as whoever opens the link reads it. | |
| guestZone | No | The time zone of the guest the link is for, only as the person names it; the answer gives each time in it under guest too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write/non-destructive profile, and the description goes well beyond that: 14-day expiry and refusal of later times, re-validation against calendars, working hours, buffers, notice and daily maximum, the fallback Mon-Fri 09:00-17:00 hours, and the Google vs Outlook free/busy semantics. This is exactly the operational context an agent cannot get from structured fields.
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 content is delivered as a single dense block with spliced clauses and dashes, so it is hard to scan and front-load. Much of the behavior is worth stating, but the run-on prose and lack of any structure make the useful parts costly to extract.
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?
With no output schema the description carries the return burden and does state that the answer gives the link id and close time. It also covers expiry and booking behavior, though it never mentions the actual link/URL the guest receives, leaving one small return-value gap.
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 baseline is 3. The description adds real meaning beyond the schema: it tells the agent to embed the host's name in subject ("Intro call with Sam Lee") and clarifies that times are re-checked and guestZone surfaces each time in the guest's zone, neither of which the schema states.
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 gives a concrete verb and resource ("Make a link") with the artifact's shape: times from free_times_find, a named meeting, one guest. It is distinguishable from sibling tools like polls_create or booking_page_set in intent, but it never names or contrasts those siblings directly.
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 implies a prerequisite chain ("times free_times_find found") and describes the downstream guest flow, so usage is inferable. However there is no explicit when-to-use / when-not guidance versus the poll and booking-page siblings, leaving the agent to infer selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
booking_page_setSet up a booking pageBDestructiveIdempotentInspect
Set one of the person's permanent booking pages, named by the name it answers at on this site: the one they hold by that name changes in the fields given alone, newName moving it to a new address while its old one answers nothing; a name they hold no page by adds a page, which needs subject and stays until the account goes. Anyone opening a page, with no account, sees up to 20 times free in every calendar within the person's working hours - Monday to Friday 09:00-17:00 where they stored none - and every other preference, spread across the coming 14 days, each day's preferred times first, in their own time zone, and books one by giving a name and address, in the calendar the person named to receive bookings; a time is booked once across all their pages. The page a guest opens names nobody but the meeting, so put the person's own name in subject, e.g. Intro call with Sam Lee. An event holds its time as its provider's own free/busy shows it: on Google unless shown as available or declined - an invitation not yet answered or answered maybe included - and on Outlook only when shown busy or away, so an Outlook tentative answer leaves its time free; a cancelled event holds none.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The page's name in its address: 3 to 40 lowercase letters, digits and hyphens. | |
| minutes | No | Meeting length in minutes; for a new page the stored one where omitted. | |
| newName | No | A new name for the page named, which its address then carries. | |
| subject | No | The meeting's name, as the guest reads it; a new page needs it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, and the description substantiates these: newName moves the page to a new address while 'its old one answers nothing', fields not given are left alone (idempotent partial update), and a page persists 'until the account goes'. It also discloses substantial downstream behavior (booked-once-per-time, provider free/busy rules). It stops short of stating permissions or rate limits, so not a 5.
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 one long, clause-dense run-on mixing upsert rules, guest booking behavior, timezone handling, and provider free/busy semantics. Key operational facts are not front-loaded and the archaic style ('answers nothing', 'where they stored none') impedes parsing rather than aiding it.
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 a mutation tool with 4 params and no output schema, the description does cover creation vs. update, guest booking constraints, and free/busy rules reasonably thoroughly. It omits return values and permission requirements, and its density means an agent may miss details it does contain.
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, but the description adds real meaning beyond the schema: newName relocates the address and deactivates the old one, and subject should carry the person's own name (e.g. 'Intro call with Sam Lee') because the public page names nobody. That is genuine semantic guidance not present in the field descriptions.
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 verb 'Set' and resource 'booking page' are present, and the description does convey upsert semantics (update by existing name, add otherwise). However, the purpose is buried in indirect phrasing like 'named by the name it answers at on this site', which forces the agent to decode the sentence to learn it creates OR modifies a page. It is distinguishable from siblings only after effort.
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?
There is no explicit statement of when to use this tool versus alternatives such as booking_links_create or polls_create. The description describes effects and guest-facing behavior but never says under which circumstances an agent should choose this tool over a sibling, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
busy_everywhere_setShow busy time everywhereADestructiveIdempotentInspect
Show one of an account's own calendars as busy in another connected account the person names, or stop: within minutes each busy event of the coming 60 days appears as a private block titled "Busy · <the calendar's account address> (Multi Calendar connector)" in the main calendar of the account named, while it allows changing events - never in another calendar, and never in an account nobody named, one connected later included - one block per busy time however many calendars named into it hold it. A block moves with its event, goes when the event ends or goes or the pair is taken away, and is placed again if removed by hand; events_list answers blocks apart from events under busyCopies, and no tool counts, moves or cancels one. Naming a pair answers under shows the sentence to give the person word for word. calendars_list names each calendarId and the accounts each calendar already shows busy in.
| Name | Required | Description | Default |
|---|---|---|---|
| on | Yes | True names the pair, false takes it away. | |
| into | Yes | The other connected account to show its busy time in, by the address calendars_list names. | |
| account | Yes | The connected account, by the address calendars_list names. | |
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| calendarId | Yes | The calendar, by the calendarId calendars_list names. | |
| intoProvider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint, idempotentHint, readOnly false), the description discloses a great deal of runtime behavior: blocks appear within minutes, cover the coming 60 days, are private and titled with a specific format, are placed only in the main calendar of the named account, are deduplicated across multiple calendars, follow their event, and are re-placed if removed by hand. This is exactly the kind of context annotations cannot convey.
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 a single sprawling, em-dash-laden run-on that is hard to parse and not front-loaded around the primary action. While most clauses carry real information, the structure undermines readability and forces re-reading to extract the core behavior.
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 complex, cross-account, destructive write tool with no output schema, the description covers the effect, lifecycle, scoping, and read-path (busyCopies) well. It omits only secondary details such as permission/auth requirements and any rate-limit behavior.
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 every parameter including the boolean on, the into/account addresses, and the provider disambiguators. The description adds little parameter-specific meaning beyond the schema, so the baseline 3 applies.
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 a specific action — mirroring one account's calendar as busy blocks into another named account, or removing that mirroring. It distinguishes itself from siblings by noting that events_list surfaces blocks under busyCopies and that no tool counts, moves, or cancels a block. The unusual 'Show ... or stop' framing is a bit indirect but the resource and effect are clear.
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 implies the context (make an account's busy time visible in another connected account) and points to calendars_list for the identifiers and events_list for reading blocks. However it never explicitly frames when to choose this over alternatives like free_times_find or circles_free_times_find, so the when-to-use guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendars_listList calendarsARead-onlyInspect
List every calendar of every connected Outlook.com, Microsoft 365 and Google account, each naming its account and provider, its calendarId, whether it is that account's default, whether the account owns it - one merely shared with it is not owned - and its owner's address, its access - edit, read, or freeBusy where Google lets only busy time be read - hidden where the person hid it from their Google list, its own time zone where Google keeps one - Outlook keeps none per calendar - and, under busyShownIn, each other account its busy time shows in. An account that could not be read, or whose events the person does not let you see, is named under unread with why, and one holding more calendars than one answer carries under cutShort.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower, yet the description still adds substantial behavior: it discloses ownership vs. mere sharing, Google-specific access modes (edit/read/freeBusy), hidden calendars, per-calendar time zones only where the provider keeps them, the busyShownIn cross-account view, and the unread/cutShort failure and truncation cases. This is genuinely useful context beyond the annotations, though it documents the response rather than any call-time behavior.
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?
It is front-loaded with the operation and every clause carries return-field information rather than padding, but the entire description is a single sprawling run-on sentence built from comma-separated clauses and em-dash asides. It front-loads well but is hard to parse and would benefit from being broken into structured sentences.
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?
With no output schema and no parameters, the description carries the full burden of explaining what comes back, and it does so in detail, including the unread (unreadable accounts / restricted events) and cutShort (more calendars than one answer carries) edge cases. The main omission is any explicit statement of how to page past the described cutShort truncation.
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 tool takes zero parameters and the schema is empty with additionalProperties=false, so there are no parameter semantics to explain; the baseline for a 0-parameter tool is 4. Nothing in the description conflicts with 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 a specific verb and resource ('List every calendar of every connected Outlook.com, Microsoft 365 and Google account') and scopes the breadth across all accounts, which cleanly separates it from siblings like events_list or free_times_find. An agent can identify the operation and its scope without opening the schema.
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 only implied: the tool lists calendars, so an agent infers it should be called for calendar discovery, but no alternative is named and no precondition or 'use this instead of X' guidance is given. Given the 0-parameter, list-everything nature of the tool the implied usage is fairly unambiguous, but it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circles_free_times_findFind a time for a circleARead-onlyInspect
Find when everyone in one of the person's circles is free: each stretch of a window that no member's busy time touches and that is at least as long as the meeting, in the zone the call names, else the person's own - the same whichever member asks, save for a member with no calendar connected, counted by the asker's own polls. The calendars each member owns and counts as busy - never one someone else shared with them - are read through that member's own connection as the call is made, and come back under busy only as when that member is busy - the circle's owner named owner, every other member by the address invited - never what an event says. An event holds its time as its provider's own free/busy shows it: on Google unless shown as available or declined - an invitation not yet answered or answered maybe included - and on Outlook only when shown busy or away, so an Outlook tentative answer leaves its time free; a cancelled event holds none. An all-day event holding time holds its whole day in its member's time zone; no one's stored working hours or other preferences apply, only the hours and weekdays the call names, in the answer's zone; limit keeps the earliest stretches, and the search keeps to the window's first 365 days. A member none of whose calendars could be read is named under unknown, and one only some of whose could under readInPart, their busy time read counted; either's busy time may fall inside a stretch. A member with no calendar connected counts as free only at the times they ticked in the person's own polls for this circle, and until they answer one is named under noCalendar - polls_create naming the circle asks them. On the person's own circle each address invited that has not joined is named under notJoined and counts the same way once it answers such a poll. Anyone counted by polls whose answers tick no time in the window is named under tickedNothing. Each stretch names under members every other member's own time for it in the zone they stored, marked unusual where any of it falls outside 09:00-18:00 or on a Saturday or Sunday there. circles_list names each circle's id.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End of the window, excluded, with its offset. | |
| from | Yes | Start of the window, included, with its offset, e.g. 2026-10-12T09:00:00+01:00. | |
| hours | No | Only these hours of each day, e.g. 10:00-16:00 or 09:00-12:00, 14:00-17:00. | |
| limit | No | At most this many stretches, the earliest. | |
| circle | Yes | The circle's id, as circles_list names it. | |
| minutes | No | Meeting length in minutes; the stored one where omitted. | |
| timeZone | No | An IANA zone such as Europe/London the answer is given in; the stored one where omitted. | |
| weekdays | No | Only these days of the week. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnly/openWorld/destructive hints; the description goes far beyond them, disclosing which calendars are read and through whose connection, Google vs Outlook busy semantics (tentative/cancelled/all-day events), the 365-day search cap, and the unknown/readInPart/noCalendar/notJoined/tickedNothing member states. This is unusually deep behavioral disclosure for a read-only tool.
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 core purpose is front-loaded in the first clause, but the remainder is a single dense block of run-on clauses with coined terms (tickedNothing, readInPart) that force re-reading. Nearly every sentence carries genuine semantics, so it is information-dense rather than padded, but the structure is poor and the length approaches the limit of usability.
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?
There is no output schema, so the description carries the return-value burden itself and does so thoroughly, naming every status bucket (busy, unknown, readInPart, noCalendar, notJoined, tickedNothing), the per-stretch members list, and the unusual marker. For an algorithmically complex tool this leaves little an agent needs to know unstated.
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 baseline is 3, but the description adds real meaning beyond the schema: timeZone falls back to the stored zone, limit keeps the earliest stretches, hours/weekdays restrict what the search considers, and the window is capped at its first 365 days. These are semantics the schema text alone does not convey.
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?
Opens with a specific verb+resource+scope: "Find when everyone in one of the person's circles is free," which clearly separates it from the sibling free_times_find (single-person) and from circles_list. It never names those siblings explicitly, so the differentiation is inferable rather than stated.
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 scope (mutual availability inside a circle), and the closing line "circles_list names each circle's id" usefully points at the prerequisite for the circle parameter. There is no explicit when-to-use-this-vs-free_times_find guidance and no exclusions or failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circles_inviteInvite people into a circleADestructiveInspect
Invite people by address into one of the person's own circles: an existing one by its id, as circles_list names it, or one by its name, matched whatever its case and made where the person has none by it - two of the person's circles whose names differ only in case are refused, naming both ids. The answer names the circle's id and whether it was made. Each address newly invited gets its own link, which only an account signed in at that address can join with; an address already invited keeps the link it was sent and is named under kept, unless reissue asks for a new one, which stops the old. Lumman sends invitees nothing: hand the links to the person to share, or send each from the person's own mailbox.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The circle's name, where no id is passed. | |
| circle | No | An existing circle's id, as circles_list names it. | |
| reissue | No | Give an address already invited a new link, stopping the one it was sent. | |
| addresses | Yes | Addresses to invite. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses case-insensitive name matching with ambiguity refusal that names both ids, per-address link issuance, the 'kept' vs reissued link distinction, that reissue stops the old link (consistent with destructiveHint=true), and the critical fact that no mail is sent by the system. These are exactly the operational traits an agent cannot infer from the schema.
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?
Front-loads purpose and circle selection, and every sentence carries information rather than filler. The dense, idiosyncratic phrasing ('made where the person has none by it', 'Lumman sends invitees nothing') costs some readability, but nothing is redundant.
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?
With no output schema, the description compensates by naming the response fields (circle id, whether it was made, kept vs new links) and the no-email side effect. It leaves out authorization requirements and rate limits, but for a 4-parameter mutation tool this is close to 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 coverage is 100%, so the baseline is 3, but the description adds real meaning: name-vs-id precedence, case-insensitive matching semantics for name, and that a new address gets its own link while an existing one keeps its link unless reissue is set. Only the addresses/reissue mechanics largely duplicate the schema wording.
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?
States a specific verb+resource (invite people by address into a circle) and immediately scopes it to 'one of the person's own circles', naming circles_list as the authority for circle ids. An agent can distinguish this from circles_list or circles_free_times_find without opening any schema.
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?
Clear about the id-vs-name selection rule ('an existing one by its id... or one by its name, matched whatever its case') and explicit about what to do afterwards ('hand the links to the person to share, or send each from the person's own mailbox'). It stops short of stating when-not to use it or naming an alternative tool for a different invite path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circles_listList circlesARead-onlyInspect
List every circle the person owns or has joined: its id, its name, whether it is the person's own, the address of each member who has joined and, on the person's own, of each address invited that has not joined under invited. circles_free_times_find finds a time for one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral detail beyond that: it enumerates the returned fields and clarifies that invited-but-not-joined addresses appear as 'invited' only on the person's own circles.
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?
It is a single sentence front-loaded with the verb and resource, and every clause carries information. The clause about invited addresses is grammatically convoluted ('on the person's own, of each address invited...') and slightly slows parsing, but nothing is wasted.
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?
With no output schema, the description must carry the return-value burden, and it does by naming the fields returned. Nothing needs to be said about parameters or safety beyond the annotations, so the definition is essentially complete for a zero-param read tool.
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 tool takes zero parameters and the schema is an empty object with additionalProperties=false, so there is nothing for the description to disambiguate. No parameter semantics are needed.
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?
States a specific verb (list) and resource (circles) with an explicit scope: every circle the person owns or has joined. It also names the sibling circles_free_times_find and its different job, so an agent can separate the two without opening either schema.
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 closing pointer to circles_free_times_find implies the boundary between browsing circles and finding a meeting time, but there is no explicit statement of when to call this tool versus circles_invite or the free-times tool. Usage is only implied, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
events_cancelCancel an eventADestructiveIdempotentInspect
Cancel an event the account organises; its provider sends a meeting's attendees the cancellation from that account's own address, as notify chooses, and Outlook sends message with it. Someone else's event is not cancelled here: declining it with events_respond takes it off an Outlook calendar and leaves it on a Google one, shown declined. copyOnly true takes only the account's own copy of someone else's event off its calendar - an Outlook copy its organiser has cancelled included - sending nothing, though Google then shows the account as declined and so needs inviting and replying allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | For an occurrence of a recurring series: occurrence, where omitted, acts on that occurrence alone, series on its whole series. A series named by its own seriesId is refused unless series is passed. | |
| notify | No | Who the provider tells: every guest where omitted, externalOnly only guests outside Google Calendar, none nobody. Outlook tells every guest of a meeting it makes, changes or cancels, so there only an answer goes untold. | |
| account | Yes | The connected account, by the address calendars_list names. | |
| eventId | Yes | The event's id, as events_list names it. | |
| message | No | Words sent to the guests with the cancellation; Outlook alone sends them. | |
| copyOnly | No | True to take only the account's own copy of someone else's event off its calendar; the event stands for everyone else. | |
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| calendarId | No | The calendar holding the event, by the calendarId events_list names; a Google account's event outside its default calendar needs it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=true, so the safety profile is covered; the description goes beyond them by disclosing that the provider sends the cancellation from the account's own address, that Outlook alone sends the message, and that copyOnly sends nothing while leaving Google showing the account as declined. It stops short of stating irreversibility or auth requirements, but the side-effect disclosure is genuinely useful.
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 verb+resource is front-loaded, and nearly every clause carries real information (no filler). However, it is compressed into a single sprawling paragraph with tangled clauses such as 'as notify chooses, and Outlook sends message with it', which makes it harder to parse than the content warrants.
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?
With eight parameters, open-world external effects, and no output schema, the description covers ownership, notification behavior, provider differences, and the copyOnly edge case including its Google-side aftermath. An agent has enough to call it correctly; only the absence of any pagination/return or error-behavior note keeps it from being fully 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 all eight parameters are already documented in the schema, including the provider quirks for notify and message. The prose restates some of that (copyOnly, notify) rather than adding syntax or format detail beyond the schema, so the baseline 3 applies.
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 opening clause 'Cancel an event the account organises' gives a specific verb and resource plus an ownership scope, and the description explicitly contrasts itself with events_respond for events the account does not own. The purpose is identifiable, though the delivery is buried in a dense run-on sentence rather than stated crisply.
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 names the alternative path explicitly ('Someone else's event is not cancelled here: declining it with events_respond') and explains the calendar-dependent consequences of that alternative. It also gives the condition for copyOnly (someone else's event, own copy only). It stops short of a clean when-not list, but the routing guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
events_createCreate an eventADestructiveIdempotentInspect
Create an event in one of a connected account's own calendars: the one named by the calendarId calendars_list gives, else the account's default; a calendar only shared with the account is refused. Guests are invited by that account's provider, Microsoft or Google, from its own address. A timed event's start and end are instants with their offset, the end no earlier than the start, so an entry of no length is taken; an all-day event's are dates, its end the day after its last. It is written in the person's own time zone, so an invitation shows that zone's time, and the answer gives its times in the zone it names under timeZone. A meeting with guests, no location and no video gets the person's default meeting link as its place. How it shows, its privacy, reminders, kind and video link are each refused with the reason where the account's provider lacks them. An Outlook subject takes at most 255 characters. repeat makes it a recurring series, each occurrence keeping the start's own hour in the person's time zone across clock changes. Who hears of it is notify's choice. Repeating a create whose answer was lost, with the same arguments, finds the event the first made rather than making a second - for the rest of that day (UTC), on Outlook only while Microsoft also recognises the repeat - so two events meant as two differ in some argument. Each guest's own times are answered under guestTimes in their time zone where it is known - the one guestZones names for them, else the one a member of the person's circles stored - and any other guest's zone as unknown, their time counted as the person's. A meeting any part of which falls, for a guest of known zone, outside 09:00-18:00 or on a Saturday or Sunday in that zone - an all-day one only on a Saturday or Sunday - is not sent: the refusal names each such guest and their time, and it goes out only once the call passes unusualHoursAgreed true on the person's word. A series is checked by its first occurrence; the person's own hours are never held.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| body | No | ||
| kind | No | Google makes either only in a Workspace account's main calendar, timed; Outlook makes out of office alone, shown away. | |
| start | Yes | ||
| video | No | A Meet link on a Google account or a Teams link on a work Microsoft account, given back under joinUrl. | |
| guests | No | Addresses to invite. | |
| notify | No | Who the provider tells: every guest where omitted, externalOnly only guests outside Google Calendar, none nobody. Outlook tells every guest of a meeting it makes, changes or cancels, so there only an answer goes untold. | |
| repeat | No | Makes it a recurring series, from its start, without end unless until or count is named. | |
| showAs | No | How it shows; Google shows busy or free alone. Busy where omitted. | |
| account | Yes | The connected account, by the address calendars_list names. | |
| privacy | No | The calendar's own where omitted. | |
| subject | Yes | ||
| location | No | ||
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| reminders | No | Minutes before its start each reminder sounds, Outlook keeping one; empty for none, the calendar's own where omitted. | |
| calendarId | No | The calendar to create it in, by the calendarId calendars_list names; the account's default where omitted. | |
| guestZones | No | A guest's own time zone, only as the person names it - never inferred from an address, a language or a provider. | |
| unusualHoursAgreed | No | True only once the person has agreed to send at the hours an answer named as unusual for a guest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what annotations provide: the idempotency rule is spelled out precisely (same arguments find the event the first made rather than a second, for the rest of that day UTC, Outlook only while Microsoft recognises the repeat) which is far richer than idempotentHint=true. It also discloses which inputs are refused and why, the unusual-hours send block, and the default meeting-link behavior.
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?
Information density is high and the calendar rule is front-loaded, but the archaic, clause-heavy prose is hard to parse and there is no structure (no grouping of ids, guests, recurrence, sending). Much of the content earns its place given 18 parameters, but the packaging makes it harder than it needs to be.
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?
With no output schema, the description does carry return-shape context (the answer's times in its timeZone, guestTimes, joinUrl) and covers invitation, notification, recurrence and refusal branches. It is close to complete for a tool this complex, though a few enum params (kind, showAs) get less prose than their provider caveats deserve.
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 72%, above baseline, yet the description still adds semantics the schema lacks: the Outlook 255-character subject cap, the instant-vs-date difference between start and end, and that each recurrence keeps the start's own hour across clock changes. These are genuine additions, not restatements.
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?
Opens with a specific verb+resource ('Create an event in one of a connected account's own calendars') and immediately scopes it: own calendars only, a shared-with calendar is refused. That scope cleanly separates it from events_edit, events_list and polls_create 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?
Gives concrete selection rules (which calendar via calendarId from calendars_list, else default), the refusal condition for shared calendars, the provider caveats, and the exact gate for unusualHoursAgreed. It never names an alternative sibling ('use events_edit to...'), so it stops 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.
events_editChange an eventADestructiveInspect
Change an event the account organises, in place and in one call: its subject, body, location, start and end, how it shows, its privacy, reminders and video link, and its guests - addGuests invited, removeGuests taken off. Only what is named changes: the event keeps its id, every other guest's answer and its join link, a start named alone keeps its length and an end named alone keeps its start. Start and end are named as events_create names them, so naming both in the other form turns a timed event all-day or back, and are written in the person's own time zone as events_create writes them. What the account's provider lacks is refused with the reason, as on events_create, and so is a new body for an Outlook online meeting, whose join details it holds. Changing guests takes inviting allowed on the account. A whole series' start and end are its first occurrence's, and a change to a whole series holding occurrences changed apart from it is refused, naming each by when its series set it, so none of theirs is undone. Its provider sends a meeting's guests the change from the account's own address, as notify chooses. Like every write, the answer names the event's provider, its calendarId where its provider addresses it by one, and its webLink. Guests' own hours hold a change as they hold events_create: every guest's where its times change, an added guest's at its time otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| body | No | ||
| scope | No | For an occurrence of a recurring series: occurrence, where omitted, acts on that occurrence alone, series on its whole series. A series named by its own seriesId is refused unless series is passed. | |
| start | No | ||
| video | No | A Meet link on a Google account or a Teams link on a work Microsoft account, given back under joinUrl. | |
| notify | No | Who the provider tells: every guest where omitted, externalOnly only guests outside Google Calendar, none nobody. Outlook tells every guest of a meeting it makes, changes or cancels, so there only an answer goes untold. | |
| showAs | No | How it shows; Google shows busy or free alone. | |
| account | Yes | The connected account, by the address calendars_list names. | |
| eventId | Yes | The event's id, as events_list names it. | |
| privacy | No | ||
| subject | No | ||
| location | No | ||
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| addGuests | No | Addresses to invite. | |
| reminders | No | Minutes before its start each reminder sounds, Outlook keeping one; empty for none. | |
| calendarId | No | The calendar holding the event, by the calendarId events_list names; a Google account's event outside its default calendar needs it. | |
| guestZones | No | A guest's own time zone, only as the person names it - never inferred from an address, a language or a provider. | |
| removeGuests | No | Guests to take off, by address. | |
| unusualHoursAgreed | No | True only once the person has agreed to send at the hours an answer named as unusual for a guest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true): it explains preservation behaviour (id, other guests' answers, join link kept; a lone start keeps duration, a lone end keeps the start), provider-side refusals with reasons, the Outlook online-meeting body refusal, and notification fan-out ('from the account's own address, as notify chooses'). This is exactly the mutation context a destructiveHint flag alone cannot convey.
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?
Front-loaded with the core action and nearly every sentence carries distinct information, but it is one very long, densely packed paragraph with idiosyncratic phrasing that makes it hard to scan. The size is justified by the complexity, yet the structure costs readability.
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 19-parameter mutation tool with no output schema, it covers what an agent needs: patch semantics, recurring-series scope and refusals, provider limitations, notification behaviour, and the shape of the response (provider, calendarId where applicable, webLink). Remaining gaps (e.g. reminders format) are handled by schema descriptions.
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 only 68%, and the description compensates: it clarifies that start/end are named as events_create names them and that naming both in the other form flips timed/all-day, that times are in the person's own time zone, and that addGuests/removeGuests take guests on and off. The guestZones/'own hours' sentence also explains cross-field timing behaviour. It adds real meaning where the schema is silent.
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?
States a precise verb+resource ('Change an event the account organises, in place and in one call') and then enumerates exactly which fields the update can touch (subject, body, location, start/end, showAs, privacy, reminders, video, guests). An agent can distinguish it from events_create and events_cancel from the description alone.
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?
Gives clear operating conditions: partial-patch semantics ('Only what is named changes'), the occurrence-vs-series choice and the rule that a whole series with separately-changed occurrences is refused, and the precondition that changing guests requires inviting to be allowed on the account. It does not explicitly route to sibling tools (e.g. use events_create to make a new event), so it stops 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.
events_getRead an eventARead-onlyInspect
Read one event whole, by the account, calendarId and id events_list names: its whole description as text, every Teams, Zoom or Meet join link found in the event, its place or its words, the organizer and each guest with their role - required, optional or resource - and answer, its kind and privacy as events_list names them, how it shows, the account's own answer, its reminders - the minutes before its start each sounds, or none, which events_edit writes as an empty list, and unsaid where a Google event keeps its calendar's own - and its web link. Times are given as events_list gives them, in the zone named under timeZone, and an occurrence of a recurring series its seriesId and originalStart as events_list names them. An event whose words screen as a prompt attack is withheld. One of Lumman's own busy copies is answered under busyCopy as events_list answers one, saying under about what it is and where it is switched off.
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | The connected account, by the address calendars_list names. | |
| eventId | Yes | The event's id, as events_list names it. | |
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| timeZone | No | An IANA zone such as Europe/London to answer in; the person's stored one where omitted. | |
| calendarId | No | The calendar holding the event, by the calendarId events_list names; an event outside the account's default calendar needs it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/openWorld, and the description adds substantial behavior beyond them: events whose text screens as a prompt attack are withheld, Lumman's own busy copies are answered under busyCopy with about/switched-off fields, and reminders are reported as minutes or an empty list. These are real edge-case behaviors an agent cannot get from 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 purpose is front-loaded, and given the absence of an output schema, the enumeration of returned fields earns its place. However, it is delivered as one extremely dense run-on sentence with heavy nesting, which hurts parseability rather than being genuinely concise.
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?
With no output schema, the description carries the full return-value burden and does so thoroughly: join links, organizer/guest roles and answers, kind, privacy, visibility, reminders, web link, timeZone handling, recurrence fields (seriesId, originalStart), the prompt-attack withholding rule, and the busyCopy variant. Nothing material for a correct call is missing.
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 account, eventId, provider, timeZone and calendarId, including when provider and calendarId are needed. The description reinforces that output times follow the timeZone parameter, but adds little new meaning about the parameters themselves; baseline 3 applies.
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 opening establishes a specific verb and resource ('Read one event whole') and immediately scopes it as 'by the account, calendarId and id events_list names,' which cleanly separates it from the list-oriented sibling events_list. An agent can distinguish it from events_edit and events_list without opening any schema.
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 through repeated references to sibling conventions ('as events_list names them', 'which events_edit writes as an empty list'), but there is no explicit when-to-use statement or exclusion such as 'use events_list to discover ids first' or 'use busyCopy for a busy view only.' The agent must infer the call context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
events_listRead eventsARead-onlyInspect
Read the events of a period across every connected calendar, earliest first, or latest first with newestFirst. query finds the events whose title, description, place, organizer or guests hold every word it names - a person by name or address included - on every account: Google searches its own, while Outlook, which searches titles alone, is read across the period and matched here. account, with provider where two share an address, reads that account alone, and calendarId, as calendars_list names it, that one of its calendars alone. Each event answers once, naming under copies every account and calendar holding it, with that copy's id, how it shows there and that account's own answer. An occurrence of a recurring series names under originalStart the start its series gave it, which a moved one keeps, and under each copy that account's seriesId. A calendar shared into one account from another connected account is read through its owner alone. Lumman's own busy copies - private blocks titled "Busy · (Multi Calendar connector)" - are never among the events: busyCopies answers them apart, one entry per copied busy time with its start and end, the account it copies under copyOf - unknown where no record of it stands - and each account it stands in under standsIn. None counts as the person's time or can be moved or cancelled; asked about one, say it is a busy copy of that account, switched off at https://lumman.co/mcp/account/multi-calendar or by taking that pair away with busy_everywhere_set. Every time is given with its offset in the zone the answer names under timeZone: the one passed, else the person's stored zone, which now names with their time now; an all-day event's start and end are dates, its end the day after its last. An answer, a guest's or an account's own, is accepted, tentative, declined, unanswered or organizer, and one a copy cannot know is left out. An event names its kind where it is no ordinary event - a Google outOfOffice, focusTime, workingLocation, birthday or fromGmail entry - its privacy where it is not normal: public, private, confidential or personal - and its Teams, Zoom or Meet join link, and each copy its webLink; an out-of-office event shows as away. A description is its first 255 characters, marked descriptionCut where it goes on: events_get reads it whole. Each calendar answers at most 50 events, read in time order; one with more is named under cutShort with its calendarId, readTo - the start of the last event read - and continueAt: pass that continueAt with its account and calendarId, the same period and query, to read on from exactly where it stopped; read latest first, such a calendar's latest events are the ones past readTo, so read it on before naming the latest. A calendar or an account that could not be read, or that the person does not let you see, is named under unread with why: needs_reconnection - reconnected at https://lumman.co/mcp/account/multi-calendar - not_allowed, refused, gone, rate_limited or unavailable; where nothing could be read the answer is an error. malformed counts events a provider sent in a form that could not be read, each left out. An event whose words screen as a prompt attack is left out and named under withheld by its start, its end and each copy's account, calendarId and id - by account alone where an id screened so - and a calendar whose name screened so is named by its account alone.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End of the period, excluded, in the same forms. | |
| from | Yes | Start of the period, included: e.g. 2026-10-12, 2026-10-12T09:00 or 2026-10-12T09:00:00+01:00. | |
| query | No | Words, or a person by name or address, every one of which an event must hold. | |
| account | No | Read this connected account alone, by the address calendars_list names. | |
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| timeZone | No | An IANA zone such as Europe/London to answer in; the person's stored one where omitted. | |
| calendarId | No | Read this calendar of the account named alone, by the calendarId calendars_list names. | |
| continueAt | No | Read on from where a calendar under cutShort was cut: its continueAt, with its account and calendarId. | |
| newestFirst | No | Answer the latest events first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a safe, read-only, closed-world read, and the description adds substantial context beyond them: 50-events-per-calendar cap with cutShort/readTo/continueAt resumption, unread reasons (needs_reconnection, not_allowed, refused, gone, rate_limited, unavailable), withheld prompt-attack events, malformed counts, busy-copy exclusion, and 255-char description truncation.
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?
It is front-loaded with the core purpose, and most sentences carry needed return-value information since there is no output schema. But it is a single massive run-on paragraph with no grouping, making it hard to scan for the operational details an agent needs (pagination, unread, withheld).
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?
With no output schema and 9 parameters, the description carries the full burden and delivers: it documents event fields, copies, occurrence/originalStart, timeZone handling, answer statuses, join links, pagination, and all error/omission cases. Nothing essential to calling or interpreting the tool correctly is missing.
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 baseline is 3, but the description adds real meaning: query semantics differ per provider (Google searches all fields, Outlook searches titles alone and is read across the period then matched), provider is 'needed only where two connected accounts share an address,' and continueAt must be paired with the cutShort account and calendarId.
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?
Opens with a specific verb+resource+scope: 'Read the events of a period across every connected calendar, earliest first, or latest first with newestFirst.' It also distinguishes itself from the sibling events_get by noting events_get reads a description whole, and from calendars_list by defining account/calendarId in terms of it.
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?
Gives concrete conditional guidance: narrowing with account/provider/calendarId, resuming with continueAt after cutShort, and handling busy copies ('asked about one, say it is a busy copy of that account... or take that pair away with busy_everywhere_set'). However it never contrasts itself against other listing/availability siblings such as free_times_find or circles_free_times_find, so the when-not framing is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
events_respondAnswer an invitationADestructiveInspect
Accept, tentatively accept or decline an invitation; the account's provider sends the answer, with message where given, to its organiser from the account's own address unless notify is none. Answering a whole series answers each occurrence answered apart from it too, and says under replaced how many of their answers it replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | For an occurrence of a recurring series: occurrence, where omitted, acts on that occurrence alone, series on its whole series. A series named by its own seriesId is refused unless series is passed. | |
| notify | No | Whether the organiser is told: all where omitted, none to answer untold; on Google, externalOnly tells an organiser outside Google Calendar alone. | |
| account | Yes | The connected account, by the address calendars_list names. | |
| eventId | Yes | The event's id, as events_list names it. | |
| message | No | Words sent to the organiser with the answer; on Google every guest of the event can read them too. | |
| provider | No | The account's provider, as calendars_list names it; needed only where two connected accounts share an address. | |
| response | Yes | ||
| calendarId | No | The calendar holding the event, by the calendarId events_list names; a Google account's event outside its default calendar needs it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-read-only, destructive, open-world mutation. The description adds real value beyond that: it explains that the provider sends the answer from the account's own address, that notify=none suppresses notifying the organiser, and that answering a series cascades to other occurrences and reports a replaced count. The Google message-visibility caveat, however, lives only in the schema, not the description.
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 action is front-loaded, which is good, but the second sentence ('Answering a whole series answers each occurrence answered apart from it too, and says under replaced how many of their answers it replaced') is a convoluted run-on that is hard to parse, hurting readability more than length does.
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 an 8-parameter mutation with no output schema, the description covers the important behavioral edges: cascading series answers and the returned 'replaced' count. Combined with the 88%-covered schema, an agent has enough to invoke this correctly, though provider-specific fallbacks (calendarId, provider) are left entirely to the 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 description coverage is 88%, so the schema already documents nearly every parameter including notify, scope, and message semantics. The description largely restates the notify and series behavior rather than extending it, so it does not meaningfully exceed the schema baseline.
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?
States a specific verb set (accept, tentatively accept, decline) against a specific resource (an invitation), and the response enum mirrors this exactly. It is clearly distinguishable from siblings like events_edit, events_cancel, or events_create.
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 nature of the tool rather than stated. There is no explicit guidance on when to choose this over events_edit for changing a reply, and no prerequisites are given, though the scope/series and notify clauses give partial context for deciding how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
free_times_findFind a timeARead-onlyInspect
Find when the person is free in every connected calendar: each stretch of a window that no busy time touches and that is at least as long as the meeting. An event holds its time as its provider's own free/busy shows it: on Google unless shown as available or declined - an invitation not yet answered or answered maybe included - and on Outlook only when shown busy or away, so an Outlook tentative answer leaves its time free; a cancelled event holds none. An all-day event holding time holds its whole day in the person's own time zone. The search never starts before now, keeps to every preference preferences_get names and to the window's first 365 days and, where the call names them, to hours on each day and to weekdays on top of those preferences; limit keeps the earliest stretches. Once any day has working hours, a day without them is off. The buffers pad the meeting being booked: a stretch starts buffer_before_minutes after busy time ends and ends buffer_after_minutes before the next begins. Each stretch answers once, in time order, with its parts inside the preferred times under preferred. Times, hours and weekdays are in the zone the call names, else the person's own; the stored working hours and preferred times are in the person's own. searched names the window searched and narrowedBy what narrowed it: notice, the least notice from now, rounded up to the quarter hour; horizon, to the end of its last day; yearCap, the 365 days; readLimit, a calendar holding more events than a search reads, read as far as it could be and searched to two days before the last it read; daysOff, days without working hours; fullDays, days already holding the most meetings in a day, a meeting being an event of some length that holds time inside that day's working hours. A calendar or account named under unread was not counted, nor were the calendars past the first 100 of an account under cutShort, so their busy time may fall inside a stretch; an account needing reconnection is reconnected at https://lumman.co/mcp/account/multi-calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End of the window, excluded, with its offset. | |
| from | Yes | Start of the window, included, with its offset, e.g. 2026-10-12T09:00:00+01:00. | |
| hours | No | Only these hours of each day, e.g. 10:00-16:00 or 09:00-12:00, 14:00-17:00. | |
| limit | No | At most this many stretches, the earliest. | |
| minutes | No | Meeting length in minutes; the stored one where omitted. | |
| timeZone | No | An IANA zone such as Europe/London the answer is given in; the stored one where omitted. | |
| weekdays | No | Only these days of the week. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare this as a safe read (readOnlyHint=true, destructiveHint=false), and the description goes far beyond them: provider-specific free/busy interpretation (Google vs Outlook tense answers, cancelled events, all-day events), buffer padding semantics, the narrowedBy reasons (notice, horizon, yearCap, readLimit, daysOff, fullDays), and warnings that unread/cutShort calendars may still hold busy time. It even supplies a reconnection URL for accounts needing reauth.
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 first sentence is well front-loaded and most content is substantive rather than filler, which earns credit. But the body is an extremely dense, run-on block of semicolon-chained clauses and nested qualifiers that is hard to parse, and it is very large for an agent to consume before acting.
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?
There is no output schema, so the description carries the return-value burden and does: 'Each stretch answers once, in time order, with its parts inside the preferred times under preferred,' plus a full inventory of narrowedBy reasons and the searched window. Nothing needed to interpret the result is missing.
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 baseline is 3. The description mostly restates schema content (limit = earliest stretches, hours = only these hours) but does add the zone-resolution rule (times/hours/weekdays use the named zone, stored working hours and preferred times use the person's own). Net value over the structured fields is marginal.
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?
States a specific verb and resource with scope: 'Find when the person is free in every connected calendar: each stretch of a window that no busy time touches and that is at least as long as the meeting.' An agent can tell this computes free slots rather than listing events. However, it never differentiates itself from the obvious sibling circles_free_times_find, so the 'every connected calendar' framing is the only (implicit) distinguishing signal.
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?
Gives concrete usage constraints: the search never starts before now, honors preferences_get, is capped at the window's first 365 days, and narrows by hours/weekdays. It does not, however, explicitly state when to prefer it over circles_free_times_find, so routing between the two free-times tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
links_polls_closeClose a link or pollADestructiveIdempotentInspect
Close one of the person's booking links or group polls still open or being booked: its page answers closed from then on, and a poll's addresses and answers are deleted. A meeting the provider made for one being booked stays: events_list shows whether it was. links_polls_list names each.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The link's or poll's id, as links_polls_list names it. | |
| kind | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. Beyond that the description adds real value: it specifies the downstream effect (page answers closed from then on), that a poll's addresses and answers are deleted, and that a provider-created meeting survives with events_list as the way to check. That is concrete mutation detail the annotations cannot convey.
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?
Three sentences, purpose front-loaded, no filler. The middle sentence about the surviving meeting is slightly tangled in construction but carries non-obvious information that 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?
For a destructive two-parameter mutation with no output schema, the description covers what is destroyed, what persists, and how to verify via events_list, plus where ids come from. Only the kind enum semantics and any permission requirements remain unstated.
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?
With 50% schema coverage, the 'id' parameter is described in the schema, but the 'kind' enum has no schema description. The description only indirectly covers it via 'booking links or group polls', and it helpfully links the id to links_polls_list as the naming source. Marginal added meaning over the schema, so the baseline 3 fits.
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?
States a specific verb ('Close') applied to a specific resource ('booking links or group polls') and scopes it to those 'still open or being booked'. An agent can tell this is the closing counterpart to booking_links_create / polls_create. The phrasing is somewhat convoluted, but the operation is 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?
The scope constraint ('still open or being booked') implies when the tool applies, and it points at links_polls_list for identifying targets. However, it never names an alternative for related outcomes (e.g. events_cancel for the meeting that survives) or states explicit preconditions like permissions. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
links_polls_listList open links and pollsARead-onlyInspect
List the person's booking links and group polls still open or being booked, oldest first - each link with its id, meeting, state, when it closes and the times it still offers, each poll with its id, meeting, state, who it is for, how many have answered and the times someone can make, most first - every booking page with its address, and every booking a link, poll or page took for a time 30 days ago or later, never who booked it. One being booked for longer than a booking takes is stuck, and links_polls_close closes it. polls_results reads a poll's answers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, non-destructive, closed-world profile. The description adds genuinely useful behavior beyond that: a privacy boundary ('never who booked it'), a 30-day cutoff for returned bookings, and stuck-state semantics tying into links_polls_close.
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?
Front-loaded with the purpose and every clause carries information (field lists, ordering, cutoff, privacy). It is one very long run-on sentence, which hurts scannability, keeping it short of a 5.
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?
With no output schema, the description carries the full burden of describing return shape and does so field-by-field for links, polls, pages, and bookings. Nothing an agent needs to invoke and interpret this correctly is missing.
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?
Zero parameters and 100% schema coverage, so the baseline is 4 per the rubric. There is no parameter surface for the description to add value to, and nothing is misdescribed.
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?
Specific verb+resource+scope: 'List the person's booking links and group polls still open or being booked', with ordering and per-entity field enumeration. It cleanly separates itself from siblings by naming links_polls_close for closing and polls_results for reading answers.
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 states the condition that selects this tool ('still open or being booked') and routes to two alternatives (links_polls_close, polls_results). It lacks an explicit 'use this instead of X list' comparison, but the routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
polls_bookBook a poll's timeADestructiveInspect
Book one of a poll's times in the calendar the person named to receive bookings: the time is checked again against every calendar, exactly the people the poll is for are invited by Microsoft or Google from that account's own address, the meeting written in the person's own time zone, and the poll closes. Its invitees' own hours hold it as they hold events_create, save for one who ticked that time, chosen on their own clock. An event holds its time as its provider's own free/busy shows it: on Google unless shown as available or declined - an invitation not yet answered or answered maybe included - and on Outlook only when shown busy or away, so an Outlook tentative answer leaves its time free; a cancelled event holds none.
| Name | Required | Description | Default |
|---|---|---|---|
| poll | Yes | The poll's id, as polls_create names it. | |
| start | Yes | The time to book, as polls_results names it. | |
| guestZones | No | A guest's own time zone, only as the person names it - never inferred from an address, a language or a provider. | |
| unusualHoursAgreed | No | True only once the person has agreed to send at the hours an answer named as unusual for a guest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, yet the description still adds real substance: the time is re-validated against every calendar, invitations are sent by Microsoft or Google from the host account's own address, the meeting is written in the host's time zone, and the poll is closed as a side effect. It also explains the provider-specific free/busy rules that determine whether a slot still 'holds' its time. The value is genuine, though the run-on phrasing blurs which details are guarantees versus conflict-detection heuristics.
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 action is front-loaded and there is little pure filler, but the description is a dense sequence of nested clauses ('exactly the people the poll is for are invited by Microsoft or Google from that account's own address') that is hard to parse on first read. Information density is high; readability and structure are poor.
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?
With no output schema, the description carries the return-value burden and does not say what comes back on success or what happens when the re-check shows the time no longer holds. It does, however, cover the major side effects, time-zone handling, and conflict semantics, which is substantial for a 4-parameter tool whose schema is fully documented.
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 'poll', 'start', 'guestZones' and 'unusualHoursAgreed' are already documented in the schema, including the explicit warning that a guest's zone is never inferred. The description adds nothing parameter-specific beyond the events_create analogy, so the baseline 3 applies.
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 first sentence names a specific verb and resource: booking one of a poll's times into the calendar of the person who receives bookings, and it distinguishes the action from polls_create/polls_results/links_polls_close by describing the invite-and-close outcome. The archaic phrasing ('the person named to receive bookings') makes the actor harder to identify than it should be, but the core action is 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?
Usage is only implied: the description references polls_results as the source of the 'start' value and compares invitee-hour handling to events_create, which hints at the post-poll-confirmation workflow. There is no explicit statement of when to call this versus polls_results (view times) or links_polls_close (close without booking), and no stated prerequisites such as the poll needing to be open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
polls_createMake a group pollAInspect
Make a poll of times free_times_find found for a named meeting, for the people it is for. Each address gets its own link, an address named twice one, handed back in this answer alone - a lost link needs a new poll. Lumman sends them nothing: hand the links to the person to share, or send each from the person's own mailbox. Whoever opens a link, with no account, ticks the times that address can make, answering again replaces its answer, and sees no one else's. polls_results ranks the times and polls_book books one, in the calendar the person named to receive bookings, which making a poll does not need; a poll closes once booked, or 14 days after it is made, and then holds no address or answer. Naming a circle makes a poll for members of it or, on the person's own circle, for addresses invited that have not joined, meant for those circles_free_times_find names under noCalendar or notJoined: once they answer, the person's own searches for that circle count each by the times they can make, and their page offers to connect a calendar - an address that has not joined joins first, through the link circles_invite gave it. A member with a calendar is read through it, never from a poll. The page a guest opens names nobody but the meeting, so put the person's own name in subject, e.g. Intro call with Sam Lee. An invitee whose time zone is known, as events_create knows a guest's, is answered with that zone and each time in it.
| Name | Required | Description | Default |
|---|---|---|---|
| times | Yes | Each time offered, its start with its offset. | |
| circle | No | The circle's id, as circles_list names it, where the poll is for members of it. | |
| minutes | No | Meeting length in minutes; the stored one where omitted. | |
| subject | Yes | The meeting's name, as whoever opens the link reads it. | |
| invitees | Yes | The address of each person the poll is for. | |
| guestZones | No | A guest's own time zone, only as the person names it - never inferred from an address, a language or a provider. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly=false declared, the description adds unusually rich behavior beyond annotations: each address gets its own link, a lost link requires a new poll, the app sends nothing (caller must distribute), guests answer without an account, re-answering replaces the prior answer, answers are private, and the poll closes on booking or after 14 days, after which it retains no address or answer. It also states bookings need a calendar that poll creation does not require.
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?
Front-loaded with the core purpose, but the body is a dense run-on of long clauses (link lifecycle, circles, guest pages, time zones) that resists parsing. Much of it earns its place as behavior, yet it could be broken into shorter sentences or a lifecycle list without losing 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?
No output schema exists, and the description partly covers returns ('handed back in this answer alone'). For a mutation tool with six parameters it adequately covers lifecycle, closure rules, privacy, distribution responsibility, and the calendar dependency. It leaves the exact response shape vague, so not a 5.
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 baseline is 3, but the description adds real meaning beyond the schema: subject should carry the host's own name ('Intro call with Sam Lee') because the guest page names nobody but the meeting, and guestZones is tied to a known time zone as events_create knows one. These are substantive usage notes not present in the schema descriptions.
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?
Opens with a specific verb+resource: 'Make a poll of times free_times_find found for a named meeting, for the people it is for.' It clearly distinguishes itself from siblings by naming polls_results (ranks), polls_book (books), and circles_free_times_find as the intended upstream source. The phrasing is convoluted, but an agent can identify the operation without opening the schema.
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?
Gives clear context for use: times come from free_times_find, invitees are 'the people it is for,' and the circle variant is spelled out ('Naming a circle makes a poll for members of it or ... addresses invited that have not joined'). It routes downstream work to polls_results and polls_book. It stops short of explicit when-not/alternative selection, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
polls_resultsRead a poll's answersBRead-onlyInspect
Read a poll's answers: each of its times still to come with the addresses of those who can make it, most first, then each address it is for and whether it has answered. An answer is what that address's own link sent. A booked or closed poll holds none; booked names the time it was booked, or is being booked, at.
| Name | Required | Description | Default |
|---|---|---|---|
| poll | Yes | The poll's id, as polls_create names it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the read-only, non-destructive, closed-world profile, so the bar is lower. The description still adds genuinely non-obvious behavior: that answers originate from the respondent's own link, and that booked or closed polls return no answers at all with 'booked' naming the booking time. That edge-case disclosure is real value beyond the structured fields.
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?
It is a single front-loaded sentence of moderate length, so it is not bloated. But the dense, archaic phrasing ('most first, then each address it is for') forces re-reading, and the closing clause about 'booked' is awkwardly appended rather than structured, so the words do not fully earn their 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?
There is no output schema, so the description carries the burden of explaining the return shape; it makes a genuine attempt (upcoming times with eligible addresses, then per-address response status, plus the empty result for booked/closed polls). But the opaque wording leaves the exact structure and ordering only partially recoverable for a read tool an agent must parse.
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?
With one parameter at 100% schema description coverage, the schema already explains that 'poll' is the poll's id. The description only obliquely implies a poll input ('a poll's answers') and adds no format, naming, or sourcing detail beyond the schema's own 'as polls_create names it'.
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?
It opens with a clear verb+resource, 'Read a poll's answers', which distinguishes it from write siblings like polls_book or polls_create. However, the rest of the sentence is written in a convoluted, almost archaic register ('times still to come', 'most first', 'each address it is for') that makes the actual returned content hard to parse on first read.
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 only usage-adjacent information is the conditional 'A booked or closed poll holds none', which hints at when results will be empty but never states when to reach for this tool versus links_polls_list, polls_book, or links_polls_close. No alternatives or prerequisites are named, leaving the agent to infer routing from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preferences_getRead scheduling preferencesARead-onlyInspect
Read the person's scheduling preferences, as preferences_set describes each, null where unset; once any day's hours are set, a day without is off; receiving names the calendar bookings are made in. calendars_list says which calendars count as busy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real domain semantics the annotations cannot: unset values come back null, a day with no hours is off once any day is set, and the 'receiving' field names the booking calendar. That is genuinely useful behavioral context, short only of pagination/error behavior.
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 core action is front-loaded in the first clause and nothing is wasted. The back half is a dense semicolon chain covering three separate rules, which is compact but slightly harder to parse than it needs to be.
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?
There is no output schema, so the description correctly carries the burden of explaining return semantics, and it does so for the tricky cases (null vs. off, receiving calendar). It falls just short of a complete picture of what a 'scheduling preference' record contains, deferring that to preferences_set.
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 tool takes zero parameters, so the baseline is 4. The description instead spends its words on return-value semantics (null when unset, day-means-off rule), which is the right trade-off for a no-arg reader, though it does not enumerate the full set of returned preference fields.
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?
States a specific verb ('Read') and resource ('the person's scheduling preferences') and explicitly positions itself against siblings: preferences_set is the writer whose fields this mirrors, and calendars_list supplies the busy-calendar definition. An agent can distinguish read-preferences from set-preferences without opening a schema.
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 cross-references to preferences_set and calendars_list make the read-vs-write split clear by implication, and the mention of 'receiving names the calendar bookings are made in' tells the agent when this data is relevant. However, it never explicitly states 'use this when you need current preferences; use preferences_set to change them', leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preferences_setChange scheduling preferencesADestructiveIdempotentInspect
Change any of the person's scheduling preferences as preferences_get names them, the rest left as they stand; null clears one. calendar marks one calendar calendars_list names as counting as busy or not. receiving, which null does not clear, names the calendar bookings are made in: one of an account's own calendars, as calendars_list names it. time_zone changes only with zoneConfirmed true, once the person has confirmed it as theirs.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar | No | ||
| receiving | No | ||
| time_zone | No | Time zone, e.g. Europe/London | |
| friday_hours | No | Friday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| horizon_days | No | Days ahead a meeting may be | |
| meeting_link | No | Default meeting link, https | |
| monday_hours | No | Monday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| sunday_hours | No | Sunday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| daily_maximum | No | Most meetings in a day | |
| tuesday_hours | No | Tuesday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| zoneConfirmed | No | True only once the person has confirmed the time_zone passed as theirs. | |
| notice_minutes | No | Least notice in minutes | |
| saturday_hours | No | Saturday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| thursday_hours | No | Thursday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| meeting_minutes | No | Meeting length in minutes | |
| preferred_times | No | Times offered first, e.g. 10:00-12:00, 14:00-16:00 | |
| wednesday_hours | No | Wednesday's working hours, e.g. 09:00-12:00, 13:00-17:00 | |
| buffer_after_minutes | No | Minutes kept free after a meeting being booked | |
| buffer_before_minutes | No | Minutes kept free before a meeting being booked |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true, destructive=true and readOnly=false, so the safety profile is covered. The description adds genuinely non-structured behavior: unspecified fields are left untouched, null clears a field, null does NOT clear receiving, and time_zone only takes effect with zoneConfirmed true. It does not mention permission requirements or error behavior.
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 general partial-update rule is correctly front-loaded, and each clause covers a distinct behavior that earns its place. However, the two comma-spliced run-on sentences are dense and force the agent to re-parse to separate the rules for calendar, receiving and time_zone.
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 19-parameter, zero-required, no-output-schema mutation tool, the description covers the highest-risk semantics (partial update, null clearing, the receiving exception, the time_zone gate). The remaining hours/horizon/buffer fields are adequately handled by the 89%-covered schema, so nothing critical is missing.
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 89%, so baseline is 3, but the description meaningfully exceeds the schema for calendar ('marks one calendar ... as counting as busy or not'), receiving (the calendar bookings are made in, and exempt from null-clearing) and time_zone (gated on zoneConfirmed). Those are cross-field semantics the schema does not express, since most schema descriptions are only form examples.
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?
States a specific verb and resource: 'Change any of the person's scheduling preferences', and cross-references preferences_get as the source of field names, which implicitly separates it from the read sibling. It does not explicitly name other write siblings such as busy_everywhere_set or booking_page_set, so routing is inferred rather than stated.
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 'Change any of the person's scheduling preferences ... the rest left as they stand', which tells the agent this is a partial-update path and that calling preferences_get first is how field names are learned. There is no explicit when-not guidance or comparison against alternative write tools like busy_everywhere_set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
21 tool updates
- First observed
booking_links_create - First observed
booking_page_set - First observed
busy_everywhere_set - First observed
calendars_list - First observed
circles_free_times_find - First observed
circles_invite - First observed
circles_list - First observed
events_cancel - First observed
events_create - First observed
events_edit - First observed
events_get - First observed
events_list - First observed
events_respond - First observed
free_times_find - First observed
links_polls_close - First observed
links_polls_list - First observed
polls_book - First observed
polls_create - First observed
polls_results - First observed
preferences_get - First observed
preferences_set
Publisher details
- Operator
- Lumman Ltd · Publisher source
- Operator website
- https://lumman.co · Publisher source
- Vendor relationship
- Independent · Publisher source
- Documentation
- https://lumman.co/mcp/multi-calendar · Publisher source
- Trust center
- Not available
- Restrictions
- Every calendar free, with 1 booking page and 1 circle; a paid plan adds any number of both. · Publisher source
Related MCP Connectors
Sync Google, Outlook, and iCloud calendars and manage events, availability, and booking links.
Free no-signup group scheduling (a modern When2meet): share one link, find a time for everyone.
Manage Google, Outlook & Apple calendars and create private sync rules from chat.
Merged free/busy, find mutual time, propose bookings with human approval. Never event contents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables interaction with Outlook / Microsoft 365 calendar, allowing users to list events, get event details, find meeting times, and access calendar and profile information.30 npm1MIT
- AlicenseAqualityBmaintenanceEnables privacy-safe calendar availability queries across Outlook, iCloud, and Google ICS feeds, exposing only busy/free intervals and free-slot search without revealing event details.3MIT
- AlicenseAqualityDmaintenanceThe Outlook Calendar MCP enables Claude to directly manage Microsoft Outlook calendars on Windows systems, offering a privacy-focused solution that keeps all data local. Users can view events, create meetings, find free time slots, and manage multiple calendars without their data leaving their machi724 npm42MIT
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to manage Microsoft 365 and Outlook calendars through the Microsoft Graph API. It supports comprehensive event operations including listing, creating, and updating meetings, as well as finding available slots across multiple attendees.-
Glama MCP Gateway
Add one secure layer between your agents and this server.