io.github.singleflo/odoo-assistant
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_readA | Search and read records in one call (Odoo Two pitfalls this tool cannot fix for you:
Args: model: Odoo model, e.g. "sale.order". domain: Odoo domain, e.g. [["state", "=", "sale"]]. fields: Field names to return. Name them: the default asks for every field, which is slow and can fail to serialise on wide models. limit: Rows to return. Hard-capped at 200. offset: Rows to skip — how to page past a truncated result. company_ids: Companies to read from, e.g. [1, 2]. On a multi-company instance, omitting this reports one company as the whole business. |
| read_recordA | Read one record by id, always with named fields (writing.md pattern 12). Omitting
And never add up Args: model: Odoo model, e.g. "sale.order". record_id: The record's database id. fields: Field names to read. Omit for the usual state fields. |
| count_recordsA | Count the records matching a domain (Odoo A count is only as honest as its domain:
Args: model: Odoo model, e.g. "crm.lead". domain: Odoo domain. Omit to count everything the model holds. company_ids: Companies to count in, e.g. [1, 2]. |
| instance_overviewA | Summarise the connected instance: version, companies, volumes per area, in-house modules, anomalies. The profile is built from the instance this server is CONNECTED to, and
cached per instance — First call against a new instance builds the profile, which costs a second
or so; every later call is free. Pass When drilling into these figures, the two rules that keep them meaningful:
filter Args: refresh: rebuild the profile from the instance instead of reusing it. |
| required_fieldsA | List the fields Odoo demands before it will accept a Ask this BEFORE The dangerous required field is the one that already carries a default: the
create succeeds without you naming it and the record lands wherever the
default points, with no error to notice. Args: model: Odoo model, e.g. "crm.lead". |
| create_recordA | Create a record, reusing an existing match when
Multi-company: put |
| write_recordA | Write field values to one record and report what actually changed. Writing the value a record already holds succeeds and changes nothing; only the before/after comparison tells that apart from a real update, so that comparison is the answer. Setting |
| run_actionA | Run a workflow method and report the state it left behind. The level follows Two behaviours come from the Writer and are worth knowing: a returned dict
carrying |
| cancel_recordC | Cancel a record through Destructive, so the default ceiling refuses it and says what would not. |
| notify_userA | Write a note on a record's chatter and notify the users you name. Both subtypes post a message that IS VISIBLE in the record's chatter. The difference is who it reaches beyond the people you name. Args:
model: the Odoo model, e.g. "sale.order".
record_id: id of the record to write on.
message: the body. Send PLAIN TEXT: Odoo escapes anything that arrives
over RPC, so "x" is displayed as the literal characters
|
| create_activityA | Schedule an activity: the only notification that carries a deadline. A chatter note is passive. An activity appears in the assignee's To-Do list and turns overdue when the date passes. Args: model: the Odoo model, e.g. "crm.lead". record_id: id of the record the activity hangs off. summary: the one-line title the assignee will read. user_id: res.users id of the assignee. days: deadline offset from today, in days. activity_type: substring of an activity type name, e.g. "call". Activity types differ per instance; the first available type is used when this is omitted or matches nothing. |
| download_docsA | Save every document of a record to disk — chatter files included. Returns {"saved": [paths], "skipped": [[name, why]]}. Args: model: the Odoo model, e.g. "account.move". record_id: id of the record whose documents to fetch. dest_dir: directory to write the files into. Defaults to this platform's temporary directory — "/tmp" does not exist on Windows. |
| generate_pdfA | Render the PDF of a record and return where it was saved. An already rendered PDF is reused. Otherwise the model's own print/send
wizard produces it, and that wizard can also SEND the document — which is
why this is gated on Args: model: the Odoo model, e.g. "account.move". record_id: id of the record to print. dest_dir: directory to write the PDF into. Defaults to this platform's temporary directory — "/tmp" does not exist on Windows. |
| list_message_targetsA | Who can be messaged and where — ASK THIS BEFORE SENDING ANYTHING. Two lists in one call, because an agent that cannot see the roster invents ids:
Use |
| read_conversationA | Read what was said in a Discuss conversation, newest first. This is how you answer "what did they write to me" or "what is going on in
that channel". Reading does not mark anything as read: the unread counter belongs to the member record and only the user's own client clears it. Args:
channel_id: the Discuss channel, from |
| send_direct_messageA | Send a 1-to-1 Discuss message that appears in the user's chat systray. This is the tool for "tell X", "message X", "warn X". It opens the private
chat with that user — reusing the existing one, It reaches them whatever their notification setting says, and sends no
email at all. That is the difference from Args:
user_id: res.users id of the recipient — from |
| send_channel_messageA | Post to an EXISTING Discuss channel — everyone in it sees this. The channel is never created here: Members who are not employees of this instance — portal users, guests —
are named in a refusal rather than written to, the same rule Args:
channel_id: from |
| explore_moduleB | Discover a module's structure by interrogating the live instance. Args:
module_name: Module to explore, e.g. "helpdesk". Must be a module
slug, since it names the reference file on "generate"; ignored
on "list".
action: "generate" (the default) writes the reference document,
"list" ranks what is worth exploring.
models: Comma-separated models for a module the script does not know,
e.g. "superchat.message,superchat.template". Defaults to the
script's own grouping for |
| list_known_modulesA | List the modules this server has learned: name, generation date, records. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| odoo-skill | How to operate an Odoo instance: the safety rules, the query and write patterns, and the verification methodology. |
| odoo-ref-SKILL | Odoo methodology reference: SKILL. |
| odoo-ref-collaboration | Odoo methodology reference: collaboration. |
| odoo-ref-deletion | Odoo methodology reference: deletion. |
| odoo-ref-documents | Odoo methodology reference: documents. |
| odoo-ref-payments | Odoo methodology reference: payments. |
| odoo-ref-recipes | Odoo methodology reference: recipes. |
| odoo-ref-writing | Odoo methodology reference: writing. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/singleflo/odoo-assistant-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server