MCP-Launcher 是一个用于克隆、构建和启动 MCP (Model Collaboration Protocol) 服务器的工具。它通过自动化处理仓库克隆、Docker 镜像构建和容器创建的过程,简化了 MCP 服务器的部署。
- 自动从 GitHub 等源克隆 MCP 服务器代码
- 自动构建 Docker 镜像
- 创建并运行 Docker 容器
- 支持插件系统进行功能扩展
- 提供完整的日志记录
- Go 1.19 或更高版本
- Docker
- Git
- 克隆本仓库:
git clone https://github.com/moeru-ai/mcp-launcher.git
cd mcp-launcher
- 安装依赖:
go mod download
基本用法:
go run ./cmd/mcp-launcher [仓库URL] -d [子目录]
例如:
go run ./cmd/mcp-launcher https://github.com/browserbase/mcp-server-browserbase -d stagehand
参数说明:
[仓库URL]
: MCP 服务器代码的仓库地址-d, --directory
: 可选,指定仓库中包含 MCP 服务器入口点的子目录
go build -o mcp-launcher ./cmd/mcp-launcher
mcp-launcher/
├── cmd/ # 命令行应用入口
│ └── mcp-launcher/ # 主命令实现
├── internal/ # 内部包
│ ├── metadata/ # 元数据处理
│ └── plugins/ # 内部插件实现
├── pkg/ # 公共包
│ ├── jsonpatch/ # JSON补丁工具
│ ├── pluginregistry/ # 插件注册系统
│ ├── plugins/ # 插件接口
│ ├── rules/ # 规则定义
│ └── utils/ # 工具函数
└── docs/ # 文档
MCP-Launcher 提供了一个强大而灵活的插件系统,这是项目的核心特色之一。插件系统允许在部署流程的不同阶段注入自定义逻辑,从而支持各种不同的 MCP 服务器实现。
插件系统定义了四个主要的生命周期钩子点:
-
BeforeClone: 在克隆仓库前执行
- 可用于准备环境、验证参数或执行预检查
- 实现
PluginBeforeClone
接口
-
AfterClone: 在克隆仓库后执行
- 常用于对克隆的代码进行修改或配置调整
- 实现
PluginAfterClone
接口
-
BeforeBuild: 在构建 Docker 镜像前执行
- 用于调整 Dockerfile 或项目构建配置
- 实现
PluginBeforeBuild
接口
-
AfterBuild: 在构建 Docker 镜像后执行
- 用于镜像后处理或元数据收集
- 实现
PluginAfterBuild
接口
每个插件可以实现一个或多个这些接口,基于需要介入的流程阶段。
所有插件接口继承自基础 Plugin
接口,并提供两个关键方法:
// 示例:AfterClone 接口
type PluginAfterClone interface {
Plugin
// 判断插件是否应该处理当前请求
ShouldHandleAfterClone(ctx context.Context) (bool, error)
// 实际执行的逻辑
AfterClone(ctx context.Context) error
}
这种设计允许插件自决定是否应该处理特定请求,提供了很高的灵活性。
MCP-Launcher 提供了一个基于规则的插件框架(RulesPlugin
),简化了插件开发。这个框架支持:
- 精确匹配规则:匹配完全相同的仓库 URL
- 模式匹配规则:使用 glob 模式匹配仓库 URL
规则可以被赋予不同的优先级,较高优先级的规则会先被评估。
为了方便插件修改配置文件,MCP-Launcher 提供了 jsonpatch
包,支持三种操作:
- Add: 添加新字段或值
- Remove: 移除字段
- Replace: 替换现有值
-
StageHandMCPServerPlugin:
- 针对 browserbase 的 MCP 服务器
- 在克隆后修改 package.json,移除 prepare 脚本并添加 start 脚本
- 使用规则确保只处理特定仓库 URL
-
SearchAPIMCPServerPlugin:
- 用于 fatwang2 的搜索 API MCP 服务器
- 类似地修改 package.json 配置
- 针对不同的仓库 URL 和构建路径
插件间通过 Context 共享元数据,包括:
- 仓库 URL
- 克隆路径
- 子目录设置
- Docker 信息(镜像哈希、容器哈希等)
这确保了插件可以访问和修改整个流程中的关键信息。
- 在
internal/plugins/mcp/sources/
目录下为特定源创建插件文件 - 实现所需的生命周期接口
- 使用基于规则的插件框架简化匹配逻辑
- 在
internal/plugins/plugins.go
中注册插件
// 简化示例
type MyCustomPlugin struct {
repositoryurlrules.RulesPlugin
}
func NewMyCustomPlugin() *MyCustomPlugin {
return &MyCustomPlugin{
RulesPlugin: repositoryurlrules.Rules(
repositoryurlrules.ForExact("https://github.com/myorg/my-repo"),
),
}
}
func (p *MyCustomPlugin) ShouldHandleAfterClone(ctx context.Context) (bool, error) {
return p.ShouldHandle(ctx, metadata.FromContext(ctx).RepositoryURL), nil
}
func (p *MyCustomPlugin) AfterClone(ctx context.Context) error {
// 自定义逻辑实现
// ...
return nil
}
- 在
internal/plugins/mcp/sources/
目录下为特定源创建新插件 - 在
internal/plugins/plugins.go
中注册该插件
插件需要实现 pkg/plugins
中定义的相关接口,如 PluginBeforeClone
、PluginAfterClone
等。
go test ./...
请查看项目中的 LICENSE 文件了解许可信息。