mcp-mail@0.1.19
CAUTION· install onlyPublisher claims: "Coordinated multi-agent messaging and coordination MCP server." Observed in sandbox: calls astral.sh only, touches nothing outside the project, writes no memory.
Coverage
Install scripts ran; no agent task scenario for this bundle.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
Code inventory arrives with this version's next honeypot run.- It will ask for
- unknown until the next run
- Where it talks to
- unknown until the next run
- What the honeypot saw
- no credential files read · reached only astral.sh
- What we could not test
- use of the skill by an agent
Not enough was observed to say yet. Install scripts ran; no agent task scenario for this bundle. This version's code has not been inventoried for credentials and hosts either; both arrive with its next honeypot run (popular servers first). `vet-skills try mcp-mail` runs it now and prints the full answer.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; install scripts ran; no agent task scenario for this bundle) on 2026-11-08 and scored it 70/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Pipe-to-shell pattern; Pipe-to-shell pattern; Pipe-to-shell pattern. Summary: calls astral.sh only, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 1 s · 2 scenariosStatic findings
echo "Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.echo "Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --yesFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --port 9000 --yesFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.trap "rm -f \"$tmp\" 2>/dev/null" EXIT INT TERMFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.trap "rm -f \"$tmp\" 2>/dev/null" EXIT INT TERMFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.if ! curl -fsSL "${BEADS_INSTALL_URL}" | bash; thenFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.trap "rm -f \"${tmp}\" 2>/dev/null" EXIT INT TERMFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo -e "${BLUE}💡 Install Ollama: curl -fsSL https://ollama.com/install.sh | sh${NC}"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --yesFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.curl -LsSf https://astral.sh/uv/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.grep -E '^(HTTP_|DATABASE_URL|STORAGE_ROOT|LLM_|OPENAI_API_KEY|ANTHROPIC_API_KEY|GOOGLE_API_KEY|GROK_API_KEY|XAI_API_KEY)=' .env | sed -E 's/=(.*)$/=***REDACTED***/'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Load bearer token from environment or .env filesFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env = Path('.env')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.load_token_from_file "${REPO_ROOT}/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.load_token_from_file "${HOME}/.config/mcp-agent-mail/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print(" 6. Add both to your .env file:")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [ ! -f .env ]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Try: 1. Env var, 2. ~/.mcp_mail/credentials.json, 3. Repo .env, 4. Config .env, 5. Legacy .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.grep -E '^(HTTP_|DATABASE_URL|STORAGE_ROOT|LLM_|OPENAI_API_KEY|ANTHROPIC_API_KEY|GOOGLE_API_KEY|GROK_API_KEY|XAI_API_KEY)=' .env | sed -E 's/=(.*)$/=***REDACTED***/'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cp deploy/env/example.env .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [ ! -f .env ]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Please install jq: sudo apt-get install jq (or equivalent for your OS)"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.env = Path('.env')Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "==> No .env found; copying from deploy/env/production.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.trap "rm -f \"${tmp}\" 2>/dev/null" EXIT INT TERMFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Load HTTP_BEARER_TOKEN from a .env-style fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cp deploy/env/production.env .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.local env_file="${REPO_DIR}/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# HTTP_BEARER_TOKEN - Required for authentication (or loaded from .env)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "==> No .env found; copying from deploy/env/example.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.--port PORT HTTP server port (default: 8765); sets HTTP_PORT in .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --yesFix: Pin versions and sources; vendor anything fetched at install time.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.BEADS_INSTALL_URL="https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh"Fix: Pin versions and sources; vendor anything fetched at install time._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.err "Failed to update HTTP_PORT in .env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Reuse existing token if possible (INTEGRATION_BEARER_TOKEN > .env > run helper)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --port 9000 --yesFix: Pin versions and sources; vendor anything fetched at install time.info "Configuring HTTP_PORT=${HTTP_PORT_OVERRIDE} in .env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.err "Failed to append HTTP_PORT to .env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --yesFix: Pin versions and sources; vendor anything fetched at install time.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f ~/.config/mcp-agent-mail/.env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.local key="$1"; local value="$2"; local env_file=".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.trap "rm -f \"$tmp\" 2>/dev/null" EXIT INT TERMFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.trap "rm -f \"$tmp\" 2>/dev/null" EXIT INT TERMFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.if [[ -z "${_TOKEN}" && -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Update or append env var in .env atomically (backup first)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' ~/.config/mcp-agent-mail/.env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ "${DRY_RUN}" == "1" ]]; then _print "[dry-run] set ${key} in .env"; return 0; fiFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "- Check status: sudo ./svc.sh status"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo ./svc.sh startFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.HTTP_BEARER_TOKEN=$(grep -E '^HTTP_BEARER_TOKEN=' .env | sed -E 's/^HTTP_BEARER_TOKEN=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.SLACK_WEBHOOK_URL=$(grep -E '^SLACK_WEBHOOK_URL=' .env | sed -E 's/^SLACK_WEBHOOK_URL=//') || trueFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if sudo ./svc.sh status; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo ./svc.sh installFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.ENV_FILE="$PROJECT_ROOT/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print_info "Creating .env file..."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "- Stop service: sudo ./svc.sh stop"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.print_success ".env file exists at $ENV_FILE"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.print(" curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…s/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null') console.print(…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Check if .env existsFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Create config that gracefully handles missing .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.print(" sudo apt update")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo -e "${BLUE}💡 Install Ollama: curl -fsSL https://ollama.com/install.sh | sh${NC}"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Get config value with precedence: env > credentials.json > .env > default."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# 3. Fall through to decouple (handles .env and defaults)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._DOTENV_PATH: Final[Path] = Path(".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file: Annotated[Optional[Path], typer.Option(..., "--env-file", help="Path to .env file")] = None,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Bridge provider keys from .env to environment for LiteLLMFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.temp_fd, temp_path = tempfile.mkstemp(dir=env_path.parent, prefix=".env.tmp.", text=True)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Set HTTP_PORT in .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod 700 "$PID_DIR" 2>/dev/null || trueFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."""Populate os.environ with provider API keys from .env via decouple if missing.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.print(" sudo dnf install 'dnf-command(config-manager)'")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.DEFAULT_ENV_PATH = Path(".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod +x "$WORLDARCHITECT_HOME/claude_backup.sh"; thenFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.dotenv_path = Path(".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.3. .env file in current directory (for development)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.console.print(" sudo apt install gh -y")Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x "$HOME/.local/bin/claude_backup_wrapper.sh"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.if kill -0 "$PID" 2>/dev/null; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x "$WORLDARCHITECT_HOME/orchestration/cleanup_completed_agents.py"; thenFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.kill $PROXY_PID 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x "$destination"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod +x "$HOME/.local/bin/tmux_cleanup_wrapper.sh"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.if ! kill -0 $START_PID 2>/dev/null; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.kill "$PID" 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --yesFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --yesFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.'.mcpServers = (.mcpServers // {}) | .mcpServers["mcp-agent-mail"] = {"type":"http","url":$url,"core":true,"headers":{"Authorization": ("Bearer " + $token)}}' \Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them._print "[dry-run] chmod 600 ${file}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.echo " chmod 600 ~/.mcp_mail/credentials.json"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.curl -LsSf https://astral.sh/uv/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if ! chmod 600 "$file" 2>/dev/null; thenFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.if ! chmod 700 "$file" 2>/dev/null; thenFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.curl -fsSL https://raw.githubusercontent.com/jleechanorg/mcp_mail/main/scripts/install.sh | bash -s -- --port 9000 --yesFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.log_warn "Failed to chmod 600 ${file} (permissions/readonly filesystem?)"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts._print "[dry-run] chmod 700 ${file}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod 600 "${env_file}" 2>/dev/null || warn "Could not set .env permissions to 600"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.if ! curl -fsSL "${BEADS_INSTALL_URL}" | bash; thenFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if [[ "${DRY_RUN}" == "1" ]]; then _print "[dry-run] kill -TERM ${to_kill[*]}"; return 0; fiFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Gracefully kill a list of PIDs owned by current user; escalate to KILL after timeoutFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo "Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if kill -0 "$pid" 2>/dev/null; then alive+=("$pid"); fiFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run(["brew", "install", "gh"], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["gh", "--version"], capture_output=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process.wait() # Wait for kill to completeFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x scripts/test_rich_output.pyFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.kill -KILL "${alive[@]}" 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo "Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(cmd, capture_output=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.chmod 600 "$CREDS_FILE"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod +x "$HOME_SCRIPT"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod +x scripts/auto_resolve_conflicts.shFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod 700 "$CREDS_DIR"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.kill -TERM "${to_kill[@]}" 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(cmd, capture_output=True, text=True, input=input_text)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.kill $PROXY_PID 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(command, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.rc = subprocess.run(list(cmd), env=env, check=False).returncodeFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run([sys.executable, str(wizard_script)], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Detect AGENTS.md/CLAUDE.md files and append the latest Agent Mail + Beads blurbs."""Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.## Ready-Made Blurb to Add to Your AGENTS.md or CLAUDE.md Files:Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.cp = subprocess.run(["git", "-C", str(path), *args], check=True, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(cmd, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.cp = subprocess.run(["git", "-C", str(cwd), *args], check=True, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.… have the mail tool available. See below for a ready-made chunk of text you can add to the end of your existing AGENTS.md or CLAUDE.md files to help your agents better utilize the new tools. # Change port after in…Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
No advisories in OSV for mcp-mail@0.1.19 as of 6d ago. This is the package itself, not its dependencies.
What would make this Verified
10 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Pipe-to-shell pattern≈ +9 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Destructive command against a filesystem root or device≈ +9 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Unclaimed publisher≈ +8 on the totalClaim jleechanorg: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Destructive file system command detected≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.