hyqhyq3/dsh-mcp-manager
dsh-mcp-manager
MCP server manager plugin for DeepSeek Harness: Settings → MCP page, OAuth (PKCE + dynamic client registration) or static-token auth, tools registered as mcp__<name>__*
Install
npx @deepseek-ai/dsh plugin --profile web add github:hyqhyq3/dsh-mcp-managerRestart `dsh web` after install. Bundle APIs can change during the developer preview.
README badge
[](https://dshhub.dev/plugins/dsh-mcp-manager)Paste this into your README. The star count updates with every catalog sync.
From the README
Excerpt from hyqhyq3/dsh-mcp-manager, cleaned of badges and images.
dsh-mcp-manager
简体中文 | English
Local 0.13.3 unreleased candidate: see the release notes for cumulative changes, provenance and verification limits. It supersedes 0.13.2.
MCP server manager for DeepSeek Harness (DSH) — a Settings → MCP page where you add MCP servers once (remote HTTP or local stdio process), authenticate HTTP servers with OAuth in the browser, and expose their tools either directly or through a compact on-demand broker.
The built-in @deepseek-ai/dsh-mcp-client only accepts a static headers config — it has no OAuth support and no local stdio transport. This plugin fills that gap:
- OAuth (authorization code + PKCE) with spec-compliant discovery, RFC 7591 dynamic client registration,
refresh_tokenrotation, and auto-reconnect across restarts — one browser login, then it keeps working.- Client application type follows MCP SEP-837: HTTP loopback callbacks (
localhost, IPv4 loopback, or[::1]) register asnative; other callbacks register asweb. This avoids OIDC providers defaulting a local GUI toweband rejecting its redirect. Registration failures show the provider's OAuth error code when available; the Logs panel retains the detailed reason. Providers may still restrict which clients or redirects they accept. - Callback origin accepts direct loopback
Hostvalues (including[::1]:port). ConfigurepublicOriginsfor a reverse proxy: one configured origin is the default callback even without forwarded headers; with multiple origins, a completeX-Forwarded-Proto/X-Forwarded-Hostpair must match the allowlist. A foreign direct Host is rejected when no default is configured. Malformed forwarded host values are rejected. Callback messages are HTML-escaped. - Discovery follows RFC 9728 → RFC 8414: the MCP endpoint's 401
WWW-Authenticateheader names its protected-resource metadata, that document names the authorization server, and the authorization server's metadata is read from the RFC 8414 path-inserted URL (e.g.https://github.com/.well-known/oauth-authorization-server/login/oauth). Only when nothing is discoverable does it fall back to guessing${origin}/oauth/*, and the attempt log says so. - RFC 8707
resourcetaken from the protected-resource document and sent on authorize, token exchange and refresh. A server that binds tokens to an audience (Kontrcheck's connector does) rejects every step without it asinvalid_target. Providers that publish no resource keep the previous behaviour exactly: nothing is invented. - Manual client credentials for authorization servers that do not support dynamic registration (GitHub's does not): set Client ID to an app you registered with the provider, optionally a Client secret environment variable name (sent as
client_secret; the secret itself is never persisted), and a Scope string.
- Client application type follows MCP SEP-837: HTTP loopback callbacks (
- Static Bearer token mode for servers without OAuth — stored as an environment-variable name (Codex-style
tokenEnv), never as plaintext in the config. - No auth mode for servers that need no credentials at all (e.g. a local
http://127.0.0.1:9316/mcp) — the plugin sends noAuthorizationheader and connects on save. - Custom HTTP headers (
headersfor direct values,headerEnvfor values read from environment variables) — matches Codex's `
…
