关于 Stocky
Stocky 是面向 AI 助手的 MCP 服务,可从 Pexels 和 Unsplash 搜索、查看详情并下载免版税图库照片。它支持并发搜索、筛选、归属信息生成和搜索缓存,并会报告提供方错误。
主要功能
- 01并发搜索 Pexels 与 Unsplash
- 02按方向、颜色和排序筛选
- 03查看图片尺寸、摄影师和标签
- 04生成提供方要求的署名信息
- 05下载指定尺寸图片
- 06搜索缓存与提供方错误报告
适用场景
- 01为项目搜索特定主题的图库照片
- 02按横向、纵向或颜色筛选图片
- 03查看图片详情并准备署名信息
- 04下载图片到本地或获取 Base64 数据
MCP 相关
Stocky 向 MCP 客户端提供图片搜索、详情查询和下载工具,并提供 `stock-images://help` 使用指南资源。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍

Stocky
查找精美的免版税图库图片 📸

Stocky
查找精美的免版税图库图片 📸
Stocky 是一款 MCP 服务,让 AI 助手能够从 Pexels 和 Unsplash 搜索、查看并下载免版税的图库摄影作品。
🆕 版本 2.0 — 已在使用 Stocky?请阅读本文
你的 MCP 客户端配置仍然有效。 如果配置指向
stocky_mcp.py, 该文件仍然存在,也仍然可以启动服务。升级不会造成任何问题。但
pip install -r requirements.txt将会失败——该文件已不存在,setup.py也已移除。从源代码检出目录安装时,请改用uv sync或pip install -e .。请参阅从 1.x 升级,了解两分钟快速说明; 如需了解全部变更,请参阅 CHANGELOG。主要变更:移除了
pycurl(不再出现 C 构建错误),搜索现在会并发运行, 失败的提供商现在会报告失败原因,而不是不返回任何结果,并且要求使用 Python 3.10+。
✨ 功能
- 🔍 多提供商搜索 — 并发查询 Pexels 和 Unsplash
- 📊 丰富的元数据 — 尺寸、摄影师、标签和每种图片尺寸
- ⚖️ 遵循许可要求 — 生成各提供商要求的署名信息,并按 Unsplash 的 API 指南要求报告下载情况
- ⏱️ 搜索缓存 — 短暂的 TTL 缓存可避免重复查询消耗配额
- 🛡️ 如实报告错误 — 提供商发生故障时会报告错误,而不会悄悄返回“无结果”
- 🎯 筛选条件 — 方向、颜色和排序,并按各提供商的要求进行验证

精美图库摄影作品,触手可及 示例图片仅用于演示
可通过多个提供商获取的壮丽风景
照片由 Simon Berger 拍摄,发布于 Unsplash
🚀 快速开始
1. 获取 API 密钥
两者均可免费获取:
| 提供商 | 地址 | 备注 |
|---|---|---|
| Pexels 📷 | pexels.com/api | 默认每小时 200 次请求 |
| Unsplash 🌅 | unsplash.com/developers | 演示模式下每小时 50 次;应用获批后每小时 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。下载路径来自模型生成的工具调用,此设置可将写入限制在一个目录中。Stocky 始终会拒绝扩展名不是图片的文件,并在获取图片前验证提供方的图片 URL 是否为公开的 HTTP(S) 地址,但下载根目录是最严格的控制措施。
📖 用法
为你的项目找到完美图片
Stocky 提供三个 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 也接受十六进制代码 |
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 后,每条结果都会包含一个 attribution 区块,其中提供了符合相应提供商格式的现成 text 和 html。
关于
download_image的说明。 将 Unsplash 图片数据保存到磁盘或以 Base64 编码的形式返回,都与 Unsplash 的热链接要求相冲突。每当你下载 Unsplash 图片时,Stocky 都会调用强制要求的下载报告端点;但如果你要在应用中展示图片,请使用搜索结果中的热链接 URL,而不是下载图片。
⬆️ 从 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 或虚拟环境中的 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——在那里打印其他内容会破坏数据流。
“未配置图像提供商”
没有密钥传到服务端。密钥必须放在客户端配置的 env 块中;名称区分大小写。
提供商返回错误
检查响应中的 errors。现在,身份验证失败、速率限制和超时都会明确报告,不会再表现为结果集为空。
Pexels 似乎接受了无效密钥 确实如此。Pexels 对格式错误的密钥会返回 200,因此拼写错误看起来可能像是有效的。如果结果不对,请直接验证密钥。
速率限制
| 提供商 | 限制 | 达到限制时 |
|---|---|---|
| Pexels | 每小时 200 次(默认值,按密钥计算) | HTTP 429 |
| Unsplash | 演示版每小时 50 次,生产版每小时 1000 次 | HTTP 403,并带有 X-Ratelimit-Remaining: 0 |
🤝 贡献
欢迎贡献——请参阅 CONTRIBUTING.md。对于重大变更,请先提交议题讨论方案。
🙏 致谢
- 感谢 Pexels 和 Unsplash 提供免费 API
- 基于 Model Context Protocol 构建
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。