@webiny/mcp 6.0.0 → 6.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/agents/claude.d.ts +2 -2
  2. package/agents/claude.js.map +1 -1
  3. package/agents/cline.d.ts +2 -2
  4. package/agents/cline.js.map +1 -1
  5. package/agents/copilot.d.ts +2 -2
  6. package/agents/copilot.js +1 -1
  7. package/agents/copilot.js.map +1 -1
  8. package/agents/cursor.d.ts +2 -2
  9. package/agents/cursor.js.map +1 -1
  10. package/agents/instructions.js +1 -1
  11. package/agents/instructions.js.map +1 -1
  12. package/agents/kiro.d.ts +15 -0
  13. package/agents/kiro.js +33 -0
  14. package/agents/kiro.js.map +1 -0
  15. package/agents/opencode.d.ts +22 -0
  16. package/agents/opencode.js +76 -0
  17. package/agents/opencode.js.map +1 -0
  18. package/agents/shared.d.ts +5 -5
  19. package/agents/shared.js +3 -3
  20. package/agents/shared.js.map +1 -1
  21. package/agents/windsurf.d.ts +2 -2
  22. package/agents/windsurf.js.map +1 -1
  23. package/bin.d.ts +2 -0
  24. package/bin.js +4 -0
  25. package/bin.js.map +1 -0
  26. package/cli/ConfigureMcp.d.ts +7 -14
  27. package/cli/ConfigureMcp.js +24 -52
  28. package/cli/ConfigureMcp.js.map +1 -1
  29. package/cli/McpServer.d.ts +3 -10
  30. package/cli/McpServer.js +83 -109
  31. package/cli/McpServer.js.map +1 -1
  32. package/cli.d.ts +1 -0
  33. package/cli.js +60 -0
  34. package/cli.js.map +1 -0
  35. package/index.d.ts +6 -1
  36. package/index.js +7 -1
  37. package/index.js.map +1 -1
  38. package/package.json +11 -23
  39. package/skills/admin/admin-architect/SKILL.md +389 -0
  40. package/skills/admin/ui-extensions/SKILL.md +268 -0
  41. package/skills/api/api-architect/SKILL.md +189 -0
  42. package/skills/api/custom-field-type/SKILL.md +263 -0
  43. package/skills/api/event-handler-pattern/SKILL.md +131 -0
  44. package/skills/{custom-graphql-api → api/graphql-api}/SKILL.md +3 -3
  45. package/skills/api/use-case-pattern/SKILL.md +102 -0
  46. package/skills/cli-extensions/SKILL.md +45 -47
  47. package/skills/configure-auth0/SKILL.md +4 -4
  48. package/skills/configure-okta/SKILL.md +3 -3
  49. package/skills/content-models/SKILL.md +197 -196
  50. package/skills/dependency-injection/SKILL.md +9 -219
  51. package/skills/full-stack-architect/SKILL.md +195 -0
  52. package/skills/generated/admin/SKILL.md +119 -0
  53. package/skills/generated/admin/aco/SKILL.md +28 -0
  54. package/skills/generated/admin/build-params/SKILL.md +33 -0
  55. package/skills/generated/admin/cms/SKILL.md +342 -0
  56. package/skills/generated/admin/configs/SKILL.md +23 -0
  57. package/skills/generated/admin/env-config/SKILL.md +30 -0
  58. package/skills/generated/admin/form/SKILL.md +88 -0
  59. package/skills/generated/admin/graphql-client/SKILL.md +23 -0
  60. package/skills/generated/admin/lexical/SKILL.md +105 -0
  61. package/skills/generated/admin/local-storage/SKILL.md +42 -0
  62. package/skills/generated/admin/router/SKILL.md +48 -0
  63. package/skills/generated/admin/security/SKILL.md +63 -0
  64. package/skills/generated/admin/tenancy/SKILL.md +64 -0
  65. package/skills/generated/admin/ui/SKILL.md +468 -0
  66. package/skills/generated/admin/website-builder/SKILL.md +318 -0
  67. package/skills/generated/api/SKILL.md +40 -0
  68. package/skills/generated/api/aco/SKILL.md +202 -0
  69. package/skills/generated/api/build-params/SKILL.md +31 -0
  70. package/skills/generated/api/cms/SKILL.md +646 -0
  71. package/skills/generated/api/event-publisher/SKILL.md +31 -0
  72. package/skills/generated/api/file-manager/SKILL.md +189 -0
  73. package/skills/generated/api/graphql/SKILL.md +61 -0
  74. package/skills/generated/api/key-value-store/SKILL.md +31 -0
  75. package/skills/generated/api/logger/SKILL.md +25 -0
  76. package/skills/generated/api/opensearch/SKILL.md +39 -0
  77. package/skills/generated/api/scheduler/SKILL.md +112 -0
  78. package/skills/generated/api/security/SKILL.md +317 -0
  79. package/skills/generated/api/system/SKILL.md +34 -0
  80. package/skills/generated/api/tasks/SKILL.md +31 -0
  81. package/skills/generated/api/tenancy/SKILL.md +124 -0
  82. package/skills/generated/api/tenant-manager/SKILL.md +34 -0
  83. package/skills/generated/api/website-builder/SKILL.md +356 -0
  84. package/skills/generated/cli/SKILL.md +28 -0
  85. package/skills/generated/cli/command/SKILL.md +24 -0
  86. package/skills/generated/extensions/SKILL.md +43 -0
  87. package/skills/generated/infra/SKILL.md +190 -0
  88. package/skills/infrastructure-extensions/SKILL.md +3 -2
  89. package/skills/local-development/SKILL.md +2 -28
  90. package/skills/project-structure/SKILL.md +78 -56
  91. package/skills/webiny-sdk/SKILL.md +77 -76
  92. package/skills/website-builder/SKILL.md +143 -149
  93. package/ui.d.ts +24 -0
  94. package/ui.js +31 -0
  95. package/ui.js.map +1 -0
  96. package/Extension.d.ts +0 -2
  97. package/Extension.js +0 -11
  98. package/Extension.js.map +0 -1
  99. package/skills/admin-ui-extensions/SKILL.md +0 -267
  100. package/skills/api-custom-feature/SKILL.md +0 -195
  101. package/skills/lifecycle-events/SKILL.md +0 -348
