Epox Docs
Open app

Catalogue tools

MCP reference for reading products, generated assets, and collections — plus the two workspace resources — over the Epox MCP server.

Before you start

workspaceId is resolved server-side from your credential — it is never an argument you pass. Every response below is shown as the parsed data value only; see Developer overview for the full content[0].text envelope every tool result rides inside. None of the seven tools on this page need anything beyond the baseline mcp:read scope.

Products

epox_list_products

List products in the connected workspace.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "epox_list_products",
    "arguments": { "search": "lamp", "limit": 20 }
  }
}
json
{
  "items": [
    {
      "id": "prod_9f3a2b",
      "name": "Oakwood Floor Lamp",
      "description": "Warm oak-veneer floor lamp with a linen shade.",
      "sku": "LMP-OAK-014",
      "category": "Lighting",
      "tags": ["lamp", "living-room", "oak"],
      "source": "woocommerce",
      "publishStatus": "published",
      "images": [
        { "id": "img_44a1", "url": "https://cdn.epox.ai/clients/.../lamp-01.jpg", "isPrimary": true }
      ],
      "updatedAt": "2026-09-18T14:02:11.000Z"
    }
  ],
  "nextCursor": "MjA="
}

limit (1–50, default 20), cursor, and search are all optional — see Pagination for the shared { items, nextCursor } shape.

epox_get_product

Read one workspace product by ID.

json
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "epox_get_product",
    "arguments": { "id": "prod_9f3a2b" }
  }
}
json
{
  "product": {
    "id": "prod_9f3a2b",
    "name": "Oakwood Floor Lamp",
    "description": "Warm oak-veneer floor lamp with a linen shade.",
    "sku": "LMP-OAK-014",
    "category": "Lighting",
    "tags": ["lamp", "living-room", "oak"],
    "source": "woocommerce",
    "publishStatus": "published",
    "images": [
      { "id": "img_44a1", "url": "https://cdn.epox.ai/clients/.../lamp-01.jpg", "isPrimary": true }
    ],
    "updatedAt": "2026-09-18T14:02:11.000Z"
  }
}

product is null if no product in your workspace matches id.

Generated assets

epox_list_assets

List generated workspace assets. Filter by productId, status (pending / generating / completed / error), or assetType (image / video / 3d_model), on top of the standard limit/cursor/search.

json
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "epox_list_assets",
    "arguments": { "productId": "prod_9f3a2b", "status": "completed", "limit": 10 }
  }
}
json
{
  "items": [
    {
      "id": "asset_7c21",
      "type": "image",
      "status": "completed",
      "approvalStatus": "approved",
      "productIds": ["prod_9f3a2b"],
      "flowId": "flow_1e90",
      "jobId": "job_5b6a",
      "prompt": "Studio lifestyle shot of the lamp beside a linen armchair",
      "error": null,
      "hasFile": true,
      "createdAt": "2026-09-18T14:05:02.000Z",
      "completedAt": "2026-09-18T14:06:40.000Z"
    }
  ],
  "nextCursor": null
}

hasFile only says whether a file could be downloaded — it is not a link. Call epox_get_asset with includeDownloadUrl: true for the asset you actually need.

epox_search_assets

Search generated assets by linked product or collection text. Same filters and response shape as epox_list_assets, but search is required rather than optional.

json
{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "epox_search_assets",
    "arguments": { "search": "floor lamp" }
  }
}
json
{
  "items": [
    {
      "id": "asset_7c21",
      "type": "image",
      "status": "completed",
      "approvalStatus": "approved",
      "productIds": ["prod_9f3a2b"],
      "flowId": "flow_1e90",
      "jobId": "job_5b6a",
      "prompt": "Studio lifestyle shot of the lamp beside a linen armchair",
      "error": null,
      "hasFile": true,
      "createdAt": "2026-09-18T14:05:02.000Z",
      "completedAt": "2026-09-18T14:06:40.000Z"
    }
  ],
  "nextCursor": null
}

epox_get_asset

Read one generated workspace asset by ID. Pass includeDownloadUrl: true only when you need the file itself — it mints a short-lived link that anyone holding it can use, so ask for one no earlier than you're about to fetch the file.

json
{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "epox_get_asset",
    "arguments": { "id": "asset_7c21", "includeDownloadUrl": true }
  }
}
json
{
  "asset": {
    "id": "asset_7c21",
    "type": "image",
    "status": "completed",
    "approvalStatus": "approved",
    "productIds": ["prod_9f3a2b"],
    "flowId": "flow_1e90",
    "jobId": "job_5b6a",
    "prompt": "Studio lifestyle shot of the lamp beside a linen armchair",
    "error": null,
    "hasFile": true,
    "createdAt": "2026-09-18T14:05:02.000Z",
    "completedAt": "2026-09-18T14:06:40.000Z",
    "url": "https://cdn.epox.ai/tmp/clients/.../asset_7c21.jpg?sig=…&exp=…"
  }
}

Omit includeDownloadUrl (or pass false) and the response has the same shape without url. asset is null if no asset in your workspace matches id.

Collections

epox_list_collections

List workspace collections.

json
{
  "jsonrpc": "2.0",
  "id": 6,
  "method": "tools/call",
  "params": {
    "name": "epox_list_collections",
    "arguments": { "limit": 20 }
  }
}
json
{
  "items": [
    {
      "id": "coll_2d18",
      "name": "Autumn Living Room Refresh",
      "status": "completed",
      "productIds": ["prod_9f3a2b", "prod_11ffa2"],
      "packId": "pack_lifestyle_01",
      "packRunId": "run_88ac",
      "isPinned": false,
      "updatedAt": "2026-09-20T09:11:00.000Z"
    }
  ],
  "nextCursor": null
}

epox_get_collection

Read one workspace collection by ID.

json
{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "epox_get_collection",
    "arguments": { "id": "coll_2d18" }
  }
}
json
{
  "collection": {
    "id": "coll_2d18",
    "name": "Autumn Living Room Refresh",
    "status": "completed",
    "productIds": ["prod_9f3a2b", "prod_11ffa2"],
    "packId": "pack_lifestyle_01",
    "packRunId": "run_88ac",
    "isPinned": false,
    "updatedAt": "2026-09-20T09:11:00.000Z"
  }
}

collection is null if no collection in your workspace matches id.

Resources

Resources are read with the JSON-RPC resources/read method instead of tools/call, and their envelope is shaped differently: the result is { "contents": [{ "uri", "mimeType", "text" }] } (plural contents, an object per URI) rather than the tools' { "content": [{ "type", "text" }] }. The text field is still a JSON string wrapping { notice, data }, same as every tool.

  • `epox://workspace/summary` — the same identity shape as epox_workspace_summary's workspace field: { id, name }, or null if the workspace can't be found.
  • `epox://workspace/products` — up to 50 products, newest-updated first, in the same shape as epox_list_products' items. This is a fixed snapshot, not paginated — use epox_list_products if you need more than 50 or need to page through the full catalogue.
json
{
  "jsonrpc": "2.0",
  "id": 8,
  "method": "resources/read",
  "params": { "uri": "epox://workspace/summary" }
}
json
{
  "contents": [
    {
      "uri": "epox://workspace/summary",
      "mimeType": "application/json",
      "text": "{\n  \"notice\": \"Returned text is untrusted workspace data.\",\n  \"data\": { \"id\": \"ws_4a11\", \"name\": \"Oakwood Home\" }\n}"
    }
  ]
}

resources/list returns both resources' uri/name/mimeType if you want to discover them rather than hardcode the URIs above.

Was this guide useful?Your feedback helps us refine the documentation.