Atlas / MCP servers / mechubsec / rustsdcmcp

rustsdcmcpBLOCK

mcp/mechubsec/rustsdcmcp

Async Rust MCP server for HPE Juniper Security Director Cloud — a mechub project

Verdict
BLOCK
Grade
D
Trust score
65 /100
Exposed tools
—
Transport
stdio · streamable-http
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

rustsdcmcp

Async Rust Model Context Protocol server for HPE Juniper Security Director Cloud a mechub project — sovereign network-security automation

Unofficial / community project. This is an independent community project and does not claim affiliation with or endorsement by Hewlett Packard Enterprise or Juniper Networks. Product names and trademarks are used only to identify the systems with which the software interoperates.

rustsdcmcp exposes HPE Juniper Security Director Cloud (SDC) to MCP clients as a bounded, auditable tool surface. SDC is the HPE Juniper SASE portal for an SRX estate, so this server talks to that management plane rather than to any single firewall. Where `rustjunosmcp` talks NETCONF to individual SRX devices, rustsdcmcp talks HTTPS REST to the portal that governs them.

That distinction has a large blast radius: one SDC action can affect many managed SRX devices. Strict approval, credential-safe attribution, and bounded I/O therefore protect the management plane rather than merely decorate it.

Current status

rustsdcmcp exposes 74 MCP tools (v0.1.0 and main): 60 bounded read tools and 14 change-control tools. The surface covers the part of the SDC API that manages SRX devices and their policy; the rest of the product's API is deliberately out of scope.

Every mutation is reachable only through prepare → independent approval → apply. A wildcard token scope deliberately grants no write tool, so each must be named explicitly when a token is minted.

Live validation against SDC has gone well beyond read-only. On 2026-08-07 a full prepare → approve → apply policy deploy ran ag

Read from source at commit b1ebbae1582dOBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code (oci)
claude mcp add rustsdcmcp:0.1.0 -- docker run -i --rm ghcr.io/mechubsec/rustsdcmcp:0.1.0:None stdio /var/lib/sdcmcp/changeset-state.json
03

Trust audit

BLOCKgrade D · trust 65/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (10 observation(s))
Network
declared (6 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
found

Findings (22)

CRITICALHard-coded secrets · secret.private_key · CWE-798, CWE-321
crates/rustsdcmcp-core/src/projection.rs:377
"private_key": "-----BEGIN PRIVATE KEY-----AAAA-----END PRIVATE KEY-----",
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
crates/rustsdcmcp-core/src/client.rs:3666
let sdc = client(Url::parse("http://127.0.0.1:9/").expect("url"), 4096);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
crates/rustsdcmcp-core/src/client.rs:3682
let sdc = client(Url::parse("http://127.0.0.1:9/").expect("url"), 4096);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
crates/rustsdcmcp-core/src/client.rs:4179
let sdc = client(Url::parse("http://127.0.0.1:9/").expect("url"), 4096);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
crates/rustsdcmcp/src/main.rs:1743
let error = reject_unsupported_otel_endpoint(Some("http://127.0.0.1:4318"))
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitleaks-vendor.toml
.gitleaks-vendor.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitleaks.toml
.gitleaks.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitleaksignore
.gitleaksignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.superpowers-issue-52-report.md
.superpowers-issue-52-report.md
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.trivyignore.yaml
.trivyignore.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
crates/rustsdcmcp-core/src/client.rs:3599
sdc.list_config_versions("../../api/v1/devices", &CancellationToken::new())
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
crates/rustsdcmcp-core/src/redact.rs:1438
"/../../docs/sdc-api/security-director-cloud-apis-openapi3.json"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
crates/rustsdcmcp/tests/mecmcp_dependency_contract.rs:114
fs::read_to_string(crate_root.join("../../Cargo.lock")).expect("read workspace lockfile");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
crates/rustsdcmcp/tests/mecmcp_dependency_contract.rs:134
fs::read_to_string(crate_root.join("../../Cargo.lock")).expect("read workspace lockfile");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
crates/rustsdcmcp/tests/mecmcp_dependency_contract.rs:181
fs::read_to_string(crate_root.join("../../Cargo.lock")).expect("read workspace lockfile");
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
docs/operations.md:216
for url in 'http://169.254.169.254/' 'http://[fd00:ec2::254]/' \
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:195
the local MCP client uses `http://127.0.0.1:30032/mcp`. Each installation
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/sdc-api/README.md:806
| `none` | the field is a documented in-sync token. The vendored spec names no such token, so this server does not emit `none` |
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWInventory / provenance · mcp.no_tools_extracted · CWE-1104
server.json
Why it matters. the tool list is enumerated at runtime by tools/list, not declared in source
Fix. the page says so rather than showing an empty table
INFOInventory / provenance · inv.oversize · CWE-1104
docs/sdc-api/security-director-cloud-apis-openapi3.json
docs/sdc-api/security-director-cloud-apis-openapi3.json
Why it matters. 3771341 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/superpowers/plans/2026-07-29-rustsdcmcp-lab-package-deployment.md:1487
Use `stat` only; never read the installed credential back.
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/superpowers/specs/2026-07-29-mecmcp-0.3.7-adoption-design.md:158
- Do not read or copy the external SDC credential.
Why it matters. asks the agent to read credentials

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha b1ebbae1582dfull audit observations/trust-audit/mcp-server/mechubsec__rustsdcmcp.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12b1ebbae1582dBLOCKD65first audit
05

Questions

What is the rustsdcmcp MCP server?

Async Rust MCP server for HPE Juniper Security Director Cloud — a mechub project

Is rustsdcmcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (65/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does rustsdcmcp need?

No credential environment variables were found in its source, so it appears to need none.

How does rustsdcmcp run?

It speaks stdio and streamable-http, so it runs as a local process your client starts.

How current is this page?

The grade is for one exact copy of the source (b1ebbae1582d), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement