MCP server plugin for Sylius e-commerce platform that provides tools for managing channels, currencies, products, product variants, and orders
The Sylius MCP server exhibits significant quality gaps across naming, descriptions, and schema documentation. Of 15 tools, only 8 have verified descriptions in source code; 7 are inferred from service registration with minimal or no explicit documentation. Parameter schemas are inconsistently defined, some tools lack explicit schema definitions, and descriptions frequently reference external concepts (IRIs, Hydra collections) without explaining them to an LLM. Error handling guidance is absent. The server attempts domain-specific e-commerce functionality (orders, products, payments) but implements it in a way that forces agents to understand Sylius API idioms (Hydra, IRIs, minor currency units) rather than abstracting them. Tool names follow a verb_noun pattern but lack consistency in scope, some tools conflate multiple responsibilities (e.g., fetch_order returns the entire order object with many fields; no pagination control). Inferred tools (9, 10, 11, 13, 14, 15) cannot be scored above 50 because their definitions are not directly visible in provided source.
add_item_to_order(tokenValue, productVariantIRI, quantity?) → raw JSON object of the updated Sylius order. Prices in the response are integers in minor units (÷100).
complete_checkout(tokenValue, notes?) → raw JSON order after finishing checkout. The response still contains `"tokenValue"`; ChatGPT SHOULD always return that token to the customer so they can look up the order later.
create_order(ignore?) → raw JSON object for a brand-new Sylius order (state "cart"). Store the tokenValue field and pass it to other cart-management tools.
fetch_channel(ignore?) → raw JSON Hydra collection containing exactly one Sylius channel. The single member includes code, name and baseCurrency IRI; call fetch_currency to obtain the ISO currency code.
fetch_currency(code) → raw JSON object describing the Sylius currency identified by the given ISO code; response contains fields "code" and "name".
fetch_order(tokenValue) → raw JSON object of a Sylius order (cart). Response includes checkout/payment/shipping states, currencyCode, items[], totals in minor units, and the same tokenValue.
7 of 15 tools are inferred rather than explicitly defined in source code. Tool definitions for list_shipping_methods, select_shipping_method, fetch_product, fetch_product_variant, search_product_variants, and update_order are not visible in provided source, only file paths and inferred names.
Descriptions assume LLM understands Sylius/Hydra idioms without explanation. Example: 'raw JSON Hydra collection containing exactly one Sylius channel' and 'call fetch_currency to obtain the ISO currency code' require the LLM to know what 'Hydra' means and why it must call another tool. Descriptions should state: WHAT the tool returns (e.g., 'Returns channel object with code and name'), not API technical details.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 51 | <=2025-11-25 | v2 |
Inferred from service registration: fetches detailed information about a product
Inferred from service registration: fetches detailed information about a product variant
list_payment_methods(tokenValue, paymentId, page?, itemsPerPage?) → raw JSON Hydra collection of available payment methods. Each member has code and name (e.g. "PAYPAL", "Bank transfer").
Inferred from service registration: lists available shipping methods for an order
Inferred from service registration: searches for product variants
Inferred from service registration: searches for products based on query parameters
select_payment_method(tokenValue, paymentId, paymentMethodCode) → raw JSON object of the order after choosing a payment method (checkoutState becomes "payment_selected"). Monetary amounts remain integers in minor units (÷100).
Inferred from service registration: selects a shipping method for an order
Inferred from service registration: updates an existing order
Parameter schemas missing or incomplete. fetch_channel has empty input schema ({}); create_order likewise. fetch_currency specifies only 'code' with basic description but no type constraint, pattern, or length. search_products has 'query' with minimal guidance.
No output schemas documented. Tools return 'raw JSON object' or 'raw JSON Hydra collection' without specifying what fields the LLM should expect. LLMs need to know what fields to expect.' Without documented output, agents cannot plan downstream tool calls (e.g., what field holds the product variant IRI needed for add_item_to_order?). This forces the LLM to reverse-engineer fields from trial-and-error.
No error handling or recovery guidance. Descriptions do not explain what can fail, how to detect failure, or what the LLM should do next. Example: add_item_to_order with a nonexistent productVariantIRI will fail, but the description provides no guidance ('If the variant IRI is invalid, search_products() to find the correct IRI').
Ambiguous parameter references. add_item_to_order uses 'productVariant' in the JSON but the description refers to it as 'productVariantIRI', naming mismatch.
No pagination or result limiting guidance. list_payment_methods and list_shipping_methods accept pagination params but the tool description does not state a default page size or max items per page. No stated defaults or limits.
Currency and price representation requires LLM knowledge of Sylius internals. Descriptions state 'Prices in the response are integers in minor units (÷100)', requiring the LLM to understand and apply a conversion factor. This shifts conversion logic to the LLM, risking math errors.
Credentials in tokenValue parameter. While 'tokenValue' is described as an order token (not a secret credential), the pattern of passing tokens as parameters increases risk of exposure in logs and traces. Use server-side secret injection.' If order tokens have long lifespans or can be replayed, consider server-side session management.
Composition risk: fetch_product, search_products, fetch_product_variant, search_product_variants are not clearly distinguished in purpose. The LLM may call both search_products and search_product_variants for the same intent.
IRI (Internationalized Resource Identifier) is a Sylius/REST API concept. Descriptions frequently reference 'IRI' and 'baseCurrency IRI' without explaining what an IRI is or why an LLM must use it. State WHAT the tool does, WHEN to use it, and any prerequisites.' An LLM reading 'baseCurrency IRI' will not know this is an API reference URL. Descriptions should abstract away IRI and explain: 'Returns the currency code (e.g., EUR, USD)'.