Gemini CLI上线插件系统

前言

小伙伴们大家好,我是小溪,见字如面。在不久前Gemini CLI终于上线了插件系统,终于开始缓慢追赶Claude Code CLI的脚步了,至此我们也终于可以使用大佬们的插件,共享我们的插件了。

Gemini CLI更新日志:github.com/google-gemi...

对往期内容感兴趣的小伙伴也可以看往期内容:

当前使用版本

Gemini CLI:0.13.0

优势

  • 插件系统目前支持打包 MCP、上下文文件 和 自定义命令 3种配置

Gemini CLI Extension简介

Gemini CLI围绕Extension扩展构建了插件系统,它可以将 MCP服务、上下文文件 以及 自定义命令 打包成一个简单软件包,当软件包被安装到 Gemini CLI 中就可以让 Gemini 使用各种工具。Gemini CLI Extension目前已有100多款插件,包含 Context7、Nano Banana等爆火的插件。

Gemini CLI Extension官方地址:geminicli.com/extensions/

基本使用

CLI命令

Gemini CLI命令行工提供了一系列extension的管理命令,在命令行直接输入 gemini extensions -h 可以查看extensions所有命令

  • install:从Git仓库或者本地路径安装插件
  • uninstall:卸载指定名称的插件
  • list:查看当前安装的插件
  • update:更新所有或者指定插件
  • disable:禁用插件
  • enable:启用插件
  • link:从本地路径链接一个插件
  • new:从模板创建一个插件
  • validate:从本地路径验证一个插件

安装插件

在Gemini CLI Extension平台查找自己需要的插件,这里我以 Nano Banana 为例

点击查看详情,复制Extension安装命令

完整命令如下:

php 复制代码
$ gemini extensions install https://github.com/gemini-cli-extensions/nanobanana

在命令行终端执行安装命令,遇到权限问题,根据提示选择允许

详细信息可以在 ~/.gemini/extensions中查看

启动Gemini CLI,在交互式命令中输入以下命令查看以已安装的插件

bash 复制代码
/extensions list

然后在Gemini CLI中就可以查看 Nano Banana 提供的MCP和自定义命令了

Nano Banana指令:

  • /generate:单张或多张带有风格 / 变体选项的图像生成
  • /edit:图像编辑
  • /restore:图像修复
  • /icon:生成多种尺寸的应用图标、网站图标和 UI 元素
  • /pattern:生成用于背景的无缝图案和纹理
  • /story:生成讲述视觉故事或流程的连续图像
  • /diagram:生成技术图表、流程图和建筑模型图
  • /nanobanana:使用自然语言生成或处理图片

插件使用

以 Nano Banana 为例,我们可以使用模型推理自行调用

bash 复制代码
我正在创办一家名为 "Kicks" 的鞋业公司,你能帮我设计一个视觉上有吸引力的icon/logo

也可以使用 Nano Banana 提供的MCP和自定义命令调用,Nano Banana 调用目前不报错,可以不用理会

再以 Chrome Devtools MCP为例,输入命令进行安装

shell 复制代码
$ gemini extensions install https://github.com/ChromeDevTools/chrome-devtools-mcp

安装完成后重启Gemini CLI,在交互式命令中输入 /mcp,可以看到刚刚通过插件安装的 chrome-devtools MCP服务

输入提示词即可使用

管理插件

Gemini CLI提供了 交互命令 和 CLI命令 2种管理插件的方式

1)交互命令

在交互式命令中输入 /extensions 可以查看插件系统提供的管理命令

  • list:列出活跃的扩展程序
  • update:更新扩展程序
  • explore:在浏览器中打开扩展程序页面

使用 /extensions list 可以查看所有安装的插件

使用 /extensions update 可以更新所有插件或者更新指定插件

使用 /extensions explore 会打开Gemini CLI Extensions官网。

2)CLI命令

使用 gemini extensions list 可以查看详细的插件信息,包括 插件路径、来源、版本、启用禁用状态、提供的功能 等信息

使用 gemini extensions uninstall 可卸载插件

php 复制代码
$ gemini extensions uninstall nanobanana

使用 gemini extensions update 可更新插件

php 复制代码
# 更新指定插件
$ gemini extensions update nanobanana
# 更新所有插件
$ gemini extensions update --all

使用 gemini extensions enable|disable 可启用禁用插件,本人尝试的不起作用

shell 复制代码
# 禁用插件
$ gemini extensions disable nanobanana
# 全局禁用插件
$ gemini extensions disable --scope user nanobanana
# 项目禁用插件
$ gemini extensions disable --scope project nanobanana

自定义插件

创建插件模板

Gemini CLI提供了创建插件命令,命令格式如下:

arduino 复制代码
$ gemini extensions new [template]
  • path:插件的路径
  • template:模版类型,可选值:"context"、"custom-commands"、"exclude-tools"、"mcp-server"

接着创建我们的第一个自定义插件项目,我这里在工作区路径,直接在当前工作区项目同级目录创建自定义插件项目了

php 复制代码
$ gemini extensions new ../my-first-extension mcp-server

创建完成后,可以看到目录结构如下,其实就是创建了一个带有Gemini CLI插件配置文件 gemini-extension.json 的NodeJS项目

插件配置文件

Gemini CLI自定义插件配置文件为 gemini-extension.json,一个完整的自定义插件配置如下:

bash 复制代码
{
  "name": "<插件名称>",
  "version": "<插件版本>",
  "contextFileName": "<上下文文件>",
  "excludeTools": ["run_shell_command"]
  "mcpServers": { # MCP配置
    "nodeServer": {
      "command": "node",
      "args": ["${extensionPath}${/}dist${/}example.js"],
      "cwd": "${extensionPath}"
    }
  }
}
  • name :扩展程序的名称
  • version :扩展程序的版本
  • mcpServers :MCP 服务配置,如果扩展程序和 settings.json 文件都配置了同名的MCP服务器,则 settings.json 文件中定义的服务器优先
    • command:脚本运行的核心命令
    • args:脚本运行的参数数组
    • cwd:脚本运行时的工作目录
  • contextFileName :包含扩展上下文的文件的名称
  • excludeTools :要从模型中排除的工具名称数组,例如: "excludeTools": ["run_shell_command(rm -rf)"] 将阻止 rm -rf 命令

自定义MCP服务

上面 mcp-server 命令创建的模板已经自带了一个MCP服务示例,示例代码如下:

javascript 复制代码
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
const server = new McpServer({
  name: 'prompt-server',
  version: '1.0.0',
});
server.registerTool(
  'fetch_posts',
  {
    description: 'Fetches a list of posts from a public API.',
    inputSchema: z.object({}).shape,
  },
  async () => {
    const apiResponse = await fetch(
      'https://jsonplaceholder.typicode.com/posts',
    );
    const posts = await apiResponse.json();
    const response = { posts: posts.slice(0, 5) };
    return {
      content: [
        {
          type: 'text',
          text: JSON.stringify(response),
        },
      ],
    };
  },
);
server.registerPrompt(
  'poem-writer',
  {
    title: 'Poem Writer',
    description: 'Write a nice haiku',
    argsSchema: { title: z.string(), mood: z.string().optional() },
  },
  ({ title, mood }) => ({
    messages: [
      {
        role: 'user',
        content: {
          type: 'text',
          text: `Write a haiku${mood ? ` with the mood ${mood}` : ''} called ${title}. Note that a haiku is 5 syllables followed by 7 syllables followed by 5 syllables `,
        },
      },
    ],
  }),
);
const transport = new StdioServerTransport();
await server.connect(transport);

修改 package.json 配置文件,添加MCP调试代码配置

perl 复制代码
{
  "name": "mcp-server-example",
  "version": "1.0.0",
  "description": "Example MCP Server for Gemini CLI Extension",
  "type": "module",
  "main": "example.js",
  "scripts": {
    "dev": "npx -y @modelcontextprotocol/inspector node dist/example.js",
    "build": "tsc"
  },
  "devDependencies": {
    "typescript": "~5.4.5",
    "@types/node": "^20.11.25"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.11.0",
    "zod": "^3.22.4"
  }
}

执行 npm run build 编译TS,然后执行下面命令启动MCP调试服务

arduino 复制代码
$ npm run dev

