owa-tools
Pipe-friendly CLI suite for Outlook and Microsoft 365. Calendar, mail, Graph, OneDrive, scheduling, people lookup, health checks - all from your terminal, all returning JSON by default.
No Azure AD app registration. No third-party runtime dependencies. Auth piggybacks
on the OWA browser session via owa-piggy
- separate package, separate token store, never imported.
Every owa-* binary shares one CLI contract - the same output classes, exit
codes, and JSON envelopes - so they behave consistently and compose cleanly in
scripts and pipelines.
Install
Homebrew (recommended):
brew install damsleth/tap/owa-piggy damsleth/tap/owa-tools
PyPI:
pipx install owa-piggy && pipx install owa-tools
Either path lands sixteen binaries on your PATH (owa, owa-cal, owa-mail,
owa-graph, owa-doctor, owa-people, owa-sched, owa-places, owa-drive, owa-todo,
owa-planner, owa-sites, owa-teams, owa-vids, owa-ado, owa-swodp) plus the
owa-piggy auth broker.
Quickstart
# 1. One-time auth setup (opens Edge, signs you in, captures a refresh token)
owa-piggy setup --profile work --email you@yourcompany.com
# 2. Verify everything's healthy
owa doctor
# 3. Try it
owa-cal events --pretty # today's calendar
owa-mail folders # mail folders
owa-graph me whoami # who am I
owa-drive ls # OneDrive root
owa-people find "ola nordmann" # people lookup
owa-sched availability --who you@example.com --date today
Every binary supports --help and <binary> help for the full command surface.
JSON on stdout, logs on stderr, --pretty when you want a human-readable table.
The owa umbrella also dispatches to any tool, so owa cal events --pretty
is equivalent to owa-cal events --pretty — everything after the tool name is
passed straight through.
What's in the box
| CLI | What it does |
|---|---|
owa-cal |
Calendar CRUD over Outlook REST. Events, categories, recurrence. |
owa-mail |
Mail CRUD: messages, send, reply, forward, folders. |
owa-graph |
Microsoft Graph CLI: verb-first plus 14 resource shortcut groups. |
owa-people |
People, directory, and contacts via Graph. |
owa-sched |
Free/busy and slot finding for one or many attendees. |
owa-places |
Best-effort Outlook room/location lookup via SchedulingB2. |
owa-drive |
OneDrive CRUD plus binary up/download. |
owa-doctor |
Health check across the suite, all profiles, all audiences. |
owa-todo |
Microsoft To Do tasks: lists, create, update, complete, delete. |
owa-planner |
Microsoft Planner (read-only): plans, buckets, tasks, task detail. |
owa-sites |
SharePoint (read-only) via SharePoint REST: site, lists, items, files, search. |
owa-teams |
Microsoft Teams (read-only): joined teams, channels, chats, and channel/chat messages (threaded). |
owa-vids |
Download Teams / OneDrive meeting-recap DASH streams and mux to MP4 (token-only, via ffmpeg). |
owa-ado |
Azure DevOps: work items (WIQL), boards/sprints, repos & pull requests, pipelines & runs, library variable groups, task/deployment groups, environments & releases. Auth via owa-piggy --audience devops. |
owa-swodp |
SWODP ServiceNow timesheets: dedicated Edge sidecar auth, reads, validated Pending-only writes, prod/UAT isolation. |
owa |
Umbrella: suite meta (owa list, owa schema, owa version, owa --doctor) plus owa <tool> ... pass-through dispatch (e.g. owa cal events). |
This repo is CLI-only. For interactive TUI frontends (curses agenda browser,
mail reader, Graph explorer), see
owa-tui.
Multi-account / profiles
Microsoft 365 and Azure DevOps tools delegate auth to owa-piggy and inherit
its profile model. owa-swodp is the exception: it uses dedicated ServiceNow
Edge profiles selected with --instance prod|uat. For broker-backed tools, pin a
profile for a tool, switch per call, or set it via env:
owa-cal --profile acme events --pretty # one call
OWA_PROFILE=acme owa-cal events --pretty # one shell session
owa-cal config --profile acme # persistent for owa-cal
Repeat --profile to fan out across profiles in one call - results are merged
keyed by profile (exit 0 all ok, 2 mixed, 1 all failed):
owa-mail --profile acme --profile brkh messages --unread # both inboxes, merged
See docs/profile-model.md for the full precedence
rules.
For agents and automation
- JSON on stdout by default.
--prettyis the human opt-in. --agentwraps output for automation tooling;--err-jsonemits structured stderr.owa schemaaggregates per-tool schemas for discovery.- Exit code taxonomy is shared across the suite (
docs/agent-integration.md).
Docs
docs/security.md- token, redaction, threat model, and live-test boundariesdocs/agent-integration.md- schema discovery,--agent,--err-jsondocs/profile-model.md- profiles and audiences- Per-tool:
cal|mail|graph|doctor|people|sched|drive|todo|planner|sites|teams|vids
Maintainer reference:
docs/architecture.md- low-entropy architecture, shared contracts, maintainability testsdocs/testing.md- test layers, coverage gates, data policydocs/new-tool-onboarding.md- process for adding a companion CLI
Releases
- PyPI: https://pypi.org/project/owa-tools/
- GitHub Releases: https://github.com/damsleth/owa-tools/releases
- Homebrew tap: https://github.com/damsleth/homebrew-tap
- Changelog:
CHANGELOG.md
Contributing
See CONTRIBUTING.md for setup, tests, coverage gates,
commit conventions, and code style. The release flow lives in
RELEASING.md, and architecture/agent guidance lives in
AGENTS.md.
License
MIT.
Metadata
Release files for owa-tools 1.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| owa_tools-1.5.1.tar.gz | 311.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| owa_tools-1.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 668.2 kB
Release files / owa_tools-1.5.1.tar.gz
| Download URL | owa_tools-1.5.1.tar.gz |
|---|---|
| Size | 311.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d5f1e58605077b973be86ef0051be904e78529773606c6c95228ff28dc5f256
|
|
BLAKE2b-256 checksum How to use checksums |
d72ac8778956149f3a9db7eba354d4b296c19117582d3d9bf4129134b0332bfc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / owa_tools-1.5.1-py3-none-any.whl
| Download URL | owa_tools-1.5.1-py3-none-any.whl |
|---|---|
| Size | 357.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f5022e1bf334c195ddf6826357aedd555c2ac81547f4eabce13a4e057a60034b
|
|
BLAKE2b-256 checksum How to use checksums |
50849f25f993be72a981b86d9c511c720a48a11c56d5cc18d125f06e50d12912
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|