Brand MCP server
The Pulumi Brand MCP Server is a remote Model Context Protocol server that exposes the Pulumi brand guidelines as structured resources, tools, and prompts. It’s designed to be consumed by AI agents and LLM-powered workflows that create, review, or audit brand content, and it’s deployed at brand.pulumi.com and compatible with any MCP client that supports streamable HTTP.
Configuration
Section titled “Configuration”Point any MCP-compatible client at the public URL:
https://brand.pulumi.com/mcpIn the snippets below, we’ve named the connection pulumi-brand, but you can change that if you like.
Claude
Section titled “Claude”You can use the MCP server with Claude Code, Claude Desktop, and in the browser at Claude.ai.
Claude Code
Section titled “Claude Code”Add the MCP server with the CLI:
claude mcp add --transport http pulumi-brand https://brand.pulumi.com/mcpBy default, the server is scoped to the current project. Add --scope user to make it available across all of your projects:
claude mcp add --transport http --scope user pulumi-brand https://brand.pulumi.com/mcpTo confirm the connection succeeded, run claude mcp list. To inspect the server’s tools, run /mcp in an active Claude Code session.
Claude Desktop
Section titled “Claude Desktop”You can configure Claude Desktop with the MCP server in one of two ways.
With a custom connector
Section titled “With a custom connector”- In Claude Desktop, open Customize → Connectors.
- Click Add → Add custom connector.
- Enter a name (e.g., “Pulumi Brand”) and paste the URL:
https://brand.pulumi.com/mcp. - Save the connector and begin using the MCP server.
With a local MCP server
Section titled “With a local MCP server”This approach uses the mcp-remote connector.
-
In Claude Desktop, open Developer → Local MCP servers.
-
Click Edit config and open the file in your text editor of choice.
-
Add a
pulumi-brandblock to themcpServerslist (add that list if it doesn’t exist):{"mcpServers": {"pulumi-brand": {"command": "npx","args": ["-y", "mcp-remote", "https://brand.pulumi.com/mcp"]}}} -
Save the file and begin using the MCP server.
Claude.ai
Section titled “Claude.ai”- Visit https://claude.ai, sign in, and navigate to Customize → Connectors.
- Click Add → Add custom connector.
- Enter a name (e.g., “Pulumi Brand”) and paste the URL:
https://brand.pulumi.com/mcp. - Save the connector and begin using the MCP server.
-
Add the following block to
~/.codex/config.tomlfor all projects, or to./.codex/config.tomlfor the current one:[mcp_servers.pulumi-brand]url = "https://brand.pulumi.com/mcp" -
Save the file, restart Codex, and begin using the MCP server.
Cursor
Section titled “Cursor”You can use the MCP server with Cursor in several ways.
Cursor Desktop
Section titled “Cursor Desktop”-
Open Settings → Cursor Settings → Tools & MCPs.
-
Under Installed MCP Servers, click Add Custom MCP.
-
Add the following block to
~/.cursor/mcp.jsonfor all projects, or to./.cursor/mcp.jsonfor the current one:{"mcpServers": {"pulumi-brand": {"transport": "http","url": "https://brand.pulumi.com/mcp"}}} -
Save the file and begin using the MCP server.
Cursor CLI
Section titled “Cursor CLI”-
Add the following block to
~/.cursor/mcp.jsonfor all projects, or to./.cursor/mcp.jsonfor the current one:{"mcpServers": {"pulumi-brand": {"transport": "http","url": "https://brand.pulumi.com/mcp"}}} -
Save the file, restart Cursor, and begin using the MCP server.
OpenCode
Section titled “OpenCode”-
Add the following block to
~/.config/opencode/opencode.jsonfor all projects, or to./opencode.jsonfor the current one:{"$schema": "https://opencode.ai/config.json","mcp": {"pulumi-brand": {"type": "remote","url": "https://brand.pulumi.com/mcp","enabled": true}}} -
Save the file, restart OpenCode, and begin using the MCP server.
Other clients
Section titled “Other clients”Any MCP client that supports a remote Streamable HTTP server works. Give it the URL https://brand.pulumi.com/mcp directly if it accepts one, or bridge through stdio with npx -y mcp-remote https://brand.pulumi.com/mcp (the same pattern as the Claude Desktop config-file option above).
Resources
Section titled “Resources”Static brand content served via resources/read. Each resource uses a brand:// URI scheme.
| URI | Name | Content |
|---|---|---|
brand://colors | Brand Colors | Full color system — 8 palettes × 11 steps, semantic roles, utility colors, accessibility notes |
brand://colors/{palette} | Brand Color Palette | A single palette (e.g., brand://colors/violet) |
brand://typography | Brand Typography | Inter + Monaspace Neon typefaces, font stacks, usage rules, typographic scale |
brand://voice | Brand Voice & Tone | Voice principles, tone-by-context matrix, preferred/avoided words, inclusive language |
brand://writing-style | Writing Style | Grammar, punctuation, style rules (Chicago Manual of Style) |
brand://logo | Logo Guidelines | Lockups, sizing, approved backgrounds, clear space, dos/don’ts |
brand://identity | Brand Identity | Brand attributes, purpose, values, Phosphor iconography guidelines |
brand://visuals | Visual Guidelines | Illustration style, accent lines, photography, mascot (Pulumipus) |
brand://guidelines | Usage Guidelines | Generative AI usage rules, when to bend brand rules |
The tools fall into two groups: brand lookup (colors, typography, search) and asset generation (logos).
get_brand_overview
Section titled “get_brand_overview”Return the brand orientation — how to use this server and which get_guidelines section to pull for the task at hand. The same text MCP clients receive as server instructions at session start; call this when your client doesn’t surface those, or to re-orient mid-task. It routes you to the rules rather than restating them — use get_guidelines for the full guidance on a topic.
Takes no arguments.
get_guidelines
Section titled “get_guidelines”Return the complete text of a brand guideline section — the full guidance, not a summary. Call it before producing or reviewing the matching kind of artifact (for example, voice and writing-style before writing copy). For color, use the color tools below; to search across sections, use search_guidelines.
| Parameter | Type | Required | Description |
|---|---|---|---|
section | string | Yes | One of: voice, writing-style, typography, logo, identity, visuals, guidelines |
get_color_palette
Section titled “get_color_palette”Get a specific brand color palette with all 11 steps (50–950) and semantic roles.
| Parameter | Type | Required | Description |
|---|---|---|---|
palette | string | Yes | One of: violet, gray, green, aqua, blue, red, orange, yellow, or utility (black, white, Service Black) |
format | string | No | Color format hint: hex, hsl, rgb, oklch. Stored values are hex; other formats available via brand://colors. |
response_format | string | No | json (default) for structured data or markdown for a human-readable table |
find_nearest_brand_color
Section titled “find_nearest_brand_color”Find the perceptually closest brand color to any CSS color value using OKLab Euclidean color difference.
| Parameter | Type | Required | Description |
|---|---|---|---|
color | string | Yes | Any CSS color: #6366f1, rgb(99,102,241), hsl(239,84%,67%), oklch(...), or a named color |
mode | string | No | light, dark, or both (default). Which mode’s palette to match against. |
Returns the matched token name, palette, step, mode, and hex value with a replacement recommendation.
get_color_tokens
Section titled “get_color_tokens”Get semantic color tokens (primary, accent, muted, background) for one or all palettes.
| Parameter | Type | Required | Description |
|---|---|---|---|
palette | string | No | A specific palette name. Omit to get tokens for all 8 palettes. |
check_color_accessibility
Section titled “check_color_accessibility”Check contrast between two colors using WCAG 3 APCA (Accessible Perceptual Contrast Algorithm). Returns the Lc value, polarity, pass/fail thresholds, and a font-size lookup per weight.
| Parameter | Type | Required | Description |
|---|---|---|---|
foreground | string | Yes | Hex value or brand token name (e.g., violet-700-light) |
background | string | Yes | Hex value or brand token name |
APCA thresholds:
| Lc (absolute) | Use case |
|---|---|
| ≥ 90 | Preferred body text |
| ≥ 75 | Body text minimum |
| ≥ 60 | Large / heading text |
| ≥ 45 | Large non-text elements |
| ≥ 30 | Non-text / spot elements |
| < 30 | Insufficient — do not use |
get_font_stack
Section titled “get_font_stack”Get the correct brand font stack and usage rules for a given typographic context.
| Parameter | Type | Required | Description |
|---|---|---|---|
context | string | Yes | heading (Inter Semibold), body (Inter Regular), or mono (Monaspace Neon) |
search_guidelines
Section titled “search_guidelines”Full-text search across all brand guideline content. Returns excerpts with surrounding context.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Search terms or natural language question about the brand |
get_logo
Section titled “get_logo”Return a URL for a Pulumi logo in any approved variant, format, background, and size. The URL is served by the brand site’s logo endpoint at brand.pulumi.com/api/logo (CDN-cached) — surface it directly to the user. Pass inline: true to embed the bytes (SVG markup or a base64 data URI) in the tool response instead, for runtimes that can’t fetch a URL at render time.
| Parameter | Type | Required | Description |
|---|---|---|---|
usage | string | No | Preset that sets sensible defaults: web, print, slide-deck, email-signature, favicon, social-avatar, custom. Explicit params override. |
lockup | string | No | auto (default), mark, horizontal, stacked, or icon-circle / icon-rounded / icon-square |
treatment | string | No | color (default) or monotone. Icons are always color. |
theme | string | No | light or dark. Auto-derived from the background when omitted. |
format | string | No | svg (default), png, jpg, or pdf |
background | string | No | transparent (default), white, black, service-black, violet-50, violet-950 |
width / height | number | No | Size in units. One alone → logo-only; both → centered on a padded canvas. |
units | string | No | px (default), cm, or in (with dpi, default 300) |
inline | boolean | No | true to embed the asset bytes in the response instead of returning a URL. Default false. |
Prompts
Section titled “Prompts”Pre-built prompt templates that inject brand context for LLM-powered workflows.
Prompts are user-invoked — the agent doesn’t call them automatically. You trigger one, fill in its arguments, and it expands into a ready-made message (pre-loaded with the relevant brand guidelines) that’s sent to the model. How you invoke them depends on your client:
- Claude Code — they appear as slash commands. Type
/and look for thepulumi-brandentries (e.g.,/mcp__pulumi-brand__review_copy). - Claude Desktop / Claude.ai — open the
+(connectors) menu in the composer, pick the pulumi-brand server, choose the prompt, and fill in the fields. - Other clients — wherever the client surfaces MCP prompts (a command palette or MCP panel). Under the hood it’s the standard
prompts/list→prompts/getflow.
Note that review_image takes no arguments — attach the image to your message first, then invoke it.
review_copy
Section titled “review_copy”Review text content for compliance with brand voice, tone, and writing style. Returns an overall assessment, a list of specific issues with quotes and suggested rewrites, and a clean rewritten version if issues were found.
| Argument | Required | Description |
|---|---|---|
copy | Yes | The text content to review |
context | No | product, marketing (default), community, or enterprise |
review_image
Section titled “review_image”Evaluate an image against brand visual guidelines — color, typography, iconography, illustration, and photography. Attach the image to your message, then invoke the prompt.
Takes no arguments — the prompt reads the attached image directly.
review_design
Section titled “review_design”Review a design in Figma for brand adherence — covers colors, typography, logo usage, spacing, and overall alignment. Works in combination with the Figma MCP, which retrieves the design from the URL.
| Argument | Required | Description |
|---|---|---|
figma_url | Yes | Figma file or node URL (figma.com/design/…) to review |