Skip to main content
Glama
Hemakrishna7406

Agent Studio — WooCommerce Private Connector

Agent Studio — WooCommerce Private Connector

CI Python Tests Coverage License

A read-only MCP connector that lets an Agent Studio agent read orders, products, inventory and customers from a WooCommerce store.

Built for the Razorpay Forward-Deployed Engineer, Agent Studio assignment (Option 3: private connector for a merchant tool).

Try it in 10 seconds — no Docker, no credentials, no network:

pip install -r requirements.txt
python demo/demo_offline.py

Spins up a mock WooCommerce store in-process and drives the real connector against it: auth, filtering, pagination and a simulated 429 that the client retries automatically. Captured output in docs/demo-output.md.


The problem this solves

The brief asks for a connector. The job behind the brief is to understand a merchant's workflow and move a number. So the design starts there, not at the API.

A D2C merchant's ops team spends 30–60 minutes a day manually filtering stuck payments, scanning for stockouts and digging through order history. The connector turns those questions into answers in seconds, grounded in the merchant's own live data. It is deliberately read-only first — an agent that can mutate a merchant's orders is one that can lose the merchant's money — and it ships with the metrics to prove it worked.

Full framing, the four merchant questions it unlocks, and the impact metrics: docs/problem-and-impact.md.

Related MCP server: Shopify MCP

Architecture

flowchart LR
    A["Agent Studio agent"] -->|"MCP tool call"| B["MCP server"]
    B --> C["tools.py"]
    C --> I["models.py (normalisers)"]
    C --> D["WooCommerceClient"]
    D --> E["TokenBucket (rate limiter)"]
    D --> F["Retry + backoff (Retry-After)"]
    D --> G["paginate() / page()"]
    D -->|"Basic auth over HTTPS"| H[("WooCommerce REST API")]

The MCP server is a thin adapter over a framework-agnostic core — the connector/ package has no MCP dependency, so the same core could back a REST service or a different agent host. Details: docs/architecture.md.


Why WooCommerce

  • Self-hostable: the whole demo runs locally via Docker — no vendor account, no approval wait, and no real credentials anywhere in the repo.

  • Razorpay-relevant: orders, payments and inventory are exactly the merchant commerce data a Forward-Deployed Engineer works with.

  • A real API surface: genuine pagination, filtering, auth and host-level rate limits, so the connector exercises the hard parts honestly.

What's in the box

connector/                 framework-agnostic core (no MCP dependency)
  config.py                env-driven config; secrets never hard-coded
  errors.py                typed errors (Auth/NotFound/RateLimited/Upstream)
  rate_limiter.py          token bucket + backoff-with-jitter
  models.py                normalisers (raw payload -> small, stable dicts)
  woocommerce_client.py    auth, retry, pagination, search primitives
  tools.py                 agent-facing read operations
mcp_server/server.py       MCP server exposing 7 tools
docs/                      auth, tool spec, capabilities, limitations,
                           architecture, problem+impact, webhooks, demo output
demo/                      offline demo (zero setup) + Docker live demo
tests/                     27 tests, no network
pyproject.toml             packaging + ruff / mypy / pytest config
Makefile                   make test | demo | lint | typecheck

Quickstart — real store (Docker)

cd demo
bash setup_store.sh                  # brings up WordPress + WooCommerce
# create a Read API key at http://localhost:8080/wp-admin
export WC_STORE_URL=http://localhost:8080
export WC_CONSUMER_KEY=ck_...
export WC_CONSUMER_SECRET=cs_...
python seed_data.py                  # sample products + orders
python demo_live.py                  # the connector in action

Configuration

Copy .env.example to .env. All secrets are read from the environment — nothing is hard-coded and nothing secret is ever logged or returned.

Variable

Required

Default

Purpose

WC_STORE_URL

yes

—

store base URL (HTTPS in production)

WC_CONSUMER_KEY

yes

—

ck_... REST API key

WC_CONSUMER_SECRET

yes

—

cs_... REST API secret

WC_TIMEOUT

no

20

per-request timeout (s)

WC_MAX_RETRIES

no

4

retries on 429/5xx

WC_PER_PAGE

no

100

page size (max 100)

WC_RPS

no

5

client-side request rate

WC_VERIFY_SSL

no

true

TLS verification

Run the MCP server

python -m mcp_server.server                                   # stdio (MCP hosts)
MCP_TRANSPORT=streamable-http python -m mcp_server.server      # HTTP

Develop