@@ -1 +1 @@
1
- {"version":3,"names":["CliCommandFactory","Ui","SUPPORTED","ConfigureMcp","constructor","ui","execute","name","description","examples","params","type","default","options","handler","instructions","printInstructions","target","agent","includes","error","text","join","process","exit","cwd","init","createImplementation","implementation","dependencies"],"sources":["ConfigureMcp.ts"],"sourcesContent":["import { CliCommandFactory } from \"@webiny/cli-core/exports/cli/command.js\";\nimport { Ui } from \"@webiny/cli-core/exports/cli/index.js\";\n\nexport interface IInitAgentParams {\n agent: string;\n instructions: boolean;\n}\n\nconst SUPPORTED = [\"claude\", \"cursor\", \"windsurf\", \"copilot\", \"cline\"];\n\nclass ConfigureMcp implements CliCommandFactory.Interface<IInitAgentParams> {\n constructor(private ui: Ui.Interface) {}\n\n execute(): CliCommandFactory.CommandDefinition<IInitAgentParams> {\n return {\n name: \"configure-mcp\",\n description: \"Configure MCP server for a specific agent.\",\n examples: [\n \"$0 configure-mcp claude\",\n \"$0 configure-mcp cursor\",\n \"$0 configure-mcp --instructions\"\n ],\n params: [\n {\n name: \"agent\",\n description: \"Agent name (claude, cursor, windsurf, copilot, cline)\",\n type: \"string\",\n default: \"claude\"\n }\n ],\n options: [\n {\n name: \"instructions\",\n description: \"Print MCP setup instructions\",\n type: \"boolean\",\n default: false\n }\n ],\n handler: async params => {\n if (params.instructions) {\n const { printInstructions } = await import(\"../agents/instructions.js\");\n printInstructions();\n return;\n }\n\n const target = params.agent || \"claude\";\n\n if (!SUPPORTED.includes(target)) {\n this.ui.error(`Unknown agent \"${target}\".`);\n this.ui.text(`Supported: ${SUPPORTED.join(\", \")}`);\n this.ui.text(\"For other agents run: npx webiny configure-mcp --instructions\");\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const { init } = await import(`../agents/${target}.js`);\n await init({ ui: this.ui, cwd });\n }\n };\n }\n}\n\nexport default CliCommandFactory.createImplementation({\n implementation: ConfigureMcp,\n dependencies: [Ui]\n});\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,yCAAyC;AAC3E,SAASC,EAAE,QAAQ,uCAAuC;AAO1D,MAAMC,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;AAEtE,MAAMC,YAAY,CAA0D;EACxEC,WAAWA,CAASC,EAAgB,EAAE;IAAA,KAAlBA,EAAgB,GAAhBA,EAAgB;EAAG;EAEvCC,OAAOA,CAAA,EAA0D;IAC7D,OAAO;MACHC,IAAI,EAAE,eAAe;MACrBC,WAAW,EAAE,4CAA4C;MACzDC,QAAQ,EAAE,CACN,yBAAyB,EACzB,yBAAyB,EACzB,iCAAiC,CACpC;MACDC,MAAM,EAAE,CACJ;QACIH,IAAI,EAAE,OAAO;QACbC,WAAW,EAAE,uDAAuD;QACpEG,IAAI,EAAE,QAAQ;QACdC,OAAO,EAAE;MACb,CAAC,CACJ;MACDC,OAAO,EAAE,CACL;QACIN,IAAI,EAAE,cAAc;QACpBC,WAAW,EAAE,8BAA8B;QAC3CG,IAAI,EAAE,SAAS;QACfC,OAAO,EAAE;MACb,CAAC,CACJ;MACDE,OAAO,EAAE,MAAMJ,MAAM,IAAI;QACrB,IAAIA,MAAM,CAACK,YAAY,EAAE;UACrB,MAAM;YAAEC;UAAkB,CAAC,GAAG,MAAM,MAAM,4BAA4B,CAAC;UACvEA,iBAAiB,CAAC,CAAC;UACnB;QACJ;QAEA,MAAMC,MAAM,GAAGP,MAAM,CAACQ,KAAK,IAAI,QAAQ;QAEvC,IAAI,CAAChB,SAAS,CAACiB,QAAQ,CAACF,MAAM,CAAC,EAAE;UAC7B,IAAI,CAACZ,EAAE,CAACe,KAAK,CAAC,kBAAkBH,MAAM,IAAI,CAAC;UAC3C,IAAI,CAACZ,EAAE,CAACgB,IAAI,CAAC,cAAcnB,SAAS,CAACoB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;UAClD,IAAI,CAACjB,EAAE,CAACgB,IAAI,CAAC,+DAA+D,CAAC;UAC7EE,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;QACnB;QAEA,MAAMC,GAAG,GAAGF,OAAO,CAACE,GAAG,CAAC,CAAC;QACzB,MAAM;UAAEC;QAAK,CAAC,GAAG,MAAM,MAAM,CAAC,aAAaT,MAAM,KAAK,CAAC;QACvD,MAAMS,IAAI,CAAC;UAAErB,EAAE,EAAE,IAAI,CAACA,EAAE;UAAEoB;QAAI,CAAC,CAAC;MACpC;IACJ,CAAC;EACL;AACJ;AAEA,eAAezB,iBAAiB,CAAC2B,oBAAoB,CAAC;EAClDC,cAAc,EAAEzB,YAAY;EAC5B0B,YAAY,EAAE,CAAC5B,EAAE;AACrB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ConsoleUi","SUPPORTED","configureMcp","params","ui","cwd","process","instructions","printInstructions","target","agent","includes","error","text","join","exit","init"],"sources":["ConfigureMcp.ts"],"sourcesContent":["import type { IUi } from \"../ui.js\";\nimport { ConsoleUi } from \"../ui.js\";\n\nexport interface IConfigureMcpParams {\n agent?: string;\n instructions?: boolean;\n ui?: IUi;\n cwd?: string;\n}\n\nconst SUPPORTED = [\"claude\", \"cursor\", \"windsurf\", \"copilot\", \"cline\", \"opencode\", \"kiro\"];\n\nexport async function configureMcp(params: IConfigureMcpParams = {}): Promise<void> {\n const ui = params.ui ?? new ConsoleUi();\n const cwd = params.cwd ?? process.cwd();\n\n if (params.instructions) {\n const { printInstructions } = await import(\"../agents/instructions.js\");\n printInstructions();\n return;\n }\n\n const target = params.agent || \"claude\";\n\n if (!SUPPORTED.includes(target)) {\n ui.error(`Unknown agent \"${target}\".`);\n ui.text(`Supported: ${SUPPORTED.join(\", \")}`);\n ui.text(\"For other agents, run: npx webiny-mcp configure --instructions\");\n process.exit(1);\n }\n\n const { init } = await import(`../agents/${target}.js`);\n await init({ ui, cwd });\n}\n"],"mappings":"AACA,SAASA,SAAS;AASlB,MAAMC,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;AAE1F,OAAO,eAAeC,YAAYA,CAACC,MAA2B,GAAG,CAAC,CAAC,EAAiB;EAChF,MAAMC,EAAE,GAAGD,MAAM,CAACC,EAAE,IAAI,IAAIJ,SAAS,CAAC,CAAC;EACvC,MAAMK,GAAG,GAAGF,MAAM,CAACE,GAAG,IAAIC,OAAO,CAACD,GAAG,CAAC,CAAC;EAEvC,IAAIF,MAAM,CAACI,YAAY,EAAE;IACrB,MAAM;MAAEC;IAAkB,CAAC,GAAG,MAAM,MAAM,4BAA4B,CAAC;IACvEA,iBAAiB,CAAC,CAAC;IACnB;EACJ;EAEA,MAAMC,MAAM,GAAGN,MAAM,CAACO,KAAK,IAAI,QAAQ;EAEvC,IAAI,CAACT,SAAS,CAACU,QAAQ,CAACF,MAAM,CAAC,EAAE;IAC7BL,EAAE,CAACQ,KAAK,CAAC,kBAAkBH,MAAM,IAAI,CAAC;IACtCL,EAAE,CAACS,IAAI,CAAC,cAAcZ,SAAS,CAACa,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7CV,EAAE,CAACS,IAAI,CAAC,gEAAgE,CAAC;IACzEP,OAAO,CAACS,IAAI,CAAC,CAAC,CAAC;EACnB;EAEA,MAAM;IAAEC;EAAK,CAAC,GAAG,MAAM,MAAM,CAAC,aAAaP,MAAM,KAAK,CAAC;EACvD,MAAMO,IAAI,CAAC;IAAEZ,EAAE;IAAEC;EAAI,CAAC,CAAC;AAC3B","ignoreList":[]}
@@ -1,12 +1,5 @@
1
- import { CliCommandFactory } from "@webiny/cli-core/exports/cli/command.js";
2
1
  export interface IMcpServerParams {
3
- skills: string;
4
- "additional-skills": string[];
2
+ skills?: string;
3
+ additionalSkills?: string[];
5
4
  }
