Website Font Detector (by Domain or URL)
omnial/web-fonts
Given a domain or a direct page URL, detects which fonts a live web page uses, the HTML tags each one is applied to, roughly how much of the page's elements and words render in it, and any declared CSS fallback fonts. Useful for checking a site's own typography or seeing what a competitor's page uses.
Price
Up to $0.0173 per call; you pay what the call used
You pay the price shown. If a call turns out to cost more than its quote, you pay the actual price, capped at twice the quote. No monthly minimum. Top-ups start at $5.00.
Data source
Data from the web page you request.
Use it
Your AI assistant does the work: it finds this tool, shows you the price first, runs it, and you are charged when the run finishes. There is nothing to set up for this tool in particular.
Connect once and your AI can find and run this tool, and any other it needs.
For developers: the calls your assistant makes
// 1. search: find the tool
omnial_search({ query: "what you need" })
// 2. inspect: price and input schema
omnial_inspect({ tool: "omnial/web-fonts" })
// 3. learn: read the usage guide at runtime
omnial_learn({ tool: "omnial/web-fonts" })
// 4. run: price the exact call first, then run it
omnial_execute({ tool: "omnial/web-fonts", input: { /* see input_schema */ }, dry_run: true })
omnial_execute({ tool: "omnial/web-fonts", input: { /* ... */ } })
// 5. settle: the call is charged when it finishes, nothing to doNot connected yet? Point your MCP client at https://mcp.eden-engine.com/mcp, then copy a config for your client.
Pricing
Every charge this tool can incur.
| Charge | Price |
|---|---|
Per call | $0.0173 |
- Updated
- Oct 27, 2026
Input and output schemas
Input schema
{
"type": "object",
"anyOf": [
{
"required": [
"domain"
]
},
{
"required": [
"directUrl"
]
}
],
"properties": {
"domain": {
"type": "string",
"minLength": 3,
"description": "Domain to detect fonts on, e.g. 'example.com'. Mutually exclusive with directUrl."
},
"maxAgeMs": {
"type": "integer",
"default": 7776000000,
"maximum": 9007199254740991,
"minimum": 0,
"description": "Maximum age in milliseconds of cached results before the upstream provider hard-refreshes it. Default 7776000000 (3 months); values are clamped to [86400000 (1 day), 31536000000 (1 year)]."
},
"directUrl": {
"type": "string",
"format": "uri",
"description": "Exact URL to use, bypassing domain resolution (e.g. 'https://example.com/pricing'). Mutually exclusive with domain."
},
"timeoutMS": {
"type": "integer",
"maximum": 300000,
"minimum": 1000,
"description": "Upstream timeout in milliseconds (max 300000). The upstream provider aborts the call with a 408 when exceeded. Keep it below the endpoint's requestTimeoutMs so the provider answers before the platform's own budget expires."
}
},
"additionalProperties": false
}Output schema
{
"type": "object",
"properties": {
"fonts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"font": {
"type": "string",
"description": "The font family name as it appears in the page's CSS, e.g. \"sohne-var\", or a generic keyword like \"system-ui\" when the page declares no custom font."
},
"uses": {
"type": "array",
"items": {
"type": "string"
},
"description": "Lowercase HTML tag names this font is applied to, e.g. \"body\", \"h1\", \"button\"."
},
"fallbacks": {
"type": "array",
"items": {
"type": "string"
},
"description": "The CSS fallback font stack declared alongside this font, e.g. \"sans-serif\"."
},
"num_words": {
"type": "number",
"description": "Count of words rendered in this font."
},
"num_elements": {
"type": "number",
"description": "Count of DOM elements rendered in this font."
},
"percent_words": {
"type": "number",
"description": "Share of all detected words that use this font, 0-100."
},
"percent_elements": {
"type": "number",
"description": "Share of all detected elements that use this font, 0-100."
}
},
"additionalProperties": true
},
"description": "One entry per distinct font detected in use on the page."
},
"domain": {
"type": "string",
"description": "The domain that was actually analyzed -- echoes the input `domain`, or the domain resolved from `directUrl` when that was supplied instead."
},
"status": {
"type": "string",
"description": "Observed as \"ok\" on every real call."
},
"finalDOMState": {
"type": "string",
"description": "Observed as \"loaded\" on every real call -- whether the page finished rendering before fonts were detected."
},
"cache_metadata": {
"type": "object",
"properties": {
"age_ms": {
"type": "number",
"description": "Age of the cached result in milliseconds."
},
"status": {
"type": "string",
"description": "Observed value: \"hit\" (served from cache) on both real calls captured. A fresh-fetch value is unconfirmed."
}
},
"description": "Whether this result was served from cache or freshly fetched.",
"additionalProperties": true
}
},
"description": "The font-detection record.",
"additionalProperties": true
}