user-majico-mcp 0.7.5

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 (66) hide show
  1. package/README.md +144 -0
  2. package/dist/agent-bootstrap.d.ts +8 -0
  3. package/dist/agent-bootstrap.js +21 -0
  4. package/dist/auth-prompt.d.ts +13 -0
  5. package/dist/auth-prompt.js +15 -0
  6. package/dist/client-disconnect.d.ts +4 -0
  7. package/dist/client-disconnect.js +17 -0
  8. package/dist/credentials.d.ts +40 -0
  9. package/dist/credentials.js +60 -0
  10. package/dist/http-handler.d.ts +6 -0
  11. package/dist/http-handler.js +28 -0
  12. package/dist/index.d.ts +12 -0
  13. package/dist/index.js +22 -0
  14. package/dist/present-interactive.d.ts +92 -0
  15. package/dist/present-interactive.js +479 -0
  16. package/dist/present-types.d.ts +17 -0
  17. package/dist/present-types.js +1 -0
  18. package/dist/project-relevance.d.ts +27 -0
  19. package/dist/project-relevance.js +95 -0
  20. package/dist/project-selection-hints.d.ts +16 -0
  21. package/dist/project-selection-hints.js +32 -0
  22. package/dist/project-selection.d.ts +25 -0
  23. package/dist/project-selection.js +42 -0
  24. package/dist/recommended-external-skills.d.ts +39 -0
  25. package/dist/recommended-external-skills.js +319 -0
  26. package/dist/sdk-surface.d.ts +10 -0
  27. package/dist/sdk-surface.js +24 -0
  28. package/dist/server-branding.d.ts +17 -0
  29. package/dist/server-branding.js +40 -0
  30. package/dist/server.d.ts +3 -0
  31. package/dist/server.js +24 -0
  32. package/dist/svg-preview-block.d.ts +14 -0
  33. package/dist/svg-preview-block.js +82 -0
  34. package/dist/tools/constants.d.ts +47 -0
  35. package/dist/tools/constants.js +95 -0
  36. package/dist/tools/dispatch-branding-studio.d.ts +5 -0
  37. package/dist/tools/dispatch-branding-studio.js +197 -0
  38. package/dist/tools/dispatch-pulse-blog.d.ts +3 -0
  39. package/dist/tools/dispatch-pulse-blog.js +158 -0
  40. package/dist/tools/dispatch-research-assets.d.ts +3 -0
  41. package/dist/tools/dispatch-research-assets.js +132 -0
  42. package/dist/tools/handle-tool-call-pre.d.ts +4 -0
  43. package/dist/tools/handle-tool-call-pre.js +47 -0
  44. package/dist/tools/handle-tool-call.d.ts +3 -0
  45. package/dist/tools/handle-tool-call.js +56 -0
  46. package/dist/tools/tool-call-helpers.d.ts +22 -0
  47. package/dist/tools/tool-call-helpers.js +104 -0
  48. package/dist/tools/tool-catalog.d.ts +14 -0
  49. package/dist/tools/tool-catalog.js +54 -0
  50. package/dist/tools/tool-definitions-blog-git.d.ts +2 -0
  51. package/dist/tools/tool-definitions-blog-git.js +207 -0
  52. package/dist/tools/tool-definitions-branding.d.ts +2 -0
  53. package/dist/tools/tool-definitions-branding.js +197 -0
  54. package/dist/tools/tool-definitions-research-aliases.d.ts +2 -0
  55. package/dist/tools/tool-definitions-research-aliases.js +340 -0
  56. package/dist/tools/tool-definitions-studio-pulse.d.ts +2 -0
  57. package/dist/tools/tool-definitions-studio-pulse.js +235 -0
  58. package/dist/tools/tool-matrix.d.ts +12 -0
  59. package/dist/tools/tool-matrix.js +36 -0
  60. package/dist/tools.d.ts +5 -0
  61. package/dist/tools.js +3 -0
  62. package/dist/ui-ux-skills.d.ts +33 -0
  63. package/dist/ui-ux-skills.js +157 -0
  64. package/dist/user-pick-policy.d.ts +18 -0
  65. package/dist/user-pick-policy.js +21 -0
  66. package/package.json +71 -0
