agentspeed.

chroma.com

scanned 7/25/2026, 10:40:48 PM · cached · refresh in 22h · rubric 2026.07.4
Built with Webflow
robots.txt present: passrobots.txt allows AI agents: passContent-Signal directives: failllms.txt present: warnSitemap present: passLink response headers: failCanonical URL: passMCP server card: failOAuth authorization metadata: failOAuth resource metadata: failAPI catalog / OpenAPI: failWeb Bot Auth: failMarkdown negotiation: failText-to-markup ratio: warnContent without JavaScript: skipHeading hierarchy: warnCookie wall blocks content: passPage title: warnMeta description: failJSON-LD present: failStructured data validates: skipSchema type coverage: failPaywall / login wall: passAgent Skills manifest: failWebMCP actions: failPrimary action reachable: warnReachability: passTime to first byte: passFull render time: skipPage weight: pass56/ 100 · F
At risk

This is how AI agents (not browsers) experience chroma.com. The score weights five categories of machine-readability; the ticks on the arc are the 30 individual checks behind it.

✉ Email me this report + alert me when it changes ↓

Top fixes

failMeta descriptionReadability

No <meta name="description">. Agents use it as a page summary; add a 50–200 character description.

Fix: Add `<meta name="description" content="...">` to your primary pages. Agents frequently use it as a summary.

failJSON-LD presentStructured data

No JSON-LD blocks found. Add a <script type="application/ld+json"> with a schema.org type for this page.

Fix · Webflow: Add JSON-LD in Page Settings → Custom Code (inside <head>) for the page’s type.

warnllms.txt presentDiscoverability

Found /llms.txt but missing H1 header and markdown links.

Fix · Webflow: Publish /llms.txt at your domain root. Build a spec-compliant one at /tools/llms-txt-generator.

failLink response headersDiscoverability

No HTTP Link: response headers. Emit canonical/alternate/describedby relations so HEAD-only or stream-rendering agents get them without parsing HTML.

Fix: Emit `Link:` headers for canonical, alternate-language, and describedby relations. Agents that fetch HEAD-only or stream-render rely on these.

warnPage titleReadability

<title> is 96 characters; keep it under 70 so it isn't truncated.

Fix: Add a concise <title> tag. Agents often cite it verbatim.

failSchema type coverageStructured data

Page looks like FAQPage; missing JSON-LD type(s): FAQPage.

Fix: Align JSON-LD type to page purpose. Product pages without Product markup are skipped by agent shopping flows.

Don’t lose this report

Get it in your inbox now — and a heads-up whenever chroma.com’s agent-readiness score changes. Free, unsubscribe anytime.

Fix it

Generated, ready-to-ship files for the gaps above — copy them or download and drop them into your repo.

Add an llms.txt
Publish this at https://chroma.com/llms.txt
# Optical Filters, Custom & OEM Filter Design, Imaging Systems & Products - Chroma Technology Corp

> What chroma.com offers, in one or two sentences an AI agent can quote.

