mseep-mcp-zammad@0.1.6
CAUTION· not startedPublisher claims: "Model Context Protocol server for Zammad ticket system integration (unofficial)" Observed in sandbox: calls astral.sh only, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
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
ZAMMAD_HTTP_TOKENZAMMAD_OAUTH2_TOKENZAMMAD_PASSWORDZAMMAD_TOKENConfiguration, not credentials: ZAMMAD_URL, ZAMMAD_USERNAME- Where it talks to
- no vendor host named in the codeAlso astral.sh, zammad.com, githubusercontent.com, gierens.de, schemastore.org — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · reached only astral.sh
- What we could not test
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names astral.sh, zammad.com, githubusercontent.com, gierens.de, schemastore.org as well as its own vendor. The guard injects ZAMMAD_HTTP_TOKEN, ZAMMAD_OAUTH2_TOKEN, ZAMMAD_PASSWORD, ZAMMAD_TOKEN only into requests to the host you bind (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 (3 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-12 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: Hidden zero-width characters detected; Pipe-to-shell pattern; Access to sensitive file paths. Summary: calls astral.sh only, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 3 scenariosStatic findings
- label: "👨🚀 crew-backend"Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.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.# Load environment variables from .env filesFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if ".env" in file_path and not file_path.endswith(".env.sample"):Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.The server automatically loads environment variables from the `.env` file in the project directory using `python-dotenv`.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cmd = "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.1. Prevent dangerous operations (rm -rf, .env access)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Check if any tool is trying to access .env files containing sensitive data.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cwd_env = Path.cwd() / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Check bash commands for .env file accessFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Then, try to load from .envrc if it exists and convert to .env formatFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."Found .envrc but environment variables not loaded. Consider using direnv or creating a .env file"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."description": "Auto-update GitHub Actions digests",Fix: Pin versions and sources; vendor anything fetched at install time.[ -f "/etc/apt/keyrings/gierens.gpg" ] && sudo rm -f /etc/apt/keyrings/gierens.gpgFix: 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.RUN chown -R appuser:appuser /appFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.cmd = "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.if [ ! -f .env ]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo mkdir -p /etc/apt/keyringsFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Check for existing .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.cp .env.example .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.default_env = Path(".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Creating .env file from template..."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.self.env_file = env_file or Path(".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(cmd, shell=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.help="Path to environment file (default: .env)",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Configure .env file interactively."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose../validate-env.py # Interactive mode with .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."--env-file", type=click.Path(exists=False, path_type=Path), help="Path to environment file (default: .env)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo chmod 644 /etc/apt/keyrings/gierens.gpg /etc/apt/sources.list.d/gierens.listFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.self.env_example = self.project_root / ".env.example"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chown -R appuser:appuser /appFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.sudo apt-get install -y $missing_toolsFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.env_source = str(env_file) if env_file else ".env or system environment"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo apt-get updateFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- Set Zammad credentials in `.env` fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(cmd, shell=True, check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.sudo gpg --dearmor < "$tmp_key" -o /etc/apt/keyrings/gierens.gpgFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- Interactive .env configurationFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Try to load .env from current directoryFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Copy .env.example if .env doesn't existFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.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.subprocess.run(["uv", "venv"], check=True, capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(["uv", "--version"], capture_output=True, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.env_file = self.project_root / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.[ -f "/etc/apt/keyrings/gierens.gpg" ] && sudo rm -f /etc/apt/keyrings/gierens.gpgFix: 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.| `/memory` | Edit CLAUDE.md memory files |Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.* @ file references add CLAUDE.md in the file's directory and parent directories to contextFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.with tempfile.NamedTemporaryFile(mode="w", suffix=".env", delete=False) as f:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.with patch.dict(os.environ, {"ZAMMAD_URL": "http://192.168.1.100", "ZAMMAD_HTTP_TOKEN": "token"}, clear=True):Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Create a temp .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."Found .envrc but environment variables not loaded. Consider using direnv or creating a .env file"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Test initialize with .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.1. Update CLAUDE.md for AI-specific guidanceFix: 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. 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 mseep-mcp-zammad@0.1.6 as of 2d 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.
- Unclaimed publisher≈ +8 on the totalClaim mseep-support: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- 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.
- Auto-update or dynamic fetch configuration≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- Destructive file system command detected≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.