Model Context Protocol

Give Claude the library

The same 50718 photographs, reachable by an agent mid-task. Ask for a hero image for a landing page and it can search, look at what came back, and hand you a URL — without you opening a stock site.

Install

Add this to your Claude Desktop config, then restart Claude.

{
  "mcpServers": {
    "quarry": {
      "command": "npx",
      "args": ["-y", "@siteko/quarry-mcp"],
      "env": { "QUARRY_API_URL": "https://quarry.siteko.tech" }
    }
  }
}

In Claude Code: claude mcp add quarry -- npx -y @siteko/quarry-mcp

The four tools

search_images

Search by keyword, category and shape.

Returns one line per image rather than JSON. A model handed 24 objects with five URLs each spends most of its context on links it will never open — it needs enough to choose, and the full URLs only for what it picks.

get_image

One image: every width, the licence, and twelve similar images.

The second most common request after “find me an image” is “something like that but different”. Without the similar list, that turns into a fresh search that returns the same results.

list_categories

Every category with a live count.

Lets the model find out what the library actually contains before guessing at a search.

popular_tags

The most-used tags.

The vocabulary is finite and hand-written. Reading it beats guessing at it.

What it looks like

> Find me a wide photo of fog in a forest for a hero banner.

  search_images(query: "forest fog", orientation: "LANDSCAPE", limit: 4)

  62 images matched, showing 4.

  jw2adbb  Fog in the forest — forest, fog, trees, mist
           landscape 2300×1533 · © Orlova Maria
  bk7tfbb  Tall trees in fog — forest, fog, trees, tall
           landscape 5000×3333 · © Ali Inay
  93e2bbb  Avenue in fog — trees, fog, avenue, road, mist
           landscape 3011×2000 · © Dorothy Lin

  get_image(id: "jw2adbb", width: 1600)

  https://quarry.siteko.tech/i/jw2adbb/1600

One design decision worth stating

The MCP server calls the public API, not the database. It would be faster to query directly, and it would also mean two code paths that can disagree — an agent seeing something the website cannot, or a search that breaks for models only and gets noticed months later. This way, if search breaks it breaks in both places on the same afternoon.