Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.minhhq-a1/odoo-pulse

PYPI · ODOO-PULSE

An AI business analyst for Odoo ERP (18+) — one-call reports with verdicts, over MCP

Available components

+15 this week 90 Trust /100

Last scanned (9 hours ago)

Scores higher than 93% of PyPI servers

Category Data and Analytics

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 0 of 28 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to minhhq-a1/odoo-pulse). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 92 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability68
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5578 tokens (~179/item across 31 items; 31 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_records" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 32 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
What we tested

Checks we ran (16)

  • Malware scan
  • Known CVEs
  • Install scripts
  • Dependency health
  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 4 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
  • 3 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 2 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
  • 31 Oct 26 0
    • Stability: 0.97 → pass security
  • 30 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
    • Stability: pass → 0.97 functional
  • 29 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 24 Oct 26 0
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed pypi/odoo-pulse@1.9.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo minhhq-a1/odoo-pulse
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/minhhq-a1/odoo-pulse/.github/workflows/release.yml@refs/tags/v1.9.1
Rekor log index 2342950576
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:ae45691de37c84ad47690b3ac1f840a013b89c42307950d57163dbedb4a0784d

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend Known build tool hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 28 packages
Packages resolved 28
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 31 exposed · ~5,514 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
absence_overview ~164

Report who is off and where coverage is thin, in one call. Composes approved hr.leave records overlapping the next `days` days, pending approval requests, and per-department headcount into an absence calendar, coverage-risk flags (share of a department off at some point in the window >= coverage_threshold), and a verdict. Args: days: Look-ahead window in days (default 14). coverage_threshold: Department share off in the window that counts as a coverage risk (default 0.3). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh).

NameTypeReqDescription
coverage_thresholdnumber––
daysinteger––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

aggregate_records ~212

Group and aggregate records server-side (one call instead of pulling rows). Args: model: Technical model name, e.g. 'sale.order'. group_by: One or more fields to group on. A field may carry a granularity, e.g. 'date_order:month'. measures: 'field:agg' specs. Bare 'field' means sum. Allowed aggregators: sum, avg, min, max, count, count_distinct. Omit to count records. domain: Odoo search domain (list of triplets). Defaults to all records. limit: Max groups (capped by ODOO_MAX_RECORDS). offset: Pagination offset over groups. order: Sort spec, e.g. 'amount_total desc'.

NameTypeReqDescription
domain–––
group_byarrayyes–
limit–––
measures–––
modelstringyes–
offsetinteger––
order–––
NameTypeReqDescription
resultstringyes–

No examples provided.

business_pulse ~141

One-call company briefing: sales, leads, receivables, tasks, absences. The morning-standup view of the whole company: yesterday's confirmed revenue and new leads, overdue customer invoices, tasks past deadline, and who is off today. Sections are independent — if an app is not installed, its section reports available=false and the rest still renders. Args: timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). company: Optional company name (ilike) or id; scopes every section.

NameTypeReqDescription
company–––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

confirm_sale_order ~37

Confirm a quotation into a sales order (sale.order action_confirm).

NameTypeReqDescription
confirmboolean––
order_idintegeryes–
NameTypeReqDescription
resultstringyes–

No examples provided.

create_contact ~84

Create a contact (res.partner). Preview unless confirm=True. Use extra_values to set fields this helper doesn't model (e.g. {"vat": ...}).

NameTypeReqDescription
confirmboolean––
email–––
extra_values–––
is_companyboolean––
namestringyes–
parent_id–––
phone–––
NameTypeReqDescription
resultstringyes–

No examples provided.

create_lead ~95

Create a CRM lead/opportunity (crm.lead). Preview unless confirm=True. Use extra_values to set fields this helper doesn't model, including custom mandatory fields (e.g. {"presales_id": 5}).

NameTypeReqDescription
confirmboolean––
contact_name–––
description–––
email–––
extra_values–––
namestringyes–
phone–––
NameTypeReqDescription
resultstringyes–

No examples provided.

create_record ~89

Create one record. Returns a preview unless confirm=True. Args: model: Odoo model name (must be in ODOO_WRITABLE_MODELS). values: Field -> value mapping for the new record. confirm: Set True to actually create; otherwise a dry-run preview.

NameTypeReqDescription
confirmboolean––
modelstringyes–
valuesobjectyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

create_task ~107

Create a project task (project.task). Preview unless confirm=True. Use list_projects to find the project_id first. Use extra_values to set fields this helper doesn't model (e.g. {"tag_ids": [(6, 0, [1])]}).

