Tool & prompt catalog

August 15, 2026 · View on GitHub

Source of truth in code:

SurfaceCountWhere
Core phase tools (PHASE1PHASE4)26@erpipe/core (packages/core)
Prompts7CLOUD_V1_PROMPTS
MCP resources4CLOUD_V1_RESOURCES
Hosted workspace MCP38 toolsALL_TOOLS in erpipe-cloud agent/constants.ts
Self-host example27 tools (26 phase + ping)@erpipe/worker-selfhost

Python parity contracts still pin the original D14 23-tool names; TypeScript adds model_facts, read_attachment, and render_report on the core phase lists (CLOUD_V1_TOOL_COUNT = 26).

Hosted extras (not in OSS self-host): multi-instance + lifecycle + Odoo event pull + HITL status + ping on the cloud agent:

26 phase
+ ping
+ list_instances, search_across_instances, aggregate_across_instances, accounting_health_across_instances
+ create_instance, update_instance, rotate_instance_credentials, delete_instance
+ get_write_approval_status
+ list_odoo_events, ack_odoo_event
= 38

Every Odoo-bound hosted tool requires an explicit instance key (list_instances to discover). Lifecycle tools require OAuth scope erpipe:write.

Tools — core phases (26)

Phase 1 — read / health (7)

ToolPurpose
search_recordsQuery or domain search. Omit fields. Default limit 10, max 50. Empty query+domain is rejected (EMPTY_SEARCH).
model_factsModel intent snapshot (search / write / domain / overview)
read_recordRead records by id
build_domainBuild Odoo domain from structured input
list_modelsList accessible models
get_model_fieldsField metadata for a model
health_checkConnection + surface sanity

Phase 2 — diagnose / smart read (9)

ToolPurpose
aggregate_recordsAggregations over a domain
search_employeeHR employee search helpers
search_holidaysLeave / holiday search helpers
get_odoo_profileInstance profile snapshot
schema_catalogSchema browsing helpers (fan-out + cache metrics on hosted)
diagnose_odoo_callDiagnose a failed model call
diagnose_accessAccess / ACL diagnosis
inspect_model_relationshipsRelational graph for a model
read_attachmentRead ir.attachment payload (bounded)

Phase 3 — gated writes (5)

ToolPurpose
preview_writePreview create/write/unlink + approval token
validate_writeValidate values against field policy
execute_approved_writeExecute only with a valid approval token (may return outcome=pending while HITL waits)
chatter_postPost a chatter message
execute_methodCall a model method (safety-classified)

Writes require host policy. Prefer preview → validate → execute. On hosted product: connection writes_enabled defaults OFF; owner HITL / write_mode and journal gates still apply. When execute_approved_write returns HITL_APPROVAL_REQUIRED, that is a short wait (not failure, not a chat end): keep the approval object, tell the owner to Approve (typically ~30 seconds via dashboard / push / email), sleep 5–10s then poll get_write_approval_status (or retry execute with the same approval). After ~30–45s if still pending, tell the user it remains in Approvals.

Phase 4 — reports (5)

ToolPurpose
generate_json2_payloadBuild JSON-2 style payloads
upgrade_risk_reportUpgrade risk analysis report
fit_gap_reportFit/gap workshop report
business_pack_reportBusiness pack summary report
render_reportRender a report payload (e.g. base64)

Tools — hosted only (12)

Common

ToolPurpose
pingLightweight liveness / agent identity

HITL approval (hosted)

ToolPurpose
get_write_approval_statusPoll a write approval by approval_request_id while waiting for owner Approve (sleep 5–10s between polls; cap ~30–45s)

Multi-instance (read-only fleet)

ToolPurpose
list_instancesList workspace Odoo instances + status
search_across_instancesFan-out search (≤10 targets, concurrency 4). Same empty-filter reject and per-instance cap 50 as search_records.
aggregate_across_instancesFan-out aggregates with attribution
accounting_health_across_instancesReceivables-style health across instances

There are no cross-instance write tools.

Instance lifecycle (require erpipe:write)

ToolPurpose
create_instanceCreate instance (HTTPS preflight + auth probe)
update_instanceLabel / pause-resume (enabled)
rotate_instance_credentialsRotate stored credentials
delete_instanceDelete instance + encrypted secrets

Governance toggles (writes_enabled, write_mode, field policy) stay dashboard-only.

Odoo webhook pull queue

ToolPurpose
list_odoo_eventsList inbound webhook events for a connection
ack_odoo_eventAcknowledge a handled event

Ingress: POST /hooks/{slug} with the connection webhook secret.

Prompts (7)

PromptPurpose
diagnose_failed_odoo_callGuided diagnosis of a failed call
fit_gap_workshopStructure fit/gap from requirements
json2_migration_planPlan XML-RPC/JSON-RPC → JSON-2 migration
safe_write_reviewReview create/write/unlink before execute
invoice_approval_chainDraft invoice find → validate → gated post
po_to_receiptPO / receipt / bill three-way match
customer_onboardingDedup + gated customer create

Resources (4)

NameURIPurpose
odoo_modelsodoo://modelsList available models
odoo_modelodoo://model/{model_name}Model + fields
odoo_recordodoo://record/{model_name}/{record_id}One record
odoo_searchodoo://search/{model_name}/{domain}Search with JSON domain

Transport notes

TransportTypical authPackage
XML-RPCusername + password / API key as password@erpipe/odoo-xmlrpc + XmlRpcTransport
JSON-2API key bearerJson2Transport

URL policy rejects unsafe origins (SSRF guard) before calling Odoo. Hosted product rechecks public-unicast DNS at create, session open, and per-call boundaries.