多工作区代码代理服务器

Multi-Workspace MCP Server 是一个允许编码代理在单个会话中访问多个配置的存储库工作区的工具,特别适用于跨平台开发项目。

  • by EtienneBBeaulac
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 EtienneBBeaulac/workspace-mcp

使用说明

多工作区MCP服务器

使编码代理能够从单个会话访问配置的存储库工作区,特别是当前项目工作区之外的伴随存储库。

问题解决了

AI编码代理通常仅限于一个工作空间。在开发跨平台功能时(例如,Android/Kotlin和iOS/Swift上的FlowCoordinator),代理在切换平台时会丢失所有上下文。此MCP服务器允许代理同时访问两个存储库,从而实现:

  • 将Kotlin功能移植到Swift(反之亦然),而不会丢失上下文
  • 在Android Studio中工作时阅读iOS代码以学习惯例
  • 直接在iOS仓库中生成Swift文件
  • 在不离开当前代理会话的情况下搜索和检查另一个仓库

提供的工具

read_crossproject

从以下位置读取文件 已配置的工作区根目录 --通常是当前项目工作区之外的配套仓库。对于当前工作区中的文件,更喜欢IDE内置的读取/导航工具。默认情况下,最多返回500行,其中包含行号和元数据(totalLines, startLine, endLine, truncated).使用 offset/limit 分页。

read_crossproject(workspace: "ios", path: "Modules/Messaging/Sources/MessagingCoordinator/StreamState.swift")
read_crossproject(workspace: "ios", path: "Modules/.../LargeFile.swift", offset: 100, limit: 50)

write_crossproject

在中创建或覆盖文件 已配置的工作区根目录 --通常是通过此MCP公开的另一个回购,而不是当前的项目。对于当前工作区文件,更喜欢IDE内置的编辑/重构工具。如果 writeAllowlist 已配置,只有匹配的路径是可写的。

write_crossproject(
  workspace: "ios",
  path: "Modules/Messaging/Sources/MessagingCoordinator/v2/KeyReducer.swift",
  content: "// Swift code here"
)

list_crossproject

列出文件和目录 已配置的工作区根目录,通常是外部或配套的仓库,而不是当前的项目工作区。返回元数据(类型、大小、修改日期),并支持递归树列表。

list_crossproject(workspace: "ios", path: "Modules/Messaging/Sources")
list_crossproject(workspace: "ios", path: "Modules", recursive: true, maxDepth: 2)

search_crossproject

在文件中搜索文本/正则表达式 已配置的工作区根目录,通常是当前项目工作区之外的配套仓库。在当前工作区中应用IDE的内置代码导航/LSP工具时,更喜欢它们。支持输出模式(content, files, count)、上下文行、路径范围(目录或文件)和分页。

search_crossproject(workspace: "ios", pattern: "FlowCoordinator", glob: "**/*.swift")
search_crossproject(workspace: "ios", pattern: "class.*Coordinator", path: "Modules/Messaging", outputMode: "files")

edit_crossproject

对中的一个或多个文件应用搜索和替换编辑 已配置的工作区根目录,通常用于当前项目工作区之外的配套存储库。对于当前工作区中的键入更改,更喜欢IDE的内置重构/编辑工具。支持带有反向引用的正则表达式。

// Single file
edit_crossproject(
  workspace: "ios",
  paths: "Modules/.../MyFile.swift",
  oldString: "func oldName()",
  newString: "func newName()",
)

// Multiple files (same replacement applied to all)
edit_crossproject(
  workspace: "ios",
  paths: ["FileA.swift", "FileB.swift", "FileC.swift"],
  oldString: "oldValue",
  newString: "newValue",
  replaceAll: true,
)

// Regex with backreferences
edit_crossproject(
  workspace: "ios",
  paths: "Modules/.../MyFile.swift",
  oldString: "func (\\w+)\\(param: String\\)",
  newString: "func $1(param: Int)",
  useRegex: true,
)

run_crossproject

在中运行shell命令 已配置的工作区根目录。支持管道、重定向和链式命令。返回stdout、stderr和退出代码。用于构建工具、代码生成器、git操作或需要在工作区目录中运行的任何命令。

