Skip to main content
Glama

Odoo MCP server for OpenCode

This workspace ships a local stdio MCP server (odoo_mcp) that exposes your self-hosted Odoo project tasks, chatter, and timesheets as ten typed tools an agent can call directly. The same repository still contains the original odoo_tasks.py CLI — unchanged behaviorally — which shares the service layer with the MCP server.

Prerequisites

  • Python 3.10+ (workspace developed against 3.12)

  • uv on PATH (pip install uv if missing)

Install everything once:

uv sync

Related MCP server: MCP Server for Odoo

Credentials (environment variables)

Variable

Purpose

Default

ODOO_URL

Base URL of your Odoo instance

https://odoo.geosigmoid.group

ODOO_DB

Database name

odoo

ODOO_USERNAME

Your login email

required

ODOO_PASSWORD

Password or external API key

required

ODOO_URL must be an absolute HTTPS URL so credentials are never sent over cleartext HTTP.

An API key is strongly recommended over a password (Odoo: Preferences → Account Security → New API Key): it is revocable and cannot be used for web login. Copy .env.example to .env, fill it in, and load it into your shell, or set the variables however you manage secrets. The MCP server and CLI helper both auto-load a workspace-root .env when it is present; environment variables already set by OpenCode or the shell take precedence. Never commit .env.

Interpolation caveat: opencode.json uses {env:VAR} placeholders. If a variable is missing when OpenCode starts, it becomes an empty string, and every tool call will fail with a clear error naming the missing variable(s) (Missing required environment variables: ODOO_USERNAME, ...) instead of sending bad credentials anywhere. Values are never echoed to logs or results.

Registering with OpenCode

opencode.json in this workspace already contains:

{
  "mcp": {
    "odoo": {
      "type": "local",
      "command": ["uv", "run", "python", "-m", "odoo_mcp"],
      "environment": { "...": "{env:ODOO_*} placeholders" },
      "enabled": true
    }
  }
}

OpenCode loads config at startup — after changing credentials or this file, quit and restart OpenCode for them to take effect. The server is spawned once per session over stdio; nothing listens on any network port.

Tools

Mutating tools execute immediately by default; every one accepts a dry_run=true flag that returns a preview without writing anything.

Tool

What it does

list_my_tasks

Tasks assigned to you; filter by project, stage, state, due dates

get_task

Full detail of one task (planned/logged hours included)

create_task

Create a task in a project; optional description/priority/deadline/hours/stage; assignees default to you

update_task

Set name/description/priority/deadline/hours/state/stage; append_description merges text into the existing description

post_task_message

Post to a task's chatter (followers get notified)

get_task_states

Valid workflow state codes on this server + which are terminal

list_stages

Task stage ids/names for filtering

list_timesheets

Your timesheet entries; filter by task or recent days

create_timesheet

Log hours on a task (date defaults to today)

update_timesheet

Change hours/date/description/task of an entry

State codes vary per Odoo build — call get_task_states first rather than guessing; invalid states are rejected with the list of valid ones.

Verifying the install

uv sync                                              # deps resolve
uv run pytest tests -q                               # protocol + service suites
uv run python -m unittest discover -s tests -v       # CLI characterization suite
uv run python odoo_tasks.py --help                   # legacy CLI still intact

The stdio handshake itself is covered by tests/test_stdio_smoke.py.

Available Tools

9 tools
create_timesheetA

Log hours worked on a task (defaults to today); returns {"entry_id": id}.

hours must be > 0; date must be YYYY-MM-DD. With dry_run=true returns {"dry_run": true, "vals": {...}} without writing.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
hoursYes
dry_runNo
task_idYes
descriptionNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool writes by default, that dry_run avoids writing, that date defaults to today, that hours must be positive, and that the response format differs in each mode. This provides meaningful information beyond the schema, though expected side effects like duplicates or permissions are not covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact chunks: the first establishes the core behavior and return shape, the second gives constraints and dry_run behavior. It wastes no words and repeats nothing already in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple creation tool with no output schema and no annotations, the description covers the main behavioral details a caller needs: default date, constraints, return values, and a non-write dry_run path. It could further explain the description parameter or explicitly state that task_id is required, but the schema already marks that requirement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so parameter semantics rely solely on the description. It usefully explains constraints for hours (>0) and date (YYYY-MM-DD) and clarifies dry_run behavior. However, it does not elaborate on task_id or description, though their meaning is inferable from schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action and resource: 'Log hours worked on a task' with a destination given by the tool name create_timesheet. It is evidently distinct from update_timesheet and list_timesheets among the siblings, but it does not explicitly call out that distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance or comparison with alternatives like update_timesheet or list_timesheets. The description conveys the basic intent but leaves the agent to infer when to select this tool over its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_taskA

