AI agents and MCP tool design

    MCP Scheduling Server Tutorial: Design Tools That Finish Group Meetings

    By Tevye Krynski15 min read

    A calendar MCP server can expose ‘list events’ and ‘create event’ before lunch. That is useful. It is not a group-scheduling system. The hard job begins when five people span two companies, one calendar is missing, a required participant declines, and the model retries the booking tool after a timeout. This tutorial designs the MCP boundary for that job.

    Build the MCP scheduling server in eight boundaries

    Expose a small command surface around one durable meeting request. Do not make the model chain provider CRUD tools while carrying the meeting state in chat. Every tool call should validate policy, persist its result, and return structured state that another worker can resume.

    1. 1

      Define the meeting-intent schema before the tools

      Create a typed record with meeting_request_id, organizer, purpose, duration, date window, booking deadline, meeting time zone, working-hour rules, preferences, exclusions, location, approval mode, and revision. Put people into separate required_participants and optional_participants arrays. Add approved outreach channels and consent references before the server contacts anyone.
      • Reject a request with no organizer, duration, date window, or required participant.
      • Store IANA time-zone names; do not treat a fixed UTC offset as a permanent zone.
      • Keep the original instruction for audit while running the workflow from typed fields.
    2. 2

      Expose commands, reads, and side effects as different tools

      Start with a narrow surface such as create_meeting_request, get_meeting_request, revise_meeting_request, approve_participant_outreach, approve_slot, and cancel_meeting_request. Reading state is not the same risk as emailing a participant or writing a calendar event. MCP lets servers publish JSON Schema inputs and optional output schemas; use both so clients can validate the contract.
      • Give every side-effect tool an explicit authorization or policy field.
      • Return structured content with state, revision, blocking reasons, and next actions.
      • Keep provider-specific calendar operations behind the server rather than exposing them as the meeting model.
    3. 3

      Resolve consent and connected free/busy per person

      For each participant, record whether the server may read connected Google or Microsoft free/busy, request availability conversationally, or must stop for human approval. Google exposes a free/busy query; Microsoft Graph exposes getSchedule. Normalize both into busy intervals with participant ID, provider, source account, retrieval time, and error state. A partial response is missing evidence, not an open calendar.
      • Ask for the smallest calendar permission that supports the action.
      • Keep event titles, descriptions, locations, and attendee lists out of model context.
      • Separate permission denial, expired access, throttling, and provider failure.
    4. 4

      Make participant outreach and no-sync fallback resumable

      Calendar connection is optional. When a required person is not connected, the server should create an outreach task that names the organizer, meeting purpose, duration, date window, response deadline, and time zone. Parse the reply into the same availability shape as provider free/busy. If the response says ‘Tuesday afternoon’ without a zone, return needs_participant_clarification and ask one narrow follow-up.
      • Require an approved channel and an organizer-authority record before outreach.
      • Cap reminders and preserve opt-out or decline state.
      • Do not silently demote a required person because they did not connect or reply.
    5. 5

      Generate slots with deterministic quorum and time-zone rules

      Intersect every required participant first. Score surviving slots for optional attendance, organizer preferences, working hours, buffers, fairness across time zones, and deadline. Let the model explain a result, but do not let it override hard attendance or consent policy. Persist the availability snapshot and rejection reason behind every proposal.
      • A required participant remains a hard constraint until an authorized revision changes the brief.
      • A changed time zone invalidates affected proposals.
      • A no-overlap result names the smallest constraints an operator could change.
    6. 6

      Put human control at the side-effect boundary

      The MCP specification says applications should make exposed tools clear and provide human control for tool invocations. For scheduling, approval policy can differ by action. Reads and slot generation may run automatically; external outreach, sensitive relationships, booking, rescheduling, and cancellation may require confirmation. The server must enforce that policy even if a client calls the tool directly.
      • Return <code>approval_required</code> as normal domain state, not a vague error.
      • Bind approvals to a meeting revision and an exact proposed action.
      • Expire approval when a required calendar or participant constraint changes.
    7. 7

      Commit one event with idempotency and reconciliation

      Derive a booking key from meeting request, revision, and approved proposal. Re-check fresh free/busy, then write the organizer event once and persist provider identifiers before reporting success. A client retry, worker restart, or duplicate MCP call must return the prior result. If the provider times out after an uncertain write, query or reconcile before trying another insert.
      • One approved revision creates at most one canonical event.
      • Retries do not resend participant outreach or duplicate invitations.
      • A partial calendar write moves to a visible recovery state with a safe next action.
    8. 8

      Return verified completion and meeting-level observability

      A successful tools/call response is not proof that the meeting is booked. Verify event ID, organizer calendar, start, end, time zone, required attendees, invitation dispatch, and current revision. Emit states such as collecting_availability, waiting_on_required_participant, candidate_ready, awaiting_approval, committing, confirmed, and needs_review.
      • Trace provider calls, participant messages, approvals, and commits by meeting request ID.
      • Return stable domain reason codes separately from JSON-RPC or transport errors.
      • Alert on stuck states, exhausted retries, and duplicate-commit attempts.

    A tool result is not a meeting result

    MCP distinguishes protocol errors from tool-execution errors. Your scheduling domain needs one more layer: durable meeting state. Invalid JSON arguments can return a protocol error. A provider throttle can return a tool-execution error. A required participant who declines is neither. It is a valid business event that moves the meeting to a state the organizer can resolve.

    Return fields such as meeting_request_id, revision, state, blocking_reasons, active_proposal, booking, and next_actions. A later tool call should read those facts from the server. The model should never have to reconstruct the meeting from its own prior text.

    Keep the model away from raw calendar data

    The slot engine needs busy intervals, freshness, working-hour policy, and provider error state. It does not need confidential event names. Google provides free/busy-only scopes, and Microsoft lists Calendars.ReadBasic as the least-privileged permission for getSchedule. Provider adapters should remove unnecessary detail before any result reaches the model.

    Treat tool descriptions, annotations, and tool output as security boundaries too. The MCP specification says clients must consider annotations untrusted unless they come from trusted servers. Validate inputs, apply access control, rate-limit calls, sanitize outputs, set timeouts, and log tool usage without logging private calendar detail.

    Scheduling execution is larger than calendar MCP

    A calendar MCP server can read or write a connected account. A booking-link tool can publish host availability. A poll tool can collect votes. An AI assistant can draft outreach. Each is a component. None automatically owns required and optional participants, unconnected-calendar fallback, reminders, slot policy, idempotent commit, and verified invitations across company lines.

    Scheduling execution owns that instruction-to-booking state machine. WonderCal’s direction is to supply that layer beneath the agent: connected Google and Microsoft free/busy when available, conversational collection when it is not, cross-company overlap, invitations, recovery, and a completed result. The September developer release must prove those boundaries before a production team should depend on them.

    The acceptance test for your MCP scheduling server

    Use five test identities across two companies and both calendar providers. Leave one required participant unconnected. Force one ambiguous time-zone reply, one required decline, one provider throttle, one timeout after a calendar write, one duplicate tool call, and one reschedule. The pass condition is one canonical event or one bounded exception with evidence and a safe next action.

    Count every human touch, but do not reward unsafe autonomy. A confirmation prompt at the right side-effect boundary is correct. A human rebuilding the participant list because the server forgot it is not. The MCP layer succeeds when the agent can resume the meeting after hours or days without reply-all archaeology.

    Choose the MCP boundary by the job it finishes

    Tool count is a weak proxy. Compare the meeting state, cross-company reach, fallback, control, recovery, and completion contract behind the tools.

    Execution completion

    Provider calendar MCP

    Reads and writes a connected calendar; your agent still owns participant state, outreach, slot policy, and verification.

    Link or poll MCP

    Creates a participant-facing choice surface; a person still has to respond and the client may have to close the loop.

    WonderCal execution direction

    Target boundary accepts a hard-meeting brief and returns verified invitations or a bounded exception.

    Cross-company reach

    Provider calendar MCP

    Every provider, tenant, identity, and credential path becomes part of your application.

    Link or poll MCP

    External people can open the surface, but their calendar evidence may remain self-reported.

    WonderCal execution direction

    Designed for required and optional people across Google, Microsoft, companies, and unconnected calendars.

    Optional-sync fallback

    Provider calendar MCP

    You build outreach, reply parsing, reminder policy, ambiguity handling, and consent.

    Link or poll MCP

    The link or poll is the fallback and transfers work to participants.

    WonderCal execution direction

    Target design combines connected free/busy and conversational collection in one meeting record.

    Recovery and observability

    Provider calendar MCP

    Full control, with full responsibility for replay, provider errors, traces, and reconciliation.

    Link or poll MCP

    Shows activity inside the link or poll; full meeting state may live elsewhere.

    WonderCal execution direction

    The live release should be judged on states, idempotency, reason codes, webhooks, and operator recovery.

    Consent and control

    Provider calendar MCP

    Your client and server must enforce scopes, approvals, retention, and revocation.

    Link or poll MCP

    Participant action is explicit, while organizer authority and tool-side approvals may remain external.

    WonderCal execution direction

    Target model separates reads, outreach, booking, cancellation, and human approval while protecting private details.

    Time to ship

    Provider calendar MCP

    Quick for one connected calendar; hard meetings add a long coordination and support roadmap.

    Link or poll MCP

    Quick when participant self-service satisfies the product promise.

    WonderCal execution direction

    Worth adopting when the released execution layer removes coordination logic your team would otherwise own.

    Frequently asked questions

    What is an MCP scheduling server?

    An MCP scheduling server exposes scheduling capabilities to an AI client through Model Context Protocol tools. A production server for hard meetings needs more than calendar CRUD: typed meeting intent, required and optional roles, consent, connected free/busy, a no-sync participant path, slot policy, safe retries, observable state, and verified invitations.

    Should one MCP tool schedule the whole meeting synchronously?

    No. Cross-company scheduling is usually long-running. Create a durable meeting request, return its ID and state, and expose commands that can resume or approve work. A required participant may answer hours later, while provider calls and booking commits still need deterministic recovery.

    How should an MCP server handle participants without connected calendars?

    Use an approved conversational or private response path. Ask for availability inside the meeting window, normalize the response into the same format as connected free/busy, preserve its time zone and freshness, and escalate silence from a required person. Calendar sync should help, not act as an admission ticket.

    Which MCP scheduling tools need human confirmation?

    Policy should distinguish reads from side effects. Sensitive participant outreach, creating an event, rescheduling, and cancellation are common confirmation boundaries. The MCP tools specification recommends clear tool visibility and human control for invocations.

    Is WonderCal’s MCP scheduling server available now?

    WonderCal is targeting a developer-facing MCP/API release for September 1, 2026. Treat named tools and end-to-end behavior as future until documented and live. Check WonderCal for AI agents and test the released contract before making it a production dependency.

    Primary sources

    Related WonderCal reading

    Give the model tools. Keep the meeting state deterministic.

    Use this MCP scheduling server contract to evaluate WonderCal’s developer release: durable intent, connected and conversational availability, consent, safe side effects, recovery, observability, and one verified booking.

    Review WonderCal for AI agents