6
- declare class McpServerCommand implements CliCommandFactory.Interface<IMcpServerParams> {
7
- execute(): CliCommandFactory.CommandDefinition<IMcpServerParams>;
8
- }
9
- declare const _default: typeof McpServerCommand & {
10
- __abstraction: import("@webiny/di").Abstraction<import("@webiny/cli-core/abstractions/features/CliCommand").ICliCommand<any>>;
11
- };
12
- export default _default;
5
+ export declare function startMcpServer(params?: IMcpServerParams): Promise<void>;
package/cli/McpServer.js CHANGED
@@ -6,7 +6,6 @@ import fm from "front-matter";
6
6
  import { z } from "zod";
7
7
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
8
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
- import { CliCommandFactory } from "@webiny/cli-core/exports/cli/command.js";
10
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
11
10
 
12
11
  // ---------------------------------------------------------------------------
@@ -120,120 +119,95 @@ function readSkillContent(skill) {
120
119
  }
121
120
 
122
121
  // ---------------------------------------------------------------------------
123
- // CLI Command
122
+ // Standalone entry point
124
123
  // ---------------------------------------------------------------------------
125
124
 
126
- class McpServerCommand {
127
- execute() {
128
- return {
129
- name: "mcp-server",
130
- description: "Start the Webiny MCP server (stdio transport).",
131
- examples: ["$0 mcp-server", "$0 mcp-server --skills=./my-skills", "$0 mcp-server --additional-skills=./extra-skills"],
132
- options: [{
133
- name: "skills",
134
- description: "Replace the built-in skills folder entirely. Only skills found in the given path will be served.",
135
- type: "string"
136
- }, {
137
- name: "additional-skills",
138
- description: "Add a folder on top of the built-in (or --skills) folder. Can be repeated.",
139
- type: "string",
140
- array: true
141
- }],
142
- handler: async params => {
143
- const cwd = process.cwd();
144
- const builtInSkillsDir = join(__dirname, "..", "skills");
145
- const skillsOverride = params.skills;
146
- const additionalSkillsDirs = params["additional-skills"] || [];
147
- const baseDir = skillsOverride ? resolve(cwd, skillsOverride) : builtInSkillsDir;
148
-
149
- // skillsDirs[0] = highest priority, skillsDirs[last] = lowest priority
150
- const skillsDirs = [...[...additionalSkillsDirs].map(p => resolve(cwd, p)).reverse(), baseDir];
151
- if (skillsOverride) {
152
- console.error(`[webiny-mcp] skills override: ${baseDir}`);
153
- }
154
- for (const d of additionalSkillsDirs) {
155
- console.error(`[webiny-mcp] additional skills: ${resolve(cwd, d)}`);
156
- }
157
-
158
- // In-memory cache: populated on first list, reused by get.
159
- let skillsCache = null;
160
- function getSkills() {
161
- if (!skillsCache) {
162
- skillsCache = discoverSkills(skillsDirs);
163
- console.error(`[webiny-mcp] discovered ${skillsCache.size} skill(s)`);
164
- }
165
- return skillsCache;
166
- }
167
-
168
- // ---------------------------------------------------------------
169
- // MCP server
170
- // ---------------------------------------------------------------
125
+ export async function startMcpServer(params = {}) {
126
+ const cwd = process.cwd();
127
+ const builtInSkillsDir = join(__dirname, "..", "skills");
128
+ const skillsOverride = params.skills;
129
+ const additionalSkillsDirs = params.additionalSkills || [];
130
+ const baseDir = skillsOverride ? resolve(cwd, skillsOverride) : builtInSkillsDir;
131
+
132
+ // skillsDirs[0] = highest priority, skillsDirs[last] = lowest priority
133
+ const skillsDirs = [...[...additionalSkillsDirs].map(p => resolve(cwd, p)).reverse(), baseDir];
134
+ if (skillsOverride) {
135
+ console.error(`[webiny-mcp] skills override: ${baseDir}`);
136
+ }
137
+ for (const d of additionalSkillsDirs) {
138
+ console.error(`[webiny-mcp] additional skills: ${resolve(cwd, d)}`);
139
+ }
171
140
 
172
- const server = new McpServer({
173
- name: "webiny",
174
- version: getVersion()
175
- });
176
- server.registerTool("list_webiny_skills", {
177
- title: "List Webiny Skills",
178
- description: "Returns a catalog of all available Webiny skills with names and descriptions. " + "Always call this first when working on anything Webiny-related, then call " + "get_webiny_skill to load the specific skill you need.",
179
- inputSchema: {},
180
- annotations: {
181
- readOnlyHint: true
182
- }
183
- }, async () => ({
184
- content: [{
185
- type: "text",
186
- text: buildCatalog(getSkills())
187
- }]
188
- }));
141
+ // In-memory cache: populated on first list, reused by get.
142
+ let skillsCache = null;
143
+ function getSkills() {
144
+ if (!skillsCache) {
145
+ skillsCache = discoverSkills(skillsDirs);
146
+ console.error(`[webiny-mcp] discovered ${skillsCache.size} skill(s)`);
147
+ }
148
+ return skillsCache;
149
+ }
189
150
 
190
- // @ts-expect-error Incompatible Zod version
191
- server.registerTool("get_webiny_skill", {
192
- title: "Get Webiny Skill",
193
- description: "Loads the full Webiny documentation for a specific skill. " + "Call list_webiny_skills first to see available skill names.",
194
- inputSchema: {
195
- topic: z.string().describe("Skill name — use exact names from list_webiny_skills")
196
- },
197
- annotations: {
198
- readOnlyHint: true
199
- }
200
- }, async ({
201
- topic
202
- }) => {
203
- const skills = getSkills();
204
- const skill = skills.get(topic);
205
- if (!skill) {
206
- const available = [...skills.keys()].sort();
207
- return {
208
- content: [{
209
- type: "text",
210
- text: `Skill not found: "${topic}".\n\n` + `Available skills: ${available.join(", ") || "(none)"}.`
211
- }],
212
- isError: true
213
- };
214
- }
215
- return {
216
- content: [{
217
- type: "text",
218
- text: readSkillContent(skill)
219
- }]
220
- };
221
- });
151
+ // ---------------------------------------------------------------
152
+ // MCP server
153
+ // ---------------------------------------------------------------
154
+
155
+ const server = new McpServer({
156
+ name: "webiny",
157
+ version: getVersion()
158
+ });
159
+ server.registerTool("list_webiny_skills", {
160
+ title: "List Webiny Skills",
161
+ description: "Returns a catalog of all available Webiny skills with names and descriptions. " + "Always call this first when working on anything Webiny-related, then call " + "get_webiny_skill to load the specific skill you need.",
162
+ inputSchema: {},
163
+ annotations: {
164
+ readOnlyHint: true
165
+ }
166
+ }, async () => ({
167
+ content: [{
168
+ type: "text",
169
+ text: buildCatalog(getSkills())
170
+ }]
171
+ }));
172
+ server.registerTool("get_webiny_skill", {
173
+ title: "Get Webiny Skill",
174
+ description: "Loads the full Webiny documentation for a specific skill. " + "Call list_webiny_skills first to see available skill names.",
175
+ inputSchema: {
176
+ topic: z.string().describe("Skill name — use exact names from list_webiny_skills")
177
+ },
178
+ annotations: {
179
+ readOnlyHint: true
180
+ }
181
+ }, async ({
182
+ topic
183
+ }) => {
184
+ const skills = getSkills();
185
+ const skill = skills.get(topic);
186
+ if (!skill) {
187
+ const available = [...skills.keys()].sort();
188
+ return {
189
+ content: [{
190
+ type: "text",
191
+ text: `Skill not found: "${topic}".\n\n` + `Available skills: ${available.join(", ") || "(none)"}.`
192
+ }],
193
+ isError: true
194
+ };
195
+ }
196
+ return {
197
+ content: [{
198
+ type: "text",
199
+ text: readSkillContent(skill)
200
+ }]
201
+ };
202
+ });
222
203
 
223
- // ---------------------------------------------------------------
224
- // Start
225
- // ---------------------------------------------------------------
204
+ // ---------------------------------------------------------------
205
+ // Start
206
+ // ---------------------------------------------------------------
226
207
 
227
- const transport = new StdioServerTransport();
228
- await server.connect(transport);
229
- console.error("[webiny-mcp] server ready");
230
- }
231
- };
232
- }
208
+ const transport = new StdioServerTransport();
209
+ await server.connect(transport);
210
+ console.error("[webiny-mcp] server ready");
233
211
  }
234
- export default CliCommandFactory.createImplementation({
235
- implementation: McpServerCommand,
236
- dependencies: []
237
- });
238
212
 
239
213
  //# sourceMappingURL=McpServer.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["readFileSync","readdirSync","existsSync","join","resolve","dirname","fileURLToPath","createRequire","fm","z","McpServer","StdioServerTransport","CliCommandFactory","__dirname","import","meta","url","findSkillFiles","dir","results","entry","withFileTypes","fullPath","name","isDirectory","push","isFile","discoverSkills","skillsDirs","skills","Map","filePath","raw","parsed","description","attributes","console","error","has","context","set","err","getVersion","version","buildCatalog","lines","size","contextDescriptions","groups","skill","values","list","get","contextSkills","entries","sort","a","b","localeCompare","desc","skillDesc","replace","trim","readSkillContent","body","McpServerCommand","execute","examples","options","type","array","handler","params","cwd","process","builtInSkillsDir","skillsOverride","additionalSkillsDirs","baseDir","map","p","reverse","d","skillsCache","getSkills","server","registerTool","title","inputSchema","annotations","readOnlyHint","content","text","topic","string","describe","available","keys","isError","transport","connect","createImplementation","implementation","dependencies"],"sources":["McpServer.ts"],"sourcesContent":["import { readFileSync, readdirSync, existsSync } from \"fs\";\nimport { join, resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createRequire } from \"module\";\nimport fm from \"front-matter\";\nimport { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CliCommandFactory } from \"@webiny/cli-core/exports/cli/command.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport interface IMcpServerParams {\n skills: string;\n \"additional-skills\": string[];\n}\n\n// ---------------------------------------------------------------------------\n// Skill discovery\n// ---------------------------------------------------------------------------\n\ninterface SkillAttributes {\n name: string;\n description: string;\n context?: string;\n}\n\ninterface Skill {\n name: string;\n description: string;\n context: string;\n filePath: string;\n}\n\n/**\n * Recursively find all SKILL.md files under `dir`.\n */\nfunction findSkillFiles(dir: string): string[] {\n if (!existsSync(dir)) {\n return [];\n }\n const results: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...findSkillFiles(fullPath));\n } else if (entry.isFile() && entry.name === \"SKILL.md\") {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/**\n * Discover skills from multiple directories. First match wins (higher-priority dirs first).\n */\nfunction discoverSkills(skillsDirs: string[]): Map<string, Skill> {\n const skills = new Map<string, Skill>();\n\n for (const dir of skillsDirs) {\n for (const filePath of findSkillFiles(dir)) {\n try {\n const raw = readFileSync(filePath, \"utf8\");\n const parsed = fm<SkillAttributes>(raw);\n const { name, description } = parsed.attributes;\n\n if (!name || !description) {\n console.error(`[webiny-mcp] skipping ${filePath}: missing name or description`);\n continue;\n }\n\n if (!skills.has(name)) {\n const context = parsed.attributes.context || \"webiny-extensions\";\n skills.set(name, { name, description, context, filePath });\n }\n } catch (err) {\n console.error(`[webiny-mcp] error reading ${filePath}:`, err);\n }\n }\n }\n\n return skills;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getVersion(): string {\n try {\n return createRequire(import.meta.url)(\"../../package.json\").version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction buildCatalog(skills: Map<string, Skill>): string {\n const lines: string[] = [`# Webiny Skills (v${getVersion()})`, \"\"];\n\n if (skills.size === 0) {\n lines.push(\n \"_(No skills found. Add SKILL.md files with front-matter to a skills directory.)_\"\n );\n return lines.join(\"\\n\");\n }\n\n // Group skills by context.\n const contextDescriptions: Record<string, string> = {\n \"webiny-extensions\":\n \"Use these skills when writing Webiny extensions (usually in `extensions/`) or making changes to `webiny.config.tsx` (user project development).\",\n \"webiny-packages\":\n \"Use these skills when writing code in `packages/` (core Webiny framework development).\"\n };\n\n const groups = new Map<string, Skill[]>();\n for (const skill of skills.values()) {\n const list = groups.get(skill.context) || [];\n list.push(skill);\n groups.set(skill.context, list);\n }\n\n for (const [context, contextSkills] of [...groups.entries()].sort((a, b) =>\n a[0].localeCompare(b[0])\n )) {\n lines.push(`## ${context}`, \"\");\n const desc = contextDescriptions[context];\n if (desc) {\n lines.push(desc, \"\");\n }\n lines.push(\"| Skill | Description |\");\n lines.push(\"|---|---|\");\n for (const skill of contextSkills.sort((a, b) => a.name.localeCompare(b.name))) {\n const skillDesc = skill.description.replace(/\\n/g, \" \").trim();\n lines.push(`| \\`${skill.name}\\` | ${skillDesc} |`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction readSkillContent(skill: Skill): string {\n const raw = readFileSync(skill.filePath, \"utf8\");\n return fm(raw).body;\n}\n\n// ---------------------------------------------------------------------------\n// CLI Command\n// ---------------------------------------------------------------------------\n\nclass McpServerCommand implements CliCommandFactory.Interface<IMcpServerParams> {\n execute(): CliCommandFactory.CommandDefinition<IMcpServerParams> {\n return {\n name: \"mcp-server\",\n description: \"Start the Webiny MCP server (stdio transport).\",\n examples: [\n \"$0 mcp-server\",\n \"$0 mcp-server --skills=./my-skills\",\n \"$0 mcp-server --additional-skills=./extra-skills\"\n ],\n options: [\n {\n name: \"skills\",\n description:\n \"Replace the built-in skills folder entirely. Only skills found in the given path will be served.\",\n type: \"string\"\n },\n {\n name: \"additional-skills\",\n description:\n \"Add a folder on top of the built-in (or --skills) folder. Can be repeated.\",\n type: \"string\",\n array: true\n }\n ],\n handler: async params => {\n const cwd = process.cwd();\n const builtInSkillsDir = join(__dirname, \"..\", \"skills\");\n const skillsOverride = params.skills;\n const additionalSkillsDirs = params[\"additional-skills\"] || [];\n\n const baseDir = skillsOverride ? resolve(cwd, skillsOverride) : builtInSkillsDir;\n\n // skillsDirs[0] = highest priority, skillsDirs[last] = lowest priority\n const skillsDirs = [\n ...[...additionalSkillsDirs].map(p => resolve(cwd, p)).reverse(),\n baseDir\n ];\n\n if (skillsOverride) {\n console.error(`[webiny-mcp] skills override: ${baseDir}`);\n }\n for (const d of additionalSkillsDirs) {\n console.error(`[webiny-mcp] additional skills: ${resolve(cwd, d)}`);\n }\n\n // In-memory cache: populated on first list, reused by get.\n let skillsCache: Map<string, Skill> | null = null;\n\n function getSkills(): Map<string, Skill> {\n if (!skillsCache) {\n skillsCache = discoverSkills(skillsDirs);\n console.error(`[webiny-mcp] discovered ${skillsCache.size} skill(s)`);\n }\n return skillsCache;\n }\n\n // ---------------------------------------------------------------\n // MCP server\n // ---------------------------------------------------------------\n\n const server = new McpServer({ name: \"webiny\", version: getVersion() });\n\n server.registerTool(\n \"list_webiny_skills\",\n {\n title: \"List Webiny Skills\",\n description:\n \"Returns a catalog of all available Webiny skills with names and descriptions. \" +\n \"Always call this first when working on anything Webiny-related, then call \" +\n \"get_webiny_skill to load the specific skill you need.\",\n inputSchema: {},\n annotations: { readOnlyHint: true }\n },\n async () => ({\n content: [{ type: \"text\", text: buildCatalog(getSkills()) }]\n })\n );\n\n // @ts-expect-error Incompatible Zod version\n server.registerTool(\n \"get_webiny_skill\",\n {\n title: \"Get Webiny Skill\",\n description:\n \"Loads the full Webiny documentation for a specific skill. \" +\n \"Call list_webiny_skills first to see available skill names.\",\n inputSchema: {\n topic: z\n .string()\n .describe(\"Skill name — use exact names from list_webiny_skills\")\n },\n annotations: { readOnlyHint: true }\n },\n async ({ topic }) => {\n const skills = getSkills();\n const skill = skills.get(topic);\n if (!skill) {\n const available = [...skills.keys()].sort();\n return {\n content: [\n {\n type: \"text\",\n text:\n `Skill not found: \"${topic}\".\\n\\n` +\n `Available skills: ${available.join(\", \") || \"(none)\"}.`\n }\n ],\n isError: true\n };\n }\n return {\n content: [{ type: \"text\", text: readSkillContent(skill) }]\n };\n }\n );\n\n // ---------------------------------------------------------------\n // Start\n // ---------------------------------------------------------------\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"[webiny-mcp] server ready\");\n }\n };\n }\n}\n\nexport default CliCommandFactory.createImplementation({\n implementation: McpServerCommand,\n dependencies: []\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["readFileSync","readdirSync","existsSync","join","resolve","dirname","fileURLToPath","createRequire","fm","z","McpServer","StdioServerTransport","__dirname","import","meta","url","findSkillFiles","dir","results","entry","withFileTypes","fullPath","name","isDirectory","push","isFile","discoverSkills","skillsDirs","skills","Map","filePath","raw","parsed","description","attributes","console","error","has","context","set","err","getVersion","version","buildCatalog","lines","size","contextDescriptions","groups","skill","values","list","get","contextSkills","entries","sort","a","b","localeCompare","desc","skillDesc","replace","trim","readSkillContent","body","startMcpServer","params","cwd","process","builtInSkillsDir","skillsOverride","additionalSkillsDirs","additionalSkills","baseDir","map","p","reverse","d","skillsCache","getSkills","server","registerTool","title","inputSchema","annotations","readOnlyHint","content","type","text","topic","string","describe","available","keys","isError","transport","connect"],"sources":["McpServer.ts"],"sourcesContent":["import { readFileSync, readdirSync, existsSync } from \"fs\";\nimport { join, resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createRequire } from \"module\";\nimport fm from \"front-matter\";\nimport { z } from \"zod\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport interface IMcpServerParams {\n skills?: string;\n additionalSkills?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Skill discovery\n// ---------------------------------------------------------------------------\n\ninterface SkillAttributes {\n name: string;\n description: string;\n context?: string;\n}\n\ninterface Skill {\n name: string;\n description: string;\n context: string;\n filePath: string;\n}\n\n/**\n * Recursively find all SKILL.md files under `dir`.\n */\nfunction findSkillFiles(dir: string): string[] {\n if (!existsSync(dir)) {\n return [];\n }\n const results: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...findSkillFiles(fullPath));\n } else if (entry.isFile() && entry.name === \"SKILL.md\") {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/**\n * Discover skills from multiple directories. First match wins (higher-priority dirs first).\n */\nfunction discoverSkills(skillsDirs: string[]): Map<string, Skill> {\n const skills = new Map<string, Skill>();\n\n for (const dir of skillsDirs) {\n for (const filePath of findSkillFiles(dir)) {\n try {\n const raw = readFileSync(filePath, \"utf8\");\n const parsed = fm<SkillAttributes>(raw);\n const { name, description } = parsed.attributes;\n\n if (!name || !description) {\n console.error(`[webiny-mcp] skipping ${filePath}: missing name or description`);\n continue;\n }\n\n if (!skills.has(name)) {\n const context = parsed.attributes.context || \"webiny-extensions\";\n skills.set(name, { name, description, context, filePath });\n }\n } catch (err) {\n console.error(`[webiny-mcp] error reading ${filePath}:`, err);\n }\n }\n }\n\n return skills;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getVersion(): string {\n try {\n return createRequire(import.meta.url)(\"../../package.json\").version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction buildCatalog(skills: Map<string, Skill>): string {\n const lines: string[] = [`# Webiny Skills (v${getVersion()})`, \"\"];\n\n if (skills.size === 0) {\n lines.push(\n \"_(No skills found. Add SKILL.md files with front-matter to a skills directory.)_\"\n );\n return lines.join(\"\\n\");\n }\n\n // Group skills by context.\n const contextDescriptions: Record<string, string> = {\n \"webiny-extensions\":\n \"Use these skills when writing Webiny extensions (usually in `extensions/`) or making changes to `webiny.config.tsx` (user project development).\",\n \"webiny-packages\":\n \"Use these skills when writing code in `packages/` (core Webiny framework development).\"\n };\n\n const groups = new Map<string, Skill[]>();\n for (const skill of skills.values()) {\n const list = groups.get(skill.context) || [];\n list.push(skill);\n groups.set(skill.context, list);\n }\n\n for (const [context, contextSkills] of [...groups.entries()].sort((a, b) =>\n a[0].localeCompare(b[0])\n )) {\n lines.push(`## ${context}`, \"\");\n const desc = contextDescriptions[context];\n if (desc) {\n lines.push(desc, \"\");\n }\n lines.push(\"| Skill | Description |\");\n lines.push(\"|---|---|\");\n for (const skill of contextSkills.sort((a, b) => a.name.localeCompare(b.name))) {\n const skillDesc = skill.description.replace(/\\n/g, \" \").trim();\n lines.push(`| \\`${skill.name}\\` | ${skillDesc} |`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction readSkillContent(skill: Skill): string {\n const raw = readFileSync(skill.filePath, \"utf8\");\n return fm(raw).body;\n}\n\n// ---------------------------------------------------------------------------\n// Standalone entry point\n// ---------------------------------------------------------------------------\n\nexport async function startMcpServer(params: IMcpServerParams = {}): Promise<void> {\n const cwd = process.cwd();\n const builtInSkillsDir = join(__dirname, \"..\", \"skills\");\n const skillsOverride = params.skills;\n const additionalSkillsDirs = params.additionalSkills || [];\n\n const baseDir = skillsOverride ? resolve(cwd, skillsOverride) : builtInSkillsDir;\n\n // skillsDirs[0] = highest priority, skillsDirs[last] = lowest priority\n const skillsDirs = [...[...additionalSkillsDirs].map(p => resolve(cwd, p)).reverse(), baseDir];\n\n if (skillsOverride) {\n console.error(`[webiny-mcp] skills override: ${baseDir}`);\n }\n for (const d of additionalSkillsDirs) {\n console.error(`[webiny-mcp] additional skills: ${resolve(cwd, d)}`);\n }\n\n // In-memory cache: populated on first list, reused by get.\n let skillsCache: Map<string, Skill> | null = null;\n\n function getSkills(): Map<string, Skill> {\n if (!skillsCache) {\n skillsCache = discoverSkills(skillsDirs);\n console.error(`[webiny-mcp] discovered ${skillsCache.size} skill(s)`);\n }\n return skillsCache;\n }\n\n // ---------------------------------------------------------------\n // MCP server\n // ---------------------------------------------------------------\n\n const server = new McpServer({ name: \"webiny\", version: getVersion() });\n\n server.registerTool(\n \"list_webiny_skills\",\n {\n title: \"List Webiny Skills\",\n description:\n \"Returns a catalog of all available Webiny skills with names and descriptions. \" +\n \"Always call this first when working on anything Webiny-related, then call \" +\n \"get_webiny_skill to load the specific skill you need.\",\n inputSchema: {},\n annotations: { readOnlyHint: true }\n },\n async () => ({\n content: [{ type: \"text\", text: buildCatalog(getSkills()) }]\n })\n );\n\n server.registerTool(\n \"get_webiny_skill\",\n {\n title: \"Get Webiny Skill\",\n description:\n \"Loads the full Webiny documentation for a specific skill. \" +\n \"Call list_webiny_skills first to see available skill names.\",\n inputSchema: {\n topic: z.string().describe(\"Skill name — use exact names from list_webiny_skills\")\n },\n annotations: { readOnlyHint: true }\n },\n async ({ topic }) => {\n const skills = getSkills();\n const skill = skills.get(topic);\n if (!skill) {\n const available = [...skills.keys()].sort();\n return {\n content: [\n {\n type: \"text\",\n text:\n `Skill not found: \"${topic}\".\\n\\n` +\n `Available skills: ${available.join(\", \") || \"(none)\"}.`\n }\n ],\n isError: true\n };\n }\n return {\n content: [{ type: \"text\", text: readSkillContent(skill) }]\n };\n }\n );\n\n // ---------------------------------------------------------------\n // Start\n // ---------------------------------------------------------------\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"[webiny-mcp] server ready\");\n}\n"],"mappings":"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","ignoreList":[]}
package/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/cli.js ADDED
@@ -0,0 +1,60 @@
1
+ import { startMcpServer } from "./cli/McpServer.js";
2
+ import { configureMcp } from "./cli/ConfigureMcp.js";
3
+ const args = process.argv.slice(2);
4
+ const command = args[0];
5
+ function parseFlags(args) {
6
+ const flags = {};
7
+ for (const arg of args) {
8
+ if (!arg.startsWith("--")) {
9
+ continue;
10
+ }
11
+ const [key, ...rest] = arg.slice(2).split("=");
12
+ const value = rest.length > 0 ? rest.join("=") : true;
13
+
14
+ // Support repeated flags as arrays.
15
+ const existing = flags[key];
16
+ if (existing !== undefined) {
17
+ flags[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];
18
+ } else {
19
+ flags[key] = value;
20
+ }
21
+ }
22
+ return flags;
23
+ }
24
+ async function main() {
25
+ if (command === "serve") {
26
+ const flags = parseFlags(args.slice(1));
27
+ const additionalSkills = flags["additional-skills"];
28
+ await startMcpServer({
29
+ skills: typeof flags.skills === "string" ? flags.skills : undefined,
30
+ additionalSkills: Array.isArray(additionalSkills) ? additionalSkills : typeof additionalSkills === "string" ? [additionalSkills] : undefined
31
+ });
32
+ } else if (command === "configure") {
33
+ const agent = args[1] && !args[1].startsWith("--") ? args[1] : undefined;
34
+ const flags = parseFlags(args.slice(1));
35
+ await configureMcp({
36
+ agent,
37
+ instructions: flags.instructions === true
38
+ });
39
+ } else {
40
+ console.log("Usage: webiny-mcp <command>");
41
+ console.log("");
42
+ console.log("Commands:");
43
+ console.log(" serve Start the MCP server (stdio transport)");
44
+ console.log(" configure Configure MCP server for a specific agent");
45
+ console.log("");
46
+ console.log("Examples:");
47
+ console.log(" npx webiny-mcp serve");
48
+ console.log(" npx webiny-mcp serve --additional-skills=./my-skills");
49
+ console.log(" npx webiny-mcp configure claude");
50
+ console.log(" npx webiny-mcp configure cursor");
51
+ console.log(" npx webiny-mcp configure --instructions");
52
+ process.exit(command ? 1 : 0);
53
+ }
54
+ }
55
+ main().catch(err => {
56
+ console.error(err);
57
+ process.exit(1);
58
+ });
59
+
60
+ //# sourceMappingURL=cli.js.map
package/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":["startMcpServer","configureMcp","args","process","argv","slice","command","parseFlags","flags","arg","startsWith","key","rest","split","value","length","join","existing","undefined","Array","isArray","main","additionalSkills","skills","agent","instructions","console","log","exit","catch","err","error"],"sources":["cli.ts"],"sourcesContent":["import { startMcpServer } from \"./cli/McpServer.js\";\nimport { configureMcp } from \"./cli/ConfigureMcp.js\";\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction parseFlags(args: string[]): Record<string, string | string[] | boolean> {\n const flags: Record<string, string | string[] | boolean> = {};\n for (const arg of args) {\n if (!arg.startsWith(\"--\")) {\n continue;\n }\n const [key, ...rest] = arg.slice(2).split(\"=\");\n const value = rest.length > 0 ? rest.join(\"=\") : true;\n\n // Support repeated flags as arrays.\n const existing = flags[key];\n if (existing !== undefined) {\n flags[key] = Array.isArray(existing)\n ? [...existing, value as string]\n : [existing as string, value as string];\n } else {\n flags[key] = value;\n }\n }\n return flags;\n}\n\nasync function main(): Promise<void> {\n if (command === \"serve\") {\n const flags = parseFlags(args.slice(1));\n const additionalSkills = flags[\"additional-skills\"];\n await startMcpServer({\n skills: typeof flags.skills === \"string\" ? flags.skills : undefined,\n additionalSkills: Array.isArray(additionalSkills)\n ? additionalSkills\n : typeof additionalSkills === \"string\"\n ? [additionalSkills]\n : undefined\n });\n } else if (command === \"configure\") {\n const agent = args[1] && !args[1].startsWith(\"--\") ? args[1] : undefined;\n const flags = parseFlags(args.slice(1));\n await configureMcp({\n agent,\n instructions: flags.instructions === true\n });\n } else {\n console.log(\"Usage: webiny-mcp <command>\");\n console.log(\"\");\n console.log(\"Commands:\");\n console.log(\" serve Start the MCP server (stdio transport)\");\n console.log(\" configure Configure MCP server for a specific agent\");\n console.log(\"\");\n console.log(\"Examples:\");\n console.log(\" npx webiny-mcp serve\");\n console.log(\" npx webiny-mcp serve --additional-skills=./my-skills\");\n console.log(\" npx webiny-mcp configure claude\");\n console.log(\" npx webiny-mcp configure cursor\");\n console.log(\" npx webiny-mcp configure --instructions\");\n process.exit(command ? 1 : 0);\n }\n}\n\nmain().catch(err => {\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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","ignoreList":[]}
package/index.d.ts CHANGED
@@ -1 +1,6 @@
1
- export { McpExtension } from "./Extension.js";
1
+ export type { IUi } from "./ui.js";
2
+ export { ConsoleUi } from "./ui.js";
3
+ export { startMcpServer } from "./cli/McpServer.js";
4
+ export type { IMcpServerParams } from "./cli/McpServer.js";
5
+ export { configureMcp } from "./cli/ConfigureMcp.js";
6
+ export type { IConfigureMcpParams } from "./cli/ConfigureMcp.js";
package/index.js CHANGED
@@ -1,3 +1,9 @@
1
- export { McpExtension } from "./Extension.js";
1
+ // Ui interface and console implementation
2
+
3
+ export { ConsoleUi } from "./ui.js";
4
+
5
+ // Core functions
6
+ export { startMcpServer } from "./cli/McpServer.js";
7
+ export { configureMcp } from "./cli/ConfigureMcp.js";
2
8
 
