/mcp-launcher

【中文支持】🐳🧩 简单易用的 MCP 构建器与启动器,适用于各种 MCP 服务器,就像 Ollama 管理大模型一样!

Primary LanguageGo

MCP-Launcher

MCP-Launcher 是一个用于克隆、构建和启动 MCP (Model Collaboration Protocol) 服务器的工具。它通过自动化处理仓库克隆、Docker 镜像构建和容器创建的过程,简化了 MCP 服务器的部署。

功能特点

  • 自动从 GitHub 等源克隆 MCP 服务器代码
  • 自动构建 Docker 镜像
  • 创建并运行 Docker 容器
  • 支持插件系统进行功能扩展
  • 提供完整的日志记录

快速开始

前置要求

  • Go 1.19 或更高版本
  • Docker
  • Git

安装

  1. 克隆本仓库:
git clone https://github.com/moeru-ai/mcp-launcher.git
cd mcp-launcher
  1. 安装依赖:
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 服务器实现。

插件生命周期

插件系统定义了四个主要的生命周期钩子点:

  1. BeforeClone: 在克隆仓库前执行

    • 可用于准备环境、验证参数或执行预检查
    • 实现 PluginBeforeClone 接口
  2. AfterClone: 在克隆仓库后执行

    • 常用于对克隆的代码进行修改或配置调整
    • 实现 PluginAfterClone 接口
  3. BeforeBuild: 在构建 Docker 镜像前执行

    • 用于调整 Dockerfile 或项目构建配置
    • 实现 PluginBeforeBuild 接口
  4. AfterBuild: 在构建 Docker 镜像后执行

    • 用于镜像后处理或元数据收集
    • 实现 PluginAfterBuild 接口

每个插件可以实现一个或多个这些接口,基于需要介入的流程阶段。

插件接口设计

所有插件接口继承自基础 Plugin 接口,并提供两个关键方法:

// 示例:AfterClone 接口
type PluginAfterClone interface {
    Plugin
    
    // 判断插件是否应该处理当前请求
    ShouldHandleAfterClone(ctx context.Context) (bool, error)
    
    // 实际执行的逻辑
    AfterClone(ctx context.Context) error
}

这种设计允许插件自决定是否应该处理特定请求,提供了很高的灵活性。

基于规则的插件

MCP-Launcher 提供了一个基于规则的插件框架(RulesPlugin),简化了插件开发。这个框架支持:

  1. 精确匹配规则:匹配完全相同的仓库 URL
  2. 模式匹配规则:使用 glob 模式匹配仓库 URL

规则可以被赋予不同的优先级,较高优先级的规则会先被评估。

JSON补丁工具

为了方便插件修改配置文件,MCP-Launcher 提供了 jsonpatch 包,支持三种操作:

  • Add: 添加新字段或值
  • Remove: 移除字段
  • Replace: 替换现有值

已实现的插件示例

  1. StageHandMCPServerPlugin

    • 针对 browserbase 的 MCP 服务器
    • 在克隆后修改 package.json,移除 prepare 脚本并添加 start 脚本
    • 使用规则确保只处理特定仓库 URL
  2. SearchAPIMCPServerPlugin

    • 用于 fatwang2 的搜索 API MCP 服务器
    • 类似地修改 package.json 配置
    • 针对不同的仓库 URL 和构建路径

元数据共享

插件间通过 Context 共享元数据,包括:

  • 仓库 URL
  • 克隆路径
  • 子目录设置
  • Docker 信息(镜像哈希、容器哈希等)

这确保了插件可以访问和修改整个流程中的关键信息。

自定义插件开发

创建新插件的步骤

  1. internal/plugins/mcp/sources/ 目录下为特定源创建插件文件
  2. 实现所需的生命周期接口
  3. 使用基于规则的插件框架简化匹配逻辑
  4. 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
}

开发

添加新插件

  1. internal/plugins/mcp/sources/ 目录下为特定源创建新插件
  2. internal/plugins/plugins.go 中注册该插件

插件需要实现 pkg/plugins 中定义的相关接口,如 PluginBeforeClonePluginAfterClone 等。

运行测试

go test ./...

许可证

请查看项目中的 LICENSE 文件了解许可信息。