odoo-sh-readonly-mcp
Provides read-only access to Odoo.sh projects, including builds, branches, environments, logs, and system status via web API and SSH.
Allows listing PostgreSQL databases and their sizes on the Odoo.sh environment.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@odoo-sh-readonly-mcpShow me the latest build statuses for my Odoo.sh project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
odoo-sh-readonly-mcp 🔒
MCP solo lectura para Odoo.sh: builds, entornos, logs y estado del sistema — consultable por una AI sin entrar a la web.
Sin tools de escritura: no hay git push, ni shell arbitrario, ni escritura de archivos. SSH via execFile (sin shell → sin command injection) con comandos whitelisted. El smoke test de CI falla el build si alguna vez aparece una tool con nombre de escritura o sin readOnlyHint.
📑 Tabla de contenidos
Related MCP server: readonly-mcp-akamai
🧰 Tools
Tool | Fuente | Qué da |
| Web API | Repos + branches con stage (production/staging/dev) y último build |
| Web API | Builds recientes con status real (success/failed/testing) |
| Web API | Introspección de campos de modelos |
| Web API | Query genérica read-only (whitelist |
| SSH |
|
| SSH | Hostname, uptime, disco, memoria, versiones |
| SSH | DBs PostgreSQL y tamaños |
| — | Diagnóstico de configuración (sin exponer secretos) |
🐳 Instalación via imagen GHCR (recomendado)
Cada push a main publica una imagen multi-arch (amd64/arm64) en GitHub Container Registry:
ghcr.io/ai-zar/odoo-sh-readonly-mcp:latest1. Autenticarse contra GHCR
El repo es privado, así que la imagen también. Necesitás un PAT con scope read:packages:
echo $GITHUB_PAT | docker login ghcr.io -u TU_USUARIO --password-stdin
docker pull ghcr.io/ai-zar/odoo-sh-readonly-mcp:latest2. Configurar el cliente MCP
Solo builds/entornos (sin SSH):
{
"mcpServers": {
"odoo-sh": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "ODOO_SH_SESSION_ID",
"-e", "ODOO_SH_PROJECT",
"ghcr.io/ai-zar/odoo-sh-readonly-mcp:latest"
],
"env": {
"ODOO_SH_SESSION_ID": "tu_session_id",
"ODOO_SH_PROJECT": "mi-proyecto"
}
}
}
}Con SSH (logs / system / DBs) — montá la clave privada read-only:
{
"mcpServers": {
"odoo-sh": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/home/usuario/.ssh/odoo_sh:/keys/id:ro",
"-e", "ODOO_SH_SESSION_ID",
"-e", "ODOO_SH_SSH_HOST",
"-e", "ODOO_SH_SSH_USER",
"-e", "ODOO_SH_SSH_KEY_PATH",
"ghcr.io/ai-zar/odoo-sh-readonly-mcp:latest"
],
"env": {
"ODOO_SH_SESSION_ID": "tu_session_id",
"ODOO_SH_SSH_HOST": "mi-proyecto.dev.odoo.com",
"ODOO_SH_SSH_USER": "BUILD_ID",
"ODOO_SH_SSH_KEY_PATH": "/keys/id"
}
}
}
}⚠️ En Windows usá rutas estilo
C:\\Users\\usuario\\.ssh\\odoo_sh:/keys/id:roen el-v.ODOO_SH_SSH_KEY_PATHsiempre apunta a la ruta dentro del contenedor (/keys/id).
3. Probar la imagen a mano
docker run -i --rm -e ODOO_SH_SESSION_ID=xxx \
ghcr.io/ai-zar/odoo-sh-readonly-mcp:latestPegá esto en stdin para ver las tools:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"cli","version":"1"}}}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}💻 Instalación local (Node)
git clone https://github.com/ai-zar/odoo-sh-readonly-mcp.git
cd odoo-sh-readonly-mcp
npm install
npm run smoke # verifica que arranca y expone las 8 tools{
"mcpServers": {
"odoo-sh": {
"command": "node",
"args": ["C:\\ruta\\absoluta\\odoo-sh-readonly-mcp\\index.js"],
"env": { "ODOO_SH_SESSION_ID": "tu_session_id" }
}
}
}⚙️ Configuración
Variable | Requerida | Descripción |
| ✅ (web) | Cookie |
| ❌ | Repo por defecto para filtrar |
| ❌ | Default |
| ✅ (ssh) |
|
| ✅ (ssh) |
|
| ✅ (ssh) | Ruta a la clave privada |
| ❌ | Default |
| ❌ | Default |
🍪 Obtener la cookie de sesión
Odoo.sh no expone API pública; su panel web es un Odoo estándar. Se usa tu propia sesión:
Logueate en https://www.odoo.sh
F12 → Application → Cookies →
www.odoo.sh→ copiásession_id
La cookie expira: cuando las llamadas fallen con error de sesión, repetí el paso. Los permisos son exactamente los de tu usuario — ni más ni menos.
💬 Ejemplos de uso con AI
"¿Cómo están los builds de staging?"
"¿Falló algún build esta semana en main?"
"Mostrame los últimos errores del log de producción"
"¿Cuánto pesa la DB de producción?"
"Listame todos los entornos y en qué commit está cada uno"
🔬 Nota técnica: modelos paas.*
Los modelos internos de Odoo.sh (paas.build, paas.branch, ...) no están documentados y sus campos pueden cambiar. Por eso:
resilientSearchRead: si un campo no existe, reintenta pidiendo todos los campos legiblesodoo_sh_model_fields: la AI puede autodescubrir el schema y después consultar con precisión viaodoo_sh_search_read
Primera vez, pedile a la AI:
"Usá
odoo_sh_model_fieldssobrepaas.buildy después listá los builds con los campos correctos"
🛡️ Seguridad
Riesgo | Mitigación |
Command injection | SSH via |
Escritura accidental | No existen tools de escritura. Whitelist de modelos + de métodos ( |
Prompt injection → acción destructiva | Superficie de ataque = solo lectura. Lo peor que puede pasar es leer datos a los que ya tenés acceso |
MITM en SSH |
|
Secretos en la imagen | Nada hardcodeado; todo por env vars. Clave SSH se monta read-only en runtime |
Supply chain | Imagen con attestation de provenance ( |
MIT — ver LICENSE.
Available Tools
8 toolsodoo_sh_databasesList databases (SSH)ARead-only
List PostgreSQL databases and sizes on the configured Odoo.sh build container. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explicitly declares 'Read-only', which aligns with the readOnlyHint annotation. No additional side effects are described, but for a read-only listing tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise and to the point. Every word adds meaning; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and a simple read-only action, the description is complete. It does not explain output format, but the lack of output schema and the simplicity of the action make this acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so the description naturally covers all there is to know. The description does not add extra semantics, but none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('List') and the specific resource ('PostgreSQL databases and sizes on the configured Odoo.sh build container'). Distinct from sibling tools like odoo_sh_overview or odoo_sh_logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The 'Read-only' note provides some context, but no direct comparison to sibling tools or conditions for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_list_buildsList Odoo.sh buildsARead-only
List recent builds with their REAL status/result (e.g. success, failed, testing) from the Odoo.sh platform API. Filter by branch name. Requires ODOO_SH_SESSION_ID.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max builds to return | |
| branch | No | Branch name to filter, e.g. 'main' or 'staging-x' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the requirement for ODOO_SH_SESSION_ID and emphasizes 'REAL' statuses, which goes beyond the readOnly/openWorld/destructive annotations. No contradictions exist, and it provides useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no redundancy. It efficiently conveys purpose, key details, and a requirement without any fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides enough context for the expected output (builds with statuses), the source (Odoo.sh API), and a prerequisite (session ID). While there is no output schema, the description gives a reasonable idea of what the tool returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions for limit and branch. The description reinforces branch filtering but does not add significant meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: listing recent builds with their actual statuses (success, failed, testing). It distinguishes itself from sibling tools by focusing on builds and mentioning the Odoo.sh API and branch filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'List recent builds' and mentions branch filtering, which implies when to use it. However, it does not explicitly contrast it with alternatives like odoo_sh_logs or odoo_sh_status, so usage guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_logsRead Odoo logs (SSH)CRead-only
Tail Odoo logs (odoo.log, install.log or pip.log) from the configured Odoo.sh build container via SSH. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| grep | No | Optional fixed-string filter (case-insensitive), e.g. 'ERROR' | |
| lines | No | ||
| log_type | No | odoo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false; description reinforces this with 'Read-only' and adds context about SSH and specific log files. It does not describe return format, whether the tail is continuous, or any operational caveats, but no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no redundant phrasing. The core action, target, and safety are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides purpose and safety but omits parameter semantics and output expectations. Without an output schema or usage guidance, an agent cannot fully infer what the tool will return or when to prefer it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only grep has a schema description; lines and log_type lack descriptions, and schema coverage is 33%. The description lists log file names but does not explain the parameters, defaults, or how log_type maps to the enumerated values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (Tail/read), resource (Odoo logs), and scope (odoo.log, install.log, pip.log) from the configured build container via SSH. The read-only nature is explicit and it is distinguishable from sibling tools like system_info or search_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool instead of siblings such as odoo_sh_status or odoo_sh_system_info. It does not mention prerequisites, exclusions, or typical scenarios, leaving selection entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_model_fieldsDiscover Odoo.sh model fieldsARead-only
Introspect available fields on an Odoo.sh platform model (paas.repository, paas.branch, paas.build, ...). Use this if odoo_sh_list_builds/odoo_sh_overview return unexpected data, then query precisely with odoo_sh_search_read.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Model to introspect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, open-world, and non-destructive behavior. The description aligns with these by using 'introspect', but adds no new side-effect or output behavior details. Given the annotations cover the key traits, this is acceptable, though slightly more detail on the response format would have been beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and tightly scoped. It leads with the action, provides context, and states the conditional trigger in two sentences without extraneous detail. All content is relevant and contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple interface (one parameter, no output schema), the description provides complete guidance: what it does, when to use it, and how it connects to downstream tools. It is self-sufficient for an agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'model' has full schema coverage with an enum and a basic description ('Model to introspect'). The main description enriches this by listing example values (paas.repository, paas.branch, etc.) and clarifying the domain (Odoo.sh platform model). Some additional semantics per enum value would be helpful, but the provided context is adequate for the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool's function: introspecting available fields on an Odoo.sh platform model. Provides concrete examples (paas.repository, paas.branch) and differentiates from siblings by indicating it is a preliminary step before querying with odoo_sh_search_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly conditionally recommends use: 'Use this if odoo_sh_list_builds/odoo_sh_overview return unexpected data'. Also guides the next step ('then query precisely with odoo_sh_search_read'), giving clear when-to-use and how-to-proceed instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_overviewOdoo.sh project overviewARead-only
Get repositories, branches and their environment stage (production/staging/dev) with last build info from the Odoo.sh platform API. Use this first to understand the project layout. Requires ODOO_SH_SESSION_ID.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Repository/project name to filter (default: ODOO_SH_PROJECT env or all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, and the description does not contradict these. It also mentions the required session ID, making the operational prerequisite transparent. No hidden side effects are implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using two sentences to convey the action, purpose, and prerequisite. There is no redundant information, and the key points are front-loaded: what it does and when to use it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high-level overview purpose, the description sufficiently outlines the returned information (repositories, branches, environment stages, last build info). It also provides the essential prerequisite (session ID) and usage hint. Since no output schema is provided, the description does not need to specify return formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'project' has a clear description in the schema: it is a filter with a default value derived from an environment variable or all projects. This fully explains the parameter's meaning and behavior, so no additional description is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get repositories, branches and their environment stage with last build info') and the resource (Odoo.sh platform API). It also adds a clear purpose ('Use this first to understand the project layout') that distinguishes it from more targeted sibling tools like odoo_sh_list_builds or odoo_sh_logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit usage condition ('Use this first to understand the project layout') and a prerequisite ('Requires ODOO_SH_SESSION_ID'). However, it does not explicitly mention alternatives or specify when not to use this tool, though the 'first' guidance implies a certain ordering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_search_readGeneric read-only query on Odoo.sh modelsARead-only
Run a search_read on a whitelisted Odoo.sh platform model with a custom domain and field list. Read-only escape hatch when the curated tools don't cover a need. Example domain: [["branch_id.name","=","main"]]
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| model | Yes | Model to query | |
| order | No | Sort order, e.g. 'id desc' | |
| domain | No | Odoo domain, e.g. [["stage","=","production"]] | |
| fields | No | Fields to return (empty = all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description repeats read-only without adding safety details like auth, limits, or error behavior. It adds the whitelisted/escape-hatch framing but does not go beyond the annotations meaningfully.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the example is embedded compactly. Front-loads the verb and resource, then gives the when-to-use cue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Enough for a generic read-only escape hatch: model enum, domain example, field list, and limit default are available. It doesn't state return shape or error behavior, but that is less critical for a simple search_read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers most parameters; the description adds a concrete domain example and clarifies fields vs domain, but limit and order semantics are left to the schema. Since coverage is high, this is above baseline but not thorough.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it runs a search_read on whitelisted Odoo.sh models and positions itself as a generic read-only escape hatch. The example domain makes the intended use concrete, and the contrast with curated tools distinguishes its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it when curated tools don't cover a need, which is a clear selection condition. The example domain also gives concrete usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_statusMCP configuration statusARead-only
Show which data sources are configured (web API session, SSH) without exposing secrets. Use to diagnose setup issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and non-destructive behavior. The description adds a meaningful behavioral guarantee—'without exposing secrets'—which is practical and not implied by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is a single, focused sentence. No verbosity, no redundancy, and the key constraint (no secrets) is included without extra fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status tool with no parameters and no output schema, the description fully covers what the tool does and when to use it. The lack of output details is acceptable given the tool's diagnostic nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so there is nothing for the description to add. Baseline for 0 params is 4, and the description correctly avoids inventing unnecessary parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's purpose: showing which data sources are configured (web API session, SSH) without exposing secrets. The verb 'Show' and specific resource scope make it distinct from sibling tools like overview or logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use to diagnose setup issues,' providing clear guidance on when to invoke. It doesn't contrast with alternatives, but in context of sibling tools the intended use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odoo_sh_system_infoSystem info (SSH)ARead-only
Hostname, uptime, disk, memory, Python and Odoo version of the configured Odoo.sh build container. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description lists the specific data points returned and confirms no modifications. It aligns with the readOnlyHint annotation, and no side effects are implied. The information provided goes beyond the annotation by detailing the contents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that enumerates the key information without excessive detail. It is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a read-only system information tool. It does not require additional context about return format or error handling, as it is straightforward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and the schema coverage is complete. The description does not need to explain parameters, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool provides system information (hostname, uptime, disk, etc.) and is read-only. It is distinct from sibling tools by focusing on system-level details rather than data records or logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates it is read-only, suggesting it is safe to use for diagnostic purposes. However, it does not explicitly state when to prefer this over sibling tools like odoo_sh_status or odoo_sh_logs, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.0.0- First observed
odoo_sh_databases - First observed
odoo_sh_list_builds - First observed
odoo_sh_logs - First observed
odoo_sh_model_fields - First observed
odoo_sh_overview - First observed
odoo_sh_search_read - First observed
odoo_sh_status - First observed
odoo_sh_system_info
TDQS
Scored across 8 tools
Tools are mostly distinct with clear purposes, though overview and list_builds overlap slightly in build-related information. Overall, each tool targets a specific function and confusion is unlikely.
All tools use the consistent 'odoo_sh_' prefix followed by snake_case verbs/nouns, creating a uniform and predictable naming pattern.
8 tools is a reasonable number for a read-only Odoo.sh management surface, covering key areas without being excessive or sparse.
The set covers critical read-only operations like builds, logs, system info, databases, and model search. It lacks some advanced operations (e.g., deployment history) but for a read-only utility it is well-rounded.
Maintenance
Related MCP Connectors
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Read-only MCP server for public WeJob jobs, formations, and companies.
Read-only MCP for AI usage profiles, leaderboards, stats, and docs; no writes or private data.
Read-only Dant3 MCP for public rooms, agents, jobs and provisional machine onboarding.
Related MCP Servers
AlicenseAqualityDmaintenanceRead-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.59 npm1MIT- AlicenseAqualityDmaintenanceRead-only MCP server for Akamai CDN that enables searching properties, browsing EdgeWorker code, querying DNS zones, inspecting network lists, and translating error codes via natural language.161MIT
- FlicenseNot gradedqualityDmaintenanceRead-only MCP server for Hevo Data API, enabling monitoring of pipelines, objects, destinations, models, and workflows with secure self-hosted credentials.-
- FlicenseNot gradedqualityBmaintenanceA read-only MCP server that gives Claude Code secure, non-invasive access to infrastructure logs, service status, metrics, Ansible facts, and Docker state via SSH, with a strict command allowlist and no write operations.-