Fetch one task by id with full detail fields (hours, progress, stage...).

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. 'Fetch' implies a read operation and the mention of full detail fields suggests the response contents. However, it does not explain behavior on missing IDs, permissions, scoping to a project/workspace, or the exact response shape beyond a few partial fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core action and identifier, and the example fields in parentheses are useful without flsg or repetition. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: one required parameter, no nested objects, no output schema, and the description tells the agent that it returns full task details like hours, progress, and stage. It is sufficient for invoking the tool correctly, though more exact output fields or error behavior would improve completeness further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage and only 'task_id' with type integer. The description's 'by id' clarifies the parameter's role, but otherwise adds little semantic value beyond the parameter name, which is relatively self-explanatory for a simple id parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch'), names a resource ('one task'), and specifies how to select it ('by id'). It also indicates the expected detail level ('full detail fields'), which distinguishes it from the sibling list_my_tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it clear this tool is for retrieving a single task by ID, which implies it should be used when the agent already has a specific task_id and needs full task data rather than a list or mutation. It does not explicitly name alternatives or exclusion cases, but the context is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_task_statesA

List this server's valid task workflow states as {code, label, terminal}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description must carry the behavioral disclosure. It clearly indicates a read-only listing operation scoped to a specific server, but it does not explicitly state that no mutations occur, or describe authentication, error conditions, or ordering behavior. The term 'List' implicitly conveys read-only behavior, but more explicit disclosure would be stronger.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no redundant words. It front-loads the action 'List' and immediately states the resource and expected output fields, making it efficient and easy to consume.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter metadata query with an output schema available, this description is complete. It specifies the domain scope ('this server'), the object queried ('valid task workflow states'), and the exact fields returned, which is sufficient for an agent to know why and how to invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the description does not need to explain parameter behavior. The schema already fully covers this case, and the description adds useful context about what kind of values are returned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('List'), a specific resource ('this server's valid task workflow states'), and the output fields ({code, label, terminal}). It is unambiguous and easily distinguished from the sibling tools, which operate on individual tasks, task lists, or timesheets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when an agent needs the set of valid workflow states for tasks, likely to feed other task operations. However, it does not explicitly state when to prefer it over a sibling tool or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_my_tasksA

List the caller's Odoo tasks (tasks they are assigned to).

By default terminal states (done/cancelled/closed) are excluded; pass include_done=true to see everything. Optional filters: project_id, stage_id, exact state code, deadline window due_after/due_before (YYYY-MM-DD). limit=0 means no limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
stateNo
stage_idNo
due_afterNo
due_beforeNo
project_idNo
include_doneNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and it delivers: it discloses default filtering behavior, the exact semantics of limit=0, the date format (YYYY-MM-DD) for the deadline window, and the fact that state filtering uses exact state codes. This gives the agent a solid behavioral model beyond the raw schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight, front-loaded sentences. The first sentences establishes purpose and scope; the second packs in defaults, filters, and limit semantics without any redundant phrasing. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values are already covered. The description also covers all parameters, defaults, and edge cases like limit=0. Minor gaps remain: exact valid state codes are not enumerated, stage_id and project_id are not further elaborated, and no mention of sorting/pagination, but these are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so every parameter must be explained in the description. The description explicitly mentions all 7 parameters: include_done, project_id, stage_id, state, due_after, due_before, and limit. It adds meaningful details, such as limit=0 meaning 'no limit' and due_after/due_before expecting YYYY-MM-DD. This more than compensates for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the caller's Odoo tasks (tasks they are assigned to)'. This clearly distinguishes it from sibling tools like get_task (single task) and update_task (mutation). The scope is precise and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear contextual guidance: it explains the default exclusion of terminal states (done/cancelled/closed), how include_done=true overrides that, and lists the optional filters. It does not explicitly name alternative tools or say when not to use the tool, but the intended use case is communicated effectively.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stagesA

List the task stages (project.task.type) available on the server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

