JustIdea Prestashop DEMO exposes its catalogue to AI agents and integrators. Everything below is read-only: nothing writes a cart, an order or customer data.
OpenAPI 3.1 specification · llms.txt · status
Any product, category or CMS page returns Markdown when requested with Accept: text/markdown. The home page returns the store overview.
curl -H "Accept: text/markdown" https://prestashop.justidea.dev/
JSON-RPC 2.0 over POST at https://prestashop.justidea.dev/agent/mcp. Requires a bearer token — see auth.md.
curl -X POST https://prestashop.justidea.dev/agent/mcp \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
| Tool | Description | Parameters |
|---|---|---|
search_products | Search the store catalogue by keyword, category, stock status or price order. Returns name, price, availability and product URL. Read-only. | query, category_id, in_stock_only, sort, limit, offset |
get_product | Full detail for one product: description, specifications, categories, price, stock, brand and identifiers. Read-only. | product_id |
list_categories | The store category tree with live product counts per category. Use the returned ids to narrow search_products. Read-only. | max_depth, only_stocked |
check_availability | Current stock and price for up to 50 products at once. Use this to re-verify before quoting a customer. Read-only. | product_ids |
get_shipping_options | Carriers, price ranges and delivery estimates for a destination country, plus the free-shipping threshold if one is configured. Returns ranges, not a binding quote. Read-only. | country_code |
get_policies | Store policy pages — returns, shipping, payment, terms, privacy, contact. Pass a topic for the full text of matching pages. Read-only. | topic |
create_checkout_link | Build a basket and get a link that opens this store's checkout with the items already in it. Nothing is ordered, reserved or charged — the customer completes the purchase themselves, at the price current when they do. Hand the link to the customer; do not follow it. | items |
Most of this store needs no credentials at all. The catalogue, prices, stock, shipping quotes and policies are free to read with no account, no API key and no registration. There is no paid tier gating any of it.
curl https://prestashop.justidea.dev/llms.txt
Self-serve keys. The MCP endpoint expects a bearer token, and you can issue yourself one in a single request — no human, no form:
curl -X POST https://prestashop.justidea.dev/v1/register \
-H "Content-Type: application/json" -d '{"label":"my-agent"}'
No sandbox is needed. Every operation here is read-only — nothing creates, changes or deletes anything — so there is no destructive call to practise away from production. Point your client straight at this store.
A read-only GraphQL endpoint at https://prestashop.justidea.dev/graphql. Introspection is open — send the standard introspection query and generate a client.
Failures come back inside the payload as userErrors, not only in the top-level errors array. Each carries a stable code from the UserErrorCode enum, the field path at fault, and a message. Branch on the code; the wording may change, the code will not.
{ product(id: 999999) { product { name } userErrors { code field message } } }
# → { "data": { "product": { "product": null,
# "userErrors": [{ "code": "NOT_FOUND", "field": ["product","id"], ... }] } } }
Relay connections: walk pageInfo.endCursor into after rather than incrementing offsets. Cursors are opaque.
{ products(first: 20, query: "jacket") {
totalCount
edges { cursor node { id name price { amount currency } availability } }
pageInfo { hasNextPage endCursor }
userErrors { code message } } }
Additive changes — new types, fields and enum members — may land at any time. A field being retired is marked with the @deprecated directive, carrying the reason and its replacement, and keeps working for at least 180 days after that. Breaking changes get a new endpoint version rather than being applied in place. Responses carry API-Version, and a retired version would additionally carry Deprecation and Sunset headers (RFC 8594, RFC 9745).
No SDK is required — the surface is plain HTTP. These are complete, working calls.
import requests
# Store overview, no credentials needed
overview = requests.get("https://prestashop.justidea.dev/llms.txt").text
# Any page as Markdown
page = requests.get("https://prestashop.justidea.dev/", headers={"Accept": "text/markdown"}).text
# Search the catalogue over MCP
r = requests.post(
"https://prestashop.justidea.dev/agent/mcp",
headers={"Authorization": "Bearer <token>"},
json={"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": "search_products",
"arguments": {"query": "shirt", "limit": 5}}},
)
if r.status_code == 429:
wait = int(r.headers.get("Retry-After", 60)) # honour the throttle
products = r.json()["result"]["structuredContent"]["products"]
const overview = await (await fetch("https://prestashop.justidea.dev/llms.txt")).text();
const res = await fetch("https://prestashop.justidea.dev/agent/mcp", {
method: "POST",
headers: { Authorization: "Bearer <token>", "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" }),
});
console.log(res.headers.get("RateLimit-Remaining")); // pace yourself
const { result } = await res.json();
RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset. On 429, wait Retry-After seconds.API-Version and Deprecation: false. Version 1 is current and not deprecated.Deprecation and Sunset headers (RFC 8594 / RFC 9745) with at least 180 days between them. Breaking changes get a new version; additive ones do not.Idempotency-Key and it is echoed back. Every operation is a read, so retrying is safe with or without it.503 carries Retry-After. Everything here is read-only and idempotent, so retrying is always safe.lastmod; use it to decide what to re-fetch instead of re-crawling.When the request accepts JSON, errors carry a stable error.code.
| Status | code | Meaning |
|---|---|---|
| 400 | bad_request | Bad parameters. |
| 401 | unauthorized | Missing or wrong token; see resource_metadata. |
| 403 | forbidden | This store denied your agent. |
| 404 | not_found | Absent or switched off. |
| 429 | rate_limited | Wait retry_after seconds. |
| 503 | unavailable | Temporary; retry with backoff. |
Served by AgentReady, a PrestaShop module by JustIdea Agency. Module version 9.5.1.