{
  "schemaVersion": "1.0",
  "item": {
    "slug": "temporal-cortex-scheduling",
    "name": "temporal-cortex-scheduling",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/billylui/temporal-cortex-scheduling",
    "canonicalUrl": "https://clawhub.ai/billylui/temporal-cortex-scheduling",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/temporal-cortex-scheduling",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=temporal-cortex-scheduling",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/BOOKING-SAFETY.md",
      "references/CALENDAR-TOOLS.md",
      "references/MULTI-CALENDAR.md",
      "references/OPEN-SCHEDULING.md",
      "references/RRULE-GUIDE.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/temporal-cortex-scheduling"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/temporal-cortex-scheduling",
    "agentPageUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling/agent",
    "manifestUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Calendar Scheduling & Booking",
        "body": "14 tools (Layers 0, 2–4) for contact resolution, calendar discovery, event querying, free slot finding, availability checking, RRULE expansion, atomic booking, Open Scheduling, and proposal composition. 12 read-only tools + 2 write tools (book_slot, request_booking)."
      },
      {
        "title": "Source & Provenance",
        "body": "Homepage: temporal-cortex.com\nSource code: github.com/temporal-cortex/mcp (open-source Rust)\nnpm package: @temporal-cortex/cortex-mcp\nSkills repo: github.com/temporal-cortex/skills"
      },
      {
        "title": "Runtime",
        "body": "These tools run inside the Temporal Cortex MCP server (@temporal-cortex/cortex-mcp), a compiled Rust binary distributed as an npm package.\n\nInstall and startup lifecycle:\n\nnpx resolves @temporal-cortex/cortex-mcp from the npm registry (one-time, cached locally after first download)\nThe postinstall script downloads the platform-specific binary from the GitHub Release and verifies its SHA256 checksum against the embedded checksums.json — installation halts on mismatch\nThe MCP server starts as a local process communicating over stdio (no listening ports)\nCalendar tools make authenticated API calls to your configured providers (Google Calendar API, Microsoft Graph API, CalDAV endpoints)\n\nCredential storage: OAuth tokens are stored locally at ~/.config/temporal-cortex/credentials.json and read exclusively by the local MCP server process. No credential data is transmitted to Temporal Cortex servers. The binary's filesystem access is limited to ~/.config/temporal-cortex/ — verifiable by inspecting the open-source Rust code or running under Docker where the mount is the only writable path.\n\nFile access: The binary reads and writes only ~/.config/temporal-cortex/ (credentials and config). No other filesystem writes.\n\nNetwork scope: Calendar tools connect only to your configured providers (googleapis.com, graph.microsoft.com, or your CalDAV server). In Local Mode (default), no calls to Temporal Cortex servers and no telemetry is collected. In Platform Mode, three tools (resolve_identity, query_public_availability, request_booking) call api.temporal-cortex.com for cross-user scheduling — no credential data is included in these calls.\n\nPre-run verification (recommended before first use):\n\nInspect the npm package without executing: npm pack @temporal-cortex/cortex-mcp --dry-run\nVerify checksums independently against the GitHub Release (see verification pipeline below)\nFor full containment, run in Docker instead of npx (see Docker containment below)\n\nVerification pipeline: Checksums are published independently at each GitHub Release as SHA256SUMS.txt — verify the binary before first use:\n\n# 1. Fetch checksums from GitHub (independent of the npm package)\ncurl -sL https://github.com/temporal-cortex/mcp/releases/download/mcp-v0.9.1/SHA256SUMS.txt\n\n# 2. Compare against the npm-installed binary\nshasum -a 256 \"$(npm root -g)/@temporal-cortex/cortex-mcp/bin/cortex-mcp\"\n\nAs defense-in-depth, the npm package also embeds checksums.json and the postinstall script compares SHA256 hashes during install — installation halts on mismatch (the binary is deleted, not executed). This automated check supplements, but does not replace, independent verification above.\n\nBuild provenance: Binaries are cross-compiled from auditable Rust source in GitHub Actions across 5 platforms (darwin-arm64, darwin-x64, linux-x64, linux-arm64, win32-x64). Source: github.com/temporal-cortex/mcp (MIT-licensed). The CI workflow, build artifacts, and release checksums are all publicly inspectable.\n\nDocker containment (no Node.js on host, credential isolation via volume mount):\n\n{\n  \"mcpServers\": {\n    \"temporal-cortex\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"--rm\", \"-i\", \"-v\", \"~/.config/temporal-cortex:/root/.config/temporal-cortex\", \"cortex-mcp\"]\n    }\n  }\n}\n\nBuild: docker build -t cortex-mcp https://github.com/temporal-cortex/mcp.git"
      },
      {
        "title": "Layer 0 — Discovery",
        "body": "ToolWhen to Useresolve_identityDNS for Human Time: resolve an email, phone, or agent ID to a Temporal Cortex slug. Call before query_public_availability. Platform Mode only.search_contactsSearch the user's address book by name (Google People API, Microsoft Graph). Returns matching contacts with emails, phones, organization, and job title. Opt-in — requires contacts permission.resolve_contactGiven a confirmed contact's email, determine the best scheduling path: Open Scheduling (instant booking), email, or phone. Chains with resolve_identity when Platform API is available."
      },
      {
        "title": "Layer 2 — Calendar Operations",
        "body": "ToolWhen to Uselist_calendarsFirst call when calendars are unknown. Returns all connected calendars with provider-prefixed IDs, names, labels, primary status, and access roles.list_eventsList events in a time range. TOON format by default (~40% fewer tokens than JSON). Use provider-prefixed IDs for multi-calendar: \"google/primary\", \"outlook/work\".find_free_slotsFind available gaps in a calendar. Set min_duration_minutes for minimum slot length.expand_rruleExpand recurrence rules (RFC 5545) into concrete instances. Handles DST, BYSETPOS, EXDATE, leap years. Use dtstart as local datetime (no timezone suffix).check_availabilityCheck if a specific time slot is free. Checks both events and active booking locks."
      },
      {
        "title": "Layer 3 — Availability",
        "body": "ToolWhen to Useget_availabilityMerged free/busy view across multiple calendars. Pass calendar_ids array. Privacy: \"opaque\" (default, hides sources) or \"full\".query_public_availabilityCheck another user's public availability by Temporal Link slug. Pass the slug and date to find their open time slots. Platform Mode only."
      },
      {
        "title": "Layer 4 — Booking",
        "body": "ToolWhen to Usebook_slotBook a time slot atomically. Lock → verify → write → release. Always check_availability first.request_bookingBook on another user's public calendar by Temporal Link slug. Requires Platform Mode.compose_proposalCompose a scheduling proposal message for email, Slack, or SMS. Formats proposed times in the recipient's timezone with an optional Temporal Link self-serve booking URL. Does NOT send — returns formatted text for the agent to send via its channel MCP."
      },
      {
        "title": "Critical Rules",
        "body": "Discover calendars first — call list_calendars when you don't know which calendars are connected. Use the returned provider-prefixed IDs for all subsequent calls.\nUse provider-prefixed IDs for multi-calendar setups: \"google/primary\", \"outlook/work\", \"caldav/personal\". Bare IDs (e.g., \"primary\") route to the default provider.\nTOON is the default format — output uses TOON (~40% fewer tokens than JSON). Pass format: \"json\" only if you need structured parsing.\nCheck before booking — always call check_availability before book_slot. Never skip the conflict check.\nContent safety — event summaries and descriptions pass through a sanitization firewall before reaching the calendar API.\nTimezone awareness — all tools accept RFC 3339 with timezone offsets. Never use bare dates.\nConfirm before booking — when running autonomously, always present booking details (time, calendar, summary) to the user and wait for confirmation before calling book_slot or request_booking.\nConfirm contact selection — when search_contacts returns multiple matches, present candidates to the user and confirm which contact is correct. Never auto-select.\nConfirm before sending proposals — when using compose_proposal, present the composed message to the user before sending. Never auto-send outreach.\nContact search is optional — if contacts permission is not configured, ask the user for the email directly. The workflow works without contact search."
      },
      {
        "title": "Full Booking Workflow",
        "body": "0. Resolve Contact  →  search_contacts(\"Jane\") → resolve_contact(jane@example.com)\n                       (skip if user provides email directly)\n1. Discover         →  list_calendars\n2. Orient           →  get_temporal_context                      (temporal-cortex-datetime)\n3. Resolve Time     →  resolve_datetime(\"next Tuesday at 2pm\")  (temporal-cortex-datetime)\n4. Route            →  If open_scheduling slug: fast path (query_public_availability → request_booking)\n                       If email only: backward-compat path (find_free_slots → compose_proposal)\n5. Check            →  check_availability(calendar_id, start, end)\n6. Act              →  Fast: book_slot / request_booking\n                       Backward-compat: compose_proposal → agent sends via channel MCP\n\nIf the slot is busy at step 5, use find_free_slots to suggest alternatives."
      },
      {
        "title": "Open Scheduling Workflow (Platform Mode)",
        "body": "1. Identify    →  resolve_identity(\"jane@example.com\")  →  slug: \"jane-doe\"\n2. Orient      →  get_temporal_context                   (temporal-cortex-datetime)\n3. Discover    →  query_public_availability(slug, date)  →  available slots\n4. Present     →  Show top 3 options to user\n5. Book        →  request_booking(slug, start, end, title, attendee_email)"
      },
      {
        "title": "Two-Phase Commit Protocol",
        "body": "Agent calls book_slot(calendar_id, start, end, summary)\n    │\n    ├─ 1. LOCK    →  Acquire exclusive lock on the time slot\n    │                 (in-memory local; Redis Redlock in Platform Mode)\n    │\n    ├─ 2. VERIFY  →  Check for overlapping events and active locks\n    │\n    ├─ 3. WRITE   →  Create event in calendar provider (Google/Outlook/CalDAV)\n    │                 Record event in shadow calendar\n    │\n    └─ 4. RELEASE →  Release the exclusive lock\n\nIf any step fails, the lock is released and the booking is aborted. No partial writes."
      },
      {
        "title": "Schedule with a Contact (End-to-End)",
        "body": "1. search_contacts(query: \"Jane\") → present candidates to user\n2. User confirms: \"Jane Doe (jane@example.com)\"\n3. resolve_contact(email: \"jane@example.com\") → scheduling_paths\n4. If open_scheduling: query_public_availability(slug, date) → request_booking\n5. If email only:\n   a. find_free_slots(calendar_id, start, end) → available times\n   b. compose_proposal(contact_name, email, slots, timezone, format: \"email\")\n   c. Present composed message to user → user confirms → send via channel MCP"
      },
      {
        "title": "List Events This Week",
        "body": "1. list_calendars → discover connected calendars\n2. get_temporal_context → current time (use temporal-cortex-datetime)\n3. resolve_datetime(\"start of this week\") → week start\n4. resolve_datetime(\"end of this week\") → week end\n5. list_events(calendar_id: \"google/primary\", start, end)"
      },
      {
        "title": "Find Free Time Across Calendars",
        "body": "1. list_calendars → discover all connected calendars\n2. get_availability(\n     start, end,\n     calendar_ids: [\"google/primary\", \"outlook/work\"],\n     privacy: \"full\"\n   ) → merged free/busy blocks with source_count"
      },
      {
        "title": "Check and Book a Slot",
        "body": "1. check_availability(calendar_id: \"google/primary\", start, end) → true/false\n2. If free: book_slot(calendar_id: \"google/primary\", start, end, summary: \"Team standup\")\n3. If busy: find_free_slots(calendar_id, start, end, min_duration_minutes: 30)"
      },
      {
        "title": "Expand Recurring Events",
        "body": "expand_rrule(\n  rrule: \"FREQ=MONTHLY;BYDAY=FR;BYSETPOS=-1\",\n  dtstart: \"2026-01-01T10:00:00\",     ← local datetime, no timezone suffix\n  timezone: \"America/New_York\",\n  count: 12\n) → last Friday of every month for 2026"
      },
      {
        "title": "Provider-Prefixed Calendar IDs",
        "body": "All calendar IDs use provider-prefixed format:\n\nFormatExampleRoutes togoogle/<id>\"google/primary\"Google Calendaroutlook/<id>\"outlook/work\"Microsoft Outlookcaldav/<id>\"caldav/personal\"CalDAV (iCloud, Fastmail)<id> (bare)\"primary\"Default provider"
      },
      {
        "title": "Privacy Modes",
        "body": "Modesource_countUse case\"opaque\" (default)Always 0Sharing availability externally\"full\"Actual countInternal use — shows which calendars are busy"
      },
      {
        "title": "Tool Annotations (book_slot)",
        "body": "PropertyValueMeaningreadOnlyHintfalseCreates calendar eventsdestructiveHintfalseNever deletes or overwrites existing eventsidempotentHintfalseCalling twice creates two eventsopenWorldHinttrueMakes external API calls"
      },
      {
        "title": "Tool Annotations (request_booking)",
        "body": "PropertyValueMeaningreadOnlyHintfalseCreates calendar events on another user's calendardestructiveHintfalseNever deletes or overwrites existing eventsidempotentHintfalseCalling twice creates two bookingsopenWorldHinttrueCalls the Platform API"
      },
      {
        "title": "Tool Annotations (compose_proposal)",
        "body": "PropertyValueMeaningreadOnlyHinttruePure formatting — no state modificationdestructiveHintfalseNever deletes dataidempotentHinttrueSame input always gives same outputopenWorldHintfalseNo external calls — pure computation"
      },
      {
        "title": "Tool Annotations (search_contacts)",
        "body": "PropertyValueMeaningreadOnlyHinttrueReads contacts only — no modificationsdestructiveHintfalseNever deletes contactsidempotentHinttrueSame query always gives same resultsopenWorldHinttrueCalls external contact API (Google People / Microsoft Graph)"
      },
      {
        "title": "Error Handling",
        "body": "ErrorAction\"No credentials found\"Run: npx @temporal-cortex/cortex-mcp auth google (or outlook / caldav).\"Timezone not configured\"Prompt for IANA timezone. Or run the auth command which configures timezone.Slot is busy / conflict detectedUse find_free_slots to suggest alternatives. Present options to user.Lock acquisition failedAnother agent is booking the same slot. Wait briefly and retry, or suggest alternative times.Content rejected by sanitizationRephrase the event summary/description. The firewall blocks prompt injection attempts."
      },
      {
        "title": "Open Scheduling & Temporal Links",
        "body": "When a user has Open Scheduling enabled, their Temporal Link (book.temporal-cortex.com/{slug}) allows anyone to:\n\nQuery availability — GET /public/{slug}/availability?date=YYYY-MM-DD\nBook a meeting — POST /public/{slug}/book with {start, end, title, attendee_email}\nDiscover via Agent Card — GET /public/{slug}/.well-known/agent-card.json"
      },
      {
        "title": "Workflow: Book via Temporal Link",
        "body": "User shares their Temporal Link\nAgent calls availability endpoint to find free slots\nAgent calls booking endpoint with selected slot\nMeeting is created on the user's default calendar\n\nSee Temporal Links Reference for detailed API documentation."
      },
      {
        "title": "Additional References",
        "body": "Calendar Tools Reference — Complete input/output schemas for all 14 tools\nMulti-Calendar Guide — Provider routing, labels, privacy modes, cross-provider operations\nRRULE Guide — Recurrence rule patterns, DST edge cases, 5 LLM failure modes\nBooking Safety — 2PC details, concurrent booking, lock TTL, content sanitization\nTemporal Links — Open Scheduling endpoints, Agent Card integration, calendar routing\nOpen Scheduling Guide — Identity resolution, public availability, external booking via MCP tools"
      }
    ],
    "body": "Calendar Scheduling & Booking\n\n14 tools (Layers 0, 2–4) for contact resolution, calendar discovery, event querying, free slot finding, availability checking, RRULE expansion, atomic booking, Open Scheduling, and proposal composition. 12 read-only tools + 2 write tools (book_slot, request_booking).\n\nSource & Provenance\nHomepage: temporal-cortex.com\nSource code: github.com/temporal-cortex/mcp (open-source Rust)\nnpm package: @temporal-cortex/cortex-mcp\nSkills repo: github.com/temporal-cortex/skills\nRuntime\n\nThese tools run inside the Temporal Cortex MCP server (@temporal-cortex/cortex-mcp), a compiled Rust binary distributed as an npm package.\n\nInstall and startup lifecycle:\n\nnpx resolves @temporal-cortex/cortex-mcp from the npm registry (one-time, cached locally after first download)\nThe postinstall script downloads the platform-specific binary from the GitHub Release and verifies its SHA256 checksum against the embedded checksums.json — installation halts on mismatch\nThe MCP server starts as a local process communicating over stdio (no listening ports)\nCalendar tools make authenticated API calls to your configured providers (Google Calendar API, Microsoft Graph API, CalDAV endpoints)\n\nCredential storage: OAuth tokens are stored locally at ~/.config/temporal-cortex/credentials.json and read exclusively by the local MCP server process. No credential data is transmitted to Temporal Cortex servers. The binary's filesystem access is limited to ~/.config/temporal-cortex/ — verifiable by inspecting the open-source Rust code or running under Docker where the mount is the only writable path.\n\nFile access: The binary reads and writes only ~/.config/temporal-cortex/ (credentials and config). No other filesystem writes.\n\nNetwork scope: Calendar tools connect only to your configured providers (googleapis.com, graph.microsoft.com, or your CalDAV server). In Local Mode (default), no calls to Temporal Cortex servers and no telemetry is collected. In Platform Mode, three tools (resolve_identity, query_public_availability, request_booking) call api.temporal-cortex.com for cross-user scheduling — no credential data is included in these calls.\n\nPre-run verification (recommended before first use):\n\nInspect the npm package without executing: npm pack @temporal-cortex/cortex-mcp --dry-run\nVerify checksums independently against the GitHub Release (see verification pipeline below)\nFor full containment, run in Docker instead of npx (see Docker containment below)\n\nVerification pipeline: Checksums are published independently at each GitHub Release as SHA256SUMS.txt — verify the binary before first use:\n\n# 1. Fetch checksums from GitHub (independent of the npm package)\ncurl -sL https://github.com/temporal-cortex/mcp/releases/download/mcp-v0.9.1/SHA256SUMS.txt\n\n# 2. Compare against the npm-installed binary\nshasum -a 256 \"$(npm root -g)/@temporal-cortex/cortex-mcp/bin/cortex-mcp\"\n\n\nAs defense-in-depth, the npm package also embeds checksums.json and the postinstall script compares SHA256 hashes during install — installation halts on mismatch (the binary is deleted, not executed). This automated check supplements, but does not replace, independent verification above.\n\nBuild provenance: Binaries are cross-compiled from auditable Rust source in GitHub Actions across 5 platforms (darwin-arm64, darwin-x64, linux-x64, linux-arm64, win32-x64). Source: github.com/temporal-cortex/mcp (MIT-licensed). The CI workflow, build artifacts, and release checksums are all publicly inspectable.\n\nDocker containment (no Node.js on host, credential isolation via volume mount):\n\n{\n  \"mcpServers\": {\n    \"temporal-cortex\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"--rm\", \"-i\", \"-v\", \"~/.config/temporal-cortex:/root/.config/temporal-cortex\", \"cortex-mcp\"]\n    }\n  }\n}\n\n\nBuild: docker build -t cortex-mcp https://github.com/temporal-cortex/mcp.git\n\nTools\nLayer 0 — Discovery\nTool\tWhen to Use\nresolve_identity\tDNS for Human Time: resolve an email, phone, or agent ID to a Temporal Cortex slug. Call before query_public_availability. Platform Mode only.\nsearch_contacts\tSearch the user's address book by name (Google People API, Microsoft Graph). Returns matching contacts with emails, phones, organization, and job title. Opt-in — requires contacts permission.\nresolve_contact\tGiven a confirmed contact's email, determine the best scheduling path: Open Scheduling (instant booking), email, or phone. Chains with resolve_identity when Platform API is available.\nLayer 2 — Calendar Operations\nTool\tWhen to Use\nlist_calendars\tFirst call when calendars are unknown. Returns all connected calendars with provider-prefixed IDs, names, labels, primary status, and access roles.\nlist_events\tList events in a time range. TOON format by default (~40% fewer tokens than JSON). Use provider-prefixed IDs for multi-calendar: \"google/primary\", \"outlook/work\".\nfind_free_slots\tFind available gaps in a calendar. Set min_duration_minutes for minimum slot length.\nexpand_rrule\tExpand recurrence rules (RFC 5545) into concrete instances. Handles DST, BYSETPOS, EXDATE, leap years. Use dtstart as local datetime (no timezone suffix).\ncheck_availability\tCheck if a specific time slot is free. Checks both events and active booking locks.\nLayer 3 — Availability\nTool\tWhen to Use\nget_availability\tMerged free/busy view across multiple calendars. Pass calendar_ids array. Privacy: \"opaque\" (default, hides sources) or \"full\".\nquery_public_availability\tCheck another user's public availability by Temporal Link slug. Pass the slug and date to find their open time slots. Platform Mode only.\nLayer 4 — Booking\nTool\tWhen to Use\nbook_slot\tBook a time slot atomically. Lock → verify → write → release. Always check_availability first.\nrequest_booking\tBook on another user's public calendar by Temporal Link slug. Requires Platform Mode.\ncompose_proposal\tCompose a scheduling proposal message for email, Slack, or SMS. Formats proposed times in the recipient's timezone with an optional Temporal Link self-serve booking URL. Does NOT send — returns formatted text for the agent to send via its channel MCP.\nCritical Rules\nDiscover calendars first — call list_calendars when you don't know which calendars are connected. Use the returned provider-prefixed IDs for all subsequent calls.\nUse provider-prefixed IDs for multi-calendar setups: \"google/primary\", \"outlook/work\", \"caldav/personal\". Bare IDs (e.g., \"primary\") route to the default provider.\nTOON is the default format — output uses TOON (~40% fewer tokens than JSON). Pass format: \"json\" only if you need structured parsing.\nCheck before booking — always call check_availability before book_slot. Never skip the conflict check.\nContent safety — event summaries and descriptions pass through a sanitization firewall before reaching the calendar API.\nTimezone awareness — all tools accept RFC 3339 with timezone offsets. Never use bare dates.\nConfirm before booking — when running autonomously, always present booking details (time, calendar, summary) to the user and wait for confirmation before calling book_slot or request_booking.\nConfirm contact selection — when search_contacts returns multiple matches, present candidates to the user and confirm which contact is correct. Never auto-select.\nConfirm before sending proposals — when using compose_proposal, present the composed message to the user before sending. Never auto-send outreach.\nContact search is optional — if contacts permission is not configured, ask the user for the email directly. The workflow works without contact search.\nFull Booking Workflow\n0. Resolve Contact  →  search_contacts(\"Jane\") → resolve_contact(jane@example.com)\n                       (skip if user provides email directly)\n1. Discover         →  list_calendars\n2. Orient           →  get_temporal_context                      (temporal-cortex-datetime)\n3. Resolve Time     →  resolve_datetime(\"next Tuesday at 2pm\")  (temporal-cortex-datetime)\n4. Route            →  If open_scheduling slug: fast path (query_public_availability → request_booking)\n                       If email only: backward-compat path (find_free_slots → compose_proposal)\n5. Check            →  check_availability(calendar_id, start, end)\n6. Act              →  Fast: book_slot / request_booking\n                       Backward-compat: compose_proposal → agent sends via channel MCP\n\n\nIf the slot is busy at step 5, use find_free_slots to suggest alternatives.\n\nOpen Scheduling Workflow (Platform Mode)\n1. Identify    →  resolve_identity(\"jane@example.com\")  →  slug: \"jane-doe\"\n2. Orient      →  get_temporal_context                   (temporal-cortex-datetime)\n3. Discover    →  query_public_availability(slug, date)  →  available slots\n4. Present     →  Show top 3 options to user\n5. Book        →  request_booking(slug, start, end, title, attendee_email)\n\nTwo-Phase Commit Protocol\nAgent calls book_slot(calendar_id, start, end, summary)\n    │\n    ├─ 1. LOCK    →  Acquire exclusive lock on the time slot\n    │                 (in-memory local; Redis Redlock in Platform Mode)\n    │\n    ├─ 2. VERIFY  →  Check for overlapping events and active locks\n    │\n    ├─ 3. WRITE   →  Create event in calendar provider (Google/Outlook/CalDAV)\n    │                 Record event in shadow calendar\n    │\n    └─ 4. RELEASE →  Release the exclusive lock\n\n\nIf any step fails, the lock is released and the booking is aborted. No partial writes.\n\nCommon Patterns\nSchedule with a Contact (End-to-End)\n1. search_contacts(query: \"Jane\") → present candidates to user\n2. User confirms: \"Jane Doe (jane@example.com)\"\n3. resolve_contact(email: \"jane@example.com\") → scheduling_paths\n4. If open_scheduling: query_public_availability(slug, date) → request_booking\n5. If email only:\n   a. find_free_slots(calendar_id, start, end) → available times\n   b. compose_proposal(contact_name, email, slots, timezone, format: \"email\")\n   c. Present composed message to user → user confirms → send via channel MCP\n\nList Events This Week\n1. list_calendars → discover connected calendars\n2. get_temporal_context → current time (use temporal-cortex-datetime)\n3. resolve_datetime(\"start of this week\") → week start\n4. resolve_datetime(\"end of this week\") → week end\n5. list_events(calendar_id: \"google/primary\", start, end)\n\nFind Free Time Across Calendars\n1. list_calendars → discover all connected calendars\n2. get_availability(\n     start, end,\n     calendar_ids: [\"google/primary\", \"outlook/work\"],\n     privacy: \"full\"\n   ) → merged free/busy blocks with source_count\n\nCheck and Book a Slot\n1. check_availability(calendar_id: \"google/primary\", start, end) → true/false\n2. If free: book_slot(calendar_id: \"google/primary\", start, end, summary: \"Team standup\")\n3. If busy: find_free_slots(calendar_id, start, end, min_duration_minutes: 30)\n\nExpand Recurring Events\nexpand_rrule(\n  rrule: \"FREQ=MONTHLY;BYDAY=FR;BYSETPOS=-1\",\n  dtstart: \"2026-01-01T10:00:00\",     ← local datetime, no timezone suffix\n  timezone: \"America/New_York\",\n  count: 12\n) → last Friday of every month for 2026\n\nProvider-Prefixed Calendar IDs\n\nAll calendar IDs use provider-prefixed format:\n\nFormat\tExample\tRoutes to\ngoogle/<id>\t\"google/primary\"\tGoogle Calendar\noutlook/<id>\t\"outlook/work\"\tMicrosoft Outlook\ncaldav/<id>\t\"caldav/personal\"\tCalDAV (iCloud, Fastmail)\n<id> (bare)\t\"primary\"\tDefault provider\nPrivacy Modes\nMode\tsource_count\tUse case\n\"opaque\" (default)\tAlways 0\tSharing availability externally\n\"full\"\tActual count\tInternal use — shows which calendars are busy\nTool Annotations (book_slot)\nProperty\tValue\tMeaning\nreadOnlyHint\tfalse\tCreates calendar events\ndestructiveHint\tfalse\tNever deletes or overwrites existing events\nidempotentHint\tfalse\tCalling twice creates two events\nopenWorldHint\ttrue\tMakes external API calls\nTool Annotations (request_booking)\nProperty\tValue\tMeaning\nreadOnlyHint\tfalse\tCreates calendar events on another user's calendar\ndestructiveHint\tfalse\tNever deletes or overwrites existing events\nidempotentHint\tfalse\tCalling twice creates two bookings\nopenWorldHint\ttrue\tCalls the Platform API\nTool Annotations (compose_proposal)\nProperty\tValue\tMeaning\nreadOnlyHint\ttrue\tPure formatting — no state modification\ndestructiveHint\tfalse\tNever deletes data\nidempotentHint\ttrue\tSame input always gives same output\nopenWorldHint\tfalse\tNo external calls — pure computation\nTool Annotations (search_contacts)\nProperty\tValue\tMeaning\nreadOnlyHint\ttrue\tReads contacts only — no modifications\ndestructiveHint\tfalse\tNever deletes contacts\nidempotentHint\ttrue\tSame query always gives same results\nopenWorldHint\ttrue\tCalls external contact API (Google People / Microsoft Graph)\nError Handling\nError\tAction\n\"No credentials found\"\tRun: npx @temporal-cortex/cortex-mcp auth google (or outlook / caldav).\n\"Timezone not configured\"\tPrompt for IANA timezone. Or run the auth command which configures timezone.\nSlot is busy / conflict detected\tUse find_free_slots to suggest alternatives. Present options to user.\nLock acquisition failed\tAnother agent is booking the same slot. Wait briefly and retry, or suggest alternative times.\nContent rejected by sanitization\tRephrase the event summary/description. The firewall blocks prompt injection attempts.\nOpen Scheduling & Temporal Links\n\nWhen a user has Open Scheduling enabled, their Temporal Link (book.temporal-cortex.com/{slug}) allows anyone to:\n\nQuery availability — GET /public/{slug}/availability?date=YYYY-MM-DD\nBook a meeting — POST /public/{slug}/book with {start, end, title, attendee_email}\nDiscover via Agent Card — GET /public/{slug}/.well-known/agent-card.json\nWorkflow: Book via Temporal Link\nUser shares their Temporal Link\nAgent calls availability endpoint to find free slots\nAgent calls booking endpoint with selected slot\nMeeting is created on the user's default calendar\n\nSee Temporal Links Reference for detailed API documentation.\n\nAdditional References\nCalendar Tools Reference — Complete input/output schemas for all 14 tools\nMulti-Calendar Guide — Provider routing, labels, privacy modes, cross-provider operations\nRRULE Guide — Recurrence rule patterns, DST edge cases, 5 LLM failure modes\nBooking Safety — 2PC details, concurrent booking, lock TTL, content sanitization\nTemporal Links — Open Scheduling endpoints, Agent Card integration, calendar routing\nOpen Scheduling Guide — Identity resolution, public availability, external booking via MCP tools"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/billylui/temporal-cortex-scheduling",
    "publisherUrl": "https://clawhub.ai/billylui/temporal-cortex-scheduling",
    "owner": "billylui",
    "version": "0.9.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling",
    "downloadUrl": "https://openagent3.xyz/downloads/temporal-cortex-scheduling",
    "agentUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling/agent",
    "manifestUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/temporal-cortex-scheduling/agent.md"
  }
}