opensearch-mcp-server@2.1.9
VERIFIED· not startedPublisher claims: "MCP Server for interacting with Elasticsearch and OpenSearch" 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: Verified 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
MCP_API_KEYConfiguration, not credentials: DEFAULT_CLUSTER, DISABLE_HIGH_RISK_OPERATIONS, DISABLE_OPERATIONS, REQUEST_TIMEOUT, RESPONSE_FORMAT, VERIFY_CERTS- Where it talks to
- no vendor host named in the code
- 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. It asks for MCP_API_KEY and talks to its vendor. Give the credential to the guard, not the server: the value never enters the server's environment and only travels to the host you bind. What the tools do with a real credential was not observed.
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 87/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
RUN chmod +x /app/entrypoint.shFix: 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.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.find . -type f -exec chmod 640 \{\} \;;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.find . -type d -exec chmod 750 \{\} \;;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.echo "Set the ELASTICSEARCH_PASSWORD environment variable in the .env file";Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.run: sudo sysctl -w vm.max_map_count=262144Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.chmod +x kindFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.chown -R root:root config/certs;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.sudo mv kind /usr/local/bin/kindFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.run: sudo sysctl -w vm.max_map_count=262144Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.("http://user:pw@host:9200/idx/_search", "/idx/_search"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.async def _request(server: SearchMCPServer, path: str) -> httpx.Response:Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.("POST", httpx.URL("http://u:p@h:9200/idx/_doc/1?q=s"), "HTTP/1.1", 200, "OK"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.("HTTPS://u:p@h:9200/x?q=1 done", "/x done"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.logger.info("POST http://u:p@h:9200/_query?x=1 [status:400]")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.record = _record("%d http://u:p@h:9200/x", ("notanint",))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.url = "http://MARKER_USER:MARKER_PW@MARKER_HOST:9200/idx/_search?MARKER_Q=1"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.record = _record("GET %s done", ("https://u:p@h:9200/a/_search?x=1",))Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.def _httpx_error(status, body, method="POST", url="http://user:pw@host:9200/_query?secretparam=1",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."http://user:SECRETPW@proxy:0",Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.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 opensearch-mcp-server@2.1.9 as of 14 h ago. This is the package itself, not its dependencies.