Skip to main content
Glama

MCP for Claude & ChatGPT

Post to the chatter

odoo_message_post

Post a message to the chatter of an Odoo record: res_model plus res_id for ONE record, or res_ids to put the SAME message on a whole selection — one call, never a loop of res_id. The parameters are documented in the schema; what follows is what causes damage when it is ignored. DEFAULT IS AN INTERNAL NOTE. A customer-facing mail.mt_comment, or an external partner in partner_ids, only goes through when the workspace messaging mode is 'all'. MENTIONS: write @partner:<id> in body exactly where the name belongs — always a res.partner id, and also listed in partner_ids. Only mention someone the user named explicitly; if you inferred the recipient, ask before notifying them. Then read notified (id AND name): res.users and res.partner ids collide, so a wrong id notifies a real but different person. THE LIST FORM IS THE PLAIN NOTE: attachments, mt_comment, partner_ids and mentions each fire once PER RECORD, so they are refused over res_ids — post the note on the list, and post once on a single res_id if somebody has to be told. NOTHING HERE CAN BE UN-POSTED. With res_ids the answer carries posted, failed, not_attempted and partial: never report the whole selection as done, and retry ONLY the ids that did not take it, or the note lands twice on the rest. BODY (unless body_is_html=true, which goes as is): Html fields take markdown, converted the Odoo way: - [ ]/- [x] checklists, pipe tables, ##/### sections, --- separators. No inline style, invented classes or invented image URLs.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "res_model": "<res_model>"
    },
    "name": "odoo_message_post"
  }
}

Input Schema

NameRequiredDescriptionDefault
bodyNoMessage body. Markdown by default (converted to HTML); raw HTML if body_is_html=true. Write `@partner:<id>` where a mention should appear.
res_idNoID of the record to post on. Use this OR `res_ids`, not both.
res_idsNoIDs of the records to post the SAME message on (up to 200). Use this OR `res_id`, not both. One call for the whole list — do not loop `res_id`.
subtypeNo'mail.mt_note' (default) = internal note. 'mail.mt_comment' = customer-facing message that notifies the record's followers — only allowed when the workspace messaging mode is 'all'.
res_modelYesTechnical model name of the record (e.g. 'helpdesk.ticket', 'project.task').
partner_idsNoOptional **res.partner** IDs to notify — never a res.users ID (the two collide, so the wrong one notifies a different person; take the `partner_id` field of the user you looked up). These IDs are what sends the notification; to also show the person's name in the message, write `@partner:<id>` in `body` where the name belongs. In 'internal' mode only partners backing an internal user are kept (externals dropped, reported back); in 'all' mode external partners are honored. An ID that resolves to no partner is not notified and comes back in `unknown_partner_ids`.
upload_refsNoFiles from your disk to attach to the message (a screenshot, a CSV, a PDF): upload each one with `file_upload_url` and pass the 'tuqui-upload:<id>' reference it returns, once its curl succeeded.
body_is_htmlNoSet true if `body` is already HTML. Default false (body is markdown).
odoo_attachment_idsNoIDs of `ir.attachment` records already in Odoo, to attach a COPY of them to this message (e.g. the recording of a call, onto the lead). The original stays where it is. Get the ids with `odoo_attachment_content` (res_model + res_id lists a record's attachments); never guess them. Works over MCP too, no conversation needed.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / upload_refs
      Added value: +{
      +  "description": "Files from your disk to attach to the message (a screenshot, a CSV, a PDF): upload each one with `file_upload_url` and pass the 'tuqui-upload:<id>' reference it returns, once its curl succeeded.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "minItems": 1,
      +  "title": "Uploaded files",
      +  "type": "array"
      +}
  2. Changed1 schema field changed
    • removedInput schema / properties / confirm
      Removed value: -{
      -  "description": "Required (true) when `res_ids` carries more than 5 records: the first call answers `pending_confirmation` with the count, and the same call with confirm=true posts. A chatter message cannot be edited or deleted afterwards, so the count is worth reading before agreeing to it. Over 50 records it takes TWO turns: confirm=true only posts once the USER replied after seeing the preview.",
      -  "type": "boolean"
      -}
  3. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses the default-to-internal-note behavior, the messaging-mode gate for external messages, that attachments/mentions/mt_comment are refused over `res_ids` because they fire per record, and that the operation is irreversible. It also explains the partial-result fields (`posted`, `failed`, `not_attempted`, `partial`) and the retry-only-failed-ids rule, plus the id-collision hazard between res.users and res.partner. The irreversibility warning sits in mild tension with destructiveHint=false, but since the tool creates rather than destroys existing data it is not a true contradiction.

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?

Front-loaded around 'what causes damage when ignored', with labeled sections for notes, mentions, list form, irreversibility, and body formatting, so an agent can scan it quickly. It is dense and longer than typical, but nearly every sentence carries a distinct rule; only the attachment paragraphs run slightly verbose.

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 9-parameter mutation tool with no output schema, the description covers the operation's semantics, the failure modes, and the fields returned on partial success (`posted`, `failed`, `not_attempted`, `partial`, `notified`, `unknown_partner_ids`). Nothing an agent needs to call it correctly or interpret the result is missing.

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 coverage is already 100%, yet the description adds real meaning: `@partner:<id>` must be a res.partner id and also appear in `partner_ids`, partner ids collide with res.users ids, and `unknown_partner_ids` comes back for unresolved ids. It also clarifies that `body` is markdown unless `body_is_html=true`, and explains that `upload_refs` expects a 'tuqui-upload:<id>' reference from `file_upload_url`.

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?

States a specific verb and resource ('Post a message to the chatter of an Odoo record') plus the exact addressing model (`res_model` + `res_id` for one record, `res_ids` for a selection). It is unambiguously distinguishable from sibling write tools like odoo_write or odoo_create, which do not target the chatter.

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

Usage Guidelines5/5

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

Gives explicit routing rules: use `res_ids` for a whole selection, never loop `res_id`; default is an internal note, `mail.mt_comment` only when the workspace messaging mode is 'all'; only mention people the user named explicitly; attach files via `upload_refs`/`file_upload_url` or copy existing `ir.attachment` records. It also names the sibling `odoo_attachment_content` for retrieving attachment ids.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.