odoo_mcp
Manage your self-hosted Odoo tasks, chatter, stages/states, and timesheets via local MCP tools; mutating tools support dry-run previews.
List your assigned tasks, with filters for project, stage, state, due dates, and inclusion of done/terminal tasks.
Get full details for a task by ID.
Update task fields (name, description/append, allocated hours, progress, priority, deadline, state, stage); dry-run preview available.
Post messages to a task's chatter.
Discover valid task workflow states and available task stages.
List your timesheet entries, filtered by task or recent days.
Create timesheet entries for a task (hours required; date defaults to today).
Update existing timesheet entries (hours, date, description, or move to another task).
README also advertises
create_task, but the provided schema does not include it.
Provides tools for interacting with a self-hosted Odoo instance, enabling agents to list, retrieve, and update tasks, post messages to task chatter, and manage timesheet entries.
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_mcpwhat tasks are due this week?"
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 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 uvif missing)
Install everything once:
uv syncRelated MCP server: MCP Server for Odoo
Credentials (environment variables)
Variable | Purpose | Default |
| Base URL of your Odoo instance |
|
| Database name |
|
| Your login email | required |
| 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 |
| Tasks assigned to you; filter by project, stage, state, due dates |
| Full detail of one task (planned/logged hours included) |
| Create a task in a project; optional description/priority/deadline/hours/stage; assignees default to you |
| Set name/description/priority/deadline/hours/state/stage; |
| Post to a task's chatter (followers get notified) |
| Valid workflow state codes on this server + which are terminal |
| Task stage ids/names for filtering |
| Your timesheet entries; filter by task or recent days |
| Log hours on a task (date defaults to today) |
| 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 intactThe stdio handshake itself is covered by tests/test_stdio_smoke.py.
Available Tools
9 toolscreate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| hours | Yes | ||
| dry_run | No | ||
| task_id | Yes | ||
| description | No |
TDQS
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.
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.
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.
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.
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.
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...).
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| state | No | ||
| stage_id | No | ||
| due_after | No | ||
| due_before | No | ||
| project_id | No | ||
| include_done | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No | ||
| task_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| message | Yes | ||
| task_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| stage | No | ||
| state | No | ||
| dry_run | No | ||
| task_id | Yes | ||
| deadline | No | ||
| priority | No | ||
| progress | No | ||
| description | No | ||
| allocated_hours | No | ||
| append_description | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| hours | No | ||
| dry_run | No | ||
| task_id | No | ||
| entry_id | Yes | ||
| description | No |
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v0.1.0- First observed
create_timesheet - First observed
get_task - First observed
get_task_states - First observed
list_my_tasks - First observed
list_stages - First observed
list_timesheets - First observed
post_task_message - First observed
update_task - First observed
update_timesheet
TDQS
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
- odooOAuthcom.odooconsole
Odoo ERP for AI agents: hosted OAuth endpoint, gated writes, one endpoint for every instance.
Task manager your agent can fully operate: boards, tasks, sprints, roles, worklogs, day planner.
Task management for people and AI agents, with scoped OAuth access to issues, projects, and docs.
Manage projects, tasks, time tracking, and team collaboration through natural language.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables 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
- AlicenseNot gradedqualityCmaintenanceEnables 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.1Mozilla Public 2.0
- AlicenseAqualityCmaintenanceEnables AI agents to interact with Odoo ERP as the authenticated user, with tools for discovery, planning, and mutations bounded by user permissions.3440 npm2MIT
- FlicenseNot gradedqualityBmaintenanceEnables authenticated team members to manage Odoo projects, tasks, timesheets, and milestones through Claude, with per-user token-based authentication.-