M12 lens and C-mount lens finder with image-sensor matching and field-of-view calculator.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Public MCP server for Commonlands precision optics. Use it to choose M12/C-mount lenses, calculate field of view, verify live Shopify product truth, and hand buyers to Shopify-owned carts safely.
https://mcp.commonlands.com/mcphttps://mcp.commonlands.com/.well-known/ucphttps://mcp.commonlands.com/healthzdocs/client-connections.mddocs/agent-instructions.mddocs/live-usage-and-integrations.mdtools/list and trust the live list over docs.match_lens_to_sensor first, then call calculate_field_of_view for final candidate lens/sensor FoV claims.search_lens_catalog only for broad SKU/title/mount/lens-type discovery. It does not replace per-sensor FoV calculation.resources/read for commonlands://sensors/{part} or commonlands://lenses/{sku} when needed.get_lens_distortion_profile for distortion/model/status questions. Do not invent polynomial coefficients or claim measured correction when the response says source-display-only.prompts/list / prompts/get with select_lens_for_sensor_fov_working_distance when a client surfaces MCP prompts.read_shopify_products before quoting final SKU, URL, price, availability, Shopify IDs, or cart payloads.tools/list.Catalog EFL, image circle, max FoV/FOV@image-circle, and distortion display fields are insufficient to compute field of view on a specific sensor. Agents must not interpolate interior-sensor FoV or substitute their own calculations. Use calculate_field_of_view, then preserve returned hfov_deg, vfov_deg, dfov_deg, method, distortion_model, coverage_ok, image_circle_mm, sensor_diagonal_mm, rectilinear_comparison, and provenance/source metadata in the answer.
read_shopify_products = live Shopify product truth.calculate_field_of_view / match_lens_to_sensor = live FoV backend (AWS Lambda + DynamoDB lens catalog) when configured. Sensor inputs resolve through the live DynamoDB sensor catalog with fixture fallback. These are the routed public optics tools.compute_fov, compute_fov_catalog, match_lenses_to_sensor) still dispatch where practical, but new clients should route through the intent-named tools above.match_lens_to_sensor, recommend_lenses_for_application, compare_lenses) rank against live FoV-backend specs and field of view when the live backend is enabled, so they use real per-SKU specs (EFL, mount, image circle, FoV). They still exclude live Shopify stock/price/variant IDs; use read_shopify_products for purchasable truth. If the live backend is unconfigured they fall back to fixture scaffold.If fixture data conflicts with read_shopify_products or the live FoV/sensor backends, use the live truth.
commonlands://sensors/{part} and the sensor used by calculate_field_of_view / match_lens_to_sensor): read from the Commonlands DynamoDB sensor table by part number when configured, with fixture fallback. Pixel pitch and pixel counts come straight from that table; active-area mm is derived as pixels x pitch.commonlands://lenses/{sku}, calculate_field_of_view, match_lens_to_sensor, search_lens_catalog): the FoV Lambda reads lens optical parameters from its DynamoDB lens table when configured. Catalog-wide matching covers the full lens table when backend scanning is enabled.distortion_model / distortion_status and does not claim measured polynomial correction.The production surface currently exposes 20 tools across catalog/search, FoV, Shopify read-only, cart, UCP catalog, and purchase-handoff. Checkout tools, cancel_cart, and read_shopify_metaobjects are not exposed. Always trust the live tools/list over any doc.
Key tools:
calculate_field_of_view, match_lens_to_sensor, search_lens_catalog, get_lens_distortion_profile.tools/list): search_catalog, lookup_catalog, get_product, get_product_page_details, compare_lenses, recommend_lenses_for_application.tools/list): compute_fov, compute_fov_catalog, match_lenses_to_sensor, search_lenses, get_lens_details.commonlands://sensors/{part}, commonlands://lenses/{sku}, commonlands://catalog/sensors, commonlands://catalog/lenses, and prompt select_lens_for_sensor_fov_working_distance.read_shopify_products, get_shopify_readonly_config_status.create_cart, get_cart, update_cart when visible in tools/list.submit_rfq forwards a buyer quote request or question to the fixed Commonlands engineering inbox (SendGrid). The agent cannot choose the recipient; it sends an inquiry only (no order, payment, or Shopify write) and stays inert (routes to the contact page) until SENDGRID_API_KEY + RFQ_TO_EMAIL + RFQ_FROM_EMAIL are configured.get_catalog_snapshot_status, get_shopify_ucp_readiness, prepare_shopify_purchase_handoff, get_purchase_route_options.The endpoint is public and unauthenticated, so read_shopify_products returns
only data that is already public on commonlands.com (enforced server-side
in src/shopify-read-adapter.ts, see PUBLIC_DATA_POLICY):
status field is never returned.availability signal
(in_stock / low_stock / out_of_stock / untracked); raw counts and
inventory item IDs are never returned.includeMetafields defaults to
false; when enabled, only the custom.* display fields rendered on public
product pages are returned. App/private namespaces and non-allowlisted keys
(including custom.docsend_page) are always dropped.read_shopify_metaobjects was removed from the public surface
(2026-07): Admin metaobject definitions can hold non-public store content.
Calls return an actionable error pointing to read_shopify_products.Cart tools are deliberately reachable without authentication β the same trust model as Shopify's own public Storefront cart β but they are bounded:
wrangler.toml):
120 requests/min per IP across /mcp, and 10 cart mutations/min per IP for
create_cart/update_cart. Exceeding either returns HTTP 429 with
retry-after: 60.expiryAuthority: shopify_cart_ttl_expires_at)
belong to Shopify, which prunes abandoned carts automatically. No cart,
session, customer, or payment state is ever stored in the Worker.Find M12 lenses for IMX477 around 50Β° horizontal FoV. Use match_lens_to_sensor, calculate_field_of_view, then verify the final purchasable SKU with read_shopify_products.Compare CIL078 and CIL250 on IMX477. Preserve rectilinear_comparison and label fixture-backed context separately from live Shopify truth.Find the live Shopify Product and Variant GID for CIL250. Return URL, SKU, price, inventory signal, and cart path, but do not create a cart.Create a Shopify cart for two units of this live Variant GID: <gid>. The buyer has confirmed quantity 2.List Commonlands MCP tools and classify each as fixture context, live FoV, live Shopify read-only, or Shopify cart.The Worker can write privacy-safe request/tool telemetry when a Cloudflare Analytics Engine binding named MCP_ANALYTICS is configured. Telemetry records only method, path, MCP method, tool name, status, client label, environment/version, HTTP status, and duration. It does not record request arguments, Shopify payloads, customer data, product IDs, cart IDs, secrets, or response bodies.
Example binding:
After deploy, verify that telemetry is live:
/healthz should report "telemetry":{"analyticsEngine":"configured"}. Then query the commonlands_mcp_events Analytics Engine dataset. Column order is blob1=request method, blob2=path, blob3=MCP method, blob4=tool, blob5=status, blob6=client, blob7=environment, blob8=version, double1=HTTP status, and double2=duration ms.
Tool usage rollup:
Client/tool rollup:
Use blob4 to see which MCP tools agents actually call. High-call/high-success tools are candidates for deeper investment; low-call or repeated-error tools are candidates for better descriptions, consolidation, or deprecation. Keep Cloudflare invocation logs enabled for request/response metadata, but use Analytics Engine for tool-level decisions because it captures the JSON-RPC method and tool name without storing request arguments.
mcp-remoteNon-secret config lives in wrangler.toml [vars]; credentials are Worker secrets set via the Cloudflare dashboard or wrangler secret put (never committed).
| Setting | Where | Purpose |
|---|---|---|
account_id | wrangler.toml | Pins the Cloudflare account so deploys do not call /memberships (which an account-scoped API token cannot access, surfacing as auth error 9106). |
FOV_LIVE_BACKEND_ENABLED | [vars] | "true" routes FoV through the live Lambda backend. |
FOV_LAMBDA_ENDPOINT | [vars] | Allowlisted FoV Lambda/API Gateway URL. |
FOV_BACKEND_SCANS_FULL_CATALOG | [vars] | "true" makes compute_fov_catalog omit partNums so the Lambda scans its full DynamoDB lens table. Requires ALLOW_LENS_SCAN=true on the Lambda. When "false", the Worker sends fixture SKUs as a fallback. |
SENSOR_DDB_TABLE | [vars] | DynamoDB sensor table name. |
SENSOR_DDB_REGION | [vars] | DynamoDB sensor table region. |
FOV_API_KEY | secret | Shared key the Worker sends to the FoV Lambda (x-api-key); must match the Lambda's FOV_API_KEY exactly (byte-for-byte, no trailing newline). |
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY | secret | Read-only IAM user credentials the Worker uses to read the sensor DynamoDB table (SigV4). |
CLOUDFLARE_API_TOKEN | GitHub Actions secret | Token with Workers Scripts: Edit used by the Deploy workflow. |
dynamodb:Scan/Query/GetItem/DescribeTable on that table ARN). No write actions exist in the code path.compute_fov_catalog full-catalog coverage the Lambda needs ALLOW_LENS_SCAN=true and dynamodb:Scan on the lens table.id); attributes used: sensormfg, sensorhpix, sensorvpix, sensorpitch, sensortype (shutter type).LENS_PK must be set accordingly.Requirements: Node.js 22+.
Local smoke test:
Run verification first, then deploy through CI so /healthz receives production build metadata (ENVIRONMENT=production, package VERSION, and GIT_SHA=$GITHUB_SHA). The source wrangler.toml intentionally does not define deployable local metadata placeholders.
For an approved manual deploy, npm run deploy runs scripts/deploy.mjs,
which deploys with --keep-vars and injects the same production build
metadata. npm run deploy:raw is the unwrapped Wrangler deploy command.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/commonlands-optics-m12-lens-and-c-mount-lens-finder-field-of-view-calculator)<a href="https://allmcps.com/mcp/commonlands-optics-m12-lens-and-c-mount-lens-finder-field-of-view-calculator"><img src="https://allmcps.com/api/badge/commonlands-optics-m12-lens-and-c-mount-lens-finder-field-of-view-calculator?style=directory" alt="Commonlands Optics: M12 Lens and C Mount Lens Finder + Field Of View Calculator on AllMCPs" /></a>