接入 AngusSecurity MCP:在 IDE 聊天中查詢高危發現、掃描結果及閘門
Ask about highs, findings, and gates in chat: wiring AngusSecurity MCP
AngusSecurity MCP 接入 IDE 聊天後,用戶可查詢掃描結論,包括發現項目、警示、CVE、授權、閘門及報告快照;回覆是經遮蔽的結論,而非完整原始掃描資料。它最多提供 16 個工具;具備相應權限並啟用寫入後,亦可掃描目前的程式碼儲存庫、映像或成品,並為已完成的檢查建立報告。
Once AngusSecurity MCP is connected, you can ask for scan conclusions right in IDE chat: any highs on this check, how to fix a finding, whether the gate will block, whether a report is ready—look up highs and alerts, explain findings, compare two checks, read or download report snapshots; with matching permissions and write on, you can also scan the current repo, image, or artifact. What comes back is a redacted conclusion, not a full raw scan dump into the model.
Main practical scenarios:
- Before a release: any Critical / high findings on this check?
- Point at one finding: what does the rule mean, and how do I fix it?
- Diff two scans: what’s new, what’s gone, what’s still there?
- Simulate with an existing policy: will the gate block this result?
- Read an existing report or download its body; with enough permissions, create a report for a finished check
- When allowed, scan the current repo (or an image / artifact)
Takeaway: Security MCP exposes up to sixteen tools—most query findings, alerts, CVEs, licenses, gates, and reports; with permissions and write on, you can also scan or create a report for a finished check. No suppress of false positives, no secret plaintext, no publish/share. Use a portal-issued user access token for this product.
Console and host wiring: Connect AngusSecurity with MCP in the references. “Which repo holds this coordinate / client setup” is AngusRepo MCP—eight tools, write always off. Here the answer is scan conclusions, CVEs, licenses, gates, and report snapshots. Unified engines and how reports export: replace scanner scripts; how to export scan reports.
1. Six questions agents keep asking (and what is out of scope)
- Scan the current repository / image / artifact / named files.
- Read that check’s issues grouped by code security, dependencies, secrets, and licenses.
- List or explain a finding (secret snippets stay hidden).
- Look up a CVE in the local vuln DB; summarize visible licenses.
- Simulate a gate with an existing policy; compare two completed checks.
- Read an existing report or download its body; with enough permissions, create a report for a finished check.
Explicitly out of scope: suppress false positives, reveal secret plaintext, change alert status, edit policies, publish/share/delete reports, manage credentials and engines, upload a whole unnamed tree, export engine raw output.
| Contrast | AngusRepo MCP | AngusSecurity MCP |
|---|---|---|
| Surface | Eight read-only tools; cannot scan or create reports | Up to sixteen; with permissions, can scan + create reports |
| Answers | Which repo holds a coordinate, dependency/isolation snapshots, client templates | Findings, CVEs, licenses, gate simulation, report snapshots |
| Does not | Proxy protocol pull, trigger scans | Locate artifact repos, reveal secrets, suppress |
2. Shape: in-process endpoint + loopback
Chat only sees named tools; the server loops back in-process to the existing management API so permissions and audit stay one path.
IDE / Agent
--POST {gateway}/security/mcp--> Boot /mcp
--loopback Bearer--> /api/v1/** (named semantic tools)
A separate Node that re-wraps REST would duplicate policy. Loopback has no generic path parameter, so the model cannot invent the general upload gateway, reveal, or publish routes.
| Item | Stance |
|---|---|
| Transport | Stateless POST; default /mcp; via gateway {host}/security/mcp
|
| Loopback | Local Security port (default 1811); Bearer forwarded as-is; X-Angus-Client-Source: mcp
|
| Surface | Registers tools only; no resources / prompts / sampling |
| GM | No new GM resources; visibility follows existing @PPS
|
| IDs | Job and finding ids are decimal strings—do not truncate or treat as floats |
| Setting | Effect |
|---|---|
angus.mcp.enabled (ANGUS_MCP_ENABLED, true when unset) |
false → no endpoint; console / CLI / existing scans keep working |
angus.mcp.write-enabled (true when unset in current release) |
false → list drops security_scan and security_create_report; queries and downloads do not use this switch |
Rate limit: at most 30 successful calls per account per minute; then rate_limited—wait briefly.
3. Sixteen tools (names as in the docs)
With write on and full related permissions, an analyst or admin should see exactly 16 on tools/list. Viewers see fewer—§4.
3.1 Start a scan and read that result
| Tool | Permission notes | What it does / easy mistakes |
|---|---|---|
security_scan |
ScanJobs:EXECUTE + write on |
kind: git / image / artifact / files; one target type per call; returns a job id (jobId) immediately—wait for the scan to finish before asking for issues or a report. git accepts https only; gitRef is what the user said or the current branch—never guess main. Private targets take a console-saved credential name, never a token. Named checks go in capabilities; if omitted, the server expands |
security_issues |
Findings:VIEW + ScanJobs:VIEW
|
Grouped by capability; notScanned=true on a row means that check did not run; empty ≠ safe; secret snippets masked |
3.2 Day-to-day lookup
| Tool | Permission notes | What it does / easy mistakes |
|---|---|---|
security_list_findings |
Findings:VIEW |
At least one filter (jobId / assetKey / keyword / ruleId, …); list has no code snippets; empty ≠ safe |
security_explain_finding |
Findings:VIEW; rule text also needs RulePacks:VIEW
|
Rule meaning, remediation, masked snippets; cannot reveal; about five ids per call max |
security_list_jobs |
ScanJobs:VIEW |
For repo/image/artifact use assetKeyword—do not put the URL in keyword; do not treat counts as clean unless status is COMPLETED / PARTIAL
|
security_list_alerts |
Alerts:VIEW |
Read alerts only; no status change or assign |
Pagination starts at 1; at most 20 per page.
3.3 Compare, vuln DB, and gates
| Tool | Permission notes | What it does / easy mistakes |
|---|---|---|
security_compare_jobs |
ScanJobs:VIEW |
Fingerprint diff of two completed jobs (added/gone/still there); no new job |
security_lookup_vulnerability |
RulePacks:VIEW |
Local vuln DB; if missing, say the record is absent—do not rewrite as “no vulnerability” |
security_license_summary |
Findings:VIEW |
Visible license rollup for the account; cannot bind a job—use security_issues for one job |
security_risk_summary |
Dashboard:VIEW |
Risk score and posture summary; not the overview’s large lists |
security_simulate_gate |
Policies:VIEW |
Read-only simulation; optional lookbackJobs (max 100); usually hidden from viewer and developer |
3.4 Reports
| Tool | Permission notes | What it does / easy mistakes |
|---|---|---|
security_report_summary |
Reports:VIEW |
Existing reports; if none READY, say not generated yet; no verify URL or share password |
security_get_report |
Reports:VIEW |
Scope, status, metrics by id; no verify/share password/spec body |
security_compare_reports |
Reports:VIEW |
Compare two report summaries and finding fingerprints |
security_download_report |
Reports:EXECUTE |
Only when the report is ready (READY); format: JSON/HTML/CSV/PDF/SARIF; text capped ~64 KB then truncated; PDF/archives return filename, bytes, and console path only |
security_create_report |
Reports:EXECUTE + write on |
Finished jobs only; mainly jobId (+ optional name/format); create starts as generating (PENDING)—wait until ready before download, poll security_get_report until READY or failure; no publish, share, or open password |
Explicitly not in the list: suppress, reveal, publish, share, delete reports, edit policies, upload a whole unnamed tree, export engine raw output.
A report is a snapshot at generation time and does not rewrite when the next scan finishes—same stance as “how to export scan reports” in the references.
4. Which tools each role sees
| Role | Write on | Write off |
|---|---|---|
Viewer (SEC_VIEWER) |
12: has security_issues; no scan, no gate simulate, no report download/create |
Same (12) |
Developer (SEC_DEVELOPER) |
13: viewer + security_scan
|
12 |
Analyst / admin (SEC_ANALYST / SEC_ADMIN) |
16 | 14 (no scan, no create report) |
If the account lacks permission, the tool does not appear; calling it by name yields permission_denied. MCP does not grant extra access. Try the same action in the console with the same account before blaming MCP.
5. Auth boundaries (easy to get wrong)
| Credential | Result |
|---|---|
| Portal-issued user access token (PAT) | Can enter; tool set narrows by role and write switch |
repod_ or tokens from other products (e.g. AngusRepo) |
401, no tool list |
| OAuth refresh token | 401 |
| No Bearer | 401 (avoid turning auth failure into an in-tool error the model retries blindly) |
Visibility matches what that user sees on /api/v1, same as the console. Personal tokens: avatar → Me (/profile). Use a service account for CI; do not commit a personal session into a repository.
6. Host wiring (minimal copy-paste)
Keep the token in an environment variable; do not commit it:
{
"mcpServers": {
"angus-security": {
"url": "https://<gateway-host>/security/mcp",
"headers": { "Authorization": "Bearer ${ANGUS_SECURITY_TOKEN}" }
}
}
}
Public shape is gateway {host}/security/mcp. A direct private process uses https://<security-host>/mcp (default port 1811; behind a reverse proxy you need not expose that port publicly). Copy the URL from System → MCP in the console.
| Host | Config file (follow each host’s docs) |
|---|---|
| Cursor | Project .cursor/mcp.json or user ~/.cursor/mcp.json
|
| Claude | claude_desktop_config.json |
| VS Code | Workspace .vscode/mcp.json
|
| Codex / Qoder | See that host’s MCP docs |
Stdio-only hosts forward with @anguskit/mcp --product security (reads ANGUS_TOKEN / ANGUS_BASE_URL, not the same names as ANGUS_SECURITY_TOKEN):
{
"mcpServers": {
"angus-security": {
"command": "npx",
"args": ["-y", "@anguskit/mcp", "--product", "security"],
"env": {
"ANGUS_BASE_URL": "https://<gateway-host>",
"ANGUS_TOKEN": "${ANGUS_SECURITY_TOKEN}"
}
}
}
}
ANGUS_BASE_URL is the gateway origin without /security/mcp. Without a product prefix in private deploy, use --endpoint + https://<security-host>/mcp. If the default npm registry lacks the package, the docs suggest https://repo.anguskit.com/npm/npm-public/. Full host table: MCP docs in the references.
6.1 Dialogue examples: question → tool → expected fields
Example A: scan, then ask for issues
| Step | Content |
|---|---|
| User asks | Scan this repo for code security and secrets. |
| Should call |
security_scan (kind=git, https gitUrl, gitRef=user/current branch, optional capabilities) → later security_issues / security_list_jobs
|
| Expected fields | Immediate job id (jobId, decimal string); after the scan finishes, grouped results; secret snippets masked |
| Must not appear | Guessing main, pasting a PAT in chat, submitting SSH git@ without converting to https |
Example B: explain an existing finding
| Step | Content |
|---|---|
| User asks | Explain this finding and how to fix it. |
| Should call |
security_list_findings (with filters) for the full id, then security_explain_finding
|
| Expected fields | Rule meaning, remediation / fixed version, path/line, masked snippet
|
| Must not appear | Secret plaintext, suppress/approval, presenting the model’s own patch as the scanner’s conclusion |
Example C: gate and report
| Step | Content |
|---|---|
| User asks | Will this policy block us? Create an HTML report for this finished job. |
| Should call |
security_simulate_gate (needs Policies:VIEW) → with write on and Reports:EXECUTE, security_create_report → poll security_get_report
|
| Expected fields | Simulation creates no new scan; create starts as generating; download only after ready (text may include truncated) |
| Must not appear | Viewer/developer forcing gate or create report; treating “generating” as done; publish/share |
After connect, also tools/list against the role table, then smoke-test security_explain_finding on a finding that already exists in the console.
7. Short industry shape comparison (and vs Repo)
| Shape | Example | vs AngusSecurity (one line) |
|---|---|---|
| Local stdio scan of the workspace | Snyk CLI MCP | Server pulls repo/image/artifact; named files use capped upload |
| Platform search + mutable state | SonarQube MCP | Adopts search and gate simulation; does not change finding status or mount the workspace |
| Artifact intelligence MCP | Sonatype Guide / JFrog Xray | Coordinate ownership is Repo MCP; here: scan conclusions and gates |
| In-process semantic tools | AngusSecurity | Loopback to this process’s REST; suppress/reveal/publish stay off the tool surface |
Comparison explains product trade-offs, not a buying rank. Details follow each vendor’s docs of the day.
8. Boundaries and failure table
Three common failures after connect: the wrong product’s token won’t get in, an empty finding list rewritten as “safe,” and asking for report body while the scan or report is still running—see the table and FAQ below.
| Symptom | Cause | What to do |
|---|---|---|
| Cannot connect |
enabled=false / wrong URL / console-host /mcp blocked by site proxy |
Flip the switch; verify gateway /security/mcp; host must POST
|
| 401 | Other-product token or repod_ / no Bearer / expired token |
Re-issue a PAT from Me; refresh the host MCP |
| Few tools / fewer than a coworker | Missing role permissions or write off | Check §4; viewer has no scan; developer has no gate simulate or report download/create |
permission_denied |
Call outside the list or console also denies | Verify the same account in the console; MCP does not widen rights |
| Assistant says it cannot scan this repo | No ScanJobs:EXECUTE, write off, missing gitRef, private repo without credential name |
Enable write; pass https + branch; name the console credential |
| Want to suppress a FP | No matching tool | Dispose in the console (avoids the model turning “accept risk” into an auto-approved suppress) |
| Cannot read secret plaintext | By design | Reveal only in the console |
New report still generating (PENDING) |
Report generation is async | Poll security_get_report until ready (READY) or failure—do not read the body right after create |
| “Downloaded” PDF has no body | Binary stays out of chat | Use filename + consolePath and fetch in the console |
rate_limited |
Over 30 calls/minute | Wait; merge questions |
| Empty finding list | Not scanned, unfinished, or filters missed | Say not scanned / unfinished—do not rewrite as safe |
-32020 |
Custom Mcp-Method / Mcp-Name headers disagree with the JSON body |
Drop the custom headers, or keep them consistent with that request |
FAQ
Will MCP reveal secrets or mark false positives?
No. Explain and alerts keep masks; suppress, reveal, and approval stay in the console. One reason: some suppress scopes auto-approve—if the model frames “accept risk” as a fix, it would write an effective suppress.
Can I still read / download reports when write is off?
Queries need Reports:VIEW. Downloads need Reports:EXECUTE and do not use the write switch. What the write switch removes is security_scan and security_create_report.
How does this relate to CLI / CI?
CLI and pipelines remain the main path for batch runs and gates; MCP brings the same jobs and findings into IDE chat. Unified engines: replace scanner scripts in the references.
Why not a generic read-only gateway?
Named tools keep the loopback whitelist small, avoid exposing the whole admin API to the model, and make projection redaction easier.
Why can’t other-product tokens / repod_ connect?
MCP uses this portal’s user access token with the same rights as the console. Treating automation or cross-product tokens as chat identity widens the surface—401 before auth proceeds.
Why can’t security_license_summary answer “this job”?
It rolls up licenses visible to the account and cannot bind a jobId. For one job’s license issues, use security_issues.
Can an empty list be called “safe”?
No. Also distinguish: job unfinished, a capability with notScanned=true, and filters that missed. None of those mean the target is safe.
Takeaways
- Differentiated from Repo MCP: here it is scan conclusions / gates / reports; write surface is only scan + create report, gated by switch and role.
- Wiring: gateway
/security/mcp+ PAT;repod_and other-product tokens will not work; secrets masked; empty ≠ safe. - For wiring details, follow the docs and System → MCP in the console.
Reference articles
- Connect AngusSecurity with MCP: https://www.anguskit.com/en/docs/security/get-started/mcp
- Replace Semgrep, Trivy, and Gitleaks scripts: https://www.anguskit.com/en/blog/replace-semgrep-trivy-gitleaks-with-one-scan
- How to export scan reports: https://www.anguskit.com/en/blog/security-scan-report-snapshot-export
- Capability-scoped reports: https://www.anguskit.com/en/blog/capability-security-reports-sast-sca-secret-license
- Intranet vuln DB update and rollback: https://www.anguskit.com/en/blog/intranet-vuln-db-offline-update-rollback
- Audit evidence checklist: https://www.anguskit.com/en/blog/compliance-audit-security-scan-evidence
- Read-only artifact queries (AngusRepo MCP): https://www.anguskit.com/en/blog/angusrepo-mcp-server-design
來源:DEV Community · dev.to