{
  "connector": "google-calendar",
  "label": "Google Calendar",
  "vendor_docs": "https://developers.google.com/workspace/calendar/api/v3/reference",
  "summary": "A Google Calendar API v3 simulator serving the published discovery surface and projecting calendars, meetings, rooms, attendance, and events from the shared company graph.",
  "surfaces": [
    {
      "kind": "REST",
      "path": "/calendar/v3",
      "notes": "Calendar v3 REST API"
    },
    {
      "kind": "REST",
      "path": "/discovery/v1/apis/calendar/v3/rest",
      "notes": "Calendar v3 discovery document"
    },
    {
      "kind": "REST",
      "path": "/$discovery/rest",
      "notes": "Discovery alias with version=v3"
    },
    {
      "kind": "MCP",
      "path": "/mcp",
      "notes": "Calendar tools over Streamable HTTP; also mounted at /mcp/v1"
    },
    {
      "kind": "OAuth",
      "path": "/token",
      "notes": "Google-style mock OAuth issuer"
    }
  ],
  "api_versions": [
    "Calendar API v3"
  ],
  "supported": [
    {
      "item": "All 38 vendor Calendar v3 methods are included in the mounted-route discovery document."
    },
    {
      "item": "Python SDK calls work in static and dynamic discovery modes."
    },
    {
      "item": "Event import updates an existing event when its iCalUID already exists."
    },
    {
      "item": "Attachments require supportsAttachments, and conference creation requires conferenceDataVersion=1."
    },
    {
      "item": "Calendar and event records are projected from the shared company graph."
    }
  ],
  "unsupported": [
    {
      "item": "Calendar has no media-download method; alt=media and alt=proto are rejected."
    },
    {
      "item": "Workspace Directory and People APIs are served by the Gmail connector, not this Calendar connector."
    }
  ],
  "differences": [
    {
      "scenario": "Generated calendar data",
      "difference": "Calendar, events, attendees, and rooms are deterministic projections from the shared company graph rather than real Google Workspace data.",
      "guidance": "Assert on the published Calendar resource shape and stable seed, not on a live Google tenant."
    },
    {
      "scenario": "Conference creation",
      "difference": "Conference entry points and meeting codes are deterministic simulator data; no real meeting is created.",
      "guidance": "Assert the resource shape and stable links, not callability on Google Meet."
    },
    {
      "scenario": "Invitations and reminders",
      "difference": "sendUpdates and notificationLevel are validated but no invitation mail or reminder is delivered.",
      "guidance": "Assert state changes and response shapes, not an external message."
    },
    {
      "scenario": "Push channels",
      "difference": "Channel state is in-process and is lost on restart; webhook delivery is a direct POST rather than Google's retrying pipeline.",
      "guidance": "Re-read the event list after restart or a missed notification."
    }
  ],
  "faults_supported": [
    {
      "fault": "throttle",
      "behaviour": "Injected throttling returns a Google-style 429 rateLimitExceeded response with Retry-After."
    },
    {
      "fault": "fail_next",
      "behaviour": "The next configured requests fail, then the one-shot fault clears."
    },
    {
      "fault": "latency_ms",
      "behaviour": "Adds configured latency to data-plane requests."
    }
  ]
}
