MCP远程资源缓存工具

连接远程MCP服务器并缓存其工具、资源和提示到本地的轻量级中间件,支持自动重连和元数据同步。

  • by kunobi-ninja
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 kunobi-ninja/mcp-bundler

使用说明

@库诺比/mcp bundler

连接到远程MCP服务器,并在本地缓存其工具、资源和提示。核心 McpBundler 与传输无关,处理连接生命周期、元数据刷新和重新连接感知转发。可选的 McpBundlerServerAdapter 可以将远程元数据重新导出到本地 McpServer.

安装

npm install @kunobi/mcp-bundler

用法

import { McpBundler, McpBundlerServerAdapter } from '@kunobi/mcp-bundler';

const bundler = new McpBundler({
  name: 'my-server',
  transport: {
    type: 'http',
    url: 'http://127.0.0.1:3030/mcp',
  },
  reconnect: { enabled: true, intervalMs: 5_000, maxRetries: Infinity },
});

const adapter = new McpBundlerServerAdapter(bundler, {
  toolPrefix: 'my-server__',
  promptPrefix: 'my-server__',
  mapResource: (resource) => ({
    name: `my-server__${resource.name}`,
    uri: `my-server://resource/${encodeURIComponent(resource.uri)}`,
  }),
});

bundler.on('connected', async () => {
  await adapter.registerTools(server);
  await adapter.registerResources(server);
  await adapter.registerPrompts(server);
});

bundler.on('disconnected', () => {
  adapter.unregisterTools(server);
  adapter.unregisterResources(server);
  adapter.unregisterPrompts(server);
});

bundler.on('tools_changed', async () => {
  adapter.unregisterTools(server);
  await adapter.registerTools(server);
});

bundler.on('resources_changed', async () => {
  adapter.unregisterResources(server);
  await adapter.registerResources(server);
});

bundler.on('prompts_changed', async () => {
  adapter.unregisterPrompts(server);
  await adapter.registerPrompts(server);
});

await bundler.connect();

稳定的代理可以在短暂的下游断开连接期间保持最后已知的注册可见,并依赖于 callTool / readResource / getPrompt 按需重新连接。如果你想要使用寿命更长的曲面,请在适配器层中取消取消对寄存器的抖动,而不是在第一次传输时删除所有内容。

API

new McpBundler(options)

选项 类型 默认值 描述
name string 必需 日志记录标识符
transport McpTransportConfig 必需 下游MCP传输配置(http 或 stdio)
reconnect.enabled boolean true 断开连接时自动重新连接
reconnect.intervalMs number 5000 重新连接尝试之间的延迟
reconnect.maxRetries number Infinity 最大重新连接尝试次数
logger function 没有行动 (level, message, data?) => void

方法

连接

  • connect() --连接到远程服务器
  • reconnectNow() --取消任何挂起的重新连接计时器,并立即重试
  • close() --断开并停止重新连接
  • getState() --获取连接状态(idle, connecting, connected, disconnected)

元数据和转发

  • listTools() --从下游服务器获取当前工具列表
  • getToolDefinitions() --获取缓存的完整下游工具定义
  • getTools() --获取缓存的工具名称
  • callTool(name, args?) --将工具调用直接转发到下游服务器
  • listResources() --从下游服务器获取当前资源列表
  • getResourceDefinitions() --获取缓存的完整下游资源定义
  • getResources() --获取缓存的资源URI
  • readResource(uri) --直接读取下游资源
  • listPrompts() --从下游服务器获取当前提示列表
  • getPromptDefinitions() --获取缓存的完整下游提示定义
  • getPrompts() --获取缓存的提示名称
  • getPrompt(name, args?) --直接获取下游提示

new McpBundlerServerAdapter(bundler, options?)

当您想在本地重新注册捆绑服务器时,请使用可选的服务器适配器 McpServer.

选项 类型 默认值 描述
toolPrefix string "" 应用于重新导出的工具名称的前缀
promptPrefix string "" 应用于重新导出的提示名称的前缀
mapToolName (tool) => string -- 完全控制本地工具名称
mapPromptName (prompt) => string -- 完全控制本地提示符名称
mapResource (resource) => { name, uri, ... } identity 完全控制本地资源名称和URI

适配器方法

  • registerTools(server) --在本地注册缓存的下游工具 McpServer
  • unregisterTools(server) --删除此适配器以前注册的工具
  • registerResources(server) --在本地注册缓存的下游资源 McpServer
  • unregisterResources(server) --删除此适配器以前注册的资源
  • registerPrompts(server) --在本地上注册缓存的下游提示 McpServer
  • unregisterPrompts(server) --删除此适配器以前注册的提示

事件

  • connected --已建立连接
  • disconnected --连接丢失
  • tools_changed --远程工具列表已更改
  • resources_changed --远程资源列表已更改
  • prompts_changed --远程提示列表已更改

所有这三个 *_changed 事件由MCP驱动 listChanged 通知——bundler订阅下游服务器,并在它们发出更改信号时自动刷新。

发展

pnpm install
pnpm build
pnpm test