openapi-to-mcp-cli@0.10.0
CAUTION· not startedPublisher claims: "Generate, run, and test Node.js/TypeScript MCP servers from OpenAPI specifications." 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_BEARER_TOKENAUTH_COOKIE_API_KEYAUTH_HEADER_API_KEYAUTH_QUERY_API_KEYConfiguration, not credentials: BEFORE_SHA, GITHUB_OUTPUT, GITHUB_STEP_SUMMARY- Where it talks to
- no vendor host named in the codeAlso swagger.io — 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 swagger.io as well as its own vendor. The guard injects AUTH_BEARER_TOKEN, AUTH_COOKIE_API_KEY, AUTH_HEADER_API_KEY, AUTH_QUERY_API_KEY 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 68/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 · 0 s · 2 scenarios · 0 deviationsStatic findings
if [[ -f "${output_dir}/.env.example" && ! -f "${output_dir}/.env" ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Parses a .env file into a dictionary."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.replace_or_append_env_var "${output_dir}/.env" "TARGET_API_BASE_URL" "$TARGET_API_BASE_URL"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."if (process.getuid() === 0 || require('node:fs').existsSync('/app/.env')) process.exit(1)"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Parses env source from JSON string, JSON file, or .env file.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.rm -rf \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.raise ValueError(f"Failed to parse .env file '{file_path}': {e}") from eFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.printf 'BUILD_CONTEXT_SENTINEL=must-not-be-copied\n' > "$MCP_CONTAINER_DIR/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f "${output_dir}/.env.example" && ! -f "${output_dir}/.env" ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.rm -rf \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.cp "${output_dir}/.env.example" "${output_dir}/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.or a path to a .env file.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.raise ValueError(f".env file not found at: {file_path}") from errFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.output_dir / ".env.example"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.check_output(["git", *args], text=True).strip() # noqa: S603, S607Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.data = subprocess.check_output( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Generate MCP server in OUTPUT_DIR and create/update .env.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_contents = (output_dir / ".env").read_text(encoding="utf-8")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if kill -0 "$pid" >/dev/null 2>&1; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.prior = subprocess.check_output( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.env_contents = (output_dir / ".env").read_text(encoding="utf-8")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.printf '%s/%s.log\n' "$TMP_ROOT" "$(basename "$output_dir")"Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = _parse_dotenv("fake_path/.env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(fetch_command, check=True) # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.start_run_command "${TMP_ROOT}/run-no-validation.log" "$RUN_NO_VALIDATION_OUTPUT_DIR" --runtime-validation noneFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.if kill -0 "$pid" >/dev/null 2>&1; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.check_output(["git", *arguments], text=True) # noqa: S603, S607Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.kill "$pid" >/dev/null 2>&1 || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.(output_dir / ".env.example").write_text(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.existing_tag_ref = subprocess.check_output( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.--output-dir "$MCP_CONTAINER_DIR" --mcp-server-name container-example --transport streamable-httpFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.completed = subprocess.run( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.kill "$HTTP_SERVER_PID" >/dev/null 2>&1 || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.(output_dir / ".env.example").write_text(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.replace_or_append_env_var "${output_dir}/.env" "TARGET_API_BASE_URL" "$TARGET_API_BASE_URL"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.kill "$pid" >/dev/null 2>&1 || trueFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."""Test behavior when .env file is not found."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ -f "${OUTPUT_DIR}/.env.example" && ! -f "${OUTPUT_DIR}/.env" ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Test parsing a valid .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(auth_project / ".env.example").read_text(encoding="utf-8"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.process = subprocess.Popen( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.if [[ -n "$HTTP_SERVER_PID" ]] && kill -0 "$HTTP_SERVER_PID" >/dev/null 2>&1; thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.cp "${output_dir}/.env.example" "${output_dir}/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(output_dir / ".env.example").write_text(Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.rm -rf \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.start_run_command "${TMP_ROOT}/run.log" "$RUN_OUTPUT_DIR" --max-concurrency 7Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.cp "${OUTPUT_DIR}/.env.example" "${OUTPUT_DIR}/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Test parsing a .env file with lines that don't have '='."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = _parse_dotenv("fake_path/.env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run( # noqa: S603Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.rm -rf \Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.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 openapi-to-mcp-cli@0.10.0 as of 18 h ago. This is the package itself, not its dependencies.
What would make this Verified
12 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- 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 nihal1294: 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.
- Destructive file system command detected≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.