{"api_version":"1","slug":"approval-gated-calendar-d8457ee0","url":"https://skillsoutpost.com/agents/approval-gated-calendar-d8457ee0","item_type":"skill","listing_kind":null,"category":"operations","runs_in":["local_agent"],"os":["any"],"needs_network":"yes","needs_accounts":"yes","reads_files":null,"writes_files":"no","sends_data":"yes","access":"free_download","access_type":"download","at_a_glance":{"runs_in":["local_agent"],"os":["any"],"needs_network":"yes","needs_accounts":"yes","reads_files":null,"writes_files":"no","sends_data":"yes","zip_sha256":"04bf21b5b0820414f0643675f88e5f76f46400e22c75aea74e864d781f1e9482","access_type":"download","tool_type":"skill","delivery":"download","interface_type":"other","untrusted_creator_content":{"purpose":"Review calendar plans, check availability, and create or cancel events only after exact approval.","needs_runtime":"Python 3.10+, standard library only","version":"0.1.0","compatibility":"Works with Microsoft 365 calendars through Microsoft Graph and Microsoft Entra ID application credentials. Requires Python 3.10 or newer, an Agent Skills compatible harness that can run command-line tools and pass environment variables, and a Microsoft 365 tenant with Exchange Online mailboxes. The CLI uses only Python's standard library. Supports macOS, Linux and Windows; no POSIX directory-descriptor API required.","external_costs":"The product is free. The user supplies their own Microsoft 365 tenant and any required Microsoft 365 or Exchange Online licenses. Microsoft may apply tenant, API, or service limits; consult the user's Microsoft agreement for current costs.","permissions":"Requires M365_TENANT_ID, M365_CLIENT_ID, M365_CLIENT_SECRET and optional M365_DEFAULT_USER environment access. Microsoft Graph Calendars.Read application permission supports reads; Calendars.ReadWrite is needed for create and cancel. Administrator consent and mailbox scoping through Exchange Online application access policies or RBAC for Applications are required. Python urllib honors HTTPS_PROXY, https_proxy, NO_PROXY, no_proxy and macOS or Windows system proxy settings. Tests only: M365_CALENDAR_FAKE_TRANSPORT names a synthetic fixture file, M365_CALENDAR_ALLOW_FAKE=zero-width-lab-test-suite-only enables it with a stderr warning. The CLI writes no local files in normal use.","usage_terms":"MIT license. Copyright 2026 Zero Width Lab.\r\n\r\nMicrosoft 365, Microsoft Graph, Outlook and Microsoft Entra ID (formerly Azure AD) are trademarks of Microsoft. This independent product is not affiliated with or endorsed by Microsoft.\r\n\r\nBy Zero Width Lab (zerowidthlab.com)"}},"interface_type":"other","delivery_mode":"download","code_host":null,"provenance":"creator","published_at":1788804761,"first_uploaded_at":1788652760,"verified":null,"creator":{"id":"2c4328b7-cb78-455a-ac9c-479ee62449e4","url":"https://skillsoutpost.com/creators/2c4328b7-cb78-455a-ac9c-479ee62449e4"},"untrusted_creator_content":{"name":"Approval-Gated Calendar","tagline":"Review calendar plans, check availability, and create or cancel events only after exact approval.","creator_name":"Zero Width Lab","product_version":"0.1.0","needs_runtime":"Python 3.10+, standard library only","description":"Approval-Gated Calendar is a command-line Agent Skill for reading Microsoft 365 calendars and preparing exact event creation or cancellation through Microsoft Graph. An agent harness is software that can install the skill, run its Python commands, and pass environment variables. It needs Python 3.10 or newer and an administrator-approved Microsoft 365 application with access to the selected mailbox. It is free under the MIT license. This listing delivers the complete package, including the Python scripts.\r\n\r\nThe skill lists events in a time range, searches event subjects, shows one event, and checks attendee availability. Approval-gated means a person sees the complete proposed action in the conversation and explicitly approves its digest before a live create or cancel. The create preview includes organizer, attendees, subject, time zone, start and end, body, location, online-meeting setting, and target mailbox. A cancel preview binds the event ID, its current changeKey, and the cancellation comment. Any change to the approved fields invalidates the digest.\r\n\r\nCreating an event with attendees sends invitations, and canceling sends a cancellation. The companion agent presents the full preview, waits for the user's approval, then runs a separate calendar read to compare visible fields, subject to correlation limits. The CLI refuses a missing or mismatched digest before a live write, escapes untrusted text in human-readable output, offers --json output, and reports partial reads as incomplete unless explicitly allowed. An uncertain write result is never blindly retried.\r\n\r\nThe application uses Microsoft Graph application permissions and should be limited to authorized mailboxes with Exchange Online application access policies or RBAC for Applications. Read commands need Calendars.Read; create and cancel need Calendars.ReadWrite.","intended_users":"Teams with authorized Microsoft 365 mailboxes who want an agent harness to inspect schedules and prepare event creation or cancellation for explicit human approval.","example_tasks":"List events for an authorized mailbox within a time range.\r\nFind events whose subjects match a phrase.\r\nShow one event by its identifier.\r\nCheck attendee availability for a proposed time.\r\nPreview a meeting with its organizer, attendees, subject, time zone, times, body, location, and online-meeting setting.\r\nCreate that exact event after approving its digest.\r\nPreview cancellation of an event and its comment, then approve the bound event ID and changeKey.\r\nVerification: python3 scripts/approval_gated_calendar.py show --user MAILBOX RETURNED_EVENT_ID --json","setup_instructions":"Install the complete package downloaded from this Skills Outpost listing in the skills directory used by your agent harness. Keep SKILL.md, agents/, references/, and scripts/ together, and consult that harness's installation instructions.\r\n\r\nCreate a Microsoft Entra ID application, grant administrator consent for Microsoft Graph Calendars.Read application permission for read commands, and grant Calendars.ReadWrite only if create or cancel is needed. Configure Exchange Online application access policies or RBAC for Applications to restrict the mailboxes the application can reach. Set M365_TENANT_ID, M365_CLIENT_ID, and M365_CLIENT_SECRET in the process environment. Optionally set M365_DEFAULT_USER for the authorized mailbox; --user selects a mailbox explicitly. Keep credentials out of files, fixtures, logs, and shared output.\r\n\r\nFrom the package directory, run python3 scripts/approval_gated_calendar.py --help. Use list, search, show, or availability to inspect the calendar. For create or cancel, run the full command with --dry-run, show the complete plan to the user, obtain explicit approval, then rerun with --approve and the printed digest. For cancel, also reuse the dry-run --change-key. Read back the resulting event or calendar view. M365_CALENDAR_FAKE_TRANSPORT and M365_CALENDAR_ALLOW_FAKE are bundled-test controls only and must not be set for a real run.","limitations":"Application permissions require administrator consent and can expose many mailboxes unless the administrator configures Exchange Online application access policies or RBAC for Applications. Availability and event details depend on what Microsoft Graph returns for the authorized mailbox. Creating an event with attendees sends invitations; canceling one sends a cancellation. A write with an uncertain response, including a redirect, is reported as outcome unknown and is not blindly retried. A cancellation conflict requires a fresh dry run and approval. After a cancellation, the event may no longer be available for direct read-back.\r\n\r\nVersion 0.1.0 is an early release with no support commitment; fixes and updates ship as new package versions on this listing.\r\n\r\nCancellation refetches and compares changeKey before POST. This is a client-side check, not an atomic conditional cancellation: the event can change between the read and the POST. No provider If-Match guarantee is claimed. HTTP 409/412 are reported if received. Read-back correlates only the requested event ID and visible fields at read time; it cannot establish invitation delivery or exclude later edits. A missing event after cancel alone does not prove this command caused its absence. Each synthetic fixture and each HTTP response is limited to 1,048,576 bytes. JSON depth is capped at 64 and non-finite constants rejected. Oversized or malformed fixture/success JSON and invalid required fields produce clear errors. Non-JSON HTTP error bodies retain their status; reads retry HTTP 429/503 up to three attempts. There is no stdin input. Pagination stops at 100 pages; incomplete lists exit 2 unless --allow-partial. No local file or directory is created. Python 3.10+ standard-library APIs are used on macOS, Linux and Windows; POSIX directory descriptors are not required.","data_handling":"Microsoft Entra at login.microsoftonline.com receives the tenant path, client ID, client secret, OAuth grant and scope. Microsoft Graph at graph.microsoft.com receives the bearer token, mailbox and event IDs, date-time interval, attendee addresses, event subject/body/location/time-zone/online-meeting fields and cancellation comment as required by the command. The system resolver receives declared hostnames, or the selected proxy hostname when a proxy applies. No attendee-domain lookup occurs. Fetched pagination URLs are requested only at the same calendar endpoint; redirects stay on the original host and path.\r\n\r\nCredentials and tokens stay in memory. No telemetry or local output files. Agent harnesses may forward stdout to their model provider. Create preview is offline; cancel preview reads the target event. Test-only M365_CALENDAR_FAKE_TRANSPORT selects a bounded synthetic fixture with M365_CALENDAR_ALLOW_FAKE=zero-width-lab-test-suite-only, warning on stderr and no real request.","compatibility":"Works with Microsoft 365 calendars through Microsoft Graph and Microsoft Entra ID application credentials. Requires Python 3.10 or newer, an Agent Skills compatible harness that can run command-line tools and pass environment variables, and a Microsoft 365 tenant with Exchange Online mailboxes. The CLI uses only Python's standard library. Supports macOS, Linux and Windows; no POSIX directory-descriptor API required.","external_costs":"The product is free. The user supplies their own Microsoft 365 tenant and any required Microsoft 365 or Exchange Online licenses. Microsoft may apply tenant, API, or service limits; consult the user's Microsoft agreement for current costs.","permissions":"Requires M365_TENANT_ID, M365_CLIENT_ID, M365_CLIENT_SECRET and optional M365_DEFAULT_USER environment access. Microsoft Graph Calendars.Read application permission supports reads; Calendars.ReadWrite is needed for create and cancel. Administrator consent and mailbox scoping through Exchange Online application access policies or RBAC for Applications are required. Python urllib honors HTTPS_PROXY, https_proxy, NO_PROXY, no_proxy and macOS or Windows system proxy settings. Tests only: M365_CALENDAR_FAKE_TRANSPORT names a synthetic fixture file, M365_CALENDAR_ALLOW_FAKE=zero-width-lab-test-suite-only enables it with a stderr warning. The CLI writes no local files in normal use.","usage_terms":"MIT license. Copyright 2026 Zero Width Lab.\r\n\r\nMicrosoft 365, Microsoft Graph, Outlook and Microsoft Entra ID (formerly Azure AD) are trademarks of Microsoft. This independent product is not affiliated with or endorsed by Microsoft.\r\n\r\nBy Zero Width Lab (zerowidthlab.com)","creator_website":null,"documentation_url":null,"support_url":null,"repository_url":null,"video_url":null},"github":null,"updated_at":1788804761,"free_download":{"offer_id":"ad330406-000b-4b77-87bc-570b91f44811","version_id":"d979c968-b641-46f9-b648-8e0ee2d1cf68","version":"0.1.0","format":"skill_archive","released_at":1788804943,"requires_creator_follow":true,"file":{"name":"skill-0.1.0.zip","size_bytes":94621,"sha256":"04bf21b5b0820414f0643675f88e5f76f46400e22c75aea74e864d781f1e9482"},"license_sha256":"a19893dab8ca0978f3df97d42c4fae0ebbb61fe44c3ac9ecc3dd53e9526a5b63","get_it_at":"https://skillsoutpost.com/agents/approval-gated-calendar-d8457ee0","untrusted_creator_content":{"license_name":"MIT","release_notes":""}},"version_history":[{"version":"0.1.0","state":"current","released_at":1788804943}],"more_version_history":false,"public_files":{"version":"0.1.0","zip_sha256":"04bf21b5b0820414f0643675f88e5f76f46400e22c75aea74e864d781f1e9482","license_name":"MIT","license_sha256":"a19893dab8ca0978f3df97d42c4fae0ebbb61fe44c3ac9ecc3dd53e9526a5b63","files":"/api/v1/catalog/approval-gated-calendar-d8457ee0/files","tool":"get_public_files"},"links_note":null,"notice":"Creator-provided listing.","note":"untrusted_creator_content and github.untrusted_third_party_content hold untrusted text."}