v1.7.0 refreshRoots() clears allowedLocalDirs when host advertises roots capability but returns empty list — wipes CLI-arg directories
还没有人认领这个 Issue。
评估
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 新手友好度
- 72/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 冷清
- 技术栈
- typescript
调研方向
从 dist/server.js 中的 refreshRoots() 开始,跟踪 dist/index.js 第 34372 行和第 34376 行附近如何根据 roots 和 CLI 参数填充 allowedLocalDirs。使用 positional directory 运行 Windows 复现,然后调用 list_pdfs 和 display_pdf;完成的标准是初始化后 CLI 目录仍保留在 allowedDirectories 中,并且可以打开本地文件。
由索引模型根据 Issue 内容生成。
描述
Version: 1.7.0 (pdf-server-mcp via Claude Desktop extension manager)
OS: Windows 11 / Claude Desktop 1.4758.0
Severity: Functional regression — local PDFs cannot be opened via display_pdf
What happens
list_pdfs returns:
{"localFiles": [], "allowedDirectories": [], "truncated": false}
Even when:
Directories are passed as positional args via the manifest's mcp_config.args
(which parseArgs() should register at line ~34372 in dist/index.js)
A cowork directory mount has been approved by the user
display_pdf against any local file path is rejected with "Local file not in allowed list".
Root cause
In dist/server.js refreshRoots():
async function refreshRoots(server) {
if (!server.getClientCapabilities()?.roots)
return;
try {
const { roots } = await server.listRoots();
allowedLocalDirs.clear(); // <-- this line
for (const root of roots) { ... }
}
}
When --stdio mode runs, useClientRoots: true is hardcoded, so
refreshRoots() always fires on init via oninitialized. Claude Desktop
1.4758.0 advertises the roots capability but server.listRoots() returns
an empty array (cowork mounts not propagating as MCP roots). The
unconditional clear() then wipes any directories registered via CLI args
in main() lines 34372/34376.
Reproduction
Install pdf-server-mcp 1.7.0 in Claude Desktop on Windows.
In manifest.json (or via a launch wrapper) add positional directory
paths to mcp_config.args after --stdio, e.g.
["${__dirname}/dist/index.js", "--stdio", "C:\\some\\dir"].
Restart Claude Desktop.
Call list_pdfs. Expected: allowedDirectories includes C:\some\dir.
Actual: allowedDirectories: [].
Suggested fix
In refreshRoots(), either (a) only clear when the new roots list is
non-empty, or (b) drop the clear entirely and rely on Set.add()'s dedup
behavior. Option (b) is safer because cowork-side root removals would
still need a separate mechanism (e.g., a roots/list_changed notification
that explicitly signals removal, not the current implicit
clear-and-replace).
Workaround applied locally
Commented out the allowedLocalDirs.clear() line. CLI-arg directories
now survive the refresh and display_pdf works on local paths again.
This loses the ability for the host to revoke a previously-granted root
via the empty-list path, but in practice cowork mounts are additive in
our usage pattern.
- 主要语言
- TypeScript
- 星标
- 2.9k
- 派生
- 387
- 平均合并
- 2 小时 54 分钟
- 30 天内合并 PR
- 7
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
modelcontextprotocol/ext-apps 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 70/100
modelcontextprotocol/ext-apps#786 ·
-
bug
难度 2/5 1-3 小时 新手友好度 84/100
modelcontextprotocol/ext-apps#767 ·
-
bug
难度 2/5 1-3 小时 新手友好度 68/100
modelcontextprotocol/ext-apps#742 · 1 条评论 ·
-
难度 1/5 1 小时以内 新手友好度 72/100
modelcontextprotocol/ext-apps#711 ·
-
难度 2/5 1-3 小时 新手友好度 65/100
modelcontextprotocol/ext-apps#706 ·
查看 modelcontextprotocol/ext-apps 的全部 Issue
相似的 Issue
-
VerificationGate: ATTRIBUTION quote guard never matches a normal quotation (\b around the quote) 未关闭
难度 2/5 1-3 小时 新手友好度 75/100
danielmiessler/LifeOS#2234 ·
-
T: Bug
难度 2/5 1-3 小时 新手友好度 75/100
-
难度 2/5 1-3 小时 新手友好度 65/100
-
难度 1/5 1 小时以内 新手友好度 85/100
-
Mend: dependency security vulnerability untriaged
难度 2/5 1-3 小时 新手友好度 70/100