make dev        # install dev dependencies
make test       # pytest
make cov        # pytest + coverage
make demo       # zero-setup offline end-to-end demo
make lint       # ruff
make typecheck  # mypy

Current state: 27 tests passing, 87% coverage, ruff clean. CI runs lint plus the tests and the offline demo on Python 3.11 and 3.12.


Design decisions

Authentication. HTTP Basic (ck/cs) over HTTPS, never in the query string. The key is issued with Read permission to a dedicated least-privilege user, so a leak can only read — it cannot damage the store. Full flow in docs/auth.md.

Pagination / search primitives. paginate() follows the store's X-WP-TotalPages header and streams lazily with an optional max_items cap; page() returns one slice plus metadata. This is the scalable primitive: callers bound their own cost. Deep-pagination limits — and the index-backed long-term fix — are called out honestly in docs/limitations.md.

Rate-limit handling. Two layers: a client-side token bucket so we never hammer the store, and exponential backoff with jitter that honours Retry-After on 429/5xx. Exhausted retries raise a typed RateLimitedError.

Normalisation. Raw WooCommerce objects are large; returning them would blow up the agent's context and leak fields it shouldn't rely on. Every resource is projected to a small, documented shape in models.py.

Typed errors. The agent gets AuthError, NotFoundError, RateLimitedError or UpstreamError — and can reason about them — instead of a raw stack trace.

Read-only. No tool mutates the store. Bounded blast radius by design.

Event-driven v2. The request-driven ceiling and the webhook + index design that removes it are in docs/webhooks.md.


How this maps to the assignment brief

Requirement

Where it's satisfied

Connector lets an agent read tickets/orders/inventory

connector/tools.py, mcp_server/server.py (orders, products, inventory, customers)

Working demo or key authentication flow

Both: demo/demo_offline.py (zero setup) + docs/auth.md

Scalable long-term search primitives

WooCommerceClient.paginate()/page() + docs/limitations.md long-term fix

Rate-limit handling

connector/rate_limiter.py + retry logic in woocommerce_client.py

Webhook handling (event-driven)

designed in docs/webhooks.md

MCP tool specification or equivalent

docs/mcp-tool-spec.md

Short doc: what the agent can and cannot do

docs/capabilities.md

Setup steps, restrictions, assumptions, limitations

README.md + docs/limitations.md

No real customer data / secrets

.env.example placeholders only; .env gitignored

Docs index

Doc

What it covers

problem-and-impact.md

the merchant problem, and how we'd measure impact

architecture.md

layering, request lifecycle, failure path

auth.md

the REST API key authentication flow

mcp-tool-spec.md

every tool, with input/return schemas

capabilities.md

what the agent can and cannot do

limitations.md

limitations, assumptions, the long-term fix

webhooks.md

event-driven v2: webhooks + incremental sync

demo-output.md

captured demo output

master-plan.md

how this was planned and sequenced

Available Tools

7 tools
get_customerA

Fetch a single customer by id (orders count, lifetime spend).

ParametersJSON Schema
NameRequiredDescriptionDefault
customer_idYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose the return payload shape (orders count, lifetime spend), which is genuinely useful, but says nothing about missing-customer behavior, errors, auth requirements, or whether the lookup is cached/read-only.

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?

A single front-loaded sentence with the resource and its key return fields, zero padding, and no restatement of the tool name.

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?

For a simple one-parameter read tool with no output schema, the description covers the essentials and even hints at return contents. It is still thin on error/not-found behavior and prerequisites, which the absent annotations do not cover elsewhere.

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

Parameters3/5

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

Schema description coverage is 0% and the sole parameter is only identified as 'Customer Id' with type integer. The description's 'by id' reiterates the schema property name without adding format, source, or validity constraints, so it only marginally compensates for the coverage gap.

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?

States a specific verb (Fetch) and resource (a single customer) scoped to an id lookup, which cleanly separates it from get_order, get_product, and the list_* siblings. It does not explicitly name or contrast with those siblings, so it lands at 4 rather than 5.

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 phrase 'by id' implies the precondition that the caller already has a customer identifier, so usage is inferable. However, there is no explicit statement of when to use this versus list_orders/search_products or any exclusion, leaving the routing decision to inference.

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

get_orderB

Fetch a single order (line items, status, totals) by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the behavioral burden. It reveals the return contents (line items, status, totals) but omits auth requirements, error behavior, and whether the operation is read-only, leaving meaningful gaps for a no-annotation tool.

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?

A single, front-loaded sentence that identifies the operation, scope, and return fields with no wasted words.

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

Completeness4/5

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