3
9
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["McpExtension"],"sources":["index.ts"],"sourcesContent":["export { McpExtension } from \"./Extension.js\";\n"],"mappings":"AAAA,SAASA,YAAY","ignoreList":[]}
1
+ {"version":3,"names":["ConsoleUi","startMcpServer","configureMcp"],"sources":["index.ts"],"sourcesContent":["// Ui interface and console implementation\nexport type { IUi } from \"./ui.js\";\nexport { ConsoleUi } from \"./ui.js\";\n\n// Core functions\nexport { startMcpServer } from \"./cli/McpServer.js\";\nexport type { IMcpServerParams } from \"./cli/McpServer.js\";\nexport { configureMcp } from \"./cli/ConfigureMcp.js\";\nexport type { IConfigureMcpParams } from \"./cli/ConfigureMcp.js\";\n"],"mappings":"AAAA;;AAEA,SAASA,SAAS;;AAElB;AACA,SAASC,cAAc;AAEvB,SAASC,YAAY","ignoreList":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/mcp",
3
- "version": "6.0.0",
3
+ "version": "6.1.0-beta.0",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
+ "bin": {
7
+ "webiny-mcp": "./bin.js"
8
+ },
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/webiny/webiny-js.git"
@@ -15,35 +18,20 @@
15
18
  "directory": "dist"
16
19
  },
17
20
  "dependencies": {
18
- "@modelcontextprotocol/sdk": "1.27.1",
19
- "@webiny/cli-core": "6.0.0",
21
+ "@modelcontextprotocol/sdk": "1.28.0",
20
22
  "front-matter": "4.0.2",
21
- "react": "18.2.0",
22
- "zod": "3.25.76"
23
+ "zod": "4.3.6"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@types/lodash": "4.17.24",
26
27
  "@types/ncp": "2.0.8",
27
- "@webiny/build-tools": "6.0.0",
28
+ "@webiny/build-tools": "6.1.0-beta.0",
29
+ "execa": "5.1.1",
30
+ "tsx": "4.21.0",
28
31
  "typescript": "5.9.3"
29
32
  },
30
33
  "scripts": {
31
- "prepublishOnly": "cp -R ../../skills/user-skills ./dist/skills"
32
- },
33
- "adio": {
34
- "ignoreDirs": [
35
- "_templates"
36
- ],
37
- "ignore": {
38
- "src": [
39
- "listr2",
40
- "cloudfront"
41
- ],
42
- "dependencies": [
43
- "@pulumi/pulumi",
44
- "@pulumi/aws"
45
- ]
46
- }
34
+ "prepublishOnly": "bash ./prepublishOnly.sh"
47
35
  },
48
- "gitHead": "9c6892640a45679ff521e25cd6587dff57393a2e"
36
+ "gitHead": "a3bd3695c66c79238e380d7360d9731b5fcf9c87"
49
37
  }