icloud-calendar-mcp
icloud-calendar-mcp
信頼性が高く軽量な Apple iCloud Calendar MCP サーバーです。ネイティブ TypeScript/Node.js で、CalDAV 経由で iCloud に直接接続します。Java、Python、Go、AppleScript、macOS、Calendar.app には依存しません。
English summary: A production-oriented, cross-platform TypeScript MCP server for Apple iCloud Calendar. It provides guarded CalDAV CRUD, persistent opaque handles, idempotent writes, ETag concurrency control, recurrence expansion, stdio and secured Streamable HTTP transports.
インストール
Node.js 20 以降が必要です。Apple の「アプリケーション固有のパスワード」を使用する必要があります。Apple アカウントのマスターパスワードは使用しないでください。
npx icloud-calendar-mcpアプリケーション固有のパスワードを作成する: account.apple.com にログインし、「ログインとセキュリティ」→「アプリケーション固有のパスワード」に進みます。Apple は同時にアクティブにできるアプリケーション固有のパスワードの数を制限する場合があります。パスワードを取り消すと、本サービスは AUTH_FAILED を受信します。
stdio クライアント設定:
{
"mcpServers": {
"icloud-calendar": {
"command": "npx",
"args": ["-y", "icloud-calendar-mcp"],
"env": {
"ICLOUD_USERNAME": "you@example.com",
"ICLOUD_APP_PASSWORD": "xxxx-xxxx-xxxx-xxxx"
}
}
}
}stdout は JSON-RPC 専用です。すべてのログは stderr に書き込まれます。
Related MCP server: ical-mcp
ツールと MCP コンテンツ
名前 | 説明 |
| iCloud カレンダーを一覧表示する |
| 明示的な時間範囲、タイムゾーン、カーソル、上限でクエリを実行する。CalDAV サーバーに occurrence の展開を要求する |
| プロセス間で永続化された不透明なハンドルを使用してイベントを読み取る |
|
|
| 永続ハンドルと |
| 永続ハンドルと |
| 時間的に重複するイベントを検索する |
| 現在読み取り可能なイベントから、クライアント側で確実にビジー時間を計算する |
ツールは structuredContent とテキスト JSON の両方を返し、read-only/destructive/idempotent/open-world の注釈を宣言します。リソース: calendar://calendars。明示的なユーザーテンプレートプロンプト: schedule_event、reschedule_event、find_conflicts。これらはユーザーに代わって自主的にスケジュールを決定することはありません。
イベントは、時刻指定/終日、タイトル、説明、場所、URL、RRULE、DISPLAY アラーム、参加者をサポートします。参加者フィールドは iCloud とカレンダー共有の権限に制限されます。本サービスは「ATTENDEE への書き込み」を招待状の送信成功として誤って報告することはありません。
時刻と繰り返しイベントのセマンティクス
時刻指定イベントの入力には ISO 8601 時刻と IANA
timezoneを指定する必要があります。出力でもタイムゾーンが明示的に返されます。終日イベントの
start/endはYYYY-MM-DDを使用します。endはイベントに 含まれません。例: 8月18日の終日イベントはstart=2026-08-18、end=2026-08-19となります。iCalendar は
ical.jsを使用して構築および解析されます。ユーザーフィールドを文字列連結することはありません。テストでは DST、UTC、終日の境界をカバーします。list_eventsは CalDAVcalendar-data/expandリクエストを通じて RRULE occurrence を展開します。whole_seriesは更新/削除をサポートします。single_occurrence、this_and_futureは、iCloud の繰り返し例外機能が検証されていない場合、UNSUPPORTED_OPERATIONを返し、決して静かにシリーズ全体に変更することはありません。
HTTP モード
HTTP はデフォルトでオフになっています。有効にすると loopback のみをリッスンし、bearer token は少なくとも 24 文字必要です:
ICLOUD_MCP_TRANSPORT=http \
ICLOUD_MCP_HTTP_TOKEN='replace-with-a-long-random-token' \
ICLOUD_MCP_HTTP_PORT=3000 \
npx icloud-calendar-mcpMCP エンドポイント:
POST /mcpヘルスチェック:
GET /healthz(Apple にアクセスせず、アカウントの状態も漏洩しません)bearer token を強制します。固定された Host allowlist。Origin はデフォルトですべて拒否。デフォルトのリクエスト上限は 1 MiB。ローカルの読み取り/書き込みレート制限。タイムアウトとセキュリティ応答ヘッダーの境界。
ICLOUD_MCP_CONFIG=/absolute/path/config.jsonを使用して、allowedHosts、allowedOrigins、timeoutMs、maxEvents、読み取り/書き込みレート制限、リクエスト上限などの安定したパラメータを設定します。認証情報はこのファイルに入れることはできません。
完全な設定契約については docs/tool-contracts.md を、セキュリティモデルについては docs/security.md を参照してください。
信頼性
create の UID は
request_idの安定した SHA-256 派生値です。重複したリクエストによって2つ目のイベントが生成されることはありません。create は
If-None-Match: *を使用し、update/delete は既に読み取った ETag のIf-Matchを使用します。ジャーナルはアトミックな rename でユーザーデータディレクトリ(デフォルトは
~/.icloud-caldav-mcp/journal.json、権限は厳格化)に書き込まれ、リクエストのリプレイと不透明なハンドルを保存します。429/5xx/ネットワークの一時的な障害には、ジッター付きの指数バックオフを使用し、
Retry-Afterを尊重します。応答に ETag がない場合は、read-after-write の可視性ポーリングを行います。安定したエラーコード:
AUTH_FAILED、CALENDAR_NOT_FOUND、EVENT_NOT_FOUND、ETAG_CONFLICT、INVALID_EVENT、RATE_LIMITED、TEMPORARY_UNAVAILABLE、UNSUPPORTED_OPERATION。
開発と実アカウントを用いた smoke test
pnpm install
pnpm check
pnpm packユーザーに影響のある変更は pnpm changeset を使用して記録します。main にプッシュすると、Changesets が自動的に Release PR を作成または更新します。その PR がマージされると、npm Trusted Publishing を通じて自動的に公開され、provenance が付与されます。初めて有効にする前に、npm パッケージ設定で .github/workflows/release.yml を Trusted Publisher として設定する必要があります。
CI は fake adapter/HTTP fixtures を使用するため、実際の Apple アカウントは必要ありません。オプションの実際のテストは、ローカルで明示的に ICLOUD_USERNAME と ICLOUD_APP_PASSWORD を指定した場合にのみ実行されます: pnpm smoke:icloud。現在の smoke スイートはデフォルトで書き込み操作をスキップします。最初の実際の検証では、専用のテストカレンダーを使用して、discovery/list/create/update/delete/recurrence exception の動作を手動で検証することをお勧めします。
トラブルシューティング: 401/403 の場合はアプリケーション固有のパスワードを確認してください。412 は ETag の同時実行競合を示します。list_events/get_event を再実行してください。429 の場合は待機してから再試行してください。不明なハンドルは、ジャーナルが削除されたか、データディレクトリが変更されたことを示します。完全な CalDAV URL、Authorization、またはイベント本文を issue に貼り付けないでください。
ライセンス
MIT。独立したオリジナルコードとして実装されています。公開プロジェクトはインターフェースとアーキテクチャの差異調査のためだけに使用されており、サードパーティのソースコードはコピーされていません。
Available Tools
8 toolscreate_eventBIdempotent
Create an event idempotently
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| url | No | ||
| rrule | No | ||
| start | Yes | ||
| title | Yes | ||
| alarms | No | ||
| allDay | No | ||
| location | No | ||
| timezone | Yes | ||
| attendees | No | ||
| request_id | Yes | ||
| calendar_id | Yes | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false. The description reinforces idempotency but adds no new behavioral details, such as whether the tool validates conflicts, requires specific permissions like 'calendar.write', or what happens to required fields like 'timezone' if omitted. Given the annotation coverage, the description adds minimal extra value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, which is concise. It front-loads the core action. However, it could be slightly longer to add usage context without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex with 13 parameters and many calendar-management siblings, but has no output schema. The description covers creation and idempotency but omits return value expectations (e.g., whether it returns the created event object or just a success indicator), conflict behavior, and calendar visibility scope. An output schema would reduce the need for description completeness, but here its absence creates a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does not describe any parameters, but the schema itself is detailed with constraints (e.g., rrule max 2000 chars, attendees max 100 items, alarm object structure). With 13 parameters, the description could have clarified key fields like 'request_id' for idempotency or 'calendar_id' for context, but its omission is partially offset by schema richness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Create an event idempotently' which identifies the verb and resource. However, it does not clarify what 'idempotently' entails (e.g., whether it means the tool will not create duplicate events if called with the same request_id) and does not distinguish it from sibling tools like 'update_event' or 'find_conflicts'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. For example, it does not mention that 'update_event' should be used to modify existing events, or that 'find_conflicts' should be called before creating an event. The agent is left without context for tool selection among 8 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventCDestructiveIdempotent
Delete an event using ETag concurrency control
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | whole_series | |
| request_id | Yes | ||
| event_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is clear. The description adds that the deletion uses 'ETag concurrency control,' which is a useful behavioral detail not present in annotations. However, it does not explain how concurrency handling works (e.g., behavior on conflict), what happens to linked resources, or what response to expect. With annotations providing a baseline, the description contributes some but not rich transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, which is concise but comes at the expense of completeness. It earns its place by stating the core action and a key technique, but it omits critical information about parameters and usage. While not verbose, the structure is minimal and does not earn full marks for efficiency given the missing detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters (2 required), no output schema, and no parameter descriptions, the description is insufficient. It does not explain how to construct the request_id, what the scope values mean, how the event_handle relates to the ETag, or what happens upon successful deletion (e.g., return type, idempotency guarantees). The annotations provide some context, but the description leaves significant gaps for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description bears full responsibility for explaining parameters. It does not clarify the meaning or purpose of any parameter (scope, request_id, event_handle). Even the mention of 'ETag concurrency control' does not directly explain which parameter carries the ETag. The description adds zero semantic value for parameter usage, leaving the agent to guess from parameter names and enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core action ('Delete an event') and adds specificity ('using ETag concurrency control'). The name and description together unambiguously identify the tool's function, and it is well-differentiated from sibling tools like create_event or update_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., update_event for modifications, or find_conflicts for coordination). There is no mention of prerequisites, such as needing an ETag or event handle, nor any exclusion criteria. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_conflictsCRead-onlyIdempotent
Find overlapping iCloud events
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes | ||
| timezone | Yes | ||
| calendar_id | Yes | ||
| exclude_event_handle | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety. However, the description adds no behavioral context beyond the name—it does not specify what the function returns (e.g., list of conflicting events) or behavior with no conflicts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one sentence), but at the cost of missing essential details. While there is no fluff, the brevity leaves the agent underinformed. A balanced approach would add parameter context without excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has five parameters, no output schema, and no parameter descriptions, the description is insufficient. It does not specify return format, parameter constraints, or edge cases. The missing information limits the agent's ability to use the tool correctly without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning no parameter descriptions exist in the schema. The description fails to compensate: it does not explain any of the five parameters (start, end, timezone, calendar_id, exclude_event_handle). The agent must guess meanings from parameter names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Find overlapping iCloud events' uses a specific verb and resource, clearly distinguishing the tool from siblings like list_events (which lists all events) and free_busy (which shows availability). It directly conveys the conflict-detection purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention scenarios like 'before creating an event' or contrast with free_busy. The agent must infer usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
free_busyBRead-onlyIdempotent
Compute busy intervals from visible iCloud events
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes | ||
| timezone | Yes | ||
| calendar_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description need not restate safety. The phrase 'visible iCloud events' adds context about data source and permissions, but does not explain what 'busy intervals' means in terms of return format (e.g., date ranges, granularity) or behavior when no events are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with one key piece of information ('visible iCloud events'). It is concise and front-loaded with the verb 'Compute'. However, it could be slightly more informative without adding bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity (4 required parameters, no output schema) and poor schema coverage (0%), the description is not complete. It does not explain return values (e.g., busy time slots) or parameter semantics. Annotations provide safety context but do not compensate for missing behavioral and parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning no parameter descriptions exist in the schema. The description provides no parameter details at all—it does not explain what format 'start' and 'end' expect (e.g., ISO 8601), what timezone values are valid, or how calendar_id is used. The schema only shows types and names, so the description should compensate but fails to do so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Compute') and resource ('busy intervals from visible iCloud events'). It distinguishes itself from siblings like 'list_events' and 'find_conflicts' by focusing on availability rather than event details or conflict detection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. Given sibling tools like 'list_events' (which lists events) and 'find_conflicts' (which might find overlapping events), it does not clarify that this tool returns busy intervals for availability checks or when the other tools are more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventCRead-onlyIdempotent
Get an event by persistent opaque handle
| Name | Required | Description | Default |
|---|---|---|---|
| event_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations explicitly mark the tool as readOnlyHint: true and destructiveHint: false, so the core safety is well declared. The description adds the unique 'persistent opaque handle' identifier, which is useful. However, it discloses no side effects, response format, or edge cases (e.g., behavior if handle is invalid), so it adds moderate value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short (6 words) and front-loaded with the key action. It earns its place but could benefit from a bit more guidance. However, given the simplicity of the tool, brevity is acceptable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter (0% schema coverage) and no output schema, the description fails to explain how to obtain the handle, return behavior, or error handling. Compared to sibling tools (e.g., list_events, find_conflicts), get_event omits critical context needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only mentions 'persistent opaque handle' without explaining the format, origin, or typical sources of this handle. The parameter is required but lacks any usage hints or validation rules, creating a significant gap for an agent to correctly craft the request.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool retrieves an event by a handle, which is a clear verb+resource pattern. However, it does not distinguish itself from tools like list_events or find_conflicts, leaving ambiguity about when to use this specific method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternative event retrieval tools like list_events or find_conflicts. The description does not explain prerequisites (e.g., how to obtain the handle) or contexts where this is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsARead-onlyIdempotent
List iCloud calendars
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds no additional behavioral context (e.g., return format, pagination, or authentication), but it does not contradict the annotations. It is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single phrase, no wasted words, and front-loaded. It could be slightly more structured (e.g., noting return type), but it is not overly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description is mostly complete. However, it does not describe what the output looks like (e.g., an array of calendar objects) or any caveats, which leaves some ambiguity for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema coverage is 100% trivially. Following the guideline, a baseline of 4 is appropriate since there is nothing to document beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List iCloud calendars' clearly states the verb (list) and resource (iCloud calendars), making it unambiguous. It distinguishes the tool from sibling tools like list_events and get_event, which operate on events, not calendars.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. While the purpose is clear from context, the dimension requires explicit when-to-use or when-not-to-use instructions, which are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsARead-onlyIdempotent
List events in an explicit range with pagination
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| limit | No | ||
| start | Yes | ||
| cursor | No | ||
| timezone | Yes | ||
| calendar_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering safety profile. The description adds context about required range and pagination, but does not disclose additional behaviors like timezone handling, default limit, or response format beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-formed phrase with no unnecessary words. It conveys the essential function and distinguishing features efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, useful annotations, and no output schema, the description covers the core purpose but lacks details on return values, error conditions, timezone format, and ordering. It is adequate for a straightforward listing but incomplete for handling edge cases or understanding response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description partially compensates by indicating that 'explicit range' refers to start/end parameters and 'pagination' to limit/cursor. However, it does not explain calendar_id, timezone, or detailed format of the string parameters, leaving agents to infer from parameter names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List events in an explicit range with pagination' clearly specifies the verb (list), resource (events), and key features (range, pagination). It distinguishes from sibling tools like list_calendars, get_event, and create_event, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when listing events within a specific time range with pagination, but does not explicitly state when to use this tool versus alternatives like get_event (single event) or find_conflicts. No direct when-not or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventBDestructiveIdempotent
Update an event using ETag concurrency control
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| url | No | ||
| rrule | No | ||
| scope | No | whole_series | |
| start | No | ||
| title | No | ||
| alarms | No | ||
| allDay | No | ||
| location | No | ||
| timezone | No | ||
| attendees | No | ||
| request_id | Yes | ||
| description | No | ||
| event_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveness and idempotency, but the description adds the ETag concurrency control mechanism, which is a meaningful behavioral detail not present in the annotations. It hints at optimistic concurrency and potential conflicts, enriching the agent's understanding beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the primary action ('Update an event') and includes a useful detail (ETag concurrency control). Every word contributes value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 14 parameters, no output schema, and minimal annotations, the description is insufficient for an agent to invoke the tool correctly. It lacks details on how to obtain the ETag, what the request_id is for, how scope affects updates, or what the response contains. The one-sentence description covers only the surface of the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, and the description provides no parameter-level information. With 14 parameters, including complex objects like alarms and attendees, the agent receives zero guidance on their meaning or usage. The description's mention of ETag doesn't map to any explicit parameter in the schema, leaving all parameter semantics unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Update') and the resource ('an event'), making it distinct from sibling tools like create_event or delete_event. The mention of 'ETag concurrency control' adds a specific implementation context, but it doesn't explicitly elaborate on the scope of updates (e.g., single occurrence vs. series) beyond what's implied by the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for modifying existing events, but it doesn't provide explicit guidance on when to use it versus alternatives like create_event or get_event. It also doesn't mention prerequisites (e.g., obtaining an ETag via get_event) or scenarios where update might be inappropriate. This leaves usage context implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
create_event - First observed
delete_event - First observed
find_conflicts - First observed
free_busy - First observed
get_event - First observed
list_calendars - First observed
list_events - First observed
update_event
TDQS
Scored across 8 tools
Each tool targets a distinct resource or action: calendars vs events, single vs list, CRUD vs conflict/free-busy analysis. find_conflicts and free_busy are related but serve different purposes (overlap detection vs availability intervals). No two tools are ambiguous.
Most tools follow a consistent verb_noun pattern (list_calendars, create_event, update_event). The only exception is free_busy, which is a conventional compound term rather than verb_noun, but it remains clear and doesn't disrupt the overall consistency.
Eight tools cover the core calendar event lifecycle (list, get, create, update, delete) plus calendar listing and analysis (conflicts, free_busy). This is well-scoped and avoids unnecessary bloat, fitting the server's purpose neatly.
The event lifecycle is fully covered with create, read, update, delete, and list operations, and conflict detection adds analytical value. The main gap is that calendar management only supports listing, not creating or modifying calendars, but this is acceptable for an event-focused MCP. A search operation would be a minor enhancement.
Maintenance
Related MCP Connectors
MCP server for Cronofy — read calendars, events and free/busy, and create, update or delete events.
A MCP server that works with Google Calendar to manage event listing, reading, and updates.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Streamable HTTP MCP server for Google Calendar and Sheets with OAuth login.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn HTTP Model Context Protocol (MCP) server exposing iCloud Calendar (CalDAV) tools so MCP-aware clients can list calendars, read events, and create/update/delete events using an iCloud app-specific password.3MIT
- AlicenseAqualityBmaintenanceMCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.6MIT
- FlicenseAqualityDmaintenanceRemote MCP server for managing iCloud calendar events via CalDAV, supporting CRUD operations, ICS import, and deployment on Prefect Horizon.7-
- -licenseNot gradedqualityNot gradedmaintenanceAn MCP server for iCloud Calendar, Contacts, and Mail, usable from any MCP-capable AI client.-