@@ -0,0 +1,197 @@
1
+ import { ASK_USER_PROJECT_SCOPE, optionalCredentialProps, projectContextProps, } from "./constants.js";
2
+ export const BRANDING_TOOL_DEFINITIONS = [
3
+ {
4
+ name: "get_brand_profile",
5
+ description: "Get the brand profile for a Majico project (archetypes, niche intent)." +
6
+ ASK_USER_PROJECT_SCOPE,
7
+ inputSchema: {
8
+ type: "object",
9
+ properties: { ...optionalCredentialProps },
10
+ },
11
+ },
12
+ {
13
+ name: "get_design_tokens",
14
+ description: "Get design tokens (palette, fonts) for a Majico project." +
15
+ ASK_USER_PROJECT_SCOPE,
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: { ...optionalCredentialProps },
19
+ },
20
+ },
21
+ {
22
+ name: "get_logo_svg",
23
+ description: "Get the selected logo SVG and metadata for a Majico project." +
24
+ ASK_USER_PROJECT_SCOPE,
25
+ inputSchema: {
26
+ type: "object",
27
+ properties: { ...optionalCredentialProps },
28
+ },
29
+ },
30
+ {
31
+ name: "list_logo_candidates",
32
+ description: "List logo options with rendered SVG previews and pick links. Default: present numbered images and wait for user before select_logo. Exception: if user prompt explicitly asks you to choose (e.g. 'pick option 2 for me'), you may call select_logo with userDelegatedPick: true." +
33
+ ASK_USER_PROJECT_SCOPE,
34
+ inputSchema: {
35
+ type: "object",
36
+ properties: {
37
+ ...optionalCredentialProps,
38
+ flowId: {
39
+ type: "string",
40
+ description: "Optional studio flow id scope",
41
+ },
42
+ },
43
+ },
44
+ },
45
+ {
46
+ name: "select_logo",
47
+ description: "Select a logo by candidateId, templateId, or raw svg. Default: only after user picks a numbered option or Studio link (userConfirmed: true). Exception: when user prompt explicitly delegates the choice to you (e.g. 'choose the best logo'), pass userDelegatedPick: true — same turn as list_logo_candidates is OK. Creates a Cursor handoff payload.",
48
+ inputSchema: {
49
+ type: "object",
50
+ properties: {
51
+ ...optionalCredentialProps,
52
+ candidateId: { type: "string" },
53
+ templateId: { type: "string" },
54
+ svg: { type: "string" },
55
+ flowId: { type: "string" },
56
+ userConfirmed: {
57
+ type: "boolean",
58
+ description: "True when user replied with a numbered pick (1-N), confirmed in chat, or saved via browser/Studio pick.",
59
+ },
60
+ userDelegatedPick: {
61
+ type: "boolean",
62
+ description: "True when the user prompt explicitly asked you to choose (e.g. 'pick option 2 for me', 'auto-select the best match'). Do not set from heuristics or advisory hints alone.",
63
+ },
64
+ },
65
+ },
66
+ },
67
+ {
68
+ name: "get_cursor_handoff",
69
+ description: "Read pending browser→Cursor handoff (logo pick, brand apply). Call after user works in embedded browser.",
70
+ inputSchema: {
71
+ type: "object",
72
+ properties: { ...optionalCredentialProps },
73
+ },
74
+ },
75
+ {
76
+ name: "ack_cursor_handoff",
77
+ description: "Acknowledge a handoff after applying brand assets in the target repo.",
78
+ inputSchema: {
79
+ type: "object",
80
+ properties: {
81
+ ...optionalCredentialProps,
82
+ handoffId: {
83
+ type: "string",
84
+ description: "handoff.id from get_cursor_handoff",
85
+ },
86
+ },
87
+ required: ["handoffId"],
88
+ },
89
+ },
90
+ {
91
+ name: "get_guidelines",
92
+ description: "Get full brand guidelines: markdown document and LLM prompt text. Use to transmit brand guidelines into Cursor in one call." +
93
+ ASK_USER_PROJECT_SCOPE,
94
+ inputSchema: {
95
+ type: "object",
96
+ properties: { ...optionalCredentialProps },
97
+ },
98
+ },
99
+ {
100
+ name: "get_design_md",
101
+ description: "Get DESIGN.md markdown for repo drop-in (design tokens and brand context)." +
102
+ ASK_USER_PROJECT_SCOPE,
103
+ inputSchema: {
104
+ type: "object",
105
+ properties: { ...optionalCredentialProps },
106
+ },
107
+ },
108
+ {
109
+ name: "get_brand_md",
110
+ description: "Get BRAND.md agent handoff markdown (identity, voice, positioning, visual summary). Prefers enriched worker output when available." +
111
+ ASK_USER_PROJECT_SCOPE,
112
+ inputSchema: {
113
+ type: "object",
114
+ properties: { ...optionalCredentialProps },
115
+ },
116
+ },
117
+ {
118
+ name: "get_studio_canvas",
119
+ description: "Get the Studio canvas snapshot (elements, truncated agent history)." +
120
+ ASK_USER_PROJECT_SCOPE,
121
+ inputSchema: {
122
+ type: "object",
123
+ properties: { ...optionalCredentialProps },
124
+ },
125
+ },
126
+ {
127
+ name: "get_export_manifest",
128
+ description: "List exportable assets (file paths) without downloading the ZIP. Use download_export_zip for the full BRAND.md / DESIGN.md / tokens bundle." +
129
+ ASK_USER_PROJECT_SCOPE,
130
+ inputSchema: {
131
+ type: "object",
132
+ properties: { ...optionalCredentialProps },
133
+ },
134
+ },
135
+ {
136
+ name: "download_export_zip",
137
+ description: "Download the full brand export ZIP (BRAND.md, DESIGN.md, guidelines, tokens, logo SVGs). Token-gated. Returns base64 in the MCP response — decode and write files into the consumer repo." +
138
+ ASK_USER_PROJECT_SCOPE,
139
+ inputSchema: {
140
+ type: "object",
141
+ properties: { ...optionalCredentialProps },
142
+ },
143
+ },
144
+ {
145
+ name: "submit_brief",
146
+ description: "Submit a product brief and enqueue niche_research. Requires productName and oneLiner. Persists the brief server-side, deducts tokens, and starts the brand pipeline. After job completes: list_palette_options, list_logo_candidates, then get_brand_md / download_export_zip." +
147
+ ASK_USER_PROJECT_SCOPE,
148
+ inputSchema: {
149
+ type: "object",
150
+ properties: {
151
+ ...optionalCredentialProps,
152
+ productName: { type: "string", description: "Product or brand name" },
153
+ oneLiner: {
154
+ type: "string",
155
+ description: "One-line positioning statement",
156
+ },
157
+ audience: { type: "string" },
158
+ nicheKeywords: { type: "array", items: { type: "string" } },
159
+ goals: { type: "string" },
160
+ constraints: { type: "string" },
161
+ marketRealityScan: {
162
+ type: "boolean",
163
+ description: "Run competitive density scan after niche research",
164
+ },
165
+ operatingMode: {
166
+ type: "string",
167
+ description: "Studio operating mode (e.g. saas, creator)",
168
+ },
169
+ },
170
+ required: ["productName", "oneLiner"],
171
+ },
172
+ },
173
+ {
174
+ name: "list_projects",
175
+ description: "List Majico projects for the authenticated user. Returns relevantProjects (top 3–5 matches by name/description), each with id, name, description, hasBrandData, hasCanvasData. Present relevantProjects to the user when picking an existing project." +
176
+ ASK_USER_PROJECT_SCOPE,
177
+ inputSchema: {
178
+ type: "object",
179
+ properties: { ...optionalCredentialProps, ...projectContextProps },
180
+ },
181
+ },
182
+ {
183
+ name: "create_project",
184
+ description: "Create a new Majico branding project for the authenticated user. Returns project id — pass projectId on subsequent tool calls; do not paste API keys into mcp.json. Ask the user before creating — prefer list_projects when they may want an existing project.",
185
+ inputSchema: {
186
+ type: "object",
187
+ properties: {
188
+ ...optionalCredentialProps,
189
+ name: {
190
+ type: "string",
191
+ description: "Project display name, e.g. Reeldemo Ableton",
192
+ },
193
+ },
194
+ required: ["name"],
195
+ },
196
+ },
197
+ ];
@@ -0,0 +1,2 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const RESEARCH_ALIAS_TOOL_DEFINITIONS: Tool[];
@@ -0,0 +1,340 @@
1
+ import { ASK_USER_PROJECT_SCOPE, optionalCredentialProps, stableBrandMarkdownProps, } from "./constants.js";
2
+ export const RESEARCH_ALIAS_TOOL_DEFINITIONS = [
3
+ {
4
+ name: "run_niche_research",
5
+ description: "Re-enqueue niche_research when a brief already exists (e.g. after submit_brief). For new brands, prefer submit_brief — it persists the brief and starts the pipeline. Does not replace submit_brief for first-time brief submission.",
6
+ inputSchema: {
7
+ type: "object",
8
+ properties: {
9
+ ...optionalCredentialProps,
10
+ brief: { type: "object" },
11
+ marketScan: { type: "boolean" },
12
+ sourceFlowId: { type: "string" },
13
+ },
14
+ },
15
+ },
16
+ {
17
+ name: "run_market_scan",
18
+ description: "Run competitive density scan synchronously (npm/HN/GitHub legs).",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ ...optionalCredentialProps,
23
+ keywords: { type: "array", items: { type: "string" } },
24
+ productName: { type: "string" },
25
+ oneLiner: { type: "string" },
26
+ audience: { type: "string" },
27
+ },
28
+ },
29
+ },
30
+ {
31
+ name: "web_search",
32
+ description: "Run a cached web search (SearXNG/Klaut/Serper chain) for research.",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ ...optionalCredentialProps,
37
+ query: { type: "string" },
38
+ limit: { type: "number" },
39
+ },
40
+ required: ["query"],
41
+ },
42
+ },
43
+ {
44
+ name: "run_asset_research",
45
+ description: "Run ResearchLayer for a skill without generating the asset (returns synthesis + snapshot). Skills include landing-page, guideline-html, investor-pack (pitch deck + outreach), investor-one-pager, investor-data-room, social-carousel, video-demo-reel, and pipeline skills (niche-research, gtm-strategy, blog-article, etc.).",
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: {
49
+ ...optionalCredentialProps,
50
+ skillId: {
51
+ type: "string",
52
+ description: "Harness skill id, e.g. landing-page, guideline-html, investor-pack, investor-one-pager, investor-data-room.",
53
+ },
54
+ context: { type: "object" },
55
+ refresh: { type: "string", enum: ["full", "light", "auto"] },
56
+ },
57
+ required: ["skillId"],
58
+ },
59
+ },
60
+ {
61
+ name: "generate_asset",
62
+ description: "Enqueue full asset harness generation for a skill (research + backend). Common skillId values: landing-page (marketing site), guideline-html (brand guidelines HTML), investor-pack (pitch deck htmlFrame + outreach markdown — requires brand chain, palette, GTM, team, traction preflight), investor-one-pager (PDF one-pager — requires harness-investor-pack on canvas), investor-data-room (diligence checklist markdown — requires deck on canvas). Returns jobId — poll get_asset_status. investor-pack params.team / params.traction override canvas snapshots; params.includeSlides may include competition, financials, roadmap. For ask slide after deck exists, use patch_investor_ask_slide with raiseAmount + useOfFunds.",
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {
66
+ ...optionalCredentialProps,
67
+ skillId: {
68
+ type: "string",
69
+ description: "Harness skill id. investor-pack (deck + outreach), investor-one-pager (PDF), investor-data-room (checklist).",
70
+ },
71
+ elementId: { type: "string" },
72
+ flowGroupId: { type: "string" },
73
+ params: {
74
+ type: "object",
75
+ description: "Skill-specific harness params. investor-pack: team ({ members: [{ name, role, bio? }] }), traction ({ metrics?, alternativeProof? }), includeSlides (string[]).",
76
+ properties: {
77
+ team: {
78
+ type: "object",
79
+ properties: {
80
+ members: {
81
+ type: "array",
82
+ items: {
83
+ type: "object",
84
+ properties: {
85
+ name: { type: "string" },
86
+ role: { type: "string" },
87
+ bio: { type: "string" },
88
+ },
89
+ required: ["name", "role"],
90
+ },
91
+ },
92
+ },
93
+ },
94
+ traction: {
95
+ type: "object",
96
+ properties: {
97
+ metrics: {
98
+ type: "array",
99
+ items: {
100
+ type: "object",
101
+ properties: {
102
+ label: { type: "string" },
103
+ value: { type: "string" },
104
+ source: { type: "string" },
105
+ },
106
+ },
107
+ },
108
+ alternativeProof: {
109
+ type: "array",
110
+ items: {
111
+ type: "object",
112
+ properties: {
113
+ type: { type: "string" },
114
+ description: { type: "string" },
115
+ },
116
+ },
117
+ },
118
+ },
119
+ },
120
+ includeSlides: {
121
+ type: "array",
122
+ items: { type: "string" },
123
+ description: "Optional slide toggles: competition, financials, roadmap, no-competition.",
124
+ },
125
+ },
126
+ },
127
+ context: { type: "object" },
128
+ forceResearchRefresh: { type: "boolean" },
129
+ },
130
+ required: ["skillId"],
131
+ },
132
+ },
133
+ {
134
+ name: "patch_investor_ask_slide",
135
+ description: "Append an ask slide in-place on harness-investor-pack when the deck already exists. Requires raiseAmount (e.g. $2M seed) and useOfFunds array ({ label, percent }). Idempotent when ask slide is already present.",
136
+ inputSchema: {
137
+ type: "object",
138
+ properties: {
139
+ ...optionalCredentialProps,
140
+ raiseAmount: { type: "string" },
141
+ useOfFunds: {
142
+ type: "array",
143
+ items: {
144
+ type: "object",
145
+ properties: {
146
+ label: { type: "string" },
147
+ percent: { type: "number" },
148
+ },
149
+ required: ["label", "percent"],
150
+ },
151
+ },
152
+ deckElementId: {
153
+ type: "string",
154
+ description: "Optional override — defaults to harness-investor-pack element id.",
155
+ },
156
+ headline: { type: "string" },
157
+ },
158
+ required: ["raiseAmount", "useOfFunds"],
159
+ },
160
+ },
161
+ {
162
+ name: "get_asset_status",
163
+ description: "Poll harness or pipeline job status by jobId.",
164
+ inputSchema: {
165
+ type: "object",
166
+ properties: {
167
+ ...optionalCredentialProps,
168
+ jobId: { type: "string" },
169
+ },
170
+ required: ["jobId"],
171
+ },
172
+ },
173
+ {
174
+ name: "list_project_assets",
175
+ description: "List recent harness-related jobs for the project.",
176
+ inputSchema: {
177
+ type: "object",
178
+ properties: {
179
+ ...optionalCredentialProps,
180
+ skillId: { type: "string" },
181
+ limit: { type: "number" },
182
+ },
183
+ },
184
+ },
185
+ {
186
+ name: "quiver_generate_svg",
187
+ description: "Generate logo SVG via Quiver (server proxy — no API key exposed to agent).",
188
+ inputSchema: {
189
+ type: "object",
190
+ properties: {
191
+ ...optionalCredentialProps,
192
+ prompt: { type: "string" },
193
+ model: { type: "string" },
194
+ n: { type: "number" },
195
+ instructions: { type: "string" },
196
+ },
197
+ required: ["prompt"],
198
+ },
199
+ },
200
+ {
201
+ name: "quiver_vectorize_svg",
202
+ description: "Vectorize a raster image to SVG via Quiver (server proxy — no API key exposed to agent).",
203
+ inputSchema: {
204
+ type: "object",
205
+ properties: {
206
+ ...optionalCredentialProps,
207
+ imageBase64: { type: "string" },
208
+ model: { type: "string" },
209
+ autoCrop: { type: "boolean" },
210
+ targetSize: { type: "number" },
211
+ },
212
+ required: ["imageBase64"],
213
+ },
214
+ },
215
+ {
216
+ name: "brand",
217
+ description: "Alias for get_brand_profile." + ASK_USER_PROJECT_SCOPE,
218
+ inputSchema: {
219
+ type: "object",
220
+ properties: { ...optionalCredentialProps },
221
+ },
222
+ },
223
+ {
224
+ name: "design_md",
225
+ description: "Alias for get_design_md." + ASK_USER_PROJECT_SCOPE,
226
+ inputSchema: {
227
+ type: "object",
228
+ properties: { ...optionalCredentialProps },
229
+ },
230
+ },
231
+ {
232
+ name: "tokens",
233
+ description: "Alias for get_design_tokens." + ASK_USER_PROJECT_SCOPE,
234
+ inputSchema: {
235
+ type: "object",
236
+ properties: { ...optionalCredentialProps },
237
+ },
238
+ },
239
+ {
240
+ name: "guidelines",
241
+ description: "Alias for get_guidelines." + ASK_USER_PROJECT_SCOPE,
242
+ inputSchema: {
243
+ type: "object",
244
+ properties: { ...optionalCredentialProps },
245
+ },
246
+ },
247
+ {
248
+ name: "logos",
249
+ description: "Alias for list_logo_candidates." + ASK_USER_PROJECT_SCOPE,
250
+ inputSchema: {
251
+ type: "object",
252
+ properties: {
253
+ ...optionalCredentialProps,
254
+ flowId: {
255
+ type: "string",
256
+ description: "Optional studio flow id scope",
257
+ },
258
+ },
259
+ },
260
+ },
261
+ {
262
+ name: "studio",
263
+ description: "Alias for get_studio_canvas." + ASK_USER_PROJECT_SCOPE,
264
+ inputSchema: {
265
+ type: "object",
266
+ properties: { ...optionalCredentialProps },
267
+ },
268
+ },
269
+ {
270
+ name: "cursor_handoff",
271
+ description: "Alias for get_cursor_handoff.",
272
+ inputSchema: {
273
+ type: "object",
274
+ properties: { ...optionalCredentialProps },
275
+ },
276
+ },
277
+ {
278
+ name: "export_manifest",
279
+ description: "Alias for get_export_manifest." + ASK_USER_PROJECT_SCOPE,
280
+ inputSchema: {
281
+ type: "object",
282
+ properties: { ...optionalCredentialProps },
283
+ },
284
+ },
285
+ {
286
+ name: "get_ui_ux_skills",
287
+ description: "List project Cursor UI/UX skills from DB (user-editable). Seeds defaults on first fetch. Use with get_brand_md + get_design_md. Falls back to static catalog when project auth is missing." +
288
+ ASK_USER_PROJECT_SCOPE,
289
+ inputSchema: {
290
+ type: "object",
291
+ properties: { ...optionalCredentialProps },
292
+ },
293
+ },
294
+ {
295
+ name: "sync_cursor_skills",
296
+ description: "Return SKILL.md files to install under .cursor/skills/ in the consumer repo — flexible guides for on-brand UI. Call after get_brand_md + get_design_md; write files then let the agent load skills as needed." +
297
+ ASK_USER_PROJECT_SCOPE,
298
+ inputSchema: {
299
+ type: "object",
300
+ properties: { ...optionalCredentialProps },
301
+ },
302
+ },
303
+ {
304
+ name: "update_cursor_skill",
305
+ description: "Update one project Cursor skill (body, description, enabled, priority). Users can customize Majico defaults per project." +
306
+ ASK_USER_PROJECT_SCOPE,
307
+ inputSchema: {
308
+ type: "object",
309
+ properties: {
310
+ ...optionalCredentialProps,
311
+ skillSlug: {
312
+ type: "string",
313
+ description: "Skill directory slug, e.g. majico-brand-handoff",
314
+ },
315
+ name: { type: "string" },
316
+ description: { type: "string" },
317
+ bodyMd: {
318
+ type: "string",
319
+ description: "Markdown body (without YAML frontmatter)",
320
+ },
321
+ phase: {
322
+ type: "string",
323
+ enum: ["prepare", "discover", "implement", "sync", "verify"],
324
+ },
325
+ priority: { type: "number" },
326
+ enabled: { type: "boolean" },
327
+ },
328
+ required: ["skillSlug"],
329
+ },
330
+ },
331
+ {
332
+ name: "generate_brand_md",
333
+ description: "Generate a predictable BRAND.md-style markdown scaffold from explicit product inputs.",
334
+ inputSchema: {
335
+ type: "object",
336
+ properties: stableBrandMarkdownProps,
337
+ required: ["productName", "positioningConcept", "audience", "tone"],
338
+ },
339
+ },
340
+ ];
@@ -0,0 +1,2 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const STUDIO_PULSE_TOOL_DEFINITIONS: Tool[];