A macOS credential vault and SSH/HTTP proxy that provides MCP tools for secure credential injection, SSH command execution, and credential provisioning
Sallyport defines 3 tools with complete input schemas and descriptions. All tools have clear, security-focused descriptions (194-280 chars, within baseline 34-392). Schemas are properly structured with required fields and type constraints. However, output schemas are entirely undocumented, LLMs cannot plan downstream calls without knowing what fields to expect. Parameter descriptions are adequate but lack format/constraint details (e.g., 'timeout_s' has no min/max bounds). Error handling is mentioned in descriptions but not formalized. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles (http.request is READ_ONLY, ssh.exec is WRITE). Tool naming is strong (verb_noun pattern: http.request, ssh.exec, request_credential).
Send an HTTP request. Do not include credentials, tokens, or an Authorization header. Sallyport injects only a credential bound to the target host. Bound credential hosts are shown to the user. Other hosts are unauthenticated. Credentials are not forwarded on cross-host or HTTPS-to-HTTP redirects. Cloud metadata is blocked. Private addresses require an explicit credential binding. Put query parameters in `params`. Returns `status`, `final_url`, and either `json` or `body`.
Ask the user to add a credential. Set `hosts` to every domain that may receive it and include known metadata. Returns `provisioned`, optional `name`, and `message`, never the credential value.
Run a command on a configured SSH host. Do not include credentials; Sallyport handles authentication. Configured SSH hosts are shown to the user. Use the host name, not its address. A new agent may require session approval, and a key may require approval for every call. Sessions are recorded. Returns `stdout`, `stderr`, and `exit_code`.
Output schemas completely undocumented. Tools return structured data (status, final_url, json/body for http.request; stdout, stderr, exit_code for ssh.exec; provisioned, name, message for request_credential) but LLMs have no formal schema to plan chaining or extract fields reliably.
No tool annotations despite clear risk profiles. http.request marked READ_ONLY and ssh.exec marked WRITE in metadata, but inputSchema lacks readOnlyHint/destructiveHint annotations. Agents cannot infer safety/idempotency from schema alone.
Numeric parameter 'timeout_s' (ssh.exec) lacks bounds. No min/max specified, agents could pass negative, zero, or absurdly large values. Should constrain to e.g. 1-3600 seconds.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Error handling not formalized. Descriptions mention 'sessions are recorded' and 'credentials are not forwarded on cross-host redirects' but no explicit error codes, recovery guidance, or categorization (retryable vs fatal) documented.
Parameter 'hosts' (request_credential) is an array but lacks guidance on format/validation. Should clarify: are these domain names, FQDNs, or IP addresses? Can they include ports? What if duplicates are passed?