fontpool について
fontpoolは、フォントカタログを検索し、プロジェクトにフォントを導入するMCPサーバーです。開発者やコーディングエージェントがカテゴリー、用途タグ、可変軸をもとにフォントを選べるようにし、WOFF2ファイルを取得してCSSを生成します。
主な機能
- 013つのフォント提供元をまとめて検索
- 02カテゴリー、タグ、可変軸で絞り込み
- 03ファミリーの詳細とファウンドリーの説明を確認
- 04フォントファイルを取得して@font-face CSSを生成
- 05プロジェクト内でフォントをセルフホスト
活用シーン
- 01カテゴリーやデザイン用途からフォントを検索
- 02ファミリー選定前に可変軸を比較
- 03フォントファイルとCSSをプロジェクトに追加
- 04実行時のCDNフォント要求をローカルファイルに置換
MCP 対応
MCPクライアントにフォント検索、プロパティ照会、インストールのツールを提供します。ワークスペースのルートが指定されている場合、`install_font`はプロジェクトの範囲内にファイルとCSSを書き込みます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tag | string | いいえ | 用途タグ。例:'editorial'、'branding'、'legible'、'code'。引数なしで呼び出すと、タグ一覧を表示します。 |
| limit | integer | いいえ | 返すフォントファミリーの最大数。デフォルトは 100 です。 |
| filter | string | いいえ | ファミリー名に対する、大文字と小文字を区別しない部分文字列一致です。 |
| exclude | array | いいえ | 指定した provider が提供するファミリーを除外します。['google'] を指定すると、Google の API が提供していない 218 件のファミリーが残ります。 |
| hasAxis | string | いいえ | 指定した可変軸を持つファミリーのみを対象にします。例:'wdth'(幅)、'opsz'(オプティカルサイズ)、'slnt'(傾斜)、または 'CASL' などの表現軸。引数なしで呼び出すと、軸一覧を表示します。 |
| category | enum | いいえ | 1 つのカテゴリに限定します。sans-serif | serif | slab-serif | display | handwriting | monospace | blackletter | icons | other |
| provider | enum | いいえ | 1 つの provider に限定します。省略するとすべてが対象です。fontshare | fontsource | google |
| variableOnly | boolean | いいえ | 可変軸を持つファミリーのみを対象にします。 |
詳細
Fontpool
タイポグラフィを扱うための MCP サーバーです。3 つのフォントプロバイダーを 1 つのカタログとして検索し、各ファミリーの実態――カテゴリ、用途タグ、ファウンドリ独自の説明、すべての可変軸――を示します。また、実際の woff2 ファイルをプロジェクトにダウンロードし、それに合った @font-face ルールを記述します。
フォントはセルフホストされます。実行時の CDN リクエストがなく、サードパーティが URL を変更しても問題が起きません。unifont を基盤にしています。
目的は利便性ではありません。ページのスタイル設定を AI に頼むと、ほぼ毎回 Inter か Roboto が選ばれます。最も出現確率が高い名前であることに加え、読み込み可能だと分かっているフォントだからです。Fontpool は、代わりに参照できるものを提供します。2,168 のファミリーに、それぞれのカテゴリ、用途タグ、ファウンドリ独自の説明が付いており、そのうち218 は Google のカタログにありません。
プロバイダー
| プロバイダー | 提供内容 |
|---|---|
| Fontshare | ITF 独自のリリース――Satoshi、Switzer、General Sans、Clash Display。ほかでは扱っていない 65 ファミリー |
| Fontsource | サブセットごとにパッケージ化されたオープンソースファミリー。unicode-range に対応。ほかでは扱っていない 127 ファミリー |
| Google Fonts のカタログ |
この順番で参照され、ファミリーを認識した最初のプロバイダーが優先されるため、Satoshi は類似フォントではなく、ITF の正規リリースに解決されます。
Google にしかないファミリーはありません。Google のカタログは Fontsource に完全に含まれており、Fontsource が Google より先に参照されるため、Google がインストールを実際に提供したことはありません。フォールバックとしてのみ残されています。unifont はプロバイダー自身のカタログ取得に失敗しても処理を続けるため、Fontsource、そしてそれとともに jsDelivr にアクセスできない場合でも、Google によって約 1,950 のファミリーを利用できます。
Bunny は 1.3.0 で削除されました。 Google Fonts のミラーであり、なくてもカタログは 2,168 ファミリーのままなので、削除しても影響はありませんでした。Bunny が提供していた Google の旧名称 26 個――Source Sans Pro、Material Symbols、Big Shoulders ファミリー――はすべて Fontsource にもあるため、利用できなくなったフォントはありません。ここでは「プライバシー優先」という訴求も関係ありません。fontpool はフォントファイルをダウンロードしてセルフホストするため、実行時に CDN へのリクエストは発生しません。
218 という数値には注意点があります。これは Google の API が現在扱っていないファミリーの数であり、そのうち約 26 は一度 Google が提供していたものの、現在は廃止されたファミリーです。Google が一度も扱っていないファミリーは、およそ 192 です。
Adobe Fonts は意図的に除外されています。 Adobe の利用規約では、Adobe 独自の CDN からキットを埋め込んでフォントを読み込むことが求められるため、プロジェクトにダウンロードすることはできません。セルフホスト可能なファイルを提供すると謳うツールが、Adobe Fonts を誠実に提供することはできないため、中途半端に対応するのではなく除外しています。
インストール
Node 20 以降が必要です。API キーもアカウントも不要です。
npx -y fontpool
クライアントの設定に記述するコマンドも同じです。
Claude Code
claude mcp add fontpool -- npx -y fontpool
Claude Desktop
macOS では ~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json を使用します。
{
"mcpServers": {
"fontpool": {
"command": "npx",
"args": ["-y", "fontpool"]
}
}
}
Cursor / Windsurf / Zed などの stdio クライアント
そのクライアントの MCP 設定に、同じ形式で記述します。
{
"mcpServers": {
"fontpool": {
"command": "npx",
"args": ["-y", "fontpool"]
}
}
}
スキル
SKILL.md はサーバーに同梱されています。モデルがツールを呼び出そうと思わなければ、ツールは役に立ちません。また、CSS を書くときにフォントを探しに行くことが自然に促されるわけでもありません。そこでスキルが、「サンセリフが必要だ」と考えてからフォント名を入力するまでの間に、ひと手間を加えます。クライアントがスキルを読み込む場所にコピーするか、エージェントに直接参照させてください。
ツール
list_fonts
カタログを検索します。引数なしで呼び出すと、2,168 個の名前を一度に出力するのではなく、カタログの構成を説明します。これにより、タグの語彙を確認できます。
{}
2168 families:
By category:
sans-serif: 824
display: 500
serif: 379
handwriting: 369
monospace: 72
other: 17
icons: 8
slab-serif: 4
blackletter: 1
Not carried by Google: 218 families (exclude: ["google"] to see only these).
Tags: poster (53), magazine (50), book (37), logo (31), website (29),
banners (28), editorial (23), branding (20), headline (18), app (11),
legible (11), packaging (9), screen (8), code (5), fun (5), …
Variable axes: wght [Weight] (614), ital [Italic] (185), wdth [Width] (97),
opsz [Optical Size] (32), slnt [Slant] (23), ELSH [Element Shape] (15),
CRSV [Cursive] (14), GRAD [Grade] (8), MONO [Monospace] (3), …30 rarer axes
Narrow with category, tag, filter or exclude — listing all 2168 names at
once is rarely the useful answer.
フィルターを指定すると、比較して選べる候補が表示されます。
{ "category": "serif", "tag": "editorial" }
6 families (category: serif, tag: editorial):
Bespoke Serif — serif · fontshare · Indian Type Foundry · magazine, poster, book, branding, editorial
Crimson Pro — serif · fontshare+fontsource+google · magazine, publishing, editorial
Gambarino — serif · fontshare · Indian Type Foundry · magazine, poster, book, editorial
Karma — serif · fontshare+fontsource+google · Indian Type Foundry · banners, editorial
Rowan — serif · fontshare · Indian Type Foundry · book, text, legible, editorial
Zodiak — serif · fontshare · Indian Type Foundry · editorial, magazine, book
| パラメーター | 効果 |
|---|---|
provider | fontshare、fontsource、google のいずれか |
filter | ファミリー名に対する大文字・小文字を区別しない部分文字列検索 |
category | sans-serif、serif、slab-serif、display、handwriting、monospace、blackletter、icons、other |
tag | 用途タグ — editorial、branding、legible、code、… |
exclude | 指定したプロバイダーが提供するファミリーを除外します。["google"] を指定すると、Google の API が提供していない 218 個が残ります |
variableOnly | 可変軸を持つファミリーのみ |
hasAxis | 指定した軸(wdth、opsz、slnt、または CASL のような表現力豊かな軸)を持つファミリーのみ。大文字・小文字は区別しません |
limit | 返されるファミリーの最大数。デフォルトは 100、最大 500 |
結果は重複が取り除かれます。unifont のカタログでは、同じファミリーが提供元ごとに返されます。2,168 ファミリーに対して 6,124 行となり、その大半は重複で約 20k トークンに及ぶため、ここでは重複をまとめ、各ファミリーの提供元を一覧表示します。
font_properties
ファミリーが実際に提供するものと、そのファミリーの特性を、採用する前に確認できます。ファミリー名は大文字・小文字と空白を区別せずに照合されるため、satoshi と jetbrains mono はどちらも該当します。
{ "family": "Satoshi" }
{
"family": "Satoshi",
"formats": ["woff2", "woff", "ttf"],
"styles": ["normal", "italic"],
"weights": ["300", "400", "500", "700", "900", "300 900"],
"provider": "fontshare",
"availableFrom": ["fontshare"],
"categories": ["sans-serif"],
"tags": ["logo", "magazine", "branding"],
"foundry": "Indian Type Foundry",
"designers": ["Deni Anggara"],
"description": "Satoshi is a modernist sans serif typeface. Its design combines typically grotesk-style letterforms, with some characters that are quite geometrically-designed…",
"descriptionSource": "Indian Type Foundry (marketing copy)",
"variableAxes": {
"wght": { "name": "Weight", "min": 300, "max": 900, "default": 780 }
}
}
可変フォントのウェイトは "300 900" のような範囲で表示されます。この文字列をそのまま install_font に渡すと、複数の静的ファイルではなく、1 つの可変ファイルを取得できます。
variableAxes には、ウェイトだけでなく、そのファミリーが持つすべての軸が一覧表示されます。これは、あるフォントを別のフォントより選ぶ理由になることがよくあります。
{
"family": "Recursive",
"variableAxes": {
"wght": { "name": "Weight", "min": 300, "max": 1000, "default": 400 },
"slnt": { "name": "Slant", "min": -15, "max": 0, "default": 0 },
"CASL": { "name": "Casual", "min": 0, "max": 1, "default": 0, "step": 0.01 },
"CRSV": { "name": "Cursive", "min": 0, "max": 1, "default": 0.5, "step": 0.1 },
"MONO": { "name": "Monospace", "min": 0, "max": 1, "default": 0, "step": 0.01 }
}
}
小文字のタグは OpenType に登録された 5 つの軸です。大文字のタグはファウンドリーが定義したもので、その書体が定めた意味を持ちます。step は、情報として意味のないデフォルト値 1 の場合、省略されます。list_fonts { hasAxis: "wdth" } のように、どの軸でもフィルターできます。2,168 ファミリーのうち 97 ファミリーが幅の軸を持っており、名前を見ただけでは確認できません。
description はファウンドリー独自の説明文で、プロバイダーのカタログから取得され、その旨が示されます。デザインについては信頼できますが、長所については熱意が込められているため、その点を考慮してください。一致するものがない場合は、失敗を報告するだけでなく、近い候補も提示します。
No provider knows 'Intar'. Did you mean: Inter, NTR, Anta, Inder, Zina?
install_font
ファイルをダウンロードして CSS を書き込みます。
{
"family": "Inter",
"targetDir": "./public/fonts",
"cssPath": "./src/fonts.css",
"weights": ["400", "700"],
"styles": ["normal"],
"subsets": ["latin", "latin-ext"],
"urlPrefix": "/fonts"
}
Installed Inter from fontsource.
Files in /Users/you/app/public/fonts:
inter-400-normal-latin-68f645c6.woff2 (23.1 KB)
inter-700-normal-latin-5197a7ae.woff2 (23.8 KB)
inter-400-normal-latin-ext-1bf1f837.woff2 (34.2 KB)
inter-700-normal-latin-ext-c8d55506.woff2 (35.4 KB)
CSS in /Users/you/app/src/fonts.css: 4 rule(s) added, 0 updated, 0 already
present. Import it, then use:
font-family: 'Inter', sans-serif;
Make sure fonts is served at /fonts.
必須なのは family、targetDir、cssPath のみです。それ以外は、ウェイトが 400 と 700、スタイルが normal、サブセットが latin と latin-ext、urlPrefix が /fonts に設定されます。
知っておくとよい点が 3 つあります。
urlPrefixは公開パスであり、ディスク上のパスではありません。 ファイルはtargetDirに配置され、CSS はurlPrefixのパスを参照します。静的ファイルのルートがpublic/の場合、targetDir: "./public/fonts"とurlPrefix: "/fonts"を組み合わせます。- どのファイルからもインポートされていないスタイルシートは、その旨が報告されます。 どのファイルからも参照されていない
fonts.cssを作成するのは、成功とまったく同じように見える唯一の失敗です。ファイルは配置され、ルールも正しいのに、ページでは依然として Helvetica がレンダリングされます。ワークスペースのルート以下で新しいスタイルシートがどこからも参照されていない場合、結果にその旨が表示され、追加すべき内容が示されます。プロジェクトですでにインポートされているcssPathを優先してください。 - 安全に再インストールできます。 ファイル名にはコンテンツハッシュが含まれ、
src以外のすべての記述子が一致するルールは同じフェイスとして認識されます。そのため、2 回目のインストールでは重複が追加されず、既存のルールが更新されます。
ファミリーが存在していても、指定したウェイトがない場合は、名前の誤りとしてではなく、その旨が表示されます。
'Satoshi' exists, but not in the combination you asked for (weights 350;
styles normal; subsets latin, latin-ext). It has weights 300, 400, 500, 700,
900, 300 900; styles normal, italic.
メタデータの取得元
カテゴリ、タグ、ファウンダリー、説明は、2 つのカタログ API から取得します。カタログ全体をカバーする Fontshare の 100 ファミリー(Fontshare)と Fontsource の 2,103 ファミリー(Fontsource)です。Google は Fontsource のサブセットであるため、この 2 つでカタログ全体をカバーできます。Google の公開 API が提供するのはカテゴリのみなので、参照しません。
可変軸は 3 つ目のエンドポイントであるFontsource の /v1/variableから取得します。573 ファミリーが名前でカタログに結合され、余りはありません。Fontshare も独自の軸を公開しており、Fontshare にしかない 65 ファミリーのウェイト範囲を取得するにはこれが唯一の方法です。Fontshare では可変スタイルごとに 1 つのエントリーがリストされるため、可変のローマン体とイタリック体を持つファミリーでは wght が 2 回報告されます。これらは範囲をまとめる際に統合し、エントリー間で値が一致しない場合は、どれかを恣意的に選ばず default を除外します。
軸の表示名には、Google の軸レジストリにある 56 個のタグを使用します。レジストリは 2.7MB のペイロードに含まれており、そのうち 2.68MB は Google のフォント一覧で、更新頻度も年に 1 回ほどのため、取得せずハードコードしています。コピー後に追加されたタグは、範囲を保持したままラベルなしで渡されます。
unifont はすでに 2 つのカタログ API を取得して完全なレコードを保持し、CSS フォールバックとして serif と sans-serif のどちらを選ぶかという用途に使っています。これをフォークする代わりに、fontpool は API を再度取得します。初回使用時に各 API へのリクエストが 1 回ずつ、計 3 回並列で実行されます。
Fontshare のタグは自由記述なので、公開前に統合します。Poster と Posters は同じ用語として扱い、大文字小文字を統一し、カタログ内のフォント名そのものと一致するタグは入力ミスとして除外します。メタデータは機能を補完するものであり、前提条件ではありません。3 つのエンドポイントのいずれかに到達できなくても検索は機能し、結果にはメタデータが不完全であることが示されます。
書き込みが許可される場所
install_font はディレクトリを作成し、スタイルシートに追記するため、その操作範囲はプロジェクト内に制限されます。
- クライアントがワークスペースルートを通知する場合(ほとんどのクライアントが通知します)、相対パスはそのルートを基準に解決され、両方のパスがルート内に収まる必要があります。シンボリックリンクも対象です。範囲外に出るパスはエラーで拒否されます。
- クライアントがルートを通知しない場合、制限の基準となるものがありません。相対パスは無条件に拒否され、絶対パスはそのまま受け入れられ、指定先に書き込まれます。
開発
npm install
npm test
テストスイートは、実際の stdio JSON-RPC を介してサーバーを子プロセスとして実行します。ほとんどのテストではプロバイダーの API に接続し、実際のフォントをダウンロードします。オフラインテストのみを実行するには、FONTPOOL_SKIP_NETWORK_TESTS=1 を設定してください。
./build.sh は、同じサーバーを Claude Desktop 用の .mcpb 拡張機能として ~/Downloads にパッケージ化します。./build.sh --dev は、すでにインストールされているコピーに server.mjs を直接反映します。
ライセンス
MIT © Travis Valeri
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。