服务启动完成,点击调试服务链接在浏览器中打开

点击【Connect】连接本地MCP服务

选择【Tools】测试一下MCP服务是否正常

无误后,使用 gemini extensions validate 验证一下插件的有效性

shell 复制代码
$ gemini extensions validate ../my-first-extension 

验证成功后即可使用 gemini extensions install 安装,也可以使用 gemini extensions link 进行符号链接(符号链接的好处就是任何更改都会立即生效,无需重新安装),我这里使用 gemini extensions link 演示

shell 复制代码
$ gemini extensions link ../my-first-extension

安装或者链接成功后,就可以使用 gemini extensions list 查看到我们自定义的插件了

自定义上下文

在自定义插件目录新建一个 GEMINI.md 目录用于存放自定义上下文内容

sql 复制代码
# My First Extension Instructions
You are an expert developer assistant. When the user asks you to fetch
posts, use the `fetch_posts` tool. Be concise in your responses.

配置完成后,更新 gemini-extension.json 文件,指定 contextFileName 属性

bash 复制代码
{
  "name": "mcp-server-example",
  "version": "1.0.0",
  "mcpServers": {
    "nodeServer": {
      "command": "node",
      "args": ["${extensionPath}${/}dist${/}example.js"],
      "cwd": "${extensionPath}"
    }
  },
  "contextFileName": "GEMINI.md"
}

使用 gemini extensions list 可以看到刚刚添加的上下文信息

启动Gemini CLI,在交互式命令中输入 /memory show 可以查看具体的上下文内容,此时已经包含了自定义插件中的上下文了

自定义命令

在自定义插件目录新建一个 commands目录用于存放自定义命令,自定义命令文档可以查看官方文档:geminicli.com/docs/cli/cu...

shell 复制代码
$ mkdir commands

创建一个 hello.toml 文件用于第一个自定义命令,并配置命令

ini 复制代码
prompt = "输出礼貌问候语并以`*_*`开始"

再创建一个 fs 子命令目录,创建一个 grep-code.toml 文件

shell 复制代码
$ mkdir fs
$ touch fs/grep-code.toml

输入提示词保存

ini 复制代码
prompt = """
Please summarize the findings for the pattern `{{args}}`.
Search Results:
!{grep -r {{args}} .}
"""

目录结构如下:

重启Gemini CLI,在交互式命令中输入 / 在命令列表看到自定义的命令

直接调用自定义命令即可执行

常见问题

MCP授权失败

根据提示可知,调用 Nano Banana MCP 需要导出API Key,Github上也有对应的描述

Nano Banana Github地址:github.com/gemini-cli-...

我使用的是Gemini API Key,在命令行终端导出 GEMINI_API_KEY

ini 复制代码
export GEMINI_API_KEY=your api key

MCP调用失败

Nano Banana调用尚有问题,Github Issue:github.com/gemini-cli-...

友情提示

见原文:Gemini CLI上线插件系统

本文同步自微信公众号 "程序员小溪" ,这里只是同步,想看及时消息请移步我的公众号,不定时更新我的学习经验。友情提示友情提示

相关推荐
却尘1 小时前
当你的 MCP 服务器上云后崩了:深度解析 Transport 限制与高级特性
aigc·ai编程·mcp
是店小二呀5 小时前
Doubao-Seed-Code 打造一个专属的规划平台
人工智能·aigc·doubao
逻极11 小时前
云智融合:AIGC与云计算服务新范式(深度解析)
人工智能·云计算·aigc·云服务
GeeLark12 小时前
Threads 自动化出炉
ai·自动化·aigc
墨风如雪14 小时前
告别高配!HunyuanVideo 1.5:腾讯混元开启视频生成新纪元
aigc
小溪彼岸16 小时前
Claude Code CLI更新又又又报错了?快来试试官方原生安装方式
aigc·claude
小溪彼岸17 小时前
对新手小白友好的Codex官方可视化编程插件
aigc·ai编程
用户51914958484517 小时前
C#扩展成员全面解析:从方法到属性的演进
人工智能·aigc
趣浪吧20 小时前
AI在手机上真没用吗?
人工智能·智能手机·aigc·音视频·媒体