GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
Wraps the ShimGuard CLI as a single generic MCP tool for agent-shim provenance checks.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"shimguard": {
"command": "uvx",
"args": [
"shimguard-cli",
"shimguard-mcp"
]
}
}
}在终端中运行这条命令
claude mcp add shimguard -- uvx shimguard-cli shimguard-mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"shimguard": {
"command": "uvx",
"args": [
"shimguard-cli",
"shimguard-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"shimguard": {
"type": "stdio",
"command": "uvx",
"args": [
"shimguard-cli",
"shimguard-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
注册名称已通过 GitHub 账户 RudrenduPaul 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.1.5)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。
同一分类中有:GitHub, Desktop Commander, Cloudflare MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Verify that a GitHub issue closed as "fixed" actually has a merged fix, before you trust the tracker.
npx shimguard-cli verify sybil-solutions/codex-shim --issues 38,41,42,43,45,46
That single command against the real sybil-solutions/codex-shim repo (1,000+ stars) turns up 6 MISMATCH results: 6 security issues, each closed with a "Fixed in PR #52" comment, where PR #52 was never actually merged. The vulnerable code is still in main today. Nobody reading the closed issues would know.
Reading an issue tracker, you trust two signals: the issue's state (open or closed) and the maintainer's closing comment ("fixed in #N"). Neither signal is verified against reality by GitHub itself. A maintainer can close an issue citing a PR that never merged, an automated bot can close on a "fixes #N" keyword in a PR description before that PR lands, or a fix can get reverted after the issue was already closed. Any of these leaves a tracker saying "fixed" about a bug that is still live.
ShimGuard checks the one thing a human skimming issues does not: does the PR the tracker cites as the fix actually show merged: true? It is a small, mechanical, unambiguous check, not a heuristic or a guess.
ShimGuard ships two independent, equally first-class packages -- pick whichever fits your toolchain, or install both. Neither is deprecated in favor of the other; both implement the same "closed issue cites Fixed in PR #N, is #N actually merged" check against the same GitHub REST API.
# npm -- JavaScript/TypeScript CLI + library
npm install -g shimguard-cli
npx shimguard-cli verify / --issues
pip install shimguard-cli
The npm CLI requires Node.js 18 or later (uses the built-in fetch API). The Python package's CLI entry point is also shimguard (e.g. shimguard verify sybil-solutions/codex-shim --issues 45,46); see python/README.md and docs/getting-started.md for the Python-specific walkthrough, and CHANGELOG.md for each distribution's version history.
shimguard verify sybil-solutions/codex-shim --issues 38,41,42,43,45,46
ShimGuard v0.1 -- Tracker Verification: sybil-solutions/codex-shim
[MISMATCH] Issue #45 "_resolve_api_key silently falls back to Cursor API key for any model with an empty api_key, forwarding it to arbitrary upstream URLs" https://github.com/sybil-solutions/codex-shim/issues/45 Cited fix: PR #52 (open, not merged) Issue is closed and cites PR #52 as the fix, but that PR is open and was never merged.
Summary: 6 MISMATCH, 0 MATCH, 0 UNVERIFIED (6 checked)
Exit code is 1 when any MISMATCH is found (useful for gating CI), 0 when every checked issue's claimed fix actually merged, 2 on a usage or network error.
ShimGuard is not just a gotcha finder: run it against a mix of issues and it correctly reports MATCH, UNVERIFIED, and MISMATCH side by side, exiting 0 whenever nothing is provably broken -- exactly the signal a CI gate needs.
For an even stronger check, point ShimGuard at the specific file and pattern an issue named as the vulnerable code:
cat > patterns.json <<'EOF'
{ "45": { "path": "codex_shim/settings.py", "pattern": "cursor_key_fallback" } } EOF
shimguard verify sybil-solutions/codex-shim --issues 45 --patterns patterns.json
If the PR is merged but the cited pattern is still present in the file at HEAD, ShimGuard still reports MISMATCH: a merged PR does not guarantee the specific vulnerable line was actually removed.
[!WARNING]
patternis compiled as a JavaScriptRegExp, andpathis validated to
stay within the target repo (no
..traversal to a different repo or API
endpoint). Only point
--patternsat files you wrote or reviewed
yourself. See SECURITY.md.
Usage: shimguard [options] [command]
Verify that GitHub issues closed as "fixed" actually have a merged fix. Catches security issues marked fixed whose PR was never merged.
Options: -V, --version output the version number -h, --help display help for command
Commands: verify [options] Check whether closed issues in a repo actually have a merged fix help [command] display help for command
Usage: shimguard verify [options]
Check whether closed issues in a repo actually have a merged fix
Arguments: repo target repo as / , e.g. sybil-solutions/codex-shim
Options: --issues comma-separated issue numbers to check, e.g. 38,41,42 --patterns JSON file mapping issue number -> {path, pattern} for an optional code-pattern check --token GitHub token for higher API rate limits (defaults to $GITHUB_TOKEN) --format output format: text or json (default: "text") -h, --help display help for command
--format json output is stable and designed for scripts and AI agents to parse directly:
{
"repo": "sybil-solutions/codex-shim", "checked": 1, "summary": { "mismatch": 1, "match": 0, "unverified": 0 }, "results": [ { "issue": { "number": 45, "title": "...", "state": "closed", "htmlUrl": "..." }, "citedPullRequest": { "number": 52, "state": "open", "merged": false, "htmlUrl": "..." }, "patternCheck": null, "verdict": "MISMATCH", "reason": "Issue is closed and cites PR #52 as the fix, but that PR is open and was never merged." } ] }
ShimGuard ships a Model Context Protocol server, so an MCP-compatible agent (Claude Desktop, Claude Code, Cursor, or any other MCP client) can call it as a tool instead of shelling out to the CLI and parsing text. It's part of the Python distribution:
pip install "shimguard-cli[mcp]"
Register it with an MCP client such as Claude Desktop:
{
"mcpServers": { "shimguard": { "command": "shimguard-mcp" } } }
It exposes a single tool, run, that takes the exact argv you'd pass to the shimguard CLI and returns a structured result ({returncode, stdout, stderr, json?} on success, {error: ...} if the command failed, timed out, or exited non-zero). Example call:
run(args=["verify", "sybil-solutions/codex-shim", "--issues", "45,46", "--format", "json"])
which returns the same --format json report shown above, as a parsed json field alongside the raw stdout. Full details are in the Python package README.
ShimGuard's verification logic is also importable directly:
import { TrackerVerifier, RestGitHubClient, RegexPatternMatcher } from "shimguard-cli";
const client = new RestGitHubClient(process.env.GITHUB_TOKEN); const verifier = new TrackerVerifier(client, new RegexPatternMatcher(client));
const result = await verifier.verify({ owner: "sybil-solutions", repo: "codex-shim", number: 45 }); console.log(result.verdict); // "MISMATCH"
TrackerVerifier takes any GitHubClient and an optional PatternMatcher (see src/types.ts, src/pattern-matcher.ts), both are interfaces, so a future local-config scanner or a different code host can plug in without changing the verifier itself.
The Python package exposes the same shape:
from shimguard import TrackerVerifier, RestGitHubClient, RegexPatternMatcher, IssueRef
client = RestGitHubClient() # or RestGitHubClient(token=os.environ["GITHUB_TOKEN"]) verifier = TrackerVerifier(client, RegexPatternMatcher(client))
result = verifier.verify(IssueRef(owner="sybil-solutions", repo="codex-shim", number=45)) print(result.verdict) # "MISMATCH"
No existing open-source tool checks "this issue tracker says fixed-in-PR-#N, is #N actually merged." That claim is verified by searching for issue-fix-verification tools, patch-verification tools, and security-advisory-fix tools before writing this. The closest adjacent tools solve different problems:
| Tool | What it actually checks | Reads issue tracker / PR merge state? |
|---|---|---|
| ShimGuard | Does a GitHub issue's cited "fixed in PR #N" claim match PR #N's real merge state (and, optionally, is the cited code pattern gone from HEAD) | Yes, this is the entire check |
| gitleaks / trufflehog | Secrets committed to source (API keys, tokens) | No, scans file content, not tracker state |
| trivy / grype / osv-scanner | Known CVEs in your dependency tree | No, scans a dependency manifest/lockfile, not tracker state |
| Vanir (Google) | Whether a known CVE's code signature is still present in a target source tree | No, works from CVE-to-code, doesn't touch a GitHub issue tracker |
| VFCFinder (NC State, ASIACCS 2024) | Finds a likely fix commit for an advisory that has *no* linked fix yet | Opposite direction: finds a missing citation, doesn't verify an existing one |
The gap ShimGuard fills is real, not theoretical. wow-actions/auto-close-fixed-issues, a GitHub Action used by other repos, closes an issue on a PR's closed event, not its merged event: a bot can mark an issue "fixed" the moment a PR is closed, whether or not it actually merged. GitHub's own native Closes #N keyword linking only auto-closes on a real merge to the default branch, so this specific failure mode comes from manual maintainer comments and third-party automation, not GitHub's own defaults, which is exactly why nothing catches it after the fact.
ShimGuard is a CLI and library, shipped as both an npm package and a PyPI package, that checks whether a GitHub issue's claimed fix ("Fixed in PR #N") is actually true, by checking the real merge state of that PR (and, optionally, whether the vulnerable code pattern is still present at HEAD). It exists because closing an issue with a citation to an unmerged PR is a real, observed failure mode, not a hypothetical one: `sybil-s
只显示了开头部分;其余内容请在仓库中阅读