Each team member connects using their own personal Odoo credentials. Credentials are stored securely in the macOS Keychain — never in a file on disk.
**Step 1 — Generate your Odoo API key**
1. Open [mpmedia.odoo.com](https://mpmedia.odoo.com) and log in with your account
2. Click your avatar (top-right corner) → **My Profile**
3. Go to the **Account Security** tab
4. Under **API Keys**, click **New API Key**
5. Enter a label such as `Claude Cowork`
6. Set the **Expiration** to **No Limit** (indefinite — the key should not expire)
7. Click **Generate Key** and copy it immediately — Odoo only displays it once
**Step 2 — Store your credentials**
Run the `setup_odoo_credentials` tool:
-`username`: your Odoo login email (e.g. `you@mpmedia.tv`)
-`api_key`: the key you just copied
The tool will save your credentials to the macOS Keychain and immediately verify the connection. You will not need to do this again unless you rotate your key or get a new Mac.
**Troubleshooting auth issues:** run `clear_odoo_credentials` then `setup_odoo_credentials` again with a freshly generated key.
Read, search, create, and update internal Knowledge base articles. Body content is HTML. All three tools support an `icon` field — pass a Unicode emoji (e.g. `⚙️`, `🔌`, `🖥️`) to set the article's icon in the KB tree. Browse icons at https://emojipedia.org.
Browse built-in Odoo Knowledge article templates by name or category. Use `get_knowledge_template` to retrieve the full template body for use as a starting point when creating articles.
**Important:**`cancel_sale_orders` and `cancel_and_archive_quotations` ONLY operate on orders in **Quotation (draft)** or **Quotation Sent (sent)** state. Both tools will refuse and raise an error if any provided IDs are in any other state (confirmed Sale Order, Locked, Cancelled, etc.). This is an intentional safety constraint — confirmed orders cannot be cancelled via Claude.
Manage opportunities in the sales pipeline. Use `list_crm_stages` to get valid stage IDs before updating. Use `list_crm_lost_reasons` then `mark_crm_lead_lost` to record a loss with a reason.
-`odoo_search_read` — preferred for efficient queries: search with domain + return only specified fields. Use this instead of `odoo_search` + `odoo_get_record` to avoid token bloat.
-`get_record_count` — count records matching a domain without fetching data. Use before bulk operations.
-`bulk_update_records` — set one or more field values on a list of record IDs in a single API call. Works for stage changes, custom Studio fields (`x_studio_*`), status flags, etc.
-`archive_records` — soft-delete records by setting `active=False`. For `sale.order`, cancel first with `cancel_sale_orders`.
-`get_stage_ids` — resolve stage names to IDs with case-insensitive exact matching. Supports `crm.stage`, `project.task.type`, and `helpdesk.stage`.
-`call_odoo_method` — escape hatch for any model method not covered by other tools (workflow transitions, report actions, custom methods). Use sparingly.
-`odoo_search` / `odoo_get_record` — legacy generic lookup tools; prefer `odoo_search_read` for new usage.
-`vimeo_video` — Vimeo video. `url` = Vimeo video URL.
-`infographic` — Image or infographic.
-`webpage` — Native article. `html_content` = formatted HTML body. Claude can generate this directly.
**Google Drive rule:** For any operation that needs a Drive file link or download URL — cover images, PDF slides, resource links — use the Google Workspace MCP connector when it is available. Only ask the user to provide a URL if the connector is not connected in the current session.
Quiz questions (`slide.question` / `slide.answer`) can be attached to any slide type.
-`generate_quiz` is the AI-powered tool: read lesson content first, generate question/answer sets, then call this tool to batch-write them all. It clears existing questions before writing.
-`add_quiz_question` adds a single question — use for incremental additions.
-`enroll_in_course` is the standard onboarding hook — accepts partner IDs or email addresses, resolves contacts automatically, and optionally sends invitation emails.
-`bulk_enroll` handles CSV-style imports and is designed to be called by the project management plugin for customer onboarding.
-`get_course_enrollment` returns enrolled users with completion % and last activity.
### eLearning — Media & Resources (`set_course_cover`, `set_slide_cover`, `link_drive_document`, `add_course_resource`)
-`set_course_cover` / `set_slide_cover` — fetch image from URL, base64-encode, write to Odoo. Use Workspace MCP for Drive images.
-`link_drive_document` — set the URL on any slide (PDF, video, infographic).
-`add_course_resource` — add a downloadable link to the course landing page. Falls back to creating a slide if the resource model is unavailable.
- Use `odoo_search_read` for any query where you only need specific fields — it is more efficient than `odoo_get_record` and avoids large responses.
- Before calling `cancel_sale_orders` or `cancel_and_archive_quotations`, use `search_sales_orders` to verify the orders are in `draft` or `sent` state. Both tools will refuse if any order is in another state.
- Before calling `mark_crm_lead_lost`, call `list_crm_lost_reasons` to show the user available reasons so they can choose one by name.
- For eLearning: always use the Google Workspace MCP connector for Drive file links and image downloads when it is available. Only surface the gap to the user if the connector is absent.