Product Requirements Document¶
Problem¶
MCP servers are commonly run as plain local processes with the developer's full machine permissions. The project README describes this as a security gap: an MCP server can be malicious or simply buggy, and in the default installation path it may read SSH keys, exfiltrate data, or write to arbitrary filesystem locations without any protocol-level protection. Warden exists to run those servers in a restricted sandbox so the server only gets the filesystem paths, network hosts, and environment variables the user explicitly grants.
Target user¶
The target user is a developer who installs and runs third-party MCP servers locally on a personal machine. This is not a platform team or enterprise deployment product: the architecture explicitly scopes Warden to a local developer workflow, not a multi-tenant gateway or hosted service. The user is responsible for deciding what each installed MCP server is allowed to access, usually by writing a small YAML policy and invoking the CLI directly from their shell.
Goals¶
- Keep the MCP client experience transparent: stdio should behave as if the server were running normally, even when the process is sandboxed.
- Enforce deny-by-default access controls for filesystem, network, and environment variables.
- Work in a normal developer environment without root privileges when the OS supports unprivileged sandbox primitives.
- Prefer OS-native sandboxing backends so the trust boundary stays small and the tool remains lightweight.
- Produce a clear audit trail of blocked and allowed access attempts for debugging and review.
- Support a basic, easy-to-understand policy model that maps to the actual sandbox backend primitives on Linux and macOS.
Non-goals¶
This section is copied forward from ARCHITECTURE.md and is not re-derived here:
- Agent identity / audit-trail-of-who-asked.
- Multi-tenant / server-side deployment.
- Windows support in v1.
- Full hosted governance or platform-layer controls for many users.
Functional requirements¶
- Filesystem restriction: the sandbox must expose only declared read and write paths, with everything else hidden inside the sandbox; derived from the M1 milestone and the README's filesystem-only quickstart.
- Network allowlisting: the sandbox must allow only configured hosts and block direct egress, DNS leakage, and non-allowlisted connections; required by ROADMAP.md M2.
- Environment passthrough: only named environment variables may pass through to the server; values are inherited from the parent environment and not stored in the policy file; required by M1+M2 policy parsing and enforcement.
- Resource limits: the sandbox should enforce memory and timeout constraints and terminate the process when limits are exceeded; tracked under M3.
- Audit logging: every file access and network attempt should be recorded, including blocks, and exposed through a structured log stream; required by M2 and M3.
- Trace/init UX:
tracemode should observe access without enforcing, andinitshould generate a starter policy from a trace log; both are M3 features.
Non-functional requirements¶
- No-root requirement: Warden should work in a normal developer setup without sudo, using unprivileged namespaces where the OS supports them.
- Fail loud, not silent: blocked access attempts must be logged and surfaced in a way that makes sandbox policy violations obvious instead of quietly ignored.
- Single-binary distribution goal: the project aims to ship as a lightweight single binary with minimal overhead compared to Docker or VM-based isolation.
- Performance expectations: the design prefers low overhead and a small trust boundary, with sandboxing should be no harder than running a local MCP server directly; a concrete performance target is not specified in the repo, so no numeric SLA is assumed.
Constraints & assumptions¶
- Platform support order is Linux first, then macOS, then Windows.
- The native backends in scope are bubblewrap on Linux, Seatbelt/sandbox-exec on macOS, and AppContainer plus Windows Filtering Platform on Windows.
- Windows support is an M5 milestone. Until it is complete, Windows builds fail closed rather than running an unrestricted process.
- The CLI is expected to be a thin orchestration layer over OS-native primitives, not a custom sandbox implementation.
- The project is early-stage and pre-alpha; the README explicitly says it is not ready for production use yet.
Success metrics¶
- A real MCP server runs successfully under a correct policy with transparent stdio.
- A deliberate sandbox-escape attempt (for example, reading a forbidden path or connecting to a disallowed host) is blocked and logged.
- A malformed policy fails early with clear validation errors and no silent fallback to an unsandboxed process.
- The local quickstart in README is demonstrably usable against the MVP build on Linux.
Open questions¶
- The architecture doc suggests Docker is a fallback backend for macOS/Windows, but the README's quickstart says Warden prefers native primitives and only mentions Docker as a reason not to use it. The repo does not yet specify whether Docker is a true fallback for all non-Linux environments or an explicit opt-in mode.
- Trace sessions are JSON Lines files in Warden's state directory;
inituses the newest session by default and never overwrites an existing policy. An interactive approval flow for individual suggested grants remains open. - The Linux egress proxy is launched by the sandbox backend for each run and is reached through an in-namespace loopback bridge.
- Limits are optional policy fields. When configured on Linux,
memory_mbandtimeout_sare enforced for the sandboxed process tree.