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。