Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/sonichi/sutando/ms365-connectnpx skills add sonichi/sutando --skill ms365-connectgit clone --depth 1 https://github.com/sonichi/sutandoWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/sonichi/sutando/ms365-connect)<a href="https://agentmods.dev/skills/sonichi/sutando/ms365-connect"><img src="https://agentmods.dev/badge/skills/sonichi/sutando/ms365-connect.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00072 | $0.01407 |
| Opus 5 | $0.00036 | $0.00704 |
| Sonnet 5 | $0.00014 | $0.00281 |
| Haiku 4.5 | $0.00007 | $0.00141 |
Grade A, and why
ms365-connect scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 131 lines — stays where its author put it; the contents beside it link to each section on GitHub.
ms365-connect
Microsoft 365 connectivity for Sutando, built on the Apache-2.0
python-o365 library (O365 on PyPI),
which is a thin wrapper over Microsoft Graph.
What it does
All operations go through Microsoft Graph via python-o365:
- OneDrive — list a folder's contents (
onedrive-list) and download a file to a local path (onedrive-get). - Outlook mail — list recent inbox messages (
outlook-list) and send an email (outlook-send). - Calendar — list upcoming events over a window of days (
calendar-list). - Teams — post a message to a channel in a team (
teams-post).
Authentication is a one-time delegated OAuth2 consent flow (auth); the refresh
token is cached on disk so subsequent commands run non-interactively.
Usage
Run the CLI with python3 scripts/ms365.py <subcommand>:
# One-time: run the OAuth consent flow and cache the token
python3 scripts/ms365.py auth
# OneDrive
python3 scripts/ms365.py onedrive-list # list root
python3 scripts/ms365.py onedrive-list "/Projects/Q3" # list a folder by path
python3 scripts/ms365.py onedrive-get "/Reports/x.pdf" ./x.pdf
# Outlook mail
python3 scripts/ms365.py outlook-list --n 10
python3 scripts/ms365.py outlook-send --to [email protected] --subject "Hi" --body "Hello"
# Calendar
python3 scripts/ms365.py calendar-list --days 7
# Teams
python3 scripts/ms365.py teams-post --team "Engineering" --channel "General" \
--message "Deploy is green"
Every subcommand except auth requires that auth has already been run and a
cached token exists.
Configuration
Secrets are read from the environment (populate them from the Sutando vault; never hardcode):
| Variable | Purpose |
|---|---|
MS365_CLIENT_ID |
Azure AD application (client) ID |
MS365_CLIENT_SECRET |
Azure AD client secret value |
MS365_TENANT_ID |
Directory (tenant) ID, or common / organizations |
MS365_AUTH_FLOW |
credentials (default; confidential client, id+secret) or public (native client, id only — required when the app's redirect is registered under "Mobile and desktop applications"; symptom of the mismatch: AADSTS700025 on token exchange). In public flow MS365_CLIENT_SECRET is not required. |
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 7d ago First seen · 131 lines · 72 tokens per session scan A 0ac8a527908f
ms365-connect is a skill published in the GitHub repository sonichi/sutando (392 stars, last pushed today), licensed MIT. It adds 72 tokens to every session and 1,407 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
discord-app-setup
Connect a Discord bot to the assistant via the Discord Gateway with guided application creation and intent configuration.
vellum-oauth-integrations
Act on behalf of your user in any third-party software that supports OAuth 2.0.
api-mapping
Record and analyze API surfaces of web services.
mailgun-setup
Set up and send emails via a user-provided Mailgun account (BYO email provider).
resend-setup
Set up and send emails via a user-provided Resend account (BYO email provider).
gemini-api-dev
Use this skill when writing code that calls the Gemini API for text generation, multi-turn chat, multimodal understanding, image generation, video generation, streaming responses, background research tasks, function calling, structured output, or migrating from the old generateContent API. Covers SDK usage and best…