dsh-chatgpt-bridge
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dsh-chatgpt-bridgecreate a new agent session for my data analysis task"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dsh-chatgpt-bridge
An MCP bridge that lets ChatGPT Web create, view, continue and control DeepSeek Harness (DSH) agent sessions through the official Model Context Protocol. The bridge only connects — DSH keeps its own session log, agent loop, tools, skills, subagents, workflows, approvals, sandbox and workspace security model. It is a standalone DSH plugin: zero DSH core modifications.
Self-hosted / dogfooding development: implemented against the installed DeepSeek Harness source (
0.1.0-rc.6) and verified end-to-end against a live local DSH runtime with the official MCP SDK client.
Architecture
ChatGPT Web
|
| MCP (Streamable HTTP / stdio)
v
dsh-chatgpt-bridge <- a DSH (Cordis) plugin row
|
v
DeepSeek Harness <- sessions, agents, tools, approvals, sandbox, workspace
|
+----+--------------+
| | |
Session Agent Workflow
| | |
+----+------+-------+
v
Local WorkspaceThe bridge uses DSH's public plugin seams — it never re-implements DSH:
DSH capability seam | Usage in the bridge |
|
|
| live session listing, |
|
|
| title read/write (plus the |
| list + resolve — only registered workspaces can host sessions |
| the bridge is an answerer: approvals park as |
| the bridge is the question provider: questions park as |
| default provider/model selection for created sessions |
| same per-session preset composition the Web UI uses, when a roster exists |
| per-agent model selection with log-derived fallback on resume |
| the canonical way to continue a session's durable log |
MCP facts
Item | Value |
Transport | Streamable HTTP (default, |
Protocol version | negotiated by |
Authentication | Bearer token (default): config token → |
Local endpoint |
|
ChatGPT connection | any official MCP client: a local connector at the endpoint with the token, or a remote connector tunneled to the loopback endpoint. The bridge never exposes anything public by itself. |
Related MCP server: dsh-mcp-gateway
Install
The plugin is a standard DSH profile bundle. It currently targets DSH
0.1.0-rc.6. Clone this repository, install its dependencies, build it, then
add the local checkout to a dedicated DSH profile:
# 1. clone, install and build
git clone https://github.com/jiezeng2004-design/dsh-chatgpt-bridge.git
cd dsh-chatgpt-bridge
npm install
npm run build
# 2. create the profile and add this checkout (pnpm required; `file:` spec)
pnpm dlx @deepseek-ai/dsh@0.1.0-rc.6 plugin --profile chatgpt-bridge add "file:$PWD"
# 3. boot it
pnpm dlx @deepseek-ai/dsh@0.1.0-rc.6 --profile chatgpt-bridgedsh plugin installs the package into the profile and, because the package
declares dsh.bundle.patch, appends it to the profile's bundle list. The
bundle patch adds the rows the bridge needs (storage, workspace registry,
projection cache) plus the chatgpt-bridge row itself.
If pnpm cannot run in your environment (e.g. symlinks blocked), install
manually: create $DSH_HOME/profiles/chatgpt-bridge/ with package.json
(dsh.profile.bundles: ["@deepseek-ai/dsh-base", "dsh-chatgpt-bridge"]),
empty cordis.yml / cordis.patch.yml, and a
node_modules/dsh-chatgpt-bridge link to this checkout. The checkout's own
node_modules may be a junction to the DSH installation's hoisted
node_modules so both sides share one module instance.
DSH configuration
Only the plugin's own row config (defaults shown):
- id: chatgpt-bridge
name: dsh-chatgpt-bridge
config:
transport: http # http | stdio
host: 127.0.0.1 # loopback only by default
port: 3456
authMode: token # token | none (loopback only, not recommended)
authToken: '' # static token; empty falls back to env, then generated file
authTokenEnv: DSH_CHATGPT_BRIDGE_TOKEN
tokenFile: '' # default $DSH_HOME/chatgpt-bridge.token
resultMaxChars: 8000
resultMaxItems: 50
sessionMaxItems: 20
sessionMaxChars: 4000
logLevel: infoLogs go to $DSH_HOME/chatgpt-bridge.log (redacted) and never to stdout, so
the stdio transport stays clean.
ChatGPT MCP configuration
Start the bridge (
dsh --profile chatgpt-bridge) and note the token:Get-Content $env:USERPROFILE\.dsh\chatgpt-bridge.token(or setDSH_CHATGPT_BRIDGE_TOKENyourself).In ChatGPT, add a custom MCP connector:
Local: point it at
http://127.0.0.1:3456/mcpwith the bearer token as the authorization header; or use a stdio connector whose command isdsh --profile chatgpt-bridge(a stdio-mode profile).Remote/tunneled: run the bridge on the loopback and connect ChatGPT through the platform's supported secure MCP tunnel mechanism. The bridge itself never binds a public interface and never self-hosts a tunnel.
Verify with
dsh_health.
No ChatGPT cookies, logins, or web sessions are ever touched: ChatGPT is strictly an MCP client of the bridge.
MCP tool catalog
Tool | Purpose |
| Bridge/DSH status, versions, session counts, capabilities. Never contains tokens/keys/cookies. |
| Workspaces DSH already registered (id, title, path, counts). |
| Create a real DSH session bound to a registered workspace (id/path/title). Optional |
| Live + persisted sessions, newest first, paged ( |
| Status, workspace, bounded recent-message summary ( |
| Continue an existing DSH session (live agent, or resume from persistence). Returns immediately; long tasks run in the background. |
|
|
| Last turn's assistant text, status, tool calls, changed files (from the session log), structured error. |
| Cancel through DSH's own |
| Answer a parked user question ( |
| Decide one parked approval ( |
Deliberately NOT exposed (first version)
execute_shell, run_command, read_any_file, write_any_file,
delete_file, git_push, install_package, run_arbitrary_tool.
ChatGPT never gets a direct shell: it talks to the DSH agent, and the DSH
agent uses DSH tools under DSH's approval/sandbox/workspace policy.
Session lifecycle
ChatGPT: dsh_create_session(workspace)
-> session_id (e.g. session-034daf61-...)
ChatGPT: dsh_send_message(session_id, "帮我分析这个项目,不修改文件。")
-> {accepted: true} # returns immediately
DSH: agent.followup() -> turn runs in the background
ChatGPT: dsh_get_task_status(session_id) -> running -> completed
ChatGPT: dsh_get_result(session_id) -> analysis text
ChatGPT: dsh_send_message(session_id, "刚才第 2 项不错,现在实现它。")
-> same session, same agent loop, same durable logDSH is the authority for session identity. Sessions persist as
$DSH_HOME/sessions/<workspace>/<session-id>/session.jsonl.zstd (event log)
and survive bridge restarts, ChatGPT conversations, and DSH restarts:
dsh_send_message on a cold session resumes it through ctx.agents.resume(),
which replays the log into the model context (verified: a marker learned
before a process restart was still remembered afterwards).
Security model
No arbitrary shell tool — see the tool catalog.
Workspace boundary — sessions can only be created in workspaces DSH already registered (
ctx.workspaceRegistry). Arbitrary paths are never opened or auto-registered;dsh_create_sessionwithC:\Users\...,/,~, etc. is rejected withWORKSPACE_NOT_FOUND.Approval is never bypassed — if DSH asks for approval, the bridge parks the request (
waiting_for_approval) and onlydsh_approvewith the exact approval id can grant it, once, for that exact tool call (allowed-once). No auto-approve, no approve-all. If the bridge unloads while requests are parked, they resolvecancelled(fail closed).Sandbox is inherited, not weakened — created sessions get
meta.cwd = workspace.path, so DSH's per-session sandbox confines the agent's file effects to that workspace.Localhost-first — the HTTP server binds
127.0.0.1by default.Secret redaction — all bridge logs and tool outputs pass through a redactor (sk-... keys, bearer tokens, key=value secrets, secret-shaped keys). The generated token is never logged.
No ChatGPT credentials — the bridge never reads cookies, never drives a browser, never stores OpenAI session tokens.
Approval behavior (concrete)
The DSH agent requests a permission. DSH emits
approval/request.The bridge (an answerer for its own sessions) parks the request; the session shows
waiting_for_approvalwith{approval_id, tool_name, call_id?, reason?}.ChatGPT calls
dsh_approve(session_id, approval_id, "approve")→allowed-once; or"reject"→rejectedand the call fails closed.The agent's turn continues.
Sessions created by the web UI keep being answered by the web UI answerer;
the bridge only answers approvals for sessions it created. In a profile
where the web UI already owns the single user-questions provider slot,
questions flow through that provider instead (reported in dsh_health
capabilities).
User question behavior
When the agent calls the ask-user tool, the bridge (as the registered
provider) parks the question; the session shows waiting_for_user with the
question text/options, and dsh_answer_question resolves it. Answers are
validated against the offered options.
Long task behavior
dsh_send_message returns immediately with {accepted: true}. The agent
loop runs in the background; dsh_get_task_status polls
queued -> running -> completed|failed|cancelled. Cancellation goes through
DSH's own agent.cancel({kind:'user'}), which aborts the active turn
(turn-end reason aborted) or discards still-queued messages — DSH's
semantics, not a second task system.
Tests
npm run typecheck # tsc --noEmit
npm test # node --test (status derivation, view extraction,
# redaction, workspace boundary, approvals/questions)
npm run dogfood # full MCP client flow against a running bridge:
# health -> workspaces -> create -> send -> status ->
# result -> follow-up -> same session continues,
# isolation, list/get, long-task cancel, redaction
npm run resume-test # create marker session -> restart the DSH profile ->
# continue the same session -> marker survives
npm run demo-flow # two-step demo (analyze, then implement + test)The dogfood/resume/demo scripts use the official @modelcontextprotocol/sdk
client over Streamable HTTP against the booted profile — the same
protocol ChatGPT speaks.
Uninstall / disable
Disable: in the profile's
cordis.patch.ymladd- id: chatgpt-bridge+disabled: true, then restart the profile. The MCP endpoint disappears; DSH keeps running untouched (verified).Uninstall:
dsh plugin --profile chatgpt-bridge remove dsh-chatgpt-bridge(or delete the profile directory). Bridge-created agents are disposed with the plugin; their session logs remain persisted and can be resumed later from any profile sharing$DSH_HOME.Sessions created by the bridge continue to exist and can be continued by the Web UI or any other entry point — DSH's session log is shared.
DSH core modifications: 0.
Common errors
Symptom | Cause / fix |
| Wrong/missing bearer token; read |
| The workspace is not registered in DSH; |
| Unknown session id (never created, or persistence not mounted). |
| The session is not loaded in this process; only live sessions can be cancelled. |
| The decision was already taken or the bridge restarted (parked decisions are in-memory). |
question provider slot taken (log) | A web UI is attached and owns user questions; answer them in the UI. |
Port 3456 busy | Another bridge instance is running; change |
Cold sessions show no title in | Cold titles come from the projection cache; concurrent DSH profiles sharing the cache can clobber rows. Single-profile deployments get titles. |
Current limitations
First version is ChatGPT -> DSH only: it drives DSH sessions; it does not expose a full remote control plane (no file browsing, no arbitrary tool passthrough).
Parked approvals/questions live in the bridge process; a bridge restart while something is parked resolves them
cancelled(fail closed).dsh_get_result.changed_filesis derived from the session log's tool calls (arguments of known editing tools) — data-driven, not a diff viewer.The
waiting_for_userprovider slot is single-slot; in a profile where the Web UI already owns it, questions flow through the UI.Stdio mode is supported, but the boot process must not print to stdout; prefer the HTTP transport unless a client requires stdio.
Live ChatGPT validation was completed on 2026-08-14 through a tunneled MCP connection: ChatGPT discovered and invoked
dsh_healthanddsh_list_workspaces. The automated dogfood/resume flows additionally use the official MCP SDK client against the same Streamable HTTP endpoint.
DSH compatibility
Developed and verified against DeepSeek Harness
0.1.0-rc.6(profile bundle@deepseek-ai/dsh-base), Node >= 22.Uses only public plugin seams; no DSH core files are modified.
License
MIT
This server cannot be installed
Maintenance
Related MCP Servers
- Alicense-qualityBmaintenanceEnables ChatGPT (or any MCP client) to delegate coding tasks to a local Hermes-backed agent with async job management, supporting read-only investigation, implementation, and continuation of sessions via secure MCP tunnel.MIT
- Flicense-qualityCmaintenanceAn experimental MCP gateway for controlling durable DeepSeek Harness agent sessions from MCP clients, enabling session creation, observation, steering, and resumption across chat sessions.
- AlicenseAqualityCmaintenanceAn MCP bridge that exposes DeepSeek Harness (DSH) web UI's cordis RPC API as stdio tools, enabling any MCP client to manage workspaces, create/resume sessions, send messages, and fetch session stats.5MIT
- Alicense-qualityCmaintenanceExposes DeepSeek Harness agent capabilities as an MCP server, letting any MCP client drive Harness to execute real coding tasks with structured results, context isolation, and parallel execution.MIT
Related MCP Connectors
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jiezeng2004-design/dsh-chatgpt-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server