{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"calculate_field_of_view","title":"Calculate Commonlands field of view","description":"Calculate Commonlands lens field of view for a lens/sensor pair and return HFOV, VFOV, DFOV, coverage, distortion status, and an explicit rectilinear comparison. Use this tool for FOV, HFOV, VFOV, DFOV, field of view, \"lens for\", lens-to-sensor, AR0234, IMX290, IMX477, and sensor part-number requests. It returns Commonlands data the model cannot derive: live backend FoV when configured, distortion model/status, image-circle coverage, live stock through Shopify read tools where applicable, and MTF/CRA/BFL fields if present in upstream catalog data. Do not use naive rectilinear fallback, focal-length-only math, interpolation, or self-computed catalog estimates when a Commonlands lens/sensor route is available. Accepts lens_sku/lensSku or focal_length_mm/focalLengthMm, plus sensor/sensorPartNumber/sensor_part_number and working_distance_mm/workingDistanceMm. No part number? Describe the sensor directly: widthPx + heightPx + pixelSizeUm (active area is derived as pixels x pitch), or sensorWidthMm + sensorHeightMm. Results are labelled CUSTOM-<w>x<h>. If only focal length is supplied, the response is marked as a rectilinear reference and does not claim Commonlands distortion-corrected lens truth.","inputSchema":{"type":"object","properties":{"lens_sku":{"type":"string","description":"Commonlands lens SKU, for example CIL250. Snake-case alias for lensSku."},"lensSku":{"type":"string","description":"Commonlands lens SKU, for example CIL250. Camel-case alias for lens_sku."},"focal_length_mm":{"type":"number","exclusiveMinimum":0,"description":"Fallback rectilinear reference only when no Commonlands lens SKU is available. Snake-case alias for focalLengthMm."},"focalLengthMm":{"type":"number","exclusiveMinimum":0,"description":"Fallback rectilinear reference only when no Commonlands lens SKU is available. Camel-case alias for focal_length_mm."},"sensor":{"anyOf":[{"type":"string","enum":["IMX477","IMX219","AR0234"],"description":"Known catalog sensor part number."},{"type":"string","pattern":"^[A-Za-z0-9-]{2,32}$","description":"Safe sensor identifier accepted for live catalog lookup."},{"type":"object","properties":{"part_number":{"type":"string"},"partNumber":{"type":"string"}},"additionalProperties":true}],"description":"Sensor part number or safe sensor object. Supports AR0234, IMX290/IMX477 when present in the live catalog, and fixture sensors listed in the enum."},"sensorPartNumber":{"anyOf":[{"type":"string","enum":["IMX477","IMX219","AR0234"]},{"type":"string","pattern":"^[A-Za-z0-9-]{2,32}$"}],"description":"Sensor part number. Camel-case alias for sensor."},"sensor_part_number":{"anyOf":[{"type":"string","enum":["IMX477","IMX219","AR0234"]},{"type":"string","pattern":"^[A-Za-z0-9-]{2,32}$"}],"description":"Sensor part number. Snake-case alias for sensorPartNumber."},"working_distance_mm":{"type":"number","exclusiveMinimum":0,"description":"Optional working distance in mm. Snake-case alias for workingDistanceMm."},"workingDistanceMm":{"type":"number","exclusiveMinimum":0,"description":"Optional working distance in mm. Camel-case alias for working_distance_mm."},"widthPx":{"type":"integer","minimum":1,"description":"Custom sensor: horizontal pixel count (e.g. 4056). Use with heightPx and pixelSizeUm."},"heightPx":{"type":"integer","minimum":1,"description":"Custom sensor: vertical pixel count (e.g. 3040)."},"horizontalPixels":{"type":"integer","minimum":1,"description":"Alias for widthPx."},"verticalPixels":{"type":"integer","minimum":1,"description":"Alias for heightPx."},"pixelSizeUm":{"type":"number","exclusiveMinimum":0,"description":"Custom sensor: pixel pitch in microns (e.g. 1.55)."},"pixelPitchUm":{"type":"number","exclusiveMinimum":0,"description":"Alias for pixelSizeUm."},"sensorWidthMm":{"type":"number","exclusiveMinimum":0,"description":"Custom sensor: active-area width in mm (alternative to pixels x pitch)."},"sensorHeightMm":{"type":"number","exclusiveMinimum":0,"description":"Custom sensor: active-area height in mm."}},"anyOf":[{"required":["lens_sku"]},{"required":["lensSku"]},{"required":["focal_length_mm"]},{"required":["focalLengthMm"]}],"additionalProperties":false},"outputSchema":{"type":"object","required":["hfov_deg","vfov_deg","dfov_deg","method","distortion_model","image_circle_mm","sensor_diagonal_mm","coverage_ok","rectilinear_comparison"],"properties":{"hfov_deg":{"type":["number","null"]},"vfov_deg":{"type":["number","null"]},"dfov_deg":{"type":["number","null"]},"method":{"type":"string"},"distortion_model":{"type":"string"},"image_circle_mm":{"type":["number","null"]},"sensor_diagonal_mm":{"type":"number"},"coverage_ok":{"type":["boolean","null"]},"rectilinear_comparison":{"type":"object","required":["dfov_deg","delta_deg"],"properties":{"dfov_deg":{"type":["number","null"]},"delta_deg":{"type":["number","null"]}},"additionalProperties":false}},"additionalProperties":true},"annotations":{"title":"Calculate Commonlands field of view","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"match_lens_to_sensor","title":"Match Commonlands lenses to a sensor","description":"Find and rank Commonlands lenses for a sensor, target field of view, working distance, mount, or \"lens for\" request. Use this tool for FOV, HFOV, VFOV, DFOV, field of view, \"lens for\", lens-to-sensor, AR0234, IMX290, IMX477, and sensor part-number requests. It returns Commonlands data the model cannot derive: live backend FoV when configured, distortion model/status, image-circle coverage, live stock through Shopify read tools where applicable, and MTF/CRA/BFL fields if present in upstream catalog data. Do not use naive rectilinear fallback, focal-length-only math, interpolation, or self-computed catalog estimates when a Commonlands lens/sensor route is available. Use this for AR0234, IMX290, IMX477, sensor part numbers, M12/C-mount matching, and target HFOV/VFOV/DFOV workflows; do not shortlist from focal length alone. No part number? Describe the sensor directly: widthPx + heightPx + pixelSizeUm (active area is derived as pixels x pitch), or sensorWidthMm + sensorHeightMm. Results are labelled CUSTOM-<w>x<h>. Use read_shopify_products afterward for live stock, price, availability, Shopify variantId, product URL, and metafields.","inputSchema":{"type":"object","properties":{"widthPx":{"type":"integer","minimum":1,"description":"Custom sensor: horizontal pixel count (e.g. 4056). Use with heightPx and pixelSizeUm."},"heightPx":{"type":"integer","minimum":1,"description":"Custom sensor: vertical pixel count (e.g. 3040)."},"horizontalPixels":{"type":"integer","minimum":1,"description":"Alias for widthPx."},"verticalPixels":{"type":"integer","minimum":1,"description":"Alias for heightPx."},"pixelSizeUm":{"type":"number","exclusiveMinimum":0,"description":"Custom sensor: pixel pitch in microns (e.g. 1.55)."},"pixelPitchUm":{"type":"number","exclusiveMinimum":0,"description":"Alias for pixelSizeUm."},"sensorWidthMm":{"type":"number","exclusiveMinimum":0,"description":"Custom sensor: active-area width in mm (alternative to pixels x pitch)."},"sensorHeightMm":{"type":"number","exclusiveMinimum":0,"description":"Custom sensor: active-area height in mm."},"sensor":{"anyOf":[{"type":"string","enum":["IMX477","IMX219","AR0234"],"description":"Known catalog sensor part number."},{"type":"string","pattern":"^[A-Za-z0-9-]{2,32}$","description":"Safe sensor identifier accepted for live catalog lookup."}],"description":"Sensor part number, for example AR0234, IMX290, or IMX477. Any sensor in the live catalog is accepted; the enum lists only the fixture fallback set."},"sensorPartNumber":{"anyOf":[{"type":"string","enum":["IMX477","IMX219","AR0234"]},{"type":"string","pattern":"^[A-Za-z0-9-]{2,32}$"}],"description":"Sensor part number. Alias for sensor."},"sensor_part_number":{"anyOf":[{"type":"string","enum":["IMX477","IMX219","AR0234"]},{"type":"string","pattern":"^[A-Za-z0-9-]{2,32}$"}],"description":"Sensor part number. Snake-case alias for sensorPartNumber."},"desired_horizontal_fov_deg":{"type":"number","exclusiveMinimum":0},"desiredHorizontalFovDeg":{"type":"number","exclusiveMinimum":0},"working_distance_mm":{"type":"number","exclusiveMinimum":0},"workingDistanceMm":{"type":"number","exclusiveMinimum":0},"mount":{"type":"string","description":"Optional mount filter, for example M12 or C-mount."},"max_results":{"type":"integer","minimum":1,"maximum":10,"default":5},"maxResults":{"type":"integer","minimum":1,"maximum":10,"default":5}},"anyOf":[{"required":["sensor"]},{"required":["sensorPartNumber"]},{"required":["sensor_part_number"]},{"required":["widthPx","heightPx","pixelSizeUm"]},{"required":["horizontalPixels","verticalPixels","pixelSizeUm"]},{"required":["widthPx","heightPx","pixelPitchUm"]},{"required":["sensorWidthMm","sensorHeightMm"]}],"additionalProperties":false},"annotations":{"title":"Match Commonlands lenses to a sensor","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"search_lens_catalog","title":"Search Commonlands lens catalog","description":"Search the Commonlands lens catalog by SKU, mount, lens type, M12, C-mount, or application text. For sensor part numbers such as AR0234, IMX290, and IMX477, or any \"lens for <sensor>\" request, use match_lens_to_sensor instead — sensor names are not searchable text here. Use this tool for FOV, HFOV, VFOV, DFOV, field of view, \"lens for\", lens-to-sensor, AR0234, IMX290, IMX477, and sensor part-number requests. It returns Commonlands data the model cannot derive: live backend FoV when configured, distortion model/status, image-circle coverage, live stock through Shopify read tools where applicable, and MTF/CRA/BFL fields if present in upstream catalog data. Do not use naive rectilinear fallback, focal-length-only math, interpolation, or self-computed catalog estimates when a Commonlands lens/sensor route is available. This discovers candidate lenses from Commonlands catalog/live backend data; it does not replace calculate_field_of_view for sensor-specific HFOV/VFOV/DFOV and does not replace read_shopify_products for live stock/price/product truth.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"SKU, title, mount, lens type, application, sensor, or field-of-view search text."},"limit":{"type":"integer","minimum":1,"maximum":25,"default":10}},"additionalProperties":false},"annotations":{"title":"Search Commonlands lens catalog","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_lens_distortion_profile","title":"Get Commonlands lens distortion profile","description":"Return the Commonlands distortion model/status for one lens SKU, including whether the data is source-display-only or backend-calculated. Use this tool for FOV, HFOV, VFOV, DFOV, field of view, \"lens for\", lens-to-sensor, AR0234, IMX290, IMX477, and sensor part-number requests. It returns Commonlands data the model cannot derive: live backend FoV when configured, distortion model/status, image-circle coverage, live stock through Shopify read tools where applicable, and MTF/CRA/BFL fields if present in upstream catalog data. Do not use naive rectilinear fallback, focal-length-only math, interpolation, or self-computed catalog estimates when a Commonlands lens/sensor route is available. Use this for distortion, rectilinear-vs-wide-angle, MTF/CRA/BFL/optical-profile questions when upstream fields are present. Do not invent polynomial coefficients or claim measured distortion correction when the backend only returns display distortion.","inputSchema":{"type":"object","properties":{"lens_sku":{"type":"string","description":"Commonlands lens SKU, for example CIL250. Snake-case alias for lensSku."},"lensSku":{"type":"string","description":"Commonlands lens SKU, for example CIL250. Camel-case alias for lens_sku."},"sku":{"type":"string","description":"Legacy SKU alias."}},"anyOf":[{"required":["lens_sku"]},{"required":["lensSku"]},{"required":["sku"]}],"additionalProperties":false},"annotations":{"title":"Get Commonlands lens distortion profile","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_sensor_specs","title":"Get sensor specs","description":"Return sensor dimensions, pixel pitch, and resolution for lens field of view, M12 lens, and C-mount lens matching inputs. In production this uses the read-only live sensor table when configured, with fixture fallback when unavailable. Use these specs as inputs to calculate_field_of_view or match_lens_to_sensor, not as a reason to hand-calculate FoV. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"partNumber":{"type":"string","description":"Sensor part number, for example IMX477."}},"required":["partNumber"],"additionalProperties":false},"annotations":{"title":"Get sensor specs","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"compare_lenses","title":"Compare Commonlands lenses","description":"Compare selected Commonlands M12 lens and C-mount lens SKUs on the same sensor with the same deterministic scoring model. Use as explanatory context, then call calculate_field_of_view for final sensor-specific FoV values when precision matters. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor. Not live product truth; verify purchasable facts with read_shopify_products.","inputSchema":{"type":"object","properties":{"lensSkus":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"string"}},"sensorPartNumber":{"type":"string","description":"Sensor part number, for example IMX477."},"workingDistanceMm":{"type":"number","exclusiveMinimum":0}},"required":["lensSkus","sensorPartNumber"],"additionalProperties":false},"annotations":{"title":"Compare Commonlands lenses","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_product_page_details","title":"Get product page details","description":"Return fixture-backed product-page handoff details for one lens, including DynamoDB-sourced optical specs and gated datasheet policy. Product-page/catalog optical fields are not a substitute for sensor-specific FoV; call calculate_field_of_view for the lens/sensor pair. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor. Use read_shopify_products for live product URL, price, availability, variant IDs, and metafields.","inputSchema":{"type":"object","properties":{"sku":{"type":"string","description":"Commonlands short part number, for example CIL250."}},"required":["sku"],"additionalProperties":false},"annotations":{"title":"Get product page details","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_catalog_snapshot_status","title":"Get joined catalog snapshot status","description":"Return fixture-backed joined catalog counts, validation status, source provenance, live connector readiness, and non-authoritative product-truth warning.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"Get joined catalog snapshot status","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_shopify_ucp_readiness","title":"Get Shopify Storefront/UCP readiness","description":"Report connector-free Shopify Storefront MCP and UCP Catalog compatibility, launch blockers, and Commonlands engineering differentiators.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"Get Shopify Storefront/UCP readiness","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_shopify_readonly_config_status","title":"Get Shopify read-only config status","description":"Report sanitized Cloudflare Shopify binding presence, approved read scopes, and read-only safety flags without exposing secrets or calling Shopify.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"title":"Get Shopify read-only config status","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"read_shopify_products","title":"Read Shopify products","description":"Use this for live purchasable product truth: product and variant IDs, SKUs, prices, coarse availability, product URLs, and public product-page metafields. Public data only: active products, no exact inventory counts, and metafields limited to the custom.* display fields shown on commonlands.com product pages. Read-only; does not create carts, checkouts, orders, customers, inventory mutations, or Shopify writes. Fixture catalog tools are scaffold data only.","inputSchema":{"type":"object","properties":{"sku":{"type":"string","description":"Optional variant SKU, for example CIL250."},"handle":{"type":"string","description":"Optional Shopify product handle."},"query":{"type":"string","description":"Optional safe Shopify product/variant search text."},"limit":{"type":"integer","minimum":1,"maximum":25,"default":10},"includeMetafields":{"type":"boolean","default":false,"description":"When true, include the allowlisted public product-page metafields (custom.* display specs). Non-public namespaces and keys are never returned."}},"additionalProperties":false},"annotations":{"title":"Read Shopify products","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"create_cart","title":"Create Shopify cart","description":"Create a Shopify-owned cart after buyer confirmation of live variants and quantities. Retain cart_access_token for get_cart/update_cart. For an agent-authorized purchase, use the returned agent_checkout route in the buyer's separate Shop MCP connection; Shop handles sign-in, approval, and payment. Otherwise use Commonlands create_checkout for a customer payment link. This tool places no order.","inputSchema":{"type":"object","properties":{"meta":{"type":"object","description":"Optional UCP metadata. ucp-agent.profile is filled from server config when omitted."},"cart":{"type":"object","properties":{"line_items":{"type":"array","minItems":1,"maxItems":25,"items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":999},"item":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},"required":["quantity","item"],"additionalProperties":false}},"context":{"type":"object"},"signals":{"type":"object"}},"required":["line_items"],"additionalProperties":false}},"required":["cart"],"additionalProperties":false},"annotations":{"title":"Create Shopify cart","readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"destructiveHint":false}},{"name":"get_cart","title":"Get Shopify cart","description":"Retrieve a Shopify-owned cart with its cart_access_token from create_cart. Retain the full cart id, owner token, and continue_url. The agent_checkout field describes how the buyer's separate Shop MCP connection can convert this cart and complete an approved purchase; it does not itself place an order.","inputSchema":{"type":"object","properties":{"meta":{"type":"object"},"id":{"type":"string","description":"Shopify Cart gid."},"cart_access_token":{"type":"string","description":"Owner credential returned by create_cart for this cart id."}},"required":["id","cart_access_token"],"additionalProperties":false},"annotations":{"title":"Get Shopify cart","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"update_cart","title":"Update Shopify cart","description":"Replace the complete Shopify cart after buyer confirmation. Requires id and cart_access_token. Read the cart first, then send cart.line_items containing every item to retain with item.id (ProductVariant GID), quantity, and optional existing line id. Omitted lines are removed; [] empties the cart. This does not place an order.","inputSchema":{"type":"object","properties":{"meta":{"type":"object"},"id":{"type":"string"},"cart_access_token":{"type":"string","description":"Owner credential returned by create_cart for this cart id."},"cart":{"type":"object","required":["line_items"],"additionalProperties":false,"properties":{"line_items":{"type":"array","minItems":0,"maxItems":25,"items":{"type":"object","required":["item","quantity"],"additionalProperties":false,"properties":{"id":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":999},"item":{"type":"object","required":["id"],"additionalProperties":false,"properties":{"id":{"type":"string"}}}}}},"context":{"type":"object"}}}},"required":["id","cart","cart_access_token"],"additionalProperties":false},"annotations":{"title":"Update Shopify cart","readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"destructiveHint":true}},{"name":"cancel_cart","title":"Cancel Shopify cart","description":"Cancel a Shopify-owned cart using its id and cart_access_token. Requires meta[\"idempotency-key\"] UUID for retry safety. This does not cancel an order or refund payment.","inputSchema":{"type":"object","properties":{"meta":{"type":"object"},"id":{"type":"string"},"cart_access_token":{"type":"string","description":"Owner token returned by create_cart."}},"required":["id","meta","cart_access_token"],"additionalProperties":false},"annotations":{"title":"Cancel Shopify cart","readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"destructiveHint":true}},{"name":"create_checkout","title":"Create Shopify Checkout MCP checkout","description":"Prepare a Shopify checkout after the buyer confirms exact live variants and quantities. Pass checkout.cart_id and its cart_access_token to convert a cart, or checkout.line_items. Retain checkout_access_token from the response. Send the buyer to continue_url for review and payment; this does not place an order.","inputSchema":{"type":"object","properties":{"meta":{"type":"object","description":"Optional UCP metadata. ucp-agent.profile is filled from server config when omitted."},"cart_access_token":{"type":"string","description":"Required when checkout.cart_id is supplied; use the owner token from create_cart."},"checkout":{"type":"object","properties":{"cart_id":{"type":"string","description":"Optional Shopify Cart gid to convert/hand off into checkout."},"line_items":{"type":"array","minItems":0,"maxItems":25,"items":{"type":"object","properties":{"quantity":{"type":"integer","minimum":1,"maximum":999},"item":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},"required":["quantity","item"],"additionalProperties":false}},"context":{"type":"object"}},"additionalProperties":false}},"required":["checkout"],"additionalProperties":false},"annotations":{"title":"Create Shopify Checkout MCP checkout","readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"destructiveHint":false}},{"name":"get_checkout","title":"Get Shopify Checkout MCP checkout","description":"Read a Shopify checkout handoff summary using its id and checkout_access_token from create_checkout. Buyer and payment details are withheld. Send the buyer to continue_url to review and pay.","inputSchema":{"type":"object","properties":{"meta":{"type":"object"},"id":{"type":"string","description":"Shopify Checkout gid."},"checkout_access_token":{"type":"string","description":"Owner token returned by create_checkout."}},"required":["id","checkout_access_token"],"additionalProperties":false},"annotations":{"title":"Get Shopify Checkout MCP checkout","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"search_catalog","title":"Search UCP catalog","description":"Fixture-backed UCP Catalog search alias for Shopify-native product discovery; no live Shopify calls or cart behavior. Use this only for broad discovery; when a sensor or target FoV is involved, call match_lens_to_sensor or calculate_field_of_view instead of estimating from catalog fields. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"meta":{"type":"object","description":"Optional UCP agent metadata."},"catalog":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":25,"default":10}},"additionalProperties":true}},"additionalProperties":false},"annotations":{"title":"Search UCP catalog","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"lookup_catalog","title":"Lookup UCP catalog products","description":"Fixture-backed UCP Catalog lookup alias for product, variant, SKU, handle, or URL identifiers; returns not-found messages instead of writes. Lookup records are not enough for sensor-specific FoV; call calculate_field_of_view for known lens/sensor pairs. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"meta":{"type":"object"},"catalog":{"type":"object","properties":{"ids":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"string"}}},"required":["ids"],"additionalProperties":true}},"required":["catalog"],"additionalProperties":false},"annotations":{"title":"Lookup UCP catalog products","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_product","title":"Get UCP catalog product","description":"Fixture-backed UCP Catalog product detail alias with Commonlands optical metadata and Shopify-native handoff fields. Product optical fields are not a substitute for sensor-specific FoV; call calculate_field_of_view for the lens/sensor pair. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"meta":{"type":"object"},"catalog":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":true}},"required":["catalog"],"additionalProperties":false},"annotations":{"title":"Get UCP catalog product","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"prepare_shopify_purchase_handoff","title":"Prepare Shopify purchase handoff","description":"Build a read-only Shopify-native purchase handoff seam for a selected lens without creating carts, checkout, orders, inventory mutations, or writes. Preserve any computed FoV provenance from calculate_field_of_view/match_lens_to_sensor when carrying optical context into purchase handoff. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"sku":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":999,"default":1},"sensorPartNumber":{"type":"string"},"selectedVariantId":{"type":"string"}},"required":["sku"],"additionalProperties":false},"annotations":{"title":"Prepare Shopify purchase handoff","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"get_purchase_route_options","title":"Get purchase route options","description":"Return safe dual-channel purchase route options for AI agents and robotics engineers across Commonlands MCP and Shopify-native channels without mutating commerce state. This explains commerce routes only; call calculate_field_of_view/match_lens_to_sensor for sensor-specific FoV before recommending a lens. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"sku":{"type":"string"},"quantity":{"type":"integer","minimum":1,"maximum":999,"default":1},"sensorPartNumber":{"type":"string"},"buyerIntent":{"type":"string"},"agentType":{"type":"string"}},"required":["sku"],"additionalProperties":false},"annotations":{"title":"Get purchase route options","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"recommend_lenses_for_application","title":"Recommend lenses for an application","description":"Rank Commonlands M12 lenses and C-mount lenses for an application note such as embedded robotics, machine-vision inspection, or a required lens field of view. Use as an application shortlist helper, then call match_lens_to_sensor or calculate_field_of_view for final per-sensor HFOV/VFOV/DFOV. FoV rule: never estimate sensor-specific FoV from catalog fields; use calculate_field_of_view or match_lens_to_sensor.","inputSchema":{"type":"object","properties":{"sensorPartNumber":{"type":"string","description":"Sensor part number, for example IMX477."},"application":{"type":"string"},"desiredHorizontalFovDeg":{"type":"number","exclusiveMinimum":0},"workingDistanceMm":{"type":"number","exclusiveMinimum":0},"mount":{"type":"string"},"preferLowDistortion":{"type":"boolean","default":false},"requireInStock":{"type":"boolean","default":false},"maxResults":{"type":"integer","minimum":1,"maximum":10,"default":5}},"required":["sensorPartNumber"],"additionalProperties":false},"annotations":{"title":"Recommend lenses for an application","readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"destructiveHint":false}},{"name":"submit_rfq","title":"Submit an RFQ or question to Commonlands","description":"Forward a buyer request-for-quote or engineering question to the Commonlands engineering team. Two-step, buyer-confirmed: the first call returns a preview and sends nothing; show the buyer the preview (including their reply-to email) and, only after they explicitly approve, call again with confirm: true to send. The recipient is fixed to the Commonlands inbox (the agent cannot choose it); this only sends an inquiry and never creates an order, charges a card, or writes Shopify/customer data. Include part numbers, sensor, quantity, and application when known so the team can reply with a quote. Commonlands replies by email.","inputSchema":{"type":"object","properties":{"message":{"type":"string","description":"The buyer's question or RFQ details.","maxLength":4000},"email":{"type":"string","description":"The buyer's reply-to email so Commonlands can respond."},"name":{"type":"string","description":"Optional buyer name."},"company":{"type":"string","description":"Optional company name."},"kind":{"type":"string","enum":["rfq","question"],"description":"Whether this is a quote request or a general question. Defaults to question."},"partNumbers":{"description":"Optional Commonlands SKUs of interest (string or array).","anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"},"maxItems":25}]},"sensor":{"type":"string","description":"Optional sensor part number for context."},"quantity":{"type":"integer","minimum":1,"description":"Optional quantity for the quote."},"application":{"type":"string","description":"Optional application note."},"confirm":{"type":"boolean","default":false,"description":"Explicit buyer approval. Omit or false to get a no-send preview; set true only after the buyer has seen the preview and approved sending."}},"required":["message","email"],"additionalProperties":false},"annotations":{"title":"Submit an RFQ or question to Commonlands","readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"destructiveHint":false}}]}}