'List' is a non-destructive verb and 'available on the server' gives some context. However, with no annotations, the description still doesn't disclose edge behaviors such as return scope, ordering criteria, or why the system has both stages and get_task_states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

everything sentence earns its place. It states the exact model/resource, including the parenthetical project.task.type, without any filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is appropriately simple: no parameters and an output schema exists, so the description gives sufficient context for calling it. A slight explanation of its relationship to 'get_task_states' would make it truly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the description need not explain parameter meaning. Even with a 100% schema coverage and no parameters, the baseline is a 4, and the description properly offers no unnecessary parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('List') and resource ('task stages (project.task.type)') and adds server-wide scope. It is understandable, though it does not explicitly differentiate itself from the sibling 'get_task_states'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Basically describes what it does, but no explicit guidance is given about when to prefer this over sibling tools. The term 'available on the server' implies a lookup, but this is not elaborated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_timesheetsA

List the caller's timesheet entries, newest first.

Optional filters: task_id restricts to one task; days restricts to the last N days; limit caps the row count (default 50).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
limitNo
task_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden of behavioral explication. It discloses that results are restricted to the caller's entries, that ordering is newest first, and that a limit can cap results with a 50-row default. This gives the agent a reliable mental model of the operation's scope, though it does not go into details like pagination or what fields are returned, but those are covered by the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, with the most important information front-loaded (what it lists and the file.. orer). Each sentence adds value: the first establishes purpose and suffix, the second defines the optionality. There is zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All three parameters are elaborated in the description, the operation's scope and graceful default are clear, and context for read-only behavior is implicit. The existing output schema covers the return structure, so omitting it is not a gap. Completion covers all necessary details for an agent to decide and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, so the explanation is essential. Ths description gives synificant semantics to all three parameters: task_id restricts to one task, days limits the time window, and limit caps row count and gives a clear default. This fully compensates for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact resource ('timesheet entries') and action ('List'), and adds a scoping detail ('the caller's') that distinguishes it from any general timesheet query. It is clearly differentiated from sibling tools like create_timesheet, update_timesheet, or list_my_tasks by referring specifically to timesheet entries and presenting the read-only nature of the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this is for retrieving the caller's own entries and provides optional filters to narrow results to a task or a number of days, which helps choose appropriate arguments. It does not explicitly mention when to use a sibling tool instead (e.g., create_timesheet for creating new entries), but the purpose is clear enough that no leading exclusions are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_task_messageA

Post a message to a task's chatter (followers get notified).

Returns {"message_id": id}, or {"dry_run": true, ...} with dry_run=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo
messageYes
task_idYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the notification side effect and explains the dry_run behavior, including that dry_run returns a dry_run response rather than a message ID. This goes beyond the minimal mutation description, though more detail on permission requirements or failure modes would be stronger.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and effective, putting the core action and side effect in the first line, then providing the exact return shapes. Every sentence is useful and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with only three parameters, and the description covers its purpose, side effect, and return format despite there being no output schema or annotations. Some especially notable gaps include no documentation of possible errors or restrictions on message content, but the key usage details are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for all parameter meaning. It adds useful semantics only for dry_run, explaining what happens when the flag is true. The roles of task_id and message are left to their titles and obvious context, but no format, constraints, or additional behavior are described, which is not enough compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Post'), a specific resource (a message to a task's chatter), and the key side effect ('followers get notified'). This is unambiguous and distinguishes it from all sibling tools, none of which post messages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool by its action, but provides no explicit or even implicit guidance on when not to use it or when to prefer an alternative. None of the siblings perform a similar action, so no exclusion is strictly needed, but the guidance relies entirely on inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_taskA

Update mutable fields of a task; executes immediately unless dry_run.