NameTypeReqDescription
confirmboolean––
date_deadline–––
description–––
extra_values–––
namestringyes–
project_idintegeryes–
user_id–––
NameTypeReqDescription
resultstringyes–

No examples provided.

delete_records ~100

Delete one or more records. Returns a preview unless confirm=True. Deletes also require ODOO_ALLOW_DELETE=true on the server. Args: model: Odoo model name (must be in ODOO_WRITABLE_MODELS). ids: Record ids to delete. confirm: Set True to actually delete; otherwise a dry-run preview.

NameTypeReqDescription
confirmboolean––
idsarrayyes–
modelstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_model_fields ~67

Inspect the schema of an Odoo model. Returns each field's label, type, help text, requiredness and relation. Pass `fields` to limit the result to specific field names. Example model: 'res.partner'.

NameTypeReqDescription
fields–––
modelstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

inventory_risk ~210

Report stock at risk — shortages and dead stock — in one call. Shortages are storable products with negative forecasted quantity (demand exceeds supply). Dead stock is on-hand product with no done stock move in dead_stock_days, valued at standard_price. The dead-stock check is a bounded heuristic: when the recently-moved product list hits the 200-group cap, a risk flags that the list may over-count. Args: dead_stock_days: No-movement window for dead stock (default 90). top_n: Rows listed per breakdown section (default 10). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). company: Optional company id or name; scopes stock quantities via allowed_company_ids context and dead-stock moves via company_id.

NameTypeReqDescription
company–––
dead_stock_daysinteger––
timezone_offsetinteger––
top_ninteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_models ~55

List Odoo models (technical name + label). Optionally filter by a case-insensitive substring matched against the model name or label, e.g. 'sale', 'res.partner', 'invoice'.

NameTypeReqDescription
name_filter–––
NameTypeReqDescription
resultstringyes–

No examples provided.

odoo_version ~20

Check connectivity and return the Odoo server version info.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

pipeline_review ~359

Report the health of the CRM pipeline, in one call. Composes open crm.lead opportunities into totals (count, expected and probability-weighted revenue), stalled deals (no stage change in stalled_days), close-date buckets, per-stage / per-salesperson breakdowns, the recent win rate, and a rule-based verdict. Args: salesperson: Optional filter on user_id.name (ilike). team: Optional filter on team_id.name (ilike). stalled_days: Days without a stage change before a deal counts as stalled (default 14). lookahead_days: Days ahead that count as "closing soon" (default 30). win_rate_days: Look-back window for the won/lost ratio (default 90). top_n: Max stalled deals listed in the breakdown (default 5). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). company: Optional company name (ilike) or id; scopes every count and total to that company. stalled_pct_at_risk: Stalled share (%) at which the verdict drops to at_risk (default 25). stalled_pct_off_track: Stalled share (%) at which the verdict drops to off_track (default 50).

NameTypeReqDescription
company–––
lookahead_daysinteger––
salesperson–––
stalled_daysinteger––
stalled_pct_at_risknumber––
stalled_pct_off_tracknumber––
team–––
timezone_offsetinteger––
top_ninteger––
win_rate_daysinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

portfolio_health ~203

Portfolio overview: one row per project, joined by id server-side. Replaces the project_status_report + project_profitability pair the overview tab used to call and join BY NAME in JS (which broke on duplicate project names). Returns raw signals only — the client computes its own health score from user-configured thresholds. Args: manager: Optional project-manager filter (user_id.name ilike). customer: Optional customer filter (partner_id.name ilike). include_on_hold: Keep on_hold projects (default True). include_done: Keep done projects (default False). lookahead_days: "due soon" window for derived health (default 7). timezone_offset: UTC offset for dates (default 7).

NameTypeReqDescription
customer–––
include_doneboolean––
include_on_holdboolean––
lookahead_daysinteger––
manager–––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

procurement_watch ~228

Report purchasing health — late receipts and stale RFQs — in one call. Composes confirmed purchase orders into open value, receipts past their planned date, per-vendor open spend, plus a count of quotation requests (draft/sent) older than rfq_stale_days, and a rule-based verdict. Args: late_grace_days: Days past date_planned before a receipt counts as late (default 0). rfq_stale_days: Age in days after which a draft/sent RFQ counts as stale (default 7). top_n: Rows in the late-receipts / top-vendors lists (default 5). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). company: Optional company name (ilike) or id to scope the report.

NameTypeReqDescription
company–––
late_grace_daysinteger––
rfq_stale_daysinteger––
timezone_offsetinteger––
top_ninteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

