mcp-contextforge-gateway@1.1.0
CAUTION· not startedPublisher claims: "ContextForge AI Gateway — an AI gateway, registry, and proxy for MCP, A2A, and REST/gRPC APIs. Exposes a unified control plane with centralized governance, discovery, and observability. Optimizes agent and tool calling, and supports plugins." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- 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
AUTH_REQUIREDCI_DEFAULT_USER_PASSWORDCI_ENC_SECRETCI_JWT_SECRETCI_PLATFORM_ADMIN_PASSWORDDATABASE_URLDETECT_SECRETS_FILES_EXCLUDEDETECT_SECRETS_PATHDETECT_SECRETS_SPECDOCKER_PASSWORDJWT_SECRET_KEYKEY_FILE_PASSWORDMCPGATEWAY_BEARER_TOKENTOKENTOKEN_EXPIRYor--jwt-secretConfiguration, not credentials: BENCHMARK_ITERATIONS, CONTAINERFILE_PATH, CONTEXTFORGE_URL, DB_MAX_OVERFLOW, DB_PATH, DB_POOL_RECYCLE, DB_POOL_SIZE, DB_POOL_TIMEOUT, FORGE_CONTENT_TYPE, LOOPBACK_CLIENT_KEY, MCG_HOST, MCG_PORT, MCPGATEWAY_URL, NGINX_DOCKERFILE_PATH, PLATFORM_ADMIN_EMAIL, SQLALCHEMY_ECHO, TRACKED_PATHS, VENV_DIR, VIRTUAL_ENV, WHEELS_CONTAINERFILE_PATH- Where it talks to
- no vendor host named in the codeAlso docker.com, sqlalchemy.org, cohere.ai, mistral.ai, groq.com, together.xyz, ibm.com, brew.sh, graphviz.org, pandoc.org, redhat.com, duckduckgo.com, astral.sh, httpbin.org — 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
- 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 docker.com, sqlalchemy.org, cohere.ai, mistral.ai, groq.com, together.xyz, ibm.com, brew.sh, graphviz.org, pandoc.org, redhat.com, duckduckgo.com, astral.sh, httpbin.org as well as its own vendor. The guard injects AUTH_REQUIRED, CI_DEFAULT_USER_PASSWORD, CI_ENC_SECRET, CI_JWT_SECRET, CI_PLATFORM_ADMIN_PASSWORD, DATABASE_URL, DETECT_SECRETS_FILES_EXCLUDE, DETECT_SECRETS_PATH, DETECT_SECRETS_SPEC, DOCKER_PASSWORD, JWT_SECRET_KEY, KEY_FILE_PASSWORD, MCPGATEWAY_BEARER_TOKEN, TOKEN, TOKEN_EXPIRY 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 (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-13 and scored it 64/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: Collapsed <details> block carrying instructions; Collapsed <details> block carrying instructions; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
<summary><strong>🔍 OpenTelemetry Observability</strong></summary> * **Vendor-agnostic tracing** with OpenTelemetry (OTLP) protocol support * **Multiple backendFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.<summary><strong>📋 Prerequisites</strong></summary> * **Python ≥ 3.11** * **curl + jq** - only for the last smoke-test stepFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.### 4. Enable in .envFix: 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 | sh >&2Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.path (str): Path to the .env file to validate. Defaults to ".env".Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.>>> _handle_validate_config(".env.example") # doctest: +SKIPFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.def _handle_validate_config(path: str = ".env") -> None:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Attempts to load settings from the specified .env file using Pydantic.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo dnf remove -y docker \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# .env files and exported variables take the same precedence as they do forFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " sudo sysctl -w net.core.somaxconn=65535"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Generate admin bypass token (teams=null + is_admin=true) via Python scriptFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.docker run --rm \Fix: 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.sudo dnf remove -y podman runc 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.curl -fsSL "$docker_repo_base/gpg" | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.if [[ -f .env.example ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo apt updateFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo "FATAL: Could not generate admin bypass token"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo dnf remove -y podman runc 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo systemctl enable dockerFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo dnf -y install dnf-plugins-coreFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.ENV_FILE=${ENV_FILE:-.env}Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Run with: sudo scripts/tune-loadtest.shFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Then run this script as that user (or any user with sudo privileges).Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# leaves this unset so Compose applies its default .env.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " usermod -aG sudo contextforge # Debian-family"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo install -m 0755 -d /etc/apt/keyringsFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.log_error "Do not run this script as root. Run as a regular user with sudo privileges."Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Create default .env if it doesn't existFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.log_info ".env file already exists"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Install with: sudo apt-get install libpq-dev (or dnf install postgresql-devel)Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo chmod a+r /etc/apt/keyrings/docker.gpgFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " Admin bypass token: ${ADMIN_T:0:40}..."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo apt install -y \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo usermod -aG docker "$USER"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Admin bypass token (teams=null + is_admin=true)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo systemctl start dockerFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.sudo dnf install -y --allowerasing \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo "FATAL: Could not generate admin-no-bypass token"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.docker run --rm \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# usermod -aG sudo contextforge # Debian-familyFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " -e, --env FILE Use specific env file (default: .env)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.log_info "Creating .env from .env.example..."Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sudo chmod a+r /etc/apt/keyrings/docker.gpgFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.token_result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.url: "https://mcp-server.egnyte.com/sse"Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.touch "${db_file}" && chmod 666 "${db_file}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.curl -LsSf https://astral.sh/uv/install.sh | sh >&2Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.install: "npx -y @microsoft/devbox-mcp@latest"Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(cmd, shell=True, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.chmod 640 /certs/key.pemFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.…ting/performance.md for full details # # One-liner (TCP + VM + I/O tuning): # sudo sysctl -w net.core.somaxconn=65535 net.core.netdev_max_backlog=65535 net.ipv4.tc…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.return subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Make persistent: sudo tee /etc/sysctl.d/99-mcp-loadtest.conf (see docs)Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- no-new-privileges:true # Prevent privilege escalation via setuid/sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# secret the already-running gateway is using (JWT_SECRET_KEY in its .env),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- "JWT_SECRET_KEY=${JWT_SECRET_KEY:?JWT_SECRET_KEY is not set. Run: make setup (if .env does not exist) or make init-secrets-patch-env (if .env exists)}"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.touch "${db_file}" && chmod 666 "${db_file}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.lsof -ti:$PORT | xargs kill -9 2>/dev/null || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo " sudo sysctl -w net.ipv4.ip_local_port_range='1024 65535'"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod 640 /certs/key.pemFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.$(sudo_if) chmod +x /usr/local/bin/sccFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.- DANGEROUSLY_OMIT_AUTH=true # Skip proxy token (safe: local dev only)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod 777 "${db_dir}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.install: "npx @playwright/mcp@latest"Fix: Pin versions and sources; vendor anything fetched at install time.chmod 644 /certs/cert.pemFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.rm -rf /var/lib/apt/lists/*Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.install: "npx -y @azure-devops/mcp"Fix: Pin versions and sources; vendor anything fetched at install time.echo " sudo sysctl -w net.core.netdev_max_backlog=65535"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Check .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if kill -0 "${pid}" 2>/dev/null; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.- "DEFAULT_USER_PASSWORD=${DEFAULT_USER_PASSWORD:?DEFAULT_USER_PASSWORD is not set. Run: make setup (if .env does not exist) or make init-secrets-patch-env (if .env exists)}"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.if os.path.exists(".env"):Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.- "AUTH_ENCRYPTION_SECRET=${AUTH_ENCRYPTION_SECRET:?AUTH_ENCRYPTION_SECRET is not set. Run: make setup (if .env does not exist) or make init-secrets-patch-env (if .env exists)}"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod 777 "${db_dir}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.result = subprocess.run(cmd, shell=True, capture_output=capture_output, text=True, timeout=timeout)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.echo " To stop it: kill ${pid}"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."api_base": "https://us-south.ml.cloud.ibm.com",Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.chmod 777 "${db_dir}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.traversal_resource = {"uri": "../../etc/passwd", "name": "Test traversal", "content": "test"}Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.pid = int(subprocess.check_output(["lsof", "-ti", f"TCP:{PORT_TIME_SERVER}"], text=True).strip())Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.check_output(cmd, text=True).strip().strip('"')Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.print_info("DATABASE_URL configured in .env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print_status(".env file present")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(MAKE_DOCKER_STOP, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.kill "$SERVER_PID" >/dev/null 2>&1 || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.with open(".env", "r") as f:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.logging.error(" - Look for translate_*.log files for detailed output")Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ng login provisioning, and restrict local password auth to admins when preserve-admin mode is enabled. * **L-10**: Security architecture docs now align with current token…Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.* **Non-Admin Login Blocked** ([#2590](https://github.com/IBM/mcp-context-forge/issues/2590)) - Users without admin privileges can now login via UI and APIFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.proc = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.uvx_check = subprocess.run(["uvx", "--version"], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Enable debug modeFix: 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 mcp-contextforge-gateway@1.1.0 as of 39 min ago. This is the package itself, not its dependencies.
What would make this Verified
16 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 ibm: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- 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.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Credential pass-through configuration≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.