Provider REST API
ProductivityConnect Claude to Google Calendar
Read calendars, check availability, and create, update, or cancel events. Toolspoke puts 8 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Provider REST API
- Authentication
- OAuth 2.0
- Actions exposed
- 8
- Cost per call (typical)
- 1 credit
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install Google Calendar
Open the marketplace in your workspace, add Google Calendar to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Sign in to Google Calendar. Toolspoke holds the token encrypted and refreshes it when it expires.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. Google Calendar shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What Google Calendar asks for
Press connect and sign in to Google Calendar. Toolspoke keeps the token encrypted and refreshes it when it expires, so there is nothing to copy and nothing to rotate by hand.
- Default calendar IDOptional
- Used whenever an action is called without an explicit calendar_id. "primary" is the connected account's own calendar; other IDs look like an email address and come from list_calendars.
- primary
The scopes it asks for
- https://www.googleapis.com/auth/calendar.events
- https://www.googleapis.com/auth/calendar.readonly
What Claude can do in Google Calendar
8 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 4Reads
- Writes
- 2Writes
- Destructive
- 2Destructive
Reads
4Fetches data and changes nothing.
list_calendarsList the calendars this account can see, with their IDs, time zones and access roles. Call it first when you do not know which calendar ID to use, or to find out whether the connection can write to a calendar at all - accessRole "reader" means it cannot.
list_eventsList events on one calendar within a time window. Recurring events are expanded into their individual occurrences and ordered by start time, so "what is on Thursday" is answered directly. Times are RFC 3339 with an offset, e.g. 2026-08-20T09:00:00+05:30.
get_eventFetch one event by ID - summary, description, location, start and end, recurrence, and its organiser. Event IDs come from list_events.
find_free_timeAnswer "when is this free" across one or more calendars at once. Returns only busy intervals - start and end times with nothing about what the events are - which is what makes it the right call for scheduling against a colleague's calendar you can see but should not read.
Writes
2Creates or updates something on the other side.
create_eventPut an event on a calendar. This writes to the calendar and notifies nobody - it cannot invite anyone, and sendUpdates is pinned to none. Use invite_to_event to add attendees, which is classified destructive because it reaches people outside the workspace.
update_eventChange an existing event's title, description, location or times. This writes to the calendar and notifies nobody - it cannot invite anyone, and sendUpdates is pinned to none. Use invite_to_event to add attendees, which is classified destructive because it reaches people outside the workspace. Only the fields passed are altered.
Destructive
2Deletes or permanently alters something. Worth granting on purpose.
invite_to_eventInvite people to an existing event, and optionally email them about it. Adding an attendee puts the event on someone else's calendar and send_updates: "all" mails them, both of which reach outside the workspace - the same class of act as sending mail, which is why this is destructive rather than a write. A write grant can create and edit events but cannot reach this. NOTE: the attendee list is REPLACED, not appended: fetch the event with get_event first and pass the existing attendees alongside the new ones, or the people already on it are silently uninvited.
delete_eventCancel an event and remove it from the calendar. Classified destructive, so a write grant cannot reach it and an install has to grant full access or name it explicitly. send_updates decides whether attendees are told it was cancelled, and defaults to none.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 8 actions above are the whole of it. A call to any other name is refused before it reaches Google Calendar rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- It reaches no further than your credential
- Toolspoke holds no access to Google Calendar of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from Google Calendar
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Google Calendar. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around Google Calendar's own rate limits. A call that Google Calendar refuses comes back to the agent as a failed call.
Before you connect it
What can Claude do in Google Calendar?
8 named actions: 4 that only read, 2 that write and 2 that delete or permanently alter something. They include list_calendars, list_events and get_event. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the Google Calendar connector need?
Nothing to paste. You sign in to Google Calendar over OAuth 2.0 and Toolspoke keeps the resulting token encrypted, refreshing it when it expires. It asks for https://www.googleapis.com/auth/calendar.events and https://www.googleapis.com/auth/calendar.readonly, and can do nothing outside them.
Does the Google Calendar connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 8 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the Google Calendar connector not do?
The 8 actions above are the whole of it. A call to any other name is refused before it reaches Google Calendar rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. Toolspoke holds no access to Google Calendar of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Google Calendar. An agent has to ask. Toolspoke does not retry, queue or back off around Google Calendar's own rate limits. A call that Google Calendar refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches Google Calendar's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls Google Calendar?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.