unsplash-mcp-server
Production-ready Model Context Protocol (MCP) server for the Unsplash API — search & fetch photos, collections, topics, users, and stats, with built-in attribution and download-tracking compliance. For Claude, Cursor, and any MCP client. Unofficial.
Install / Use
claude mcp add hanoak -- npx -y github:hanoak/unsplash-mcp-serverIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
AI & Machine LearningSupported Platforms
Our assessment of unsplash-mcp-server
unsplash-mcp-server scores 83/100 on our quality scale, 665th of 945 AI & Machine Learning skills we index.
Its MCP Server is 34 KB long, well organised into 27 sections with 5 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated today, so unsplash-mcp-server is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 92/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
unsplash-mcp-server compared with similar skills
All 4 of these similar skills score higher than unsplash-mcp-server; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| unsplash-mcp-server (this skill)by hanoak | 83 | 3 | today | MCP Server |
| claude-memby thedotmack | 100 | 110.2k | today | CLAUDE.md |
| taste-skillby Leonxlnx | 100 | 108.3k | 2d ago | CLAUDE.md |
| Agent-Reachby Panniantong | 100 | 107.8k | 1d ago | CLAUDE.md |
| Understand-Anythingby Egonex-AI | 100 | 89.7k | 7d ago | CLAUDE.md |
Frequently asked questions
- How do I install unsplash-mcp-server?
- Run
claude mcp add hanoak -- npx -y github:hanoak/unsplash-mcp-server. The install tabs above show the steps for each supported agent. - Which AI agents does unsplash-mcp-server work with?
- It is written for Claude Code, Claude Desktop and Cursor, as a MCP Server file. Other agents that read the same format can often use it too.
- Is unsplash-mcp-server safe to use?
- It is MIT-licensed and scores 92/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is unsplash-mcp-server still maintained?
- The repository was last updated today, so unsplash-mcp-server is actively maintained.
Skill content
View source on GitHubunsplash-mcp-server
A production-ready Model Context Protocol (MCP) server for the Unsplash API. It gives AI assistants — Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, and any MCP client — tools to search and fetch Unsplash photos, collections, topics, users, and stats, with Unsplash-guideline compliance built in (ready-to-use attribution and download tracking). Sign in once via OAuth to also manage your own profile, collections, and photo metadata.
[!IMPORTANT] Unofficial project. This is not affiliated with, endorsed by, or sponsored by Unsplash. "Unsplash" is a trademark of its respective owner. You use it under your own Unsplash API account and are responsible for complying with the Unsplash API Terms & Guidelines.
Table of contents
- Features
- Quick start
- Example interaction
- Configuration
- OAuth sign-in (optional)
- Tools
- Example prompts
- Attribution & compliance
- Rate limits
- Handling of Unsplash text
- Privacy & security
- Troubleshooting
- FAQ
- Requirements
- Compatibility
- Roadmap
- Contributing
- Contact & community
- License
Features
- 29 tools across photos, search, users, collections, topics, stats, and your own profile — 21 read-only out of the box, plus 8 write/
metools once you sign in. - Compliance built in — every photo comes with ready-to-use attribution (plain text + UTM-tagged HTML), and a dedicated
unsplash_track_downloadtool for the download-tracking guideline. - Content safety —
content_filter=highby default on search and random photos. - Flexible image URLs — each photo returns
raw/full/regular/small/thumbsizes, plus arawimgix base for custom sizes (?w=&h=&q=&fm=&fit=). - Token-efficient output — full Unsplash responses are trimmed to a compact shape (URLs + metadata as text, never base64 image blobs) to keep model context small.
- Robust — typed failures returned as MCP
isErrorresults the model can recover from, plus retries/backoff, timeouts,403hourly-limit handling, and rate-limit surfacing. - Safe — access-key redaction in all error output, an SSRF guard on download URLs, and untrusted-text handling guidance for indirect prompt-injection defence.
- Lean & modern — ESM, Node 20+, zero-install via
npx, no telemetry.
Quick start
1. Get an Unsplash access key
Register an application at unsplash.com/developers → New Application → accept the API terms → copy its Access Key (not the Secret Key). New apps start on the Demo tier (50 requests/hour); the Production tier (5,000/hour) requires Unsplash's review from your app dashboard. See Rate limits.
2. Add the server to your MCP client
Claude Desktop — edit claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"unsplash": {
"command": "npx",
"args": ["-y", "@hanoak/unsplash-mcp-server"],
"env": {
"UNSPLASH_ACCESS_KEY": "your_access_key",
"UNSPLASH_APP_NAME": "your_registered_app_name"
}
}
}
}
Restart the client. See Configuration for every supported variable.
<details> <summary><b>Other clients (Claude Code, Cursor, VS Code, Windsurf, generic stdio)</b></summary>Claude Code (CLI):
claude mcp add unsplash \
--env UNSPLASH_ACCESS_KEY=your_access_key \
--env UNSPLASH_APP_NAME=your_registered_app_name \
-- npx -y @hanoak/unsplash-mcp-server
Cursor — ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project): use the exact same mcpServers block as Claude Desktop above.
Windsurf — ~/.codeium/windsurf/mcp_config.json: same mcpServers block as Claude Desktop above.
VS Code — .vscode/mcp.json (note the top-level key is servers, not mcpServers):
{
"servers": {
"unsplash": {
"command": "npx",
"args": ["-y", "@hanoak/unsplash-mcp-server"],
"env": {
"UNSPLASH_ACCESS_KEY": "your_access_key",
"UNSPLASH_APP_NAME": "your_registered_app_name"
}
}
}
}
Any other MCP client — run the server over stdio with:
UNSPLASH_ACCESS_KEY=your_access_key npx -y @hanoak/unsplash-mcp-server
Point your client's stdio transport at command: npx, args: ["-y", "@hanoak/unsplash-mcp-server"], and pass the key via env.
3. Try it
Restart your client and ask:
"Find me a photo of mountains on Unsplash and show the attribution."
Example interaction
A typical flow: the model calls unsplash_search_photos, picks a result, presents the image with its attribution, and calls unsplash_track_download when it actually uses the photo.
You: Find a landscape photo of a foggy pine forest and credit the photographer.
Assistant: (calls
unsplash_search_photoswithquery: "foggy pine forest",orientation: "landscape", picks the best result, then callsunsplash_track_downloadwith itsdownload_location) Here's a great match — Photo by Jane Doe on Unsplash — along with a ready-to-embed credit line and the image URL.
Each tool returns a compact JSON payload. Here's the shape of a single photo result (illustrative values):
<details> <summary><b>Example tool output</b></summary>{
"photo": {
"id": "Dwu85P9SOIk",
"description": "brown rocky mountain under blue sky during daytime",
"width": 6000,
"height": 4000,
"color": "#734940",
"blur_hash": "L6Pj0^i_.AyE_3t7t7R**0o#DgR4",
"urls": {
"raw": "https://images.unsplash.com/photo-1465…?ixid=…",
"full": "https://images.unsplash.com/photo-1465…?ixid=…&q=85",
"regular": "https://images.unsplash.com/photo-1465…?ixid=…&w=1080",
"small": "https://images.unsplash.com/photo-1465…?ixid=…&w=400",
"thumb": "https://images.unsplash.com/photo-1465…?ixid=…&w=200"
},
"photo_page": "https://unsplash.com/photos/Dwu85P9SOIk",
"download_location": "https://api.unsplash.com/photos/Dwu85P9SOIk/download?ixid=…",
"photographer": {
"name": "Jane Doe",
"username": "janedoe",
"profile": "https://unsplash.com/@janedoe"
},
"attribution": {
"text": "Photo by Jane Doe on Unsplash",
"html": "Photo by <a href=\"https://unsplash.com/@janedoe?utm_source=your_app&utm_medium=referral\">Jane Doe</a> on <a href=\"https://unsplash.com/?utm_source=your_app&utm_medium=referral\">Unsplash</a>",
"photographerName": "Jane Doe",
"photographerUrl": "https://unsplash.com/@janedoe?utm_source=your_app&utm_medium=referral",
"unsplashUrl": "https://unsplash.com/?utm_source=your_app&utm_medium=referral"
}
},
"rate_limit": { "limit": 50, "remaining": 49 }
}
Every tool result includes a rate_limit object (limit, remaining) read from the Unsplash response headers. List/search tools wrap results in photos/collections/users/topics arrays with pagination fields (total, total_pages, count, page, per_page).
Configuration
Configuration is entirely via environment variables — no config files, no flags for secrets.
| Environment variable | Required | Description |
| ----------------------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| UNSPLASH_ACCESS_KEY | yes | Your Unsplash API access key. The server exits at startup with a clear message if it is missing or blank. |
| UNSPLASH_APP_NAME | recommended | Your registered Unsplash app name, used as the attribution utm_source. Defaults to a generic value (with a startup warning) if unset. |
| UNSPLASH_SECRET_KEY | only for login | Your Unsplash app's secret key. Only needed to run login — see OAuth sign-in. |
| UNSPLASH_OAUTH_REDIRECT_URI | only for login | Override the default http://localhost:8734/callback used by login. Must match the redirect URI registered on your Unsplash app. |
| LOG_LEVEL | no | debug | info | warn | error (default info). All logs go to stderr; stdout carries only the MCP protocol. |
CLI flags: --version and --help are supported (e.g. npx @hanoak/unsplash-mcp-server --version). login/logout are subcommands, not flags — see below.
OAuth sign-in (optional)
The 21 core tools work out of the box with just UNSPLASH_ACCESS_KEY. To also use the 8 write/me tools (update your profile, manage collections, edit photo metadata), sign in once via OAuth:
-
On your app's page at unsplash.com/oauth/applications, add
http://localhost:8734/callbackas a redirect URI, and copy the Secret key. -
Set both
UNSPLASH_ACCESS_KEYandUNSPLASH_SECRET_KEYin your shell (not just the MCP client config —loginruns from your terminal). -
Run:
npx @hanoak/unsplash-mcp-server loginThis opens your browser to Unsplash's consent screen, captures the redirect on a short-lived local server, exchanges the code for a user access token, and saves it to
~/.config/unsplash-mcp-server/credentials.json(owner-only file permissions). Unsplash user access tokens don't expire, so this is a one-time step — no periodic re-auth. -
Restart your MCP client. The 8 write/
metools are now available; the 21 read-only tools are unaffected either way.
Run npx @hanoak/unsplash-mcp-server logout at any time to remove the stored token. To revoke it server-side, regenerate your app's secret key from the Unsplash dashboard.
Tools
All tools are namespaced unsplash_*. Most are read-only (annotated readOnlyHint: true); the exceptions are unsplash_track_download (registers a download event) and the 8 write/me tools below, all marked non-read-only and gated behind OAuth sign-in. Parameters map to the Unsplash API; per_page and stats quantity are clamped to a max of 30, and page is 1-based.
| Domain | Tools
Truncated for display — read the full file on GitHub.
Related Skills
claude-mem
110.2kPersistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
taste-skill
108.3kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
Agent-Reach
107.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
Understand-Anything
89.7kGraphs that teach > graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
