Stocky について
Stocky は、AI アシスタント向けに Pexels と Unsplash のロイヤリティフリー写真を検索、確認、ダウンロードする MCP サーバーです。並行検索やフィルター、帰属表示の生成、検索キャッシュに対応し、プロバイダーのエラーも報告します。
主な機能
- 01Pexels と Unsplash の並行検索
- 02向き、色、並び順による絞り込み
- 03画像サイズ、撮影者、タグの確認
- 04プロバイダー指定の帰属情報の生成
- 05サイズを指定した画像ダウンロード
- 06検索キャッシュとプロバイダーエラーの報告
活用シーン
- 01プロジェクトのテーマに合う写真の検索
- 02向きや色による画像の絞り込み
- 03画像詳細の確認と帰属表示の準備
- 04画像のローカル保存または Base64 データの取得
MCP 対応
画像検索、詳細確認、ダウンロードの MCP ツールと、利用ガイドの `stock-images://help` リソースを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細

Stocky
美しいロイヤリティフリーのストック画像を見つけよう 📸

Stocky
美しいロイヤリティフリーのストック画像を見つけよう 📸
Stocky は、AI アシスタントが Pexels と Unsplash からロイヤリティフリーのストック写真を検索、閲覧、ダウンロードできるようにする MCP サーバーです。
🆕 バージョン 2.0 — すでに Stocky をお使いの方へ、こちらをお読みください
MCP クライアントの設定はそのまま動作します。
stocky_mcp.pyを指定している場合、そのファイルはそのまま残っており、サーバーも引き続き起動します。アップグレードで壊れるものはありません。ただし
pip install -r requirements.txtは失敗します — そのファイルは削除され、setup.pyも同様です。ソースチェックアウトからインストールする場合は、代わりにuv syncまたはpip install -e .を使用してください。2 分でわかる説明は1.x からのアップグレードを、詳細は CHANGELOG をご覧ください。主な変更点:
pycurlが不要になり(C のビルドエラーがなくなりました)、検索が実際に並行実行されるようになり、失敗したプロバイダーが何も返さずに終わるのではなく理由を報告するようになり、Python 3.10 以上が必要になりました。
✨ 機能
- 🔍 マルチプロバイダー検索 — Pexels と Unsplash に並行してクエリを実行します
- 📊 豊富なメタデータ — サイズ、撮影者、タグ、すべての画像サイズ
- ⚖️ ライセンス対応 — 各プロバイダーが要求するクレジット表示を生成し、Unsplash の API ガイドラインが求めるダウンロード報告を行います
- ⏱️ 検索キャッシュ — 短い TTL キャッシュにより、繰り返しのクエリがクォータを消費しません
- 🛡️ 正直なエラー — 失敗したプロバイダーは「結果なし」として黙って返されるのではなく、報告されます
- 🎯 フィルター — 向き、色、並び替えに対応し、プロバイダーごとに検証されます

美しいストック写真をすぐに デモンストレーション目的で使用されたサンプル画像
複数のプロバイダーから利用できる素晴らしい風景
Photo by Simon Berger on Unsplash
🚀 クイックスタート
1. API キーを取得する
どちらも無料です:
| プロバイダー | 場所 | 備考 |
|---|---|---|
| Pexels 📷 | pexels.com/api | デフォルトで 1 時間あたり 200 リクエスト |
| Unsplash 🌅 | unsplash.com/developers | デモモードでは 1 時間あたり 50、アプリが承認されると 1 時間あたり 1000 |
必要なのはどちらか一方だけです — Stocky は設定されたプロバイダーで動作します。
2. MCP クライアントに追加する
推奨の設定ではインストールはまったく不要です:
{
"mcpServers": {
"stocky": {
"command": "uvx",
"args": ["stocky-mcp"],
"env": {
"PEXELS_API_KEY": "your_pexels_key",
"UNSPLASH_ACCESS_KEY": "your_unsplash_key"
}
}
}
}
その他の実行方法
pip または uv でインストール:
uv tool install stocky-mcp # or: pipx install stocky-mcp
{
"mcpServers": {
"stocky": {
"command": "stocky-mcp",
"env": { "PEXELS_API_KEY": "your_pexels_key" }
}
}
}
ソースチェックアウトから — 既存の設定がそのまま動作するように、引き続きサポートされています:
{
"mcpServers": {
"stocky": {
"command": "python",
"args": ["/path/to/stocky/stocky_mcp.py"],
"env": { "PEXELS_API_KEY": "your_pexels_key" }
}
}
}
Stocky は、クライアントが起動した環境から設定を読み込みます。独自の .env ファイルは読み込まないため、キーは上記の env ブロックに記述する必要があります。
⚙️ 設定
| 変数 | デフォルト | 目的 |
|---|---|---|
PEXELS_API_KEY | — | Pexels プロバイダーを有効にします |
UNSPLASH_ACCESS_KEY | — | Unsplash プロバイダーを有効にします |
ENABLE_ATTRIBUTION_LINKS | false | すべての結果に出典情報を含めます |
STOCKY_CACHE_TTL | 300 | 検索キャッシュの有効期間(秒)。0 でキャッシュを無効化します |
STOCKY_HTTP_TIMEOUT | 15 | リクエストごとのタイムアウト(秒) |
STOCKY_MAX_DOWNLOAD_BYTES | 26214400 | これより大きいダウンロードを拒否します(25 MiB) |
STOCKY_DOWNLOAD_ROOT | — | 設定すると、すべてのダウンロードをこのディレクトリ内に制限します |
STOCKY_LOG_LEVEL | INFO | DEBUG、INFO、WARNING、ERROR |
STOCKY_USER_AGENT | stocky-mcp | プロバイダーに送信される User-Agent |
STOCKY_DOWNLOAD_ROOT は設定する価値があります。ダウンロードパスは
モデルが生成したツール呼び出しに由来するため、これにより書き込みを 1 つの
ディレクトリに制限できます。Stocky は常に画像以外のファイル拡張子を拒否し、
プロバイダーからの画像 URL を取得する前に公開 HTTP(S) アドレスであることを
検証しますが、ダウンロードルートが利用可能な中で最も強力な制御です。
📖 使用方法
Find the perfect image for your project
Stocky は 3 つの MCP ツールを公開します。これらを直接呼び出すのでは なく、自然言語で依頼するとクライアントが呼び出します。
夜明けの霧深い松林のストックフォトを検索してください。
Pexels から横位置の山の写真を 30 枚探してください。
pexels_123456を中サイズで ~/Pictures/mountain.jpg にダウンロードしてください。
🛠️ ツール
search_stock_images
| パラメーター | 型 | デフォルト | 備考 |
|---|---|---|---|
query | str | 必須 | 検索語 |
providers | list | 設定済みのすべて | ["pexels", "unsplash"] |
per_page | int | 20 | プロバイダーごとに制限: Pexels 80、Unsplash 30 |
page | int | 1 | 1 始まり |
sort | str | relevant | relevant または latest。Unsplash のみ — Pexels には並べ替えオプションがありません |
orientation | str | — | landscape、portrait、square |
color | str | — | 色名。Pexels は 16 進コードも受け付けます |
include_attribution | bool | — | ENABLE_ATTRIBUTION_LINKS を上書きします |
プロバイダーごとにグループ化された結果と、total_results、さらに
いずれかのプロバイダーが失敗した場合はどれがなぜ失敗したかを説明する
errors マップを返します。
無効な orientation や color は転送されるのではなく破棄されます。
Pexels は不正なフィルターを黙って無視して依然として 200 を返すため、
そうしなければ間違いが隠れてしまいますが、Unsplash はそれらを HTTP 400 で
明確に拒否します。
get_image_details
| パラメーター | 型 | デフォルト | 備考 |
|---|---|---|---|
image_id | str | 必須 | プレフィックス付き ID(例: pexels_123456) |
include_attribution | bool | — | ENABLE_ATTRIBUTION_LINKS を上書きします |
download_image
| パラメーター | 型 | デフォルト | 備考 |
|---|---|---|---|
image_id | str | 必須 | プレフィックス付き ID |
size | str | original | thumbnail、small、medium、large、original |
output_path | str | — | 省略すると代わりに base64 データを受け取ります |
プロバイダーが要求されたサイズを提供していない場合は、失敗させるのでは なく、利用可能な最も近いサイズが使用されます。
リソース
stock-images://help — アシスタントが必要に応じて読むことができる使用ガイドです。
⚖️ ライセンスと帰属表示
画像は自由に使用できますが、両プロバイダーとも API アクセスの条件として帰属表示を要求しています。これは任意ではなく、このドキュメントの以前のバージョンで Pexels についてそうでないかのように示唆していたのは誤りでした。
Pexels は、API の結果を表示する場所にはどこでも Pexels への目立つリンクが必要であり、可能な場合は撮影者へのクレジット表示も求めています。
Unsplash は、撮影者と Unsplash の両方へのクレジット表示を、リンクに UTM パラメータを付けて行うこと、そして画像は再ホストするのではなく、API が返す URL からホットリンクすることを要求しています。
ENABLE_ATTRIBUTION_LINKS=true を設定すると、各結果に、そのプロバイダーに適した正しい形式の text と html をあらかじめ用意した attribution ブロックが追加されます。
download_imageに関する注意。 Unsplash のバイト列をディスクに保存したり、base64 エンコードして返したりすることは、Unsplash のホットリンク要件と相反します。Stocky は Unsplash 画像をダウンロードするたびに必須のダウンロード報告エンドポイントを呼び出しますが、アプリケーションで画像を表示する場合は、ダウンロードするのではなく検索結果のホットリンク URL を使用してください。
完全な利用規約はこちら: Pexels · Unsplash
⬆️ 1.x からのアップグレード
バージョン 2.0 ではプロジェクトが再構成されました。既存の MCP クライアント設定はそのまま動作します — ルートの stocky_mcp.py はランチャーとして意図的に維持されています — が、インストール方法が変わり、いくつかの挙動も意図的に異なっています。
必要な作業
uvx またはインストール済みのコンソールスクリプト経由で実行している場合、何もする必要はありません。アップグレードしてそのまま続けてください。
ソースチェックアウトから実行している場合、再インストールしてください。requirements.txt、setup.py、setup.cfg は pyproject.toml に置き換えられました:
git pull
uv sync # or: pip install -e .
pip install -r requirements.txt は失敗するようになりました — そのファイルはもう存在しません。
Python のバージョンを確認してください。 2.0 は Python 3.10 以上を必要とします。古い setup.py は 3.8 対応を謳っていましたが、mcp SDK は常に 3.10 を必要としていたため、その主張は実際には決して満たせませんでした。
uvx への切り替えを検討してください。 何もインストールする必要がなく、「エディタがどのインタープリタを起動したのか?」という起動時の失敗を丸ごと回避できます:
{
"mcpServers": {
"stocky": {
"command": "uvx",
"args": ["stocky-mcp"],
"env": { "PEXELS_API_KEY": "your_pexels_key" }
}
}
}
内部的に変わったこと
| 変更 | あなたにとって重要な理由 |
|---|---|
pycurl → httpx | コンパイルが必要な C 拡張がないため、インストール時のビルド失敗がなくなりました。httpx は mcp SDK ですでに必要とされていたため、これは依存関係を削減しました。 |
| 検索が並行実行されるようになった | 古いコードは名前だけが async で、async def の中でブロッキング呼び出しを行っていました。両プロバイダーの検索にかかる時間は、おおよそ片方のプロバイダーのレイテンシ分になりました。 |
| 失敗したプロバイダーが理由を報告する | 以前は、無効な API キーは空のリストを返し、本当に何も一致しなかった検索と見分けがつきませんでした。 |
per_page がプロバイダーごとにクランプされる | Unsplash は最大値 30 を超えると暗黙的に 10 にフォールバックするため、50 を要求すると 30 を要求するよりも少ない画像が返されていました。 |
| 帰属表示が自動生成される | 両プロバイダーとも API アクセスの条件としてこれを要求しています。ENABLE_ATTRIBUTION_LINKS=true を設定すると、すべての結果にすぐ使えるテキストと HTML が付与されます。 |
| 新しい設定オプション | キャッシュ、タイムアウト、ダウンロードサイズの上限、ダウンロードルート — 設定を参照してください。 |
あなたのコードに影響する可能性がある唯一のこと
Stocky のレスポンスをプログラムで解析している場合に限ります。 失敗した検索は、以前は空の結果リストを返していましたが、今はプロバイダー名と理由を示す errors マップを返します:
{
"query": "mountains",
"results": { "pexels": [], "unsplash": [ /* ... */ ] },
"errors": { "pexels": "pexels rejected the API key (HTTP 401)..." }
}
「空」を「一致なし」として扱っていた場合は、errors も確認してください — そうしないと、壊れたキーが結果なしのクエリのように見えてしまいます。これは修正であり、リグレッションではありませんが、目に見える変更です。
ツールの表面では他に何も変わっていません: search_stock_images、get_image_details、download_image はこれまでと同じ引数を受け取るため、既存のプロンプトやワークフローは影響を受けません。
🧑💻 開発
git clone https://github.com/joelio/stocky.git
cd stocky
uv sync --group dev
uv run pytest -m "not integration" # unit tests, no network
uv run pytest -m integration # needs real API keys
uv run ruff check . && uv run ruff format --check .
uv run mypy
詳細は CONTRIBUTING.md をご覧ください。
🐛 トラブルシューティング
クライアントが起動時にタイムアウトを報告する
ほとんどの場合、Stocky のバグではなく起動の問題です。GUI から起動されたクライアントは
最小限の PATH しか持たないことが多く、uvx や virtualenv の python が見つからない
可能性があります。絶対パスを使用するか、uv をシステム全体にインストールしたうえで
uvx を使用してください。ハンドシェイクはご自身で再現できます:
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
| stocky-mcp
JSON レスポンスが返れば、サーバーは正常です。stdout はプロトコルに使用されるため、 Stocky はすべてのログを stderr に出力します。そこに他のものが出力されるとストリームが 破損することに注意してください。
「No image providers are configured」
キーがサーバーに届いていません。キーはクライアント設定の env ブロックに記述する
必要があり、名前は大文字と小文字を区別します。
プロバイダーがエラーを返す
レスポンスの errors を確認してください。認証の失敗、レート制限、タイムアウトは、
空の結果セットのように見えるのではなく、明示的に報告されるようになりました。
Pexels が無効なキーを受け入れるように見える 実際に受け入れます。Pexels は不正な形式のキーに対しても 200 を返すため、タイプミスが 正常に動作しているように見えることがあります。結果がおかしいと思われる場合は、 キーを直接検証してください。
レート制限
| プロバイダー | 制限 | 上限到達時 |
|---|---|---|
| Pexels | 200/時間(デフォルト、キーごと) | HTTP 429 |
| Unsplash | 50/時間 デモ、1000/時間 本番 | X-Ratelimit-Remaining: 0 を伴う HTTP 403 |
🤝 コントリビューション
コントリビューションを歓迎します — CONTRIBUTING.md をご覧ください。 大きな変更の場合は、まず issue を開いて方針について議論してください。
🙏 謝辞
- 無料 API を提供してくださっている Pexels と Unsplash に感謝します
- Model Context Protocol を使用して構築されています
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。