#4808·servers

一切: 会话资源 当两个会话使用相同的文件名时,会清除另一个会话的资源

作者: BlueX888创建于 2026年9月15日更新于 2026年9月15日

万事俱备: 当两个会话使用相同的文件名时, 会话资源会驱逐另一个会话资源

□ 环境

  • repo:模型文本protocol/服务器@`d73f99efbfd40c3a1b61e8728b3d49f52608f'
  • 服务器:`src/一切'(服务器-一切)
  • Node.js v22 (ESM),被钉入回波锁文件的 " 模范contextprotocol/sdk "
  • OS: macOS (达尔温25. 6.0) 互联网档案馆的存檔,存档日期2013-12-21.
  • 不需要网络/ API 密钥: 重置驱动两个真正的“ 用户端” , 与真正的“ 用户端” 相比, 使用“ 数据:” URI 的“ 用户端” 。

□ 最小复制

/tmp/repro-d/session-resource-collision.mjs ' ——通过createServer ()'每届启动一个McpServer',将client'与每个 ' Inmemory Transport ' 相接,然后将gzip-file-as-resource'工具(其name'默认为README.md.gz',tools/gzip-file-as-resource.ts:28')从每届会议起:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? const BUILD = process.argv[2]; c. = 等待导入(`${BUILD}/server/index.js'); cont {客户端} = 等待导入 ("@ modelcontextprotocol/sdk/client/index.js"); Const {InMemory Transport}} = 等待导入 ("@modelcontextprotocol/sdk/inMemory.js"); ; ; ; ; ; ; ; ; ;

c. 电磁学(URI) = “demo://resource/session/shared.gz”;

aync 函数新会话( 标签) { const {服务器} = 创建Server (); const [客户端T, serverT] = inMemory Transport.create LinkedPair(); ; 2. const客户端=新客户端({名称:客户端-${label},版本:"1.0.0"}); 正在等待 Ponnection.all([客户端.connect(客户端T),服务器.connect(serverT)]); 返回客户端; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

cont gzip = (名称、有效载荷) {{ 名称:"gzip-file-as-resource", 参数 : {名称,数据 : 数据: text/plain,${活量}`,输出类型:"资源链接"},

  • ;

a=等待新的会议(A);

// 1. A会话登记其会话资源. 等待 a.callTool(gzip ("shared.gz"),"hello- from-session-A")"); ; ; ; ; ; ; ; ; ; ; const readA1 = 等待 a.readResource ({ uri: URI}) ; control.log(`1. A reading its own resources - > OK ({readA1. contents.长}内容)');

// 2. 控件: 第三个会话登记不同名称 - > A不受影响 c = 等待新的会议("C"); c. c. callToole(gzip ("other.gz"), “session-C"); 等待 a. readResource ({ uri: URI }); control.log ("2. C register other.gz, A register again - > still OK ( control)"); ; ; ; ; ; ;

// 3. 会话 B 注册 SAME 名称 - > 驱逐 A 资源 b = 等待新的会议(B); b. callToole(gzip ("shared.gz","hello- from-session-B"))); 尝试{ 等待 a. readResource ({ uri: URI }); case.log ("3. B registers share.gz, A 读取 - > still OK") ; 捕捉(反射){ a. ${error.message}; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

const readB = 等待 b.readResource ({ uri: URI }); control.log (`4. B reading its own resources - > OK ({readB.contents. long} 内容)' );

const listA = 等待 a.listResources(); 控制台.log () 5. A会场资源/名单是否还存在? - > ${listA.resources.some ((r) => r.uri === URI) }, (三)

process.exit (0); (中文(简体) ).


□ 实际产出

验证符 1 (verbatim):

A1 注册后:1个内容 B 寄存器后的 A2: FAILED - 32602 MCP 错误 . . . . . . .

内容来源: modelcontextprotocol/servers