production_health ~189

Report manufacturing health — late starts and stuck orders — in one call. Composes open mrp.production orders (confirmed / progress / to_close) into a by-state backlog, orders that should have started but haven't (confirmed with date_start in the past), orders running longer than stuck_days, and a rule-based verdict. Args: stuck_days: Days an order may run (progress/to_close) before it counts as stuck (default 14). top_n: Rows in the behind-start / stuck lists (default 5). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). company: Optional company name (ilike) or id to scope the report.

NameTypeReqDescription
company–––
stuck_daysinteger––
timezone_offsetinteger––
top_ninteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

project_budget ~327

Report planned vs actual budget per project, line by line. Reads the Budgets app (budget.line on Odoo 18+, else crossovered.budget.lines) and matches lines to active projects by a line-level project_id m2o when the instance has one, else through the project's analytic account. Amounts are absolute company-currency sums; server-computed practical/theoretical amounts are used as-is. Also compares each project's total analytic cost against the practical amounts booked on its budget lines, flagging spend the budget does not capture. When the filter matches exactly one project the report gains a per-line breakdown. No date filters: budget lines carry their own period. Args: project: Optional project-name filter (name ilike). Exactly one match switches on the per-line breakdown. manager: Optional project-manager filter (user_id.name ilike). customer: Optional customer filter (partner_id.name ilike). top_n: Rows in the per-line breakdown (default 10). burn_pct_at_risk: Burn %% >= this -> at_risk (default 80). burn_pct_off_track: Burn %% >= this -> off_track (default 100). timezone_offset: UTC offset for "today" (default 7).

NameTypeReqDescription
burn_pct_at_risknumber––
burn_pct_off_tracknumber––
customer–––
manager–––
project–––
timezone_offsetinteger––
top_ninteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

project_dashboard ~360

Everything the project-detail page needs, in one call. Replaces ~12 separate calls (status, profitability, milestones, weekly hours, budgets, budget lines, cost breakdowns, delivery by month). Use `include` to re-fetch only what changed: checkbox toggles -> ["hours", "delivery_monthly"]; budget chip changes -> ["budget_detail", "delivery_monthly"]. Sections fail soft: a broken section lands in "errors" while the rest return. Args: project_id: project.project id. only_closed_stages / closed_stage_names / single_assignee_only: sub-task filters, as in project_subtask_hours; they shape the "hours" and "delivery_monthly" sections. budget_ids: crossovered.budget / budget.analytic ids to select. OMIT (null) for ALL budgets of the project; pass [] for NO selection (budget_detail then shows all-time cost only). These two states are different on purpose — do not send [] to mean "all". include: Subset of ["core", "hours", "budgets", "budget_detail", "delivery_monthly"]; omitted = all. "core" covers project, milestones, finance and weekly_logged. lookahead_days: "due soon" window for derived health (default 7). timezone_offset: UTC offset for dates (default 7).

NameTypeReqDescription
budget_ids–––
closed_stage_names–––
include–––
lookahead_daysinteger––
only_closed_stagesboolean––
project_idintegeryes–
single_assignee_onlyboolean––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

project_profitability ~365

Report delivery hours, money and budget burn per project in one call. Composes active project.project records (filtered by name / manager / customer) with timesheet hours (account.analytic.line grouped by project), analytic cost/revenue (grouped by analytic account) and the Budgets app when installed, into a per-project burn verdict (off_track / at_risk / on_track). When the filter matches exactly one project the report gains per-employee and per-task breakdowns. Args: project: Optional project-name filter (name ilike). Exactly one match switches on the drill-down breakdowns. manager: Optional project-manager filter (user_id.name ilike). customer: Optional customer filter (partner_id.name ilike). date_from: Optional YYYY-MM-DD lower bound on logged hours and analytic amounts. Allocated hours and budgets stay lifetime totals, so ANY date filter disables the burn verdicts (verdict "n/a", burn percentages null). date_to: Optional YYYY-MM-DD upper bound (same caveat). top_n: Rows in the drill-down breakdowns (default 5). burn_pct_at_risk: Worst burn %% >= this -> at_risk (default 80). burn_pct_off_track: Worst burn %% >= this -> off_track (default 100). timezone_offset: UTC offset for "today" (default 7).

NameTypeReqDescription
burn_pct_at_risknumber––
burn_pct_off_tracknumber––
customer–––
date_from–––
date_to–––
manager–––
project–––
timezone_offsetinteger––
top_ninteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

