@wix/mcp 1.0.93 → 1.0.95

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 (84) hide show
  1. package/README.md +2 -2
  2. package/build/bin-standalone.js +1200 -455
  3. package/build/cjs/index.cjs +3237 -1264
  4. package/build/cjs/toolkit.cjs +2177 -469
  5. package/build/dts/api-call/headless-release.d.ts +56 -0
  6. package/build/dts/api-call/headless-release.js +135 -0
  7. package/build/dts/api-call/index.d.ts +9 -1
  8. package/build/dts/api-call/index.js +19 -10
  9. package/build/dts/api-call/site-files.d.ts +42 -0
  10. package/build/dts/api-call/site-files.js +290 -0
  11. package/build/dts/api-call/upload-headless-website-files.d.ts +118 -0
  12. package/build/dts/api-call/upload-headless-website-files.js +624 -0
  13. package/build/dts/api-call/upload-image-tool.d.ts +2 -0
  14. package/build/dts/api-call/upload-image-tool.js +8 -4
  15. package/build/dts/bin.d.ts +1 -1
  16. package/build/dts/bin.js +4 -5
  17. package/build/dts/code-mode/attachments.js +1 -1
  18. package/build/dts/code-mode/index.d.ts +6 -1
  19. package/build/dts/code-mode/index.js +47 -13
  20. package/build/dts/code-mode/truncate-response.js +5 -1
  21. package/build/dts/config/default-config.d.ts +35 -9
  22. package/build/dts/config/default-config.js +348 -207
  23. package/build/dts/config/file-params.d.ts +22 -0
  24. package/build/dts/config/file-params.js +24 -0
  25. package/build/dts/config/param-descriptions.d.ts +14 -2
  26. package/build/dts/config/param-descriptions.js +34 -15
  27. package/build/dts/constants.d.ts +1 -0
  28. package/build/dts/constants.js +1 -0
  29. package/build/dts/docs/docs.d.ts +16 -3
  30. package/build/dts/docs/docs.js +211 -39
  31. package/build/dts/docs/fetch-article.d.ts +21 -0
  32. package/build/dts/docs/fetch-article.js +70 -5
  33. package/build/dts/docs/get-to-know.d.ts +7 -2
  34. package/build/dts/docs/get-to-know.js +37 -15
  35. package/build/dts/docs/mintlify-docs.d.ts +121 -0
  36. package/build/dts/docs/mintlify-docs.js +391 -0
  37. package/build/dts/docs/semanticSearch.d.ts +2 -1
  38. package/build/dts/docs/semanticSearch.js +14 -7
  39. package/build/dts/docs/start-deploy-website.d.ts +7 -6
  40. package/build/dts/docs/start-deploy-website.js +13 -8
  41. package/build/dts/docs/start-headless-build.d.ts +17 -0
  42. package/build/dts/docs/start-headless-build.js +60 -0
  43. package/build/dts/graphql/index.js +3 -1
  44. package/build/dts/import-claude-design-tool/index.js +2 -2
  45. package/build/dts/index.d.ts +3 -2
  46. package/build/dts/index.js +3 -2
  47. package/build/dts/infra/redact-personal-data.d.ts +4 -0
  48. package/build/dts/infra/redact-personal-data.js +79 -0
  49. package/build/dts/site-widget-tools/constants.d.ts +49 -1
  50. package/build/dts/site-widget-tools/constants.js +64 -7
  51. package/build/dts/site-widget-tools/index.d.ts +1 -0
  52. package/build/dts/site-widget-tools/index.js +1 -0
  53. package/build/dts/site-widget-tools/pick-images-tool/index.d.ts +14 -0
  54. package/build/dts/site-widget-tools/pick-images-tool/index.js +138 -0
  55. package/build/dts/site-widget-tools/search-site-templates-tool/index.js +33 -9
  56. package/build/dts/site-widget-tools/site-builder-tool/index.js +22 -2
  57. package/build/dts/site-widget-tools/site-creation-tool/index.d.ts +7 -1
  58. package/build/dts/site-widget-tools/site-creation-tool/index.js +22 -51
  59. package/build/dts/site-widget-tools/suggested-domain-tool/index.js +6 -3
  60. package/build/dts/support/index.d.ts +4 -0
  61. package/build/dts/support/index.js +13 -7
  62. package/build/dts/toolkit-entry.d.cts +19 -12
  63. package/build/dts/toolkit-entry.d.ts +19 -12
  64. package/build/dts/toolkit.d.ts +2 -2
  65. package/build/dts/toolkit.js +23 -7
  66. package/build/dts/wix-mcp-server.d.ts +11 -0
  67. package/build/dts/wix-mcp-server.js +28 -6
  68. package/build/dts/wixel/constants.d.ts +8 -1
  69. package/build/dts/wixel/constants.js +8 -1
  70. package/build/dts/wixel/index.d.ts +1 -1
  71. package/build/dts/wixel/index.js +2 -2
  72. package/build/dts/wixel/wixel-a2a-client.d.ts +83 -0
  73. package/build/dts/wixel/wixel-a2a-client.js +166 -0
  74. package/build/dts/wixel/wixel-bi.d.ts +2 -1
  75. package/build/dts/wixel/wixel-bi.js +2 -1
  76. package/build/dts/wixel/{external-agent-api.d.ts → wixel-session-entries.d.ts} +11 -33
  77. package/build/dts/wixel/{external-agent-api.js → wixel-session-entries.js} +33 -54
  78. package/build/dts/wixel/wixel-session-tools.d.ts +21 -26
  79. package/build/dts/wixel/wixel-session-tools.js +494 -599
  80. package/build/esm/index.js +3335 -1376
  81. package/build/esm/toolkit.js +2273 -565
  82. package/package.json +4 -4
  83. package/build/dts/docs/create-site-guide.d.ts +0 -3
  84. package/build/dts/docs/create-site-guide.js +0 -109
