@elementor/editor-mcp 3.35.0-353 → 3.35.0-355

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 CHANGED
@@ -27,13 +27,18 @@ interface MCPRegistryEntry {
27
27
  sessionId: string;
28
28
  expiresAt: number;
29
29
  };
30
+ sendResourceUpdated: McpServer['server']['sendResourceUpdated'];
31
+ resource: McpServer['resource'];
30
32
  mcpServer: McpServer;
33
+ waitForReady: () => Promise<void>;
31
34
  }
32
35
  type ResourceList = {
33
36
  uri: string;
34
37
  description: string;
35
38
  }[];
36
- type ToolRegistrationOptions<InputArgs extends undefined | z.ZodRawShape = undefined, OutputSchema extends undefined | z.ZodRawShape = undefined, ExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType<OutputSchema, z.ZodTypeAny> : string> = {
39
+ type ToolRegistrationOptions<InputArgs extends undefined | z.ZodRawShape = undefined, OutputSchema extends undefined | z.ZodRawShape = undefined, ExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType<OutputSchema & {
40
+ llm_instructions?: string;
41
+ }, z.ZodTypeAny> : string> = {
37
42
  name: string;
38
43
  description: string;
39
44
  schema?: InputArgs;
package/dist/index.d.ts CHANGED
@@ -27,13 +27,18 @@ interface MCPRegistryEntry {
27
27
  sessionId: string;
28
28
  expiresAt: number;
29
29
  };
30
+ sendResourceUpdated: McpServer['server']['sendResourceUpdated'];
31
+ resource: McpServer['resource'];
30
32
  mcpServer: McpServer;
33
+ waitForReady: () => Promise<void>;
31
34
  }
32
35
  type ResourceList = {
33
36
  uri: string;
34
37
  description: string;
35
38
  }[];
36
- type ToolRegistrationOptions<InputArgs extends undefined | z.ZodRawShape = undefined, OutputSchema extends undefined | z.ZodRawShape = undefined, ExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType<OutputSchema, z.ZodTypeAny> : string> = {
39
+ type ToolRegistrationOptions<InputArgs extends undefined | z.ZodRawShape = undefined, OutputSchema extends undefined | z.ZodRawShape = undefined, ExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType<OutputSchema & {
40
+ llm_instructions?: string;
41
+ }, z.ZodTypeAny> : string> = {
37
42
  name: string;
38
43
  description: string;
39
44
  schema?: InputArgs;
package/dist/index.js CHANGED
@@ -33,11 +33,29 @@ __export(index_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(index_exports);
35
35
 
36
+ // src/get-sdk.ts
37
+ var import_angie_sdk = require("@elementor-external/angie-sdk");
38
+ var sdk;
39
+ var getSDK = () => {
40
+ const isMCPDisabled = !!globalThis.__ELEMENTOR_MCP_DISABLED__;
41
+ if (isMCPDisabled) {
42
+ return {};
43
+ }
44
+ if (!sdk) {
45
+ sdk = new import_angie_sdk.AngieMcpSdk();
46
+ }
47
+ return sdk;
48
+ };
49
+
50
+ // src/index.ts
51
+ var import_mcp2 = require("@modelcontextprotocol/sdk/server/mcp.js");
52
+ var import_types2 = require("@modelcontextprotocol/sdk/types.js");
53
+
36
54
  // src/init.ts
37
55
  var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
38
- var import_angie_sdk = require("@elementor-external/angie-sdk");
39
56
 
40
57
  // src/mcp-registry.ts
58
+ var import_schema = require("@elementor/schema");
41
59
  var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
42
60
 
43
61
  // src/test-utils/mock-mcp-registry.ts
@@ -53,6 +71,12 @@ var mock = new Proxy(
53
71
  );
54
72
  var mockMcpRegistry = () => {
55
73
  return {
74
+ // @ts-ignore
75
+ resource: async () => {
76
+ },
77
+ // @ts-ignore
78
+ sendResourceUpdated: () => {
79
+ },
56
80
  addTool: () => {
57
81
  },
58
82
  setMCPDescription: () => {
@@ -114,6 +138,18 @@ var getMCPByDomain = (namespace, options) => {
114
138
  const mcpServer = mcpRegistry[namespace];
115
139
  const { addTool } = createToolRegistrator(mcpServer);
116
140
  return {
141
+ waitForReady: () => getSDK().waitForReady(),
142
+ // @ts-expect-error: TS is unable to infer the type here
143
+ resource: async (...args) => {
144
+ await getSDK().waitForReady();
145
+ return mcpServer.resource(...args);
146
+ },
147
+ sendResourceUpdated: (...args) => {
148
+ return new Promise(async () => {
149
+ await getSDK().waitForReady();
150
+ mcpServer.server.sendResourceUpdated(...args);
151
+ });
152
+ },
117
153
  mcpServer,
118
154
  addTool,
119
155
  setMCPDescription: (description) => {
@@ -138,6 +174,11 @@ var getMCPByDomain = (namespace, options) => {
138
174
  function createToolRegistrator(server) {
139
175
  function addTool(opts) {
140
176
  const outputSchema = opts.outputSchema;
177
+ if (outputSchema && !("llm_instructions" in outputSchema)) {
178
+ Object.assign(outputSchema, {
179
+ llm_instruction: import_schema.z.string().optional().describe("Instructions for what to do next")
180
+ });
181
+ }
141
182
  const inputSchema = opts.schema ? opts.schema : {};
142
183
  const toolCallback = async function(args, extra) {
143
184
  try {
@@ -192,17 +233,6 @@ function createToolRegistrator(server) {
192
233
  }
193
234
 
194
235
  // src/init.ts
195
- var sdk;
196
- var getSDK = () => {
197
- const isMCPDisabled = !!globalThis.__ELEMENTOR_MCP_DISABLED__;
198
- if (isMCPDisabled) {
199
- return {};
200
- }
201
- if (!sdk) {
202
- sdk = new import_angie_sdk.AngieMcpSdk();
203
- }
204
- return sdk;
205
- };
206
236
  function init() {
207
237
  if ((0, import_editor_v1_adapters.isExperimentActive)("editor_mcp")) {
208
238
  return getSDK().waitForReady();
@@ -211,7 +241,8 @@ function init() {
211
241
  }
212
242
  function startMCPServer() {
213
243
  if ((0, import_editor_v1_adapters.isExperimentActive)("editor_mcp")) {
214
- return getSDK().waitForReady().then(() => activateMcpRegistration(sdk));
244
+ const sdk2 = getSDK();
245
+ sdk2.waitForReady().then(() => activateMcpRegistration(sdk2));
215
246
  }
216
247
  return Promise.resolve();
217
248
  }
@@ -225,10 +256,6 @@ document.addEventListener(
225
256
  }
226
257
  );
227
258
 
228
- // src/index.ts
229
- var import_mcp2 = require("@modelcontextprotocol/sdk/server/mcp.js");
230
- var import_types2 = require("@modelcontextprotocol/sdk/types.js");
231
-
232
259
  // src/sampler.ts
233
260
  var import_types = require("@modelcontextprotocol/sdk/types.js");
234
261
  var DEFAULT_OPTS = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/init.ts","../src/mcp-registry.ts","../src/test-utils/mock-mcp-registry.ts","../src/sampler.ts","../src/utils/prompt-builder.ts"],"sourcesContent":["import { getSDK } from './init';\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 { init } from './init';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport const getAngieSdk = () => getSDK();\n","import { isExperimentActive } from '@elementor/editor-v1-adapters';\nimport { AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { activateMcpRegistration } from './mcp-registry';\n\nlet sdk: AngieMcpSdk;\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 AngieMcpSdk();\n\t}\n\treturn sdk;\n};\n\nexport function init() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\treturn getSDK().waitForReady();\n\t}\n\treturn Promise.resolve();\n}\n\nexport function startMCPServer() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\treturn getSDK()\n\t\t\t.waitForReady()\n\t\t\t.then( () => activateMcpRegistration( sdk ) );\n\t}\n\treturn Promise.resolve();\n}\n\ndocument.addEventListener(\n\t'DOMContentLoaded',\n\t() => {\n\t\tstartMCPServer();\n\t},\n\t{\n\t\tonce: true,\n\t}\n);\n","import { type z, type z3 } from '@elementor/schema';\nimport { type AngieMcpSdk } from '@elementor-external/angie-sdk';\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 { mockMcpRegistry } from './test-utils/mock-mcp-registry';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nlet isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport async function activateMcpRegistration( sdk: AngieMcpSdk ) {\n\tif ( isMcpRegistrationActivated ) {\n\t\treturn;\n\t}\n\tisMcpRegistrationActivated = true;\n\tconst mcpServerList = Object.entries( mcpRegistry );\n\tfor await ( const entry of mcpServerList ) {\n\t\tconst [ key, mcpServer ] = entry;\n\t\tawait sdk.registerLocalServer( {\n\t\t\tname: `editor-${ key }`,\n\t\t\tserver: mcpServer,\n\t\t\tversion: '1.0.0',\n\t\t\tdescription: mcpDescriptions[ key ] || key,\n\t\t} );\n\t}\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 *\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions\n */\nexport const getMCPByDomain = ( namespace: string, options?: { instructions?: string } ): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( 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{\n\t\t\t\tname: mcpName,\n\t\t\t\tversion: '1.0.0',\n\t\t\t},\n\t\t\t{\n\t\t\t\tinstructions: options?.instructions,\n\t\t\t}\n\t\t);\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst { addTool } = createToolRegistrator( mcpServer );\n\treturn {\n\t\tmcpServer,\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t\tgetActiveChatInfo: () => {\n\t\t\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\t\t\tif ( ! info ) {\n\t\t\t\treturn {\n\t\t\t\t\texpiresAt: 0,\n\t\t\t\t\tsessionId: '',\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst rawData = JSON.parse( info );\n\t\t\treturn {\n\t\t\t\texpiresAt: rawData.expiresAt as number,\n\t\t\t\tsessionId: rawData.sessionId as string,\n\t\t\t};\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\tgetActiveChatInfo: () => { sessionId: string; expiresAt: number };\n\tmcpServer: McpServer;\n}\n\ntype ResourceList = {\n\turi: string;\n\tdescription: string;\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\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\tisDestrcutive?: boolean;\n\trequiredResources?: ResourceList;\n};\n\nfunction createToolRegistrator( server: McpServer ) {\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\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\tstructuredContent: 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\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.isDestrcutive,\n\t\t\treadOnlyHint: opts.isDestrcutive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tif ( opts.requiredResources ) {\n\t\t\tannotations[ 'angie/requiredResources' ] = opts.requiredResources;\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\toutputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\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\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tgetActiveChatInfo() {\n\t\t\treturn { sessionId: 'mock-session-id', expiresAt: Date.now() + 3600000 };\n\t\t},\n\t\tmcpServer: mock as McpServer,\n\t};\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\ttry {\n\t\t\treturn JSON.parse( result.content.text as string );\n\t\t} catch {\n\t\t\treturn result.content;\n\t\t}\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\n${ this._parameters.length ? '# Parameters' : '' }\n${ Object.values( this._parameters ).join( '\\n\\n' ) }\n\n${ this._examples.length ? '# Examples' : '' }\n${ this.examples }\n\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"],"mappings":"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","names":["sdk","import_mcp","import_types"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/get-sdk.ts","../src/init.ts","../src/mcp-registry.ts","../src/test-utils/mock-mcp-registry.ts","../src/sampler.ts","../src/utils/prompt-builder.ts"],"sourcesContent":["import { getSDK } from './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 { init } from './init';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport const getAngieSdk = () => getSDK();\n","import { AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\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 AngieMcpSdk();\n\t}\n\treturn sdk;\n};\n","import { isExperimentActive } from '@elementor/editor-v1-adapters';\n\nimport { getSDK } from './get-sdk';\nimport { activateMcpRegistration } from './mcp-registry';\n\nexport function init() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\treturn getSDK().waitForReady();\n\t}\n\treturn Promise.resolve();\n}\n\nexport function startMCPServer() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\tconst sdk = getSDK();\n\t\tsdk.waitForReady().then( () => activateMcpRegistration( sdk ) );\n\t}\n\treturn Promise.resolve();\n}\n\ndocument.addEventListener(\n\t'DOMContentLoaded',\n\t() => {\n\t\tstartMCPServer();\n\t},\n\t{\n\t\tonce: true,\n\t}\n);\n","import { z, type z3 } from '@elementor/schema';\nimport { type AngieMcpSdk } from '@elementor-external/angie-sdk';\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 { getSDK } from './get-sdk';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nlet isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport async function activateMcpRegistration( sdk: AngieMcpSdk ) {\n\tif ( isMcpRegistrationActivated ) {\n\t\treturn;\n\t}\n\tisMcpRegistrationActivated = true;\n\tconst mcpServerList = Object.entries( mcpRegistry );\n\tfor await ( const entry of mcpServerList ) {\n\t\tconst [ key, mcpServer ] = entry;\n\t\tawait sdk.registerLocalServer( {\n\t\t\tname: `editor-${ key }`,\n\t\t\tserver: mcpServer,\n\t\t\tversion: '1.0.0',\n\t\t\tdescription: mcpDescriptions[ key ] || key,\n\t\t} );\n\t}\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 *\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions\n */\nexport const getMCPByDomain = ( namespace: string, options?: { instructions?: string } ): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( 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{\n\t\t\t\tname: mcpName,\n\t\t\t\tversion: '1.0.0',\n\t\t\t},\n\t\t\t{\n\t\t\t\tinstructions: options?.instructions,\n\t\t\t}\n\t\t);\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst { addTool } = createToolRegistrator( mcpServer );\n\treturn {\n\t\twaitForReady: () => getSDK().waitForReady(),\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'resource' ] > ) => {\n\t\t\tawait getSDK().waitForReady();\n\t\t\treturn mcpServer.resource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\treturn new Promise( async () => {\n\t\t\t\tawait getSDK().waitForReady();\n\t\t\t\tmcpServer.server.sendResourceUpdated( ...args );\n\t\t\t} );\n\t\t},\n\t\tmcpServer,\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t\tgetActiveChatInfo: () => {\n\t\t\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\t\t\tif ( ! info ) {\n\t\t\t\treturn {\n\t\t\t\t\texpiresAt: 0,\n\t\t\t\t\tsessionId: '',\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst rawData = JSON.parse( info );\n\t\t\treturn {\n\t\t\t\texpiresAt: rawData.expiresAt as number,\n\t\t\t\tsessionId: rawData.sessionId as string,\n\t\t\t};\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\tgetActiveChatInfo: () => { sessionId: string; expiresAt: number };\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'resource' ];\n\tmcpServer: McpServer;\n\twaitForReady: () => Promise< void >;\n}\n\ntype ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape\n\t\t? z.objectOutputType< OutputSchema & { llm_instructions?: string }, z.ZodTypeAny >\n\t\t: string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\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\tisDestrcutive?: boolean;\n\trequiredResources?: ResourceList;\n};\n\nfunction createToolRegistrator( server: McpServer ) {\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 && ! ( 'llm_instructions' in outputSchema ) ) {\n\t\t\tObject.assign( outputSchema, {\n\t\t\t\tllm_instruction: z.string().optional().describe( 'Instructions for what to do next' ),\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\tstructuredContent: 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\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.isDestrcutive,\n\t\t\treadOnlyHint: opts.isDestrcutive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tif ( opts.requiredResources ) {\n\t\t\tannotations[ 'angie/requiredResources' ] = opts.requiredResources;\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\toutputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\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\tgetActiveChatInfo() {\n\t\t\treturn { sessionId: 'mock-session-id', expiresAt: Date.now() + 3600000 };\n\t\t},\n\t\tmcpServer: mock as McpServer,\n\t};\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\ttry {\n\t\t\treturn JSON.parse( result.content.text as string );\n\t\t} catch {\n\t\t\treturn result.content;\n\t\t}\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\n${ this._parameters.length ? '# Parameters' : '' }\n${ Object.values( this._parameters ).join( '\\n\\n' ) }\n\n${ this._examples.length ? '# Examples' : '' }\n${ this.examples }\n\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"],"mappings":"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","names":["import_mcp","import_types","sdk","sdk"]}
package/dist/index.mjs CHANGED
@@ -1,8 +1,29 @@
1
+ // src/get-sdk.ts
2
+ import { AngieMcpSdk } from "@elementor-external/angie-sdk";
3
+ var sdk;
4
+ var getSDK = () => {
5
+ const isMCPDisabled = !!globalThis.__ELEMENTOR_MCP_DISABLED__;
6
+ if (isMCPDisabled) {
7
+ return {};
8
+ }
9
+ if (!sdk) {
10
+ sdk = new AngieMcpSdk();
11
+ }
12
+ return sdk;
13
+ };
14
+
15
+ // src/index.ts
16
+ import {
17
+ McpServer as McpServer2,
18
+ ResourceTemplate
19
+ } from "@modelcontextprotocol/sdk/server/mcp.js";
20
+ import { SamplingMessageSchema as SamplingMessageSchema2 } from "@modelcontextprotocol/sdk/types.js";
21
+
1
22
  // src/init.ts
2
23
  import { isExperimentActive } from "@elementor/editor-v1-adapters";
3
- import { AngieMcpSdk } from "@elementor-external/angie-sdk";
4
24
 
5
25
  // src/mcp-registry.ts
26
+ import { z } from "@elementor/schema";
6
27
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
28
 
8
29
  // src/test-utils/mock-mcp-registry.ts
@@ -18,6 +39,12 @@ var mock = new Proxy(
18
39
  );
19
40
  var mockMcpRegistry = () => {
20
41
  return {
42
+ // @ts-ignore
43
+ resource: async () => {
44
+ },
45
+ // @ts-ignore
46
+ sendResourceUpdated: () => {
47
+ },
21
48
  addTool: () => {
22
49
  },
23
50
  setMCPDescription: () => {
@@ -79,6 +106,18 @@ var getMCPByDomain = (namespace, options) => {
79
106
  const mcpServer = mcpRegistry[namespace];
80
107
  const { addTool } = createToolRegistrator(mcpServer);
81
108
  return {
109
+ waitForReady: () => getSDK().waitForReady(),
110
+ // @ts-expect-error: TS is unable to infer the type here
111
+ resource: async (...args) => {
112
+ await getSDK().waitForReady();
113
+ return mcpServer.resource(...args);
114
+ },
115
+ sendResourceUpdated: (...args) => {
116
+ return new Promise(async () => {
117
+ await getSDK().waitForReady();
118
+ mcpServer.server.sendResourceUpdated(...args);
119
+ });
120
+ },
82
121
  mcpServer,
83
122
  addTool,
84
123
  setMCPDescription: (description) => {
@@ -103,6 +142,11 @@ var getMCPByDomain = (namespace, options) => {
103
142
  function createToolRegistrator(server) {
104
143
  function addTool(opts) {
105
144
  const outputSchema = opts.outputSchema;
145
+ if (outputSchema && !("llm_instructions" in outputSchema)) {
146
+ Object.assign(outputSchema, {
147
+ llm_instruction: z.string().optional().describe("Instructions for what to do next")
148
+ });
149
+ }
106
150
  const inputSchema = opts.schema ? opts.schema : {};
107
151
  const toolCallback = async function(args, extra) {
108
152
  try {
@@ -157,17 +201,6 @@ function createToolRegistrator(server) {
157
201
  }
158
202
 
159
203
  // src/init.ts
160
- var sdk;
161
- var getSDK = () => {
162
- const isMCPDisabled = !!globalThis.__ELEMENTOR_MCP_DISABLED__;
163
- if (isMCPDisabled) {
164
- return {};
165
- }
166
- if (!sdk) {
167
- sdk = new AngieMcpSdk();
168
- }
169
- return sdk;
170
- };
171
204
  function init() {
172
205
  if (isExperimentActive("editor_mcp")) {
173
206
  return getSDK().waitForReady();
@@ -176,7 +209,8 @@ function init() {
176
209
  }
177
210
  function startMCPServer() {
178
211
  if (isExperimentActive("editor_mcp")) {
179
- return getSDK().waitForReady().then(() => activateMcpRegistration(sdk));
212
+ const sdk2 = getSDK();
213
+ sdk2.waitForReady().then(() => activateMcpRegistration(sdk2));
180
214
  }
181
215
  return Promise.resolve();
182
216
  }
@@ -190,13 +224,6 @@ document.addEventListener(
190
224
  }
191
225
  );
192
226
 
193
- // src/index.ts
194
- import {
195
- McpServer as McpServer2,
196
- ResourceTemplate
197
- } from "@modelcontextprotocol/sdk/server/mcp.js";
198
- import { SamplingMessageSchema as SamplingMessageSchema2 } from "@modelcontextprotocol/sdk/types.js";
199
-
200
227
  // src/sampler.ts
201
228
  import { SamplingMessageSchema } from "@modelcontextprotocol/sdk/types.js";
202
229
  var DEFAULT_OPTS = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/init.ts","../src/mcp-registry.ts","../src/test-utils/mock-mcp-registry.ts","../src/index.ts","../src/sampler.ts","../src/utils/prompt-builder.ts"],"sourcesContent":["import { isExperimentActive } from '@elementor/editor-v1-adapters';\nimport { AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nimport { activateMcpRegistration } from './mcp-registry';\n\nlet sdk: AngieMcpSdk;\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 AngieMcpSdk();\n\t}\n\treturn sdk;\n};\n\nexport function init() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\treturn getSDK().waitForReady();\n\t}\n\treturn Promise.resolve();\n}\n\nexport function startMCPServer() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\treturn getSDK()\n\t\t\t.waitForReady()\n\t\t\t.then( () => activateMcpRegistration( sdk ) );\n\t}\n\treturn Promise.resolve();\n}\n\ndocument.addEventListener(\n\t'DOMContentLoaded',\n\t() => {\n\t\tstartMCPServer();\n\t},\n\t{\n\t\tonce: true,\n\t}\n);\n","import { type z, type z3 } from '@elementor/schema';\nimport { type AngieMcpSdk } from '@elementor-external/angie-sdk';\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 { mockMcpRegistry } from './test-utils/mock-mcp-registry';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nlet isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport async function activateMcpRegistration( sdk: AngieMcpSdk ) {\n\tif ( isMcpRegistrationActivated ) {\n\t\treturn;\n\t}\n\tisMcpRegistrationActivated = true;\n\tconst mcpServerList = Object.entries( mcpRegistry );\n\tfor await ( const entry of mcpServerList ) {\n\t\tconst [ key, mcpServer ] = entry;\n\t\tawait sdk.registerLocalServer( {\n\t\t\tname: `editor-${ key }`,\n\t\t\tserver: mcpServer,\n\t\t\tversion: '1.0.0',\n\t\t\tdescription: mcpDescriptions[ key ] || key,\n\t\t} );\n\t}\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 *\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions\n */\nexport const getMCPByDomain = ( namespace: string, options?: { instructions?: string } ): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( 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{\n\t\t\t\tname: mcpName,\n\t\t\t\tversion: '1.0.0',\n\t\t\t},\n\t\t\t{\n\t\t\t\tinstructions: options?.instructions,\n\t\t\t}\n\t\t);\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst { addTool } = createToolRegistrator( mcpServer );\n\treturn {\n\t\tmcpServer,\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t\tgetActiveChatInfo: () => {\n\t\t\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\t\t\tif ( ! info ) {\n\t\t\t\treturn {\n\t\t\t\t\texpiresAt: 0,\n\t\t\t\t\tsessionId: '',\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst rawData = JSON.parse( info );\n\t\t\treturn {\n\t\t\t\texpiresAt: rawData.expiresAt as number,\n\t\t\t\tsessionId: rawData.sessionId as string,\n\t\t\t};\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\tgetActiveChatInfo: () => { sessionId: string; expiresAt: number };\n\tmcpServer: McpServer;\n}\n\ntype ResourceList = {\n\turi: string;\n\tdescription: string;\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\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\tisDestrcutive?: boolean;\n\trequiredResources?: ResourceList;\n};\n\nfunction createToolRegistrator( server: McpServer ) {\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\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\tstructuredContent: 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\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.isDestrcutive,\n\t\t\treadOnlyHint: opts.isDestrcutive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tif ( opts.requiredResources ) {\n\t\t\tannotations[ 'angie/requiredResources' ] = opts.requiredResources;\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\toutputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\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\taddTool: () => {},\n\t\tsetMCPDescription: () => {},\n\t\tgetActiveChatInfo() {\n\t\t\treturn { sessionId: 'mock-session-id', expiresAt: Date.now() + 3600000 };\n\t\t},\n\t\tmcpServer: mock as McpServer,\n\t};\n};\n","import { getSDK } from './init';\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 { init } from './init';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport const getAngieSdk = () => getSDK();\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\ttry {\n\t\t\treturn JSON.parse( result.content.text as string );\n\t\t} catch {\n\t\t\treturn result.content;\n\t\t}\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\n${ this._parameters.length ? '# Parameters' : '' }\n${ Object.values( this._parameters ).join( '\\n\\n' ) }\n\n${ this._examples.length ? '# Examples' : '' }\n${ this.examples }\n\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"],"mappings":";AAAA,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;;;ACC5B,SAAS,iBAAoC;;;ACE7C,IAAM,OAAO,IAAI;AAAA,EAChB,CAAC;AAAA,EACD;AAAA,IACC,KAAK,MAAM;AAEV,eAAS,YAAa,GAAe;AAAA,MAAC;AACtC,aAAO;AAAA,IACR;AAAA,EACD;AACD;AAEO,IAAM,kBAAkB,MAAwB;AACtD,SAAO;AAAA,IACN,SAAS,MAAM;AAAA,IAAC;AAAA,IAChB,mBAAmB,MAAM;AAAA,IAAC;AAAA,IAC1B,oBAAoB;AACnB,aAAO,EAAE,WAAW,mBAAmB,WAAW,KAAK,IAAI,IAAI,KAAQ;AAAA,IACxE;AAAA,IACA,WAAW;AAAA,EACZ;AACD;;;ADdA,IAAM,cAAoD,CAAC;AAC3D,IAAM,kBAAqD,CAAC;AAE5D,IAAI,6BAAsC,OAAO,WAAW,SAAS;AAE9D,IAAM,cAAc,CAAE,KAAgB,SAAkB;AAC9D,QAAM,UAAU,WAAY,IAAK;AACjC,cAAa,OAAQ,IAAI;AAC1B;AAEA,eAAsB,wBAAyBA,MAAmB;AACjE,MAAK,4BAA6B;AACjC;AAAA,EACD;AACA,+BAA6B;AAC7B,QAAM,gBAAgB,OAAO,QAAS,WAAY;AAClD,mBAAkB,SAAS,eAAgB;AAC1C,UAAM,CAAE,KAAK,SAAU,IAAI;AAC3B,UAAMA,KAAI,oBAAqB;AAAA,MAC9B,MAAM,UAAW,GAAI;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,aAAa,gBAAiB,GAAI,KAAK;AAAA,IACxC,CAAE;AAAA,EACH;AACD;AAEA,IAAM,aAAa,CAAE,QAAiC;AACrD,QAAM,SAAS,CAAC,CAAE,OAAO,YAAY,KAAM,GAAI;AAC/C,MAAK,CAAE,QAAS;AACf,UAAM,IAAI,MAAO,cAAe;AAAA,EACjC;AACA,SAAO;AACR;AAQO,IAAM,iBAAiB,CAAE,WAAmB,YAA2D;AAC7G,QAAM,UAAU,UAAW,WAAY,SAAU,CAAE;AAEnD,MAAK,OAAO,WAAW,SAAS,aAAc;AAC7C,WAAO,gBAAgB;AAAA,EACxB;AACA,MAAK,CAAE,YAAa,SAAU,GAAI;AACjC,gBAAa,SAAU,IAAI,IAAI;AAAA,MAC9B;AAAA,QACC,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,cAAc,SAAS;AAAA,MACxB;AAAA,IACD;AAAA,EACD;AACA,QAAM,YAAY,YAAa,SAAU;AACzC,QAAM,EAAE,QAAQ,IAAI,sBAAuB,SAAU;AACrD,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA,mBAAmB,CAAE,gBAAyB;AAC7C,sBAAiB,SAAU,IAAI;AAAA,IAChC;AAAA,IACA,mBAAmB,MAAM;AACxB,YAAM,OAAO,aAAa,QAAS,sBAAuB;AAC1D,UAAK,CAAE,MAAO;AACb,eAAO;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,QACZ;AAAA,MACD;AACA,YAAM,UAAU,KAAK,MAAO,IAAK;AACjC,aAAO;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,MACpB;AAAA,IACD;AAAA,EACD;AACD;AAsCA,SAAS,sBAAuB,QAAoB;AACnD,WAAS,QAGN,MAAwC;AAC1C,UAAM,eAAe,KAAK;AAE1B,UAAM,cAA2B,KAAK,SAAS,KAAK,SAAS,CAAC;AAC9D,UAAM,eAA4C,eAAiB,MAAM,OAAQ;AAChF,UAAI;AACH,cAAM,mBAAmB,MAAM,KAAK,QAAS,KAAK,SAAS,OAAO,CAAC,GAAG,KAAM;AAC5E,eAAO;AAAA,UACN,mBAAmB,OAAO,qBAAqB,WAAW,SAAY;AAAA,UACtE,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MACC,OAAO,qBAAqB,WACzB,mBACA,KAAK,UAAW,gBAAiB;AAAA,YACtC;AAAA,UACD;AAAA,QACD;AAAA,MACD,SAAU,OAAQ;AACjB,eAAO;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,MAAQ,MAAiB,WAAW;AAAA,YACrC;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,UAAM,cAAyC;AAAA,MAC9C,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK,gBAAgB,QAAQ;AAAA,MAC3C,OAAO,KAAK;AAAA,IACb;AACA,QAAK,KAAK,mBAAoB;AAC7B,kBAAa,yBAA0B,IAAI,KAAK;AAAA,IACjD;AACA,WAAO;AAAA,MACN,KAAK;AAAA,MACL;AAAA,QACC,aAAa,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,MACD;AAAA,MACA;AAAA,IACD;AACA,QAAK,4BAA6B;AACjC,aAAO,oBAAoB;AAAA,IAC5B;AAAA,EACD;AACA,SAAO;AAAA,IACN;AAAA,EACD;AACD;;;ADzLA,IAAI;AAEG,IAAM,SAAS,MAAM;AAE3B,QAAM,gBAAgB,CAAC,CAAI,WAA0C;AACrE,MAAK,eAAgB;AACpB,WAAO,CAAC;AAAA,EACT;AACA,MAAK,CAAE,KAAM;AACZ,UAAM,IAAI,YAAY;AAAA,EACvB;AACA,SAAO;AACR;AAEO,SAAS,OAAO;AACtB,MAAK,mBAAoB,YAAa,GAAI;AACzC,WAAO,OAAO,EAAE,aAAa;AAAA,EAC9B;AACA,SAAO,QAAQ,QAAQ;AACxB;AAEO,SAAS,iBAAiB;AAChC,MAAK,mBAAoB,YAAa,GAAI;AACzC,WAAO,OAAO,EACZ,aAAa,EACb,KAAM,MAAM,wBAAyB,GAAI,CAAE;AAAA,EAC9C;AACA,SAAO,QAAQ,QAAQ;AACxB;AAEA,SAAS;AAAA,EACR;AAAA,EACA,MAAM;AACL,mBAAe;AAAA,EAChB;AAAA,EACA;AAAA,IACC,MAAM;AAAA,EACP;AACD;;;AGzCA;AAAA,EACC,aAAAC;AAAA,EACA;AAAA,OAGM;AACP,SAAS,yBAAAC,8BAA6B;;;ACNtC,SAAS,6BAA0E;AASnF,IAAM,eAAqB;AAAA,EAC1B,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,OAAO;AACR;AASA,IAAM,4BAA4B;AAAA,EACjC,MAAM;AAAA,EACN,YAAY;AAAA,IACX,SAAS;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,IACd;AAAA,EACD;AAAA,EACA,UAAU,CAAE,SAAU;AAAA,EACtB,sBAAsB;AACvB;AAEO,IAAM,gBAAgB,CAAE,QAAgB,OAAa,iBAAkB;AAC7E,QAAM,EAAE,YAAY,KAAM,mBAAmB,UAAU,QAAQ,SAAS,IAAI;AAC5E,QAAM,OAAO,OAAQ,YAA2B;AAC/C,UAAM,qBAAqB,EAAE,GAAK,QAAQ,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC,EAAI;AACvG,UAAM,gBAAgB,QAAQ,iBAAiB,CAAC;AAChD,UAAM,SAAS,MAAM,OAAO;AAAA,MAC3B;AAAA,QACC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACP,GAAG;AAAA,UACH;AAAA,UACA,kBAAkB;AAAA,YACjB,OAAO,CAAE,EAAE,MAAM,iBAAiB,CAAE;AAAA,UACrC;AAAA,UACA,UAAU;AAAA,YACT;AAAA,YACA,GAAG;AAAA,YACH,GAAG,EAAE,mBAAmB,QAAQ,oBAAoB,0BAA0B;AAAA,UAC/E;AAAA,UACA,UAAU,QAAQ;AAAA,QACnB;AAAA;AAAA,MAED;AAAA,MACA;AAAA,IACD;AACA,QAAI;AACH,aAAO,KAAK,MAAO,OAAO,QAAQ,IAAe;AAAA,IAClD,QAAQ;AACP,aAAO,OAAO;AAAA,IACf;AAAA,EACD;AACA,SAAO;AACR;;;ACpEA,IAAM,cAAN,MAAkB;AAAA,EAMjB,YAAoB,MAAe;AAAf;AAAA,EAAgB;AAAA,EAL7B,eAAe;AAAA,EACf,cAAwC,CAAC;AAAA,EACzC,YAAsB,CAAC;AAAA,EACvB,uBAAiC,CAAC;AAAA,EAMzC,YAAa,MAA4B;AACxC,QAAK,OAAO,SAAS,aAAc;AAClC,aAAO,KAAK;AAAA,IACb;AACA,SAAK,eAAe;AACpB,WAAO;AAAA,EACR;AAAA,EAIA,UAAW,KAAa,aAAuB;AAC9C,QAAK,OAAO,gBAAgB,aAAc;AACzC,aAAO,KAAK,YAAa,GAAI;AAAA,IAC9B;AACA,SAAK,YAAa,GAAI,IAAI,KAAM,GAAI;AAAA,EAAS,WAAY;AACzD,WAAO;AAAA,EACR;AAAA,EAEA,YAAa,aAA4B;AACxC,SAAK,qBAAqB,KAAM,WAAY;AAC5C,WAAO;AAAA,EACR;AAAA,EAEA,QAAS,SAAwB;AAChC,SAAK,UAAU,KAAM,OAAQ;AAC7B,WAAO;AAAA,EACR;AAAA,EAEA,IAAW,WAAW;AACrB,WAAO,KAAK,UAAU,KAAM,MAAO;AAAA,EACpC;AAAA,EAEA,SAAiB;AAChB,WAAO,KAAM,KAAK,IAAK;AAAA;AAAA,EAEtB,KAAK,YAAa;AAAA;AAAA,EAElB,KAAK,YAAY,SAAS,iBAAiB,EAAG;AAAA,EAC9C,OAAO,OAAQ,KAAK,WAAY,EAAE,KAAM,MAAO,CAAE;AAAA;AAAA,EAEjD,KAAK,UAAU,SAAS,eAAe,EAAG;AAAA,EAC1C,KAAK,QAAS;AAAA;AAAA,EAEd,KAAK,qBAAqB,SAAS,2BAA2B,EAAG;AAAA,EACjE,KAAK,qBAAqB,KAAM,MAAO,CAAE;AAAA,EAC1C,KAAK;AAAA,EACN;AACD;AAEO,IAAM,cAAc,CAAE,SAAkB;AAC9C,SAAO,IAAI,YAAa,IAAK;AAC9B;;;AFhDO,IAAM,cAAc,MAAM,OAAO;","names":["sdk","McpServer","SamplingMessageSchema"]}
1
+ {"version":3,"sources":["../src/get-sdk.ts","../src/index.ts","../src/init.ts","../src/mcp-registry.ts","../src/test-utils/mock-mcp-registry.ts","../src/sampler.ts","../src/utils/prompt-builder.ts"],"sourcesContent":["import { AngieMcpSdk } from '@elementor-external/angie-sdk';\n\nlet sdk: AngieMcpSdk;\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 AngieMcpSdk();\n\t}\n\treturn sdk;\n};\n","import { getSDK } from './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 { init } from './init';\nexport * from './mcp-registry';\nexport { createSampler } from './sampler';\nexport { toolPrompts } from './utils/prompt-builder';\nexport const getAngieSdk = () => getSDK();\n","import { isExperimentActive } from '@elementor/editor-v1-adapters';\n\nimport { getSDK } from './get-sdk';\nimport { activateMcpRegistration } from './mcp-registry';\n\nexport function init() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\treturn getSDK().waitForReady();\n\t}\n\treturn Promise.resolve();\n}\n\nexport function startMCPServer() {\n\tif ( isExperimentActive( 'editor_mcp' ) ) {\n\t\tconst sdk = getSDK();\n\t\tsdk.waitForReady().then( () => activateMcpRegistration( sdk ) );\n\t}\n\treturn Promise.resolve();\n}\n\ndocument.addEventListener(\n\t'DOMContentLoaded',\n\t() => {\n\t\tstartMCPServer();\n\t},\n\t{\n\t\tonce: true,\n\t}\n);\n","import { z, type z3 } from '@elementor/schema';\nimport { type AngieMcpSdk } from '@elementor-external/angie-sdk';\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 { getSDK } from './get-sdk';\nimport { mockMcpRegistry } from './test-utils/mock-mcp-registry';\n\ntype ZodRawShape = z3.ZodRawShape;\n\nconst mcpRegistry: { [ namespace: string ]: McpServer } = {};\nconst mcpDescriptions: { [ namespace: string ]: string } = {};\n// @ts-ignore - QUnit fails this\nlet isMcpRegistrationActivated = false || typeof globalThis.jest !== 'undefined';\n\nexport const registerMcp = ( mcp: McpServer, name: string ) => {\n\tconst mcpName = isAlphabet( name );\n\tmcpRegistry[ mcpName ] = mcp;\n};\n\nexport async function activateMcpRegistration( sdk: AngieMcpSdk ) {\n\tif ( isMcpRegistrationActivated ) {\n\t\treturn;\n\t}\n\tisMcpRegistrationActivated = true;\n\tconst mcpServerList = Object.entries( mcpRegistry );\n\tfor await ( const entry of mcpServerList ) {\n\t\tconst [ key, mcpServer ] = entry;\n\t\tawait sdk.registerLocalServer( {\n\t\t\tname: `editor-${ key }`,\n\t\t\tserver: mcpServer,\n\t\t\tversion: '1.0.0',\n\t\t\tdescription: mcpDescriptions[ key ] || key,\n\t\t} );\n\t}\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 *\n * @param namespace The namespace of the MCP server. It should contain only lowercase alphabetic characters.\n * @param options\n * @param options.instructions\n */\nexport const getMCPByDomain = ( namespace: string, options?: { instructions?: string } ): MCPRegistryEntry => {\n\tconst mcpName = `editor-${ isAlphabet( 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{\n\t\t\t\tname: mcpName,\n\t\t\t\tversion: '1.0.0',\n\t\t\t},\n\t\t\t{\n\t\t\t\tinstructions: options?.instructions,\n\t\t\t}\n\t\t);\n\t}\n\tconst mcpServer = mcpRegistry[ namespace ];\n\tconst { addTool } = createToolRegistrator( mcpServer );\n\treturn {\n\t\twaitForReady: () => getSDK().waitForReady(),\n\t\t// @ts-expect-error: TS is unable to infer the type here\n\t\tresource: async ( ...args: Parameters< McpServer[ 'resource' ] > ) => {\n\t\t\tawait getSDK().waitForReady();\n\t\t\treturn mcpServer.resource( ...args );\n\t\t},\n\t\tsendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {\n\t\t\treturn new Promise( async () => {\n\t\t\t\tawait getSDK().waitForReady();\n\t\t\t\tmcpServer.server.sendResourceUpdated( ...args );\n\t\t\t} );\n\t\t},\n\t\tmcpServer,\n\t\taddTool,\n\t\tsetMCPDescription: ( description: string ) => {\n\t\t\tmcpDescriptions[ namespace ] = description;\n\t\t},\n\t\tgetActiveChatInfo: () => {\n\t\t\tconst info = localStorage.getItem( 'angie_active_chat_id' );\n\t\t\tif ( ! info ) {\n\t\t\t\treturn {\n\t\t\t\t\texpiresAt: 0,\n\t\t\t\t\tsessionId: '',\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst rawData = JSON.parse( info );\n\t\t\treturn {\n\t\t\t\texpiresAt: rawData.expiresAt as number,\n\t\t\t\tsessionId: rawData.sessionId as string,\n\t\t\t};\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\tgetActiveChatInfo: () => { sessionId: string; expiresAt: number };\n\tsendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];\n\tresource: McpServer[ 'resource' ];\n\tmcpServer: McpServer;\n\twaitForReady: () => Promise< void >;\n}\n\ntype ResourceList = {\n\turi: string;\n\tdescription: string;\n}[];\n\ntype ToolRegistrationOptions<\n\tInputArgs extends undefined | z.ZodRawShape = undefined,\n\tOutputSchema extends undefined | z.ZodRawShape = undefined,\n\tExpectedOutput = OutputSchema extends z.ZodRawShape\n\t\t? z.objectOutputType< OutputSchema & { llm_instructions?: string }, z.ZodTypeAny >\n\t\t: string,\n> = {\n\tname: string;\n\tdescription: string;\n\tschema?: InputArgs;\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\tisDestrcutive?: boolean;\n\trequiredResources?: ResourceList;\n};\n\nfunction createToolRegistrator( server: McpServer ) {\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 && ! ( 'llm_instructions' in outputSchema ) ) {\n\t\t\tObject.assign( outputSchema, {\n\t\t\t\tllm_instruction: z.string().optional().describe( 'Instructions for what to do next' ),\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\tstructuredContent: 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\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.isDestrcutive,\n\t\t\treadOnlyHint: opts.isDestrcutive ? false : undefined,\n\t\t\ttitle: opts.name,\n\t\t};\n\t\tif ( opts.requiredResources ) {\n\t\t\tannotations[ 'angie/requiredResources' ] = opts.requiredResources;\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\toutputSchema,\n\t\t\t\ttitle: opts.name,\n\t\t\t\tannotations,\n\t\t\t},\n\t\t\ttoolCallback\n\t\t);\n\t\tif ( isMcpRegistrationActivated ) {\n\t\t\tserver.sendToolListChanged();\n\t\t}\n\t}\n\treturn {\n\t\taddTool,\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\tgetActiveChatInfo() {\n\t\t\treturn { sessionId: 'mock-session-id', expiresAt: Date.now() + 3600000 };\n\t\t},\n\t\tmcpServer: mock as McpServer,\n\t};\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\ttry {\n\t\t\treturn JSON.parse( result.content.text as string );\n\t\t} catch {\n\t\t\treturn result.content;\n\t\t}\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\n${ this._parameters.length ? '# Parameters' : '' }\n${ Object.values( this._parameters ).join( '\\n\\n' ) }\n\n${ this._examples.length ? '# Examples' : '' }\n${ this.examples }\n\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"],"mappings":"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","names":["McpServer","SamplingMessageSchema","sdk","sdk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elementor/editor-mcp",
3
- "version": "3.35.0-353",
3
+ "version": "3.35.0-355",
4
4
  "private": false,
5
5
  "author": "Elementor Team",
6
6
  "homepage": "https://elementor.com/",
@@ -43,10 +43,10 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@elementor-external/angie-sdk": "npm:@elementor/angie-sdk@1.0.3",
46
- "@elementor/schema": "3.35.0-353",
46
+ "@elementor/schema": "3.35.0-355",
47
47
  "@modelcontextprotocol/sdk": "1.17.4",
48
- "@elementor/store": "3.35.0-353",
49
- "@elementor/editor-v1-adapters": "3.35.0-353",
48
+ "@elementor/store": "3.35.0-355",
49
+ "@elementor/editor-v1-adapters": "3.35.0-355",
50
50
  "zod-to-json-schema": "3.24.6"
51
51
  }
52
52
  }
package/src/get-sdk.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { AngieMcpSdk } from '@elementor-external/angie-sdk';
2
+
3
+ let sdk: AngieMcpSdk;
4
+
5
+ export const getSDK = () => {
6
+ // @ts-ignore - QUnit fails this
7
+ const isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;
8
+ if ( isMCPDisabled ) {
9
+ return {} as unknown as AngieMcpSdk;
10
+ }
11
+ if ( ! sdk ) {
12
+ sdk = new AngieMcpSdk();
13
+ }
14
+ return sdk;
15
+ };
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { getSDK } from './init';
1
+ import { getSDK } from './get-sdk';
2
2
 
3
3
  export {
4
4
  McpServer,
package/src/init.ts CHANGED
@@ -1,22 +1,8 @@
1
1
  import { isExperimentActive } from '@elementor/editor-v1-adapters';
2
- import { AngieMcpSdk } from '@elementor-external/angie-sdk';
3
2
 
3
+ import { getSDK } from './get-sdk';
4
4
  import { activateMcpRegistration } from './mcp-registry';
5
5
 
6
- let sdk: AngieMcpSdk;
7
-
8
- export const getSDK = () => {
9
- // @ts-ignore - QUnit fails this
10
- const isMCPDisabled = !! ( globalThis as Record< string, unknown > ).__ELEMENTOR_MCP_DISABLED__;
11
- if ( isMCPDisabled ) {
12
- return {} as unknown as AngieMcpSdk;
13
- }
14
- if ( ! sdk ) {
15
- sdk = new AngieMcpSdk();
16
- }
17
- return sdk;
18
- };
19
-
20
6
  export function init() {
21
7
  if ( isExperimentActive( 'editor_mcp' ) ) {
22
8
  return getSDK().waitForReady();
@@ -26,9 +12,8 @@ export function init() {
26
12
 
27
13
  export function startMCPServer() {
28
14
  if ( isExperimentActive( 'editor_mcp' ) ) {
29
- return getSDK()
30
- .waitForReady()
31
- .then( () => activateMcpRegistration( sdk ) );
15
+ const sdk = getSDK();
16
+ sdk.waitForReady().then( () => activateMcpRegistration( sdk ) );
32
17
  }
33
18
  return Promise.resolve();
34
19
  }
@@ -1,9 +1,10 @@
1
- import { type z, type z3 } from '@elementor/schema';
1
+ import { z, type z3 } from '@elementor/schema';
2
2
  import { type AngieMcpSdk } from '@elementor-external/angie-sdk';
3
3
  import { McpServer, type ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';
4
4
  import { type RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
5
5
  import { type ServerNotification, type ServerRequest } from '@modelcontextprotocol/sdk/types.js';
6
6
 
7
+ import { getSDK } from './get-sdk';
7
8
  import { mockMcpRegistry } from './test-utils/mock-mcp-registry';
8
9
 
9
10
  type ZodRawShape = z3.ZodRawShape;
@@ -69,6 +70,18 @@ export const getMCPByDomain = ( namespace: string, options?: { instructions?: st
69
70
  const mcpServer = mcpRegistry[ namespace ];
70
71
  const { addTool } = createToolRegistrator( mcpServer );
71
72
  return {
73
+ waitForReady: () => getSDK().waitForReady(),
74
+ // @ts-expect-error: TS is unable to infer the type here
75
+ resource: async ( ...args: Parameters< McpServer[ 'resource' ] > ) => {
76
+ await getSDK().waitForReady();
77
+ return mcpServer.resource( ...args );
78
+ },
79
+ sendResourceUpdated: ( ...args: Parameters< McpServer[ 'server' ][ 'sendResourceUpdated' ] > ) => {
80
+ return new Promise( async () => {
81
+ await getSDK().waitForReady();
82
+ mcpServer.server.sendResourceUpdated( ...args );
83
+ } );
84
+ },
72
85
  mcpServer,
73
86
  addTool,
74
87
  setMCPDescription: ( description: string ) => {
@@ -97,7 +110,10 @@ export interface MCPRegistryEntry {
97
110
  ) => void;
98
111
  setMCPDescription: ( description: string ) => void;
99
112
  getActiveChatInfo: () => { sessionId: string; expiresAt: number };
113
+ sendResourceUpdated: McpServer[ 'server' ][ 'sendResourceUpdated' ];
114
+ resource: McpServer[ 'resource' ];
100
115
  mcpServer: McpServer;
116
+ waitForReady: () => Promise< void >;
101
117
  }
102
118
 
103
119
  type ResourceList = {
@@ -108,7 +124,9 @@ type ResourceList = {
108
124
  type ToolRegistrationOptions<
109
125
  InputArgs extends undefined | z.ZodRawShape = undefined,
110
126
  OutputSchema extends undefined | z.ZodRawShape = undefined,
111
- ExpectedOutput = OutputSchema extends z.ZodRawShape ? z.objectOutputType< OutputSchema, z.ZodTypeAny > : string,
127
+ ExpectedOutput = OutputSchema extends z.ZodRawShape
128
+ ? z.objectOutputType< OutputSchema & { llm_instructions?: string }, z.ZodTypeAny >
129
+ : string,
112
130
  > = {
113
131
  name: string;
114
132
  description: string;
@@ -133,6 +151,11 @@ function createToolRegistrator( server: McpServer ) {
133
151
  O extends undefined | z.ZodRawShape = undefined,
134
152
  >( opts: ToolRegistrationOptions< T, O > ) {
135
153
  const outputSchema = opts.outputSchema as ZodRawShape | undefined;
154
+ if ( outputSchema && ! ( 'llm_instructions' in outputSchema ) ) {
155
+ Object.assign( outputSchema, {
156
+ llm_instruction: z.string().optional().describe( 'Instructions for what to do next' ),
157
+ } );
158
+ }
136
159
  // @ts-ignore: TS is unable to infer the type here
137
160
  const inputSchema: ZodRawShape = opts.schema ? opts.schema : {};
138
161
  const toolCallback: ToolCallback< ZodRawShape > = async function ( args, extra ) {
@@ -15,6 +15,10 @@ const mock = new Proxy(
15
15
 
16
16
  export const mockMcpRegistry = (): MCPRegistryEntry => {
17
17
  return {
18
+ // @ts-ignore
19
+ resource: async () => {},
20
+ // @ts-ignore
21
+ sendResourceUpdated: () => {},
18
22
  addTool: () => {},
19
23
  setMCPDescription: () => {},
20
24
  getActiveChatInfo() {