Agent-Native Calendar
Agent-Native Google Calendar - manage events, sync, and public booking
제작자가 쓴 설명(영어 원문)
Google Calendar for LLM agents: find, create, update, move, delete events; free/busy; scheduling.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, TOKEN_FILE_PATH비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"calendar": {
"command": "uvx",
"args": [
"calendar-mcp-server"
],
"env": {
"GOOGLE_CLIENT_ID": "your-value",
"GOOGLE_CLIENT_SECRET": "your-value",
"TOKEN_FILE_PATH": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add calendar --env GOOGLE_CLIENT_ID=your-value --env GOOGLE_CLIENT_SECRET=your-value --env TOKEN_FILE_PATH=your-value -- uvx calendar-mcp-server실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"calendar": {
"command": "uvx",
"args": [
"calendar-mcp-server"
],
"env": {
"GOOGLE_CLIENT_ID": "your-value",
"GOOGLE_CLIENT_SECRET": "your-value",
"TOKEN_FILE_PATH": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"calendar": {
"type": "stdio",
"command": "uvx",
"args": [
"calendar-mcp-server"
],
"env": {
"GOOGLE_CLIENT_ID": "your-value",
"GOOGLE_CLIENT_SECRET": "your-value",
"TOKEN_FILE_PATH": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
TOKEN_FILE_PATH env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검
레지스트리 이름이 GitHub 계정 deciduus 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(1.0.1)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Agent-Native Calendar, Excel MCP Server, MCP Server for Excel
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
Agent-Native Google Calendar - manage events, sync, and public booking
Create and edit Excel files with AI: charts, PivotTables, formulas. No Excel needed.
Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
An MCP server that gives an LLM client read and write access to your Google Calendar. It runs as a single process — stdio by default, streamable HTTP optionally — and exposes 23 tools with structured output: listing and searching calendars and events, creating, updating, moving, RSVPing to and deleting events, free/busy queries, busyness analysis, recurring-event projection, and finding a mutual slot and booking it. On top of that it has a scheduling brain that knows your working hours: finding and booking focus time, detecting double-bookings across several accounts at once, proposing better times for a meeting, and auditing where your week actually went. Authentication is Google OAuth 2.0 (Desktop app flow); tokens are cached locally, per account, and refreshed automatically.
Synthetic example, backed by offline tests; no real calendar data or live booking. Assume Thursday working hours of 09:00–17:00 UTC, one meeting at 11:00–12:00, no lunch or buffer, and a 60-minute minimum focus block.
“Find six hours of focus time on January 1, 2026. Show me the blocks first.”
An MCP client can call:
{
"tool": "block_focus_time", "arguments": { "time_min": "2026-01-01T00:00:00Z", "time_max": "2026-01-02T00:00:00Z", "hours_needed": 6, "dry_run": true } }
The preview selects 09:00–10:00 and 12:00–17:00: six hours, with the last selected block trimmed to the remaining hour. Both events have created: false. After the user approves the times, the client can call with dry_run: false; availability is read again before creating events. A preview does not reserve a slot.
Design decision: unknown availability is not free time. If a checked calendar returns an access error, disappears from the response, or has unreadable busy intervals, focus search and booking return an error before writing anything. The same check protects mutual scheduling and reschedule suggestions/application. For example, a notFound response for work@example.com becomes:
Availability is unknown: work@example.com: notFound. No scheduling changes were made.
Restore calendar access or retry the query.
Reproduce the preview and the safety regression without Google credentials (after the development install):
pytest -q tests/test_scheduling.py -k 'focus_time_dry_run or focus_refuses_unknown'
The regression verifies that partial, missing and errored availability never calls create_event, in both preview and booking modes. Successful empty busy lists still mean genuinely free time. Availability checks and writes are separate Google API calls, so another client can still book a competing event between them.
1. Create Google OAuth credentials. In the Google Cloud console, enable the Google Calendar API, then create an OAuth client ID of type Desktop app. Copy the client ID and secret. (Details in Google Cloud setup.)
2. Set them in your environment, or in a .env file in the directory you run from (see example.env):
GOOGLE_CLIENT_ID='...'
GOOGLE_CLIENT_SECRET='...'
3. Sign in once, then add the server to your client:
uvx calendar-mcp-server auth
This opens a browser and saves a token in the config directory (see Accounts); if you already have a .gcp-saved-tokens.json or set TOKEN_FILE_PATH, that file is used instead. Verify it with calendar-mcp check. Add more Google accounts with calendar-mcp auth --account work. After that the server runs non-interactively — it never opens a browser on its own unless you set CALENDAR_MCP_ALLOW_BROWSER_AUTH=1.
The PyPI distribution is
calendar-mcp-server. It installs two identical console scripts,calendar-mcpandcalendar-mcp-server, souvx calendar-mcp-serverand a localcalendar-mcpare the same command.
Claude Code
claude mcp add calendar \
--env GOOGLE_CLIENT_ID=... \ --env GOOGLE_CLIENT_SECRET=... \ -- uvx calendar-mcp-server
Claude Desktop — claude_desktop_config.json:
{
"mcpServers": { "calendar": { "command": "uvx", "args": ["calendar-mcp-server"], "env": { "GOOGLE_CLIENT_ID": "...", "GOOGLE_CLIENT_SECRET": "...", "TOKEN_FILE_PATH": "/absolute/path/to/.gcp-saved-tokens.json" } } } }
Cursor — .cursor/mcp.json (project) or ~/.cursor/mcp.json (global): same mcpServers block as above.
Any other client that speaks the standard mcpServers JSON takes the same entry. TOKEN_FILE_PATH is optional now that tokens default to the OS config directory, which does not depend on the working directory the client picks — but if you do set it, make it an absolute path.
calendar-mcp --transport http --host 127.0.0.1 --port 8000
The MCP endpoint is then http://127.0.0.1:8000/mcp (change the path with --path).
There is no authentication layer on the HTTP transport yet. Anyone who can reach the endpoint gets full access to the calendar the saved token belongs to. Bind it to loopback, or expose it only behind a trusted reverse proxy that authenticates, or on a private network such as a tailnet. Do not put it on a public interface.
Read-only tools never change anything. "Writes" tools create or modify events; delete_event is the only one that destroys data.
Calendars and events
| Tool | Description | |
|---|---|---|
list_calendars | read | List the calendars the user can see, with IDs and timezones. |
find_events | read | Search a calendar for events, expanding recurring series into instances. |
check_attendee_status | read | Report who accepted, declined or has not answered an invitation. |
query_free_busy | read | Busy intervals for one or more calendars, without event details. |
analyze_busyness | read | Per-day event count and total scheduled minutes over a range. |
project_recurring_events | read | Compute future occurrences from recurrence rules. |
create_calendar | writes | Create a new secondary calendar. |
create_event | writes | Create an event with explicit start/end times and optional attendees. |
quick_add_event | writes | Create an event from a plain-English phrase, parsed by Google. |
update_event | writes | Change fields on an event; omitted fields are left untouched. |
move_event | writes | Reschedule an event, and/or move it to another calendar. |
add_attendee | writes | Invite one or more people to an existing event. |
respond_to_event | writes | Set your own RSVP (accepted/declined/tentative/needsAction). |
schedule_mutual | writes | Find the first slot where everyone is free, then book it. |
| `delete_event` | destroys | Permanently delete an event. Asks the client to confirm via elicitation when supported. |
Scheduling brain — these read your saved preferences (working hours, lunch, buffer, minimum focus block).
| Tool | Description | |
|---|---|---|
find_focus_time | read | Uninterrupted blocks in a window that could be used for deep work, longest first. |
detect_conflicts | read | Double-bookings and too-tight transitions, across every signed-in account at once. |
time_audit | read | Where the time went: meeting hours, by size, domain, recurrence and person. |
suggest_reschedule | writes *(opt-in)* | Ranked better times for an existing meeting. Suggests only, unless apply: true. |
block_focus_time | writes | Book the best free blocks as focus time. dry_run: true to preview. |
Local configuration — no Google call, no account argument.
| Tool | Description | |
|---|---|---|
list_accounts | read | The accounts you have signed in, and which is the default. |
get_preferences | read | Working hours, lunch, buffer, minimum focus block, focus calendar. |
set_preferences | writes | Update and save those preferences. Local file only. |
Every calendar tool takes an optional trailing account argument (detect_conflicts takes accounts, a list, because checking several at once is the point). All times are ISO 8601 strings — a naive timestamp is interpreted in the target calendar's own timezone.
The five scheduling tools share one idea: your calendar is not the same as your availability. They start from your working hours, subtract lunch, subtract what is already booked, and subtract the buffer you want around meetings — then reason about what is left.
Prompts that exercise them:
find_focus_time reports what exists; block_focus_time defends it by creating events (busy, reminders off, nobody notified), trimming the last block so it books exactly the hours you asked for rather than a whole afternoon. detect_conflicts separates genuine overlaps from *tight* transitions that merely break your buffer, and ignores events you declined, events marked free, and (by default) all-day entries. suggest_reschedule keeps the meeting's duration, ranks candidate slots by fewest attendee conflicts and prefers the event's current day, and moves nothing unless you pass apply: true.
time_audit answers "how much of my week is meetings?" in one pass, grouped by day or week:
2026-08-01 .. 2026-09-01, Europe/Berlin, grouped by week
Meetings: 41.5 h across 63 meetings Working hours: 152.0 h available (lunch removed) In working hours: 38.0 h -> 25% of the week Busiest week: 2026-W34, 14.0 h Heaviest day: 2026-08-20, 6.5 h By size: 1:1 18.0 h | small 15.5 h | large 8.0 h By recurrence: recurring 26.0 h | one-off 15.5 h Top people: a.schmidt@example.com 9.0 h | j.lee@example.com 7.5 h
Declined meetings, events marked free and all-day entries are left out by default; include_declined and include_all_day bring them back.
dry_run: true to see the exact blocks it would book before anything is written. The destination calendar is always included in the availability check.calendar_ids / check_calendar_ids in that case.apply is false and has to be set explicitly, once the user has agreed to a time.update_event leaves fields you omit untouched.You can sign in more than one Google account and pick between them per call.
calendar-mcp auth # the default account
calendar-mcp auth --account work # a second, named account calendar-mcp accounts
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요