DSH Plugins Marketplace

DSH Plugins

Plugins

/

Tools & Capabilities

/

dsh-plugin-onenote

d

dsh-plugin-onenote

Manifest valid

Reads only the Microsoft OneNote notebooks you allow, with device-code sign-in, a per-notebook allow-list in Settings, and four read-only tools for status, page listing, search and page content.

UI (client)hasBundlePatch

dsh-plugin-onenote

Read the Microsoft OneNote notebooks you choose from inside DeepSeek Harness.

Sign in once, tick the notebooks this agent may read, and everything else stays invisible. The allow-list is enforced inside the plugin before any Microsoft Graph request, so a page that tries to talk the model into reading another notebook has nothing to call.

中文文档:README.zh.md

What it looks like

The settings card (Settings → Plugins → OneNote) is the only place to sign in or change which notebooks are readable:

┌ OneNote ──────────────────────────────────────────────┐
│ Connected                                             │
│ Signed in as you@example.com        [ Sign out ]      │
├───────────────────────────────────────────────────────┤
│ Readable notebooks            [ Refresh list ]        │
│ Only the notebooks you tick can be listed, searched,  │
│ or read.                                              │
│   [x] Work                              default       │
│   [ ] Team wiki                         shared        │
│   [ ] Journal                                         │
│                          1 of 3 allowed  [Allow none] │
│                                                [Save] │
└───────────────────────────────────────────────────────┘

Tools

The agent gets four read-only tools. None of them can sign in, sign out, or change the allow-list — those are user actions in the settings card.

ToolWhat it does
onenote_statusReports the account and which notebooks are readable.
onenote_list_pagesBrowses allowed notebooks → sections → pages.
onenote_searchMatches page titles first, then the opening text of recent pages.
onenote_read_pageReads one page as Markdown (headings, lists, tables, links, code).

Install

# From the plugin manager (recommended)
dsh plugin install hestudio-community/dsh-plugin-onenote

# Or from npm
dsh plugin install dsh-plugin-onenote

Then open Settings → Plugins → OneNote and sign in.

Azure app registration

The bundle ships a public client ID so it works out of the box. To use your own app registration instead (recommended for anything beyond personal use), create one in about two minutes — no paid subscription is needed:

  1. Open App registrations → New registration.
  2. Name: anything, e.g. DSH-OneNote.
  3. Supported account types: Accounts in any organizational directory and personal Microsoft accounts. Choose a single-tenant option instead if every user is in one tenant.
  4. Redirect URI: leave empty — the device-code flow needs none. (Optional: if you configure a platform, choose Mobile and desktop applications and tick https://login.microsoftonline.com/common/oauth2/nativeclient).
  5. Register, then copy Application (client) ID.
  6. Authentication → Advanced settings → Allow public client flows = Yes, then Save. Without this, sign-in fails with unauthorized_client.
  7. API permissions → Add a permission → Microsoft Graph → Delegated permissions:
    • Notes.Read — read the user's notebooks
    • offline_access — keep the session alive between turns
    • User.Read — name the signed-in account
  8. No client secret and no admin consent are needed for a personal account. A work account may need an admin to grant consent once.

Troubleshooting: "missing 'redirect_uri' input parameter"

If Microsoft fails with invalid_request: The provided request must include a 'redirect_uri' input parameter:

  • Cause: At microsoft.com/devicelogin, selecting a Passkey / security key / Windows Hello shortcut directly without typing your username causes Microsoft's login service to misroute the device code flow into an interactive web flow.
  • Fix: In the browser, manually type your full Microsoft account email address first, then click Next before completing authentication. Alternatively, open the verification link in an InPrivate / Incognito window.

Then point the plugin at your app by adding a patch layer of your own:

# ~/.dsh/cordis.patch.yml (applies to every profile) or the profile's cordis.patch.yml
- id: onenote
  name: 'dsh-plugin-onenote'
  config:
    clientId: 00000000-0000-0000-0000-000000000000
    tenant: common

config replaces the row's config wholesale, so restate every field you need.

Configuration

FieldDefaultMeaning
clientIdthe bundled public appAzure application (client) ID.
tenantcommonTenant id or domain. common accepts work and personal accounts.
maxPagesPerList100Default page cap for onenote_list_pages.
maxPageChars60000Default Markdown cap for onenote_read_page.

Where state lives

$DSH_HOME/onenote/ (usually ~/.dsh/onenote/), mode 0600:

FileContents
tokens.jsonAccess and refresh token.
signin.jsonThe pending device-code attempt, so a reload continues the same code.
settings.jsonThe notebook allow-list.

Delete the directory to reset everything. Nothing is written into your workspace.

How the privacy boundary works

  1. The allow-list is a list of notebook ids in settings.json.
  2. Every read resolves the owning notebook first — from the page, the section, or the notebook itself — and asserts the allow-list before fetching content. Guessing a section id does not bypass it.
  3. The agent tools cannot write the allow-list. Only the settings card can, and only through POST /api/onenote/notebooks.
  4. The system prompt tells the model the readable notebook names and that everything else is unreadable by design.

Notes on the Graph API

  • OneNote does not support app-only authentication, so a signed-in user is required; Notes.Read is delegated.
  • GET /me/onenote/pages?$search= was retired in 2024 (announcement), so search lists page metadata per allowed notebook and matches titles locally, then reads the opening text of the most recently modified pages. That keeps the cost bounded and never leaves the allowed set.
  • Page content arrives as OneNote's HTML dialect; src/parser.js converts it to Markdown without a third-party dependency and never downloads media.

Development

npm test          # 99 tests, no network, no host required
npm run pack:check

The suite stubs @deepseek-ai/dsh-tools (a host-provided peer) through a Node module hook, so a bare checkout runs without installing the harness.

License

MIT — see LICENSE.

Comments

Loading…

From the same category

reactive-resume

DeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.

Tools & CapabilitiesManifest valid

★ 41.7k

↓ 215/wk

MIT

Aug 24, 2026

dsh plugin --profile web add dsh-plugin-reactive-resume

by dsh-market

The plugin market inside DeepSeek Harness — browse, search, one-click install · DSH 可视化插件市场

Tools & CapabilitiesManifest valid

★ 10.1k

↓ 361.7k/wk

MIT

TypeScript

Nov 1, 2026

dsh plugin --profile web add dshmarket

by Tencent

Let AI agents use your real, logged-in browser without interrupting your work. CLI + extension for browser automation across any shell-capable AI agent.

Tools & CapabilitiesManifest valid

★ 9.9k

↓ 12.3k/wk

MIT

TypeScript

Nov 1, 2026

dsh plugin --profile terminal add @wxg-prc-cpg/browser-skill-dsh-plugin

by yjh051108

dsh-routing-suite — injector + router-standard kit: install the runtime injector first, then the task-aware reasoning-mode router preset (measured P1-P23).

Tools & CapabilitiesManifest valid

★ 7k

MIT

JavaScript

Sep 18, 2026

dsh plugin --profile web add @dsh-external/dsh-super-injector

by superdesigndev

OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn

Tools & CapabilitiesManifest valid

★ 7k

NOASSERTION

Python

Nov 1, 2026

dsh plugin --profile web add treg-dsh

by Q00

Agent OS: the agent gets smarter on its own. We just hold the line: Interview-gated, staged evaluation, budgeted evolution loop. MCP server, 14 runtimes: Claude Code, Codex CLI, Gemini CLI, OpenCode,

Tools & CapabilitiesManifest valid

★ 6.3k

MIT

Python

Nov 1, 2026

Index only — not installable