← Blog

How to give an AI agent access to your calendar with MCP

Connect Claude, Cursor or any MCP client to your Google, Microsoft or Zoho calendars with a scoped key, so it can find free time across all of them and book meetings for you.

An AI assistant that can write an email but cannot see your calendar ends every scheduling task with "let me know what time works". The Model Context Protocol (MCP) fixes that: it is the open standard assistants use to call outside tools, and a calendar MCP server gives the assistant your availability and the power to book.

This guide connects an agent to your calendars through neosfy in five steps, and ends with what the setup cannot do.

What the agent gets

Once connected, the agent can call eight tools. Five only read:

  • list_accounts: your connected calendar accounts and their calendars, with the ids the other tools need. Agents call it first.
  • availability: free slots for a scheduling profile (step 2), across every calendar the profile counts as busy plus its holidays calendar, so it never offers a time you are already busy on another account.
  • free_busy: the raw busy windows of your accounts, merged, without any booking rules applied.
  • list_events and get_event: the agenda, with title, attendees, location and meeting link.

Three write:

  • create_event: book a meeting, with guests, an invite sent from your own calendar, a Google Meet link and, if you want, a recurrence such as RRULE:FREQ=WEEKLY;COUNT=4 (RFC 5545).
  • update_event: move or edit a meeting; only the fields the agent passes change.
  • delete_event: cancel a meeting. Cancelling one that is already gone is not an error, so a retry is safe.

It never sees your Google, Microsoft or Zoho password or tokens. It holds a neosfy agent key, and that key decides what it may do.

How the tools keep an agent from guessing

Agents make mistakes that a person would not, so the tools are strict on purpose:

  • No offset, no answer. Every time must carry its UTC offset (2026-10-27T15:00:00-03:00). A time without one is refused instead of being read in the wrong time zone.
  • Unreadable is not free. If one of your calendars cannot be read (an expired connection, a provider outage), availability and free_busy fail with an error. They never report a slot as free because they could not see it.
  • Check before booking. With verify_free, create_event reads the busy windows first and answers conflict, creating nothing, if the slot was taken in the meantime.
  • Retries do not double-book. An agent that sends an idempotency_key and retries after a timeout gets the first result back, not a second meeting.
  • Windows are bounded. availability, free_busy and list_events cover at most 62 days per call. A wider range is refused, not silently cut.
  • Invite text is data. Event titles, descriptions, locations and attendee names are written by other people. neosfy hands them to the agent marked as untrusted, with the instruction to treat them as data, never as instructions. That lowers the risk of a prompt injection hidden in a meeting invite; it does not remove it, which is one more reason to scope the key (step 3).

1. Connect your calendars

Create a neosfy account and connect each calendar account you use: Google Calendar (Google Workspace or a personal Gmail), Microsoft Outlook or Microsoft 365, and Zoho Calendar. neosfy reads their busy time as one availability.

For each calendar you choose whether it counts as busy, so a shared team calendar does not block your day. You can also add a holidays calendar, so nobody is offered a slot on a public holiday. Events you declined do not count as busy.

The free trial lasts 14 days and connects two calendar accounts. The Individual plan also allows two, Pro six.

2. Create a scheduling profile

A profile is the set of rules for one kind of meeting. It holds:

  • Weekly hours, in the profile's time zone: for example 09:00 to 12:00 Monday to Friday and 14:00 to 18:00 on Mondays and Fridays.
  • Duration and slot step: 30-minute meetings offered every 30 minutes.
  • Buffers, minimum notice and horizon: time kept free before and after each meeting, how soon a meeting can be booked (say four hours from now), and how far ahead (say 30 days).
  • Calendars: which calendar the meeting is created on, which calendars count as busy, and the holidays calendar.
  • Booking options: whether to add a video link, send invites and check that the slot is free before booking.

Make one profile per purpose (sales calls, interviews, support). The same profile powers your booking link, so the agent and a person on your booking page are offered the same times.

3. Create a key with the right scope

In the dashboard, create an agent key and set its scope:

  • Tools. A scheduling assistant needs availability and create_event. A reporting agent needs only list_events. A tool that is not listed is refused.
  • Profiles. The profiles the agent may check and book through. A profile is enough to offer times and book, without exposing the details of any event.
  • Accounts. The calendar accounts whose events the agent may read or change. Leave the personal calendar out of a work agent's reach.
  • Attendee limit. The most guests the agent may put on one meeting.
  • Rate limit. How many calls a minute the key may make.

A sales assistant that only proposes and books calls, with no access to your agenda, looks like this:

{
  "tools": ["availability", "create_event"],
  "profiles": ["sales"],
  "accounts": [],
  "max_attendees": 5,
  "rate": { "per_minute": 60 }
}

Anything outside the scope is refused with a clear error, so the agent can tell you why instead of failing silently. The key itself is shown once, when you create it: copy it then. The trial and the Individual plan allow two active keys, Pro ten.

4. Paste the config into your client

The dashboard shows the config for your client. For clients that speak MCP over HTTP (Claude Code, Cursor, OpenClaw), it looks like this:

{
  "mcpServers": {
    "neosfy": {
      "type": "http",
      "url": "<MCP URL from your neosfy dashboard>",
      "headers": { "X-API-Key": "<your agent key>" }
    }
  }
}

Claude Desktop reaches HTTP servers through the mcp-remote bridge; the dashboard gives you that version too.

5. Ask for a meeting

Try: "Find 30 minutes with ana@example.com next Tuesday afternoon on my sales profile and send the invite." The agent calls availability for the sales profile, picks a slot, and calls create_event through the same profile. The profile decides the calendar, the duration and the video link, and checks the slot is still free. The invite goes out from your own calendar.

Keep control

Give each client its own key. If a laptop is lost or an experiment goes wrong, revoke that key and every other agent keeps working. When an agent needs more, or less, change its key's scope: the key stays the same, so nothing has to be pasted again.

What this setup cannot do

  • Microsoft calendars are read-only. They count toward your busy time, but an agent cannot create, move or cancel a meeting on them. Book on a Google or Zoho calendar instead.
  • Video links come from Google. A meeting booked on a Google calendar can get a Google Meet link. Microsoft Teams links are not available, since Microsoft calendars are read-only, and meetings booked on Zoho carry no video link.
  • Two months per call. An agent that needs a longer view makes several calls.
  • The agent still decides. The tools refuse what the key does not allow and never invent a free slot, but which slot to pick and whom to invite is the agent's call. Start with a narrow scope and widen it as you trust the agent.