For a simple one-parameter read tool with no output schema, the description sufficiently covers the purpose and return shape. Minor gaps remain around error handling and permission requirements, but the core is complete.

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% and the only parameter is order_id. The description says 'by id' without adding format, type, or example beyond the schema's own field name, so it fails to compensate for the missing schema documentation.

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?

States a specific verb (Fetch) and resource (a single order), and lists the fields returned (line items, status, totals). The word 'single' contrasts with the sibling list_orders, though no sibling is named explicitly.

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?

Usage is only implied: the tool is for retrieving one order by its id. No guidance is given on when to use this versus list_orders or how to obtain the order_id.

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

get_productB

Fetch a single product by id (price, stock, categories).

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYes

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 carry the full behavioral burden. 'Fetch' implies a read operation, but it does not state permissions, error behavior for missing products, rate limits, or any other operational detail beyond the minimal returned-field hint.

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 front-loaded sentence with no filler. The parenthetical return-field hint is compact and relevant.

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?

For a simple one-parameter read tool, the description gives the essential purpose and some return fields. However, with no annotations and no output schema, it leaves error handling and the full return shape unstated, making it only minimally complete.

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% for the single parameter, so the description should compensate. It only restates that lookup is 'by id', adding no format, origin, constraint, or example beyond the parameter name already present in the schema.

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 states a specific verb ('Fetch'), resource ('a single product'), and lookup key ('by id'), making the core action clear. It implicitly distinguishes itself from list/search siblings through 'single product by id', but never names an alternative tool explicitly.

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?

Usage is implied: use this when you have a product ID and need one product record, not for listing or searching. There is no explicit when-to-use guidance, no exclusions, and no sibling tool named as an alternative.

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

health_checkA

Check connectivity and credentials against the configured store.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the two things being probed (connectivity and credentials) and that these are checked against the 'configured store', implying a non-mutating diagnostic. It does not say whether failure surfaces as an error or a status value, nor what permissions the check itself needs.

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?

A single front-loaded sentence with zero filler. Every word ('connectivity', 'credentials', 'configured store') conveys scope, and nothing is repeated from the schema.

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?

There is no output schema and no annotations, so the description is the only source of information about this tool. It covers what is checked but omits what the result looks like (boolean, status message, raised error) and what a failed check implies, leaving an agent guessing about the return contract.

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

Parameters4/5

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

The tool takes zero parameters, so parameter semantics default to a baseline of 4. There is nothing for the description to clarify here.

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?

States a specific verb (check) and specific resources (connectivity and credentials against the configured store), which is more than a restatement of the name 'health_check'. It is unambiguously a diagnostic tool, clearly distinct from the inventory/order/product siblings even without naming them explicitly.

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 usage context is implied: reach for this to verify that the configured store is reachable and that credentials work. However, it gives no explicit when-to-use guidance, no prerequisites, and no mention of alternatives (there are none among the siblings, which helps, but it is not stated).

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

list_inventoryB

List products at or below low_stock_threshold units.

Scans the published catalogue via pagination, capped at max_items.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_itemsNo
only_managedNo
low_stock_thresholdNo

TDQS

B3/5.0
Behavior3/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 usefully discloses that the tool scans the published catalogue via pagination and caps results at max_items, which is real behavioral context. However, it says nothing about read-only safety profile, sort order, or what happens when the cap is hit (truncation vs error).

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?

Two tight sentences with the core filter condition front-loaded and no filler. Every phrase carries information, though the trailing pagination clause reads slightly like an afterthought.

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?

For a simple read-only list tool with no output schema, the description covers the core selection logic and the result cap. It is incomplete on the only_managed parameter and on return ordering/truncation semantics, gaps that neither the schema nor annotations fill.

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 compensate for all three parameters. It explains low_stock_threshold and max_items in prose, but only_managed is never mentioned, leaving a parameter that materially changes the result set entirely undocumented.

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?

States a specific verb (List) and resource (products) with an explicit filter condition (at or below low_stock_threshold units). An agent can identify the purpose immediately, though it doesn't distinguish itself from the sibling search_products, which could also return products.

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 statement of when to use this tool versus search_products or get_product, and no prerequisites or exclusions. The stock-threshold framing implies an inventory-monitoring scenario, but that must be inferred rather than read.

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

list_ordersB

List orders. status e.g. pending/processing/completed/refunded.

