tokensafe@3.1.5
CAUTION· startup onlyPublisher claims: "Reduce your AI bills by up to 99% locally. Your agents read only needed code, keep prompt caches intact across turns, and keep secrets out of git." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
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
- It will ask for
ANTHROPIC_API_KEYDEEPSEEK_API_KEYGEMINI_API_KEYOPENAI_API_KEYTOKENSAFE_AGENTTOKENSAFE_ALLOWED_ORIGINSTOKENSAFE_AUTOPRUNE_INTERVALTOKENSAFE_BG_LICENSE_KEYTOKENSAFE_BUNDLE_MAX_TOKENSTOKENSAFE_CACHE_TIMEOUTTOKENSAFE_CLOUD_DB_PATHTOKENSAFE_CLOUD_URLTOKENSAFE_CONTEXT_WINDOWTOKENSAFE_DATA_DIRTOKENSAFE_DB_PATHTOKENSAFE_GRAPH_DISK_CACHETOKENSAFE_GRAPH_TTLTOKENSAFE_HMAC_SALTTOKENSAFE_HOSTTOKENSAFE_LICENSE_KEYTOKENSAFE_LIVE_FLUSH_SECONDSTOKENSAFE_LIVE_URLTOKENSAFE_MAX_EVENTSTOKENSAFE_MAX_TURN_TOKENSTOKENSAFE_MCP_AUTORELOADTOKENSAFE_MCP_TIMEOUTTOKENSAFE_NONINTERACTIVETOKENSAFE_PRIVATE_KEYTOKENSAFE_PUBLIC_KEYTOKENSAFE_RETENTION_DAYSTOKENSAFE_SELF_HOSTEDTOKENSAFE_TARGET_TURN_TOKENSTOKENSAFE_TELEMETRY_DISABLEDTOKENSAFE_TOOL_PRUNE_ALLOWLISTTOKENSAFE_TOOL_PRUNE_KEEPTOKENSAFE_TOOL_PRUNINGTOKENSAFE_TREESITTERTOKENSAFE_UPSTREAM_KEYTOKENSAFE_UPSTREAM_MODELTOKENSAFE_UPSTREAM_URLor--claim-token- Where it talks to
- tokensafe.dev (its own)Also deepseek.com, python.org, apple.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names deepseek.com, python.org, apple.com as well as its own vendor. The guard injects ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, OPENAI_API_KEY, TOKENSAFE_AGENT, TOKENSAFE_ALLOWED_ORIGINS, TOKENSAFE_AUTOPRUNE_INTERVAL, TOKENSAFE_BG_LICENSE_KEY, TOKENSAFE_BUNDLE_MAX_TOKENS, TOKENSAFE_CACHE_TIMEOUT, TOKENSAFE_CLOUD_DB_PATH, TOKENSAFE_CLOUD_URL, TOKENSAFE_CONTEXT_WINDOW, TOKENSAFE_DATA_DIR, TOKENSAFE_DB_PATH, TOKENSAFE_GRAPH_DISK_CACHE, TOKENSAFE_GRAPH_TTL, TOKENSAFE_HMAC_SALT, TOKENSAFE_HOST, TOKENSAFE_LICENSE_KEY, TOKENSAFE_LIVE_FLUSH_SECONDS, TOKENSAFE_LIVE_URL, TOKENSAFE_MAX_EVENTS, TOKENSAFE_MAX_TURN_TOKENS, TOKENSAFE_MCP_AUTORELOAD, TOKENSAFE_MCP_TIMEOUT, TOKENSAFE_NONINTERACTIVE, TOKENSAFE_PRIVATE_KEY, TOKENSAFE_PUBLIC_KEY, TOKENSAFE_RETENTION_DAYS, TOKENSAFE_SELF_HOSTED, TOKENSAFE_TARGET_TURN_TOKENS, TOKENSAFE_TELEMETRY_DISABLED, TOKENSAFE_TOOL_PRUNE_ALLOWLIST, TOKENSAFE_TOOL_PRUNE_KEEP, TOKENSAFE_TOOL_PRUNING, TOKENSAFE_TREESITTER, TOKENSAFE_UPSTREAM_KEY, TOKENSAFE_UPSTREAM_MODEL, TOKENSAFE_UPSTREAM_URL only into requests to tokensafe.dev (and its subdomains) and refuses the rest.
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; startup only; authenticated tool behavior not tested) on 2026-11-15 and scored it 52/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: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 20 s · 2 scenariosStatic findings
… without permissions, timestamps, or ignored folders (node_modules, .git, dist, .env). Replaces verbose ls -la. Pass '.' for project root or a subfolder like 'src'.…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Works with `npx tokensafe [command]` or global `tokensafe [command]`Fix: Pin versions and sources; vendor anything fetched at install time.r"""process\.env(?:\.([A-Za-z0-9_]+)|\[\s*['"]([A-Za-z0-9_]+)['"]\s*\])\s*(?:\|\||\?\?)\s*['"`]([^'"`\n]+)['"`]""",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.".env", ".env.local", ".env.production", ".env.staging", ".env.development",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.When interacting within this environment, you MUST follow strict token economy guidelines:Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Rule: Token-Optimized Communication Protocol (TOCP) Trigger: always_onFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.r"rm\s+(-[a-zA-Z]*\s+)*-?[rf]{2,}[a-zA-Z]*\s+(--\s+)?/(?:\s|$)", # rm -rf /Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.5. Git Staging Protection for Sensitive Files (.env*, *.key, *.pem)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.r"rm\s+(-[a-zA-Z]*\s+)*-?[rf]{2,}[a-zA-Z]*\s+(--\s+)?/(?:\s|$)", # rm -rf /Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.run(cmd, cwd=PROJECT_ROOT, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Ignores heavy folders (node_modules, dist, .git, etc.) and redacts sensitive files (.env*).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run([sys.executable, "-m", "venv", venv_dir],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# 1. Destructive Unbounded File Deletion (rm -rf /, rm -rf ~, rm -rf *, etc.)Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run([venv_py, "-m", "pip", "install", "-q", "pytest", *deps, "-e", repo_root],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "fetch", "--depth", depth, "origin"], cwd=dest,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.env_path = os.path.join(root, ".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."dockerfile", "dockerfile.cloud", "docker-compose.yml", ".env.example",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.'.env', '.env.local', '.env.production', '.env.staging', '.env.development'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.6. Destructive Shell Command & Unbounded Deletion Prevention (rm -rf /)Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run(["xdg-open", out_path], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["open", out_path], check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.r'|(?:\.env(?:\.[\w\-]+)?|\.gitignore|\.dockerignore|\.prettierrc[\w\.\-]*|\.eslintrc[\w\.\-]*|\.npmignore|\.npmrc|\.yarnrc)'Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.res = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "reset", "--hard", "-q", "origin/HEAD"], cwd=dest,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "clone", "--depth", depth, "-q", repo["url"], dest],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.console.error(' Debian: sudo apt-get install python3\n');Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.tokensafe test "<prompt>" # Test TOCP S-expression prompt compactionFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.subprocess.run(["launchctl", "unload", plist_path], capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.res = 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.subprocess.Popen(Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.print(f" {CYAN}→{RESET} Updating global npm package via {npm_bin} (npm install -g tokensafe@latest)...")Fix: Pin the exact version (`[email protected]`, `==1.2.3`) so every install gets the bytes that were reviewed.subprocess.Popen(term)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.res = subprocess.run(["launchctl", "load", "-w", plist_path], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.tokensafe test "<prompt>" Preview prompt compaction on custom inputFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.subprocess.Popen([Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.p = subprocess.Popen(zenity_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["systemctl", "--user", "disable", "--now", cls._SERVICE_NAME], capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["launchctl", "unload", plist_path], capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for tokensafe@3.1.5 as of 24 min ago. This is the package itself, not its dependencies.
What would make this Verified
28 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Reads credential files≈ +27 on the totalThe sandbox saw reads under ~/.ssh, ~/.aws, ~/.npmrc, ~/.config or similar. Read only files inside the project, and only the ones the task needs. Seen: ~/.tokensafe/venv/pyvenv.cfg, ~/.tokensafe/venv/bin/python3._pth, ~/.tokensafe/venv/lib/python3.11/site-packages.
- 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 tokensafe-dev: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
- 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.