--- name: one-note description: | 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). compatibility: Requires network access and valid Maton API key metadata: author: maton version: "1.0" clawdbot: emoji: 🧠homepage: "https://maton.ai" requires: env: - MATON_API_KEY --- # OneNote 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. ## Quick Start ```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 ``` ## Base URL ``` 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. ## Authentication All requests require the Maton API key in the Authorization header: ``` Authorization: Bearer $MATON_API_KEY ``` **Environment Variable:** Set your API key as `MATON_API_KEY`: ```bash export MATON_API_KEY="YOUR_API_KEY" ``` ### Getting Your API Key 1. Sign in or create an account at [maton.ai](https://maton.ai) 2. Go to [maton.ai/settings](https://maton.ai/settings) 3. Copy your API key ## Connection Management Manage your OneNote OAuth connections at `https://ctrl.maton.ai`. ### List Connections ```bash python <<'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 ``` ### Create Connection ```bash python <<'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 ``` ### Get Connection ```bash python <<'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. ### Delete Connection ```bash python <<'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 ``` ### Specifying Connection If you have multiple OneNote connections, specify which one to use with the `Maton-Connection` header: ```bash 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"]}') 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. ## API Reference ### Notebooks Manage OneNote notebooks. #### List Notebooks ```bash GET /one-note/v1.0/me/onenote/notebooks ``` **Example:** ```bash 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 ``` **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" } ] } ``` #### List Notebooks with Sections Use `$expand` to include sections and section groups: ```bash python <<'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 ``` #### Get a Notebook ```bash GET /one-note/v1.0/me/onenote/notebooks/{notebook_id} ``` **Example:** ```bash python <<'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 ``` #### Create a Notebook ```bash POST /one-note/v1.0/me/onenote/notebooks Content-Type: application/json { "displayName": "New Notebook" } ``` **Example:** ```bash python <<'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 ``` #### Copy a Notebook ```bash POST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/copyNotebook ``` **Example:** ```bash python <<'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. #### Get Recent Notebooks ```bash GET /one-note/v1.0/me/onenote/notebooks/getRecentNotebooks(includePersonalNotebooks=true) ``` **Example:** ```bash python <<'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 ``` ### Sections Manage sections within notebooks. #### List All Sections ```bash GET /one-note/v1.0/me/onenote/sections ``` **Example:** ```bash python <<'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" } ] } ``` #### List Sections in a Notebook ```bash GET /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections ``` **Example:** ```bash python <<'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 ``` #### Get a Section ```bash GET /one-note/v1.0/me/onenote/sections/{section_id} ``` #### Create a Section ```bash POST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sections Content-Type: application/json { "displayName": "New Section" } ``` **Example:** ```bash python <<'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 ``` ### Section Groups Organize sections into groups. #### List All Section Groups ```bash GET /one-note/v1.0/me/onenote/sectionGroups ``` **Example:** ```bash python <<'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 ``` #### List Section Groups in a Notebook ```bash GET /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups ``` #### Get a Section Group ```bash GET /one-note/v1.0/me/onenote/sectionGroups/{section_group_id} ``` #### Create a Section Group ```bash POST /one-note/v1.0/me/onenote/notebooks/{notebook_id}/sectionGroups Content-Type: application/json { "displayName": "New Section Group" } ``` **Example:** ```bash python <<'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 ``` ### Pages Create and manage pages with rich content. #### List All Pages ```bash GET /one-note/v1.0/me/onenote/pages ``` **Example:** ```bash python <<'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" } ] } ``` #### List Pages in a Section ```bash GET /one-note/v1.0/me/onenote/sections/{section_id}/pages ``` #### Get a Page ```bash GET /one-note/v1.0/me/onenote/pages/{page_id} ``` #### Get Page Content Returns the HTML content of a page: ```bash GET /one-note/v1.0/me/onenote/pages/{page_id}/content ``` **Example:** ```bash python <<'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 ``` #### Create a Page Pages are created with HTML content: ```bash POST /one-note/v1.0/me/onenote/sections/{section_id}/pages Content-Type: text/html
Page content here
``` **Example:** ```bash python <<'EOF' import urllib.request, os, json html = """Attendees: Alice, Bob, Charlie
New paragraph added!
" } ] ``` **Actions:** - `append` - Add content at the end of target - `prepend` - Add content at the beginning of target - `replace` - Replace target content - `insert` - Insert after target **Example:** ```bash python <<'EOF' import urllib.request, os, json data = json.dumps([ { "target": "body", "action": "append", "content": "Updated at 2026-03-12
" } ]).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 ``` ## OData Query Parameters 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:** ```bash python <<'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 ``` ## Page HTML Format OneNote pages use a specific HTML format: ### Basic Structure ```htmlContent here
``` ### Supported Elements - Headings: `` - Lists: `