Field args: name, description (replaces), append_description (appends to the existing description after a blank line), allocated_hours (planned effort), progress (0-100; computed field - prefer allocated_hours), priority (0 low .. 3 urgent), deadline (YYYY-MM-DD), state (workflow code from get_task_states), stage (exact stage display name). With dry_run=true returns {"dry_run": true, "vals": {...}} without writing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
stageNo
stateNo
dry_runNo
task_idYes
deadlineNo
priorityNo
progressNo
descriptionNo
allocated_hoursNo
append_descriptionNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It explains that updates execute immediately unless dry_run=true, that dry_run writes nothing and returns a values object, and that progress is computed rather than directly settable. It does not cover error conditions or permissions, but the main side-effect profile is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main execution semantics are front-loaded, and every field entry in the compact list adds meaning. The list is semicolon-heavy but this is an acceptable way to pack needed detail. No filler or repeated wording is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of annotations and output schema, the description is close to complete for invocation: all fields are described, controlled values are sourced, and dry-run feedback is specified. The normal non-dry-run return value is not described, but an agent still has enough to select and invoke the tool with correct arguments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must define each parameter and it largely does: append_description appends after a blank line while description replaces, allocated_hours is planned effort, progress is computed, priority has a range, deadline has a format, state is a workflow code, and stage is an exact display name. This substantially exceeds what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: update a task's mutable fields. It specifically says only mutable fields are affected and that execution is immediate unless dry_run is used, which distinguishes this from reading tools like get_task and list_my_tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical usage guidance: prefer allocated_hours over progress, use workflow codes from get_task_states, and use exact stage display names. It also clearly marks dry_run mode as a simulation. It does not explicitly compare with sibling alternatives, but the resource and verb are distinctive enough to avoid confusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_timesheetA

Modify an existing timesheet entry; returns {"ok": true} on success.

Pass at least one of hours (> 0), date (YYYY-MM-DD), description or task_id (moves the entry, keeping its project consistent). With dry_run=true returns {"dry_run": true, "vals": {...}} without writing.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
hoursNo
dry_runNo
task_idNo
entry_idYes
descriptionNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It discloses the success return format, explains dry_run behavior explicitly as returning vals without writing, and reveals that changing task_id moves the entry while keeping its project consistent. This goes beyond the schema, though it does not address failure scenarios or validation errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two pragmatic sentences: the first states the operation and success response, the second packs the key constraints into a dense but readable block. No filler or repeated schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given six parameters, no annotations, and no output schema, the description covers the main invocation paths and both response modes. It could be more complete by noting expected error behavior for invalid/missing update fields or ownership/access expectations, but it supplies enough for an agent to call the tool correctly in normal cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must add parameter meaning, and it does: it notes hours must be > 0, date must be YYYY-MM-DD, at least one of the four update fields is required, and dry_run skips writing. It also explains task_id's move semantics, which the schema's bare property completely omits. Only entry_id is left ambiguous, but its purpose is clear from the tool name and required status.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Modify an existing timesheet entry', a specific verb and resource that clearly distinguishes the tool from siblings like create_timesheet and list_timesheets. It also states the success return payload, removing ambiguity about the operation's outcome.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description communicates clear usage context by specifying that at least one update field must be provided, and the term 'existing entry' implies this is not for creation. However, it does not explicitly contrast with alternatives such as create_timesheet for new entries or update_task when task-level fields should be changed, so usage guidance is mostly implied.

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.

  1. 9 tool updatesv0.1.0
    • First observedcreate_timesheet
    • First observedget_task
    • First observedget_task_states
    • First observedlist_my_tasks
    • First observedlist_stages
    • First observedlist_timesheets
    • First observedpost_task_message
    • First observedupdate_task
    • First observedupdate_timesheet

TDQS

A4.1/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource and action: tasks (get, list, update, message, states) and timesheets (list, create, update), plus stage listing. There is no overlap or ambiguity between tool purposes.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern throughout: get_task, list_my_tasks, update_task, post_task_message, list_stages, create_timesheet, etc. Minor variation between 'get_task_states' and 'list_stages' is natural and still fits the pattern.

Tool Count5/5

With 9 tools, the set is well-scoped. Each tool serves a clear purpose within the task and timesheet domain, and the count is in the ideal range for usability.

Completeness3/5

Task and timesheet operations cover the main read/update workflows, including states, stages, and messaging. However, there are notable gaps: no create_task, no delete_task, and no delete_timesheet, which prevents full lifecycle management.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to interact with Odoo ERP systems through natural language to search records, create entries, update data, and manage business operations. Supports secure authentication and configurable access controls for production environments.
    Mozilla Public 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to interact with Odoo ERP systems through natural language, allowing users to search, create, update, and manage business records like customers, products, and invoices across any Odoo instance.
    1
    Mozilla Public 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to interact with Odoo ERP as the authenticated user, with tools for discovery, planning, and mutations bounded by user permissions.
    34
    40 npm
    2
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables authenticated team members to manage Odoo projects, tasks, timesheets, and milestones through Claude, with per-user token-based authentication.
    -