codex-dsh-mcp
Click on "Deploy 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., "@codex-dsh-mcpStart a DeepSeek Harness session in this project and ask it to review the latest changes."
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.
codex-dsh-mcp
让 Codex 通过本机 MCP stdio 桥接,创建、恢复和控制 DeepSeek Harness(DSH)会话。
English · 配置参考 · 审计记录 · 安全说明 · MIT
Codex ── MCP / stdio ──▶ codex-dsh-mcp ── ACP / stdio ──▶ dsh --profile acp这是配置在 Codex 侧的 MCP server,不能通过 dsh plugin add 安装。桥接通过 ACP 操作会话,不直接解析 DSH 的数据库或会话正文文件。
能力边界:恢复会话会让 DSH 继续原有上下文,但不会向 Codex 回放历史正文;历史读取、搜索、删除和桌面活跃会话接管均未实现。恢复前必须在桌面端关闭该会话,切换到其他标签页不算释放。
快速开始
需要 Node.js ≥ 22.18、Git,以及能运行 dsh --profile acp 的本地 DSH 安装。模型调用使用 DSH 自身的配置和凭据,桥接无需单独填写 API key。
仓库既有真实安装验证基线为 Windows x64 + DSH 0.2.1-rc.5 + Node 24;其他 DSH 版本和系统的真实安装兼容性需另行验证。CI 配置覆盖 Ubuntu / Windows 与 Node 22 / 24。
1. 构建
git clone https://github.com/xieqwer/codex-dsh-mcp.git
cd codex-dsh-mcp
npm run build
npm test项目没有第三方依赖,无需 npm install。构建生成 dist/*.js;测试使用 fake ACP,不调用真实模型或操作真实会话。
2. 配置 Codex
将下列配置合并到 ~/.codex/config.toml,替换所有示例路径。若已有 [mcp_servers.dsh],修改原表,避免重复添加。
[mcp_servers.dsh]
command = 'C:\Program Files\nodejs\node.exe'
args = ['D:\path\to\codex-dsh-mcp\dist\index.js']
cwd = 'D:\path\to\your\project'
startup_timeout_sec = 120
tool_timeout_sec = 900
[mcp_servers.dsh.env]
DSH_CODEX_ALLOWED_CWDS = 'D:\path\to\your\project'
DSH_CODEX_LOG_FILE = 'D:\path\to\codex-dsh-mcp\.codex-dsh-mcp.log'
DSH_CODEX_LOG_LEVEL = 'info'Windows 路径使用 TOML 单引号;
command填where.exe node找到的真实可执行文件。Windows 默认探测
%LOCALAPPDATA%\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd,未找到时使用 PATH 上的dsh;其他系统直接使用dsh。自定义位置通过DSH_CODEX_DSH_COMMAND指定。配置中的工作目录必须已经存在。允许多个目录时用分号分隔。
3. 检查连接
重新加载 Codex 的 MCP 配置后执行:
codex mcp list
codex mcp get dsh --json这两条命令用于检查配置,enabled 不代表 ACP 已握手。在 Codex 中调用 dsh_list_sessions,并检查日志中是否出现 connected to dsh acp。首次启动可能需要引导 DSH profile。
Related MCP server: @dsh-gate/mcp-server
工具与使用流程
工具 | ACP 方法 | 关键参数 / 行为 |
|
| 可选 |
|
| 必填 |
|
| 必填 |
|
| 必填 |
|
| 必填 |
|
| 必填 |
工具目录按协商能力调整;DSH 未公布 resume / close 能力时,对应工具会隐藏。恢复还依赖 session/list 做会话归属及 cwd 校验。
新建会话:dsh_create_session → dsh_send_message → 按需 dsh_close_session。创建和恢复返回 sessionId,后续调用使用 session_id;桥接不会自动选择最近会话。
继续已有会话:先列出会话并确认已在桌面关闭,再恢复、发送消息。以下为各工具的参数示例,<session-id> 替换为列表返回的 ID:
dsh_list_sessions
{"cwd":"D:\\work\\project"}
dsh_resume_session
{"session_id":"<session-id>","cwd":"D:\\work\\project","acknowledge_released":true}
dsh_send_message
{"session_id":"<session-id>","text":"继续之前的任务","permission_policy":"deny"}
dsh_close_session
{"session_id":"<session-id>","confirm":true}会话必须先在当前桥接中创建或恢复,才能发送、取消或关闭。同一会话只允许一个在途 prompt。
list返回会话摘要,不返回正文;桌面正在使用的会话也可能被列出,可见不等于已释放。permission_policy默认deny。显式设为allow_once会批准该 prompt 中每次权限请求的单次选项;策略不跨消息继承,resume时传入的值只做兼容性校验。需要允许时,在对应dsh_send_message上显式传入。timeout_ms最小为 1000,且不能超过配置的 prompt 超时。超时会发出取消通知,但不会等待 DSH 确认停止。取消客户端请求时,应显式调用dsh_cancel_session。
配置与安全边界
常用环境变量为 DSH_CODEX_DSH_COMMAND(启动器)、DSH_CODEX_ALLOWED_CWDS(允许的会话目录)、DSH_CODEX_DSH_HOME(DSH 数据目录)和 DSH_CODEX_PROMPT_TIMEOUT_MS(默认 600000 ms)。所有变量、默认值及分隔规则见 配置参考。
桥接仅使用本机 stdio,stdout 只输出协议帧。会话 cwd 经 realpath 和允许列表校验,但这不是 DSH 执行沙箱;子进程继承桥接环境与宿主权限。不传 cwd 的列表会按目录允许列表过滤返回项;允许列表约束的是桥接可见的会话范围,不是 DSH 的执行沙箱。
内部思考默认不返回;仅在 DSH_CODEX_INCLUDE_THOUGHTS=1 时收集。DSH_CODEX_MAX_OUTPUT_CHARS 在收集阶段限制助手/思考文本,并把超限的工具 rawInput/rawOutput 替换为预览。诊断日志会转发 DSH stderr,分享前需检查敏感内容。
验证与开发
npm run build
npm test
npm run check:privacy2026-11-03 本次审计在 Windows / Node 24.19.0 上复跑:构建、54 个测试(6 个文件)及隐私检查通过。审计发现的分页上限、MCP 取消、重连状态、权限继承和输出边界问题已修复并补了回归测试,详见 审计记录。
可选真实安装探针(不调用模型,但会启动 DSH 并写报告):
node scripts/real-acp-probe.ts # 临时 DSH_HOME:握手及会话生命周期
node scripts/real-e2e-probe.ts # 临时 DSH_HOME:MCP → 桥接 → DSH
node scripts/real-desktop-visibility.ts # 真实 DSH_HOME:仅列出会话、对照目录名真实模型验收与上述检查分开运行:
node scripts/real-prompt-probe.ts --confirm-cost # 临时 DSH_HOME;消耗 token
node scripts/acceptance-real.ts --confirm-cost # 真实 DSH_HOME;留下专用测试会话acceptance-desktop-sessions.ts 会向显式指定的真实已有会话发送消息,不属于常规自检。探针输出会覆盖 docs/reports/ 下同名文件,可能含本机路径与会话 ID;公开前需脱敏并运行隐私检查。
仓库中的 验证说明 和验收报告是已有环境的记录,本次未重跑真实模型验收。历史 API 缺口见 调研报告。
常见问题
现象 | 检查 / 处理 |
工具不可见或 | 检查 Node / DSH 路径及日志; |
| 使用存在的绝对路径;检查允许列表和会话原 cwd |
| 检查 DSH 协商能力、模型允许列表与实际公布的配置值 |
| 先创建或恢复;已有 prompt 时等待或取消 |
ACP 崩溃后恢复报 | 重连会清空旧会话状态;若仍出现,重启桥接后重新 list / resume |
| 检查 DSH 状态;同时调整桥接超时和 Codex 工具超时 |
| 检查宿主是否允许派生带管道的子进程,在允许的终端中运行 |
恢复后发消息报 | 该会话工具历史已过期(DSH 把全部工具标为延迟加载,模型拒绝该 turn);新建会话继续, |
更新、卸载与贡献
更新:git pull → npm run build → 重新加载 Codex 的 MCP 服务。
卸载:删除 Codex 中的 [mcp_servers.dsh] 配置及其环境变量表,再删除项目目录和可选日志。已有 DSH 会话与历史仍保留。
贡献前运行构建、测试与隐私检查。源码位于 src/,隔离测试位于 tests/,探针位于 scripts/。变更见 CHANGELOG,安全问题按 SECURITY.md 私下报告。项目采用 MIT,private: true,不通过 npm 发布。
Available Tools
6 toolsdsh_cancel_sessionCancel a DSH session runADestructive
Ask the ACP session/cancel method to stop the work of exactly one session. The in-flight prompt settles with stopReason "cancelled"; other sessions are untouched.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Explicit session id to cancel. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is known; the description adds genuinely new behavior: the in-flight prompt settles with stopReason "cancelled" and no other session is affected. It names the underlying ACP session/cancel call and clarifies the effect on running work, though it omits the post-cancel session state (still open? resumable?).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and its scope, with no redundant restatement of the name or schema. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations covering the safety profile and no output schema, this is nearly complete: it explains what happens to running work and the isolation guarantee. The remaining gap is the resulting session lifecycle state, which matters given the dsh_resume_session and dsh_close_session siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single session_id parameter, which is already documented as the explicit session id to cancel. The description's 'exactly one session' reinforces the cardinality but adds no format or lookup guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (cancel/stop the work) and resource (one session), and the phrase 'exactly one session' plus 'other sessions are untouched' pins the blast radius. It does not explicitly distinguish itself from the sibling dsh_close_session, which a reader could plausibly confuse with cancellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'stop the work of exactly one session', which suggests interrupting a running prompt, but there is no explicit when-to-use versus when-not guidance. It never says whether to prefer this over dsh_close_session or whether the session can be resumed afterward with dsh_resume_session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_close_sessionClose a DSH sessionADestructive
Close exactly one session via ACP session/close. This cancels in-flight work, drains updates, flushes persistence, and releases the session run scope. Persisted history is retained and can be resumed later. Requires confirm=true. Closing is NOT read-only and is NOT a safe way to inspect a session; it will cancel that session's in-flight work.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true: closing cancels in-flight work and releases run resources (history is kept; it is not read-only). | |
| session_id | Yes | Explicit session id to close. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by spelling out the exact sequence of effects (cancels in-flight work, drains updates, flushes persistence, releases the run scope) and, crucially, what is preserved (persisted history, resumable later). Annotations only flag destructive=true; the description tells the agent what is actually destroyed versus retained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and target, followed by effects and then constraints; every sentence carries signal. There is mild redundancy — the not-read-only caveat appears in both the description and the confirm parameter, and the confirm requirement is restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with annotations and no output schema, the description covers effects, side effects, and data retention adequately. It does not state behavior for an invalid or already-closed session id, which leaves an edge case unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, both parameters are already documented, including the confirm=true requirement and the meaning of session_id. The description adds only the 'exactly one session' scoping nuance, so the schema does the heavy lifting and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Close exactly one session via ACP session/close') with an explicit scope of exactly one session, and contrasts it against a read-only inspection use case, so an agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions: requires confirm=true, must not be used to inspect a session, and notes history is retained and resumable later, which points toward dsh_resume_session. It stops short of explicitly distinguishing itself from the sibling dsh_cancel_session, which also affects in-flight work — that choice is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_create_sessionCreate a DSH sessionA
Create a fresh persistent DSH session via ACP session/new. cwd must be absolute, inside the configured allowlist, and is realpath-canonicalised before use. model / reasoning_effort are only accepted when explicitly allowlisted by the bridge.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute working directory for the new session. | |
| model | No | Optional model id; must be allowlisted (DSH_CODEX_ALLOWED_MODELS). | |
| profile | No | Optional DSH profile; must equal the bridge profile. | |
| reasoning_effort | No | Optional reasoning effort; must be allowlisted (DSH_CODEX_ALLOWED_REASONING_EFFORTS). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, non-destructive, non-idempotent operation. The description adds real behavioral context beyond that: cwd is path-validated and realpath-canonicalised before use, and model/reasoning_effort are gated by bridge allowlists. It does not cover failure modes or what is returned, but for a creation tool this is solid added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the operation and followed by the validation rules. There is no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should indicate what a caller gets back (for example a session id needed for dsh_send_message or dsh_close_session) and whether sessions persist until closed. Those gaps are notable for a session-creation tool, though the validation rules are complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds constraints the schema does not state: the allowlist requirement for cwd and the realpath canonicalisation step. These are meaningful semantics for the most important parameter, lifting it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Create a fresh persistent DSH session') plus the underlying call ('ACP session/new'). The word 'fresh' implicitly contrasts with dsh_resume_session, but no sibling is named explicitly, so differentiation is only partly achieved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by 'fresh' versus the sibling dsh_resume_session, and preconditions are stated, but there is no explicit statement of when to prefer this over resuming or how it relates to dsh_list_sessions. The agent must infer the routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_list_sessionsList DSH sessionsARead-onlyIdempotent
List persisted, resumable DSH root sessions from the ACP session/list method (newest first). Optional cwd filter must be an absolute path inside the allowed directories. Returns only sessionId/cwd/title/updatedAt summaries. WARNING: sessions held by the desktop app are also listed (ACP cannot see cross-process activity); visibility does not mean the session is free.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Absolute working directory to filter by (realpath validated). | |
| limit | No | Maximum summaries to return. | |
| cursor | No | Opaque cursor from a previous nextCursor field. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds traits annotations cannot express: results come from ACP session/list, are ordered newest first, only root sessions are included, and cross-process activity is invisible to ACP so a listed session may be locked by the desktop app. That last warning is a genuinely non-obvious behavioral hazard an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then filtering constraint, then return shape, then the capitalized warning. No filler, and the ordering places the operational caveat where it is most likely to be read before invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only three-parameter list tool with no output schema, the description covers purpose, filtering constraint, ordering, returned fields (sessionId/cwd/title/updatedAt), and pagination via the schema's cursor. Nothing an agent needs to call it correctly or interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a constraint the schema does not state: cwd must be an absolute path inside the allowed directories (the schema only mentions realpath validation). It also clarifies that limit bounds 'summaries' rather than full session records.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List persisted, resumable DSH root sessions") plus the underlying source (ACP session/list) and ordering (newest first). Against siblings like dsh_create_session and dsh_resume_session, there is no ambiguity about which tool enumerates sessions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the context for calling it (enumerate persisted root sessions, optionally narrowed by cwd) and supplies a non-obvious caveat that governs how to act on results: listed sessions may be held by the desktop app, so visibility does not imply availability. It does not explicitly name a sibling or say 'call this before dsh_resume_session', so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_resume_sessionResume a DSH sessionA
Restore a persisted inactive DSH session via ACP session/resume, validating canonical cwd and session ownership first. Resume only restores a persisted inactive session and continues it; it does not replay prior transcript messages. WARNING: DSH ACP cannot see sessions held by another process (the desktop app), so session/list also lists sessions the desktop may still be running. Resuming is NOT read-only: it activates the session and writes to the same persisted log, which can conflict with the desktop. Requires acknowledge_released=true, and switching desktop tabs does not count as releasing.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute working directory; must match the session canonical cwd. | |
| session_id | Yes | Explicit persisted session id. | |
| permission_policy | No | Validated for compatibility but NOT inherited: pass permission_policy explicitly on each dsh_send_message. | deny |
| acknowledge_released | Yes | Must be true. Confirms the session is not in use by the desktop app (closed there, not merely a background tab). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false. The description adds genuine context the annotations cannot: resuming activates the session, writes to the same persisted log, and can conflict with the desktop process that DSH ACP cannot detect. That is real value beyond structured fields, though it doesn't say what error surfaces on a log conflict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the scope limit, then the warning, then the precondition — a logical escalation. The session/list aside about desktop-held sessions is somewhat tangential to invoking this tool and could be trimmed, but every sentence carries operational weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and four fully described parameters, the description covers the safety profile, the ownership precondition, and the concurrency hazard. It omits what a successful resume returns (session state, resumed cwd) and how a detected desktop conflict is reported, which an agent would want before acting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds meaning by explaining that acknowledge_released is a release confirmation and that 'switching desktop tabs does not count as releasing', which sharpen the schema's wording. It explains cwd validation and the permission_policy non-inheritance rule, but the latter is already spelled out fully in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Restore') plus resource ('persisted inactive DSH session') and the mechanism ('ACP session/resume'), then immediately bounds it: 'Resume only restores a persisted inactive session... it does not replay prior transcript messages.' That boundary cleanly separates it from dsh_create_session and dsh_send_message without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not conditions (does not replay transcript, cannot see sessions held by another process, do not resume while the desktop may still be running it) plus a hard precondition ('Requires acknowledge_released=true'). It stops short of naming the sibling to use instead when a session is not persisted or is currently held by the desktop, so the alternative routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_send_messageSend a message to a DSH sessionA
Send one user text message to an existing session via ACP session/prompt and wait for the turn to settle. Exactly one prompt may be in flight per session. Returns the assistant text, a tool-call summary and usage. DSH internal thoughts (agent_thought_chunk) are NOT returned unless the operator set DSH_CODEX_INCLUDE_THOUGHTS. Permission requests made by DSH tools are DENIED unless permission_policy is explicitly "allow_once"; they are never auto-approved.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | User message text. | |
| session_id | Yes | Explicit session id (never defaulted to "most recent"). | |
| timeout_ms | No | Prompt settlement timeout; capped by the bridge prompt timeout. | |
| permission_policy | No | How to answer DSH tool permission requests for this turn. | deny |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: the call blocks until the turn settles, one prompt per session at a time, agent_thought_chunk content is filtered out unless DSH_CODEX_INCLUDE_THOUGHTS is set, and DSH tool permission requests default to DENIED unless permission_policy is 'allow_once'. These are exactly the non-obvious traits an agent needs before invoking a mutating, potentially long-running call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information: action, concurrency constraint, return shape, and permission/thought defaults. The action is front-loaded and no sentence is filler or duplicated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description summarizes the return payload (assistant text, tool-call summary, usage) and covers blocking behavior, concurrency, and permission defaults. For a 4-parameter mutation with full schema coverage and annotations, nothing material is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds consequence-level meaning by explaining what permission_policy actually governs (DSH tool permission requests default to deny, never auto-approved) and that permission is per-turn. That goes beyond the schema's 'How to answer DSH tool permission requests for this turn.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Send one user text message to an existing session via ACP session/prompt') plus the synchronous settle semantics. This is unmistakably different from the sibling session-management tools (list/create/resume/cancel/close), which do not carry payloads into a turn.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the prerequisite clearly ('existing session') and states an operational constraint ('Exactly one prompt may be in flight per session'), which tells the agent not to fire concurrent sends. It stops short of naming an explicit alternative or spelling out the create-then-send sequence, so it is strong context rather than a full routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
dsh_cancel_session - First observed
dsh_close_session - First observed
dsh_create_session - First observed
dsh_list_sessions - First observed
dsh_resume_session - First observed
dsh_send_message
TDQS
Scored across 6 tools
Each tool maps to a distinct session lifecycle action: list, create, resume, send, cancel, and close. The create-vs-resume distinction is explicitly clarified (fresh session vs. persisted inactive session), and send/cancel/close operate unambiguously on active sessions.
All tools share the same dsh_ prefix and follow a consistent verb_noun snake_case pattern (list_sessions, create_session, resume_session, send_message, cancel_session, close_session). There are no mixed conventions or vague verbs.
Six tools is well-scoped for a session-lifecycle bridge and each tool earns its place. No redundant or filler operations are present.
The core lifecycle is covered (create, list, resume, send, cancel, close), but there is no tool to inspect a session's status or retrieve its transcript/history. dsh_resume_session explicitly does not replay prior messages, so agents cannot read past session content once it is not in flight.
Related MCP Connectors
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Connect ChatGPT and Claude to your Mac, Windows or Linux with secure MCP remote access.
A paid remote MCP for OpenAI Codex agent coordination MCP, built to return verdicts, receipts, usage
A paid remote MCP for OpenAI Codex harness MCP, built to return verdicts, receipts, usage logs, and
Related MCP Servers
- AlicenseAqualityBmaintenanceA local STDIO MCP server that bridges Codex to the official DeepSeek Harness (DSH) Web Host, enabling supervised DSH collaboration through session management, delegation, and monitoring tools.1313MIT
- AlicenseNot gradedqualityBmaintenanceEnables Codex to supervise long-running DeepSeek Harness sessions through MCP, providing tools for progress monitoring, handoffs, and artifact management while keeping the host independent.MIT
- AlicenseNot gradedqualityCmaintenanceBridges DeepSeek Harness ACP services to MCP stdio hosts like Codex, enabling session management, model selection, background tasks, cancellation, and subagent observation.MIT
- AlicenseNot gradedqualityAmaintenanceEnables Codex to delegate scoped tasks to a local DeepSeek Harness over MCP — dispatching read-only reviews or authorized workspace writes, steering and monitoring runs to a terminal state, and returning structured evidence such as changed paths, test results, and assistant text. It also supports exact archival of the terminal session by full session ID.1MIT