Install any skill in seconds. Free to start, no credit card required.
Get Started Free →OneNote API integration with managed OAuth via Microsoft Graph. Access notebooks, sections, section groups, and pages. Use this skill when users want to create or manage OneNote notebooks, organize notes, or work with page content. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-22 | ✗→✓ | ▲ Improved | 411% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 270% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 937% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 531% | 0% |
Access the OneNote API via Microsoft Graph with managed OAuth authentication. Create and manage notebooks, sections, section groups, and pages for note-taking and organization.
bash# List notebooks python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/one-note/v1.0/me/onenote/{resource}The gateway proxies requests to Microsoft Graph (graph.microsoft.com) and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEYEnvironment Variable: Set your API key as MATON_API_KEY:
bashexport MATON_API_KEY="YOUR_API_KEY"
Manage your OneNote OAuth connections at https://ctrl.maton.ai.
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=one-note&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashpython <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'one-note'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
json{ "connection": { "connection_id": "1447c2f4-3e5f-4ece-93df-67bc7e7a2857", "status": "ACTIVE", "creation_time": "2026-03-12T10:24:32.321168Z", "last_updated_time": "2026-03-12T10:24:49.890969Z", "url": "https://connect.maton.ai/?session_token=...", "app": "one-note", "metadata": {}, "method": "OAUTH2" } }
Open the returned url in a browser to complete OAuth authorization with Microsoft.
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple OneNote connections, specify which one to use with the Maton-Connection header:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '1447c2f4-3e5f-4ece-93df-67bc7e7a2857') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
Manage OneNote notebooks.
bashGET /one-note/v1.0/me/onenote/notebooks
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
json{ "value": [ { "id": "1-30487038-8c2e-440a-860d-e82c6dc74f10", "displayName": "My Notebook", "createdDateTime": "2026-03-12T10:25:00Z", "lastModifiedDateTime": "2026-03-12T10:30:00Z", "isDefault": true, "isShared": false, "sectionsUrl": "https://graph.microsoft.com/v1.0/me/onenote/notebooks/.../sections", "sectionGroupsUrl": "https://graph.microsoft.com/v1.0/me/onenote/notebooks/.../sectionGroups" } ] }
Use $expand to include sections and section groups:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks?$expand=sections,sectionGroups') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashGET /one-note/v1.0/me/onenote/notebooks/{notebook_id}
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashPOST /one-note/v1.0/me/onenote/notebooks Content-Type: application/json { "displayName": "New Notebook" }
Example:
bashpython <<'EOF' import urllib.request, os, json data = json.dumps({'displayName': 'My New Notebook'}).encode() req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashPOST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/copyNotebook
Example:
bashpython <<'EOF' import urllib.request, os, json data = json.dumps({'renameAs': 'Copied Notebook'}).encode() req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/copyNotebook', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
> Note: Copy operations are asynchronous. The response includes a status URL to check progress.
bashGET /one-note/v1.0/me/onenote/notebooks/getRecentNotebooks(includePersonalNotebooks=true)
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks/getRecentNotebooks(includePersonalNotebooks=true)') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Manage sections within notebooks.
bashGET /one-note/v1.0/me/onenote/sections
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/sections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
json{ "value": [ { "id": "1-c9d63289-4f64-4579-9043-155543978c78", "displayName": "My Section", "createdDateTime": "2026-03-12T10:26:00Z", "lastModifiedDateTime": "2026-03-12T10:28:00Z", "isDefault": false, "pagesUrl": "https://graph.microsoft.com/v1.0/me/onenote/sections/.../pages" } ] }
bashGET /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashGET /one-note/v1.0/me/onenote/sections/{section_id}
bashPOST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections Content-Type: application/json { "displayName": "New Section" }
Example:
bashpython <<'EOF' import urllib.request, os, json data = json.dumps({'displayName': 'Meeting Notes'}).encode() req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Organize sections into groups.
bashGET /one-note/v1.0/me/onenote/sectionGroups
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/sectionGroups') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
bashGET /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups
bashGET /one-note/v1.0/me/onenote/sectionGroups/{section_group_id}
bashPOST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups Content-Type: application/json { "displayName": "New Section Group" }
Example:
bashpython <<'EOF' import urllib.request, os, json data = json.dumps({'displayName': 'Project Notes'}).encode() req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Create and manage pages with rich content.
bashGET /one-note/v1.0/me/onenote/pages
Example:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/pages') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
json{ "value": [ { "id": "1-42a904024c734393b561d0a85428965d!251-c9d63289-4f64-4579-9043-155543978c78", "title": "My Page", "createdDateTime": "2026-03-12T10:29:42Z", "lastModifiedDateTime": "2026-03-12T10:30:00Z", "contentUrl": "https://graph.microsoft.com/v1.0/me/onenote/pages/.../content" } ] }
bashGET /one-note/v1.0/me/onenote/sections/{section_id}/pages
bashGET /one-note/v1.0/me/onenote/pages/{page_id}
Returns the HTML content of a page:
bashGET /one-note/v1.0/me/onenote/pages/{page_id}/content
Example:
bashpython <<'EOF' import urllib.request, os req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/pages/{page_id}/content') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') resp = urllib.request.urlopen(req) print(resp.read().decode()) EOF
Pages are created with HTML content:
bashPOST /one-note/v1.0/me/onenote/sections/{section_id}/pages Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Page Title</title> </head> <body> <p>Page content here</p> </body> </html>
Example:
bashpython <<'EOF' import urllib.request, os, json html = """<!DOCTYPE html> <html> <head> <title>Meeting Notes - March 12</title> </head> <body> <h1>Meeting Notes</h1> <p>Attendees: Alice, Bob, Charlie</p> <ul> <li>Discussed Q1 goals</li> <li>Reviewed project timeline</li> </ul> </body> </html>""".encode() req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/sections/{section_id}/pages', data=html, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'text/html') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Use PATCH to append, insert, or replace content:
bashPATCH /one-note/v1.0/me/onenote/pages/{page_id}/content Content-Type: application/json [ { "target": "body", "action": "append", "content": "<p>New paragraph added!</p>" } ]
Actions:
append - Add content at the end of targetprepend - Add content at the beginning of targetreplace - Replace target contentinsert - Insert after targetExample:
bashpython <<'EOF' import urllib.request, os, json data = json.dumps([ { "target": "body", "action": "append", "content": "<p>Updated at 2026-03-12</p>" } ]).encode() req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/pages/{page_id}/content', data=data, method='PATCH') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') resp = urllib.request.urlopen(req) print(f"Updated: {resp.status}") EOF
The OneNote API supports OData query parameters:
| Parameter | Description | Example | |-----------|-------------|---------| | $select | Select specific properties | $select=id,displayName | | $expand | Include related resources | $expand=sections,sectionGroups | | $filter | Filter results | $filter=isDefault eq true | | $orderby | Sort results | $orderby=displayName | | $top | Limit results | $top=10 | | $skip | Skip results | $skip=20 |
Example with $select:
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks?$select=id,displayName') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
OneNote pages use a specific HTML format:
html<!DOCTYPE html> <html> <head> <title>Page Title</title> <meta name="created" content="2026-03-12T10:00:00Z" /> </head> <body> <p>Content here</p> </body> </html>
<h1> through <h6><p><ul>, <ol>, <li><table>, <tr>, <td><img src="..." /><a href="..."><b>, <i>, <u>, <strike>html<img src="https://example.com/image.jpg" alt="Description" />
Or embed base64 images:
html<img src="data:image/png;base64,..." alt="Embedded image" />
javascriptconst response = await fetch( 'https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const data = await response.json(); console.log(data.value);
pythonimport os import requests response = requests.get( 'https://gateway.maton.ai/one-note/v1.0/me/onenote/notebooks', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'} ) notebooks = response.json() print(notebooks['value'])
pythonimport os import requests html_content = """<!DOCTYPE html> <html> <head><title>New Page</title></head> <body><p>Hello from Python!</p></body> </html>""" response = requests.post( f'https://gateway.maton.ai/one-note/v1.0/me/onenote/sections/{section_id}/pages', headers={ 'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}', 'Content-Type': 'text/html' }, data=html_content ) page = response.json() print(f"Created page: {page['title']}")
$expand=sections,sectionGroups to get notebook contents in one calljq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning | |--------|---------| | 400 | Bad request or missing OneNote connection | | 401 | Invalid or missing Maton API key | | 403 | Forbidden - insufficient permissions | | 404 | Resource not found | | 409 | Conflict - duplicate name | | 429 | Rate limited | | 4xx/5xx | Passthrough error from Microsoft Graph |
MATON_API_KEY environment variable is set:bashecho $MATON_API_KEY
bashpython <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
one-note. For example:https://gateway.maton.ai/one-note/v1.0/me/onenote/notebookshttps://gateway.maton.ai/v1.0/me/onenote/notebooksOther measured skills in the registry, with their headline benchmark lift.