operations / skill
Approval-Gated Calendar
Review calendar plans, check availability, and create or cancel events only after exact approval.
At a glance
- Purpose
- Review calendar plans, check availability, and create or cancel events only after exact approval.
- Runs in
- Local agent with shell
- Operating systems
- Any
- Needs
- Runtime: Python 3.10+, standard library only; Needs internet: Yes; Needs accounts or API keys beyond your agent: Yes
- Files and data
- Reads files: Not stated; Writes files: No; Sends data to other services: Yes
- Tool type
- Skill
- Delivery
- Download from Skills Outpost
- Version
- 0.1.0
- ZIP SHA-256
- 04bf21b5b0820414f0643675f88e5f76f46400e22c75aea74e864d781f1e9482
- Access
- Download from Skills Outpost
- 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. Microsoft 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. By Zero Width Lab (zerowidthlab.com)
Download from Skills Outpost
Get this version
FreeStatic source, format, secret-pattern and declaration checks with independent human source review.
- SHA-256 of the released ZIP
04bf21b5b0820414f0643675f88e5f76f46400e22c75aea74e864d781f1e9482
The creator shows this version's package files publicly: anyone can read SKILL.md and the other files under Files, without an account. The ZIP download needs the version in your Library (how it works).
Sign in to add this version to your library and follow its creator for free.
Sign in to get freeA creator follow is free, not a paid membership. Your email is not shared with the creator.
Files
Version 0.1.0, shown publicly by its creator, exactly as in this version's ZIP. ZIP SHA-256: 04bf21b5b0820414f0643675f88e5f76f46400e22c75aea74e864d781f1e9482. License: MIT (read it).
Each file has its own address. Read one as a web page at https://, or as JSON at https://; replace SKILL.md with any path below.
- manifest.json · 2.4 KiB
- LICENSE.txt · 1.0 KiB
- README.md · 7.2 KiB
- SETUP.md · 7.1 KiB
- SKILL.md · 8.6 KiB
- agents/approval-gated-calendar-agent.md · 6.4 KiB
- references/graph-calendar.md · 6.9 KiB
- scripts/approval_gated_calendar.py · 21.6 KiB
- source-package.json · 4.1 KiB
- tests/fixtures/graph-responses.json · 1.1 KiB
- tests/test_approval_gated_calendar.py · 22.2 KiB
- tests/test_hygiene.py · 2.2 KiB
MIT
MIT LicenseCopyright (c) 2026 Zero Width Lab
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Version history
- Version 0.1.0 Current
No release notes for this version.
What it does
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.The 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.
Creating 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.
The 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.
Who it is for
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.Find events whose subjects match a phrase.
Show one event by its identifier.
Check attendee availability for a proposed time.
Preview a meeting with its organizer, attendees, subject, time zone, times, body, location, and online-meeting setting.
Create that exact event after approving its digest.
Preview cancellation of an event and its comment, then approve the bound event ID and changeKey.
Verification: python3 scripts/approval_gated_calendar.py show --user MAILBOX RETURNED_EVENT_ID --json
Getting started
SKILL.md and the scripts can be read without an account: SKILL.md at https://
Create 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.
From 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.Version 0.1.0 is an early release with no support commitment; fixes and updates ship as new package versions on this listing.
Cancellation 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 practices
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.Credentials 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.