## Key pages
- [Home](https://chroma.com/)
- [Optical Filters for Scientific, Imaging and Detection Industries](https://chroma.com/)
- [Setting the standard for success in optical filters](https://chroma.com/)
- [Our Products](https://chroma.com/)
- [Capabilities](https://chroma.com/)
- [Applications & Markets](https://chroma.com/)
- [Spectra Viewer](https://chroma.com/)

## About
Describe what chroma.com does, who it's for, and the primary action you want an
agent to be able to complete. Keep it factual and current.

What the agent receives

The agent’s-eye view
Optical Filters, Custom & OEM Filter Design, Imaging Systems & Products - Chroma Technology Corp 0" x-data="alertList()" x-cloak> { window.addEventListener('resize', () => { isOpen = false; }); $watch('isOpen', (value) => { document.body.style.overflow = value ? 'hidden' : 'auto'; }) }" x-cloak > open = true, 30); clearTimeout(_navT); navOpen = true" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75); clearTimeout(_navT); _navT = setTimeout(() => navOpen = false, 100)"> Products open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Optical Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > All Catalog Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Astronomy Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > LRGB Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Narrowband Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Photometry Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Bandpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Longpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Shortpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Single Bandpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Multi-bandpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Edge & Dichroic Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Longpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Shortpass Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Beamsplitters (50/50, etc.) open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Dichroic Beamsplitters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Multi-band Dichroic Beamsplitters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Fluorescence Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Dichroic Beamsplitters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Emission Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Excitation Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > PCR Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Raman Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Specialty Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Neutral Density (ND) Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Notch Rejection Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Polarizers open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Reflective Mirrors open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > By Wavelength Range open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > UV Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Visible Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > NIR Filters open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > SWIR Filters open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Filter Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > All Catalog Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Astronomy Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > FISH Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Fluorescence Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > FRET Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Machine Vision Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Microscopy Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > PCR Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Raman Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Ratiometric Sets open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > TIRF Sets open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Filter Accessories open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Cubes, Sliders and Rings open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Diagnostic Slides open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Reclaimed Cubes open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Catalogs & Downloads open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Custom & OEM Filters open = true, 30); clearTimeout(_navT); navOpen = true" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75); clearTimeout(_navT); _navT = setTimeout(() => navOpen = false, 100)"> Applications open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Aerospace & Defense open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Remote Sensing open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Satellite Communication (SatCom) open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Analytical Spectroscopy open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Raman open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Astronomy & Astrophotography open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Industrial open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Colorimetry open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Machine Vision open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Semiconductor Inspection and Metrology open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Short-Wave Infrared (SWIR) open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > UV open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 200)" > Life Science & Diagnostics open = true, 30)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = false, 75)" > Polymerase Chain Reaction (PCR) open = true, 100)" @mouseleave="clearTimeout(_t); _t = setTimeout(() => open = fa

Show your score

Embed this badge on your site. It links back to this live scan and updates on every rescan.

AgentSpeed score for chroma.com
<a href="https://agentspeed.com/scan/chroma.com"><img src="https://agentspeed.com/badge/chroma.com" alt="AgentSpeed agent-readiness score" height="56"></a>

Track this score

Get this report by email, then a heads-up when chroma.com’s agent-readiness actually changes — a check regressing, or the composite dropping.

Two things never trigger an email: a score change caused by us publishing a new rubric, because that is a different instrument rather than a change to your site, and movement explained only by timing-derived checks, which shift run to run on a site nobody touched.

Want it on your own schedule, with Slack or a webhook instead of email? Score-drift monitoring is on every paid plan.

Full breakdown

9 pass5 warn13 fail3 skip
Discoverability
pass
robots.txt present
A robots.txt is reachable at the site root.
100/100
pass
robots.txt allows AI agents
All 8 answer-time access agents allowed.
100/100
fail
Content-Signal directivesemerging
No Content-Signal directives. Add e.g. `Content-Signal: ai-train=no, ai-summarize=yes` to declare granular AI usage policy beyond binary allow/disallow.
0/100
warn
llms.txt present
Found /llms.txt but missing H1 header and markdown links.
60/100
pass
Sitemap present
sitemap.xml reachable and referenced from robots.txt.
100/100
fail
Link response headers
No HTTP Link: response headers. Emit canonical/alternate/describedby relations so HEAD-only or stream-rendering agents get them without parsing HTML.
0/100
pass
Canonical URL
Canonical points to self: https://www.chroma.com/.
100/100
fail
MCP server cardemerging
No valid MCP Server Card at /.well-known/mcp/server-card.json. Publish one so agents can discover your tools without HTML scraping.
0/100
fail
OAuth authorization metadataemerging
No RFC 8414 metadata at /.well-known/oauth-authorization-server. Agents that act on behalf of users need this to discover your authorization endpoints.
0/100
fail
OAuth resource metadataemerging
No RFC 9728 metadata at /.well-known/oauth-protected-resource. Publish it so agents can discover required scopes without hand-coded credentials.
0/100
fail
API catalog / OpenAPIemerging
No /.well-known/api-catalog (RFC 9727) and no /openapi.json|yaml. Publish one so agents that integrate with APIs can discover your endpoints.
0/100
fail
Web Bot Authemerging
No Web Bot Auth JWKS at /.well-known/http-message-signatures-directory.json. Publish one to allow trusted agents while keeping a default-deny posture for the rest.
0/100
Readability
fail
Markdown negotiationemerging
Accept: text/markdown returns HTML, not markdown. Serve a markdown variant of primary content when requested; agents summarize and cite it more reliably.
0/100
warn
Text-to-markup ratio
Visible text is 8.4% of HTML weight (20699/246970 bytes). Low. Markup may be crowding out agent-usable text.
61/100
skip
Content without JavaScript
Browser pass unavailable; cannot measure JS dependency.
warn
Heading hierarchy
Heading issues: 2 skipped level(s).
75/100
pass
Cookie wall blocks content
No common consent-modal markers detected.
100/100
warn
Page title
<title> is 96 characters; keep it under 70 so it isn't truncated.
60/100
fail
Meta description
No <meta name="description">. Agents use it as a page summary; add a 50–200 character description.
0/100
Structured data
fail
JSON-LD present
No JSON-LD blocks found. Add a <script type="application/ld+json"> with a schema.org type for this page.
0/100
skip
Structured data validates
No JSON-LD blocks present; nothing to validate (covered by structured_data.jsonld_present).
fail
Schema type coverage
Page looks like FAQPage; missing JSON-LD type(s): FAQPage.
0/100
Actionability
pass
Paywall / login wall
No paywall or login-wall detected on the landing URL.
100/100
fail
Agent Skills manifestemerging
No Agent Skills manifest at /.well-known/agent-skills.json. Enumerate the tasks agents can perform (search, add-to-cart, contact-support) so they pick the right one without scraping.
0/100
fail
WebMCP actionsemerging
No WebMCP detected. On pages with first-class actions (cart, support, account), embed a WebMCP server so on-page agents invoke tools directly.
0/100
warn
Primary action reachable
Offering identified but no price or canonical CTA found.
60/100
pass
Reachability
HTTP 200 after 1 redirect.
100/100
Performance
pass
Time to first byte
TTFB 167ms. Healthy.
100/100
skip
Full render time
Full-render time unavailable (browser pass skipped or failed).
pass
Page weight
Initial document is a lean 241 KB.
100/100
Beyond the scan

Running AI agents of your own? AgentSpeed also monitors them in production — every run, its latency, cost, and failures, with alerts when something breaks. Free for 10,000 events a month, no credit card.

Start watching free →See plans