@@ -0,0 +1,138 @@
1
+ import { z } from 'zod';
2
+ import { RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
3
+ import { rethrowIfUnauthorized } from '../../auth/index.js';
4
+ import { getWidgetHtml } from '../../widget-manifest.js';
5
+ import { withJsonContent } from '../../tool-utils.js';
6
+ import { WixFetchError } from '../../wix-fetch-error.js';
7
+ import { defaultToolDescriptions } from '../../config/default-config.js';
8
+ import { MEDIA_UPLOAD_URL_TOOL_NAME, PICK_IMAGES_TOOL_NAME } from '../constants.js';
9
+ const PICK_IMAGES_WIDGET_URI = 'ui://widget/pick-images.html';
10
+ // The widget uploads each picked file from the user's browser straight to the
11
+ // Media Manager upload URL, so upload.wixmp.com must be reachable from it.
12
+ const PICK_IMAGES_CSP = {
13
+ connectDomains: [
14
+ 'https://upload.wixmp.com',
15
+ 'https://static.parastorage.com'
16
+ ],
17
+ resourceDomains: [
18
+ 'https://static.wixstatic.com',
19
+ 'https://static.parastorage.com',
20
+ 'data:',
21
+ 'blob:'
22
+ ]
23
+ };
24
+ const PICKER_OPEN_TEXT = "An image picker is open in the chat. The user selects images there; they upload to the site's Media Manager, and a message with each image's media ID and URL follows. Reply with one short sentence and wait for that message. If your client shows no picker, send the images with UploadImageToWixSite as imageBase64, or ask the user for public URLs.";
25
+ const siteIdSchema = z
26
+ .string()
27
+ .uuid('siteId must be a valid Wix site ID (UUID)');
28
+ /**
29
+ * Exists only because Claude can't hand a file to a tool: recheck when it can (see
30
+ * config/file-params.ts), and drop or narrow this then.
31
+ *
32
+ * The image picker for clients that can't hand a file to a tool (Claude): the user
33
+ * picks images in a widget, which uploads them from the browser to the site's Media
34
+ * Manager through upload URLs from the app-only CreateWixMediaUploadUrl tool.
35
+ */
36
+ export function addPickImagesTools(server, strategy, options) {
37
+ server.registerResource(`${PICK_IMAGES_TOOL_NAME}_RESOURCE`, PICK_IMAGES_WIDGET_URI, {}, async (uri) => ({
38
+ contents: [
39
+ {
40
+ uri: uri.href,
41
+ _meta: { ui: { csp: PICK_IMAGES_CSP } },
42
+ mimeType: RESOURCE_MIME_TYPE,
43
+ text: getWidgetHtml({
44
+ widgetId: 'pickImages',
45
+ props: { renderMcpApps: true }
46
+ })
47
+ }
48
+ ]
49
+ }));
50
+ server.registerTool(PICK_IMAGES_TOOL_NAME, {
51
+ title: 'Pick Images to Upload to Wix',
52
+ description: options?.toolDescriptions?.[PICK_IMAGES_TOOL_NAME] ??
53
+ defaultToolDescriptions[PICK_IMAGES_TOOL_NAME],
54
+ inputSchema: {
55
+ siteId: siteIdSchema.describe('The site whose Media Manager receives the images.')
56
+ },
57
+ _meta: {
58
+ ui: {
59
+ resourceUri: PICK_IMAGES_WIDGET_URI,
60
+ visibility: ['app', 'model']
61
+ }
62
+ },
63
+ annotations: {
64
+ readOnlyHint: false,
65
+ destructiveHint: false,
66
+ openWorldHint: true
67
+ }
68
+ }, async ({ siteId }, { setToolBiParams }) => {
69
+ setToolBiParams({ siteId });
70
+ return withJsonContent({
71
+ content: [{ type: 'text', text: PICKER_OPEN_TEXT }],
72
+ structuredContent: { siteId },
73
+ _meta: { widgetPayload: { siteId } }
74
+ });
75
+ });
76
+ server.registerTool(MEDIA_UPLOAD_URL_TOOL_NAME, {
77
+ title: 'Create Wix Media Upload URL',
78
+ description: `Used by the ${PICK_IMAGES_TOOL_NAME} widget: returns a one-time URL the widget uploads one picked image to. Not for direct use.`,
79
+ inputSchema: {
80
+ siteId: siteIdSchema,
81
+ fileName: z.string().min(1).max(200),
82
+ mimeType: z
83
+ .string()
84
+ .regex(/^image\//, 'Only images can be uploaded here'),
85
+ sizeInBytes: z.number().int().positive().optional()
86
+ },
87
+ _meta: { ui: { visibility: ['app'] } },
88
+ annotations: {
89
+ readOnlyHint: false,
90
+ destructiveHint: false,
91
+ openWorldHint: true
92
+ }
93
+ }, async ({ siteId, fileName, mimeType, sizeInBytes }, { setToolBiParams }) => {
94
+ setToolBiParams({ siteId });
95
+ try {
96
+ const authHeaders = await strategy.getSiteAuthHeaders(siteId);
97
+ const res = await fetch('https://www.wixapis.com/site-media/v1/files/generate-upload-url', {
98
+ method: 'POST',
99
+ headers: { ...authHeaders, 'Content-Type': 'application/json' },
100
+ body: JSON.stringify({
101
+ mimeType,
102
+ fileName,
103
+ ...(sizeInBytes ? { sizeInBytes: String(sizeInBytes) } : {})
104
+ })
105
+ });
106
+ if (!res.ok) {
107
+ throw new WixFetchError(res.status, res.statusText, await res.text());
108
+ }
109
+ const { uploadUrl } = (await res.json());
110
+ if (!uploadUrl) {
111
+ throw new Error('Wix returned no upload URL');
112
+ }
113
+ // The URL is a one-time upload grant: never in the text content, which BI
114
+ // records as the result preview. _meta carries it for hosts that drop
115
+ // structuredContent.
116
+ return {
117
+ content: [{ type: 'text', text: 'Upload URL created.' }],
118
+ structuredContent: { uploadUrl },
119
+ _meta: { uploadUrl }
120
+ };
121
+ }
122
+ catch (error) {
123
+ rethrowIfUnauthorized(error);
124
+ await strategy.enforceValidWixToken?.(error);
125
+ const message = error instanceof Error ? error.message : String(error);
126
+ return {
127
+ isError: true,
128
+ content: [
129
+ {
130
+ type: 'text',
131
+ text: `Failed to create an upload URL: ${message}`
132
+ }
133
+ ]
134
+ };
135
+ }
136
+ });
137
+ }
138
+ //# sourceMappingURL=index.js.map
@@ -6,7 +6,7 @@ import { Type, TemplateBuilder } from '@wix/ambassador-funnel-templates-gallery-
6
6
  import { getWidgetHtml } from '../../widget-manifest.js';
7
7
  import { RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
8
8
  import { defaultToolDescriptions } from '../../config/default-config.js';
9
- import { SEARCH_SITE_TEMPLATES_TOOL_NAME, CREATE_SITE_FROM_TEMPLATE_TOOL_NAME, SITE_WIDGET_MCP_CSP, OPEN_AI_SITE_WIDGET_CSP } from '../constants.js';
9
+ import { EDITOR_NOT_REQUESTED_MESSAGE, NOT_REQUESTED_WIDGET_PAYLOAD, SEARCH_SITE_TEMPLATES_TOOL_NAME, CREATE_SITE_FROM_TEMPLATE_TOOL_NAME, SITE_WIDGET_MCP_CSP, OPEN_AI_SITE_WIDGET_CSP } from '../constants.js';
10
10
  import { withJsonContent } from '../../tool-utils.js';
11
11
  // baseURL pins the host so the ambassador resolves to the public template-search
12
12
  // endpoint: https://www.wix.com/_api/template-cms-view-service/view/v2/templates/search
@@ -21,7 +21,8 @@ const BLANK_CANVAS_IMAGE_URL = 'https://images-wixmp-530a50041672c69d335ba4cf.wi
21
21
  const BLANK_CANVAS_DESCRIPTION = 'This Blank Canvas Responsive Template is ready to be customized to your exact needs.';
22
22
  const BLANK_CANVAS_META_SITE_ID = {
23
23
  studio: 'fe86a14e-ef67-49b4-a409-d086f3abaa1a',
24
- harmony: '91532250-8835-46ac-9666-e4db8770b275'
24
+ harmony: '91532250-8835-46ac-9666-e4db8770b275',
25
+ classic: 'b55bdf43-95e0-4cef-b9bb-92dcc7af2742'
25
26
  };
26
27
  /**
27
28
  * Searches Wix templates server-side. Widget clients render a gallery to pick from
@@ -55,9 +56,9 @@ export function addSearchSiteTemplatesTool(server, _authStrategy, options) {
55
56
  defaultToolDescriptions[SEARCH_SITE_TEMPLATES_TOOL_NAME],
56
57
  inputSchema: {
57
58
  builder: z
58
- .enum(['harmony', 'studio'])
59
+ .enum(['harmony', 'studio', 'classic'])
59
60
  .default('harmony')
60
- .describe('Which builder\'s templates to return: "studio" if the user asked for Wix Studio in this site creation flow, otherwise "harmony" (the default). You choose this from the request — don\'t ask the user which builder.'),
61
+ .describe('Which builder\'s templates to return: "studio" if the user asked for Wix Studio in this site creation flow, "classic" if they asked for the Classic Editor (the Wix Editor), otherwise "harmony" (the default). You choose this from the request — don\'t ask the user which builder.'),
61
62
  query: z
62
63
  .string()
63
64
  .min(1)
@@ -68,7 +69,11 @@ export function addSearchSiteTemplatesTool(server, _authStrategy, options) {
68
69
  .min(1)
69
70
  .max(MAX_TEMPLATE_RESULTS)
70
71
  .optional()
71
- .describe(`Maximum number of templates to return (capped at ${MAX_TEMPLATE_RESULTS}).`)
72
+ .describe(`Maximum number of templates to return (capped at ${MAX_TEMPLATE_RESULTS}).`),
73
+ templatesExplicitlyRequested: z
74
+ .boolean()
75
+ .optional()
76
+ .describe("Did the user, in their own words or their answer to your question, ask for a template, Wix Studio, or the Classic Editor by name? Wanting Wix's editor, or to design the site themselves, is not that: ask them how to start first. Nor are a site's business, features or look.")
72
77
  },
73
78
  _meta: {
74
79
  ui: {
@@ -85,6 +90,16 @@ export function addSearchSiteTemplatesTool(server, _authStrategy, options) {
85
90
  idempotentHint: true
86
91
  }
87
92
  }, async (args, { panorama }) => {
93
+ // Only an explicit false is refused: clients that hold the previous definition never send the flag.
94
+ if (args.templatesExplicitlyRequested === false) {
95
+ return withJsonContent({
96
+ content: [
97
+ { type: 'text', text: EDITOR_NOT_REQUESTED_MESSAGE }
98
+ ],
99
+ structuredContent: { success: false, status: 'not_requested' },
100
+ _meta: { widgetPayload: NOT_REQUESTED_WIDGET_PAYLOAD }
101
+ });
102
+ }
88
103
  const limit = args.limit ?? MAX_TEMPLATE_RESULTS;
89
104
  console.log(`[${SEARCH_SITE_TEMPLATES_TOOL_NAME}] 🚀 tool invoked`, {
90
105
  builder: args.builder,
@@ -185,10 +200,19 @@ function blankCanvasCard(builder) {
185
200
  };
186
201
  }
187
202
  async function searchSiteTemplates(builder, query, limit) {
188
- // Studio is selected via bookType; Harmony via the templateBuilders filter.
189
- const builderParams = builder === 'harmony'
190
- ? { filter: { templateBuilders: [TemplateBuilder.Harmony] } }
191
- : { bookType: 'studio' };
203
+ // Studio is selected via bookType; Harmony and the Classic Editor via the
204
+ // templateBuilders filter (bookType "main-v2" now returns Harmony templates).
205
+ const builderParams = builder === 'studio'
206
+ ? { bookType: 'studio' }
207
+ : {
208
+ filter: {
209
+ templateBuilders: [
210
+ builder === 'classic'
211
+ ? TemplateBuilder.Editor
212
+ : TemplateBuilder.Harmony
213
+ ]
214
+ }
215
+ };
192
216
  const response = await httpClient.request(searchTemplates({
193
217
  language: 'en',
194
218
  query: query.trim(),
@@ -2,7 +2,7 @@ import { z } from 'zod';
2
2
  import { createHttpClient } from '@wix/http-client';
3
3
  import { getWidgetHtml } from '../../widget-manifest.js';
4
4
  import { RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
5
- import { SITE_BUILDER_TOOL_NAME, SITE_WIDGET_MCP_CSP, OPEN_AI_SITE_WIDGET_CSP, OPENAI_WIDGET_MIME_TYPE } from '../constants.js';
5
+ import { EDITOR_NOT_REQUESTED_MESSAGE, NOT_REQUESTED_WIDGET_PAYLOAD, SITE_BUILDER_TOOL_NAME, SITE_WIDGET_MCP_CSP, OPEN_AI_SITE_WIDGET_CSP, OPENAI_WIDGET_MIME_TYPE } from '../constants.js';
6
6
  import { defaultToolDescriptions } from '../../config/default-config.js';
7
7
  import { withJsonContent } from '../../tool-utils.js';
8
8
  const httpClient = createHttpClient();
@@ -67,7 +67,11 @@ export function addCreateSiteWidgetTool(server, authStrategy, options) {
67
67
  suggestedSiteName: z
68
68
  .string()
69
69
  .optional()
70
- .describe('You must provide this on every call, including updates to an existing job, in English. A short name for the site: the business name the user gave, or one you derive from the site prompt.')
70
+ .describe('You must provide this on every call, including updates to an existing job, in English. A short name for the site: the business name the user gave, or one you derive from the site prompt.'),
71
+ wixEditorExplicitlyRequested: z
72
+ .boolean()
73
+ .optional()
74
+ .describe("Did the user, in their own words or their answer to your question, ask for the Wix Harmony Editor, or for Wix to design the site? Wanting Wix's editor, or to design the site themselves, is not that: ask them how to start first. Nor are a site's business, features or look.")
71
75
  },
72
76
  _meta: toolDefinitionMeta,
73
77
  annotations: {
@@ -77,6 +81,22 @@ export function addCreateSiteWidgetTool(server, authStrategy, options) {
77
81
  }
78
82
  }, async (args, { setToolBiParams, panorama }) => {
79
83
  const isAnonymous = authStrategy.isAnonymous?.() ?? false;
84
+ // A new build runs unless the agent says the user did not ask for it. Only an explicit
85
+ // false is refused: clients that hold the previous definition never send the flag, and
86
+ // resuming a job does not ask again.
87
+ if (!args.jobId && args.wixEditorExplicitlyRequested === false) {
88
+ return withJsonContent({
89
+ content: [
90
+ { type: 'text', text: EDITOR_NOT_REQUESTED_MESSAGE }
91
+ ],
92
+ structuredContent: {
93
+ success: false,
94
+ status: 'not_requested',
95
+ jobId: null
96
+ },
97
+ _meta: { widgetPayload: NOT_REQUESTED_WIDGET_PAYLOAD }
98
+ });
99
+ }
80
100
  console.log(`[${SITE_BUILDER_TOOL_NAME}] 🚀 tool invoked`, {
81
101
  ...args,
82
102
  isAnonymous
@@ -1,6 +1,12 @@
1
1
  import { McpAuthenticationStrategy } from '../../auth/index.js';
2
2
  import { WixMcpServer } from '../../wix-mcp-server.js';
3
3
  import { SiteWidgetToolOptions } from '../site-builder-tool/index.js';
4
- /** Entry tool for the site creation flow — opens the "create with AI" vs. "use a template" chooser widget when the build method is unstated. */
4
+ /**
5
+ * WixSiteCreation no longer opens a chooser. It keeps its name, so a client that still holds
6
+ * the previous definition never gets "tool not found", and it answers with where a new site
7
+ * goes: written in code and uploaded. Its definition carries no widget. The widget resource
8
+ * stays registered for clients whose frozen definition still points at it (ChatGPT until
9
+ * OpenAI approves this one); it renders a one-line card with a button that restarts the turn.
10
+ */
5
11
  export declare function addWixSiteCreationTool(server: WixMcpServer, _authStrategy: McpAuthenticationStrategy, options?: SiteWidgetToolOptions): void;
6
12
  //# sourceMappingURL=index.d.ts.map
@@ -1,27 +1,22 @@
1
1
  import { z } from 'zod';
2
- import { v4 as uuidv4 } from 'uuid';
3
2
  import { getWidgetHtml } from '../../widget-manifest.js';
4
3
  import { RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
5
- import { WIX_SITE_CREATION_TOOL_NAME, SITE_WIDGET_MCP_CSP, OPEN_AI_SITE_WIDGET_CSP, buildSiteCreationSelectorMessage, SITE_CREATION_CUSTOM_ACTIONS_GUIDANCE } from '../constants.js';
4
+ import { WIX_SITE_CREATION_TOOL_NAME, SITE_WIDGET_MCP_CSP, OPEN_AI_SITE_WIDGET_CSP, SITE_CREATION_ROUTE_MESSAGE } from '../constants.js';
6
5
  import { defaultToolDescriptions } from '../../config/default-config.js';
7
6
  import { withJsonContent } from '../../tool-utils.js';
8
7
  const WIX_SITE_CREATION_WIDGET_URI = 'ui://widget/wix-site-creation.html';
9
- /** Entry tool for the site creation flow — opens the "create with AI" vs. "use a template" chooser widget when the build method is unstated. */
8
+ /**
9
+ * WixSiteCreation no longer opens a chooser. It keeps its name, so a client that still holds
10
+ * the previous definition never gets "tool not found", and it answers with where a new site
11
+ * goes: written in code and uploaded. Its definition carries no widget. The widget resource
12
+ * stays registered for clients whose frozen definition still points at it (ChatGPT until
13
+ * OpenAI approves this one); it renders a one-line card with a button that restarts the turn.
14
+ */
10
15
  export function addWixSiteCreationTool(server, _authStrategy, options) {
11
- const toolDefinitionMeta = {
12
- ui: {
13
- resourceUri: WIX_SITE_CREATION_WIDGET_URI,
14
- visibility: ['app', 'model']
15
- },
16
- securitySchemes: [{ type: 'oauth2', scopes: ['offline_access'] }],
17
- 'openai/toolInvocation/invoking': 'Opening site creation...',
18
- 'openai/toolInvocation/invoked': 'Ready',
19
- 'openai/outputTemplate': WIX_SITE_CREATION_WIDGET_URI
20
- };
21
16
  const resourceMeta = {
22
17
  ui: { csp: SITE_WIDGET_MCP_CSP },
23
18
  'openai/widgetCSP': OPEN_AI_SITE_WIDGET_CSP,
24
- 'openai/widgetDescription': 'Renders the Wix site creation step: either a chooser (create with AI vs. pick a template) or a gallery of Wix Studio templates to preview and use.'
19
+ 'openai/widgetDescription': 'Says the site is being built here in chat, with a button that continues the conversation.'
25
20
  };
26
21
  server.registerResource(`${WIX_SITE_CREATION_TOOL_NAME}_RESOURCE`, WIX_SITE_CREATION_WIDGET_URI, {}, async (uri) => {
27
22
  console.log(`[${WIX_SITE_CREATION_TOOL_NAME}] Resource requested`, {
@@ -46,25 +41,23 @@ export function addWixSiteCreationTool(server, _authStrategy, options) {
46
41
  title: 'Wix Site Creation',
47
42
  description: options?.toolDescriptions?.[WIX_SITE_CREATION_TOOL_NAME] ??
48
43
  defaultToolDescriptions[WIX_SITE_CREATION_TOOL_NAME],
44
+ // The previous definition's parameters, all optional, so a call made from it still validates.
49
45
  inputSchema: {
50
46
  query: z
51
- .string()
52
- .min(1)
53
- .describe('The few most important keywords describing the site, used to search templates — e.g. "yoga studio", "wedding photographer".'),
54
- sitePrompt: z
55
- .string()
56
- .min(1)
57
- .describe('The prompt to build the site. If not provided, the user will be asked to provide a prompt.'),
58
- suggestedSiteName: z
59
47
  .string()
60
48
  .optional()
61
- .describe('Suggested site name based on the request, used alongside sitePrompt if the user picks "Create with AI".'),
62
- customActions: z
49
+ .describe('A few keywords describing the site.'),
50
+ sitePrompt: z
63
51
  .string()
64
52
  .optional()
65
- .describe(SITE_CREATION_CUSTOM_ACTIONS_GUIDANCE)
53
+ .describe('A description of the site.'),
54
+ suggestedSiteName: z.string().optional().describe('A site name.'),
55
+ customActions: z.string().optional().describe('Unused.'),
56
+ editorChosen: z.boolean().optional().describe('Unused.')
57
+ },
58
+ _meta: {
59
+ securitySchemes: [{ type: 'oauth2', scopes: ['offline_access'] }]
66
60
  },
67
- _meta: toolDefinitionMeta,
68
61
  annotations: {
69
62
  readOnlyHint: true,
70
63
  destructiveHint: false,
@@ -72,34 +65,12 @@ export function addWixSiteCreationTool(server, _authStrategy, options) {
72
65
  idempotentHint: true
73
66
  }
74
67
  }, async (args) => {
75
- console.log(`[${WIX_SITE_CREATION_TOOL_NAME}] 🚀 tool invoked`, {
68
+ console.log(`[${WIX_SITE_CREATION_TOOL_NAME}] routed to the code path`, {
76
69
  query: args.query
77
70
  });
78
- const widgetPayload = {
79
- query: args.query,
80
- sitePrompt: args.sitePrompt,
81
- suggestedSiteName: args.suggestedSiteName,
82
- viewUUID: uuidv4(),
83
- extras: server.getWidgetExtras()
84
- };
85
- // Reply instruction: a fixed SHAPE (question + the two options + a "Next up:" line) built
86
- // from the query (site type) and the inferred customActions, with the two option lines left
87
- // for the model to tailor to the industry. Returned as-is; the tool description also
88
- // instructs the model to write it out (both are load-bearing). Microsoft Copilot gets the
89
- // message without the preamble: its safety filter blocks the reply otherwise.
90
- const message = buildSiteCreationSelectorMessage(args.query, args.customActions, { plain: server.isMicrosoftCopilotClient() });
91
71
  return withJsonContent({
92
- content: [
93
- {
94
- type: 'text',
95
- text: message
96
- }
97
- ],
98
- structuredContent: {
99
- success: true,
100
- query: args.query
101
- },
102
- _meta: { widgetPayload }
72
+ content: [{ type: 'text', text: SITE_CREATION_ROUTE_MESSAGE }],
73
+ structuredContent: { success: true, route: 'code' }
103
74
  });
104
75
  });
105
76
  }
@@ -31,11 +31,14 @@ export function addSuggestedDomainTool(server, authStrategy) {
31
31
  server.registerTool(GET_SUGGESTED_DOMAINS_TOOL_NAME, {
32
32
  title: 'Get Suggested Domains',
33
33
  description: dedent `
34
- Suggests available domain names for a business, brand, or Wix site.
34
+ Suggests domain name ideas for a business, brand, or Wix site. Returns a list of domain names related to the input.
35
35
 
36
- Call this when the user asks for domain name ideas, wants to know which domains are available, or wants a domain for a new or existing site.
36
+ Call this when the user:
37
+ - asks for domain name ideas in general, e.g. "domain ideas for a bakery"
38
+ - wants to find a domain for their site, new or existing
39
+ - wants alternatives or variations of a domain name, e.g. "something similar to mybakery.com"
37
40
 
38
- Provide either a free-text \`query\` (the user's own words, e.g. "pancakes business", "modern yoga studio") OR a \`siteId\` to base the suggestions on that site's name. At least one of them is required.
41
+ Provide either a free-text \`query\` (e.g. "pancakes business", "modern yoga studio") OR a \`siteId\` to base the suggestions on that site's name. At least one of them is required.
39
42
 
40
43
  Present the returned domains to the user as a short list. This tool only suggests domains — it does not purchase or connect them.
41
44
  `,
@@ -1,4 +1,8 @@
1
1
  import { WixMcpServer } from '../wix-mcp-server.js';
2
2
  import { McpAuthenticationStrategy } from '../auth/index.js';
3
+ /** Sends one issue to Wix's feedback channel. */
4
+ export declare const REPORT_ISSUE_TOOL_NAME = "ReportIssueToWix";
5
+ /** The tool's former name, still honored in disableTools and toolDescriptions. */
6
+ export declare const LEGACY_REPORT_ISSUE_TOOL_NAME = "SupportAndFeedback";
3
7
  export declare function addSupportTool(server: WixMcpServer, strategy: McpAuthenticationStrategy, disableTools?: string[], toolDescriptions?: Record<string, string>): void;
4
8
  //# sourceMappingURL=index.d.ts.map
@@ -7,19 +7,25 @@ import { rethrowIfUnauthorized } from '../auth/index.js';
7
7
  // mcp-serverless /feedback web function — relays the message to the
8
8
  // #mcp-user-feedback Slack channel, attributed to the calling user.
9
9
  const FEEDBACK_API_URL = 'https://www.wixapis.com/mcp-serverless/v1/feedback';
10
+ /** Sends one issue to Wix's feedback channel. */
11
+ export const REPORT_ISSUE_TOOL_NAME = 'ReportIssueToWix';
12
+ /** The tool's former name, still honored in disableTools and toolDescriptions. */
13
+ export const LEGACY_REPORT_ISSUE_TOOL_NAME = 'SupportAndFeedback';
10
14
  export function addSupportTool(server, strategy, disableTools = [], toolDescriptions) {
11
- if (disableTools.includes('SupportAndFeedback')) {
15
+ if (disableTools.includes(REPORT_ISSUE_TOOL_NAME) ||
16
+ disableTools.includes(LEGACY_REPORT_ISSUE_TOOL_NAME)) {
12
17
  return;
13
18
  }
14
- server.tool('SupportAndFeedback', toolDescriptions?.['SupportAndFeedback'] ??
15
- defaultToolDescriptions.SupportAndFeedback, (() => {
16
- const d = desc('SupportAndFeedback');
19
+ server.tool(REPORT_ISSUE_TOOL_NAME, toolDescriptions?.[REPORT_ISSUE_TOOL_NAME] ??
20
+ toolDescriptions?.[LEGACY_REPORT_ISSUE_TOOL_NAME] ??
21
+ defaultToolDescriptions.ReportIssueToWix, (() => {
22
+ const d = desc('ReportIssueToWix');
17
23
  return {
18
24
  message: z.string().describe(d.message),
19
25
  requestId: z.string().optional().describe(d.requestId)
20
26
  };
21
27
  })(), { readOnlyHint: false, destructiveHint: false, openWorldHint: false }, async ({ message, requestId }, { httpClient, setToolBiParams }) => {
22
- logger.log(`[SupportAndFeedback] sending feedback${requestId ? `, requestId=${requestId}` : ''}`);
28
+ logger.log(`[ReportIssueToWix] sending report${requestId ? `, requestId=${requestId}` : ''}`);
23
29
  const fullMessage = requestId
24
30
  ? `${message}\n\nrequest id: ${requestId}`
25
31
  : message;
@@ -37,7 +43,7 @@ export function addSupportTool(server, strategy, disableTools = [], toolDescript
37
43
  content: [
38
44
  {
39
45
  type: 'text',
40
- text: 'Feedback sent to Wix. Let the user know it was delivered — note that feedback cannot be replied to or tracked.'
46
+ text: 'Report sent to Wix. Let the user know it was delivered — note that reports cannot be replied to or tracked.'
41
47
  }
42
48
  ]
43
49
  };
@@ -55,7 +61,7 @@ export function addSupportTool(server, strategy, disableTools = [], toolDescript
55
61
  }
56
62
  }
57
63
  setToolBiParams({ requestId: feedbackRequestId });
58
- const errorMessage = `Failed to send feedback to Wix: ${error}.${errorDetails}${feedbackRequestId ? ` Request ID: ${feedbackRequestId}` : ''}`;
64
+ const errorMessage = `Failed to send the report to Wix: ${error}.${errorDetails}${feedbackRequestId ? ` Request ID: ${feedbackRequestId}` : ''}`;
59
65
  logger.error(errorMessage);
60
66
  throw new Error(errorMessage);
61
67
  }
@@ -107,7 +107,8 @@ declare const VALID_DOCS_TOOLS: readonly [
107
107
  "VELO",
108
108
  "BUSINESS_SOLUTIONS",
109
109
  "CLI",
110
- "OVERVIEW"
110
+ "OVERVIEW",
111
+ "HELP_CENTER"
111
112
  ];
112
113
  export type DocsTool = (typeof VALID_DOCS_TOOLS)[number];
113
114
  /**
@@ -126,9 +127,12 @@ export interface ReadmeDocConfig {
126
127
  }
127
128
  export interface DocsToolsOptions {
128
129
  getToKnowWixEnabled?: boolean;
130
+ /** @deprecated CreateWixBusinessGuide was removed (StartHeadlessBuild replaces its headless route); ignored. */
129
131
  createWixBusinessGuideEnabled?: boolean;
130
132
  /** StartDeployWebsite (publish ready-made site files) — an account-owner flow; off for visitor servers. */
131
133
  startDeployWebsiteEnabled?: boolean;
134
+ /** StartHeadlessBuild (build a new site in code) — an account-owner flow; off for visitor servers. */
135
+ startHeadlessBuildEnabled?: boolean;
132
136
  disableTools?: string[];
133
137
  /** Custom descriptions for tools, keyed by tool name */
134
138
  toolDescriptions?: Record<string, string>;
@@ -148,17 +152,27 @@ export interface DocsToolsOptions {
148
152
  commitHash?: string;
149
153
  /** Tags to filter skills by (e.g. ['velo', 'cms']) */
150
154
  skillsTags?: string[];
155
+ /** Append the management recipes list (every recipe by area, each a link to its article) to the end of WixREADME, for every client. Default true; false leaves it out, and the README then points at the wix-manage skill and the public list only. */
156
+ readmeRecipesIndexEnabled?: boolean;
151
157
  /** Enable dynamic context fetch */
152
158
  dynamicContextEnabled?: boolean;
153
159
  /** Enable partner context section in dynamic context output */
154
160
  partnerContextEnabled?: boolean;
155
- /** Whether the client is a CLI environment (e.g. Claude Code) where users can run terminal commands.
156
- * Accepts a boolean or a function for lazy evaluation (useful when client name is only known after MCP init). */
161
+ /** GetSiteContext renders the site's companion app. Off by default: only Aria (via the toolkit) needs it. */
162
+ includeCompanionApp?: boolean;
163
+ /** @deprecated Only CreateWixBusinessGuide read it, and that tool was removed; ignored. */
157
164
  cliEnabled?: boolean | (() => boolean);
158
165
  /** Use the new platformized semantic search API (POST /v1/docs/search) instead of the legacy GET endpoint */
159
166
  usePlatformizedSearch?: boolean;
160
167
  /** Use the platformized menu browse API (POST /v1/docs/menu/browse) instead of scraping the legacy get-menu-content markdown. Falls back to legacy on transport errors. */
161
168
  usePlatformizedBrowse?: boolean;
169
+ /**
170
+ * The Mintlify docs site (see ./mintlify-docs.ts). Off by default.
171
+ * `'mintlify'`: REST and SDK search read the Mintlify KBs, and articles are
172
+ * read from Mintlify's `.md`. `'mintlify-links'`: search reads today's KBs and
173
+ * resolves the links in tool output to the Mintlify site.
174
+ */
175
+ docsSite?: string;
162
176
  }
163
177
  export interface ToolHintsConfig {
164
178
  readOnlyHint?: boolean;
@@ -256,8 +270,8 @@ export interface WixToolkitApiConfig {
256
270
  toolHints?: Record<string, ToolHintsConfig>;
257
271
  /**
258
272
  * Max response size in chars before truncation. Applies to CallWixSiteAPI/
259
- * ListWixSites/ManageWixSite (default: 50,000) and to ExecuteWixAPI/
260
- * SearchWixAPISpec (default: 24,000). Always clamped to a hard ceiling
273
+ * ListWixSites/ManageWixSite (default: 50,000), ExecuteWixAPI (default:
274
+ * 100,000) and SearchWixAPISpec (default: 64,000). Always clamped to a hard ceiling
261
275
  * regardless of what's requested here — see MAX_ALLOWED_RESPONSE_CHARS.
262
276
  */
263
277
  maxResponseSize?: number;
@@ -414,13 +428,6 @@ export declare const SYSTEM_REMINDER: string;
414
428
  */
415
429
  export declare const defaultToolDescriptions: Record<string, string>;
416
430
  export declare const executeCodeModeToolDescriptions: Record<string, string>;
417
- /**
418
- * Default readme docs - content for WixREADME tool response.
419
- * Assumes both ExecuteWixAPI and SearchWixAPISpec are available (execute-and-search mode).
420
- *
421
- * Joined rather than interpolated into one `dedent` — `dedent` reads indentation from the literal
422
- * parts only, so a multi-line interpolation gets flattened.
423
- */
424
431
  export declare const defaultReadmeDocs: ReadmeDocConfig$1[];
425
432
  /**
426
433
  * Merge base config with overrides
@@ -107,7 +107,8 @@ declare const VALID_DOCS_TOOLS: readonly [
107
107
  "VELO",
108
108
  "BUSINESS_SOLUTIONS",
109
109
  "CLI",
110
- "OVERVIEW"
110
+ "OVERVIEW",
111
+ "HELP_CENTER"
111
112
  ];
112
113
  export type DocsTool = (typeof VALID_DOCS_TOOLS)[number];
113
114
  /**
@@ -126,9 +127,12 @@ export interface ReadmeDocConfig {
126
127
  }
127
128
  export interface DocsToolsOptions {
128
129
  getToKnowWixEnabled?: boolean;
130
+ /** @deprecated CreateWixBusinessGuide was removed (StartHeadlessBuild replaces its headless route); ignored. */
129
131
  createWixBusinessGuideEnabled?: boolean;
130
132
  /** StartDeployWebsite (publish ready-made site files) — an account-owner flow; off for visitor servers. */
131
133
  startDeployWebsiteEnabled?: boolean;
134
+ /** StartHeadlessBuild (build a new site in code) — an account-owner flow; off for visitor servers. */
135
+ startHeadlessBuildEnabled?: boolean;
132
136
  disableTools?: string[];
133
137
  /** Custom descriptions for tools, keyed by tool name */
134
138
  toolDescriptions?: Record<string, string>;
@@ -148,17 +152,27 @@ export interface DocsToolsOptions {
148
152
  commitHash?: string;
149
153
  /** Tags to filter skills by (e.g. ['velo', 'cms']) */
150
154
  skillsTags?: string[];
155
+ /** Append the management recipes list (every recipe by area, each a link to its article) to the end of WixREADME, for every client. Default true; false leaves it out, and the README then points at the wix-manage skill and the public list only. */
156
+ readmeRecipesIndexEnabled?: boolean;
151
157
  /** Enable dynamic context fetch */
152
158
  dynamicContextEnabled?: boolean;
153
159
  /** Enable partner context section in dynamic context output */
154
160
  partnerContextEnabled?: boolean;
155
- /** Whether the client is a CLI environment (e.g. Claude Code) where users can run terminal commands.
156
- * Accepts a boolean or a function for lazy evaluation (useful when client name is only known after MCP init). */
161
+ /** GetSiteContext renders the site's companion app. Off by default: only Aria (via the toolkit) needs it. */
162
+ includeCompanionApp?: boolean;
163
+ /** @deprecated Only CreateWixBusinessGuide read it, and that tool was removed; ignored. */
157
164
  cliEnabled?: boolean | (() => boolean);
158
165
  /** Use the new platformized semantic search API (POST /v1/docs/search) instead of the legacy GET endpoint */
159
166
  usePlatformizedSearch?: boolean;
160
167
  /** Use the platformized menu browse API (POST /v1/docs/menu/browse) instead of scraping the legacy get-menu-content markdown. Falls back to legacy on transport errors. */
161
168
  usePlatformizedBrowse?: boolean;
169
+ /**
170
+ * The Mintlify docs site (see ./mintlify-docs.ts). Off by default.
171
+ * `'mintlify'`: REST and SDK search read the Mintlify KBs, and articles are
172
+ * read from Mintlify's `.md`. `'mintlify-links'`: search reads today's KBs and
173
+ * resolves the links in tool output to the Mintlify site.
174
+ */
175
+ docsSite?: string;
162
176
  }
163
177
  export interface ToolHintsConfig {
164
178
  readOnlyHint?: boolean;
@@ -256,8 +270,8 @@ export interface WixToolkitApiConfig {
256
270
  toolHints?: Record<string, ToolHintsConfig>;
257
271
  /**
258
272
  * Max response size in chars before truncation. Applies to CallWixSiteAPI/
259
- * ListWixSites/ManageWixSite (default: 50,000) and to ExecuteWixAPI/
260
- * SearchWixAPISpec (default: 24,000). Always clamped to a hard ceiling
273
+ * ListWixSites/ManageWixSite (default: 50,000), ExecuteWixAPI (default:
274
+ * 100,000) and SearchWixAPISpec (default: 64,000). Always clamped to a hard ceiling
261
275
  * regardless of what's requested here — see MAX_ALLOWED_RESPONSE_CHARS.
262
276
  */
263
277
  maxResponseSize?: number;
@@ -414,13 +428,6 @@ export declare const SYSTEM_REMINDER: string;
414
428
  */
415
429
  export declare const defaultToolDescriptions: Record<string, string>;
416
430
  export declare const executeCodeModeToolDescriptions: Record<string, string>;
417
- /**
418
- * Default readme docs - content for WixREADME tool response.
419
- * Assumes both ExecuteWixAPI and SearchWixAPISpec are available (execute-and-search mode).
420
- *
421
- * Joined rather than interpolated into one `dedent` — `dedent` reads indentation from the literal
422
- * parts only, so a multi-line interpolation gets flattened.
423
- */
424
431
  export declare const defaultReadmeDocs: ReadmeDocConfig$1[];
425
432
  /**
426
433
  * Merge base config with overrides
@@ -107,8 +107,8 @@ export interface WixToolkitApiConfig {
107
107
  toolHints?: Record<string, ToolHintsConfig>;
108
108
  /**
109
109
  * Max response size in chars before truncation. Applies to CallWixSiteAPI/
110
- * ListWixSites/ManageWixSite (default: 50,000) and to ExecuteWixAPI/
111
- * SearchWixAPISpec (default: 24,000). Always clamped to a hard ceiling
110
+ * ListWixSites/ManageWixSite (default: 50,000), ExecuteWixAPI (default:
111
+ * 100,000) and SearchWixAPISpec (default: 64,000). Always clamped to a hard ceiling
112
112
  * regardless of what's requested here — see MAX_ALLOWED_RESPONSE_CHARS.
113
113
  */
114
114
  maxResponseSize?: number;