OutNote
Headless Microsoft 365 over Graph - mail, calendar, Teams, OneDrive, SharePoint, OneNote, To Do, Planner and Assignments, without an app registration.
What is OutNote?
Every "read my mailbox over Graph" tutorial makes you register an Azure app and get admin consent - which a locked-down tenant (a school, a company) simply refuses. OutNote sidesteps that entirely.
It signs in (via entrance) with the pre-consented OfficeHome first-party client, gets a FOCI family refresh token, and a broker trades it for whichever first-party client's token a given call needs - all without another sign-in, and each already consented in the tenant. One headless login (password + TOTP, no browser), then clean reads and writes across the whole account.
Features
- 🔓 No app registration, no admin consent - rides pre-consented Microsoft first-party clients
- 🤖 Fully headless - password + TOTP MFA over pure HTTP (or a browser fallback via
entrance) - 💾 Log in once - the family refresh token is persisted (0600) and reused, so later runs skip the sign-in
- 📬 Broad coverage - mail, calendar, Teams chats & channels, OneDrive, SharePoint, OneNote, To Do, Planner, Assignments
- ✉️ Writes too - send mail, Teams messages (with @mentions), events, uploads, OneNote pages, tasks
- 🧾 Text out - Teams/OneNote HTML to text,
.docx/.pptx/.xlsx/.pdfextraction - ⚡ Robust - 429/5xx backoff,
$batch, delta queries, nextLink paging - 🖥️ CLI -
outnote --text chats --unread
Install
pip install outnote # or: uv add outnote
Python 3.10+; ms-entrance is pulled in automatically. pip install "outnote[pdf]" adds PDF text extraction.
Quickstart
from outnote import authenticate
note = authenticate("you@school.ch", "password", totp_secret="JBSWY3DPEHPK3PXP")
note.emails(top=5, unread=True)
note.chats()
note.send_to("friend@school.ch", "on my way")
note.download(item_id)
note.search_emails("invoice")
Docs
- Usage - sign-in, reading, writing, the CLI
- Method reference - every method, its endpoint, and the caveats
- FOCI clients - the client/scope map and how to re-probe your tenant
Disclaimer
OutNote is published for educational and research purposes only - to document how Microsoft 365's first-party OAuth2 clients and the Graph API behave for a browserless client.
Use it only against accounts you own, or with the explicit authorization of the account or tenant owner. You alone are responsible for your use of it and for complying with Microsoft's terms, your identity provider's terms, your institution's acceptable-use policy, and applicable law. The software is provided "as is", without warranty of any kind, and the author accepts no liability for misuse. Not affiliated with or endorsed by Microsoft.
License
Metadata
Release files for outnote 1.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| outnote-1.2.0.tar.gz | 27.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| outnote-1.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 58.6 kB
Release files / outnote-1.2.0.tar.gz
| Download URL | outnote-1.2.0.tar.gz |
|---|---|
| Size | 27.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
950bdb4bdd7314de84b4c9087f94f9d59e99ad11a4e0b5aa1628a3dead0a64c3
|
|
BLAKE2b-256 checksum How to use checksums |
b07d54a20c478119023427985245cc74806652f5464b37db19369dfde7ec00dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / outnote-1.2.0-py3-none-any.whl
| Download URL | outnote-1.2.0-py3-none-any.whl |
|---|---|
| Size | 31.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
292657c90781078629438e2d73ea0962b886fcff83e8aff2775c7353dfdf2eef
|
|
BLAKE2b-256 checksum How to use checksums |
a9aa1b7febe16660edcc405104211ec26c679ab674b39b30bc0b18f62db3203d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for outnote 1.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.