|
| 1 | +好的,这是为您准备的一份详细的 `README.md` 文件。 |
| 2 | + |
| 3 | +它涵盖了 `mcp-server` 的设计理念、架构、与 `gemini-cli` 生态系统的交互、认证机制、配置选项,并特别强调了您要求的关于最小化修改、遥测和隐私声明的要点。 |
| 4 | + |
| 5 | +您可以将此内容保存为 `packages/mcp-server/README.md`。 |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +# Gemini CLI - MCP / OpenAI Bridge Server (`@google/gemini-mcp-server`) |
| 10 | + |
| 11 | +`@google/gemini-mcp-server` 是一个多功能的服务器应用程序,旨在作为 `gemini-cli` 生态系统的强大扩展。它主要承担两个核心角色: |
| 12 | + |
| 13 | +1. **MCP (Model-Context Protocol) 服务器**: 它为 `gemini-cli` 托管和暴露了一系列强大的内置工具(例如 `google_web_search`),允许 `gemini-cli` 的核心模型通过一个标准的、可发现的协议来调用这些工具。 |
| 14 | + |
| 15 | +2. **OpenAI 兼容的 API 桥接器**: 它提供了一个与 OpenAI Chat Completions API 兼容的端点。这使得任何支持 OpenAI API 的第三方工具或应用程序(例如 [Open WebUI](https://github.com/open-webui/open-webui))都可以无缝地与 `gemini-cli` 的底层 Gemini 模型进行交互,包括利用流式响应。 |
| 16 | + |
| 17 | +## 核心设计理念 |
| 18 | + |
| 19 | +这个服务器的核心设计原则是 **最小化修改和最大化复用**。它并不是对 `gemini-cli` 功能的重新实现,而是巧妙地构建在 `@google/gemini-cli-core` 包之上。 |
| 20 | + |
| 21 | +通过重用 `core` 包中的 `Config` 和 `GeminiClient` 类,`mcp-server` 继承了 `gemini-cli` 所有的核心业务逻辑、工具执行能力和配置管理机制。这种设计确保了行为的一致性,并使得维护和扩展变得更加简单。 |
| 22 | + |
| 23 | +## 功能特性 |
| 24 | + |
| 25 | +- **托管原生 `gemini-cli` 工具**: 通过 MCP 协议,将 `gemini-cli` 的内置工具(如文件系统操作、网页抓取、网络搜索等)暴露给 `gemini-cli` 模型。 |
| 26 | +- **OpenAI API 兼容性**: 提供 `/v1/chat/completions` 和 `/v1/models` 端点,允许第三方应用程序像与 OpenAI 对话一样与 Gemini 模型交互。 |
| 27 | +- **流式响应支持**: 完全支持流式响应,可以将 Gemini 模型的实时生成结果通过 SSE (Server-Sent Events) 推送给客户端。 |
| 28 | +- **灵活的模型配置**: 允许通过环境变量为服务器托管的工具(如 `google_web_search`)配置一个特定的、独立的默认 LLM 模型。 |
| 29 | + |
| 30 | +## 架构与交互流程 |
| 31 | + |
| 32 | +`mcp-server` 作为 `gemini-cli` 生态系统中的一个独立组件,其交互流程如下: |
| 33 | + |
| 34 | +1. **配置加载**: 服务器启动时,它会像主 `gemini-cli` 应用一样,加载用户和工作区的 `settings.json` 文件,并读取环境变量来初始化一个 `@google/gemini-cli-core` 的 `Config` 实例。 |
| 35 | +2. **认证**: 服务器**不处理**自己的认证流程。它完全依赖于 `gemini-cli` 已经建立的认证状态(详情见下一节)。 |
| 36 | +3. **MCP 服务**: 它启动一个 MCP 服务器,`gemini-cli` 在需要时可以连接到这个服务器来发现和执行工具。 |
| 37 | +4. **OpenAI 桥接**: 它启动一个 Express Web 服务器,监听 OpenAI 格式的 API 请求。 |
| 38 | +5. **请求处理**: |
| 39 | + - 当收到一个 OpenAI 格式的请求时,服务器会将其转换为 `gemini-cli-core` 可以理解的格式。 |
| 40 | + - 它使用复用的 `Config` 实例来获取一个 `GeminiClient`。 |
| 41 | + - 通过 `GeminiClient` 将请求发送给 Gemini API。 |
| 42 | + - 如果 Gemini API 的响应是流式的,服务器会将其转换为 OpenAI 兼容的 SSE 事件流;如果是非流式的,则返回一个完整的 JSON 响应。 |
| 43 | + |
| 44 | +## 认证机制 |
| 45 | + |
| 46 | +至关重要的是,`mcp-server` **不管理自己的认证凭据**。它与主 `gemini-cli` 工具共享相同的认证机制,以确保无缝和安全的操作。 |
| 47 | + |
| 48 | +认证凭据的来源遵循与 `gemini-cli` 完全相同的优先级和查找逻辑: |
| 49 | + |
| 50 | +- **缓存的凭据**: 如果您之前通过 `gemini-cli` 的交互式流程(例如 `gcloud auth application-default login` 或 OAuth 网页登录)登录过,`mcp-server` 会自动使用存储在 `~/.config/gcloud` 或 `~/.gemini` 目录下的缓存凭据。 |
| 51 | +- **环境变量**: 服务器会查找并使用标准的 Google Cloud 和 Gemini 环境变量,例如: |
| 52 | + - `GEMINI_API_KEY` |
| 53 | + - `GOOGLE_APPLICATION_CREDENTIALS` |
| 54 | + - `GOOGLE_CLOUD_PROJECT` |
| 55 | + |
| 56 | +这意味着,只要您的 `gemini-cli` 本身配置正确且可以工作,`mcp-server` 就能自动获得授权,无需任何额外的认证步骤。 |
| 57 | + |
| 58 | +## 配置选项 |
| 59 | + |
| 60 | +您可以通过命令行参数和环境变量来配置服务器的行为。 |
| 61 | + |
| 62 | +### 命令行参数 |
| 63 | + |
| 64 | +- `--port=<number>`: 指定服务器监听的端口。 |
| 65 | + - **默认值**: `8765` |
| 66 | +- `--debug`: 启用详细的调试日志输出。 |
| 67 | + |
| 68 | +### 环境变量 |
| 69 | + |
| 70 | +- `GEMINI_TOOLS_DEFAULT_MODEL`: 为服务器托管的工具(如 `google_web_search`)设置一个默认的 LLM 模型。 |
| 71 | + - **用途**: 当一个工具在执行过程中需要调用 LLM(例如,对搜索结果进行总结)时,它将使用此环境变量指定的模型。这允许您为主聊天和工具执行使用不同的模型,从而可能优化成本和速度。 |
| 72 | + - **示例**: `GEMINI_TOOLS_DEFAULT_MODEL=gemini-1.5-flash` |
| 73 | + |
| 74 | +## 使用方法 |
| 75 | + |
| 76 | +### 1. 安装与构建 |
| 77 | + |
| 78 | +在 `gemini-cli` 项目的根目录下,确保所有依赖已安装,并构建 `mcp-server` 包。 |
| 79 | + |
| 80 | +```bash |
| 81 | +# 在项目根目录运行 |
| 82 | +npm install |
| 83 | +npm run build --workspace=@google/gemini-mcp-server |
| 84 | +``` |
| 85 | + |
| 86 | +### 2. 启动服务器 |
| 87 | + |
| 88 | +您可以使用 `npm run start` 命令来启动服务器。 |
| 89 | + |
| 90 | +```bash |
| 91 | +# 启动服务器,使用默认配置 |
| 92 | +npm run start --workspace=@google/gemini-mcp-server |
| 93 | + |
| 94 | +# 在不同端口上启动,并启用调试模式 |
| 95 | +npm run start --workspace=@google/gemini-mcp-server -- --port=9000 --debug |
| 96 | + |
| 97 | +# 使用一个更快的模型进行工具调用 |
| 98 | +GEMINI_TOOLS_DEFAULT_MODEL=gemini-1.5-flash npm run start --workspace=@google/gemini-mcp-server |
| 99 | +``` |
| 100 | + |
| 101 | +服务器成功启动后,您将看到类似以下的输出: |
| 102 | + |
| 103 | +``` |
| 104 | +🚀 Gemini CLI MCP Server and OpenAI Bridge are running on port 8765 |
| 105 | + - MCP transport listening on http://localhost:8765/mcp |
| 106 | + - OpenAI-compatible endpoints available at http://localhost:8765/v1 |
| 107 | +⚙️ Using default model for tools: gemini-2.5-pro |
| 108 | +``` |
| 109 | + |
| 110 | +### 3. 测试端点 |
| 111 | + |
| 112 | +您可以使用 `curl` 或任何 API 客户端来测试服务器。 |
| 113 | + |
| 114 | +**测试 OpenAI Chat Completions (流式)**: |
| 115 | + |
| 116 | +```bash |
| 117 | +curl -N http://localhost:8765/v1/chat/completions \ |
| 118 | + -H "Content-Type: application/json" \ |
| 119 | + -d '{ |
| 120 | + "model": "gemini-pro", |
| 121 | + "messages": [{"role": "user", "content": "Tell me a short story about a robot who learns to paint."}], |
| 122 | + "stream": true |
| 123 | + }' |
| 124 | +``` |
| 125 | + |
| 126 | +## 遥测、服务条款和隐私 |
| 127 | + |
| 128 | +### 遥测 (Telemetry) |
| 129 | + |
| 130 | +`@google/gemini-mcp-server` 本身**不引入任何新的遥测或数据收集机制**。 |
| 131 | + |
| 132 | +它完全依赖于 `@google/gemini-cli-core` 包中内置的 OpenTelemetry (OTEL) 系统。因此,所有的遥测数据(如果启用)都将遵循 `gemini-cli` 的主配置,并被发送到 `settings.json` 文件中指定的目标。 |
| 133 | + |
| 134 | +关于如何配置和使用遥测,请参阅[主 Gemini CLI 遥测文档](../../docs/telemetry.md)。 |
| 135 | + |
| 136 | +### 服务条款 (Terms of Service) 和隐私声明 (Privacy Notice) |
| 137 | + |
| 138 | +本服务器的使用受制于您用于认证的 `gemini-cli` 账户类型所对应的服务条款和隐私政策。`@google/gemini-mcp-server` 作为一个桥接工具,本身不收集、存储或处理您的任何额外数据。 |
| 139 | + |
| 140 | +我们强烈建议您查阅[主 Gemini CLI 服务条款和隐私声明文档](../../docs/tos-privacy.md)以了解适用于您账户的详细信息。 |
| 141 | + |
| 142 | +--- |
| 143 | + |
| 144 | +### 开发者说明:关于包名 `@google/gemini-mcp-server` |
| 145 | + |
| 146 | +请注意,本包的名称 `@google/gemini-mcp-server` 反映了它作为官方 `google-gemini/gemini-cli` 的fork项目的 monorepo 内部组件的来源。 |
| 147 | + |
| 148 | +- **内部命名**: 在 `gemini-cli` 项目的源代码和工作区中,此命名是内部一致的。 |
| 149 | +- **非独立发布**: 此包**不会**作为一个独立的、版本化的包发布到公共 npm registry 上。如果您 fork 本项目并希望独立发布您的修改版本,您**必须**将包名更改为您自己的 scope(例如 `@your-username/gemini-mcp-server`),以遵守 npm 的包命名规范并避免混淆。 |
0 commit comments