Connect

Leer stock por ubicación en Shopify

Stock de un ítem de Shopify por ubicación.

Tool IDshopify.inventario.leer
Nombre MCPshopify__inventario__leer
Conectorshopify
Planoaction
Scope (permiso)shopify:inventario
Authconnection_credentials
Versión1
Sensibleno
Deprecadono
ComportamientoreadOnly=true, destructive=false, idempotent=true, openWorld=true

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST y campo connectionId en el execute de MCP. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale de conexiones.estado.consultar.

Qué hace

Trae disponible, en mano, comprometido y entrante. El inventarioItemId sale de shopify.productos.listar. Connect consulta Shopify en vivo y no guarda nada: cada llamada lee la tienda de la conexión.

Entrada

CampoTipoRequeridoDescripción
inventarioItemIdstring ^(?:gid:\/\/shopify\/InventoryItem\/)?[1-9][0-9]{0,19}$síinventarioItemId de una variante (gid://shopify/InventoryItem/…) o su número.
paginastringnoEl valor siguientePagina de una respuesta anterior.
JSON Schema de entrada
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "inventarioItemId": {
      "type": "string",
      "pattern": "^(?:gid:\\/\\/shopify\\/InventoryItem\\/)?[1-9][0-9]{0,19}$",
      "description": "`inventarioItemId` de una variante (`gid://shopify/InventoryItem/…`) o su número."
    },
    "pagina": {
      "description": "El valor `siguientePagina` de una respuesta anterior.",
      "type": "string",
      "minLength": 1,
      "maxLength": 4096
    }
  },
  "required": [
    "inventarioItemId"
  ],
  "additionalProperties": false
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/shopify.inventario.leer/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input":{"inventarioItemId":"gid://shopify/InventoryItem/46000000000001"}}'
MCP · meta-tool execute
{
  "tool": "shopify.inventario.leer",
  "params": {
    "inventarioItemId": "gid://shopify/InventoryItem/46000000000001"
  },
  "connectionId": "conn_9tKfR2mQx4Vb"
}

Salida esperada (200):

{
  "data": {
    "inventarioItemId": "gid://shopify/InventoryItem/46000000000001",
    "sku": "CAFE-1KG-M",
    "controlaStock": true,
    "niveles": [
      {
        "ubicacionId": "gid://shopify/Location/70000000001",
        "ubicacion": "Bodega Santiago",
        "ubicacionActiva": true,
        "actualizadoEn": "2026-10-15T12:02:45.000Z",
        "disponible": 37,
        "enMano": 40,
        "comprometido": 3,
        "entrante": 0
      }
    ],
    "siguientePagina": null
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "shopify.inventario.leer",
    "plane": "action",
    "latency_ms": 7410,
    "audit_status": "recorded"
  }
}

Salida

CampoTipoRequeridoDescripción
inventarioItemIdstring ^gid:\/\/shopify\/síÍtem de inventario consultado. Identificador global de Shopify (gid://shopify/InventoryItem/…), texto.
skustringnullsí
controlaStockbooleanonullsí
niveleslista de objetosíStock por ubicación, hasta 50.
niveles[].ubicacionIdstring ^gid:\/\/shopify\/síUbicación. Identificador global de Shopify (gid://shopify/Location/…), texto.
niveles[].ubicacionstringnullsí
niveles[].ubicacionActivabooleanonullsí
niveles[].actualizadoEnstringnullsí
niveles[].disponibleenteronullsí
niveles[].enManoenteronullsí
niveles[].comprometidoenteronullsí
niveles[].entranteenteronullsí
siguientePaginastringnullsí
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "inventarioItemId": {
      "type": "string",
      "pattern": "^gid:\\/\\/shopify\\/",
      "description": "Ítem de inventario consultado. Identificador global de Shopify (`gid://shopify/InventoryItem/…`), texto."
    },
    "sku": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 255
        },
        {
          "type": "null"
        }
      ],
      "description": "SKU del ítem."
    },
    "controlaStock": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "true si Shopify controla el stock."
    },
    "niveles": {
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ubicacionId": {
            "type": "string",
            "pattern": "^gid:\\/\\/shopify\\/",
            "description": "Ubicación. Identificador global de Shopify (`gid://shopify/Location/…`), texto."
          },
          "ubicacion": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 255
              },
              {
                "type": "null"
              }
            ],
            "description": "Nombre de la ubicación."
          },
          "ubicacionActiva": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "true si la ubicación está activa."
          },
          "actualizadoEn": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Última actualización del nivel. Instante ISO 8601 en UTC (Z); null si Shopify no lo informa."
          },
          "disponible": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unidades disponibles para vender. null si Shopify no lo informa."
          },
          "enMano": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unidades físicamente en la ubicación. null si Shopify no lo informa."
          },
          "comprometido": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unidades comprometidas en pedidos sin despachar. null si Shopify no lo informa."
          },
          "entrante": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unidades en camino a la ubicación. null si Shopify no lo informa."
          }
        },
        "required": [
          "ubicacionId",
          "ubicacion",
          "ubicacionActiva",
          "actualizadoEn",
          "disponible",
          "enMano",
          "comprometido",
          "entrante"
        ],
        "additionalProperties": false,
        "description": "Stock en una ubicación."
      },
      "description": "Stock por ubicación, hasta 50."
    },
    "siguientePagina": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 4096
        },
        {
          "type": "null"
        }
      ],
      "description": "Pásalo en `pagina` para más ubicaciones; null si no hay más."
    }
  },
  "required": [
    "inventarioItemId",
    "sku",
    "controlaStock",
    "niveles",
    "siguientePagina"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
connection_not_found404noUsa uno de los connectionId que lista el error, o revisa la conexión en /connections. No hace falta reactivar nada.
connection_credential_required428noCrea un enlace con conexiones.enlace.crear (modo reconectar si la conexión ya existe) y pide a la persona que entregue la credencial de nuevo. No reintentes con la credencial anterior.
connection_busy409síEspera unos segundos y reintenta. Es una espera transitoria: no necesitas volver a conectar ni ingresar la credencial otra vez.
upstream_error502síReintenta más tarde. Si persiste, el problema está en el sistema externo, no en tu integración.
timeout504síReintenta. Para sincronizaciones largas usa la vía asíncrona y consulta el estado del trabajo.
connector_onboarding_required428noLee el mensaje: dice qué falta. Se completa en el portal de ese sistema, no en Connect, y después la llamada funciona sin cambios.
connection_scope_not_enabled403noPide a un owner/admin que habilite el scope en /connections para esa conexión, o usa otra que ya lo tenga activo. Cambiar la credencial del actor no resuelve este error.
rate_limited429síEspera y reintenta con backoff exponencial.
upstream_unexpected_response502noNo reintentes: la respuesta es determinista. Repórtalo con el request_id para que actualicemos el conector.
external_resource_not_found404noVerifica el identificador con la tool de búsqueda del mismo sistema. Reintentar con el mismo identificador da el mismo resultado.

Toda llamada puede devolver además los códigos transversales (validation_error, unauthorized, scope_not_granted, rate_limited, entre otros): el detalle vive en el catálogo de errores.

En esta página