dsh-mcp-studio # dsh-mcp-studio **The MCP server & Skills manager for DeepSeek Harness — the Tauri desktop edition's extension panel, consolidated into one plugin.** [![dsh-mcp-studio](https://img.shields.io/badge/dsh--mcp--studio-DSH%20plugin-4d6bfe.svg)](https://github.com/functy23/dsh-mcp-studio) [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178c6.svg?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) [![Top Language](https://img.shields.io/github/languages/top/functy23/dsh-mcp-studio?style=flat)](https://github.com/functy23/dsh-mcp-studio) [![Platform](https://img.shields.io/badge/platform-Web-lightgrey.svg)](https://github.com/functy23/dsh-mcp-studio) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?logo=opensourceinitiative&logoColor=white)](https://opensource.org/licenses/MIT) [![Stars](https://img.shields.io/github/stars/functy23/dsh-mcp-studio?style=flat&logo=github)](https://github.com/functy23/dsh-mcp-studio/stargazers) [![Repo Size](https://img.shields.io/github/repo-size/functy23/dsh-mcp-studio?style=flat&logo=github)](https://github.com/functy23/dsh-mcp-studio) [![Contributors](https://img.shields.io/github/contributors/functy23/dsh-mcp-studio?color=ee8449&logo=githubsponsors)](https://github.com/functy23/dsh-mcp-studio/graphs/contributors) [Issues](https://github.com/functy23/dsh-mcp-studio/issues) • [Changelog](CHANGELOG.md) • [简体中文](README.md)
--- ## 📦 What this is The Tauri desktop edition ([deepseek-harness-desktop](https://github.com/dsh-tauri-desk/deepseek-harness-desktop)) ships its extension panel (Skills / MCP / plugin market) as **three mutually dependent packages**: | Upstream package | Role | Depends on | | --- | --- | --- | | `dsh-tauri-panel-extension` | the panel itself: Skills / MCP / market tabs + host routes | `dsh-tauri`, `dsh-tauri-ui` | | `dsh-tauri` | host + client framework bridge (`defineRoutes`, `defineService`, `definePanel`, `defineRegister`, locale, store) | — | | `dsh-tauri-ui` | components used by the panel (Button/Chip/Modal/SegmentedControl/PanelPage/icons…) | `dsh-tauri` | Installing MCP management meant installing all three, and it only worked inside the Tauri build. **dsh-mcp-studio consolidates them into a single package**: the upstream sources are vendored as-is (`src/panel`, `src/vendor/dsh-tauri`, `src/vendor/dsh-tauri-ui`), a build-time alias layer (`src/bridge`) maps the old bare specifiers onto those local files, and only the minimum changes needed for cross-platform support are applied. **No UI was rewritten.** ## ✨ How the integration works ``` src/ ← live code: everything reachable from the product entries panel/ the extension panel, verbatim (host services + routes, client components/register/locales/styles) vendor/dsh-tauri/ the framework bridge it imports, verbatim (Tauri-only invoke/iframe modules stay unused) vendor/dsh-tauri-ui/ the components it imports, verbatim bridge/ build-time module mapping: old bare specifier → local file vendor-archive/ ← vendored subtrees unreachable from the product entries (Tauri-only bridges, tests of modules that were never vendored); out of build / typecheck / tests ``` Two artifacts: `lib/index.js` (host half, ESM) and `lib/client.js` (client half, DSH ModuleLoader CJS). ### Cross-platform changes (three adaptations + behaviour fixes) 1. **Module mapping** — `dsh-tauri`, `dsh-tauri/client`, `dsh-tauri-ui/client` resolve to `src/bridge/*`, so upstream imports are untouched. 2. **Profile detection** — upstream only honoured `--profile`; `DSH_PROFILE`, `DSH_PROFILE_DIR` and the `/profiles/` launcher argument are now detected too, so MCP rows land in the right profile. 3. **Own identity** — plugin id and route prefix are `dsh-mcp-studio` (`/dsh-mcp-studio/api/*`), so it coexists with the Tauri plugin. 4. **"New skill" flow** — the current core moved navigation off `workspaces`; the panel now reuses an active session first and only falls back to the upstream path (see [CHANGELOG.md](CHANGELOG.md)). Tauri-only code (invoke / listen / iframe bridges) stays vendored but unreferenced: the bundle never touches `window.__TAURI__`. ## 🚀 Install **Web edition only, for now** — the package declares `dsh.client.platform: web` (the client half registers into the Web client): ```sh dsh plugin --profile web add dsh-mcp-studio@latest ``` > **The desktop profile (`--profile desktop`) is not usable — do not install it there.** The desktop profile runs > the Electra client (client capabilities come from `@deepseek-ai/dsh-client-runtime`), while this plugin's client half > depends on the Web client's official modules (ui-layout / ui-primitives / ui-renderer / locale). The two are not > interchangeable: the 「扩展」sidebar entry will simply not appear. The Tauri edition is likewise out of scope — > this project vendors the Tauri edition's three packages, but does not replace its native plugins. Restart DSH once after a host-half update, then hard-refresh the browser. ## 🧭 UI The sidebar shows **扩展** (Puzzle icon) with the original three-tab panel: **MCP** (list, add/edit, enable/disable, restart, connection check, copy, import scanning, JSON export/import), **Skills** (grouped list, search, enable/disable, view/edit SKILL.md, create, delete, open folder, refresh), **plugin market** (embedded when the market service is present). ## 🛠 Development ```sh pnpm install pnpm typecheck # tsc --noEmit (currently clean) pnpm build # node scripts/build.mjs → lib/index.js + lib/client.js pnpm test # node scripts/run-tests.mjs (vitest; see below) ``` > esbuild is used deliberately: the DSH runtime's Node enforces macOS library validation, and > rollup/rolldown `.node` bindings fail to dlopen (see [AGENTS.md](AGENTS.md)). > > `pnpm test` is not a bare `vitest run`: the rollup native binding that vite loads is unsigned and the > bundled DSH Node runs with the hardened runtime, so both ends fail `dlopen`. `scripts/run-tests.mjs` > signs the binding ad-hoc and then runs vitest under a Node without the hardened runtime. > > The old bare specifiers are mapped in three places — `scripts/build.mjs`, `tsconfig.json` and > `vitest.config.ts`: change all three together. ## 🙏 Credits - **[deepseek-harness-desktop](https://github.com/dsh-tauri-desk/deepseek-harness-desktop)** by Hairyf and contributors — the panel, the framework bridge and the UI components in this repository are their original work, vendored here. Please support the upstream project and its Tauri desktop edition. - Official plugin docs: ## 📄 License MIT, with the upstream additional terms ([THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)): no commercial secondary development.