run_crossproject(workspace: "ios", command: "git status")
run_crossproject(workspace: "ios", command: "fastlane ios codegen_messaging")
run_crossproject(workspace: "android", command: "./gradlew :messaging:impl:test")
run_crossproject(workspace: "ios", command: "git log --oneline | head -5", timeout: 10000)

配置

创建一个 workspace-config.json 在repo根目录中(请参见 workspace-config.example.json):

{
  "workspaces": {
    "ios": {
      "root": "$HOME/git/zillow/ZillowMap",
      "name": "iOS (ZillowMap)"
    }
  }
}

默认情况下,代理可以在工作区根目录下写入任何文件并运行任何命令。要限制其中之一,请添加可选的allowlists:

{
  "workspaces": {
    "ios": {
      "root": "$HOME/git/zillow/ZillowMap",
      "name": "iOS (ZillowMap)",
      "writeAllowlist": ["Modules/**/*.swift", "Tests/**/*.swift"],
      "runAllowlist": ["git", "fastlane", "xcodebuild", "swift"]
    }
  }
}
  • writeAllowlist (可选):球状图案。如果省略,则允许所有写入。控制 write_crossproject 和 edit_crossproject.
  • runAllowlist (可选):命令前缀。如果省略,则允许所有命令。控制 run_crossproject当配置时,命令的第一个单词必须与前缀之一匹配(例如。, "git status" 火柴 "git").

支持 $HOME 和 ~ 扩展在 root 路径。没有硬编码的默认值——所有工作区都必须在此文件中定义。如果缺少,服务器将从零工作区开始并记录指令。

安装

npm install -g @exaudeus/workspace-mcp

Firebender注册

添加 ~/.firebender/firebender.json:

{
  "mcpServers": {
    "workspace": {
      "command": "npx",
      "args": ["-y", "@exaudeus/workspace-mcp"]
    }
  }
}

或者,如果全局安装:

{
  "mcpServers": {
    "workspace": {
      "command": "workspace-mcp"
    }
  }
}

使用模式

  1. 代理读取Android Kotlin文件: read_file("libraries/illuminate/flow-coordinator/v2/KeyReducer.kt")
  2. 代理读取iOS惯例: read_crossproject("ios", "Modules/Messaging/Sources/MessagingCoordinator/SubjectCoordinator.swift")
  3. 代理引用Rosetta映射:(阅读 .firebender/rosetta-kotlin-swift.md 在Android工作区中)
  4. Agent生成Swift等效项
  5. 代理人写道: write_crossproject("ios", "Modules/.../KeyReducer.swift", content)

所有这些都在一个会话中,没有上下文丢失。

配套项目

  • 存储器MCP: memory-mcp --AI代理的持久代码库知识(独立仓库)
  • 罗塞塔规则: .firebender/rosetta-kotlin-swift.md 在Android工作区中--习语映射参考

发展

# Install dependencies
npm install

# Build
npm run build

# Run in dev mode
npm run dev

# Run tests
npm test

安全特性

无状态安全模型

MCP使用 无状态验证 代替会话跟踪-无需管理脆弱状态:

编辑安全:

  • 在编辑之前验证旧字符串是否存在(每次读取新文件)
  • 强制唯一性(除非replaceAll=true)
  • 如果找不到字符串或字符串不唯一,则会快速失败并出现明显错误
  • 无需“先阅读”-验证是安全检查

写安全:

  • 覆盖现有文件(记录到stderr)时发出警告
  • 如果有意(未被阻止),代理仍然可以覆盖
  • 可选的 writeAllowlist 限制对匹配路径的写入(省略以允许全部)

为什么是无国籍?

  • 无会话状态=重启/重新连接时没有脆弱性
  • 始终从磁盘读取新数据(捕获外部更改)
  • 跨多个代理/会话工作
  • 自我记录(失败说明问题所在)

其他安全功能

  • 写满列表(可选):配置后,只允许写入与满列表模式匹配的路径
  • 路径验证:验证解析的路径是否位于工作区根目录内(防止目录遍历)
  • 壳体防喷:所有外部命令都使用 execFile 带参数数组(无shell插值)
  • 审计日志:记录到stderr的所有写入/编辑操作

未来的增强功能

  • Git操作(git_crossproject)
  • 附加工作区(后端仓库等)
  • 自动上下文加载(注入 .firebender/platform-context.md 首次访问时)