Portal v0.29.0 — Leaner MCP results and a hardened pack catalog
·
1962 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Emisar's MCP surface now behaves the way LLM clients actually drive it, and the pack catalog closes two cross-pack gaps.
MCP
- Scalar arguments sent as canonical strings —
"limit": "50","dry_run": "true"— coerce instead of failing the call. A real mismatch now names the field and the JSON type it was sent as (limit must be a JSON integer from 1 to 100; it was sent as a string.) instead of a generic contract error. - Every argument fault names its field: malformed refs say to copy the exact value from a prior tool result, enum faults list the allowed values, and unknown arguments are spelled out against the allowed set.
- Run summaries omit zero-information fields: a stream that produced no bytes carries no
stdout/stderr, byte-count, or truncation fields;output_completeappears only when false; and per-stream SHA-256 digests left the MCP projection (they remain on the run detail page and audit record). A typical terse summary shrinks by about a third, and an absent output field can no longer read as suspicious. - Server instructions and error texts tightened: reason-field guidance, recovery wording, and the new absent-field semantics (no output means no output, not an error).
Security
- Disabling two-factor authentication now requires a fresh step-up challenge, so a hijacked session cannot quietly weaken an account.
- Production session cookies always carry the Secure flag.
Packs
- Secret-dense config and environment dumps (cloud-init user/vendor data and cloud-config, pm2 env, nginx and caddy config dumps) moved from risk low to medium, matching linux.sudoers_dump, so they no longer ride the ungated low-read path.
- Redis ACL password hashes are redacted from acl_list and acl_getuser output, so an ungated read no longer leaks crackable material.
- Exec-style arguments across docker, systemctl, podman, minio, and friends anchor their first character to an alphanumeric, so a hostile value cannot be parsed as a leading-dash flag.