Skip to main content
Glama
CryptoJones

UnSplashPlusMCP

by CryptoJones
README.md
<p align="center"><em>Proudly Made in Nebraska. Go Big Red! 🌽 <a href="https://xkcd.com/2347/">https://xkcd.com/2347/</a></em></p>

# Unsplash+ MCP

A private, local MCP server that drives a dedicated Chrome profile to sign in to an Unsplash+ account, search Plus-only results, and download licensed images.

This project automates the Unsplash website rather than using its API. Website automation is fragile and may conflict with Unsplash's terms. It deliberately does not bypass CAPTCHA, MFA, bot detection, or other access controls.

## Requirements

- Node.js 22 or newer
- Google Chrome installed
- [`pass`](https://www.passwordstore.org/) entries:
  - `unsplash/login`
  - `unsplash/password`
- An active single-user Unsplash+ subscription

Only the first line of each `pass` entry is read. Credentials are entered directly into the visible Chrome login form and are never returned over MCP.

## Install and build

```sh
npm install
npm run build
```

Add the server to an MCP client using:

```json
{
  "mcpServers": {
    "unsplash-plus": {
      "command": "node",
      "args": ["/absolute/path/to/UnSplashPlusMCP/dist/src/index.js"]
    }
  }
}
```

Chrome is visible by default. If Unsplash presents CAPTCHA, MFA, or another verification step, complete it in Chrome and then call `unsplash_plus_continue_login`.

## Tools

- `unsplash_plus_login`
- `unsplash_plus_continue_login`
- `unsplash_plus_status`
- `unsplash_plus_search`
- `unsplash_plus_get`
- `unsplash_plus_download`
- `unsplash_plus_logout`

Downloads default to `~/Downloads/unsplash-plus-mcp`. Each image receives a JSON receipt with source metadata and a SHA-256 checksum.

## Configuration

| Variable | Default |
| --- | --- |
| `UNSPLASH_PLUS_OUTPUT_DIR` | `~/Downloads/unsplash-plus-mcp` |
| `UNSPLASH_PLUS_PROFILE_DIR` | `~/Library/Application Support/unsplash-plus-mcp` |
| `UNSPLASH_PLUS_DIAGNOSTICS_DIR` | `<profile>/diagnostics` |
| `UNSPLASH_PLUS_LOGIN_ENTRY` | `unsplash/login` |
| `UNSPLASH_PLUS_PASSWORD_ENTRY` | `unsplash/password` |
| `UNSPLASH_PLUS_TIMEOUT_MS` | `30000` |
| `UNSPLASH_PLUS_HEADLESS` | unset; use `1` only after interactive login is complete |

Run `npm test` for unit tests and `npm run check` for strict type checking.

TDQS

A4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a unique, non-overlapping role: login, login continuation for multi-step auth, status, search, get metadata, download, and logout. No two tools could be confused for one another.

Naming Consistency5/5

All tools follow the consistent 'unsplash_plus_' prefix followed by a clear verb (login, status, search, get, download, logout). Even the compound 'continue_login' maintains the pattern.

Tool Count5/5

With 7 tools, the set is well-scoped for a focused workflow of authenticated Unsplash+ access and downloading. Each tool is necessary and there is no bloat.

Completeness5/5

The tool surface covers the full lifecycle from login through authentication handling, status checking, searching, retrieving metadata, downloading, and logout. No critical gaps exist for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues