fontsource-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fontsource-mcpfind a variable sans-serif font and get the CSS"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fontsource-mcp
An MCP stdio server for https://fontsource.org, which packages 2000+ open-source fonts (all of Google Fonts plus extras) as npm modules served from the jsDelivr CDN. It reads the public API and CDN and needs no key.
A subset is a font file cut down to one script, such as latin. A variable font packs a whole weight
range into one file and exposes axes such as wght.
Tools
search_fonts: fuzzyqueryover id and family, plus AND filters (category,subsets,weights,styles,variable,license,type). Paginated. Rows carry enough to pick a font.get_font: subsets, weights, styles, axes, unicode ranges, license, version, npm names, CSS font-family names, page URL, zip URL, and CDN URL templates for oneid.get_font_css:<link>tags,@importlines, npm install and import lines, thefont-familyrule, and inlinable@font-faceCSS with absolute URLs.variable:trueselects the variable package.download_font: writes to<dest>/<id>/. Filters by subset, weight, style, andformat(woff2, woff, ttf).variable:truefetches<subset>-wght-<style>.woff2.zip:truesaves the official zip unextracted.index_fonts: facet counts by category, subset, license, type, and variable. WithoutFileit writes the full catalog JSON to disk.get_axis_registry: the variable-font axis registry.
Related MCP server: iconfont-mcp
Download location
download_font writes under dest when given, else FONTSOURCE_DOWNLOAD_DIR, else ./fonts in the
server's working directory. Under a plugin install that directory is not your project, so set the
variable or pass dest. In Claude Code, export it before launching claude. The Claude Desktop
extension asks for a folder at install.
Install
Claude Code:
/plugin marketplace add nightious/fontsource-mcp
/plugin install fontsource-mcp@fontsource-mcpThe plugin wires the server through ${CLAUDE_PLUGIN_ROOT} and adds a skill for agents. Needs Node 18+.
Claude Desktop: download fontsource-mcp.mcpb from Releases and open it. The server is one
dependency-free dist/index.mjs, so nothing runs npm install.
Manual: run npm install && npm run build, then add to claude_desktop_config.json:
"fontsource": {
"command": "node",
"args": ["C:\\path\\to\\fontsource-mcp\\dist\\index.mjs"],
"env": { "FONTSOURCE_DOWNLOAD_DIR": "C:\\Users\\you\\fonts" }
}The MSIX build of Claude Desktop keeps that file under
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\.
Build and test
dist/index.mjs is the shipped artifact and is committed. After any change under src/, rebuild and
commit it.
npm run build # dist/index.mjs
npm run pack # build, then fontsource-mcp.mcpb
npm run selftest # about 20 live requests, ten secondsA selftest failure means the API shape or CDN file naming changed.
Data sources
https://api.fontsource.org/v1/{fonts, fonts/:id, variable/:id, axis-registry, download/:id}https://cdn.jsdelivr.net/fontsource/fonts/:id[:vf]@latest/<subset>-<weight|axis>-<style>.<ext>https://cdn.jsdelivr.net/npm/@fontsource[-variable]/:id@latest/<file>.css
Each font carries its own license (OFL, Apache-2.0, CC0, and others) in the license field.
License
All rights reserved. See LICENSE. The source is public for reading and for pull requests to this repository. It is not open source; do not redistribute it or publish a modified version.
Available Tools
6 toolsdownload_fontA
Download font files to disk under //. Default dest is $FONTSOURCE_DOWNLOAD_DIR, else ./fonts (currently /app/fonts). Static mode filters subsets, weights, styles, and format. variable:true fetches --.woff2 variable files and ignores weights and format. zip:true saves the official all-files zip without extracting it. Returns saved names and bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fontsource id slug such as "inter", "open-sans", or "noto-sans-jp". Get it from search_fonts. It is not the display name. | |
| zip | No | Save the api.fontsource.org/v1/download/<id> zip instead of individual files. | |
| axis | No | Variable only. "wght" (default), "standard", "full", or a single axis tag. | |
| dest | No | Directory to write into, absolute or relative to the server cwd. Files go in <dest>/<id>/. | |
| format | No | Static only. Default woff2. | |
| styles | No | ["normal"], ["italic"], or both. Omit for all. | |
| subsets | No | Subsets such as ["latin","latin-ext","cyrillic"]. Omit for all. | |
| weights | No | Weights such as [400,700]. Omit for all. | |
| variable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations, the description reveals important behavior: it writes to disk, explains default destination resolution with the current resolved path, details how variable mode ignores weights/format, and notes that zip mode saves without extracting. It also states the return value. This is rich, honest behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, organized around destination first then the three modes. Every sentence adds functional value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 9 parameters and no output schema, the description covers the destination, default path, mode-specific behavior, and return value. It could additionally clarify overwrite behavior or explicitly route to siblings, but the essential invocation context is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 89%, so the baseline is 3. The description adds meaning beyond the schema by explaining the dest default resolution, variable/zip parameter interactions, and static mode filtering behavior, which improves parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core action — 'Download font files to disk under <dest>/<id>/' — and specifies the exact output destination. This distinguishes it from siblings like get_font and get_font_css, which retrieve content rather than write files to disk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong guidance on the three execution modes (static, variable, zip) and how they affect parameters, which is useful for invocation. However, it never explicitly says when to prefer download_font over sibling tools, so the selection guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_axis_registryARead-only
Variable-font axis registry: name, description, min, max, and default for every axis tag (wght, wdth, opsz, slnt, ital, GRAD, and the rest). Pass a tag for one entry.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds behavior beyond that: it reveals the return contents and the optional-filter semantics of the tag parameter. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff: the resource and its contents are front-loaded, and the parameter behavior is stated in one imperative sentence. 'And the rest' is a minor fuzziness but does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-parameter lookup tool with a readOnly annotation, the description covers the resource contents and filtering behavior. It does not explicitly state what happens when tag is omitted, but the phrasing implies a full registry return, which is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the param burden. It explains that 'tag' selects a single entry and gives concrete valid examples (wght, wdth, opsz, slnt, ital, GRAD), adding real meaning over the bare 'string' schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (variable-font axis registry) and its contents (name, description, min, max, default per axis tag). The example tags distinguish it clearly from sibling font-search/font-download tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this when you need axis-tag metadata, and pass a tag to narrow to one entry. But it never explicitly contrasts with siblings like get_font or search_fonts, nor states when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fontARead-only
Metadata for one font: subsets, weights, styles, variable axes, unicode ranges, license, npm package names, CSS font-family names, fontsource.org page, zip URL, and CDN URL templates for every file. Call it before get_font_css or download_font to learn which subsets and weights exist.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fontsource id slug such as "inter", "open-sans", or "noto-sans-jp". Get it from search_fonts. It is not the display name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint annotation by disclosing the full scope of returned metadata, including variable axes, unicode ranges, license, package names, and CDN URL templates. It is clearly a read operation and no contradictory behavior is stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first lists the return contents, the second gives essential usage sequencing. The most actionable guidance is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool, the description fully covers what the agent needs: how to get the id, what metadata will be returned, and when to call this tool relative to siblings. No output schema is needed since the return contents are enumerated directly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the id parameter description is already rich, with examples, a source instruction, and a warning that it is not the display name. The tool description itself adds no parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieving metadata for one font, and enumerates the exact fields returned. It clearly distinguishes itself from sibling tools by positioning get_font as the metadata lookup before get_font_css or download_font.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call it: before get_font_css or download_font, to learn which subsets and weights exist. This provides concrete sequencing guidance and names the downstream tools it supports.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_font_cssARead-only
Font embedding snippets: CDN tags, @import lines, npm install and import lines, the font-family rule, and the @font-face CSS text with absolute URLs, safe to inline. Defaults to weight 400 normal. Each extra weight and style combination adds about 1.5KB of CSS. Set variable:true for the variable package; the font-family then becomes " Variable".
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fontsource id slug such as "inter", "open-sans", or "noto-sans-jp". Get it from search_fonts. It is not the display name. | |
| styles | No | Default ["normal"]. | |
| subsets | No | Static only. Omit for the all-subsets file per weight, or set it for the smaller per-subset files. | |
| weights | No | Static only. Default [400]. | |
| variable | No | Use @fontsource-variable/<id>. The font must be variable. | |
| variableFile | No | Variable only. CSS file stem: "wght" (default, always exists), or "standard", "full", "opsz", and so on where the package ships them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses meaningful behavior: defaults to weight 400 normal, each extra weight/style adding about 1.5KB of CSS, and the variable package changing the font-family to '<Family> Variable'. The 'absolute URLs, safe to inline' note also clarifies the returned CSS is directly usable. Nothing contradicts the readOnly annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences front-load the artifact list, then add defaults, size impact, and variable behavior in increasing order of specificity. Every sentence earns its place, with no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must communicate return content; the artifact enumeration and 'safe to inline' cover that well. Defaults and the variable-package caveat address the most consequential choices. It is slightly vague about the container format of the returned snippets, but the schema fully documents the parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value by explaining the weight/style default and the size tradeoff for extra combinations. It also clarifies what variable:true does to the font-family value. It does not discuss subsets or variableFile, but those are already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Font embedding snippets' and enumerates exact artifacts: CDN link tags, @import lines, npm install/import lines, the font-family rule, and @font-face CSS. This makes the tool's resource and output unmistakable and clearly distinguishes it from siblings like search_fonts, get_font, and download_font.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'embedding snippets' framing implies the use case, but the description never names sibling tools or states when to prefer get_font_css over get_font or download_font. There are no explicit exclusions or when-to-use/when-not-to-use instructions, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_fontsA
Catalog facets: counts per category, subset, license, type, and variable or static. With outFile it also writes the full 2000+ font catalog JSON (id, family, subsets, weights, styles, category, license, type, variable) to that path so you can grep or jq it locally instead of paginating search_fonts.
| Name | Required | Description | Default |
|---|---|---|---|
| outFile | No | Path to write the full catalog JSON. Omit for facets only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the disclosure burden. It clearly reveals the outFile side effect, the exact catalog contents, and that omitting outFile yields facets only. It does not address overwrite behavior or any access/rate considerations, but those are minor for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The facet behavior is front-loaded, and the outFile behavior and rationale follow immediately without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a tool with one optional parameter and no output schema. It explains the facet output, the optional file output, the contained fields, and the relationship to search_fonts. An agent has enough information to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents outFile, so the baseline is 3. The description adds value beyond the schema by specifying the catalog's field list and the local grep/jq use case, making the parameter's purpose and benefit concrete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Catalog facets') and a concrete resource (the font catalog), enumerating the facet dimensions (category, subset, license, type, variable/static). It also explicitly contrasts itself with search_fonts, so an agent can distinguish the two tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage guidance: use this tool to get facet counts, and use outFile when you want the full 2000+ catalog locally for grep/jq. It also names the alternative (search_fonts) and explains why you would avoid paginating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_fontsARead-only
Search the Fontsource catalog of 2000+ open-source fonts. The fuzzy query matches id and family (exact, then prefix, then substring, then all words). Filters are AND. Rows are compact and carry the id every other tool needs. Filters without a query browse a category.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | google means mirrored from Google Fonts. | |
| limit | No | Default 20. | |
| query | No | Name fragment such as "inter", "open sans", or "mono". | |
| offset | No | ||
| styles | No | ["normal"], ["italic"], or both. Omit for all. | |
| license | No | OFL-1.1 | Apache-2.0 | CC0-1.0 | mit | Unlicense | UFL-1.0 | |
| subsets | No | Subsets such as ["latin","latin-ext","cyrillic"]. Omit for all. | |
| weights | No | Weights such as [400,700]. Omit for all. | |
| category | No | ||
| variable | No | true returns only variable fonts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses non-obvious behavior: fuzzy query matching order (exact, prefix, substring, all words), AND-combined filters, compact rows, id-bearing output, and browse-without-query semantics. This gives an agent a realistic model of how the tool behaves before invoking it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place. The description is front-loaded with the core purpose, then gives query semantics, filter behavior, output note, and the no-query browsing alternative. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 10 optional parameters and no output schema, the description is fairly complete: it explains query behavior, filtering, output purpose, and browsing mode. A small gap is that it does not describe the shape of the returned rows beyond 'compact' and carrying the id, and offset is left undocumented in the schema as well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (80%), so the baseline is 3. The description adds meaningful semantics beyond the schema by explaining how the query parameter is matched and that filters combine with AND logic. It does not explain the offset or category parameters further, but the schema already documents most parameters clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search the Fontsource catalog of 2000+ open-source fonts.' It clearly differentiates this discovery tool from the sibling get/download/index tools by mentioning that its rows 'carry the id every other tool needs,' positioning it as the lookup step in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is the tool to find fonts and their ids, which are then needed by other tools. It also explains a distinct browsing mode: 'Filters without a query browse a category.' However, it does not explicitly name when not to use it or directly contrast it with get_font or index_fonts by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.1.1- First observed
download_font - First observed
get_axis_registry - First observed
get_font - First observed
get_font_css - First observed
index_fonts - First observed
search_fonts
TDQS
Each tool targets a clearly distinct part of the workflow: search_fonts finds fonts, get_font provides metadata, get_font_css generates CSS, download_font downloads files, index_fonts provides catalog-level facets/dumps, and get_axis_registry covers variable-axis definitions. Even the catalog-level pair search_fonts/index_fonts is separated by search results versus facet counts and full dumps.
All tools follow a consistent verb_object snake_case convention: search_fonts, get_font, get_font_css, download_font, index_fonts, get_axis_registry. The pluralization varies only where semantically appropriate, and there is no mixing of styles or vague generic verbs.
Six tools is well-scoped for a font catalog server: search, metadata, CSS generation, file download, catalog indexing, and axis registry each cover a distinct need. No tool feels redundant or missing from the core surface.
The tool set covers the full read-only font catalog workflow: discovering fonts, inspecting available subsets/weights/styles, generating embeddable CSS, downloading files, exporting the full catalog, and understanding variable-font axes. There are no obvious dead ends; get_font informs get_font_css and download_font, and index_fonts handles bulk catalog access.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
320K+ open-source SVG icons: 12 tools, anonymous metadata search; SVG, exports, collections via Pro.
Icons for agentic development: search & fetch 366,000+ open-source icons as SVG/PNG. No API key.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Provides tools for searching Google Workspace documentation and much more.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides access to 1,000+ Phosphor Icons with 6 weight styles, enabling icon search, retrieval, customization (color, size), and framework-specific implementation guidance through natural language.4,2243MIT
- FlicenseAqualityBmaintenanceEnables searching, downloading, and managing SVG icons from iconfont.cn, China's largest icon library. It supports filtering by style, downloading assets to local files, and listing user projects with authentication.882-
- AlicenseNot gradedqualityDmaintenanceProvides access to over 200,000 open-source vector icons from more than 200 icon sets via the Iconify API. It enables users to browse, search, and retrieve specific icon data along with usage examples for popular web frameworks like React, Vue, and Tailwind CSS.16915GPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with FontLab for font design and manipulation, including querying font metadata, creating/modifying glyphs, applying transformations, and exporting fonts.8MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nightious/fontsource-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server