All integrations

Microsoft OneNote

DOCS & KNOWLEDGE · TASKS

Notebooks, sections and pages read and written as the person the agent acts for.

Connect Microsoft OneNote with Fabriq Developer

Your user consents at Microsoft OneNote. The credential lands in a vault your agent cannot read, and the tool list it gets back is the intersection of that user’s grant and the agent’s own scopes.

provider “onenote”
from af_sdk import AgenticFabriq

af = AgenticFabriq()                      # reads AF_APP_ID / AF_APP_SECRET

url = await af.initiate_connection(request, provider="onenote")   # consent at Microsoft OneNote
return redirect(url)

async with await af.for_user(request) as session:
    tools = await session.get_tools()     # only what this user granted

Provider names are surfaces, not vendors, and the authoritative list is the capabilities endpoint rather than any page including this one — an unknown name returns 400 with the valid list. Fabriq Developer is free to start and needs no provider paperwork. Start free or read the quickstart.

Connecting Microsoft OneNote in practice

The OneNote API in Microsoft Graph does not support app-only authentication, so an unattended agent cannot hold a tenant token of its own — it has to act as a signed-in user, and the two scopes that reach other people’s notebooks both require admin consent. Throttling is 120 requests a minute and 400 an hour per app per user, with five concurrent requests and no Retry-After header on 429.

Scopes that draw scrutiny

  • Notes.ReadWrite.All Read and write all OneNote notebooks. Requires admin consent as a delegated permission, not only as an application one.
  • Notes.Read.All Read all OneNote notebooks. Also requires admin consent in the delegated flow, which surprises teams who picked read-only to avoid a review.
  • Notes.ReadWrite Read and write the signed-in user’s notebooks. No admin consent, and the widest grant a user can approve alone.
  • Notes.ReadWrite.CreatedByApp Limited access to OneNote notebooks, covering only what the app itself created — the narrow option, and too narrow to find an existing page.

Rate limits

  • Per app per user (delegated context): 120 requests per 1 minute and 400 per 1 hour.
  • Concurrent requests: five per app per user.
  • Published app-only figures of 240 per minute and 800 per hour exist in the throttling table, but the OneNote API does not support app-only authentication.
  • Microsoft Graph additionally caps any app at 130,000 requests per 10 seconds across all tenants.

Who has to approve

Notes.Read.All and Notes.ReadWrite.All require admin consent in both the delegated and application contexts, so a tenant administrator has to grant them before any user can connect with them. Notes.Read, Notes.Create and Notes.ReadWrite do not.

Worth knowing

  • OneNote resources do not return a Retry-After header on 429, so backoff has to be guessed rather than obeyed.
  • The 400-per-hour ceiling is the binding one: it works out to under 7 requests a minute sustained, well below the 120-a-minute burst figure.
  • Notebooks live at four different roots — /me, /users/{id}, /groups/{id} and /sites/{id}/onenote — so a group or SharePoint team notebook is a different URL shape, not a parameter.
  • The beta endpoint carries features the docs explicitly advise against using in production, and the v1.0 surface is the only stable one.

Checked against Use the OneNote REST API (2026-09-29), Microsoft Graph permissions reference (2026-09-29), Microsoft Graph throttling limits (2026-09-29)

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

onenote_copy_notebookWRITE

Copy a whole notebook (asynchronous: answers 202 with an operation_id -- poll it with the get-operation tool). The body may name renameAs, and groupId/siteCollectionId/siteId to copy into a group or site via POST /v1.0/me/onenote/notebooks/{notebook_id}/microsoft.graph.copyNotebook

Notes.ReadWrite
onenote_copy_page_to_sectionWRITE

Copy a page into a section (asynchronous: answers 202 with an operation_id). The body's id is the destination section via POST /v1.0/me/onenote/pages/{page_id}/microsoft.graph.copyToSection

Notes.ReadWrite
onenote_copy_section_to_notebookWRITE

Copy a section into a notebook (asynchronous: answers 202 with an operation_id). The body's id is the destination notebook; renameAs optionally renames the copy via POST /v1.0/me/onenote/sections/{section_id}/microsoft.graph.copyToNotebook

Notes.ReadWrite
onenote_copy_section_to_section_groupWRITE

Copy a section into a section group (asynchronous: answers 202 with an operation_id). The body's id is the destination section group; renameAs optionally renames the copy via POST /v1.0/me/onenote/sections/{section_id}/microsoft.graph.copyToSectionGroup

Notes.ReadWrite
onenote_create_notebookWRITE

Create a new OneNote notebook; the body's displayName is the notebook title (must be unique, max 128 characters) via POST /v1.0/me/onenote/notebooks

Notes.ReadWrite
onenote_create_pageWRITE

Create a page in the default section from an XHTML document (content is the full document; the <title> element becomes the page title). Use create-page-in-section to target a section. Text and standard HTML only -- binary parts need multipart, which this surface does not carry via POST /v1.0/me/onenote/pages

Notes.ReadWrite
onenote_create_page_in_sectionWRITE

Create a page in a specific section from an XHTML document (content is the full document; the <title> element becomes the page title). Text and standard HTML only -- binary parts need multipart, which this surface does not carry via POST /v1.0/me/onenote/sections/{section_id}/pages

Notes.ReadWrite
onenote_create_sectionWRITE

Create a section in a notebook; the body's displayName is the section name (must not contain ?*\/:<>|&#''%%~) via POST /v1.0/me/onenote/notebooks/{notebook_id}/sections

Notes.ReadWrite
onenote_create_section_groupWRITE

Create a section group in a notebook; the body's displayName is the group name via POST /v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups

Notes.ReadWrite
onenote_create_section_in_section_groupWRITE

Create a section inside a section group; the body's displayName is the section name via POST /v1.0/me/onenote/sectionGroups/{section_group_id}/sections

Notes.ReadWrite
onenote_delete_pageWRITE

Permanently delete a page by id via DELETE /v1.0/me/onenote/pages/{page_id}

Notes.ReadWrite
onenote_get_notebookREAD

Read one notebook's metadata by id via GET /v1.0/me/onenote/notebooks/{notebook_id}

Notes.Read
onenote_get_notebook_from_web_urlWRITE

Resolve a notebook from its OneNote web link (the body's webUrl); answers the notebook's metadata so its id can be used with the other tools via POST /v1.0/me/onenote/notebooks/microsoft.graph.getNotebookFromWebUrl

Notes.ReadWrite
onenote_get_operationREAD

Poll an asynchronous OneNote operation (a notebook, section or page copy) by the operation_id its 202 answer carried; status moves NotStarted -> Running -> Completed/Failed, and resourceId names the created copy via GET /v1.0/me/onenote/operations/{operation_id}

Notes.Read
onenote_get_pageREAD

Read one page's metadata by id -- title, timestamps, links and contentUrl ($expand can pull parentSection or parentNotebook) via GET /v1.0/me/onenote/pages/{page_id}

Notes.Read
onenote_get_page_contentREAD

Read a page's content as HTML (returned under the `raw` key). Pass includeIDs=true to get the data-id anchors the patch-content commands address via GET /v1.0/me/onenote/pages/{page_id}/content

Notes.Read
onenote_get_page_previewREAD

Read a page's text preview (previewText and an optional preview image link) without fetching the full content via GET /v1.0/me/onenote/pages/{page_id}/microsoft.graph.preview()

Notes.Read
onenote_get_recent_notebooksREAD

List the notebooks the signed-in user has most recently touched; includePersonalNotebooks says whether to include notebooks from the user's personal OneDrive alongside organizational ones. Signed-in user only: Microsoft documents this function on the user's own tree, so it takes no group_id/site_id via GET /v1.0/me/onenote/notebooks/microsoft.graph.getRecentNotebooks(includePersonalNotebooks={includePersonalNotebooks})

Notes.Read
onenote_get_sectionREAD

Read one section's metadata by id ($expand can pull its parentNotebook or parentSectionGroup in the same call) via GET /v1.0/me/onenote/sections/{section_id}

Notes.Read
onenote_get_section_groupREAD

Read one section group's metadata by id ($expand can pull its parentNotebook, sections or child sectionGroups in the same call) via GET /v1.0/me/onenote/sectionGroups/{section_group_id}

Notes.Read
onenote_list_child_section_groupsREAD

List the section groups nested inside one section group via GET /v1.0/me/onenote/sectionGroups/{section_group_id}/sectionGroups

Notes.Read
onenote_list_notebook_section_groupsREAD

List the section groups directly inside one notebook via GET /v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups

Notes.Read
onenote_list_notebook_sectionsREAD

List the sections directly inside one notebook via GET /v1.0/me/onenote/notebooks/{notebook_id}/sections

Notes.Read
onenote_list_notebooksREAD

List the OneNote notebooks in the signed-in user's account (or in a Microsoft 365 group or SharePoint site via group_id/site_id), with OData paging and filtering via GET /v1.0/me/onenote/notebooks

Notes.Read
onenote_list_pagesREAD

List pages across the whole account ($search matches page content; $filter and $orderby work on title and dates) via GET /v1.0/me/onenote/pages

Notes.Read
onenote_list_section_group_sectionsREAD

List the sections inside one section group via GET /v1.0/me/onenote/sectionGroups/{section_group_id}/sections

Notes.Read
onenote_list_section_groupsREAD

List every section group in the account, across notebooks via GET /v1.0/me/onenote/sectionGroups

Notes.Read
onenote_list_section_pagesREAD

List the pages inside one section via GET /v1.0/me/onenote/sections/{section_id}/pages

Notes.Read
onenote_list_sectionsREAD

List every section in the account, across notebooks via GET /v1.0/me/onenote/sections

Notes.Read
onenote_update_page_contentWRITE

Edit a page's content with patch commands: the body's commands array holds {target, action, position, content} entries (actions Append/Insert/Prepend/Replace/Delete; targets are body, title, or a data-id/id from the content read) via POST /v1.0/me/onenote/pages/{page_id}/microsoft.graph.onenotePatchContent

Notes.ReadWrite

Put Microsoft OneNote behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.