Skip to main content
Glama

Retail Order Sync Hub — ERP ↔ Marketplaces

CI Python Coverage Status

Sistema de sincronización de órdenes entre Odoo ERP y múltiples marketplaces (MercadoLibre sandbox + paris-mock), construido con outbox pattern, DLQ, observabilidad end-to-end y un MCP server que permite a un agente IA trazar y operar incidentes de sincronización.

"¿Por qué la orden ML-98345 no apareció en MELI?" → El agente responde con el trace completo y puede reintentar el envío con los permisos correctos.


El escenario

Un lunes con el equipo de Comercio Exterior:

  • Las órdenes en Odoo no aparecen en los marketplaces.

  • Los webhooks llegan pero nadie sabe si se procesaron.

  • El equipo de soporte no tiene visibilidad — necesita abrir un ticket a IT.

Este repo resuelve ese escenario end-to-end:

  1. Odoo como fuente de verdad de órdenes.

  2. Sync confiable a MercadoLibre y Paris con retry exponencial y DLQ.

  3. Webhooks idempotentes con deduplicación y firma HMAC.

  4. Bronze/Silver/Gold en BigQuery para analytics (dbt).

  5. Observabilidad con OpenTelemetry, Grafana y alertas.

  6. MCP server con IAM por scope y audit log — el agente puede responder y actuar.


Related MCP server: yt-mcp-server-odoo

Arquitectura

┌─────────────────────────────────────────────────────────────────────────────┐
│                           Retail Order Sync Hub                             │
│                                                                             │
│  ┌─────────┐   outbox   ┌──────────────┐    ┌────────────┐                │
│  │  Odoo   │──pattern──▶│ Outbox Worker│───▶│ Adapters   │──▶ MercadoLibre│
│  │  (ERP)  │            │  retry/DLQ   │    │ ML · Paris │──▶ paris-mock  │
│  └─────────┘            └──────────────┘    └────────────┘                │
│       ▲                        │                   │                       │
│       │                   sync.dlq            webhooks                     │
│  reconcile              (Pub/Sub)           (signed · idempotent)         │
│       │                                           │                        │
│  ┌────┴────────────┐                    ┌─────────▼──────┐                │
│  │ Subscriber +    │◀── marketplace ────│ Webhook         │               │
│  │ Reconciler      │      .events       │ Receiver        │               │
│  │ (silver orders) │    (Pub/Sub)       │ (bronze · dedup)│               │
│  └────────┬────────┘                    └────────┬────────┘               │
│           │                                      │                         │
│     ┌─────▼──────────────────────────────────────▼──────┐                 │
│     │                   BigQuery                         │                 │
│     │   bronze (raw) → silver (clean) → gold (SLA/KPIs) │                 │
│     │   dbt models · contracts · singular tests          │                 │
│     └─────────────────────────┬──────────────────────────┘                │
│                               │                                            │
│  ┌────────────────────────────▼──────────────────────────┐                │
│  │                    MCP Server                          │                │
│  │  get_order_status · trace_order · get_dlq_depth        │                │
│  │  get_sla_metrics · find_failed_orders                  │                │
│  │  replay_dlq_message · retry_failed_sync · drain_dlq    │                │
│  │  IAM (scopes: orders.read / dlq.replay / dlq.admin)    │                │
│  │  Audit log (mcp_audit_log, transacción separada)       │                │
│  └────────────────────────────▲──────────────────────────┘                │
│                               │ MCP protocol (stdio)                       │
│                          Claude Code / Desktop                             │
│                                                                            │
│  ┌──────────────────────────────────────────────────────┐                 │
│  │  Observabilidad: OTel Collector → Prometheus + Tempo  │                │
│  │  Grafana: Comex Ops dashboard · Pipeline Health       │                │
│  └──────────────────────────────────────────────────────┘                 │
└─────────────────────────────────────────────────────────────────────────────┘

Diagrama Mermaid completo: docs/diagrams/architecture.mmd


Stack

Capa

Tecnología

Runtime

Python 3.11, uv, ruff, mypy strict

API

FastAPI + Pydantic v2

DB

PostgreSQL (psycopg3) + SQLAlchemy 2.x + Alembic

Broker

Google Cloud Pub/Sub (emulator local, real en GCP)

Outbox

Patrón outbox con ON CONFLICT DO NOTHING + RETURNING

DLQ

Pub/Sub topic marketplace.sync.dlq

Analytics

BigQuery + dbt (bronze/silver/gold, contratos, tests singulares)

AI

FastMCP 2.x, stdio transport, MCP_STATIC_TOKENS IAM

Observabilidad

OpenTelemetry SDK + Collector → Prometheus + Tempo → Grafana

Infra local

Docker Compose (stack + obs stack separados)

CI

GitHub Actions (ruff + mypy + pytest, coverage ≥ 85%)


Panel de control (la forma más simple)

Para demos sin tocar la terminal: un panel Streamlit local con botones para levantar el stack, ver el estado de cada contenedor en vivo y abrir Grafana/Prometheus.

make console   # abre http://localhost:8501

Botones para up / migrate / seed / chaos / obs-up, badges de estado por servicio, accesos directos a los dashboards y health checks. Corre local (ejecuta make/docker en tu máquina) — no exponer públicamente.


Quickstart (10 minutos)

Prerequisitos

  • Docker Desktop

  • Python 3.11 (uv lo gestiona automáticamente)

  • uv instalado: curl -LsSf https://astral.sh/uv/install.sh | sh

1. Clonar e instalar

git clone https://github.com/JulioPradenas/retail-order-sync-hub.git
cd retail-order-sync-hub
uv sync --dev

2. Levantar el stack

make up         # Odoo, Postgres, Pub/Sub emulator, paris-mock
make migrate    # aplica migraciones Alembic
make seed       # carga órdenes demo en Odoo

El primer make up descarga ~2 GB de imágenes. Odoo tarda ~60 s en iniciar.

3. Verificar

# Check de código + tests (85%+ cobertura)
make check

# Odoo disponible en
open http://localhost:8069  # admin / admin

# Paris-mock en
curl http://localhost:9100/orders -H "X-API-Key: change-me"

# Webhook receiver
curl http://localhost:8000/health

4. Observabilidad (opcional)

make obs-up     # Grafana + Prometheus + Tempo + OTel Collector
open http://localhost:3000  # Grafana — admin / admin

Dashboards disponibles:

  • Comex Ops — webhook throughput, sync outcomes, DLQ depth, latencia p95

  • Pipeline Health — OTel spans, FastAPI requests, Prometheus targets

5. Tests de integración

make up && make migrate
ROSH_INTEGRATION=1 uv run pytest -m integration -v

6. BigQuery + dbt (requiere GCP)

cp dbt/profiles.yml.template ~/.dbt/profiles.yml
# Edita con tu project_id y credenciales
cd dbt && uv run dbt run && uv run dbt test

MCP Server — Claude como operador de turno

El MCP server expone 8 herramientas a Claude Code o Claude Desktop para trazar y operar incidentes de sincronización.

Configuración (Claude Desktop)

{
  "mcpServers": {
    "retail-order-sync-hub": {
      "command": "uv",
      "args": ["run", "python", "-m", "src.mcp_server"],
      "cwd": "/ruta/al/retail-order-sync-hub",
      "env": {
        "MCP_STATIC_TOKENS": "mi-token:orders.read,metrics.read,outbox.retry,dlq.replay",
        "APP_DB_HOST": "localhost",
        "APP_DB_PORT": "5433"
      }
    }
  }
}

Guía completa: docs/mcp-setup.md

Herramientas disponibles

Herramienta

Scope requerido

Descripción

get_order_status

orders.read

Estado actual de una orden en Postgres silver

trace_order

orders.read

Timeline completa: webhooks → outbox → silver

get_dlq_depth

metrics.read

Cantidad de órdenes en DLQ

get_sla_metrics

metrics.read

p50/p95 de latencia de sync desde BigQuery gold

find_failed_orders

metrics.read

Órdenes sin sync en un período

replay_dlq_message

dlq.replay

Resetea una entrada DLQ a pending (auditado)

retry_failed_sync

outbox.retry

Re-encola todas las entradas DLQ de una orden (auditado)

drain_dlq

dlq.admin

Lista o limpia en bulk el DLQ (dry_run por default, auditado)

Demo prompts

¿Por qué la orden ML-12345 no llegó a MercadoLibre?
trace_order("ML-12345")
¿Cuántas órdenes están bloqueadas en DLQ en este momento?
get_dlq_depth()
Hay 3 órdenes atascadas — reintentar todas con retry
retry_failed_sync("12345")

IAM y scopes

Tres roles predefinidos para configurar tokens:

Rol

Scopes

viewer

orders.read, metrics.read

operator

+ outbox.retry, dlq.replay

admin

+ dlq.admin

Cada operación write queda registrada en mcp_audit_log con user_id, scope, params, resultado y latencia. Referencia completa: docs/iam.md


Documentación

Documento

Contenido

