An MCP (Model Context Protocol) server that provides a concise set of tools to query and analyze an Stash instance with composable, high‑precision filters, optimized caching for faster queries, automated intelligence for performer/scene analysis, and personalized recommendations based on usage and preferences.
| Prompt | Description | Parameters |
|---|---|---|
| analyze-performer | Complete performer analysis with insights | performer_name: str |
| library-insights | Strategic insights for the entire library | — |
| recommend-scenes | Personalized scene recommendations | preferences: str |
| discover-performers | Performer discovery by criteria | criteria: str |
| Tool | Description | Parameters |
|---|---|---|
| advanced_performer_analysis | Deep analysis with progress and logging | performer_name: str, include_similar: bool, deep_scene_analysis: bool |
| batch_performer_insights | Aggregated insights from multiple performers | performer_names: List[str], max_performers: int |
| health_check | Basic connectivity/cache status | — |
| get_performer_info | Detailed performer information | performer_name: str |
| get_all_performers | List performers with advanced filtering | favorites_only: bool=True, advanced filters (see "Advanced Filters" section) |
| get_all_scenes_from_performer | Scenes for a performer | performer_name: str, organized_only: bool=True |
| get_all_scenes | List all scenes with optional filters | advanced filters (see "Advanced Filters" section) |
This tool now supports advanced filtering by multiple physical and demographic criteria:
favorites_only: bool = True- Limit to favorite performerscountry: str- Filter by countryethnicity: str- Filter by ethnicityeye_color: str- Filter by eye colorhair_color: str- Filter by hair colormeasurements: str- Filter by body measurementspiercings: str- Filter by piercingstattoos: str- Filter by tattoos
height_cm: int- Filter by height in centimetersweight: int- Filter by weight
Each filter supports modifiers for different comparison types:
EQUALS(default) - Exact matchNOT_EQUALS- Not equalGREATER_THAN- Greater than (numeric only)LESS_THAN- Less than (numeric only)BETWEEN- Between two values (numeric only, requires_value2)NOT_BETWEEN- Not between two values (numeric only, requires_value2)
For BETWEEN and NOT_BETWEEN filters:
height_cm_value2: int- Second value for height rangeweight_value2: int- Second value for weight range
The server supports flexible configuration through environment variables:
| Variable | Default | Description |
|---|---|---|
STASH_ENDPOINT |
http://localhost:6969 |
Stash server endpoint |
STASH_API_KEY |
— | Required API key (mandatory) |
STASH_CONNECT_RETRIES |
3 |
Initial connection retries |
STASH_CONNECT_DELAY_SECONDS |
1.5 |
Delay between retries (seconds) |
LOG_LEVEL |
INFO |
Log level: DEBUG, INFO, WARNING, ERROR |
- Copy the example environment file:
cp .env.example .env- Edit
.envwith your settings:
STASH_ENDPOINT=http://localhost:9999
STASH_API_KEY=YOUR_API_KEYClone the repository and install with uv:
git clone https://github.com/donlothario/stash_mcp_server.git
cd stash_mcp_server
cp .env.example .env
# Edit .env file with your Stash settings
uv syncOr install directly from the repository:
uv add git+https://github.com/donlothario/stash_mcp_server.gitInstall the package in mode:
git clone https://github.com/donlothario/stash_mcp_server.git
cd stash_mcp_server
cp .env.example .env
# Edit .env file with your Stash settings
python3 -m pip install .Or install directly from the repository:
python3 -m pip install git+https://github.com/donlothario/stash_mcp_server.gitBuild the image:
docker build -t stash_mcp_server:latest .Pull the latest image from the Docker registry:
docker pull ghcr.io/donlothario/stash_mcp_server:latestuv run stash_mcp_serverpython3 -m stash_mcp_serverAdd this configuration to your application's settings (mcp.json):
"stash mcp server": {
"type": "stdio",
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/stash_mcp_server",
"stash_mcp_server"
],
"env": {
"STASH_ENDPOINT": "http://localhost:9999",
"STASH_API_KEY": "YOUR_API_KEY",
}
}"stash mcp server": {
"type": "stdio",
"command": "python3",
"args": [
"-m",
"stash_mcp_server"
],
"env": {
"STASH_ENDPOINT": "http://localhost:9999",
"STASH_API_KEY": "YOUR_API_KEY",
}
}"stash mcp server": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--env-file",
"${workspaceFolder}/.env",
"ghcr.io/donlothario/stash_mcp_server"
]
}- Connection to Stash is performed with configurable retries.
- If the API key is missing, the server generates an error and does not start.
- GraphQL fragments used by queries are centralized in the code (
FRAGMENTS). - Improved cache architecture: Cache functions are separated from MCP decorators to avoid conflicts with Pydantic schema generation.
- Advanced filtering: Robust filter system with modifiers and range handling for complex queries.
- Enhanced logging: Detailed information about active filters and query results for better debugging.