SuperAPI AI 工具集

opengist-mcp

opengist-mcp 是面向 Opengist(基于 Git 的自托管 pastebin)的 Model Context Protocol(MCP)服务器。它让 Claude Code、Claude Desktop、Codex 等 MCP 客户端能够读取、搜索、创建、更新和删除自有 Opengist 实例上的 gist,涵盖文件内容与修订、提交历史、fork 和点赞,以及用户账户。工具总数为十四个,可通过 OPENGIST_ALLOW_TOOLS=essential 只注册精选的七个。该服务器基于 Opengist REST API(/api),要求 Node.js 22 或更高版本、启用 REST API 的 Opengist 实例,以及具有相应作用域的个人访问令牌。所有 gist 内容均被视为不可信输入,带有 untrusted 标记;文件内容有上限、二进制文件不以文本形式输出;删除 gist、删除文件及扩大可见性等不可逆操作会通过 MCP elicitation 向真人确认。

访问官网

工具介绍

opengist-mcp 是 Opengist 的 MCP(Model Context Protocol)服务器。Opengist 是自托管、由 Git 驱动的 pastebin。该服务器让 Claude Code、Claude Desktop、Codex 等 MCP 客户端可以对自己拥有的 Opengist 实例执行读取、搜索、创建、更新和删除 gist 等操作,包括文件内容与修订、提交历史、fork 与点赞,以及用户账户信息。

主要能力

  • 提供十四个工具,覆盖一个 API 表面,源自 Opengist REST API。功能包括读取、搜索、写入、fork 和点赞 gist,并涉及修订、提交历史和原始文件访问。
  • 可通过 OPENGIST_ALLOW_TOOLS=essential 注册精选的七个工具:list_gists、search_gists、get_gist、get_gist_file、create_gist、update_gist、delete_gist。说明指出,模型从七个工具中选对工具比从十四个中选更可靠。
  • 结果有界:每个文件内容有上限,并设有总体预算;二进制文件不会以文本形式输出;每次截断都会指明获取剩余内容的调用。
  • 结构化输出:每个工具声明 outputSchema,并在文本块之外返回 structuredContent,客户端无需解析散文即可使用结果。
  • 所有报告 gist 内容的工具都携带 untrusted: true 和 source: "opengist" 字段;check_gist_like、set_gist_like 和 delete_gist 三个工具不包含该标记,因为其返回完全是服务器自身的文字(给定 id 和布尔值)。

使用方式

前置条件

  • Node.js 22 或更高版本。
  • 启用 REST API 的 Opengist 实例(近期版本默认启用 api.enabled)。运行中的实例会在 GET /api/openapi.yaml 提供自己的 OpenAPI 规范。
  • Opengist 个人访问令牌(Settings → Access Tokens)。作用域包括:
    • gist:read:读取 gist,包括自己的私有和未列出 gist。
    • gist:write:创建、更新、删除和 fork gist。
    • user:read:读取自己的账户。
    • user:write:仅 set_gist_like 需要。
    • 没有 gist:read 的令牌仍然可用,但 API 会静默地只返回公共 gist,而不是报错。

令牌在启动时读取一次,然后从 process.env 中移除,因此对子进程不可见。非环回地址应使用 https://;在明文 http 下令牌和所有 gist 会以明文传输。如果实例的 external-url 未配置,Opengist 报告的 URL(以及本服务器透传的 URL)会指向 localhost,应在实例上设置 external-url / OG_EXTERNAL_URL 以使链接可用。

工具加载选择

OPENGIST_ALLOW_TOOLS 和 OPENGIST_DENY_TOOLS 接受逗号分隔的工具名,结尾的 * 匹配整个家族。essential 是精选的七个预设。匹配不到任何工具的条目会导致启动中止并指出该条目,因此拼写错误不会静默隐藏工具。被过滤的工具从不注册,因此在 tools/list 中不存在,tools/call 也未知,与 OPENGIST_READ_ONLY 下的写工具一样。

客户端配置

claude_desktop_config.json 及 ~/.codex/config.toml 等配置示例见官方文档。使用 stdio 传输时必须加 -i,不要添加 -t;TTY 会破坏协议流。

无法启动本地进程的客户端(ChatGPT connectors、Web 版 Claude、Cursor、LibreChat)可通过 mcp-hub 访问 opengist-mcp:一个容器通过 Streamable HTTP 服务多个 stdio MCP 服务器,带有 OAuth 2.1 登录(单一密码)以及为不支持 OAuth 的客户端提供的长期令牌。其 /hub 端点将每个服务器置于六个元工具之后。其 /config/mcp.json 使用 Claude Code 格式。其中 allowTools 和 denyTools 是 hub 自身的每服务器过滤器,与 env 中的 *_ALLOW_TOOLS 不同。

安全与确认

  • 不可逆操作向真人询问:delete_gist、delete_gist_files 以及扩大 gist 可见性会在客户端支持时通过 MCP elicitation 弹出真实对话框,模型不能代为应答。客户端无法显示对话框时,首次调用被拒绝并返回随机一次性令牌,五分钟后过期;delete_gist_files 的批准绑定到确切的文件名集合,一个文件的批准不能重放用于删除其他文件。ELICITATION=false 会主动采用回退方案,但从不移除防护。
  • 发布内容也会被询问:创建公共或未列出 gist,以及向已是公共/未列出的 gist 写入文件,属于披露事件,两者都会在行动前询问。批准绑定到确切内容。一个调用同时将 gist 设为私有不算披露,不会被询问。
  • 确认在验证之后检查,确认提示从不引用 gist 文本,拒绝时只显示服务器端元数据(可见性、文件数、日期)。

写入防护

  • update_gist 不能删除文件:Opengist API 在条目为 null 或既无内容也无文件名时会删除文件,本服务器从不暴露原始文件映射,只接受显式 write/rename 操作,并在发送前断言没有条目会被解读为删除。未提及的文件保持不变。
  • 拼写错误不会静默复制文件:写入不存在的文件名会被拒绝,除非传入 allowCreate: true,拒绝时会指出大小写不敏感的近似匹配(readme.md 与 README.md)。

结果有界与输入处理

gist 内容为不可信输入,每个携带文件内容的响应都带有提示。结果有界:文件内容按每个文件及总体预算设限,提交和 fork 默认省略,二进制文件不以文本输出,每次截断都会报告以及获取剩余内容的调用。search_gists 会说明扫描了多少并明确标记不完整结果。

实例被读取但不被信任:每个响应经过一个边界——类型错误的字段缺失而非致命,计数有限,提交 id 在使用前具有正确形状,显示字符串被截断;每个离开的字符串都去除控制字符并修复孤立代理项,若涉及文件正文则按文件说明移除了多少字符。请求经过加固:拒绝重定向以防 bearer 令牌被重放到其他主机,每个请求都有超时,路径参数拒绝 .、.. 并进行 URL 编码,上游错误正文被截断且 HTML 错误页会被完全丢弃。

残余风险:OPENGIST_READ_ONLY 和批准流程是客户端防护。真正的边界是访问令牌的作用域和 MCP 主机的权限提示。限制为 gist:read / user:read 的令牌无论如何都无法写入。

适用场景

适用于希望通过 MCP 客户端管理自有 Opengist 实例上 gist 的用户,包括读取和搜索、创建和更新、fork 与点赞等,同时需要结构化输出和有界结果、不可信内容标记以及不可逆操作的人工确认。

限制

  • 不是 git 客户端:它使用 REST API,克隆、推送和分支是 git 的职责,但会返回 clone_url 和 ssh_url 供交给 git。
  • 不是管理工具:不涉及用户、设置或实例管理,get_user 返回的是允许列表字段。
  • 不是搜索索引:Opengist 没有搜索端点,search_gists 仅使用 API 提供的能力。
  • 工具总数上限为十四个;可通过环境变量缩减。
  • 没有 gist:read 的令牌只会返回公共 gist,且不会报错。
  • 完整指南、工具参考和安全说明位于 opengist-mcp.ni-c.de(源码在 docs/)。

许可证为 MIT © Willi Thiel。