# Musterlab MCP

Musterlab is a catalog of design systems measured from live websites: palettes with roles, typefaces
and type scale, spacing, surfaces, elevation, layout and components, plus the screenshots and preview
videos each was taken from.

Endpoint: https://musterlab.space/mcp (streamable HTTP)
Auth: `Authorization: Bearer <key>`, from https://musterlab.space/account/keys. A key works while its
owner holds a Pro subscription, up to 10,000 tool calls per calendar month.

A good order of work: `search_sites` when you know the company, `search_styles` or `list_industries`
when you only know the look. Then `get_style` for the full design system, `get_style_image` or
`get_style_screens` to see it rather than read it, and `get_style_export` to turn it into a file you
can commit.

Your own work is here too. A key belongs to an account, so styles measured in the Musterlab Studio
answer to the same tools as the catalogue: `search_styles` puts them first and marks them
`source: yours`, `scope` narrows to one side or the other, and a domain held in both places
resolves to yours. Nobody else's key can see them.

The pictures are there to be looked at: `get_style_screens` walks a page from the top to its foot, one
screenful per image, which is where layout and rhythm live — neither survives a list of numbers. Build
from the design system, though, and treat the screens as evidence of how a page is put together rather
than as something to reproduce.

Most tools take `response_format`. The default `md` reads as prose and costs fewer tokens; pass
`json` when you intend to parse the answer. Where a tool takes `ids` or `domains`, up to ten styles
come back in one call, which is cheaper than ten calls.

## Tools

### `search_styles`

Searches website design systems: the public catalogue, plus any you have measured yourself in the Musterlab Studio. Your own come first and are marked `source: yours`; use scope to narrow to one side. Free text matches name, essence, description and domain. Filters: theme (light, dark, mixed), industry, font family. Returns short summaries with ids for the other tools.

- `query` (string, optional) — Free text, e.g. 'editorial', 'brutalist', 'developer tools'
- `theme` (light | dark | mixed, optional)
- `industry` (string, optional) — Exact industry label, see list_industries
- `font` (string, optional) — Exact font family, see list_fonts
- `scope` (all | catalogue | mine, optional) — Default all: your own Studio styles first, then the catalogue
- `page` (integer, optional)
- `perPage` (integer, optional) — Default 12
- `response_format` (md | json, optional) — md (default) reads as prose and costs fewer tokens; json returns the same data as a structure

Example arguments:

    { "query": "editorial", "theme": "light" }
    { "scope": "mine" }

### `search_sites`

Searches the websites in the catalog by company name or domain, each with the styles measured from it. Use this when you know the company but not the style, e.g. 'stripe' or 'linear.app'.

- `query` (string) — Company name or domain, at least two characters
- `page` (integer, optional)
- `perPage` (integer, optional) — Default 12
- `response_format` (md | json, optional) — md (default) reads as prose and costs fewer tokens; json returns the same data as a structure

Example arguments:

    { "query": "linear" }

### `get_style`

Returns the full design system of a style: colors with roles, typefaces, type scale, spacing, surfaces, elevation, layout, components, do/avoid principles and media URLs. Reaches your own Studio styles as well as the catalogue, and prefers yours when a domain is in both. Reference one style by id or domain, or up to 10 at once with ids or domains to compare them in a single call.

- `id` (string, optional) — Style id from a previous search result
- `domain` (string, optional) — Website domain, e.g. linear.app. Used when no id is given
- `ids` (array, optional) — Up to 10 style ids, fetched together
- `domains` (array, optional) — Up to 10 domains, fetched together
- `response_format` (md | json, optional) — md (default) reads as prose and costs fewer tokens; json returns the same data as a structure

Example arguments:

    { "domain": "linear.app" }
    { "domains": ["linear.app", "stripe.com"] }

### `get_style_export`

Generates a ready-to-use file from a style: design-md (DESIGN.md for AI agents), tailwind (Tailwind v4 @theme), css (CSS custom properties) or tokens (W3C design tokens JSON). Variant compact leaves out the extended sections. Accepts up to 10 styles, which returns one file per style.

- `id` (string, optional) — Style id from a previous search result
- `domain` (string, optional) — Website domain, e.g. linear.app. Used when no id is given
- `ids` (array, optional) — Up to 10 style ids, fetched together
- `domains` (array, optional) — Up to 10 domains, fetched together
- `format` (design-md | tailwind | css | tokens)
- `variant` (compact | extended, optional) — Default extended

Example arguments:

    { "domain": "linear.app", "format": "design-md" }
    { "domain": "linear.app", "format": "tailwind", "variant": "compact" }

### `find_similar_styles`

Finds styles with the same theme, preferably the same industry, ordered by how many palette colors they share.

- `id` (string, optional) — Style id from a previous search result
- `domain` (string, optional) — Website domain, e.g. linear.app. Used when no id is given
- `limit` (integer, optional) — Default 8
- `response_format` (md | json, optional) — md (default) reads as prose and costs fewer tokens; json returns the same data as a structure

Example arguments:

    { "domain": "linear.app", "limit": 5 }

### `get_style_image`

Returns one picture of a style as an image, for looking at rather than reading about. thumbnail (default) is the small card image, screenshot the top of the page as it appears on opening, poster a still from the preview video, and screen a numbered screenful — screen 1 is the top, each one after that is a screen further down. get_style_screens returns several at once. Read these for layout, rhythm and feel; the design system is what to build from.

- `id` (string, optional) — Style id from a previous search result
- `domain` (string, optional) — Website domain, e.g. linear.app. Used when no id is given
- `image` (thumbnail | screenshot | poster | screen, optional) — Default thumbnail
- `screen` (integer, optional) — Which screenful, 1 being the top. Only with image: screen

Example arguments:

    { "domain": "linear.app", "image": "screenshot" }
    { "domain": "linear.app", "image": "screen", "screen": 4 }

### `get_style_screens`

Returns several screenfuls of a page as images in one call, top to bottom, so the whole layout can be seen rather than just the part above the fold. Screen 1 is the top; each one after that is a screen further down, ending at the foot of the page. Read these for layout, rhythm and feel — what a section looks like, how things are arranged, where the page breathes. Build from the design system, not by copying what is in the picture.

- `id` (string, optional) — Style id from a previous search result
- `domain` (string, optional) — Website domain, e.g. linear.app. Used when no id is given
- `from` (integer, optional) — First screen to return, 1 being the top. Default 1
- `count` (integer, optional) — How many, up to 12. Default 6

Example arguments:

    { "domain": "linear.app" }
    { "domain": "linear.app", "from": 5, "count": 4 }

### `get_style_metrics`

Returns the raw measurements taken from the live website (computed colors, font sizes, spacing values and similar). Large and technical, only useful when the curated design system from get_style is not detailed enough.

- `id` (string, optional) — Style id from a previous search result
- `domain` (string, optional) — Website domain, e.g. linear.app. Used when no id is given

Example arguments:

    { "domain": "linear.app" }

### `list_fonts`

Lists the font families used across the catalog with the number of styles using each, most common first.

- `limit` (integer, optional) — Default 100
- `response_format` (md | json, optional) — md (default) reads as prose and costs fewer tokens; json returns the same data as a structure

Example arguments:

    { "limit": 20 }

### `list_industries`

Lists the industry labels used in the catalog with the number of styles for each.

- `response_format` (md | json, optional) — md (default) reads as prose and costs fewer tokens; json returns the same data as a structure

Example arguments:

    { "response_format": "json" }