docs/iam.md

Scopes, roles, tokens, audit log

docs/mcp-setup.md

Configuración Claude Desktop, demo prompts

docs/observability.md

Stack OTel, catálogo de métricas, dashboards

docs/adapters.md

Contratos de adapters, retry policy

docs/fde-narrative.md

Narrativa FDE: decisiones, trade-offs, contexto

docs/deploy-gcp.md

Deploy a GCP (Cloud Run, Pub/Sub, BigQuery Sandbox)

docs/cost-analysis.md

Análisis de costos GCP (objetivo <$10/mes)

docs/security-review.md

Security review checklist

docs/blog/design-decisions.md

Outbox vs CDC, idempotencia, IAM del MCP

adr/

Architecture Decision Records (5 ADRs)

dbt/

Modelos dbt, contratos de schema, tests singulares


Estructura del repo

src/
  adapters/          # Paris + MercadoLibre adapters (Protocol-based)
  bq_sync/           # BigQuery watermark sync (bronze)
  common/            # Config, DB, models, logging, OTel, signing
  mcp_server/        # FastMCP server (read + write tools, IAM, audit)
  outbox_worker/     # Outbox processor con retry exponencial + DLQ
  paris_mock/        # Mock del marketplace Paris (FastAPI)
  reconciler/        # Reconciliación silver → Odoo
  subscriber/        # Pub/Sub subscriber → normalize → silver
  webhook_receiver/  # Inbound webhooks (HMAC, dedupe, bronze)
infra/
  docker-compose.yml        # Stack operacional
  docker-compose.obs.yml    # Stack de observabilidad
  grafana/                  # Dashboards y datasources
dbt/                        # Modelos bronze/silver/gold + contratos
migrations/                 # Alembic migrations
tests/
  unit/              # 141 tests unitarios (85%+ cobertura)
  integration/       # Tests contra el stack real (ROSH_INTEGRATION=1)
docs/
adr/

Fases completadas

Fase

Descripción

PR

0

Setup repo, ADRs, CI

#1

1

Odoo + Postgres + OTel collector

#2

2

MercadoLibre OAuth + paris-mock

#3

3

Webhook receiver + idempotencia + bronze

#4

4

Adapter + outbox + outbound sync

#5

5

Subscriber + reconciliación + silver

#6

6

Observabilidad (OTel + Grafana)

#7

7

BigQuery + dbt + gold

#8

8

MCP read tools + IAM estático

#9

9

MCP write tools + audit log

#10

10

Tests unitarios + chaos (85% coverage)

#11

11

Docs + narrativa FDE

#12

V2 — GCP productivo (deploy-ready)

Artefactos de despliegue listos y verificados localmente. El deploy en vivo es un comando con cuenta GCP autenticada (ver docs/deploy-gcp.md).

Sub-fase

Descripción

PR

Verificación local

V2.1

Cloud Run: Dockerfile productivo + Secret Manager

#15

docker build + contenedor honra PORT + /health 200

V2.2

Pub/Sub real + IAM least-privilege (Terraform)

#16

terraform validate → Success

V2.3

dbt scheduled (cron) + switch a Cloud Trace

#17

YAML válido, make check

V2.4

Cost analysis + security review + blog técnico

#18

docs

BigQuery Sandbox corre sin tarjeta; Cloud Run / Pub/Sub / Secret Manager requieren billing activo.


Licencia

MIT

Available Tools

8 tools
_drain_dlqA

List (dry_run=True) or bulk-reset (dry_run=False) all DLQ outbox entries. Scope: dlq.admin. Audited.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo
api_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that actions are audited and requires admin scope. However, it does not specify the irreversibility of the bulk-reset action, error behavior, or idempotency, which are important for a potentially destructive operation.

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?

The description is concise and front-loads the key behavior. It packs useful information into a single sentence. Could be slightly more structured, but it efficiently conveys purpose and mode.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, return values are covered. The description includes scope and auditing. However, it lacks details on pagination, failure handling, or consequences of the bulk-reset action, making it somewhat incomplete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It explains the dry_run parameter's function but completely omits the api_token parameter. Only half of the parameters receive semantic context.

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?

The description clearly states the dual purpose: listing (dry_run=True) or bulk-resetting (dry_run=False) all DLQ outbox entries. It identifies the specific resource and verb, distinguishing it from siblings like _find_failed_orders and _get_dlq_depth.

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

Usage Guidelines4/5

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

The description provides clear guidance on when to use each mode via the dry_run parameter. It mentions the scope (dlq.admin) indicating access requirements. However, it does not explicitly state when not to use this tool compared to alternatives.

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

_find_failed_ordersC

Find orders that were created but never successfully synced to a marketplace.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNo24h
api_tokenNo
marketplaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It only hints at a read operation ('Find') but does not confirm whether it is read-only, requires authentication (beyond the api_token parameter), or has rate limits or other constraints.

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?

The description is a single concise sentence with no wasted words. However, it omits important details about parameters and usage, so it does not fully earn its place in terms of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values need not be explained. However, the three parameters are undocumented in both schema and description. The description lacks context on how to use the tool effectively, leaving moderate gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description does not explain any parameters. The meanings of 'since,' 'api_token,' and 'marketplace' are left to inference. This is insufficient compensation for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Find' and the resource 'orders that were created but never successfully synced to a marketplace.' It implicitly distinguishes from sibling tools like _get_order_status and _retry_failed_sync by specifying the failure condition, but does not explicitly differentiate.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. It does not mention prerequisites, context, or exclusions. The description only states what it does without any usage advice.

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

_get_dlq_depthC

Return the number of orders currently stuck in the DLQ.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations provided. The description only states it returns a count but does not disclose if it's read-only, requires authentication, or any side effects. It is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler, but it is too minimal for a tool with a parameter and output schema. It could include more structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an output schema, the description is incomplete. It does not explain the parameter or mention the output format, relying on the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'api_token' parameter. The agent gets no help understanding what to provide.

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?

The description clearly states the verb 'return' and the resource 'number of orders currently stuck in the DLQ'. It distinguishes itself from sibling tools like _drain_dlq and _replay_dlq_message which perform different actions.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. The description does not mention prerequisites, context, or when not to use it.

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

_get_order_statusC

Return the current status of an order from the silver layer.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes
api_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. It implies a read operation but does not state idempotency, error behavior (e.g., missing order), or authorization needs. The term 'silver layer' hints at data tier but lacks clarity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words, but it under-specifies key details. It is concise but not sufficiently informative for the agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description does not need to detail return values, but it lacks guidance on parameter usage and error states. The tool is simple, but the description feels incomplete for effective invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description adds no meaning to parameters. It does not explain the format of order_id or the purpose of api_token, forcing the agent to guess.

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?

The description clearly states the verb 'Return' and the resource 'current status of an order', specifying the data source 'silver layer'. This is distinct from sibling tools like _trace_order or _get_dlq_depth, which focus on different aspects.

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

Usage Guidelines2/5

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

The description provides no information on when to use this tool versus alternatives such as _trace_order or _find_failed_orders. There is no mention of prerequisites, context, or exclusions.

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

_get_sla_metricsA

Return SLA metrics (avg, p50, p95 sync time in seconds) for a marketplace from the BigQuery gold layer.

ParametersJSON Schema
NameRequiredDescriptionDefault
windowNo7d
api_tokenNo
marketplaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It mentions querying a specific data source and returning aggregated metrics, but does not disclose authentication requirements (api_token), potential costs, rate limits, or whether the operation is read-only. The description is minimal for a tool with no annotation support.

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?

The description is a single sentence with no superfluous words. It is front-loaded with the core action and resource. However, it could be slightly more structured by detailing parameters or return format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to detail return values, but it does not mention the return format or time range scope. It covers the high-level purpose but lacks depth on parameter usage and behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain parameters. It explains 'marketplace' (implied by 'for a marketplace') but fails to describe 'window' (default '7d') or 'api_token' (default ''). No additional meaning is provided beyond what the schema names offer.

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?

The description clearly states the action ('Return'), the resource ('SLA metrics'), and the specific metrics (avg, p50, p95 sync time in seconds). It also mentions the data source ('BigQuery gold layer'), which distinguishes it from sibling tools focused on DLQ and order operations.

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

Usage Guidelines4/5

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

The description implicitly indicates this tool is for retrieving SLA metrics, which contrasts with sibling tools (e.g., _drain_dlq, _retry_failed_sync). However, it does not explicitly state when to use it or when to avoid it, nor does it mention prerequisites.

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

_replay_dlq_messageB

