Skip to main content
Glama
nightious

fontsource-mcp

by nightious

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: fuzzy query over 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 one id.

  • get_font_css: <link> tags, @import lines, npm install and import lines, the font-family rule, and inlinable @font-face CSS with absolute URLs. variable:true selects the variable package.

  • download_font: writes to <dest>/<id>/. Filters by subset, weight, style, and format (woff2, woff, ttf). variable:true fetches <subset>-wght-<style>.woff2. zip:true saves the official zip unextracted.

  • index_fonts: facet counts by category, subset, license, type, and variable. With outFile it 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-mcp

The 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 seconds

A 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 tools
download_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFontsource id slug such as "inter", "open-sans", or "noto-sans-jp". Get it from search_fonts. It is not the display name.
zipNoSave the api.fontsource.org/v1/download/<id> zip instead of individual files.
axisNoVariable only. "wght" (default), "standard", "full", or a single axis tag.
destNoDirectory to write into, absolute or relative to the server cwd. Files go in <dest>/<id>/.
formatNoStatic only. Default woff2.
stylesNo["normal"], ["italic"], or both. Omit for all.
subsetsNoSubsets such as ["latin","latin-ext","cyrillic"]. Omit for all.
weightsNoWeights such as [400,700]. Omit for all.
variableNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_registryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_fontA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFontsource id slug such as "inter", "open-sans", or "noto-sans-jp". Get it from search_fonts. It is not the display name.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_cssA
Read-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".

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFontsource id slug such as "inter", "open-sans", or "noto-sans-jp". Get it from search_fonts. It is not the display name.
stylesNoDefault ["normal"].
subsetsNoStatic only. Omit for the all-subsets file per weight, or set it for the smaller per-subset files.
weightsNoStatic only. Default [400].
variableNoUse @fontsource-variable/<id>. The font must be variable.
variableFileNoVariable only. CSS file stem: "wght" (default, always exists), or "standard", "full", "opsz", and so on where the package ships them.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outFileNoPath to write the full catalog JSON. Omit for facets only.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_fontsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNogoogle means mirrored from Google Fonts.
limitNoDefault 20.
queryNoName fragment such as "inter", "open sans", or "mono".
offsetNo
stylesNo["normal"], ["italic"], or both. Omit for all.
licenseNoOFL-1.1 | Apache-2.0 | CC0-1.0 | mit | Unlicense | UFL-1.0
subsetsNoSubsets such as ["latin","latin-ext","cyrillic"]. Omit for all.
weightsNoWeights such as [400,700]. Omit for all.
categoryNo
variableNotrue returns only variable fonts.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.1.1
    • First observeddownload_font
    • First observedget_axis_registry
    • First observedget_font
    • First observedget_font_css
    • First observedindex_fonts
    • First observedsearch_fonts

TDQS

A4.6/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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,224
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    169
    15
    GPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with FontLab for font design and manipulation, including querying font metadata, creating/modifying glyphs, applying transformations, and exporting fonts.
    8
    MIT

Latest Blog Posts

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