This is the full developer documentation for Muro # Muro for developers > Real paint colours from real brands, cross-brand equivalents and room photos painted in any colour. For AI agents over MCP, in your terminal, or paid per call in USDC. ## Connect in one line [Section titled “Connect in one line”](#connect-in-one-line) ```text https://mcp.usemuro.com/mcp ``` Add this URL as a remote MCP server in Claude, ChatGPT, Cursor or any MCP client. Colour search is free and needs no sign-in. See the [Quickstart](/start/quickstart/) for each client. Search real paint colours Find colours by name or code across 35 manufacturer catalogues, about 51,000 colours. Free. Cross-brand equivalents Get the closest match to any colour in other brands, ranked by CIEDE2000 ΔE. Free. Paint a room photo Send a photo and up to 12 colours; get each one painted on the walls, facade or roof. Relight a room See a painted interior by day, in the evening or at night, with lamps on or off. ## Ways in [Section titled “Ways in”](#ways-in) [MCP server](/mcp/overview/)8 tools for agents: search, equivalents, painting, relighting. [CLI](/cli/)npx usemuro: the same tools in your terminal and scripts. [API keys and OAuth](/auth/api-keys/)Pay for painting with Muro credits from your account. [x402](/x402/)No account: pay per call in USDC on Base. ## For LLMs [Section titled “For LLMs”](#for-llms) This documentation is also available as plain text for agents: [`/llms.txt`](/llms.txt), [`/llms-full.txt`](/llms-full.txt) and [`/llms-small.txt`](/llms-small.txt). # API keys > Create a Muro API key, send it as a Bearer header from Claude Code, Cursor or VS Code, and revoke it. A Muro API key unlocks the painting tools (`visualize_room`, `get_visualization`, `relight_room`, `get_credits`). The colour tools stay free with or without a key. Painting spends the **credits of the Muro account that owns the key**, the same credits as the app. There are no free trials. If you have no account and want to pay per call instead, use [x402](/x402/). ## Create a key [Section titled “Create a key”](#create-a-key) 1. Sign in at [app.usemuro.com](https://app.usemuro.com). 2. Open Settings and create a key under **API keys**. 3. Copy it right away. The key is shown once. A key looks like `muro_sk_` followed by 43 characters (letters, digits, `-` and `_`). Treat it like a password: it spends your money. Do not commit it to a repository or paste it into a shared chat. ## Send it as a header [Section titled “Send it as a header”](#send-it-as-a-header) Send the key on every request to `https://mcp.usemuro.com/mcp`: ```http Authorization: Bearer muro_sk_… ``` Only tokens that start with `muro_sk_` are accepted. Any other `Authorization` value is ignored and the call is treated as keyless. ### Claude Code [Section titled “Claude Code”](#claude-code) ```bash claude mcp add --transport http muro-colors https://mcp.usemuro.com/mcp --header "Authorization: Bearer muro_sk_…" ``` ### Cursor [Section titled “Cursor”](#cursor) In `~/.cursor/mcp.json`: ```json { "mcpServers": { "muro-colors": { "url": "https://mcp.usemuro.com/mcp", "headers": { "Authorization": "Bearer muro_sk_…" } } } } ``` ### VS Code (Copilot agent mode) [Section titled “VS Code (Copilot agent mode)”](#vs-code-copilot-agent-mode) In `.vscode/mcp.json`: ```json { "servers": { "muro-colors": { "type": "http", "url": "https://mcp.usemuro.com/mcp", "headers": { "Authorization": "Bearer muro_sk_…" } } } } ``` ### claude.ai and ChatGPT [Section titled “claude.ai and ChatGPT”](#claudeai-and-chatgpt) These connectors cannot send a header. Use [Sign in with Muro](/auth/oauth/) at `https://mcp.usemuro.com/account/mcp`. It creates and manages a key for you. ### CLI [Section titled “CLI”](#cli) ```bash muro login # paste the key once ``` or set `MURO_API_KEY`. See the [CLI guide](/cli/). ## Check it works [Section titled “Check it works”](#check-it-works) Ask the assistant to run `get_credits`. It returns your balance and plan, for example “120 credits on the pro plan” (the numbers are yours). If the key is wrong, you get the message listed under [Errors](/reference/errors/). ## Revoke a key [Section titled “Revoke a key”](#revoke-a-key) Open app.usemuro.com → Settings → API keys and revoke it. The next call with that key is rejected. Revoking also disconnects any assistant that [signed in with Muro](/auth/oauth/) under that key. ## Limits for keyed calls [Section titled “Limits for keyed calls”](#limits-for-keyed-calls) Any request that carries an `Authorization` header is limited to **60 requests per 60 seconds per client IP**, a stricter bucket than the keyless 600 per 60 seconds. Above it the server answers HTTP 429 with `Retry-After: 60`. The limit is enforced per Cloudflare data centre, so treat it as approximate. Details are on [Pricing and limits](/reference/pricing-limits/). A keyed call to a free colour tool counts against the 60 bucket too. If you only need colour data, leave the header off. # Sign in with Muro (OAuth) > How claude.ai and ChatGPT connect to your Muro account without an API key, what you see, and how to disconnect. claude.ai and ChatGPT connectors cannot send an `Authorization` header, so they cannot use an [API key](/auth/api-keys/). For them the server has a second address that signs you in with your Muro account: ```text https://mcp.usemuro.com/account/mcp ``` It exposes the same eight tools as `/mcp`. Painting spends the credits of the account you sign in with. ## What you see [Section titled “What you see”](#what-you-see) 1. In your assistant, add a custom connector with the URL above. In claude.ai: Settings → Connectors → *Add custom connector*, authentication left empty. In ChatGPT: Settings → Apps & Connectors → Advanced → Developer mode → *Create*, with OAuth. 2. A Muro page asks “Connect *assistant name* to your Muro account?”. It says who published the app and where access goes, and lists what the assistant may do: * paint your room photos in the colours you ask for, using your Muro credits * see your credit balance 3. **Continue to Muro** takes you to app.usemuro.com. Sign in if you are not signed in, and confirm again. 4. You are sent back to the assistant, now connected. **Cancel** at either step connects nothing. If the page says the link expired or was already used, go back to the assistant and start connecting again. ## Where the connection appears [Section titled “Where the connection appears”](#where-the-connection-appears) Connecting creates an API key for that assistant. It is listed in app.usemuro.com → Settings → API keys under the assistant’s name. ## Disconnect [Section titled “Disconnect”](#disconnect) Revoke that key in Settings → API keys. The next call from the assistant is rejected (“key rejected”), and you can remove the connector in the assistant too. ## How it works (for developers) [Section titled “How it works (for developers)”](#how-it-works-for-developers) The Worker at `mcp.usemuro.com` is the OAuth 2.1 authorization server, built on `@cloudflare/workers-oauth-provider`. The client never holds your Muro key, only a token issued by this Worker. 1. The client calls `/account/mcp`, gets a `401`, discovers the authorization server from the resource metadata, and registers itself at `/register` (or presents a Client ID Metadata Document). 2. `/authorize` shows the consent page. Continue hands the browser to `app.usemuro.com/connect`, with `state`, `client` and `client_name`. 3. The Muro app signs you in, asks again, creates a `muro_sk_…` key for that client, and POSTs `state` and `key` (or `error`) as a form to `/oauth/callback`. The key never appears in a URL. 4. The callback checks the browser-bound state and verifies the key against the Muro API. It stores the key encrypted inside the grant. The client receives an opaque token from `/oauth/token`. | Item | Value | | --------------------- | ------------------------------------------- | | Resource | `https://mcp.usemuro.com/account/mcp` | | Scope | `muro` | | Registration | `/register`, or Client ID Metadata Document | | Authorization / token | `/authorize`, `/oauth/token` | `/account/mcp`, `/register`, `/authorize` and `/oauth/*` share the keyed rate limit: 60 requests per 60 seconds per client IP. See [Pricing and limits](/reference/pricing-limits/). Clients that can send headers (Claude Code, Cursor, VS Code, scripts) should use an [API key](/auth/api-keys/) at `/mcp` instead. For the server’s discovery document see `https://mcp.usemuro.com/.well-known/mcp.json`. # CLI > The usemuro command line tool. Search paint colours, find cross-brand equivalents and paint a photo from your terminal. `usemuro` brings the Muro catalogue and room painting to your terminal. It talks to the same server as the [MCP tools](/mcp/overview/). Colour lookups are free. Painting uses a Muro [API key](/auth/api-keys/) and your plan’s credits. Source: [github.com/mszyma/muro-cli](https://github.com/mszyma/muro-cli). Requires **Node 20 or newer**. No dependencies. ## Install [Section titled “Install”](#install) Run without installing: ```bash npx usemuro colors search "agreeable gray" ``` Or install globally. The command is then `muro`: ```bash npm install -g usemuro muro colors search "agreeable gray" ``` ## Free colour commands [Section titled “Free colour commands”](#free-colour-commands) No key needed. ```bash muro colors search "agreeable gray" ``` ```text Sherwin-Williams Agreeable Gray (SW 7029) #D1CBC1 https://usemuro.com/en/colors/sherwin_williams/agreeable-gray ``` ```bash muro colors get "Farrow & Ball" "Hague Blue" ``` ```text Farrow & Ball Hague Blue (30) #3D4E57 LRV 29.4 https://usemuro.com/en/colors/farrow_ball/hague-blue ``` ```bash muro colors equivalents "Farrow & Ball" "Hague Blue" --country PL --limit 4 ``` ```text Source: Farrow & Ball Hague Blue (30) #3D4E57 ΔE 0.49 Śnieżka S 7020-b10g (S 7020-B10G) #3D4D56 — practically identical ΔE 1.35 Dulux (PL) S0.16.22 (1384825) #394A53 — very close ΔE 2.33 Tikkurila M438 #435055 — close ΔE 2.35 Flügger 4468 (Flügger Pro 5 - Flügger 900 624) #3D4951 — close ``` `--country PL` puts brands sold in that market first. See [Colour data](/reference/colour-data/) for what ΔE means. ## Commands [Section titled “Commands”](#commands) | Command | What it does | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | `muro colors search [--brand B] [--limit N]` | Search by name or code (free) | | `muro colors get ` | Exact lookup (free) | | `muro colors equivalents ` or `--hex #RRGGBB` `[--country PL] [--limit N]` | Closest colours in other brands, CIEDE2000 (free) | | `muro brands [--country PL]` | Brands, optionally by market (free) | | `muro login [key]` | Save your API key | | `muro logout` | Remove the saved key | | `muro credits` | Show balance and plan | | `muro visualize -c …` | Paint 1 to 12 colours. Options: `--surface interior\|facade\|roof`, `--quality standard\|hd\|ultra`, `--ceiling`, `--country PL`, `--out DIR`, `--yes` | | `muro relight --time day\|evening\|night` | The same result in another light, 1 credit. Options: `--lamps`, `--out DIR` | `colors` also answers to `colours`, and `visualize` to `visualise` and `paint`. Run `muro --help` for the built-in reference and `muro --version` for the version. ## Colour syntax [Section titled “Colour syntax”](#colour-syntax) The `-c` option (repeatable, also `--color` and `--colour`) takes any of: | Form | Example | | -------------- | ---------------------------- | | Hex | `#3D4E57` | | Brand and name | `"Farrow & Ball:Hague Blue"` | | Brand and code | `"Sherwin-Williams:SW 7029"` | | RAL code | `"RAL 9005"` | Give each colour once: a duplicate is refused because every colour is charged. ## Log in [Section titled “Log in”](#log-in) Create a key at app.usemuro.com → Settings → API keys (see [API keys](/auth/api-keys/)), then: ```bash muro login # paste the key when asked muro login muro_sk_… # or pass it as an argument ``` The key is checked against your account and saved to `~/.config/muro/config.json` (readable only by you). Set `MURO_API_KEY` to use a key without saving it, for example in CI. The environment variable wins over the saved file. ## Paint a photo [Section titled “Paint a photo”](#paint-a-photo) ```bash muro visualize living-room.jpg \ -c "Farrow & Ball:Hague Blue" -c "RAL 9005" \ --country PL --out ./paint ``` ```text 1. Farrow & Ball Hague Blue (30) #3D4E57 [c1] → paint/01-farrow-ball-hague-blue.jpg Buy: Śnieżka S 7020-b10g ΔE 0.49 · Dulux (PL) S0.16.22 (1384825) ΔE 1.35 · Tikkurila M438 ΔE 2.33 · Flügger 4468 ΔE 2.35 2. RAL Colors Jet black (RAL 9005) #0E0E10 [c2] → paint/02-ral-colors-jet-black.jpg … Project: https://app.usemuro.com/wynik/… Cost: 2 credits. ``` Each result is saved at full resolution (default folder `muro-out`) with the paint’s brand, name and code, plus the closest paints to buy from other brands. Before spending credits, `visualize` shows the cost and asks `[y/N]`. Pass `--yes` (or `-y`) to skip the question. `--yes` is **required** when the command is not run in a terminal, for example in a script. The photo argument is a file path or an `https://` link. ### Photo formats [Section titled “Photo formats”](#photo-formats) * JPEG, PNG or WebP, up to 12 MB. * **HEIC/HEIF** from an iPhone is converted to JPEG automatically **on macOS** (using the built-in `sips`). On other systems, save it as JPEG first. * 1 to 12 colours per call, each a separate image. * Up to 100 photo uploads a day per account. ### Quality and cost [Section titled “Quality and cost”](#quality-and-cost) `standard` (about 1K) costs 1 credit per colour on any plan. `hd` (about 2K) costs 2 from Pro. `ultra` (about 4K) costs 3 from Premium. See [Pricing and limits](/reference/pricing-limits/). ## Relight [Section titled “Relight”](#relight) Show a painted interior by day, at evening or at night. Use the project id and colour key (`c1`, `c2`, …) from the `visualize` output: ```bash muro relight c1 --time evening ``` It costs 1 credit and saves, for example, `muro-out/c1-evening.jpg`. Add `--lamps` for lamps on. It asks for confirmation in a terminal; `--yes` skips it. ## JSON output [Section titled “JSON output”](#json-output) Every command takes `--json` for scripts and agents: ```bash muro colors search "SW 7029" --json ``` ```json { "query": "SW 7029", "count": 1, "colors": [ { "brand": "Sherwin-Williams", "brand_id": "sherwin_williams", "name": "Agreeable Gray", "hex": "#D1CBC1", "lrv": 79.8, "category": "neutral", "collection": "Sherwin-Williams-all", "code": "SW 7029", "url": "https://usemuro.com/en/colors/sherwin_williams/agreeable-gray" } ], "see_on_your_wall": "Preview it on a photo of your own room with Muro (iPhone, iPad and web): https://app.usemuro.com · App Store: https://apps.apple.com/app/id6757682733", "data_source": "Muro paint colour database (usemuro.com), compiled from manufacturers’ published colour catalogues." } ``` With `--json`, progress messages are not printed. ## Errors [Section titled “Errors”](#errors) The CLI prints `muro: ` and exits non-zero. Common messages: * `This needs a Muro API key. Create one at https://app.usemuro.com/ustawienia (Settings → API keys), then run: muro login` * `Your API key was not accepted. Create a new one at https://app.usemuro.com/ustawienia and run: muro login` * `This needs 3 credits and you have 1. Top up at https://app.usemuro.com/plan` * `This will use 2 credits. Add --yes to confirm.` * `The photo is larger than 12 MB.` * `HEIC photos are converted automatically only on macOS. Save the photo as JPEG first.` The server-side messages are on [Errors](/reference/errors/). ## For AI agents [Section titled “For AI agents”](#for-ai-agents) The same features are available over MCP. See the [MCP overview](/mcp/overview/) and the [quickstart](/start/quickstart/). # MCP server overview > Connect an MCP client to the Muro paint server. Endpoints, the eight tools, server card, rate limits and the three ways to pay for paint tools. The Muro MCP server gives an AI agent real paint colours from 35 manufacturer catalogues (about 51,000 colours) and, with a Muro account or an x402 payment, can repaint a photo of a room, facade or roof. ## Endpoints [Section titled “Endpoints”](#endpoints) | URL | Transport | Sign-in | Use it for | | ------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | | `https://mcp.usemuro.com/mcp` | Streamable HTTP | None for the free tools. Optional `Authorization: Bearer muro_sk_…` header (a Muro API key) for the paid tools. | Clients that can send headers: CLIs, SDKs, Claude Code, Cursor. | | `https://mcp.usemuro.com/account/mcp` | Streamable HTTP | OAuth: the user signs in with their Muro account. | Connectors that cannot send headers, such as claude.ai and ChatGPT. See [/auth/oauth/](/auth/oauth/). | Both endpoints expose the same eight tools. The paid tools are always listed so that agents can discover them; they fail with an explanatory message when no payment method is available. ## Tools [Section titled “Tools”](#tools) | Tool | What it does | Cost | Reference | | --------------------- | --------------------------------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------ | | `search_paint_colors` | Find colours by name or code across all brands. | Free | [/mcp/tools/search-paint-colors/](/mcp/tools/search-paint-colors/) | | `get_paint_color` | Look up one colour by brand and exact name or code. | Free | [/mcp/tools/get-paint-color/](/mcp/tools/get-paint-color/) | | `find_equivalents` | Closest colours in other brands to a colour or hex value (CIEDE2000). | Free | [/mcp/tools/find-equivalents/](/mcp/tools/find-equivalents/) | | `list_brands` | List brands, optionally those sold in a country. | Free | [/mcp/tools/list-brands/](/mcp/tools/list-brands/) | | `visualize_room` | Repaint a photo in 1 to 12 colours. | Paid: 1 to 3 credits per colour, or x402 | [/mcp/tools/visualize-room/](/mcp/tools/visualize-room/) | | `get_visualization` | Fetch the colours of a `visualize_room` job that were not ready yet. | No extra cost | [/mcp/tools/get-visualization/](/mcp/tools/get-visualization/) | | `relight_room` | Relight a finished interior as day, evening or night. | Paid: 1 credit, or x402 | [/mcp/tools/relight-room/](/mcp/tools/relight-room/) | | `get_credits` | Show the credit balance and plan of the connected account. | Needs a Muro key | [/mcp/tools/get-credits/](/mcp/tools/get-credits/) | ## Server card and registry [Section titled “Server card and registry”](#server-card-and-registry) * Server card: . JSON with the transport URL, authentication options, rate limits and the full tool list (names, titles, descriptions). * MCP Registry name: `com.usemuro/paint-colors` (title “Muro Paint Colors”, both endpoints above are listed as `streamable-http` remotes). * A plain-text description is served at `GET https://mcp.usemuro.com/`. ## Rate limits [Section titled “Rate limits”](#rate-limits) Limits are per client IP and approximate. | Traffic | Limit | | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | | Requests to `/mcp` without an `Authorization` header | 600 per 60 seconds | | Requests with an `Authorization` header (keyed calls), `/account/mcp`, and the OAuth endpoints (`/register`, `/authorize`, `/oauth/*`) | 60 per 60 seconds | `GET /`, the server card, and CORS preflight requests are not counted. When a limit is exceeded the server answers HTTP `429` with a `Retry-After: 60` header and a JSON-RPC error body: ```json { "jsonrpc": "2.0", "id": null, "error": { "code": -32000, "message": "Rate limit: 600 requests per minute per client. Retry in 60 seconds." } } ``` ## Paying for the paint tools [Section titled “Paying for the paint tools”](#paying-for-the-paint-tools) The free tools need nothing. `visualize_room` and `relight_room` spend money, in one of three ways. The server tries them in this order: a key on the connection, then x402, then it returns an error that says where to get a key. 1. **Muro API key (credits).** Create a key at `https://app.usemuro.com/ustawienia` and send it as `Authorization: Bearer muro_sk_…`. Painting is charged against the account’s credits: 1 credit per colour in `standard`, 2 in `hd`, 3 in `ultra`; `relight_room` costs 1. Details: [API keys](/auth/api-keys/). 2. **OAuth.** Connect to `https://mcp.usemuro.com/account/mcp` and sign in with a Muro account. Same credits as a key. See [/auth/oauth/](/auth/oauth/). 3. **x402.** An agent without an account pays per call in USDC on Base. Prices: $0.25 (`standard`), $0.50 (`hd`) or $0.75 (`ultra`) per colour, and $0.25 per `relight_room`. `get_visualization` is free under x402. `get_credits` is not sold over x402. See [/x402/](/x402/). # find_equivalents > Reference for the find_equivalents MCP tool. Find the closest colours in other paint brands to a colour or hex value, ranked by CIEDE2000. Free. `find_equivalents` finds the closest colours in other brands to a given paint colour or hex value, for example “Behr equivalent of Farrow & Ball Hague Blue” or “which Benjamin Moore is closest to #D1CBC1”. Give either `brand` plus `name_or_code`, or `hex`. Distance is CIEDE2000 ΔE. By default it returns the single best match per brand, closest first. Pass `brands` to restrict the search; with one brand you get several options from it. **Cost:** Free. No key needed. ## Parameters [Section titled “Parameters”](#parameters) | Name | Type | Required | Default | Description | | -------------- | -------------------------------------------------- | -------- | ---------------- | -------------------------------------------------------------------------- | | `brand` | string, max 60 chars | no | | Brand of the source colour. Use together with `name_or_code`. | | `name_or_code` | string, max 100 chars | no | | Name or code of the source colour. | | `hex` | string, max 7 chars | no | | Source colour as hex, e.g. `#3D4E57`, instead of `brand` + `name_or_code`. | | `brands` | array of strings (max 60 chars each), max 20 items | no | all other brands | Only search these brands, e.g. `["Behr", "Sherwin-Williams"]`. | | `limit` | integer, 1 to 30 | no | 8 | Maximum results. | If `hex` is given it is used and `brand`/`name_or_code` are ignored. With neither `hex` nor both `brand` and `name_or_code`, the tool returns an error. ## Returns [Section titled “Returns”](#returns) One text content item holding a JSON object: | Field | Description | | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `source_color` | The source colour: the catalogue colour (all colour fields) or `{ "hex": "#…" }`. | | `note` | Present if the source name exists in several catalogues of the same brand; says which one was matched. | | `count` | Number of equivalents. | | `equivalents` | Colours (same fields as in [/mcp/tools/search-paint-colors/](/mcp/tools/search-paint-colors/)) plus `delta_e` (CIEDE2000 ΔE) and `match` (verdict). | | `hint` | Present when nothing is within ΔE 6: `Nothing within ΔE 6 in the requested brands.` | | `caveat` | On-wall results depend on base, sheen and tinting; test a sample. | | `found`, `message`, `suggestions` | Returned instead of the above if the source colour is not in the catalogue. | Verdicts (`match`): under 1 “practically identical”, under 2 “very close”, under 3.5 “close”, otherwise “similar”. Nothing above ΔE 6 is returned. A catalogue source colour skips its own brand and that brand’s sister catalogues. ## Example [Section titled “Example”](#example) Arguments: ```json { "brand": "Farrow & Ball", "name_or_code": "Hague Blue", "brands": ["Behr", "Sherwin-Williams"], "limit": 2 } ``` Result (captured from `https://mcp.usemuro.com/mcp`, attribution fields trimmed): ```json { "source_color": { "brand": "Farrow & Ball", "brand_id": "farrow_ball", "name": "Hague Blue", "hex": "#3D4E57", "lrv": 29.4, "category": "blue", "collection": "Main Collection", "code": "30", "url": "https://usemuro.com/en/colors/farrow_ball/hague-blue" }, "count": 2, "equivalents": [ { "brand": "Behr", "brand_id": "behr", "name": "Orion Gray", "hex": "#3D4C55", "lrv": 28.8, "category": "blue", "collection": "Main Collection", "code": "N510-6", "url": "https://usemuro.com/en/colors/behr/orion-gray", "delta_e": 0.98, "match": "practically identical" }, { "brand": "Sherwin-Williams", "brand_id": "sherwin_williams", "name": "Sea Serpent", "hex": "#3E4B54", "lrv": 28.6, "category": "blue", "collection": "Sherwin-Williams-all", "code": "SW 7615", "url": "https://usemuro.com/en/colors/sherwin_williams/sea-serpent", "delta_e": 1.82, "match": "very close" } ], "caveat": "Screen colours are approximations. On the wall the result depends on the paint base, sheen and tinting, so test a sample before buying." } ``` ## Notes [Section titled “Notes”](#notes) * Always pass on the caveat: the colour on the wall depends on the paint base, sheen and tinting. A low ΔE means the screen values are close, not that two paints look identical on a wall. * An invalid `hex` returns an error: `Use six hex digits like #3D4E57.` # get_credits > Reference for the get_credits MCP tool. Show the Muro credit balance and plan of the connected account. Needs a Muro API key or OAuth sign-in. `get_credits` shows the Muro credit balance and plan of the connected account. Use it before [/mcp/tools/visualize-room/](/mcp/tools/visualize-room/) to check that the account can afford the painting. Painting costs 1 credit per colour in `standard`, 2 in `hd` and 3 in `ultra`. **Cost:** Free to call, but it needs a Muro API key or an OAuth sign-in on the connection. It is not sold over x402, so an agent paying with x402 cannot use it. ## Parameters [Section titled “Parameters”](#parameters) None. Send an empty object. ## Returns [Section titled “Returns”](#returns) One text content item: ```text credits on the plan. Painting costs 1 credit per colour in standard, 2 in hd, 3 in ultra. Top up or change plan at https://app.usemuro.com/plan. ``` ## Example [Section titled “Example”](#example) Arguments: ```json {} ``` Result (illustrative; the values are made up): ```text 20 credits on the free plan. Painting costs 1 credit per colour in standard, 2 in hd, 3 in ultra. Top up or change plan at https://app.usemuro.com/plan. ``` Without a key (captured from `https://mcp.usemuro.com/mcp`, `isError: true`): ```text Painting a photo needs a Muro account with credits. Create an API key at https://app.usemuro.com/ustawienia (Settings → API keys) and add it to this connection as the header "Authorization: Bearer muro_sk_…". Looking up paint colours stays free without a key. ``` ## Notes [Section titled “Notes”](#notes) * A rejected key (missing, mistyped or revoked) returns an error that says so, followed by the same instructions. * Keyed calls fall under the stricter rate limit; see [/mcp/overview/](/mcp/overview/). # get_paint_color > Reference for the get_paint_color MCP tool. Look up one paint colour by brand and exact name or code. Free. `get_paint_color` looks up one paint colour by brand and exact name or code, for example brand “Sherwin-Williams” with “SW 7029” or “Agreeable Gray”, or brand “Farrow & Ball” with “Hague Blue” or “30”. Case, spacing and accents are ignored. If nothing matches exactly, it returns close suggestions instead. **Cost:** Free. No key needed. ## Parameters [Section titled “Parameters”](#parameters) | Name | Type | Required | Default | Description | | -------------- | ---------------------- | -------- | ------- | ----------------------------------------------------- | | `brand` | string, 1 to 60 chars | yes | | Brand name, e.g. “Behr”, “Benjamin Moore”, “Śnieżka”. | | `name_or_code` | string, 1 to 100 chars | yes | | Exact colour name or manufacturer code. | ## Returns [Section titled “Returns”](#returns) One text content item holding a JSON object. Found: | Field | Description | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `found` | `true`. | | `colors` | Matching colours (same fields as in [/mcp/tools/search-paint-colors/](/mcp/tools/search-paint-colors/)). A brand sold in several markets may return one match per market. | Not found: | Field | Description | | ------------- | ------------------------------------------------------- | | `found` | `false`. | | `message` | `No colour named or coded "" in .` | | `suggestions` | Close colours. | Both shapes also carry `see_on_your_wall` and `data_source`. ## Example [Section titled “Example”](#example) Arguments: ```json { "brand": "Sherwin-Williams", "name_or_code": "SW 7029" } ``` Result (captured from `https://mcp.usemuro.com/mcp`, attribution fields trimmed): ```json { "found": true, "colors": [ { "brand": "Sherwin-Williams", "brand_id": "sherwin_williams", "name": "Agreeable Gray", "hex": "#D1CBC1", "lrv": 79.8, "category": "neutral", "collection": "Sherwin-Williams-all", "code": "SW 7029", "url": "https://usemuro.com/en/colors/sherwin_williams/agreeable-gray" } ] } ``` ## Notes [Section titled “Notes”](#notes) * A miss is not an error: the call succeeds with `found: false`. Check `found`. * If you do not know the exact name, use [/mcp/tools/search-paint-colors/](/mcp/tools/search-paint-colors/). * Hex values are screen approximations of real paint. # get_visualization > Reference for the get_visualization MCP tool. Fetch the colours of a visualize_room job that were not ready yet. No extra cost. `get_visualization` fetches the colours of a [/mcp/tools/visualize-room/](/mcp/tools/visualize-room/) job that were not ready yet, by `job_id` and `project_id`. It waits up to about 25 seconds. Call it again if the result still reports unfinished colours. **Cost:** Free. It costs no credits. Under x402 it also runs without a payment: the job id is the proof of purchase. It still needs a key or x402 to be enabled on the connection, and the job must belong to the account that ran it (under x402, to Muro’s service account). ## Parameters [Section titled “Parameters”](#parameters) | Name | Type | Required | Default | Description | | -------------- | -------------------------------------------------- | -------- | ---------- | ---------------------------------------------------------------------------------------------------- | | `job_id` | string, 1 to 100 chars | yes | | `job_id` from `visualize_room`. | | `project_id` | string, 1 to 100 chars | yes | | `project_id` from `visualize_room`. | | `country` | string, max 40 chars | no | | Where the user buys paint, e.g. “PL”, “DE”, “US”: brands sold there come first in the shopping list. | | `match_brands` | array of strings (max 60 chars each), max 10 items | no | all brands | Only list paints from these brands. | | `matches` | integer, 0 to 10 | no | 5 | Paints to list per colour. `0` means no shopping list. | ## Returns [Section titled “Returns”](#returns) Same shape as [/mcp/tools/visualize-room/](/mcp/tools/visualize-room/): MCP `image` content for each finished colour with its caption and shopping list, a final status text, and `structuredContent` with `project_id`, `job_id`, `status`, `result_url` and `colors`. The `cost` and `credits_left` fields are not included, because nothing is charged. If colours are still running, the status text says `Painted N of M so far` and repeats the call to make. Colours that failed are listed with their error. ## Example [Section titled “Example”](#example) Arguments: ```json { "job_id": "job_456", "project_id": "proj_123", "country": "US" } ``` The result has the same shape as in `visualize_room`. Calling with ids that do not exist (captured, no key on the connection and x402 enabled) returns: ```text Muro could not find that project or job. It may belong to another account. ``` with `isError: true`. ## Notes [Section titled “Notes”](#notes) * Use the `job_id` and `project_id` exactly as `visualize_room` returned them. * The shopping list is recomputed from the catalogue on each call, so you can change `country`, `match_brands` and `matches` between calls. * Without a key and without x402 enabled, the tool returns the same “needs a Muro account” error as the other paid tools. # list_brands > Reference for the list_brands MCP tool. List the paint brands in the Muro database, or the brands sold in a given country. Free. `list_brands` lists the paint brands in the database with their number of colours and a brand page URL. With `country` (an ISO code like “DE”, “PL”, “US”, “GB”, or a name like “Germany”) it returns the brands sold there, in order of local relevance. **Cost:** Free. No key needed. ## Parameters [Section titled “Parameters”](#parameters) | Name | Type | Required | Default | Description | | --------- | -------------------- | -------- | ---------- | ------------------------------------------------ | | `country` | string, max 40 chars | no | all brands | Country code or name, e.g. “US”, “DE”, “Poland”. | ## Returns [Section titled “Returns”](#returns) One text content item holding a JSON object: | Field | Description | | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | `market` | The country as resolved, when `country` was given. | | `brands` | Array of brands: `brand`, `brand_id`, `country`, `colors` (number of colours), `collections` (number of collections), `url` (brand page on usemuro.com). | | `other_brands` | With `country`: how many further brands exist that are not sold there. | | `see_on_your_wall`, `data_source` | Attribution strings. | ## Example [Section titled “Example”](#example) Arguments: ```json { "country": "DE" } ``` Result (captured from `https://mcp.usemuro.com/mcp`; the list is trimmed to two brands and attribution fields are omitted): ```json { "market": "DE", "brands": [ { "brand": "Alpina", "brand_id": "alpina", "country": "DE", "colors": 186, "collections": 7, "url": "https://usemuro.com/en/colors/alpina" }, { "brand": "Caparol", "brand_id": "caparol", "country": "DE", "colors": 2774, "collections": 27, "url": "https://usemuro.com/en/colors/caparol" } ], "other_brands": 27 } ``` The real response listed eight brands for DE. ## Notes [Section titled “Notes”](#notes) * Use the returned `brand` names as the `brand` / `brands` arguments of the other tools. Some brands exist per market (for example “Sikkens (DE)”). * The same country values work for the `country` argument of [/mcp/tools/visualize-room/](/mcp/tools/visualize-room/), which puts brands sold there first in the shopping list. # relight_room > Reference for the relight_room MCP tool. Relight a finished interior visualization as day, evening or night, with lamps on or off. Paid. `relight_room` relights a finished interior visualization as day, evening or night, with lamps on or off, keeping the wall colour. It needs the `project_id` and the `color_key` returned by [/mcp/tools/visualize-room/](/mcp/tools/visualize-room/). Interiors only. **Cost:** * Muro credits: 1 credit per call. * x402 price: $0.25 per call (USDC on Base). See [/x402/](/x402/). ## Parameters [Section titled “Parameters”](#parameters) | Name | Type | Required | Default | Description | | ------------ | ------------------------------- | -------- | ------- | ----------------------------------------------- | | `project_id` | string, 1 to 100 chars | yes | | `project_id` from `visualize_room`. | | `color_key` | string, 1 to 40 chars | yes | | `color_key` of the painted result, e.g. `"c1"`. | | `time` | enum: `day`, `evening`, `night` | yes | | Time of day. | | `lamps` | boolean | no | `false` | Lamps on. | ## Returns [Section titled “Returns”](#returns) Three MCP content items: 1. Text: `