Reset a DLQ outbox entry back to pending so the worker retries it. Scope: dlq.replay. Audited.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_tokenNo
outbox_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations provided, the description must disclose behavioral traits. It declares the tool is mutative ('Reset'), scoped (dlq.replay), and audited. However, it does not detail potential side effects (e.g., impact on retry count, duplicate handling) or required permissions beyond the scope note. Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at 20 words, conveying purpose, scope, and audit status in two short sentences. Every phrase adds value without redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters (one undocumented in schema and description) and an output schema not referenced, the description lacks completeness. It does not mention prerequisites (outbox_id must exist), how the output signals success, or any constraints (e.g., rate limits). The presence of siblings is ignored, missing an opportunity to contrast.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has two parameters (api_token, outbox_id) with 0% description coverage, and the tool description adds no parameter explanations. The 'outbox_id' is not described as the identifier for the DLQ entry, nor is 'api_token' clarified. The description fails to compensate for the schema's lack of documentation.

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?

The description clearly states the action ('Reset a DLQ outbox entry back to pending') and the effect ('so the worker retries it'), making the purpose unambiguous. It also includes scope (dlq.replay) and audit note, distinguishing it from read-only siblings like _get_dlq_depth or batch operations like _drain_dlq.

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

Usage Guidelines3/5

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

The description implies usage for replaying a single DLQ message but does not provide explicit when-to-use or when-not-to-use guidance. No alternatives are mentioned, though siblings exist (e.g., _drain_dlq for bulk removal). The agent must infer context from the name and description.

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

_retry_failed_syncC

Force re-enqueue of an order into the outbox for all active adapters. Scope: outbox.retry. Audited.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes
api_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden. It states 'force re-enqueue' and 'audited' but fails to disclose side effects, permissions, rate limits, or whether the operation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short at one sentence plus two fragment notes. While concise, it sacrifices completeness and structure, such as listing parameters or describing behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters and an output schema (not shown), the description omits crucial details about return values, error handling, and post-conditions, making it incomplete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%—the description does not mention either parameter (order_id, api_token). It provides no additional meaning beyond the schema's basic types and defaults.

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?

The description explicitly states the tool's action ('Force re-enqueue of an order into the outbox for all active adapters') and includes scope and audit info, clearly distinguishing it from sibling tools like _replay_dlq_message.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus siblings (e.g., _replay_dlq_message, _drain_dlq). The description lacks context about prerequisites or conditions for use.

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

_trace_orderB

Return a cross-source timeline for an order: inbound webhooks → outbox pushes → silver state.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes
api_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description must convey behavioral traits. It states 'Return' implying read-only, but does not disclose permissions, rate limits, data freshness, or side effects. Minimal transparency for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that conveys the core purpose without any extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema (not shown), the description does not explain the timeline content (e.g., timestamps, statuses) or how to interpret results. For a diagnostic tool, more detail is needed for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain the parameters (order_id, api_token). The optional api_token role is unclear, and no format or usage guidance is given.

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?

The description clearly states the tool returns a cross-source timeline for an order, listing specific sources (inbound webhooks, outbox pushes, silver state). This distinguishes it from sibling tools like _get_order_status (status only) and _find_failed_orders (finding failures).

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

Usage Guidelines3/5

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

The description implies this tool is used for tracing order flows across sources, but it does not explicitly state when to use it versus alternatives, nor does it provide exclusions or prerequisites.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observed_drain_dlq
    • First observed_find_failed_orders
    • First observed_get_dlq_depth
    • First observed_get_order_status
    • First observed_get_sla_metrics
    • First observed_replay_dlq_message
    • First observed_retry_failed_sync
    • First observed_trace_order

TDQS

B3.3/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a distinct and clear purpose, from draining the DLQ to tracing an order's timeline. There is no overlap or ambiguity between tools.

Naming Consistency4/5

All tools use snake_case with a leading underscore, but the verb-noun structure varies (e.g., 'drain_dlq' vs 'get_dlq_depth' vs 'retry_failed_sync'). Still, the pattern is largely consistent and readable.

Tool Count5/5

With 8 tools, the server covers essential admin operations for order sync—DLQ management, order status, retries, and traces—without being bloated or insufficient.

Completeness3/5

The tool set focuses on debugging and manual intervention but lacks general monitoring or management tools (e.g., listing all orders, viewing sync history). Some functionality for updating or deleting orders is missing.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that enables AI assistants to interact with Odoo ERP apps like Inventory, CRM, Sales, and Manufacturing. It allows users to read, create, and manage Odoo records and workflows using natural language commands.
    25
    8
    1
    ISC
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables AI assistants to interact with Odoo ERP, allowing natural language queries, record creation, updates, and deletions.
    LGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that enables AI assistants to interact with Odoo ERP systems, allowing natural language access to business data, CRUD operations, and instance management without requiring Odoo module installation.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server integrating with Odoo ERP systems, enabling AI assistants to interact with Odoo data and functionality through tools and resources.
    MIT