project_status_report ~278

Report which projects are in trouble, across a portfolio, in one call. Composes project.project records (filtered by manager / customer / name) with their project.milestone rows into a per-project derived health verdict (off_track / at_risk / on_track) driven by overdue-or-unreached milestones and the project end date. Surfaces the PM's declared status alongside, flags projects declared healthier than the data (divergence), and ranks by risk. Args: manager: Optional project-manager filter (user_id.name ilike). customer: Optional customer filter (partner_id.name ilike). project: Optional project-name filter (name ilike) to narrow the set. include_on_hold: Keep projects whose declared status is on_hold (default True). include_done: Keep projects whose declared status is done (default False). lookahead_days: Days ahead that count as "due soon" for at_risk (default 7). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh).

NameTypeReqDescription
customer–––
include_doneboolean––
include_on_holdboolean––
lookahead_daysinteger––
manager–––
project–––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

project_subtask_hours ~354

Total sub-task hours for one project, filtered server-side, in ONE call. Sums delivery/allocated/effective hours over the project's sub-tasks (project.task with parent_id set). Use this instead of paginating project.task through search_read — especially for the "exactly one assignee" condition, which Odoo domains cannot express. Args: project_id: project.project id (int, not name). only_closed_stages: Count only tasks whose stage name is in closed_stage_names (default False). Cancelled tasks DO count toward delivery hours (business decision 2026-07-15). closed_stage_names: Stage names treated as closed (default ["Done", "Cancelled", "Delivered"]). single_assignee_only: Count only tasks with exactly 1 user in user_ids (default False). group_by_month: Also bucket by local-time month of date_end; tasks without date_end are excluded from the buckets and summarised under "no_date_end" (default False). periods: Optional list of {"date_from": "YYYY-MM-DD", "date_to": "YYYY-MM-DD"} ranges applied to date_end, OR-combined (matching per-budget-period filtering, not a union). Empty/omitted = no date filter. timezone_offset: UTC offset for dates (default 7).

NameTypeReqDescription
closed_stage_names–––
group_by_monthboolean––
only_closed_stagesboolean––
periods–––
project_idintegeryes–
single_assignee_onlyboolean––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

read_attachment ~107

Read an ir.attachment: metadata always, base64 content when small enough. Binary attachments under ODOO_MAX_ATTACHMENT_BYTES are returned with their base64 `datas`; larger ones return metadata plus a warning. URL-type attachments return the link, never binary data. Args: attachment_id: The ir.attachment id. include_data: When False, return metadata only (no base64 fetch).

NameTypeReqDescription
attachment_idintegeryes–
include_databoolean––
NameTypeReqDescription
resultstringyes–

No examples provided.

read_records ~42

Fetch specific records by their ids. Pass `fields` to limit columns.

NameTypeReqDescription
fields–––
idsarrayyes–
modelstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

receivables_health ~232

Report AR/AP aging and who owes what, in one call. Composes open posted invoices and vendor bills into standard aging buckets (not_due / 1-30 / 31-60 / 61-90 / 90+), the share of receivables overdue, the top overdue customers, and a verdict. Args: top_n: Rows in the top-overdue-customers list (default 5). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). company: Optional company name (ilike) or id to scope the report. overdue_pct_at_risk: Overdue AR share (%) that drops the verdict to at_risk (default 25). overdue_pct_off_track: Overdue AR share (%) that drops the verdict to off_track (default 50).

NameTypeReqDescription
company–––
overdue_pct_at_risknumber––
overdue_pct_off_tracknumber––
timezone_offsetinteger––
top_ninteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

sales_snapshot ~283

Report how sales are going versus the previous period, in one call. Composes confirmed sale.order records over the last two periods into revenue/order deltas, top customers, top products (server-side aggregate over order lines), a stale-quotation count, and a growing / steady / declining verdict. Args: period_days: Length of the comparison window in days (default 7). stale_quote_days: Age in days after which a draft/sent quotation counts as stale (default 7). top_n: Rows in the top-customers / top-products lists (default 5). timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). growth_threshold_pct: Delta (%) beyond which the verdict is growing / declining (default 10). company: Optional company name (ilike) or id to scope the report. trend_weeks: Weeks of history bucketed into the weekly_revenue trend series; 0 disables the extra query (default 8).

NameTypeReqDescription
company–––
growth_threshold_pctnumber––
period_daysinteger––
stale_quote_daysinteger––
timezone_offsetinteger––
top_ninteger––
trend_weeksinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

search_count ~32

Count records in a model matching an Odoo domain filter.

NameTypeReqDescription
domain–––
modelstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

search_read ~181

Query records from an Odoo model. Args: model: Technical model name, e.g. 'sale.order', 'res.partner'. domain: Odoo search domain as a list of triplets, e.g. [["state", "=", "sale"], ["amount_total", ">", 1000]]. Use 'and'/'|' operators as Odoo expects. Defaults to all records. fields: Field names to return. Omit to let Odoo decide (can be large). limit: Max records (capped by ODOO_MAX_RECORDS). offset: Pagination offset. order: Sort spec, e.g. 'date_order desc'.

NameTypeReqDescription
domain–––
fields–––
limit–––
modelstringyes–
offsetinteger––
order–––
NameTypeReqDescription
resultstringyes–

No examples provided.

standup_digest ~203

Generate a daily standup digest for a project. Fetches all active subtasks (parent_id != False, stage not in exclude_stages, exactly 1 assigned user) and categorises them by deadline into OVERDUE / TODAY / UPCOMING / NO DEADLINE sections. Returns a plain-text digest ready to paste or send as an email body. Args: project: Project name (ilike match, e.g. "The Body Shop"). exclude_stages: Stage names to treat as closed. Defaults to ["Done", "Cancelled", "Delivered"]. lookahead_days: Days ahead to include in UPCOMING (default 7). timezone_offset: UTC offset in hours for "today" (default 7 = Asia/Ho_Chi_Minh).

NameTypeReqDescription
exclude_stages–––
lookahead_daysinteger––
projectstringyes–
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

team_workload ~286

Report who is over- or under-loaded, in one call. Composes the open project.task records in scope into a per-assignee load (open count plus overdue / due-soon / high-priority / no-deadline tallies), flags overloaded members and unassigned work, and returns a rule-based verdict. Done tasks carry no current load and are excluded. Args: project: Optional project-name filter (ilike). exclude_stages: Stage names dropped from scope. Default ["Cancelled"]. done_stages: Stage names treated as completed. Default ["Done", "Delivered"]. lookahead_days: Days ahead that count as "due soon" (default 7). overload_threshold: Open-task count above which a member is flagged "overloaded" (default 8). Sign-off point with the workflow owner. timezone_offset: UTC offset for "today" (default 7 = Asia/Ho_Chi_Minh). subtasks_only: Count only subtasks (parent_id != False), the team's unit of work. Default True.

NameTypeReqDescription
done_stages–––
exclude_stages–––
lookahead_daysinteger––
overload_thresholdinteger––
project–––
subtasks_onlyboolean––
timezone_offsetinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_records ~104

Update one or more records. Returns a preview unless confirm=True. Args: model: Odoo model name (must be in ODOO_WRITABLE_MODELS). ids: Record ids to update. values: Field -> value mapping to write. confirm: Set True to actually write; otherwise a dry-run preview.

NameTypeReqDescription
confirmboolean––
idsarrayyes–
modelstringyes–
valuesobjectyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

Install

How do I install the io.github.minhhq-a1/odoo-pulse MCP server?

io.github.minhhq-a1/odoo-pulse runs locally as a PyPI package, launched with uvx odoo-pulse. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · odoo-pulse

# add to Claude Code
claude mcp add minhhq-a1-odoo-pulse -- uvx odoo-pulse
Common questions

What is the io.github.minhhq-a1/odoo-pulse MCP server?

io.github.minhhq-a1/odoo-pulse is an MCP server listed in the public MCP registry as io.github.minhhq-a1/odoo-pulse. An AI business analyst for Odoo ERP (18+), one-call reports with verdicts, over MCP. This page covers its PyPI package (odoo-pulse).

Is the io.github.minhhq-a1/odoo-pulse MCP server safe to use?

io.github.minhhq-a1/odoo-pulse scores 90 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.minhhq-a1/odoo-pulse MCP server expose?

io.github.minhhq-a1/odoo-pulse exposes 31 tools: odoo_version, list_models, get_model_fields, search_read, search_count, and 26 more. Their descriptions and schemas cost roughly 5,514 tokens of context every time the server is loaded.

Is the io.github.minhhq-a1/odoo-pulse MCP server still maintained?

io.github.minhhq-a1/odoo-pulse is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.minhhq-a1/odoo-pulse MCP server under?

io.github.minhhq-a1/odoo-pulse declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the io.github.minhhq-a1/odoo-pulse MCP server?

VerifyMCP ran 16 checks on io.github.minhhq-a1/odoo-pulse, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.