Skip to main content
Glama

Find free time

well_find_free_time
Read-only

Find when the user is free, or when the user and other workspace members are all free. Use it when the user asks when they are free, which slots are open, or when a meeting could fit. It reads the user's own synced calendars: every timed event that is not cancelled blocks its time, and all-day events do not. It returns the free slots between 09:00 and 18:00 in the user's time zone, or between the working_hours the user named. To find a time that suits workspace members too, pass their person ids in member_person_ids: it then returns only the slots where the user and every connected member are free, and a member's private meeting blocks time like any other. It never shows what anyone's events are, only the shared free slots: time outside a slot is busy and the reason is never given. A member whose calendar is not connected to Well is listed in members_not_connected and is not counted: tell the user that member's free time was not checked. Someone outside the workspace, such as a guest, cannot be checked: say so and do not guess when they are free. If truncated is true, some calendar events could not be read: tell the user the check is incomplete and give incomplete_check.message; never suggest a time after incomplete_check.checked_until. If capped_range is set, the range was longer than 31 days and only its first 31 days were searched: tell the user the range was shortened and to which date, and offer to search the rest; never suggest a time beyond searched_to_date. If the result has a note, give it to the user as it is: it invites them to connect their own calendar.

The result's connection describes the user's own calendar. Its state is one of "connected" (say nothing about it), "syncing" (the first sync has not finished: say the result can be incomplete), "stale" (say the result can be out of date and give last_synced_at as the time of the last update), "needs_reconnect" (say Well lost access to the calendar, that the result holds only what was synced before, and give reconnect_link once) or "not_connected" (say the user's own calendar is not connected and give reconnect_link once, unless the note already gave it). When the state is not "connected", never call the result complete or up to date, and never call a time free on its strength alone. A null connection means the state could not be read: say nothing about it.

When the token authorizes one workspace, call this directly — no workspace call is needed first. When it authorizes several, this read will not guess which one you mean: pass workspace_id on the call.

Input Schema

NameRequiredDescriptionDefault
to_dateNoLast day to search, inclusive; defaults to from_date; a range over 31 days is shortened to its first 31 days and the result says so
from_dateYesFirst day to search, YYYY-MM-DD, in the user's own time zone
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which.
working_hoursNoOnly when the user names other hours than 09:00-18:00, as HH:MM
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.
min_slot_minutesNoShortest free slot to return, in minutes; defaults to 30
member_person_idsNoPerson ids of workspace members to find a shared free time with, at most 5; look a member up with well_query_records, or take the owner_person_id of their calendar from well_list_calendars. Leave it out for the user's own free time

Output Schema

NameRequiredDescriptionDefault
noteYes
errorNo
slotsYes
successYes
timezoneYes
truncatedYes
connectionYes
capped_rangeYes
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
incomplete_checkYes
members_includedYes
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
members_not_connectedYes
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • changedOutput schema / properties / connection / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "last_synced_at": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "reconnect_link": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "state": {
      -        "enum": [
      -          "connected",
      -          "syncing",
      -          "stale",
      -          "needs_reconnect",
      -          "not_connected"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "last_synced_at",
      -      "reconnect_link"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "last_synced_at": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "reconnect_link": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "state": {
      +        "enum": [
      +          "connected",
      +          "syncing",
      +          "stale",
      +          "needs_reconnect",
      +          "not_connected"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "last_synced_at",
      +      "reconnect_link"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / note / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / note / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / resolved_workspace / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resolved_workspace / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / timezone / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / timezone / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed1 schema field changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  3. Changed2 schema fields changed
    • addedOutput schema / properties / connection
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "last_synced_at": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "reconnect_link": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "state": {
      +          "enum": [
      +            "connected",
      +            "syncing",
      +            "stale",
      +            "needs_reconnect",
      +            "not_connected"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "last_synced_at",
      +        "reconnect_link"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "timezone",
      -  "slots",
      -  "members_included",
      -  "members_not_connected",
      -  "truncated",
      -  "capped_range",
      -  "incomplete_check",
      -  "note",
      -  "success"
      -]New value: +[
      +  "timezone",
      +  "slots",
      +  "members_included",
      +  "members_not_connected",
      +  "truncated",
      +  "capped_range",
      +  "incomplete_check",
      +  "note",
      +  "connection",
      +  "success"
      +]
  4. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only annotations, the description discloses substantial behavioral detail: timed events block time while all-day events do not, private meetings still block shared availability, event contents are never exposed, disconnected members are reported but not counted, and truncation/capping must be surfaced. It also explains how to interpret connection states and when not to claim a result is complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loads the core purpose and then organizes edge cases into clear paragraphs. It is appropriately detailed for a tool with complex calendar and privacy semantics, though some result-handling guidance is verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even with an output schema present, the description explains how to handle incomplete checks, capped ranges, disconnected members, and non-connected calendar states. It gives the agent enough context to both call the tool and accurately report tricky results to the user.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is already strong, but the description adds operational meaning for key parameters. It explains that member_person_ids switches the tool to shared-availability mode and that workspace_id must be supplied when the token authorizes several workspaces.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: find free time for the user, optionally shared with workspace members. It clearly distinguishes the two operating modes and would let an agent differentiate it from calendar-event CRUD siblings like well_list_calendar_events or well_create_calendar_event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions such as when the user asks when they are free, which slots are open, or when a meeting could fit. It also names alternatives for member lookup (well_query_records, well_list_calendars) and tells the agent to call directly when the token authorizes one workspace.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources