mcp-server-odoo@0.9.0
CAUTION· not startedPublisher claims: "A Model Context Protocol server for Odoo ERP systems" 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
ODOO_API_KEYODOO_PASSWORDConfiguration, not credentials: ODOO_DB, ODOO_LOCALE, ODOO_MCP_ALLOWED_HOSTS, ODOO_MCP_HOST, ODOO_MCP_LOG_FILE, ODOO_MCP_LOG_FORMAT, ODOO_MCP_LOG_JSON, ODOO_MCP_LOG_LEVEL, ODOO_MCP_LOG_REQUEST_BODY, ODOO_MCP_LOG_RESPONSE_BODY, ODOO_MCP_PORT, ODOO_MCP_SLOW_OPERATION_THRESHOLD_MS, ODOO_MCP_TRANSPORT, ODOO_RPC_TRANSPORT, ODOO_URL, ODOO_USER, ODOO_YOLO- 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 ODOO_API_KEY, ODOO_PASSWORD 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-09 and scored it 72/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; Hex-encoded string detected; 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
# os.environ below) would mask .env settings, because load_dotenv()Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose._LINE_BREAK_TRANSLATION = dict.fromkeys(map(ord, "\r\n\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029"), " ")Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.# actual values from the environment AND the .env file. EagerlyFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.load_config() loads the .env file — snapshotting in __init__ wouldFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.<summary>macOS/Linux</summary> ```bash curl -LsSf https://astral.sh/uv/install.sh | sh ```Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.looks for .env in current directory.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file: Optional path to .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.silently ignore any ODOO_MCP_LOG_* values set only in .env.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file: Optional path to .env file. If not provided,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Check if we have a .env file or environment variablesFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.print("\nPlease check your environment variables or .env file", file=sys.stderr)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# 2.2 is the floor: MCPServer, run_streamable_http_async(session_idle_timeout=...)Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them."""Load configuration from environment variables and .env file.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Create a test .env file in tmp directoryFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.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.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.print("Copy .env.example to .env and update with your values")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Load .env file for testsFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.uri = "odoo://res.partner/search?domain=%5B%28%27is_company%27%2C%27%3D%27%2CTrue%29%5D"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.# Create a temporary .env file with different valuesFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Standard-mode config (no YOLO) — relies on .env / environment."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ENV_FILE="$PROJECT_ROOT/.env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Load real configuration from .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.to actual env vars at test time, after .env is loaded by conftest.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.pytest.skip("Neither ODOO_API_KEY nor ODOO_PASSWORD set. Please configure .env file.")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Integration tests with real .env configuration."""Fix: 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."""Tests for CLI argument / environment / .env precedence in __main__."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "ERROR: No .env file found at $ENV_FILE!"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Load real configuration from .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Create a temporary .env fileFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Please create a .env file based on .env.example"Fix: 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.print("\nPlease configure these in your .env file")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Test API key authentication using .env configuration."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Values set only in .env must take effect (argparse defaults used toFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Test that environment variables override .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.self.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# This avoids import-order issues with .env loading.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose."""Test loading configuration from .env file."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.== "odoo://res.partner/search?domain=%5B%28%27is_company%27%2C%27%3D%27%2CTrue%29%5D"Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own."""Test server initialization with .env file in isolated environment."""Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.self.server_process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.env_file = tmp_path / ".env"Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.pytest.skip("ODOO_URL environment variable not set. Please configure .env file.")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# Change to temp directory to isolate from project .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Look for .env file in the project rootFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.self.server_process = 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 mcp-server-odoo@0.9.0 as of 5d ago. This is the package itself, not its dependencies.
What would make this Verified
8 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim ivnvxd: 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.
- Hex-encoded string detected≈ +4 on the totalPut hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.