Skip to main content
Glama

Product details

get_product
Read-onlyIdempotent

Read-only product details by product_id, without source-shop details. Product facts do not verify fulfillment eligibility.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
zipNo5-digit US ZIP code, for local prices and delivery options.
marketNoMarket key, e.g. san-antonio-tx. Used when no zip is given.
product_idYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
productYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • changedOutput schema / properties / product / properties / description / description
      Previous value: -"The merchant's own description (get_product only)."New value: +"Product description from the source catalog, when returned."
    • changedOutput schema / properties / product / properties / offers / items / properties / availability / description
      Previous value: -"NULL when we have no shelf read under 24 hours old (shelf_observed_at says when). Do not call it in or out of stock; when is_eligible_checkout is true it can still be ordered."New value: +"NULL when we have no shelf read under 24 hours old (shelf_observed_at says when). Null is not evidence of in-stock or out-of-stock state; checkout eligibility is independent."
    • changedOutput schema / properties / product / properties / offers / items / properties / fulfillment / description
      Previous value: -"`local_delivery`: delivered locally. `concierge`: JENNi collects it from the shop and delivers it; buy it with start_checkout like any orderable offer. `ship_to_home`: shipped to the shopper. `in_store_only`: observed on the shelf, but it cannot be ordered through JENNi. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."New value: +"`local_delivery`: delivered locally. `concierge`: JENNi collects it from the shop and delivers or ships it to the shopper. `ship_to_home`: shipped to the shopper. `in_store_only`: observed on the shelf, but it cannot be ordered through JENNi. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."
    • changedOutput schema / properties / product / properties / offers / items / properties / is_eligible_checkout / description
      Previous value: -"True: this offer can be ordered through JENNi; call start_checkout with it when the shopper wants to buy. start_checkout and the checkout page re-check the offer and say why if it can no longer be ordered, so do not ask the shopper to confirm stock or hours first. False: do not send the shopper to checkout for this offer. Nothing is charged until the shopper places the order on the checkout page."New value: +"True when this offer is currently eligible for ordering through JENNi; false otherwise. Eligibility and price are checked again at hosted checkout. Nothing is charged until the buyer places the order on the checkout page."
    • changedOutput schema / properties / product / properties / offers / items / properties / shelf_price / description
      Previous value: -"Observed shelf price. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."New value: +"Observed shelf price for browsing, not a checkout price. Purchase price and checkout eligibility are separate fields."
    • changedOutput schema / properties / product / properties / shelf_price / description
      Previous value: -"Observed shelf price. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."New value: +"Observed shelf price for browsing, not a checkout price. Purchase price and checkout eligibility are separate fields."
    • changedOutput schema / properties / product / properties / variants / description
      Previous value: -"Buyable size/colour variants. Give the shopper the variant url so the page opens on that choice. search_catalog lists at most 30; get_product lists all."New value: +"Buyable size/colour variants and their product URLs. Search responses contain at most 30; detail responses may include all variants."
  2. Changed9 schema fields changed
    • changedInput schema / properties / zip / description
      Previous value: -"5-digit US ZIP code, for local prices and distances."New value: +"5-digit US ZIP code, for local prices and delivery options."
    • changedOutput schema / properties / product / properties / offers / description
      Previous value: -"Always empty in product discovery. This field does not verify or rule out fulfillment availability."New value: +"JENNi's single best offer for this product (price, delivery_promise, fulfilled_by, is_eligible_checkout), without source-shop details."
    • addedOutput schema / properties / product / properties / offers / items / properties / delivery_promise
      Added value: +{
      +  "description": "Shopper-facing delivery promise, e.g. \"Get it today\" (local delivery) or \"Ships to you\".",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / product / properties / offers / items / properties / fulfilled_by
      Added value: +{
      +  "description": "Shopper-facing fulfiller line: \"Delivered by JENNi\".",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / product / properties / offers / items / properties / fulfillment / description
      Previous value: -"`local_delivery`: delivered from the shop. `concierge`: JENNi collects it from the shop and delivers it; buy it with start_checkout like any orderable offer. `ship_to_home`: shipped from the shop. `in_store_only`: the shop carries it, but it cannot be ordered through JENNi; tell the shopper to visit the shop. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."New value: +"`local_delivery`: delivered locally. `concierge`: JENNi collects it from the shop and delivers it; buy it with start_checkout like any orderable offer. `ship_to_home`: shipped to the shopper. `in_store_only`: observed on the shelf, but it cannot be ordered through JENNi. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."
    • changedOutput schema / properties / product / properties / offers / items / properties / product_id / description
      Previous value: -"The exact variant this shop holds."New value: +"The exact variant this offer covers."
    • changedOutput schema / properties / product / properties / offers / items / properties / shelf_price / description
      Previous value: -"Store shelf price observed at the named store. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."New value: +"Observed shelf price. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."
    • changedOutput schema / properties / product / properties / offers / maxItems
      Previous value: -0New value: +1
    • changedOutput schema / properties / product / properties / shelf_price / description
      Previous value: -"Store shelf price observed at the named store. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."New value: +"Observed shelf price. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase."
  3. Changed10 schema fields changed
    • removedOutput schema / properties / product / properties / offer_count
      Removed value: -{
      -  "description": "How many offers this product has. search_catalog lists at most 5, orderable ones first; get_product lists all.",
      -  "type": "integer"
      -}
    • addedOutput schema / properties / product / properties / offers / description
      Added value: +"Always empty in product discovery. This field does not verify or rule out fulfillment availability."
    • removedOutput schema / properties / product / properties / offers / items / properties / city
      Removed value: -{
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • removedOutput schema / properties / product / properties / offers / items / properties / distance_miles
      Removed value: -{
      -  "type": [
      -    "number",
      -    "null"
      -  ]
      -}
    • changedOutput schema / properties / product / properties / offers / items / properties / note / description
      Previous value: -"The disclosure a shopper sees for this shop; relay it."New value: +"A fulfillment disclosure, when applicable."
    • removedOutput schema / properties / product / properties / offers / items / properties / store_id
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / product / properties / offers / items / properties / store_name
      Removed value: -{
      -  "type": "string"
      -}
    • changedOutput schema / properties / product / properties / offers / items / properties / url / description
      Previous value: -"Storefront page for this exact offer."New value: +"Storefront page for this exact product."
    • changedOutput schema / properties / product / properties / offers / items / required
      Previous value: -[
      -  "store_id",
      -  "is_eligible_search",
      -  "is_eligible_checkout",
      -  "fulfillment",
      -  "availability"
      -]New value: +[
      +  "product_id",
      +  "is_eligible_search",
      +  "is_eligible_checkout",
      +  "fulfillment",
      +  "availability"
      +]
    • addedOutput schema / properties / product / properties / offers / maxItems
      Added value: +0
  4. Changed3 schema fields changed
    • changedOutput schema / properties / product / properties / offers / items / properties / availability / description
      Previous value: -"NULL when we cannot read that shop's shelf, or the last read is over 24 hours old (shelf_observed_at says when). Null is not 'out of stock' — it means unknown, and must not be presented as either availability state."New value: +"NULL when we have no shelf read under 24 hours old (shelf_observed_at says when). Do not call it in or out of stock; when is_eligible_checkout is true it can still be ordered."
    • changedOutput schema / properties / product / properties / offers / items / properties / fulfillment / description
      Previous value: -"`local_delivery`: delivered from the shop. `concierge`: a person goes to the shop and buys it on the buyer's behalf. start_checkout returns a hosted request link, even when is_eligible_checkout is false; the page determines whether a request can proceed. The link is not a stock reservation, durable quote or completed purchase. `ship_to_home`: shipped from the shop. `in_store_only`: the shop carries it, but it cannot be ordered through JENNi; tell the shopper to visit the shop. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."New value: +"`local_delivery`: delivered from the shop. `concierge`: JENNi collects it from the shop and delivers it; buy it with start_checkout like any orderable offer. `ship_to_home`: shipped from the shop. `in_store_only`: the shop carries it, but it cannot be ordered through JENNi; tell the shopper to visit the shop. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront."
    • changedOutput schema / properties / product / properties / offers / items / properties / is_eligible_checkout / description
      Previous value: -"True when the storefront offers this exact offer for order: ordering on, a checkout price quote, a shelf in stock, a courier or shipping, and a stated delivery fee. Local delivery is also refused when the shop's own hours show no opening within the week; a search result may not carry hours, and start_checkout re-checks with them. False forbids direct checkout. An explicitly `concierge` offer may still use start_checkout for a hosted request handoff; the product page checks whether a request is available. Neither eligibility nor a handoff reserves stock, creates a quote or places an order."New value: +"True: this offer can be ordered through JENNi; call start_checkout with it when the shopper wants to buy. start_checkout and the checkout page re-check the offer and say why if it can no longer be ordered, so do not ask the shopper to confirm stock or hours first. False: do not send the shopper to checkout for this offer. Nothing is charged until the shopper places the order on the checkout page."
  5. Changed18 schema fields changed
    • addedInput schema / properties / market
      Added value: +{
      +  "description": "Market key, e.g. san-antonio-tx. Used when no zip is given.",
      +  "type": "string"
      +}
    • removedInput schema / properties / postal_code
      Removed value: -{
      -  "description": "Optional echoed caller context only; never filters facts.",
      -  "pattern": "^[0-9]{5}(?:-[0-9]{4})?$",
      -  "type": "string"
      -}
    • removedInput schema / properties / product_id / maxLength
      Removed value: -128
    • changedInput schema / properties / zip / description
      Previous value: -"Optional echoed caller context only; never filters facts."New value: +"5-digit US ZIP code, for local prices and distances."
    • removedInput schema / properties / zip / pattern
      Removed value: -"^[0-9]{5}(?:-[0-9]{4})?$"
    • removedOutput schema / additionalProperties
      Removed value: -false
    • removedOutput schema / properties / catalog_authority
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "kind": {
      -      "const": "jenni_catalog_facts",
      -      "type": "string"
      -    },
      -    "policy_hash": {
      -      "const": "1340ae7f5b87d590b5107d90c6ace904a0b38419101e211f39f5bbaa84e704a1",
      -      "type": "string"
      -    },
      -    "version": {
      -      "const": "2026-10-16.v1",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "kind",
      -    "version",
      -    "policy_hash"
      -  ],
      -  "type": "object"
      -}
    • removedOutput schema / properties / contract_version
      Removed value: -{
      -  "const": "catalog_facts_v1",
      -  "type": "string"
      -}
    • removedOutput schema / properties / exhausted
      Removed value: -{
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / items
      Removed value: -{
      -  "items": {
      -    "additionalProperties": false,
      -    "properties": {
      -      "brand": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "category": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "id": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "name": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "checkout_eligible": {
      -        "const": false,
      -        "type": "boolean"
      -      },
      -      "gtin": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "id": {
      -        "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
      -        "type": "string"
      -      },
      -      "images": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 0,
      -        "type": "array"
      -      },
      -      "offers": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 0,
      -        "type": "array"
      -      },
      -      "stock_state": {
      -        "const": "unknown",
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "upc": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "id",
      -      "title",
      -      "brand",
      -      "upc",
      -      "gtin",
      -      "category",
      -      "images",
      -      "offers",
      -      "stock_state",
      -      "checkout_eligible"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • removedOutput schema / properties / mode
      Removed value: -{
      -  "const": "canonical_discovery",
      -  "type": "string"
      -}
    • removedOutput schema / properties / next_cursor
      Removed value: -{
      -  "type": [
      -    "string",
      -    "null"
      -  ]
      -}
    • removedOutput schema / properties / offer_policy
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "state": {
      -      "const": "not_requested",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "state"
      -  ],
      -  "type": "object"
      -}
    • addedOutput schema / properties / product
      Added value: +{
      +  "properties": {
      +    "brand": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "category": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "color": {
      +      "description": "Colour of the variant product_id names; null when it has none.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "description": {
      +      "description": "The merchant's own description (get_product only).",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "image": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "offer_count": {
      +      "description": "How many offers this product has. search_catalog lists at most 5, orderable ones first; get_product lists all.",
      +      "type": "integer"
      +    },
      +    "offers": {
      +      "items": {
      +        "properties": {
      +          "availability": {
      +            "description": "NULL when we cannot read that shop's shelf, or the last read is over 24 hours old (shelf_observed_at says when). Null is not 'out of stock' — it means unknown, and must not be presented as either availability state.",
      +            "enum": [
      +              "in_stock",
      +              "out_of_stock",
      +              null
      +            ],
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "city": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "distance_miles": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "fulfillment": {
      +            "description": "`local_delivery`: delivered from the shop. `concierge`: a person goes to the shop and buys it on the buyer's behalf. start_checkout returns a hosted request link, even when is_eligible_checkout is false; the page determines whether a request can proceed. The link is not a stock reservation, durable quote or completed purchase. `ship_to_home`: shipped from the shop. `in_store_only`: the shop carries it, but it cannot be ordered through JENNi; tell the shopper to visit the shop. `pickup` is store-owned capability metadata, not a JENNi customer reservation/ready/handoff flow, and is never returned. These are not executable MCP methods: ordering happens on the storefront.",
      +            "enum": [
      +              "pickup",
      +              "local_delivery",
      +              "ship_to_home",
      +              "concierge",
      +              "in_store_only"
      +            ],
      +            "type": "string"
      +          },
      +          "is_eligible_checkout": {
      +            "description": "True when the storefront offers this exact offer for order: ordering on, a checkout price quote, a shelf in stock, a courier or shipping, and a stated delivery fee. Local delivery is also refused when the shop's own hours show no opening within the week; a search result may not carry hours, and start_checkout re-checks with them. False forbids direct checkout. An explicitly `concierge` offer may still use start_checkout for a hosted request handoff; the product page checks whether a request is available. Neither eligibility nor a handoff reserves stock, creates a quote or places an order.",
      +            "type": "boolean"
      +          },
      +          "is_eligible_search": {
      +            "type": "boolean"
      +          },
      +          "note": {
      +            "description": "The disclosure a shopper sees for this shop; relay it.",
      +            "type": "string"
      +          },
      +          "price": {
      +            "description": "USD, e.g. \"$12.50\". Null when we hold no current price.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "product_id": {
      +            "description": "The exact variant this shop holds.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "shelf_observed_at": {
      +            "description": "When the shelf was last read. Null means never.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "shelf_price": {
      +            "description": "Store shelf price observed at the named store. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "store_id": {
      +            "type": "string"
      +          },
      +          "store_name": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Storefront page for this exact offer.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "store_id",
      +          "is_eligible_search",
      +          "is_eligible_checkout",
      +          "fulfillment",
      +          "availability"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "price": {
      +      "description": "Headline price in USD; null when none is held.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "product_id": {
      +      "type": "string"
      +    },
      +    "shelf_price": {
      +      "description": "Store shelf price observed at the named store. Browse information only; not a checkout price. Use `price` and is_eligible_checkout for purchase.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "size": {
      +      "description": "Size of the variant product_id names; null when it has none.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "title": {
      +      "type": "string"
      +    },
      +    "url": {
      +      "description": "Storefront product page, where the buyer picks size/colour, checks out as a guest (email, no account) and pays. Null when no storefront is configured.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "variants": {
      +      "description": "Buyable size/colour variants. Give the shopper the variant url so the page opens on that choice. search_catalog lists at most 30; get_product lists all.",
      +      "items": {
      +        "properties": {
      +          "color": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "product_id": {
      +            "type": "string"
      +          },
      +          "size": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "url": {
      +            "description": "Storefront page opened on this variant.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "product_id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "product_id",
      +    "title",
      +    "offers"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / properties / requested_context
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "postal_code": {
      -      "pattern": "^[0-9]{5}(?:-[0-9]{4})?$",
      -      "type": [
      -        "string",
      -        "null"
      -      ]
      -    }
      -  },
      -  "required": [
      -    "postal_code"
      -  ],
      -  "type": "object"
      -}
    • removedOutput schema / properties / snapshot_semantics
      Removed value: -{
      -  "const": "live_keyset",
      -  "type": "string"
      -}
    • removedOutput schema / properties / source_observed_at
      Removed value: -{
      -  "format": "date-time",
      -  "type": "string"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "mode",
      -  "contract_version",
      -  "items",
      -  "next_cursor",
      -  "exhausted",
      -  "catalog_authority",
      -  "offer_policy",
      -  "requested_context",
      -  "source_observed_at",
      -  "snapshot_semantics"
      -]New value: +[
      +  "product"
      +]
  6. First observed

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's 'read-only' is redundant. It does add genuine value beyond the annotations by disclosing the returned data scope (no source-shop details) and the important trust caveat that product facts do not confirm fulfillment eligibility.

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?

Two short sentences, front-loaded with the core action and followed by the scope/trust caveat. Every clause carries information and there is no filler.

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?

An output schema exists, so return-value documentation is not required, and the description supplies the key scope and trust boundaries. It stops short of naming the alternative tool for fulfillment questions or clarifying zip/market precedence, which are the only meaningful remaining gaps.

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 coverage is 67%: zip and market are documented in the schema, but product_id has no schema description and is only implicitly covered by 'by product_id'. The description adds no format, constraint, or interaction details (e.g., zip vs market precedence) beyond what the schema already states, so the baseline 3 holds.

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 ('Read-only product details by product_id') and scopes it by excluding source-shop details, which helps separate it from store-oriented siblings like find_stores. However, it never names search_catalog or get_buying_options, so sibling differentiation relies on inference rather than explicit contrast.

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 caveat 'Product facts do not verify fulfillment eligibility' implies the tool should not be trusted for fulfillment questions, hinting at when to reach for get_buying_options, but no alternative is named and no positive when-to-use condition is stated. Usage is implied rather than directed.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources