@brandsystem/mcp 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +515 -0
  2. package/bin/brandsystem-mcp.mjs +2 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +20 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/brand-dir.d.ts +56 -0
  8. package/dist/lib/brand-dir.d.ts.map +1 -0
  9. package/dist/lib/brand-dir.js +270 -0
  10. package/dist/lib/brand-dir.js.map +1 -0
  11. package/dist/lib/color-namer.d.ts +28 -0
  12. package/dist/lib/color-namer.d.ts.map +1 -0
  13. package/dist/lib/color-namer.js +155 -0
  14. package/dist/lib/color-namer.js.map +1 -0
  15. package/dist/lib/confidence.d.ts +19 -0
  16. package/dist/lib/confidence.d.ts.map +1 -0
  17. package/dist/lib/confidence.js +66 -0
  18. package/dist/lib/confidence.js.map +1 -0
  19. package/dist/lib/content-scorer.d.ts +38 -0
  20. package/dist/lib/content-scorer.d.ts.map +1 -0
  21. package/dist/lib/content-scorer.js +571 -0
  22. package/dist/lib/content-scorer.js.map +1 -0
  23. package/dist/lib/css-parser.d.ts +45 -0
  24. package/dist/lib/css-parser.d.ts.map +1 -0
  25. package/dist/lib/css-parser.js +330 -0
  26. package/dist/lib/css-parser.js.map +1 -0
  27. package/dist/lib/dtcg-compiler.d.ts +7 -0
  28. package/dist/lib/dtcg-compiler.d.ts.map +1 -0
  29. package/dist/lib/dtcg-compiler.js +89 -0
  30. package/dist/lib/dtcg-compiler.js.map +1 -0
  31. package/dist/lib/interaction-policy-compiler.d.ts +40 -0
  32. package/dist/lib/interaction-policy-compiler.d.ts.map +1 -0
  33. package/dist/lib/interaction-policy-compiler.js +60 -0
  34. package/dist/lib/interaction-policy-compiler.js.map +1 -0
  35. package/dist/lib/logo-extractor.d.ts +49 -0
  36. package/dist/lib/logo-extractor.d.ts.map +1 -0
  37. package/dist/lib/logo-extractor.js +384 -0
  38. package/dist/lib/logo-extractor.js.map +1 -0
  39. package/dist/lib/report-html.d.ts +20 -0
  40. package/dist/lib/report-html.d.ts.map +1 -0
  41. package/dist/lib/report-html.js +938 -0
  42. package/dist/lib/report-html.js.map +1 -0
  43. package/dist/lib/response.d.ts +20 -0
  44. package/dist/lib/response.d.ts.map +1 -0
  45. package/dist/lib/response.js +54 -0
  46. package/dist/lib/response.js.map +1 -0
  47. package/dist/lib/runtime-compiler.d.ts +60 -0
  48. package/dist/lib/runtime-compiler.d.ts.map +1 -0
  49. package/dist/lib/runtime-compiler.js +96 -0
  50. package/dist/lib/runtime-compiler.js.map +1 -0
  51. package/dist/lib/svg-resolver.d.ts +21 -0
  52. package/dist/lib/svg-resolver.d.ts.map +1 -0
  53. package/dist/lib/svg-resolver.js +115 -0
  54. package/dist/lib/svg-resolver.js.map +1 -0
  55. package/dist/lib/url-validator.d.ts +11 -0
  56. package/dist/lib/url-validator.d.ts.map +1 -0
  57. package/dist/lib/url-validator.js +93 -0
  58. package/dist/lib/url-validator.js.map +1 -0
  59. package/dist/lib/version.d.ts +2 -0
  60. package/dist/lib/version.d.ts.map +1 -0
  61. package/dist/lib/version.js +19 -0
  62. package/dist/lib/version.js.map +1 -0
  63. package/dist/lib/vim-generator.d.ts +13 -0
  64. package/dist/lib/vim-generator.d.ts.map +1 -0
  65. package/dist/lib/vim-generator.js +718 -0
  66. package/dist/lib/vim-generator.js.map +1 -0
  67. package/dist/resources/brand-resources.d.ts +4 -0
  68. package/dist/resources/brand-resources.d.ts.map +1 -0
  69. package/dist/resources/brand-resources.js +34 -0
  70. package/dist/resources/brand-resources.js.map +1 -0
  71. package/dist/schemas/brand-config.d.ts +28 -0
  72. package/dist/schemas/brand-config.d.ts.map +1 -0
  73. package/dist/schemas/brand-config.js +11 -0
  74. package/dist/schemas/brand-config.js.map +1 -0
  75. package/dist/schemas/brand-runtime.d.ts +251 -0
  76. package/dist/schemas/brand-runtime.d.ts.map +1 -0
  77. package/dist/schemas/brand-runtime.js +54 -0
  78. package/dist/schemas/brand-runtime.js.map +1 -0
  79. package/dist/schemas/core-identity.d.ts +302 -0
  80. package/dist/schemas/core-identity.d.ts.map +1 -0
  81. package/dist/schemas/core-identity.js +51 -0
  82. package/dist/schemas/core-identity.js.map +1 -0
  83. package/dist/schemas/index.d.ts +11 -0
  84. package/dist/schemas/index.d.ts.map +1 -0
  85. package/dist/schemas/index.js +11 -0
  86. package/dist/schemas/index.js.map +1 -0
  87. package/dist/schemas/interaction-policy.d.ts +150 -0
  88. package/dist/schemas/interaction-policy.d.ts.map +1 -0
  89. package/dist/schemas/interaction-policy.js +34 -0
  90. package/dist/schemas/interaction-policy.js.map +1 -0
  91. package/dist/schemas/messaging.d.ts +776 -0
  92. package/dist/schemas/messaging.d.ts.map +1 -0
  93. package/dist/schemas/messaging.js +68 -0
  94. package/dist/schemas/messaging.js.map +1 -0
  95. package/dist/schemas/needs-clarification.d.ts +62 -0
  96. package/dist/schemas/needs-clarification.d.ts.map +1 -0
  97. package/dist/schemas/needs-clarification.js +13 -0
  98. package/dist/schemas/needs-clarification.js.map +1 -0
  99. package/dist/schemas/strategy.d.ts +537 -0
  100. package/dist/schemas/strategy.d.ts.map +1 -0
  101. package/dist/schemas/strategy.js +71 -0
  102. package/dist/schemas/strategy.js.map +1 -0
  103. package/dist/schemas/tokens.d.ts +35 -0
  104. package/dist/schemas/tokens.d.ts.map +1 -0
  105. package/dist/schemas/tokens.js +15 -0
  106. package/dist/schemas/tokens.js.map +1 -0
  107. package/dist/schemas/visual-identity.d.ts +224 -0
  108. package/dist/schemas/visual-identity.d.ts.map +1 -0
  109. package/dist/schemas/visual-identity.js +42 -0
  110. package/dist/schemas/visual-identity.js.map +1 -0
  111. package/dist/server.d.ts +3 -0
  112. package/dist/server.d.ts.map +1 -0
  113. package/dist/server.js +75 -0
  114. package/dist/server.js.map +1 -0
  115. package/dist/tools/brand-audit-content.d.ts +3 -0
  116. package/dist/tools/brand-audit-content.d.ts.map +1 -0
  117. package/dist/tools/brand-audit-content.js +116 -0
  118. package/dist/tools/brand-audit-content.js.map +1 -0
  119. package/dist/tools/brand-audit-drift.d.ts +3 -0
  120. package/dist/tools/brand-audit-drift.d.ts.map +1 -0
  121. package/dist/tools/brand-audit-drift.js +301 -0
  122. package/dist/tools/brand-audit-drift.js.map +1 -0
  123. package/dist/tools/brand-audit.d.ts +3 -0
  124. package/dist/tools/brand-audit.d.ts.map +1 -0
  125. package/dist/tools/brand-audit.js +129 -0
  126. package/dist/tools/brand-audit.js.map +1 -0
  127. package/dist/tools/brand-build-journey.d.ts +3 -0
  128. package/dist/tools/brand-build-journey.d.ts.map +1 -0
  129. package/dist/tools/brand-build-journey.js +312 -0
  130. package/dist/tools/brand-build-journey.js.map +1 -0
  131. package/dist/tools/brand-build-matrix.d.ts +3 -0
  132. package/dist/tools/brand-build-matrix.d.ts.map +1 -0
  133. package/dist/tools/brand-build-matrix.js +525 -0
  134. package/dist/tools/brand-build-matrix.js.map +1 -0
  135. package/dist/tools/brand-build-personas.d.ts +3 -0
  136. package/dist/tools/brand-build-personas.d.ts.map +1 -0
  137. package/dist/tools/brand-build-personas.js +436 -0
  138. package/dist/tools/brand-build-personas.js.map +1 -0
  139. package/dist/tools/brand-build-themes.d.ts +3 -0
  140. package/dist/tools/brand-build-themes.d.ts.map +1 -0
  141. package/dist/tools/brand-build-themes.js +476 -0
  142. package/dist/tools/brand-build-themes.js.map +1 -0
  143. package/dist/tools/brand-check-compliance.d.ts +3 -0
  144. package/dist/tools/brand-check-compliance.d.ts.map +1 -0
  145. package/dist/tools/brand-check-compliance.js +243 -0
  146. package/dist/tools/brand-check-compliance.js.map +1 -0
  147. package/dist/tools/brand-clarify.d.ts +21 -0
  148. package/dist/tools/brand-clarify.d.ts.map +1 -0
  149. package/dist/tools/brand-clarify.js +497 -0
  150. package/dist/tools/brand-clarify.js.map +1 -0
  151. package/dist/tools/brand-compile-messaging.d.ts +3 -0
  152. package/dist/tools/brand-compile-messaging.d.ts.map +1 -0
  153. package/dist/tools/brand-compile-messaging.js +759 -0
  154. package/dist/tools/brand-compile-messaging.js.map +1 -0
  155. package/dist/tools/brand-compile.d.ts +3 -0
  156. package/dist/tools/brand-compile.d.ts.map +1 -0
  157. package/dist/tools/brand-compile.js +182 -0
  158. package/dist/tools/brand-compile.js.map +1 -0
  159. package/dist/tools/brand-deepen-identity.d.ts +3 -0
  160. package/dist/tools/brand-deepen-identity.d.ts.map +1 -0
  161. package/dist/tools/brand-deepen-identity.js +483 -0
  162. package/dist/tools/brand-deepen-identity.js.map +1 -0
  163. package/dist/tools/brand-export.d.ts +17 -0
  164. package/dist/tools/brand-export.d.ts.map +1 -0
  165. package/dist/tools/brand-export.js +730 -0
  166. package/dist/tools/brand-export.js.map +1 -0
  167. package/dist/tools/brand-extract-figma.d.ts +3 -0
  168. package/dist/tools/brand-extract-figma.d.ts.map +1 -0
  169. package/dist/tools/brand-extract-figma.js +174 -0
  170. package/dist/tools/brand-extract-figma.js.map +1 -0
  171. package/dist/tools/brand-extract-messaging.d.ts +3 -0
  172. package/dist/tools/brand-extract-messaging.d.ts.map +1 -0
  173. package/dist/tools/brand-extract-messaging.js +620 -0
  174. package/dist/tools/brand-extract-messaging.js.map +1 -0
  175. package/dist/tools/brand-extract-web.d.ts +3 -0
  176. package/dist/tools/brand-extract-web.d.ts.map +1 -0
  177. package/dist/tools/brand-extract-web.js +477 -0
  178. package/dist/tools/brand-extract-web.js.map +1 -0
  179. package/dist/tools/brand-feedback.d.ts +3 -0
  180. package/dist/tools/brand-feedback.d.ts.map +1 -0
  181. package/dist/tools/brand-feedback.js +366 -0
  182. package/dist/tools/brand-feedback.js.map +1 -0
  183. package/dist/tools/brand-ingest-assets.d.ts +3 -0
  184. package/dist/tools/brand-ingest-assets.d.ts.map +1 -0
  185. package/dist/tools/brand-ingest-assets.js +233 -0
  186. package/dist/tools/brand-ingest-assets.js.map +1 -0
  187. package/dist/tools/brand-init.d.ts +3 -0
  188. package/dist/tools/brand-init.d.ts.map +1 -0
  189. package/dist/tools/brand-init.js +66 -0
  190. package/dist/tools/brand-init.js.map +1 -0
  191. package/dist/tools/brand-preflight.d.ts +3 -0
  192. package/dist/tools/brand-preflight.d.ts.map +1 -0
  193. package/dist/tools/brand-preflight.js +608 -0
  194. package/dist/tools/brand-preflight.js.map +1 -0
  195. package/dist/tools/brand-report.d.ts +3 -0
  196. package/dist/tools/brand-report.d.ts.map +1 -0
  197. package/dist/tools/brand-report.js +154 -0
  198. package/dist/tools/brand-report.js.map +1 -0
  199. package/dist/tools/brand-runtime.d.ts +3 -0
  200. package/dist/tools/brand-runtime.d.ts.map +1 -0
  201. package/dist/tools/brand-runtime.js +37 -0
  202. package/dist/tools/brand-runtime.js.map +1 -0
  203. package/dist/tools/brand-set-logo.d.ts +3 -0
  204. package/dist/tools/brand-set-logo.d.ts.map +1 -0
  205. package/dist/tools/brand-set-logo.js +170 -0
  206. package/dist/tools/brand-set-logo.js.map +1 -0
  207. package/dist/tools/brand-start.d.ts +3 -0
  208. package/dist/tools/brand-start.d.ts.map +1 -0
  209. package/dist/tools/brand-start.js +686 -0
  210. package/dist/tools/brand-start.js.map +1 -0
  211. package/dist/tools/brand-status.d.ts +3 -0
  212. package/dist/tools/brand-status.d.ts.map +1 -0
  213. package/dist/tools/brand-status.js +175 -0
  214. package/dist/tools/brand-status.js.map +1 -0
  215. package/dist/tools/brand-write.d.ts +3 -0
  216. package/dist/tools/brand-write.d.ts.map +1 -0
  217. package/dist/tools/brand-write.js +442 -0
  218. package/dist/tools/brand-write.js.map +1 -0
  219. package/dist/types/index.d.ts +331 -0
  220. package/dist/types/index.d.ts.map +1 -0
  221. package/dist/types/index.js +52 -0
  222. package/dist/types/index.js.map +1 -0
  223. package/package.json +60 -0
package/README.md ADDED
@@ -0,0 +1,515 @@
1
+ [![CI](https://github.com/Brand-System/brandsystem-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Brand-System/brandsystem-mcp/actions/workflows/ci.yml)
2
+ [![npm version](https://img.shields.io/npm/v/@brandsystem/mcp)](https://www.npmjs.com/package/@brandsystem/mcp)
3
+ [![Node](https://img.shields.io/node/v/@brandsystem/mcp)](https://www.npmjs.com/package/@brandsystem/mcp)
4
+
5
+ # @brandsystem/mcp
6
+
7
+ Extract and manage brand identity for AI tools -- logo, colors, typography, voice, and visual rules.
8
+
9
+ ## What It Solves
10
+
11
+ AI tools produce generic output because they have no brand context. Brand guidelines live in PDFs, Figma files, and people's heads -- none of which AI tools can read.
12
+
13
+ This MCP server extracts brand identity from live sources (websites, Figma files), compiles it into structured design tokens, and makes it available to any AI tool through the [Model Context Protocol](https://modelcontextprotocol.io). The result is a `.brand/` directory with your colors, fonts, logos, voice rules, and DTCG tokens -- portable, version-controlled, and ready for any AI tool to consume.
14
+
15
+ ---
16
+
17
+ ## Quick Start
18
+
19
+ ### 1. Add to your MCP config
20
+
21
+ Copy this into `.mcp.json` (Claude Code), `.cursor/mcp.json` (Cursor), or Windsurf MCP settings:
22
+
23
+ ```json
24
+ {
25
+ "mcpServers": {
26
+ "brandsystem": {
27
+ "command": "npx",
28
+ "args": ["-y", "@brandsystem/mcp"]
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ ### 2. Create your brand system
35
+
36
+ Tell your AI tool:
37
+
38
+ > Run brand_start for "Acme Corp" with website https://acme.com in auto mode
39
+
40
+ That single command extracts colors, fonts, and logo from the website, compiles DTCG tokens, and generates a portable HTML brand report -- all in under 60 seconds.
41
+
42
+ ### 3. Use it
43
+
44
+ > Run brand_write for a social-graphic about "Q3 product launch"
45
+
46
+ The AI now has your full brand context -- colors, typography, logo, anti-patterns, voice rules -- and generates on-brand content.
47
+
48
+ ---
49
+
50
+ ## What It Does
51
+
52
+ **Session 1: Core Identity** -- Extract colors, fonts, and logo from a website or Figma file. Compile into DTCG tokens. Generate a portable HTML report.
53
+
54
+ **Session 2: Visual Identity** -- Define composition rules, pattern language, illustration style, and anti-patterns through a guided interview. Anti-patterns become enforceable compliance rules.
55
+
56
+ **Session 3: Messaging** -- Audit existing website voice, then define perspective, voice codex (tone, vocabulary, AI-ism detection), and brand story through a guided interview.
57
+
58
+ **Session 4: Content Strategy** -- Build buyer personas, journey stages, editorial themes, and a persona x stage messaging matrix.
59
+
60
+ Each session builds on the previous. Stop anywhere -- you get value immediately.
61
+
62
+ ---
63
+
64
+ ## Tools Reference
65
+
66
+ ### Entry Points
67
+
68
+ | Tool | What it does |
69
+ |------|-------------|
70
+ | `brand_start` | **Begin here.** Creates a brand system from a website URL in under 60 seconds. Use `mode='auto'` for one-call setup. |
71
+ | `brand_status` | Check progress, get next steps, or see a getting-started guide if no brand exists yet. |
72
+
73
+ ### Session 1: Core Identity
74
+
75
+ | Tool | What it does |
76
+ |------|-------------|
77
+ | `brand_extract_web` | Extract logo (SVG/PNG), colors, and fonts from any website URL. |
78
+ | `brand_extract_figma` | Extract from Figma design files (higher accuracy). Two-phase: plan then ingest. |
79
+ | `brand_set_logo` | Add/replace logo via SVG markup, URL, or data URI. |
80
+ | `brand_compile` | Generate DTCG design tokens, brand runtime contract, and interaction policy from extracted data. |
81
+ | `brand_clarify` | Resolve ambiguous brand values interactively (color roles, font confirmations). |
82
+ | `brand_audit` | Validate .brand/ directory for completeness and correctness. |
83
+ | `brand_report` | Generate portable HTML brand report. Upload to any AI chat as instant guidelines. |
84
+ | `brand_init` | Low-level directory scaffolding. Prefer `brand_start` instead. |
85
+
86
+ ### Session 2: Visual Identity
87
+
88
+ | Tool | What it does |
89
+ |------|-------------|
90
+ | `brand_deepen_identity` | Define composition rules, patterns, illustration style, and anti-patterns (6 interview sections). |
91
+ | `brand_ingest_assets` | Scan and catalog brand assets with MANIFEST.yaml metadata. |
92
+ | `brand_preflight` | Check HTML/CSS against brand rules -- catches off-brand colors, wrong fonts, anti-pattern violations. |
93
+
94
+ ### Session 3: Messaging
95
+
96
+ | Tool | What it does |
97
+ |------|-------------|
98
+ | `brand_extract_messaging` | Audit existing website voice -- fingerprint, vocabulary, claims, AI-isms, gaps. |
99
+ | `brand_compile_messaging` | Define perspective, voice codex (tone, vocabulary, AI-ism detection), and brand story. |
100
+
101
+ ### Session 4: Content Strategy
102
+
103
+ | Tool | What it does |
104
+ |------|-------------|
105
+ | `brand_build_personas` | Build buyer personas through a 7-question guided interview. |
106
+ | `brand_build_journey` | Define buyer journey stages (ships with 4 proven defaults). |
107
+ | `brand_build_themes` | Define editorial content themes balanced across awareness, engagement, and conversion. |
108
+ | `brand_build_matrix` | Generate messaging variants for every persona x journey stage combination. |
109
+
110
+ ### Content Scoring
111
+
112
+ | Tool | What it does |
113
+ |------|-------------|
114
+ | `brand_audit_content` | Score content against brand rules (0-100) across multiple dimensions. |
115
+ | `brand_check_compliance` | Quick pass/fail compliance gate before publishing. |
116
+ | `brand_audit_drift` | Detect systematic brand drift across multiple pieces of content. |
117
+
118
+ ### Runtime + Utilities
119
+
120
+ | Tool | What it does |
121
+ |------|-------------|
122
+ | `brand_runtime` | Read the compiled brand runtime contract (single-document brand context for AI agents). |
123
+ | `brand_write` | Load full brand context (visual + voice + strategy) for content generation. |
124
+ | `brand_export` | Generate portable brand files for Chat, Code, team sharing, or email. |
125
+ | `brand_feedback` | Report bugs, friction, or feature ideas to the brandsystem team. |
126
+
127
+ ### Tool Flow
128
+
129
+ Tools auto-chain -- each tool's response tells the LLM what to run next:
130
+
131
+ ```
132
+ Session 1: brand_start → brand_extract_web → brand_compile → brand_clarify → brand_report
133
+ Session 2: brand_deepen_identity (interview x 6) → brand_compile (generates VIM)
134
+ Session 3: brand_extract_messaging → brand_compile_messaging (interview x 3) → brand_write
135
+ Session 4: brand_build_personas → brand_build_journey → brand_build_themes → brand_build_matrix
136
+ ```
137
+
138
+ `brand_status` can be called at any point. `brand_preflight` runs after any content generation.
139
+
140
+ ---
141
+
142
+ ## The `.brand/` Directory
143
+
144
+ After running the full pipeline, your `.brand/` directory looks like this:
145
+
146
+ ```
147
+ .brand/
148
+ brand.config.yaml # Client name, industry, source URLs, session state
149
+ core-identity.yaml # Colors, typography, logos with confidence scores
150
+ tokens.json # DTCG design tokens (compiled output)
151
+ brand-runtime.json # Compiled runtime contract (single-doc brand context)
152
+ interaction-policy.json # Enforceable rules (anti-patterns, voice, claims)
153
+ needs-clarification.yaml # Items requiring human review
154
+ brand-report.html # Portable HTML brand report
155
+ visual-identity.yaml # Session 2: composition, patterns, anti-patterns
156
+ visual-identity-manifest.md # Session 2: compiled VIM document
157
+ system-integration.md # Session 2: CLAUDE.md / .cursorrules setup guide
158
+ messaging.yaml # Session 3: perspective, voice, brand story
159
+ messaging-audit.md # Session 3: voice fingerprint analysis
160
+ brand-story.md # Session 3: compiled brand narrative
161
+ assets/
162
+ logo/
163
+ logo-wordmark.svg # Extracted logo files
164
+ illustrations/ # Brand illustrations with MANIFEST.yaml
165
+ stickers/ # Brand stickers with MANIFEST.yaml
166
+ patterns/ # Brand patterns with MANIFEST.yaml
167
+ ```
168
+
169
+ ### File Details
170
+
171
+ | File | Format | Purpose |
172
+ |------|--------|---------|
173
+ | `brand.config.yaml` | YAML | Project metadata: client name, industry, website URL, Figma file key, session number, schema version |
174
+ | `core-identity.yaml` | YAML | All extracted brand data: colors (with roles and confidence), typography (with families and weights), logo specs (with inline SVG and data URIs), spacing |
175
+ | `tokens.json` | JSON | [DTCG](https://tr.designtokens.org/format/) design tokens. Only includes values with medium+ confidence. Each token carries `$extensions` with source and confidence metadata |
176
+ | `brand-runtime.json` | JSON | Single-document brand contract for AI agents. Merges all 4 session YAMLs into flat, fast-access format. Only medium+ confidence values. Compiled by `brand_compile`, read by `brand_runtime` |
177
+ | `interaction-policy.json` | JSON | Enforceable rules engine. Visual anti-patterns, voice constraints (never-say, AI-ism patterns), and content claims policies. Used by preflight and scoring tools |
178
+ | `needs-clarification.yaml` | YAML | Prioritized list of items the system could not resolve confidently: missing primary color, low-confidence values, unassigned roles |
179
+ | `brand-report.html` | HTML | Self-contained brand report. Works offline, embeds all assets inline. Paste into any AI tool as brand guidelines |
180
+ | `assets/logo/` | SVG/PNG | Extracted logo files. SVGs include inline path data in `core-identity.yaml` for portability |
181
+
182
+ ---
183
+
184
+ ## Platform Setup
185
+
186
+ ### Claude Code
187
+
188
+ Create `.mcp.json` in your project root:
189
+
190
+ ```json
191
+ {
192
+ "mcpServers": {
193
+ "brandsystem": {
194
+ "command": "npx",
195
+ "args": ["-y", "@brandsystem/mcp"]
196
+ }
197
+ }
198
+ }
199
+ ```
200
+
201
+ ### Cursor
202
+
203
+ Create `.cursor/mcp.json` in your project root:
204
+
205
+ ```json
206
+ {
207
+ "mcpServers": {
208
+ "brandsystem": {
209
+ "command": "npx",
210
+ "args": ["-y", "@brandsystem/mcp"]
211
+ }
212
+ }
213
+ }
214
+ ```
215
+
216
+ ### Windsurf
217
+
218
+ Create `~/.codeium/windsurf/mcp_config.json`:
219
+
220
+ ```json
221
+ {
222
+ "mcpServers": {
223
+ "brandsystem": {
224
+ "command": "npx",
225
+ "args": ["-y", "@brandsystem/mcp"]
226
+ }
227
+ }
228
+ }
229
+ ```
230
+
231
+ ### Claude Desktop
232
+
233
+ Open Settings > Developer > Edit Config (`claude_desktop_config.json`):
234
+
235
+ ```json
236
+ {
237
+ "mcpServers": {
238
+ "brandsystem": {
239
+ "command": "npx",
240
+ "args": ["-y", "@brandsystem/mcp"]
241
+ }
242
+ }
243
+ }
244
+ ```
245
+
246
+ ### Claude Chat (no MCP)
247
+
248
+ If you are using Claude Chat without MCP support:
249
+
250
+ 1. Run the pipeline in a code environment first to generate `brand-report.html`
251
+ 2. Upload the HTML file to your Claude Chat conversation
252
+ 3. Say: "Use this as my brand guidelines for everything we create"
253
+
254
+ The report HTML is self-contained and works as a standalone brand reference in any AI tool.
255
+
256
+ ---
257
+
258
+ ## Troubleshooting
259
+
260
+ ### "No .brand/ directory found"
261
+
262
+ Every tool except `brand_start`, `brand_init`, and `brand_feedback` requires a `.brand/` directory. Run `brand_start` first.
263
+
264
+ ### Empty extraction (no colors or fonts found)
265
+
266
+ This usually means the website loads CSS dynamically via JavaScript. `brand_extract_web` only parses static CSS from `<style>` blocks and linked stylesheets. Solutions:
267
+
268
+ - **Try a different page** that uses more inline/linked CSS (e.g., the homepage, a blog post)
269
+ - **Use Figma extraction** (`brand_extract_figma`) for higher accuracy
270
+ - **Set values manually** using `brand_clarify` after extraction
271
+
272
+ ### Figma extraction fails
273
+
274
+ `brand_extract_figma` doesn't connect to Figma directly. It works in two phases:
275
+
276
+ 1. **Plan** returns instructions for what data to fetch (variables, styles, logo)
277
+ 2. **Ingest** processes data you pass back from the Figma MCP tools
278
+
279
+ Make sure you have a separate Figma MCP server connected (e.g., `@anthropics/figma-mcp`) and pass the fetched data to `brand_extract_figma` in ingest mode.
280
+
281
+ ### Logo not detected
282
+
283
+ Web extraction looks for `<img>`, `<svg>`, and `<link rel="icon">` elements. If your logo is rendered via JavaScript or embedded as a CSS background, use `brand_set_logo` to add it manually with SVG markup, a URL, or a data URI.
284
+
285
+ ### "Response size exceeds 5K target" (console warning)
286
+
287
+ This is a soft warning, not an error. Some tools (brand_write, brand_deepen_identity) return rich conversation guides that exceed 5K characters. The hard limit is 50K, which triggers truncation.
288
+
289
+ ### Server won't start
290
+
291
+ ```bash
292
+ # Verify Node.js >= 18
293
+ node --version
294
+
295
+ # Test the server manually
296
+ npx @brandsystem/mcp
297
+
298
+ # Check for port conflicts (stdio transport shouldn't have any)
299
+ # The server uses stdio, not HTTP -- it reads from stdin and writes to stdout
300
+ ```
301
+
302
+ ---
303
+
304
+ ## How It Works
305
+
306
+ ### Confidence Scoring
307
+
308
+ Every extracted value carries a confidence level:
309
+
310
+ | Level | Meaning | Token Behavior |
311
+ |-------|---------|----------------|
312
+ | `confirmed` | Human-verified | Included in tokens |
313
+ | `high` | Strong signal (e.g., Figma variable, CSS custom property named `--brand-primary`) | Included in tokens |
314
+ | `medium` | Reasonable inference (e.g., most-frequent chromatic color in CSS) | Included in tokens |
315
+ | `low` | Weak signal (e.g., color appears once in a generic property) | Excluded from tokens, added to `needs-clarification.yaml` |
316
+
317
+ ### Source Precedence
318
+
319
+ When the same brand element is found in multiple sources, the higher-precedence source wins:
320
+
321
+ ```
322
+ figma > manual > web
323
+ ```
324
+
325
+ A Figma-sourced primary color will replace a web-extracted one. A manually confirmed value overrides both automated sources. Within the same source, higher confidence wins.
326
+
327
+ ### Web Extraction
328
+
329
+ `brand_extract_web` fetches the target URL and:
330
+
331
+ 1. Parses all `<style>` blocks and up to 5 linked stylesheets
332
+ 2. Extracts color values from CSS properties and custom properties
333
+ 3. Infers color roles from property names (e.g., `--primary`, `--brand-accent`)
334
+ 4. Promotes the most-frequent chromatic color to "primary" if no explicit primary is found
335
+ 5. Extracts font families and ranks by frequency
336
+ 6. Finds logo candidates from `<img>`, `<svg>`, and `<link rel="icon">` elements
337
+ 7. Downloads and embeds logos as inline SVG or base64 data URIs
338
+
339
+ ### Figma Extraction
340
+
341
+ `brand_extract_figma` works in two steps to bridge between the Figma MCP and brandsystem:
342
+
343
+ 1. **Plan mode** -- Returns specific instructions for what data to fetch from Figma (variables, text styles, logo components)
344
+ 2. **Ingest mode** -- Processes the collected Figma data, maps variable names to roles, and merges into `core-identity.yaml` at `high` confidence
345
+
346
+ ### DTCG Token Compilation
347
+
348
+ `brand_compile` transforms `core-identity.yaml` into [Design Tokens Community Group](https://tr.designtokens.org/format/) format:
349
+
350
+ - Colors become `$type: "color"` tokens keyed by role
351
+ - Typography becomes grouped tokens with `fontFamily`, `dimension` (size), and `fontWeight` entries
352
+ - Spacing becomes `dimension` tokens with scale values
353
+ - Each token includes `$extensions["com.brandsystem"]` with source and confidence metadata
354
+ - Only values with `medium` or higher confidence are included
355
+
356
+ ---
357
+
358
+ ## The Bigger Picture
359
+
360
+ brandsystem.app is a standalone product — it works for any brand, in any AI tool, with no external dependencies. But it's also the first-touch onramp into a larger system.
361
+
362
+ ### Relationship to Brandcode
363
+
364
+ [Brandcode](https://github.com/Brand-System/column-five-prototypes) is an end-to-end content system that governs everything from brand identity to production to measurement — and loops measurement insights back into the brand. brandsystem.app is the marketing-first entry point that creates the Brand OS, which naturally draws clients into operationalizing it within Brandcode.
365
+
366
+ ```
367
+ ┌──────────────────────┐
368
+ │ Brand OS Creation │
369
+ │ ★ brandsystem.app │
370
+ └──────────┬───────────┘
371
+ │ creates
372
+
373
+ ┌──────────────────────────────────────────────────┐
374
+ │ Brandcode │
375
+ │ │
376
+ │ Market Intelligence ──→ Brand Perspective │
377
+ │ ▲ │ │
378
+ │ │ Governance layer │
379
+ │ │ (claims, narratives, rules) │
380
+ │ │ │ │
381
+ │ │ Production engines │
382
+ │ │ (web, PDF, viz, copywriting) │
383
+ │ │ │ │
384
+ │ └──── Measurement ◄────┘ │
385
+ │ (performance → insights → loop) │
386
+ └──────────────────────────────────────────────────┘
387
+ ```
388
+
389
+ **brandsystem.app creates the Brand OS** — the first artifact of Brandcode. Colors, typography, voice, composition rules, messaging. This is valuable on its own: paste the report into any AI tool and get better brand compliance immediately.
390
+
391
+ **The pull into Brandcode comes naturally.** Once you have a Brand OS, the next questions are operational: What can we claim? How should different content types use this identity? How do we measure whether it's working? That's the Brandcode governance and production loop — Market Intelligence feeds new insights into the brand perspective, production creates governed content, measurement evaluates performance, and those insights loop back to evolve the Brand OS.
392
+
393
+ **You don't need the full loop.** brandsystem.app delivers standalone value at every session. The Brandcode ecosystem is there when you're ready to operationalize.
394
+
395
+ ### Progressive Depth
396
+
397
+ Each stage builds on the previous. Stop anywhere — you get value immediately.
398
+
399
+ | Stage | What You Get | How |
400
+ |-------|-------------|-----|
401
+ | **1. Free scan** | Brand tokens + HTML report with platform setup guides | `brand_extract_web` → `brand_compile` → `brand_report` |
402
+ | **2. MCP depth** | Figma extraction, clarification, full audit | Session 1 with `brand_extract_figma` + `brand_clarify` |
403
+ | **3. Visual identity** | Composition rules, patterns, anti-patterns, VIM | Session 2: `brand_deepen_identity` → `brand_compile` |
404
+ | **4. Core messaging** | Voice profile, perspective, brand story | Session 3: `brand_extract_messaging` → `brand_compile_messaging` |
405
+ | **5. Brandcode governance** | Claims, narratives, application rules, scoring, measurement | Operationalize the Brand OS within Brandcode |
406
+ | **6. Full loop** | Market Intelligence → production → measurement → insights back into Brand OS | Brandcode end-to-end |
407
+
408
+ Stages 1–4 are brandsystem.app. Open source, fully portable, no dependencies.
409
+
410
+ Stages 5–6 are the full Brandcode ecosystem — where the Brand OS becomes operational. Available through [Column Five Media](https://columnfivemedia.com).
411
+
412
+ ### What's Portable
413
+
414
+ | Artifact | Portable? | Owned By |
415
+ |----------|-----------|----------|
416
+ | brandsystem.app (tools) | Fully — open source, any brand | MIT license |
417
+ | `.brand/` directory (outputs) | Fully — works in any tool | Client |
418
+ | Brandcode framework (schema + workflows) | Yes — universal | Open |
419
+ | Client claims, narratives, rules | Per-instance | Client |
420
+
421
+ ---
422
+
423
+ ## Development
424
+
425
+ ```bash
426
+ # Install dependencies
427
+ npm install
428
+
429
+ # Build TypeScript
430
+ npm run build
431
+
432
+ # Watch mode for development
433
+ npm run dev
434
+
435
+ # Run tests
436
+ npm test
437
+
438
+ # Watch mode for tests
439
+ npm run test:watch
440
+
441
+ # Type check without emitting
442
+ npm run lint
443
+
444
+ # Start the server (stdio transport)
445
+ npm start
446
+ ```
447
+
448
+ ### Project Structure
449
+
450
+ ```
451
+ src/
452
+ index.ts # Entry point -- stdio transport
453
+ server.ts # MCP server creation and tool registration (28 tools)
454
+ tools/ # One file per tool (26 files, 28 tools)
455
+ brand-start.ts # Entry point (Session 1)
456
+ brand-status.ts # Progress dashboard
457
+ brand-extract-web.ts # Website extraction
458
+ brand-extract-figma.ts # Figma extraction (plan/ingest)
459
+ brand-set-logo.ts # Manual logo add/replace
460
+ brand-compile.ts # Token + VIM + runtime compilation
461
+ brand-clarify.ts # Interactive clarification
462
+ brand-audit.ts # Schema validation
463
+ brand-report.ts # HTML report generation
464
+ brand-init.ts # Low-level directory scaffolding
465
+ brand-deepen-identity.ts # Session 2: visual identity interview
466
+ brand-ingest-assets.ts # Session 2: asset cataloging
467
+ brand-preflight.ts # Session 2: HTML compliance checking
468
+ brand-extract-messaging.ts # Session 3: voice/messaging audit
469
+ brand-compile-messaging.ts # Session 3: perspective + voice interview
470
+ brand-build-personas.ts # Session 4: buyer personas
471
+ brand-build-journey.ts # Session 4: buyer journey stages
472
+ brand-build-themes.ts # Session 4: editorial themes
473
+ brand-build-matrix.ts # Session 4: messaging matrix
474
+ brand-audit-content.ts # Content scoring (0-100)
475
+ brand-check-compliance.ts # Binary pass/fail compliance gate
476
+ brand-audit-drift.ts # Batch drift detection
477
+ brand-runtime.ts # Read compiled brand runtime contract
478
+ brand-write.ts # Content generation context loader
479
+ brand-export.ts # Portable brand file export
480
+ brand-feedback.ts # Bug reports + feedback (3 tools)
481
+ lib/ # Shared utilities
482
+ brand-dir.ts # .brand/ directory I/O (YAML, JSON, markdown, assets)
483
+ confidence.ts # Confidence scoring and source precedence
484
+ css-parser.ts # CSS color and font extraction
485
+ dtcg-compiler.ts # DTCG token compilation
486
+ color-namer.ts # Human-readable color name generation
487
+ content-scorer.ts # Brand compliance scoring engine
488
+ logo-extractor.ts # Logo candidate detection
489
+ svg-resolver.ts # SVG inlining and base64 encoding
490
+ report-html.ts # HTML report generation
491
+ vim-generator.ts # Visual Identity Manifest + system integration markdown
492
+ runtime-compiler.ts # Compile brand-runtime.json from 4 source YAMLs
493
+ interaction-policy-compiler.ts # Compile interaction-policy.json (enforceable rules)
494
+ response.ts # Structured MCP response builder
495
+ version.ts # Package version reader
496
+ types/
497
+ index.ts # TypeScript type definitions
498
+ schemas/
499
+ index.ts # Zod schemas for validation (7 schema files)
500
+ bin/
501
+ brandsystem-mcp.mjs # CLI entry point
502
+ specs/
503
+ brand-runtime-schema.md # Runtime contract documentation
504
+ interaction-policy-schema.md # Interaction policy documentation
505
+ test/
506
+ lib/ # Library unit tests (9 files)
507
+ tools/ # Tool tests (2 files: export + smoke)
508
+ server.test.ts # Server creation smoke test
509
+ ```
510
+
511
+ ---
512
+
513
+ ## License
514
+
515
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/index.js";
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createServer } from "./server.js";
3
+ process.on("uncaughtException", (err) => {
4
+ console.error("[brandsystem-mcp] Uncaught exception:", err);
5
+ process.exit(1);
6
+ });
7
+ process.on("unhandledRejection", (reason) => {
8
+ console.error("[brandsystem-mcp] Unhandled rejection:", reason);
9
+ process.exit(1);
10
+ });
11
+ try {
12
+ const server = createServer();
13
+ const transport = new StdioServerTransport();
14
+ await server.connect(transport);
15
+ }
16
+ catch (err) {
17
+ console.error("[brandsystem-mcp] Failed to start server:", err);
18
+ process.exit(1);
19
+ }
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { BrandConfigData, CoreIdentityData, NeedsClarificationData, VisualIdentityData, MessagingData, ContentStrategyData, BrandRuntimeData, InteractionPolicyData } from "../schemas/index.js";
2
+ import type { TokensFileData } from "../schemas/index.js";
3
+ import type { AssetManifestEntry } from "../types/index.js";
4
+ export interface AssetManifest {
5
+ assets: AssetManifestEntry[];
6
+ }
7
+ export declare class BrandDir {
8
+ readonly root: string;
9
+ readonly brandPath: string;
10
+ private locks;
11
+ constructor(cwd: string);
12
+ private withLock;
13
+ private path;
14
+ exists(): Promise<boolean>;
15
+ scaffold(): Promise<void>;
16
+ /**
17
+ * Scaffold + write initial config and empty core identity in one call.
18
+ * Shared by brand_start and brand_init to avoid duplicated init logic.
19
+ */
20
+ initBrand(config: BrandConfigData): Promise<void>;
21
+ private readYaml;
22
+ private writeYaml;
23
+ private readJson;
24
+ private writeJson;
25
+ readConfig(): Promise<BrandConfigData>;
26
+ writeConfig(data: BrandConfigData): Promise<void>;
27
+ readCoreIdentity(): Promise<CoreIdentityData>;
28
+ writeCoreIdentity(data: CoreIdentityData): Promise<void>;
29
+ readTokens(): Promise<TokensFileData>;
30
+ writeTokens(data: Record<string, unknown>): Promise<void>;
31
+ readClarifications(): Promise<NeedsClarificationData>;
32
+ writeClarifications(data: NeedsClarificationData): Promise<void>;
33
+ readVisualIdentity(): Promise<VisualIdentityData>;
34
+ writeVisualIdentity(data: VisualIdentityData): Promise<void>;
35
+ hasVisualIdentity(): Promise<boolean>;
36
+ writeMarkdown(filename: string, content: string): Promise<void>;
37
+ readMarkdown(filename: string): Promise<string>;
38
+ readMessaging(): Promise<MessagingData>;
39
+ writeMessaging(data: MessagingData): Promise<void>;
40
+ hasMessaging(): Promise<boolean>;
41
+ readStrategy(): Promise<ContentStrategyData>;
42
+ writeStrategy(data: ContentStrategyData): Promise<void>;
43
+ hasStrategy(): Promise<boolean>;
44
+ readRuntime(): Promise<BrandRuntimeData>;
45
+ writeRuntime(data: unknown): Promise<void>;
46
+ readPolicy(): Promise<InteractionPolicyData>;
47
+ writePolicy(data: unknown): Promise<void>;
48
+ hasRuntime(): Promise<boolean>;
49
+ listAssets(subdir: string): Promise<string[]>;
50
+ listAssetDirs(): Promise<string[]>;
51
+ writeAsset(relativePath: string, content: string | Buffer): Promise<void>;
52
+ readAsset(relativePath: string): Promise<string>;
53
+ readManifest(subdir: string): Promise<AssetManifest>;
54
+ writeManifest(subdir: string, data: AssetManifest): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=brand-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-dir.d.ts","sourceRoot":"","sources":["../../src/lib/brand-dir.ts"],"names":[],"mappings":"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"}