@elementor/editor-mcp 4.2.0-beta1 → 4.2.0-beta2
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.
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +46 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/adapters/types.ts +1 -1
- package/src/adapters/web-mcp-adapter.ts +11 -8
- package/src/init.ts +11 -6
- package/src/mcp-registry.ts +5 -5
- package/src/utils/get-model-context.ts +14 -1
- package/src/utils/register-model-context-tool.ts +15 -0
package/dist/index.d.mts
CHANGED
|
@@ -33,7 +33,7 @@ interface IMcpRegistrationAdapter {
|
|
|
33
33
|
/**
|
|
34
34
|
* Called once at startup to activate the adapter's server registrations.
|
|
35
35
|
*/
|
|
36
|
-
activate: () =>
|
|
36
|
+
activate: () => Promise<void>;
|
|
37
37
|
/**
|
|
38
38
|
* Called once per tool when addTool() is invoked.
|
|
39
39
|
*/
|
|
@@ -71,7 +71,7 @@ type ResourceList = {
|
|
|
71
71
|
|
|
72
72
|
declare const registerMcpAdapter: (adapter: IMcpRegistrationAdapter) => void;
|
|
73
73
|
declare const signalMcpReady: () => void;
|
|
74
|
-
declare const createAndRegisterAdapters: () => void
|
|
74
|
+
declare const createAndRegisterAdapters: () => Promise<void>;
|
|
75
75
|
declare const registerMcp: (mcp: McpServer, name: string) => void;
|
|
76
76
|
declare const getRegisteredMcpServers: () => Array<[string, McpServer, string]>;
|
|
77
77
|
/**
|
|
@@ -397,7 +397,7 @@ declare const installAngiePlugin: () => Promise<InstallAngieResult>;
|
|
|
397
397
|
|
|
398
398
|
declare const saveAngieConsent: () => Promise<void>;
|
|
399
399
|
|
|
400
|
-
declare function startMCPServer(): void
|
|
400
|
+
declare function startMCPServer(): Promise<void>;
|
|
401
401
|
|
|
402
402
|
declare const MCP_STYLES_APPLIED_EVENT = "elementor/mcp/styles-applied";
|
|
403
403
|
type McpStylesAppliedPayload = {
|
package/dist/index.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ interface IMcpRegistrationAdapter {
|
|
|
33
33
|
/**
|
|
34
34
|
* Called once at startup to activate the adapter's server registrations.
|
|
35
35
|
*/
|
|
36
|
-
activate: () =>
|
|
36
|
+
activate: () => Promise<void>;
|
|
37
37
|
/**
|
|
38
38
|
* Called once per tool when addTool() is invoked.
|
|
39
39
|
*/
|
|
@@ -71,7 +71,7 @@ type ResourceList = {
|
|
|
71
71
|
|
|
72
72
|
declare const registerMcpAdapter: (adapter: IMcpRegistrationAdapter) => void;
|
|
73
73
|
declare const signalMcpReady: () => void;
|
|
74
|
-
declare const createAndRegisterAdapters: () => void
|
|
74
|
+
declare const createAndRegisterAdapters: () => Promise<void>;
|
|
75
75
|
declare const registerMcp: (mcp: McpServer, name: string) => void;
|
|
76
76
|
declare const getRegisteredMcpServers: () => Array<[string, McpServer, string]>;
|
|
77
77
|
/**
|
|
@@ -397,7 +397,7 @@ declare const installAngiePlugin: () => Promise<InstallAngieResult>;
|
|
|
397
397
|
|
|
398
398
|
declare const saveAngieConsent: () => Promise<void>;
|
|
399
399
|
|
|
400
|
-
declare function startMCPServer(): void
|
|
400
|
+
declare function startMCPServer(): Promise<void>;
|
|
401
401
|
|
|
402
402
|
declare const MCP_STYLES_APPLIED_EVENT = "elementor/mcp/styles-applied";
|
|
403
403
|
type McpStylesAppliedPayload = {
|
package/dist/index.js
CHANGED
|
@@ -168,6 +168,17 @@ var AngieMcpAdapter = class {
|
|
|
168
168
|
// src/adapters/web-mcp-adapter.ts
|
|
169
169
|
var import_zod_to_json_schema = require("zod-to-json-schema");
|
|
170
170
|
var import_schema = require("@elementor/schema");
|
|
171
|
+
|
|
172
|
+
// src/utils/register-model-context-tool.ts
|
|
173
|
+
async function registerModelContextTool(registerTool, tool) {
|
|
174
|
+
try {
|
|
175
|
+
await Promise.resolve(registerTool(tool));
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error("Tool registration failed:", error);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// src/adapters/web-mcp-adapter.ts
|
|
171
182
|
var WebMCPAdapter = class {
|
|
172
183
|
constructor(ctx) {
|
|
173
184
|
this.ctx = ctx;
|
|
@@ -177,10 +188,10 @@ var WebMCPAdapter = class {
|
|
|
177
188
|
activated = false;
|
|
178
189
|
activate() {
|
|
179
190
|
if (this.activated) {
|
|
180
|
-
return;
|
|
191
|
+
return Promise.resolve();
|
|
181
192
|
}
|
|
182
193
|
this.activated = true;
|
|
183
|
-
this.ctx.registerTool
|
|
194
|
+
return registerModelContextTool(this.ctx.registerTool, {
|
|
184
195
|
name: "editor-resource-getter",
|
|
185
196
|
description: "Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.",
|
|
186
197
|
inputSchema: {
|
|
@@ -237,7 +248,8 @@ ${available}`);
|
|
|
237
248
|
jsonSchema = tool.inputSchema;
|
|
238
249
|
}
|
|
239
250
|
if (this.registeredToolNames.has(tool.name)) {
|
|
240
|
-
this.ctx.unregisterTool(tool.name);
|
|
251
|
+
this.ctx.unregisterTool?.(tool.name);
|
|
252
|
+
this.registeredToolNames.delete(tool.name);
|
|
241
253
|
}
|
|
242
254
|
let resourcesDescription = "";
|
|
243
255
|
if (extraData) {
|
|
@@ -257,13 +269,14 @@ ${extraData.requiredResources?.join("\n")}
|
|
|
257
269
|
|
|
258
270
|
`;
|
|
259
271
|
}
|
|
260
|
-
this.ctx.registerTool
|
|
272
|
+
void registerModelContextTool(this.ctx.registerTool, {
|
|
261
273
|
name: tool.name,
|
|
262
274
|
description: `${resourcesDescription}${tool.description}`,
|
|
263
275
|
inputSchema: jsonSchema,
|
|
264
276
|
execute: tool.execute
|
|
277
|
+
}).then(() => {
|
|
278
|
+
this.registeredToolNames.add(tool.name);
|
|
265
279
|
});
|
|
266
|
-
this.registeredToolNames.add(tool.name);
|
|
267
280
|
}
|
|
268
281
|
onResourceRegistered(_name, uriOrTemplate, handler) {
|
|
269
282
|
if (typeof uriOrTemplate === "string") {
|
|
@@ -324,10 +337,22 @@ var mockMcpRegistry = () => {
|
|
|
324
337
|
};
|
|
325
338
|
|
|
326
339
|
// src/utils/get-model-context.ts
|
|
340
|
+
function bindModelContextMethods(host) {
|
|
341
|
+
return {
|
|
342
|
+
registerTool: host.registerTool.bind(host),
|
|
343
|
+
unregisterTool: host.unregisterTool ? host.unregisterTool.bind(host) : void 0
|
|
344
|
+
};
|
|
345
|
+
}
|
|
327
346
|
function getModelContext() {
|
|
328
347
|
const documentModelContext = typeof document !== "undefined" ? document.modelContext : void 0;
|
|
348
|
+
if (documentModelContext?.registerTool) {
|
|
349
|
+
return bindModelContextMethods(documentModelContext);
|
|
350
|
+
}
|
|
329
351
|
const navigatorModelContext = typeof navigator !== "undefined" ? navigator.modelContext : void 0;
|
|
330
|
-
|
|
352
|
+
if (navigatorModelContext?.registerTool) {
|
|
353
|
+
return bindModelContextMethods(navigatorModelContext);
|
|
354
|
+
}
|
|
355
|
+
return void 0;
|
|
331
356
|
}
|
|
332
357
|
|
|
333
358
|
// src/utils/merge-required-resources.ts
|
|
@@ -393,7 +418,7 @@ var registerMcpAdapter = (adapter) => {
|
|
|
393
418
|
var signalMcpReady = () => {
|
|
394
419
|
resolveReady();
|
|
395
420
|
};
|
|
396
|
-
var createAndRegisterAdapters = () => {
|
|
421
|
+
var createAndRegisterAdapters = async () => {
|
|
397
422
|
const modelContext = getModelContext();
|
|
398
423
|
if (modelContext) {
|
|
399
424
|
registerMcpAdapter(new WebMCPAdapter(modelContext));
|
|
@@ -401,12 +426,12 @@ var createAndRegisterAdapters = () => {
|
|
|
401
426
|
if (isAngieAvailable()) {
|
|
402
427
|
registerMcpAdapter(new AngieMcpAdapter(getSDK(), getRegisteredMcpServers));
|
|
403
428
|
}
|
|
404
|
-
registrationAdapters.
|
|
429
|
+
await Promise.all(registrationAdapters.map((adapter) => adapter.activate()));
|
|
405
430
|
};
|
|
406
|
-
function callAdapters(fn) {
|
|
407
|
-
for (const adapter of registrationAdapters) {
|
|
431
|
+
async function callAdapters(fn) {
|
|
432
|
+
for await (const adapter of registrationAdapters) {
|
|
408
433
|
try {
|
|
409
|
-
fn(adapter);
|
|
434
|
+
await Promise.resolve(fn(adapter));
|
|
410
435
|
} catch {
|
|
411
436
|
}
|
|
412
437
|
}
|
|
@@ -765,18 +790,23 @@ var saveAngieConsent = async () => {
|
|
|
765
790
|
|
|
766
791
|
// src/init.ts
|
|
767
792
|
var isInitialized = false;
|
|
768
|
-
function startMCPServer() {
|
|
793
|
+
async function startMCPServer() {
|
|
769
794
|
if (isInitialized) {
|
|
770
795
|
return;
|
|
771
796
|
}
|
|
772
797
|
isInitialized = true;
|
|
773
|
-
|
|
774
|
-
|
|
798
|
+
try {
|
|
799
|
+
await createAndRegisterAdapters();
|
|
800
|
+
} catch (error) {
|
|
801
|
+
console.error("MCP adapter activation failed:", error);
|
|
802
|
+
} finally {
|
|
803
|
+
signalMcpReady();
|
|
804
|
+
}
|
|
775
805
|
}
|
|
776
806
|
if (typeof document !== "undefined") {
|
|
777
|
-
document.addEventListener("DOMContentLoaded", () => startMCPServer(), { once: true });
|
|
807
|
+
document.addEventListener("DOMContentLoaded", () => void startMCPServer(), { once: true });
|
|
778
808
|
} else {
|
|
779
|
-
startMCPServer();
|
|
809
|
+
void startMCPServer();
|
|
780
810
|
}
|
|
781
811
|
|
|
782
812
|
// src/events/mcp-styles-applied-event.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/get-sdk.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts","../src/events/mcp-styles-applied-event.ts"],"sourcesContent":["import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\nexport {\n\tdispatchMcpStylesAppliedEvent,\n\tMCP_STYLES_APPLIED_EVENT,\n\ttype McpStylesAppliedPayload,\n} from './events/mcp-styles-applied-event';\n","import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = () => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tregistrationAdapters.forEach( ( adapter ) => adapter.activate() );\n};\n\n// utility function to run a callback on all MCP interfaces\nfunction callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tfn( adapter );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ( tool: McpToolDescriptor ) => void;\n\tunregisterTool: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): void {\n\t\tif ( this.activated ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activated = true;\n\t\tthis.ctx.registerTool( {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tthis.ctx.registerTool( {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} );\n\t\tthis.registeredToolNames.add( tool.name );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\n\treturn documentModelContext || navigatorModelContext;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\n\tcreateAndRegisterAdapters();\n\tsignalMcpReady();\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => startMCPServer(), { once: true } );\n} else {\n\tstartMCPServer();\n}\n","export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';\n\nexport type McpStylesAppliedPayload = {\n\tstyleValue: Record< string, unknown >;\n};\n\nexport function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {\n\twindow.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );\n}\n"],"mappings":"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","names":["import_angie_sdk","import_mcp","import_types","import_angie_sdk","import_angie_sdk","import_schema","sdk","getRegisteredMcpServers","import_angie_sdk","import_angie_sdk","import_angie_sdk","apiFetch","import_api_fetch","apiFetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/get-sdk.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/utils/register-model-context-tool.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts","../src/events/mcp-styles-applied-event.ts"],"sourcesContent":["import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\nexport {\n\tdispatchMcpStylesAppliedEvent,\n\tMCP_STYLES_APPLIED_EVENT,\n\ttype McpStylesAppliedPayload,\n} from './events/mcp-styles-applied-event';\n","import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = async (): Promise< void > => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tawait Promise.all( registrationAdapters.map( ( adapter ) => adapter.activate() ) );\n};\n\n// utility function to run a callback on all MCP interfaces\nasync function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor await ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tawait Promise.resolve( fn( adapter ) );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport { type ModelContextRegisterTool, registerModelContextTool } from '../utils/register-model-context-tool';\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ModelContextRegisterTool;\n\tunregisterTool?: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): Promise< void > {\n\t\tif ( this.activated ) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tthis.activated = true;\n\t\treturn registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool?.( tool.name );\n\t\t\tthis.registeredToolNames.delete( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tvoid registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} ).then( () => {\n\t\t\tthis.registeredToolNames.add( tool.name );\n\t\t} );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","import { type McpToolDescriptor } from '../adapters/types';\n\nexport type ModelContextRegisterTool = ( tool: McpToolDescriptor ) => void | Promise< void >;\n\nexport async function registerModelContextTool(\n\tregisterTool: ModelContextRegisterTool,\n\ttool: McpToolDescriptor\n): Promise< void > {\n\ttry {\n\t\tawait Promise.resolve( registerTool( tool ) );\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'Tool registration failed:', error );\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nfunction bindModelContextMethods( host: ModelContext ): ModelContext {\n\treturn {\n\t\tregisterTool: host.registerTool.bind( host ),\n\t\tunregisterTool: host.unregisterTool ? host.unregisterTool.bind( host ) : undefined,\n\t};\n}\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( documentModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( documentModelContext );\n\t}\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( navigatorModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( navigatorModelContext );\n\t}\n\n\treturn undefined;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport async function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\ttry {\n\t\tawait createAndRegisterAdapters();\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'MCP adapter activation failed:', error );\n\t} finally {\n\t\tsignalMcpReady();\n\t}\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => void startMCPServer(), { once: true } );\n} else {\n\tvoid startMCPServer();\n}\n","export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';\n\nexport type McpStylesAppliedPayload = {\n\tstyleValue: Record< string, unknown >;\n};\n\nexport function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {\n\twindow.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );\n}\n"],"mappings":"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","names":["import_angie_sdk","import_mcp","import_types","import_angie_sdk","import_angie_sdk","import_schema","sdk","getRegisteredMcpServers","import_angie_sdk","import_angie_sdk","import_angie_sdk","apiFetch","import_api_fetch","apiFetch"]}
|
package/dist/index.mjs
CHANGED
|
@@ -109,6 +109,17 @@ var AngieMcpAdapter = class {
|
|
|
109
109
|
// src/adapters/web-mcp-adapter.ts
|
|
110
110
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
111
111
|
import { z } from "@elementor/schema";
|
|
112
|
+
|
|
113
|
+
// src/utils/register-model-context-tool.ts
|
|
114
|
+
async function registerModelContextTool(registerTool, tool) {
|
|
115
|
+
try {
|
|
116
|
+
await Promise.resolve(registerTool(tool));
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error("Tool registration failed:", error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/adapters/web-mcp-adapter.ts
|
|
112
123
|
var WebMCPAdapter = class {
|
|
113
124
|
constructor(ctx) {
|
|
114
125
|
this.ctx = ctx;
|
|
@@ -118,10 +129,10 @@ var WebMCPAdapter = class {
|
|
|
118
129
|
activated = false;
|
|
119
130
|
activate() {
|
|
120
131
|
if (this.activated) {
|
|
121
|
-
return;
|
|
132
|
+
return Promise.resolve();
|
|
122
133
|
}
|
|
123
134
|
this.activated = true;
|
|
124
|
-
this.ctx.registerTool
|
|
135
|
+
return registerModelContextTool(this.ctx.registerTool, {
|
|
125
136
|
name: "editor-resource-getter",
|
|
126
137
|
description: "Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.",
|
|
127
138
|
inputSchema: {
|
|
@@ -178,7 +189,8 @@ ${available}`);
|
|
|
178
189
|
jsonSchema = tool.inputSchema;
|
|
179
190
|
}
|
|
180
191
|
if (this.registeredToolNames.has(tool.name)) {
|
|
181
|
-
this.ctx.unregisterTool(tool.name);
|
|
192
|
+
this.ctx.unregisterTool?.(tool.name);
|
|
193
|
+
this.registeredToolNames.delete(tool.name);
|
|
182
194
|
}
|
|
183
195
|
let resourcesDescription = "";
|
|
184
196
|
if (extraData) {
|
|
@@ -198,13 +210,14 @@ ${extraData.requiredResources?.join("\n")}
|
|
|
198
210
|
|
|
199
211
|
`;
|
|
200
212
|
}
|
|
201
|
-
this.ctx.registerTool
|
|
213
|
+
void registerModelContextTool(this.ctx.registerTool, {
|
|
202
214
|
name: tool.name,
|
|
203
215
|
description: `${resourcesDescription}${tool.description}`,
|
|
204
216
|
inputSchema: jsonSchema,
|
|
205
217
|
execute: tool.execute
|
|
218
|
+
}).then(() => {
|
|
219
|
+
this.registeredToolNames.add(tool.name);
|
|
206
220
|
});
|
|
207
|
-
this.registeredToolNames.add(tool.name);
|
|
208
221
|
}
|
|
209
222
|
onResourceRegistered(_name, uriOrTemplate, handler) {
|
|
210
223
|
if (typeof uriOrTemplate === "string") {
|
|
@@ -265,10 +278,22 @@ var mockMcpRegistry = () => {
|
|
|
265
278
|
};
|
|
266
279
|
|
|
267
280
|
// src/utils/get-model-context.ts
|
|
281
|
+
function bindModelContextMethods(host) {
|
|
282
|
+
return {
|
|
283
|
+
registerTool: host.registerTool.bind(host),
|
|
284
|
+
unregisterTool: host.unregisterTool ? host.unregisterTool.bind(host) : void 0
|
|
285
|
+
};
|
|
286
|
+
}
|
|
268
287
|
function getModelContext() {
|
|
269
288
|
const documentModelContext = typeof document !== "undefined" ? document.modelContext : void 0;
|
|
289
|
+
if (documentModelContext?.registerTool) {
|
|
290
|
+
return bindModelContextMethods(documentModelContext);
|
|
291
|
+
}
|
|
270
292
|
const navigatorModelContext = typeof navigator !== "undefined" ? navigator.modelContext : void 0;
|
|
271
|
-
|
|
293
|
+
if (navigatorModelContext?.registerTool) {
|
|
294
|
+
return bindModelContextMethods(navigatorModelContext);
|
|
295
|
+
}
|
|
296
|
+
return void 0;
|
|
272
297
|
}
|
|
273
298
|
|
|
274
299
|
// src/utils/merge-required-resources.ts
|
|
@@ -334,7 +359,7 @@ var registerMcpAdapter = (adapter) => {
|
|
|
334
359
|
var signalMcpReady = () => {
|
|
335
360
|
resolveReady();
|
|
336
361
|
};
|
|
337
|
-
var createAndRegisterAdapters = () => {
|
|
362
|
+
var createAndRegisterAdapters = async () => {
|
|
338
363
|
const modelContext = getModelContext();
|
|
339
364
|
if (modelContext) {
|
|
340
365
|
registerMcpAdapter(new WebMCPAdapter(modelContext));
|
|
@@ -342,12 +367,12 @@ var createAndRegisterAdapters = () => {
|
|
|
342
367
|
if (isAngieAvailable()) {
|
|
343
368
|
registerMcpAdapter(new AngieMcpAdapter(getSDK(), getRegisteredMcpServers));
|
|
344
369
|
}
|
|
345
|
-
registrationAdapters.
|
|
370
|
+
await Promise.all(registrationAdapters.map((adapter) => adapter.activate()));
|
|
346
371
|
};
|
|
347
|
-
function callAdapters(fn) {
|
|
348
|
-
for (const adapter of registrationAdapters) {
|
|
372
|
+
async function callAdapters(fn) {
|
|
373
|
+
for await (const adapter of registrationAdapters) {
|
|
349
374
|
try {
|
|
350
|
-
fn(adapter);
|
|
375
|
+
await Promise.resolve(fn(adapter));
|
|
351
376
|
} catch {
|
|
352
377
|
}
|
|
353
378
|
}
|
|
@@ -706,18 +731,23 @@ var saveAngieConsent = async () => {
|
|
|
706
731
|
|
|
707
732
|
// src/init.ts
|
|
708
733
|
var isInitialized = false;
|
|
709
|
-
function startMCPServer() {
|
|
734
|
+
async function startMCPServer() {
|
|
710
735
|
if (isInitialized) {
|
|
711
736
|
return;
|
|
712
737
|
}
|
|
713
738
|
isInitialized = true;
|
|
714
|
-
|
|
715
|
-
|
|
739
|
+
try {
|
|
740
|
+
await createAndRegisterAdapters();
|
|
741
|
+
} catch (error) {
|
|
742
|
+
console.error("MCP adapter activation failed:", error);
|
|
743
|
+
} finally {
|
|
744
|
+
signalMcpReady();
|
|
745
|
+
}
|
|
716
746
|
}
|
|
717
747
|
if (typeof document !== "undefined") {
|
|
718
|
-
document.addEventListener("DOMContentLoaded", () => startMCPServer(), { once: true });
|
|
748
|
+
document.addEventListener("DOMContentLoaded", () => void startMCPServer(), { once: true });
|
|
719
749
|
} else {
|
|
720
|
-
startMCPServer();
|
|
750
|
+
void startMCPServer();
|
|
721
751
|
}
|
|
722
752
|
|
|
723
753
|
// src/events/mcp-styles-applied-event.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/get-sdk.ts","../src/index.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts","../src/events/mcp-styles-applied-event.ts"],"sourcesContent":["import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\nexport {\n\tdispatchMcpStylesAppliedEvent,\n\tMCP_STYLES_APPLIED_EVENT,\n\ttype McpStylesAppliedPayload,\n} from './events/mcp-styles-applied-event';\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = () => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tregistrationAdapters.forEach( ( adapter ) => adapter.activate() );\n};\n\n// utility function to run a callback on all MCP interfaces\nfunction callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tfn( adapter );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ( tool: McpToolDescriptor ) => void;\n\tunregisterTool: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): void {\n\t\tif ( this.activated ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activated = true;\n\t\tthis.ctx.registerTool( {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tthis.ctx.registerTool( {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} );\n\t\tthis.registeredToolNames.add( tool.name );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\n\treturn documentModelContext || navigatorModelContext;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\n\tcreateAndRegisterAdapters();\n\tsignalMcpReady();\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => startMCPServer(), { once: true } );\n} else {\n\tstartMCPServer();\n}\n","export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';\n\nexport type McpStylesAppliedPayload = {\n\tstyleValue: Record< string, unknown >;\n};\n\nexport function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {\n\twindow.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );\n}\n"],"mappings":"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","names":["McpServer","SamplingMessageSchema","getAngieIframe","z","sdk","getRegisteredMcpServers","z","getAngieIframe","ANGIE_SIDEBAR_STATE_OPEN","setReferrerRedirect","apiFetch"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/get-sdk.ts","../src/index.ts","../src/utils/is-angie-available.ts","../src/utils/is-angie-sidebar-open.ts","../src/mcp-registry.ts","../src/utils/to-mcp-title.ts","../src/adapters/angie-adapter.ts","../src/adapters/web-mcp-adapter.ts","../src/utils/register-model-context-tool.ts","../src/angie-annotations.ts","../src/test-utils/mock-mcp-registry.ts","../src/utils/get-model-context.ts","../src/utils/merge-required-resources.ts","../src/utils/create-simple-resource-handler.ts","../src/utils/register-server-docs-resource.ts","../src/sampler.ts","../src/utils/prompt-builder.ts","../src/utils/get-active-chat-info.ts","../src/utils/send-prompt-to-angie.ts","../src/utils/redirect-to-installation.ts","../src/utils/redirect-to-app-admin.ts","../src/utils/install-angie-plugin.ts","../src/utils/save-angie-consent.ts","../src/init.ts","../src/events/mcp-styles-applied-event.ts"],"sourcesContent":["import { AngieMcpSdk } from '@elementor-external/angie-sdk';\nexport { getAngieIframe, MessageEventType } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\n\nclass RetriableAngieSDK extends AngieMcpSdk {\n\tpublic async waitForReady(): Promise< void > {\n\t\tlet retryCount = 3;\n\t\twhile ( retryCount > 0 ) {\n\t\t\ttry {\n\t\t\t\tawait super.waitForReady();\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\tretryCount--;\n\t\t\t\tawait sleep();\n\t\t\t}\n\t\t}\n\t\treturn new Promise( () => {} ); // never resolves\n\t}\n}\n\nconst sleep = ( ms = 10_000 ) =>\n\tnew Promise( ( resolve ) => {\n\t\tsetTimeout( resolve, ms );\n\t} );\n\nexport const getSDK = () => {\n\t// @ts-ignore - QUnit fails this\n\tconst isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;\n\tif ( isMCPDisabled ) {\n\t\treturn {} as unknown as AngieMcpSdk;\n\t}\n\tif ( ! sdk ) {\n\t\tsdk = new RetriableAngieSDK();\n\t}\n\treturn sdk;\n};\n","import { getSDK } from './utils/get-sdk';\nexport { getAngieIframe, MessageEventType as AngieMessageEvenetType } from './utils/get-sdk';\n\nexport {\n\tMcpServer,\n\tResourceTemplate,\n\ttype RegisteredResource,\n\ttype ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { SamplingMessageSchema } from '@modelcontextprotocol/sdk/types.js';\nexport { isAngieAvailable } from './utils/is-angie-available';\nexport { isAngieSidebarOpen } from './utils/is-angie-sidebar-open';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport { ANGIE_MODEL_PREFERENCES, ANGIE_REQUIRED_RESOURCES, type AngieModelPreferences } from './angie-annotations';\nexport { getActiveChatInfo, type ActiveChatInfo } from './utils/get-active-chat-info';\nexport { sendPromptToAngie } from './utils/send-prompt-to-angie';\nexport { redirectToInstallation } from './utils/redirect-to-installation';\nexport { redirectToAppAdmin } from './utils/redirect-to-app-admin';\nexport { installAngiePlugin, type InstallAngieResult } from './utils/install-angie-plugin';\nexport { saveAngieConsent } from './utils/save-angie-consent';\nexport const getAngieSdk = () => getSDK();\nexport * from './init';\nexport {\n\tdispatchMcpStylesAppliedEvent,\n\tMCP_STYLES_APPLIED_EVENT,\n\ttype McpStylesAppliedPayload,\n} from './events/mcp-styles-applied-event';\n","import { getAngieIframe } from '@elementor-external/angie-sdk';\n\nexport const isAngieAvailable = (): boolean => {\n\treturn !! getAngieIframe();\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, getAngieSidebarSavedState } from '@elementor-external/angie-sdk';\n\nexport const isAngieSidebarOpen = (): boolean => {\n\treturn getAngieSidebarSavedState() === ANGIE_SIDEBAR_STATE_OPEN;\n};\n","import { z, type z3 } from '@elementor/schema';\nimport { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nimport { AngieMcpAdapter } from './adapters/angie-adapter';\nimport { type IMcpRegistrationAdapter, type McpResourceHandler, type McpResourceUriOrTemplate } from './adapters/types';\nimport { WebMCPAdapter } from './adapters/web-mcp-adapter';\nimport {\n\tANGIE_MODEL_PREFERENCES,\n\tANGIE_REQUIRED_RESOURCES,\n\ttype AngieModelPreferences,\n\tcreateDefaultModelPreferences,\n} from './angie-annotations';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\nimport { getModelContext } from './utils/get-model-context';\nimport { getSDK } from './utils/get-sdk';\nimport { isAngieAvailable } from './utils/is-angie-available';\nimport { mergeRequiredResources, type ResourceList } from './utils/merge-required-resources';\nimport { registerServerDocsResource } from './utils/register-server-docs-resource';\nimport { toMCPTitle } from './utils/to-mcp-title';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nconst isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nconst registrationAdapters: IMcpRegistrationAdapter[] = [];\nconst bufferedTools: Parameters< IMcpRegistrationAdapter[ 'onToolRegistered' ] >[] = [];\nconst bufferedResources: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] >[] = [];\n\nlet resolveReady!: () => void;\nconst readyPromise = new Promise< void >( ( resolve ) => {\n\tresolveReady = resolve;\n} );\n\nexport const registerMcpAdapter = ( adapter: IMcpRegistrationAdapter ): void => {\n\tregistrationAdapters.push( adapter );\n\tfor ( const tool of bufferedTools ) {\n\t\ttry {\n\t\t\tadapter.onToolRegistered( tool[ 0 ], tool[ 1 ] );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n\tfor ( const resource of bufferedResources ) {\n\t\ttry {\n\t\t\tadapter.onResourceRegistered( ...resource );\n\t\t} catch {\n\t\t\t// exit quietly\n\t\t}\n\t}\n};\n\nexport const signalMcpReady = (): void => {\n\tresolveReady();\n};\n\nexport const createAndRegisterAdapters = async (): Promise< void > => {\n\tconst modelContext = getModelContext();\n\n\tif ( modelContext ) {\n\t\tregisterMcpAdapter( new WebMCPAdapter( modelContext ) );\n\t}\n\n\tif ( isAngieAvailable() ) {\n\t\tregisterMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );\n\t}\n\n\tawait Promise.all( registrationAdapters.map( ( adapter ) => adapter.activate() ) );\n};\n\n// utility function to run a callback on all MCP interfaces\nasync function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {\n\tfor await ( const adapter of registrationAdapters ) {\n\t\ttry {\n\t\t\tawait Promise.resolve( fn( adapter ) );\n\t\t} catch {\n\t\t\t// adapter failed — exit quietly, continue to next\n\t\t}\n\t}\n}\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport const getRegisteredMcpServers = (): Array< [ string, McpServer, string ] > => {\n\treturn Object.entries( mcpRegistry ).map( ( [ key, server ] ) => [ key, server, mcpDescriptions[ key ] || key ] );\n};\n\nconst isAlphabet = ( str: string ): string | never => {\n\tconst passes = !! str && /^[a-z_]+$/.test( str );\n\tif ( ! passes ) {\n\t\tthrow new Error( 'Not alphabet' );\n\t}\n\treturn str;\n};\n\n/**\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions Short hint about the MCP and its toolset (MCP SDK `instructions`; keeps payload small).\n * @param options.docs Full documentation registered as a lazy-loaded resource.\n * When provided, it is registered at elementor://{namespace}/server-docs\n * and auto-injected into every tool's requiredResources.\n */\nexport const getMCPByDomain = (\n\tnamespace: string,\n\toptions?: { docs?: string; instructions?: string }\n): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( namespace ) }`;\n\tconst title = toMCPTitle( namespace );\n\t// @ts-ignore - QUnit fails this\n\tif ( typeof globalThis.jest !== 'undefined' ) {\n\t\treturn mockMcpRegistry();\n\t}\n\tif ( ! mcpRegistry[ namespace ] ) {\n\t\tmcpRegistry[ namespace ] = new McpServer(\n\t\t\t{ name: mcpName, title, version: '1.0.0' },\n\t\t\t{ instructions: options?.instructions, capabilities: { resources: { subscribe: true } } }\n\t\t);\n\t\tif ( options?.docs ) {\n\t\t\tregisterServerDocsResource( mcpRegistry[ namespace ], namespace, title, options.docs, ( ...args ) => {\n\t\t\t\tbufferedResources.push( args );\n\t\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...args ) );\n\t\t\t} );\n\t\t}\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst serverDocsUri = options?.docs ? `elementor://${ namespace }/server-docs` : undefined;\n\tconst { addTool } = createToolRegistry( mcpServer, mcpName, serverDocsUri );\n\treturn {\n\t\twaitForReady: () => readyPromise,\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'registerResource' ] > ) => {\n\t\t\tconst [ name, uriOrTemplate, ...rest ] = args as [ string, unknown, ...unknown[] ];\n\t\t\tconst handler = rest[ rest.length - 1 ] as McpResourceHandler;\n\t\t\tconst resourceArgs: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > = [\n\t\t\t\tname,\n\t\t\t\turiOrTemplate as McpResourceUriOrTemplate,\n\t\t\t\thandler,\n\t\t\t];\n\t\t\tbufferedResources.push( resourceArgs );\n\t\t\tcallAdapters( ( adapter ) => adapter.onResourceRegistered( ...resourceArgs ) );\n\t\t\treturn mcpServer.registerResource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\tcallAdapters( ( adapter ) => adapter.sendResourceUpdated( { uri: args[ 0 ].uri } ) );\n\t\t\treturn Promise.resolve( mcpServer.server.sendResourceUpdated( ...args ) ).catch( ( error: Error ) => {\n\t\t\t\tif ( error?.message?.includes( 'Not connected' ) ) {\n\t\t\t\t\treturn; // Expected when no MCP client is connected yet\n\t\t\t\t}\n\t\t\t\tif ( error?.message?.includes( 'does not support notifying about resources' ) ) {\n\t\t\t\t\treturn; // Server capability not declared — safe to ignore\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t} );\n\t\t},\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t};\n};\n\nexport interface MCPRegistryEntry {\n\taddTool: < T extends undefined | z.ZodRawShape = undefined, O extends undefined | z.ZodRawShape = undefined >(\n\t\topts: ToolRegistrationOptions< T, O >\n\t) => void;\n\tsetMCPDescription: ( description: string ) => void;\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'registerResource' ];\n\twaitForReady: () => Promise< void >;\n}\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\n\t/**\n\t * Auto added fields:\n\t * @param errors z.string().optional().describe('Error message if the tool failed')\n\t */\n\toutputSchema?: OutputSchema;\n\thandler: InputArgs extends z.ZodRawShape\n\t\t? (\n\t\t\t\targs: z.objectOutputType< InputArgs, z.ZodTypeAny >,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >\n\t\t: (\n\t\t\t\targs: unknown,\n\t\t\t\textra: RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t ) => ExpectedOutput | Promise< ExpectedOutput >;\n\tisDestructive?: boolean;\n\trequiredResources?: ResourceList;\n\tmodelPreferences?: AngieModelPreferences;\n};\n\nfunction createToolRegistry( server: McpServer, serverName: string, serverDocsUri?: string ) {\n\tfunction addTool<\n\t\tT extends undefined | z.ZodRawShape = undefined,\n\t\tO extends undefined | z.ZodRawShape = undefined,\n\t>( opts: ToolRegistrationOptions< T, O > ) {\n\t\tconst outputSchema = opts.outputSchema as ZodRawShape | undefined;\n\t\tif ( outputSchema ) {\n\t\t\tObject.assign(\n\t\t\t\toutputSchema,\n\t\t\t\toutputSchema.errors ?? {\n\t\t\t\t\terrors: z.string().optional().describe( 'Error message if the tool failed' ),\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t// @ts-ignore: TS is unable to infer the type here\n\t\tconst inputSchema: ZodRawShape = opts.schema ? opts.schema : {};\n\t\tconst toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {\n\t\t\ttry {\n\t\t\t\tconst invocationResult = await opts.handler( opts.schema ? args : {}, extra );\n\t\t\t\treturn {\n\t\t\t\t\t// structuredContent: typeof invocationResult === 'string' ? undefined : invocationResult,\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\t\ttypeof invocationResult === 'string'\n\t\t\t\t\t\t\t\t\t? invocationResult\n\t\t\t\t\t\t\t\t\t: JSON.stringify( invocationResult ),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t} catch ( error ) {\n\t\t\t\treturn {\n\t\t\t\t\tisError: true,\n\t\t\t\t\tstructuredContent: {\n\t\t\t\t\t\terrors: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t},\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\ttext: ( error as Error ).message || 'Unknown error',\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst annotations: Record< string, unknown > = {\n\t\t\tdestructiveHint: opts.isDestructive,\n\t\t\treadOnlyHint: opts.isDestructive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tconst mergedResources = mergeRequiredResources( opts.requiredResources, serverDocsUri );\n\t\tconst angieAnnotations = {\n\t\t\t[ ANGIE_MODEL_PREFERENCES ]: opts.modelPreferences ?? createDefaultModelPreferences(),\n\t\t\t[ ANGIE_REQUIRED_RESOURCES ]: mergedResources,\n\t\t};\n\t\tserver.registerTool(\n\t\t\topts.name,\n\t\t\t{\n\t\t\t\tdescription: opts.description,\n\t\t\t\tinputSchema,\n\t\t\t\t// TODO: Uncomment this when the outputSchema is stable\n\t\t\t\t// outputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t\t_meta: angieAnnotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tconst toolDescriptor = {\n\t\t\tname: opts.name,\n\t\t\tdescription: opts.description,\n\t\t\tinputSchema: inputSchema as object,\n\t\t\texecute: ( params: Record< string, unknown > ) =>\n\t\t\t\tPromise.resolve(\n\t\t\t\t\ttoolCallback(\n\t\t\t\t\t\tparams as Parameters< typeof toolCallback >[ 0 ],\n\t\t\t\t\t\t/* WebMCP: no protocol session — handlers must not rely on `extra` here */\n\t\t\t\t\t\t{} as RequestHandlerExtra< ServerRequest, ServerNotification >\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t};\n\t\tconst extraData = {\n\t\t\tresources: [ `Server resource name: ${ serverName }, Required to fetch!` ],\n\t\t\trequiredResources: mergedResources?.map( ( resource ) => resource.uri ) ?? [],\n\t\t};\n\t\tbufferedTools.push( [ toolDescriptor, extraData ] );\n\t\tcallAdapters( ( adapter ) => adapter.onToolRegistered( toolDescriptor, extraData ) );\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\n\t};\n}\n","export const toMCPTitle = ( namespace: string ): string => {\n\tconst capitalized = namespace.charAt( 0 ).toUpperCase() + namespace.slice( 1 );\n\treturn `Editor ${ capitalized }`;\n};\n","import { type AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { type getRegisteredMcpServers as _getRegisteredMcpServers } from '../mcp-registry';\nimport { toMCPTitle } from '../utils/to-mcp-title';\nimport { type IMcpRegistrationAdapter } from './types';\n\nconst MAX_RETRIES = 3;\n\nexport class AngieMcpAdapter implements IMcpRegistrationAdapter {\n\tconstructor(\n\t\tprivate readonly sdk: AngieMcpSdk,\n\t\tprivate readonly getRegisteredMcpServers: typeof _getRegisteredMcpServers\n\t) {}\n\n\tasync activate(): Promise< void > {\n\t\tawait this.sdk.waitForReady();\n\t\tawait this.registerEntries( this.getRegisteredMcpServers(), MAX_RETRIES );\n\t}\n\n\tprivate async registerEntries(\n\t\tentries: ReturnType< typeof _getRegisteredMcpServers >,\n\t\tretry: number\n\t): Promise< void > {\n\t\tif ( retry === 0 ) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.error(\n\t\t\t\t'Failed to register MCP after 3 retries. failed entries: ',\n\t\t\t\tentries.map( ( [ key ] ) => key )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst failed: typeof entries = [];\n\t\tfor ( const [ key, mcpServer, description ] of entries ) {\n\t\t\ttry {\n\t\t\t\tawait this.sdk.registerLocalServer( {\n\t\t\t\t\ttitle: toMCPTitle( key ),\n\t\t\t\t\tname: `editor-${ key }`,\n\t\t\t\t\tserver: mcpServer,\n\t\t\t\t\tversion: '1.0.0',\n\t\t\t\t\tdescription,\n\t\t\t\t} );\n\t\t\t} catch {\n\t\t\t\tfailed.push( [ key, mcpServer, description ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( failed.length > 0 ) {\n\t\t\treturn this.registerEntries( failed, retry - 1 );\n\t\t}\n\t}\n\n\tonToolRegistered(): void {\n\t\t// Angie tools are registered via McpServer (at activate time).\n\t}\n\n\tonResourceRegistered(): void {\n\t\t// Resources are registered on the McpServer instance directly.\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// Resource update notifications are sent via MCPRegistryEntry.sendResourceUpdated.\n\t}\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { z, type z3 } from '@elementor/schema';\n\nimport { type ModelContextRegisterTool, registerModelContextTool } from '../utils/register-model-context-tool';\nimport {\n\ttype IMcpRegistrationAdapter,\n\ttype McpResourceHandler,\n\ttype McpResourceUriOrTemplate,\n\ttype McpToolDescriptor,\n\ttype UriTemplate,\n} from './types';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nexport type ModelContext = {\n\tregisterTool: ModelContextRegisterTool;\n\tunregisterTool?: ( name: string ) => void;\n};\n\ntype ResourceEntry = {\n\tpattern: string;\n\tmatch: ( uri: string ) => Record< string, string | string[] > | null;\n\thandler: McpResourceHandler;\n};\n\nexport class WebMCPAdapter implements IMcpRegistrationAdapter {\n\tprivate readonly registeredToolNames = new Set< string >();\n\tprivate readonly resourceEntries: ResourceEntry[] = [];\n\tprivate activated = false;\n\n\tconstructor( private readonly ctx: ModelContext ) {}\n\n\tactivate(): Promise< void > {\n\t\tif ( this.activated ) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tthis.activated = true;\n\t\treturn registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: 'editor-resource-getter',\n\t\t\tdescription:\n\t\t\t\t'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',\n\t\t\tinputSchema: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: {\n\t\t\t\t\turi: {\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'A full resource URI (e.g. elementor://styles/best-practices) or a partial string to search across available resource patterns.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [ 'uri' ],\n\t\t\t},\n\t\t\texecute: async ( params ) => {\n\t\t\t\tconst query = params.uri as string;\n\t\t\t\tconst entries = this.resourceEntries;\n\n\t\t\t\tif ( entries.length === 0 ) {\n\t\t\t\t\treturn 'No resources are registered yet.';\n\t\t\t\t}\n\n\t\t\t\t// Exact URI match\n\t\t\t\tfor ( const entry of entries ) {\n\t\t\t\t\tconst variables = entry.match( query );\n\t\t\t\t\tif ( variables !== null ) {\n\t\t\t\t\t\tlet resourceUrl: URL;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresourceUrl = new URL( query );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn `Invalid URI '${ query }'. Provide a valid resource URI or a partial string to search patterns.`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = await entry.handler( resourceUrl, variables );\n\t\t\t\t\t\treturn result.contents?.[ 0 ]?.text ?? JSON.stringify( result );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Partial search fallback\n\t\t\t\tconst matches = entries.map( ( e ) => e.pattern ).filter( ( pattern ) => pattern.includes( query ) );\n\t\t\t\tif ( matches.length > 0 ) {\n\t\t\t\t\treturn `Found ${ matches.length } matching resource pattern(s):\\n${ matches.join(\n\t\t\t\t\t\t'\\n'\n\t\t\t\t\t) }\\n\\nProvide a full URI to retrieve the resource content.`;\n\t\t\t\t}\n\n\t\t\t\tconst available = entries.map( ( e ) => e.pattern ).join( '\\n' );\n\t\t\t\tthrow new Error( `No resource matched '${ query }'.\\n\\nAvailable patterns:\\n${ available }` );\n\t\t\t},\n\t\t} );\n\t}\n\n\tonToolRegistered(\n\t\ttool: McpToolDescriptor,\n\t\textraData?: { resources: string[]; requiredResources: string[] }\n\t): void {\n\t\tlet jsonSchema: object;\n\t\ttry {\n\t\t\tjsonSchema = zodToJsonSchema( z.object( tool.inputSchema as ZodRawShape ) );\n\t\t} catch {\n\t\t\tjsonSchema = tool.inputSchema;\n\t\t}\n\n\t\tif ( this.registeredToolNames.has( tool.name ) ) {\n\t\t\tthis.ctx.unregisterTool?.( tool.name );\n\t\t\tthis.registeredToolNames.delete( tool.name );\n\t\t}\n\n\t\tlet resourcesDescription = '';\n\t\tif ( extraData ) {\n\t\t\tif ( extraData.resources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Resources:\\n${ extraData.resources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tif ( extraData.requiredResources?.length > 0 ) {\n\t\t\t\tresourcesDescription += `#Required Resources:\\n${ extraData.requiredResources?.join( '\\n' ) }\\n\\n`;\n\t\t\t}\n\t\t\tresourcesDescription += `To read resources, use editor-resource-getter tool.\\n\\n`;\n\t\t}\n\t\tvoid registerModelContextTool( this.ctx.registerTool, {\n\t\t\tname: tool.name,\n\t\t\tdescription: `${ resourcesDescription }${ tool.description }`,\n\t\t\tinputSchema: jsonSchema,\n\t\t\texecute: tool.execute,\n\t\t} ).then( () => {\n\t\t\tthis.registeredToolNames.add( tool.name );\n\t\t} );\n\t}\n\n\tonResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {\n\t\tif ( typeof uriOrTemplate === 'string' ) {\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: uriOrTemplate,\n\t\t\t\tmatch: ( uri ) => ( uri === uriOrTemplate ? {} : null ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t} else {\n\t\t\tconst template = uriOrTemplate.uriTemplate as UriTemplate;\n\t\t\tthis.resourceEntries.push( {\n\t\t\t\tpattern: template.toString(),\n\t\t\t\tmatch: ( uri ) => template.match( uri ),\n\t\t\t\thandler,\n\t\t\t} );\n\t\t}\n\t}\n\n\tsendResourceUpdated(): void {\n\t\t// WebMCP has no server-push mechanism — no-op\n\t}\n}\n","import { type McpToolDescriptor } from '../adapters/types';\n\nexport type ModelContextRegisterTool = ( tool: McpToolDescriptor ) => void | Promise< void >;\n\nexport async function registerModelContextTool(\n\tregisterTool: ModelContextRegisterTool,\n\ttool: McpToolDescriptor\n): Promise< void > {\n\ttry {\n\t\tawait Promise.resolve( registerTool( tool ) );\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'Tool registration failed:', error );\n\t}\n}\n","export const ANGIE_MODEL_PREFERENCES = 'angie/modelPreferences' as const;\nexport const ANGIE_REQUIRED_RESOURCES = 'angie/requiredResources' as const;\n\nexport interface AngieModelPreferences {\n\thints?: Array< { name: string } >;\n\tcostPriority?: number; // 0-1 (future use)\n\tspeedPriority?: number; // 0-1 (future use)\n\tintelligencePriority?: number; // 0-1 (future use)\n}\n\nexport function createDefaultModelPreferences(): AngieModelPreferences {\n\treturn {\n\t\thints: [ { name: 'claude-sonnet-4-5' } ],\n\t\tintelligencePriority: 0.8,\n\t\tspeedPriority: 0.7,\n\t};\n}\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type MCPRegistryEntry } from '../mcp-registry';\n\nconst mock = new Proxy(\n\t{},\n\t{\n\t\tget: () => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tfunction mockedFn( ..._: unknown[] ) {}\n\t\t\treturn mockedFn;\n\t\t},\n\t}\n);\n\nexport const mockMcpRegistry = (): MCPRegistryEntry => {\n\treturn {\n\t\t// @ts-ignore\n\t\tresource: async () => {},\n\t\t// @ts-ignore\n\t\tsendResourceUpdated: () => {},\n\t\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { type ModelContext } from '../adapters/web-mcp-adapter';\n\ntype ModelContextHost = {\n\tmodelContext?: ModelContext;\n};\n\nfunction bindModelContextMethods( host: ModelContext ): ModelContext {\n\treturn {\n\t\tregisterTool: host.registerTool.bind( host ),\n\t\tunregisterTool: host.unregisterTool ? host.unregisterTool.bind( host ) : undefined,\n\t};\n}\n\nexport function getModelContext(): ModelContext | undefined {\n\tconst documentModelContext =\n\t\ttypeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( documentModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( documentModelContext );\n\t}\n\tconst navigatorModelContext =\n\t\ttypeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;\n\tif ( navigatorModelContext?.registerTool ) {\n\t\treturn bindModelContextMethods( navigatorModelContext );\n\t}\n\n\treturn undefined;\n}\n","export type ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\nexport const mergeRequiredResources = (\n\ttoolResources: ResourceList | undefined,\n\tserverDocsUri: string | undefined\n): ResourceList | undefined => {\n\tif ( ! serverDocsUri ) {\n\t\treturn toolResources;\n\t}\n\tif ( toolResources?.some( ( r ) => r.uri === serverDocsUri ) ) {\n\t\treturn toolResources;\n\t}\n\treturn [ ...( toolResources ?? [] ), { uri: serverDocsUri, description: 'Server docs' } ];\n};\n","export const createSimpleResourceHandler = ( text: string ) => async ( uri: URL ) => ( {\n\tcontents: [ { uri: uri.href, mimeType: 'text/plain', text } ],\n} );\n","import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nimport { type IMcpRegistrationAdapter } from '../adapters/types';\nimport { createSimpleResourceHandler } from './create-simple-resource-handler';\n\ntype OnResourceRegistered = ( ...args: Parameters< IMcpRegistrationAdapter[ 'onResourceRegistered' ] > ) => void;\n\nexport const registerServerDocsResource = (\n\tserver: McpServer,\n\tnamespace: string,\n\ttitle: string,\n\tdocs: string,\n\tonRegistered: OnResourceRegistered\n): void => {\n\tconst uri = `elementor://${ namespace }/server-docs`;\n\tconst name = `${ namespace }-server-docs`;\n\tconst handler = createSimpleResourceHandler( docs );\n\tserver.registerResource(\n\t\tname,\n\t\turi,\n\t\t{\n\t\t\ttitle: `${ title } server docs`,\n\t\t\tdescription: 'Full MCP documentation (lazy-loaded)',\n\t\t\tmimeType: 'text/plain',\n\t\t},\n\t\thandler\n\t);\n\tonRegistered( name, uri, handler );\n};\n","import { type z } from '@elementor/schema';\nimport { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport { SamplingMessageSchema, type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\ntype Server = RequestHandlerExtra< ServerRequest, ServerNotification >;\ntype Opts = {\n\tmaxTokens?: number;\n\tmodelPreferences?: string;\n\tmodel?: string;\n};\n\nconst DEFAULT_OPTS: Opts = {\n\tmaxTokens: 10000,\n\tmodelPreferences: 'openai',\n\tmodel: 'gpt-4o',\n};\n\ntype SamplingOpts = {\n\tsystemPrompt?: string;\n\tstructuredOutput?: z.ZodTypeAny;\n\tmessages: { role: 'user' | 'assistant'; content: { type: 'text'; text: string } }[];\n\trequestParams?: { [ key: string ]: string };\n};\n\nconst DEFAULT_STRUCTURED_OUTPUT = {\n\ttype: 'object',\n\tproperties: {\n\t\tcontent: {\n\t\t\ttype: 'string',\n\t\t\tdescription: 'Result',\n\t\t},\n\t},\n\trequired: [ 'content' ],\n\tadditionalProperties: false,\n};\n\nexport const createSampler = ( server: Server, opts: Opts = DEFAULT_OPTS ) => {\n\tconst { maxTokens = 1000, modelPreferences = 'openai', model = 'gpt-4o' } = opts;\n\tconst exec = async ( payload: SamplingOpts ) => {\n\t\tconst systemPromptObject = { ...( payload.systemPrompt ? { systemPrompt: payload.systemPrompt } : {} ) };\n\t\tconst requestParams = payload.requestParams || {};\n\t\tconst result = await server.sendRequest(\n\t\t\t{\n\t\t\t\tmethod: 'sampling/createMessage',\n\t\t\t\tparams: {\n\t\t\t\t\t...requestParams,\n\t\t\t\t\tmaxTokens,\n\t\t\t\t\tmodelPreferences: {\n\t\t\t\t\t\thints: [ { name: modelPreferences } ],\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t...systemPromptObject,\n\t\t\t\t\t\t...{ structured_output: payload.structuredOutput || DEFAULT_STRUCTURED_OUTPUT },\n\t\t\t\t\t},\n\t\t\t\t\tmessages: payload.messages,\n\t\t\t\t},\n\t\t\t\t// ...systemPromptObject,\n\t\t\t},\n\t\t\tSamplingMessageSchema\n\t\t);\n\t\treturn result.content;\n\t};\n\treturn exec;\n};\n","class ToolPrompts {\n\tpublic _description = '';\n\tpublic _parameters: Record< string, string > = {};\n\tpublic _examples: string[] = [];\n\tpublic _furtherInstructions: string[] = [];\n\n\tconstructor( public name: string ) {}\n\n\tdescription(): string;\n\tdescription( desc: string ): this;\n\tdescription( desc?: string | undefined ) {\n\t\tif ( typeof desc === 'undefined' ) {\n\t\t\treturn this._description;\n\t\t}\n\t\tthis._description = desc;\n\t\treturn this;\n\t}\n\n\tparameter( key: string ): string;\n\tparameter( key: string, description: string ): this;\n\tparameter( key: string, description?: string ) {\n\t\tif ( typeof description === 'undefined' ) {\n\t\t\treturn this._parameters[ key ];\n\t\t}\n\t\tthis._parameters[ key ] = `**${ key }**:\\n${ description }`;\n\t\treturn this;\n\t}\n\n\tinstruction( instruction: string ): this {\n\t\tthis._furtherInstructions.push( instruction );\n\t\treturn this;\n\t}\n\n\texample( example: string ): this {\n\t\tthis._examples.push( example );\n\t\treturn this;\n\t}\n\n\tpublic get examples() {\n\t\treturn this._examples.join( '\\n\\n' );\n\t}\n\n\tprompt(): string {\n\t\treturn `# ${ this.name }\n# Description\n${ this._description }\n${ this._parameters.length ? '# Parameters\\n' + Object.values( this._parameters ).join( '\\n\\n' ) : '' }\n${ this._examples.length ? '# Examples\\n' + this.examples : '' }\n${ this._furtherInstructions.length ? '# Further Instructions\\n' + this._furtherInstructions.join( '\\n\\n' ) : '' }\n`.trim();\n\t}\n}\n\nexport const toolPrompts = ( name: string ) => {\n\treturn new ToolPrompts( name );\n};\n","export type ActiveChatInfo = {\n\tsessionId: string;\n\texpiresAt: number;\n};\n\nexport const getActiveChatInfo = (): ActiveChatInfo => {\n\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\tif ( ! info ) {\n\t\treturn {\n\t\t\texpiresAt: 0,\n\t\t\tsessionId: '',\n\t\t};\n\t}\n\tconst rawData = JSON.parse( info );\n\treturn {\n\t\texpiresAt: rawData.expiresAt as number,\n\t\tsessionId: rawData.sessionId as string,\n\t};\n};\n","import { getAngieIframe, toggleAngieSidebar } from '@elementor-external/angie-sdk';\n\nexport const sendPromptToAngie = ( prompt?: string ) => {\n\tconst angieSidebar = getAngieIframe();\n\n\tif ( ! angieSidebar ) {\n\t\treturn;\n\t}\n\n\ttoggleAngieSidebar( angieSidebar, true );\n\n\tif ( ! prompt ) {\n\t\treturn;\n\t}\n\n\twindow.location.hash = `angie-prompt=${ encodeURIComponent( prompt ) }`;\n};\n","import { setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_INSTALL_URL = '/wp-admin/plugin-install.php?s=angie&tab=search&type=term';\n\nexport const redirectToInstallation = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\twindow.location.href = ANGIE_INSTALL_URL;\n};\n","import { ANGIE_SIDEBAR_STATE_OPEN, saveState, setReferrerRedirect } from '@elementor-external/angie-sdk';\n\nconst ANGIE_APP_URL = '/wp-admin/admin.php?page=angie-app';\n\nexport const redirectToAppAdmin = ( prompt?: string ) => {\n\tsetReferrerRedirect( window.location.href, prompt );\n\tsaveState( ANGIE_SIDEBAR_STATE_OPEN );\n\twindow.location.href = ANGIE_APP_URL;\n};\n","import apiFetch from '@wordpress/api-fetch';\n\ntype PluginResponse = {\n\tplugin: string;\n\tstatus: 'active' | 'inactive';\n\tname: string;\n};\n\ntype PluginErrorResponse = {\n\tcode: string;\n\tmessage: string;\n};\n\nexport type InstallAngieResult = { success: true } | { success: false; error: string; code?: string };\n\nconst ANGIE_SLUG = 'angie';\n\nconst isPluginErrorResponse = ( response: unknown ): response is PluginErrorResponse => {\n\treturn typeof response === 'object' && response !== null && 'code' in response && 'message' in response;\n};\n\nconst activatePlugin = async ( pluginPath: string ): Promise< PluginResponse > => {\n\treturn apiFetch< PluginResponse >( {\n\t\tpath: `/wp/v2/plugins/${ pluginPath }`,\n\t\tmethod: 'POST',\n\t\tdata: { status: 'active' },\n\t} );\n};\n\nconst installPlugin = async (): Promise< PluginResponse > => {\n\ttry {\n\t\treturn await apiFetch< PluginResponse >( {\n\t\t\tpath: '/wp/v2/plugins',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tslug: ANGIE_SLUG,\n\t\t\t\tstatus: 'active',\n\t\t\t},\n\t\t} );\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) && error.code === 'folder_exists' ) {\n\t\t\treturn activatePlugin( `${ ANGIE_SLUG }/${ ANGIE_SLUG }` );\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n\nexport const installAngiePlugin = async (): Promise< InstallAngieResult > => {\n\ttry {\n\t\tawait installPlugin();\n\n\t\treturn { success: true };\n\t} catch ( error: unknown ) {\n\t\tif ( isPluginErrorResponse( error ) ) {\n\t\t\treturn { success: false, error: error.message, code: error.code };\n\t\t}\n\n\t\treturn { success: false, error: 'Unknown error occurred' };\n\t}\n};\n","import apiFetch from '@wordpress/api-fetch';\n\nexport const saveAngieConsent = async (): Promise< void > => {\n\tawait apiFetch( {\n\t\tpath: '/elementor/v1/angie/consent',\n\t\tmethod: 'POST',\n\t} );\n};\n","import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';\n\nlet isInitialized = false;\nexport async function startMCPServer() {\n\tif ( isInitialized ) {\n\t\treturn;\n\t}\n\tisInitialized = true;\n\ttry {\n\t\tawait createAndRegisterAdapters();\n\t} catch ( error ) {\n\t\t/* eslint-disable-next-line no-console */\n\t\tconsole.error( 'MCP adapter activation failed:', error );\n\t} finally {\n\t\tsignalMcpReady();\n\t}\n}\n\nif ( typeof document !== 'undefined' ) {\n\tdocument.addEventListener( 'DOMContentLoaded', () => void startMCPServer(), { once: true } );\n} else {\n\tvoid startMCPServer();\n}\n","export const MCP_STYLES_APPLIED_EVENT = 'elementor/mcp/styles-applied';\n\nexport type McpStylesAppliedPayload = {\n\tstyleValue: Record< string, unknown >;\n};\n\nexport function dispatchMcpStylesAppliedEvent( payload: McpStylesAppliedPayload ): void {\n\twindow.dispatchEvent( new CustomEvent( MCP_STYLES_APPLIED_EVENT, { detail: payload } ) );\n}\n"],"mappings":"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","names":["McpServer","SamplingMessageSchema","getAngieIframe","z","sdk","getRegisteredMcpServers","z","getAngieIframe","ANGIE_SIDEBAR_STATE_OPEN","setReferrerRedirect","apiFetch"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-mcp",
|
|
3
|
-
"version": "4.2.0-
|
|
3
|
+
"version": "4.2.0-beta2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@elementor-external/angie-sdk": "npm:@elementor/angie-sdk@^1.4.5",
|
|
46
|
-
"@elementor/editor-v1-adapters": "4.2.0-
|
|
47
|
-
"@elementor/schema": "4.2.0-
|
|
48
|
-
"@elementor/store": "4.2.0-
|
|
46
|
+
"@elementor/editor-v1-adapters": "4.2.0-beta2",
|
|
47
|
+
"@elementor/schema": "4.2.0-beta2",
|
|
48
|
+
"@elementor/store": "4.2.0-beta2",
|
|
49
49
|
"@modelcontextprotocol/sdk": "1.27.1",
|
|
50
50
|
"@wordpress/api-fetch": "^6.42.0",
|
|
51
51
|
"zod-to-json-schema": "3.24.6"
|
package/src/adapters/types.ts
CHANGED
|
@@ -22,7 +22,7 @@ export interface IMcpRegistrationAdapter {
|
|
|
22
22
|
/**
|
|
23
23
|
* Called once at startup to activate the adapter's server registrations.
|
|
24
24
|
*/
|
|
25
|
-
activate: () =>
|
|
25
|
+
activate: () => Promise< void >;
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Called once per tool when addTool() is invoked.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
2
2
|
import { z, type z3 } from '@elementor/schema';
|
|
3
3
|
|
|
4
|
+
import { type ModelContextRegisterTool, registerModelContextTool } from '../utils/register-model-context-tool';
|
|
4
5
|
import {
|
|
5
6
|
type IMcpRegistrationAdapter,
|
|
6
7
|
type McpResourceHandler,
|
|
@@ -12,8 +13,8 @@ import {
|
|
|
12
13
|
type ZodRawShape = z3.ZodRawShape;
|
|
13
14
|
|
|
14
15
|
export type ModelContext = {
|
|
15
|
-
registerTool:
|
|
16
|
-
unregisterTool
|
|
16
|
+
registerTool: ModelContextRegisterTool;
|
|
17
|
+
unregisterTool?: ( name: string ) => void;
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
type ResourceEntry = {
|
|
@@ -29,12 +30,12 @@ export class WebMCPAdapter implements IMcpRegistrationAdapter {
|
|
|
29
30
|
|
|
30
31
|
constructor( private readonly ctx: ModelContext ) {}
|
|
31
32
|
|
|
32
|
-
activate(): void {
|
|
33
|
+
activate(): Promise< void > {
|
|
33
34
|
if ( this.activated ) {
|
|
34
|
-
return;
|
|
35
|
+
return Promise.resolve();
|
|
35
36
|
}
|
|
36
37
|
this.activated = true;
|
|
37
|
-
this.ctx.registerTool
|
|
38
|
+
return registerModelContextTool( this.ctx.registerTool, {
|
|
38
39
|
name: 'editor-resource-getter',
|
|
39
40
|
description:
|
|
40
41
|
'Get an editor resource by URI, or search for available resources by partial URI. Pass a full URI to retrieve content, or a partial string to discover matching patterns.',
|
|
@@ -98,7 +99,8 @@ export class WebMCPAdapter implements IMcpRegistrationAdapter {
|
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
if ( this.registeredToolNames.has( tool.name ) ) {
|
|
101
|
-
this.ctx.unregisterTool( tool.name );
|
|
102
|
+
this.ctx.unregisterTool?.( tool.name );
|
|
103
|
+
this.registeredToolNames.delete( tool.name );
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
let resourcesDescription = '';
|
|
@@ -111,13 +113,14 @@ export class WebMCPAdapter implements IMcpRegistrationAdapter {
|
|
|
111
113
|
}
|
|
112
114
|
resourcesDescription += `To read resources, use editor-resource-getter tool.\n\n`;
|
|
113
115
|
}
|
|
114
|
-
this.ctx.registerTool
|
|
116
|
+
void registerModelContextTool( this.ctx.registerTool, {
|
|
115
117
|
name: tool.name,
|
|
116
118
|
description: `${ resourcesDescription }${ tool.description }`,
|
|
117
119
|
inputSchema: jsonSchema,
|
|
118
120
|
execute: tool.execute,
|
|
121
|
+
} ).then( () => {
|
|
122
|
+
this.registeredToolNames.add( tool.name );
|
|
119
123
|
} );
|
|
120
|
-
this.registeredToolNames.add( tool.name );
|
|
121
124
|
}
|
|
122
125
|
|
|
123
126
|
onResourceRegistered( _name: string, uriOrTemplate: McpResourceUriOrTemplate, handler: McpResourceHandler ): void {
|
package/src/init.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { createAndRegisterAdapters, signalMcpReady } from './mcp-registry';
|
|
2
2
|
|
|
3
3
|
let isInitialized = false;
|
|
4
|
-
export function startMCPServer() {
|
|
4
|
+
export async function startMCPServer() {
|
|
5
5
|
if ( isInitialized ) {
|
|
6
6
|
return;
|
|
7
7
|
}
|
|
8
8
|
isInitialized = true;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
try {
|
|
10
|
+
await createAndRegisterAdapters();
|
|
11
|
+
} catch ( error ) {
|
|
12
|
+
/* eslint-disable-next-line no-console */
|
|
13
|
+
console.error( 'MCP adapter activation failed:', error );
|
|
14
|
+
} finally {
|
|
15
|
+
signalMcpReady();
|
|
16
|
+
}
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
if ( typeof document !== 'undefined' ) {
|
|
15
|
-
document.addEventListener( 'DOMContentLoaded', () => startMCPServer(), { once: true } );
|
|
20
|
+
document.addEventListener( 'DOMContentLoaded', () => void startMCPServer(), { once: true } );
|
|
16
21
|
} else {
|
|
17
|
-
startMCPServer();
|
|
22
|
+
void startMCPServer();
|
|
18
23
|
}
|
package/src/mcp-registry.ts
CHANGED
|
@@ -58,7 +58,7 @@ export const signalMcpReady = (): void => {
|
|
|
58
58
|
resolveReady();
|
|
59
59
|
};
|
|
60
60
|
|
|
61
|
-
export const createAndRegisterAdapters = () => {
|
|
61
|
+
export const createAndRegisterAdapters = async (): Promise< void > => {
|
|
62
62
|
const modelContext = getModelContext();
|
|
63
63
|
|
|
64
64
|
if ( modelContext ) {
|
|
@@ -69,14 +69,14 @@ export const createAndRegisterAdapters = () => {
|
|
|
69
69
|
registerMcpAdapter( new AngieMcpAdapter( getSDK(), getRegisteredMcpServers ) );
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
registrationAdapters.
|
|
72
|
+
await Promise.all( registrationAdapters.map( ( adapter ) => adapter.activate() ) );
|
|
73
73
|
};
|
|
74
74
|
|
|
75
75
|
// utility function to run a callback on all MCP interfaces
|
|
76
|
-
function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {
|
|
77
|
-
for ( const adapter of registrationAdapters ) {
|
|
76
|
+
async function callAdapters( fn: ( adapter: IMcpRegistrationAdapter ) => unknown ) {
|
|
77
|
+
for await ( const adapter of registrationAdapters ) {
|
|
78
78
|
try {
|
|
79
|
-
fn( adapter );
|
|
79
|
+
await Promise.resolve( fn( adapter ) );
|
|
80
80
|
} catch {
|
|
81
81
|
// adapter failed — exit quietly, continue to next
|
|
82
82
|
}
|
|
@@ -4,11 +4,24 @@ type ModelContextHost = {
|
|
|
4
4
|
modelContext?: ModelContext;
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
function bindModelContextMethods( host: ModelContext ): ModelContext {
|
|
8
|
+
return {
|
|
9
|
+
registerTool: host.registerTool.bind( host ),
|
|
10
|
+
unregisterTool: host.unregisterTool ? host.unregisterTool.bind( host ) : undefined,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
7
14
|
export function getModelContext(): ModelContext | undefined {
|
|
8
15
|
const documentModelContext =
|
|
9
16
|
typeof document !== 'undefined' ? ( document as unknown as ModelContextHost ).modelContext : undefined;
|
|
17
|
+
if ( documentModelContext?.registerTool ) {
|
|
18
|
+
return bindModelContextMethods( documentModelContext );
|
|
19
|
+
}
|
|
10
20
|
const navigatorModelContext =
|
|
11
21
|
typeof navigator !== 'undefined' ? ( navigator as unknown as ModelContextHost ).modelContext : undefined;
|
|
22
|
+
if ( navigatorModelContext?.registerTool ) {
|
|
23
|
+
return bindModelContextMethods( navigatorModelContext );
|
|
24
|
+
}
|
|
12
25
|
|
|
13
|
-
return
|
|
26
|
+
return undefined;
|
|
14
27
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type McpToolDescriptor } from '../adapters/types';
|
|
2
|
+
|
|
3
|
+
export type ModelContextRegisterTool = ( tool: McpToolDescriptor ) => void | Promise< void >;
|
|
4
|
+
|
|
5
|
+
export async function registerModelContextTool(
|
|
6
|
+
registerTool: ModelContextRegisterTool,
|
|
7
|
+
tool: McpToolDescriptor
|
|
8
|
+
): Promise< void > {
|
|
9
|
+
try {
|
|
10
|
+
await Promise.resolve( registerTool( tool ) );
|
|
11
|
+
} catch ( error ) {
|
|
12
|
+
/* eslint-disable-next-line no-console */
|
|
13
|
+
console.error( 'Tool registration failed:', error );
|
|
14
|
+
}
|
|
15
|
+
}
|