after/before are ISO-8601 dates (e.g. 2026-01-01T00:00:00). search matches order/customer fields. Returns a page plus pagination metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
afterNo
beforeNo
searchNo
statusNo
per_pageNo
customer_idNo

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden but only partially discharges it. It usefully discloses the return shape ("a page plus pagination metadata") and the meaning of specific filters, but says nothing about read-only safety, auth requirements, or rate limits.

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?

Front-loaded with the core action and then grouped by parameter, with no filler sentences. The backticked parameter references keep it scannable and every sentence carries information.

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?

For a zero-required-parameter list tool with no output schema, the description is adequate: it explains the filters it does cover and hints at the paginated return. It falls short by omitting the meaning of page/per_page/customer_id and giving no sense of default page size or result shape beyond "a page".

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

Parameters3/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 compensate, and it only covers three of seven parameters. It adds real value for status (enum values), after/before (ISO-8601 format with example), and search (which fields match), but page, per_page, and customer_id remain entirely undocumented.

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?

States a specific verb and resource ("List orders") and layers in filter semantics, so an agent knows exactly what the tool does. It does not distinguish itself from siblings like get_order or list_inventory, which is the only thing keeping it from a 5.

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?

There is no explicit guidance on when to use this versus get_order or the other siblings, nor any mention of prerequisites or exclusions. Usage is only implied by the filter parameters, leaving the agent to infer that this is the bulk/collection retrieval route.

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

search_productsB

Search products by free text, SKU, category id/name, or stock status.

stock_status is one of instock/outofstock/onbackorder.

ParametersJSON Schema
NameRequiredDescriptionDefault
skuNo
pageNo
queryNo
categoryNo
per_pageNo
stock_statusNo

TDQS

B3.2/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 behavioral burden, yet it discloses nothing about read-only semantics, pagination behavior (despite page/per_page existing), default result size, or how multiple filters combine. For a filter-heavy query tool with zero annotation coverage, this is a significant gap.

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?

Two compact lines with no filler, and the primary purpose is front-loaded before the stock_status detail. It is efficient, though the brevity borders on under-specification of non-filter parameters.

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?

With six parameters, no annotations, and no output schema, the description is only minimally complete: it covers the filter surface but says nothing about pagination, result volume, or response shape. Adequate to call the tool, but an agent gets no help on paging or interpreting results.

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

Parameters3/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 compensate. It usefully maps four of six parameters (query, sku, category, stock_status) and — critically — enumerates the allowed stock_status values (instock/outofstock/onbackorder) and clarifies that category takes an id or name, neither of which the schema conveys. However, page and per_page semantics are untouched, so compensation is partial.

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?

States a specific verb (search) and resource (products) and enumerates the searchable dimensions: free text, SKU, category id/name, stock status. It distinguishes itself implicitly from siblings like get_product (single lookup) and list_inventory. No sibling is named explicitly, so it falls short of a 5.

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 list of filter dimensions implies when the tool applies (filtered product retrieval), but there is no explicit when-to-use guidance, no exclusion, and no pointer to alternatives such as get_product for a single item or list_inventory for stock views. Usage is left to inference.

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. 7 tool updatesv0.1.0
    • First observedget_customer
    • First observedget_order
    • First observedget_product
    • First observedhealth_check
    • First observedlist_inventory
    • First observedlist_orders
    • First observedsearch_products

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation4/5

Most tools target a clear resource+action (list_orders/get_order, search_products/get_product, get_customer). The main overlap is between list_inventory and search_products, since search_products also accepts a stock_status filter, so an agent could hesitate between them for low-stock queries.

Naming Consistency4/5

Nearly all tools follow a clean snake_case verb_noun pattern (list_inventory, list_orders, get_order, search_products, get_product, get_customer). health_check breaks the verb-first convention but is still readable and unambiguous.

Tool Count5/5

Seven tools is well-scoped for a read-only storefront connector, with each tool earning its place for a distinct resource. No redundant or filler tools.

Completeness3/5

Product and order access is solid (list/get/search), but customer coverage is only get_customer with no list/search counterpart, and there is no general product listing beyond search/inventory. The surface is usable but has notable gaps for a WooCommerce connector, with no write operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A read-only MCP server that lets AI assistants answer Shopify store operations questions via tools like get_shop, list_products, get_product, and list_orders.
    4
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables secure, read-only access to WooCommerce store data through MCP-compatible assistants, letting users query products, orders, sales summaries, and inventory alerts without exposing store credentials.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to answer merchant questions about stock levels, reorder alerts, sales orders, and customers through a read-only MCP interface, with OAuth 2.0, rate-limit handling, and a mock backend for testing.
    MIT