From 7058eacf8465347343fe2fdd0f15c07e3740b338 Mon Sep 17 00:00:00 2001 From: Yash Date: Thu, 26 Jun 2025 00:24:25 +1000 Subject: [PATCH 1/6] Updated tools schema, fixed json reading --- tools/Mcp/package.json | 3 ++- tools/Mcp/src/CodegenServer.ts | 22 +++++++++++++++------- tools/Mcp/src/types.ts | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tools/Mcp/package.json b/tools/Mcp/package.json index 01a3027772ea..fff41806944a 100644 --- a/tools/Mcp/package.json +++ b/tools/Mcp/package.json @@ -8,7 +8,8 @@ }, "scripts": { "build": "tsc", - "start": "node build/index.js" + "start": "node build/index.js", + "fresh": "npm run build && npm run start" }, "files": [ "build" diff --git a/tools/Mcp/src/CodegenServer.ts b/tools/Mcp/src/CodegenServer.ts index 47a33d0886bb..0b2798be2ab9 100644 --- a/tools/Mcp/src/CodegenServer.ts +++ b/tools/Mcp/src/CodegenServer.ts @@ -2,10 +2,18 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import { toolParameterSchema, toolSchema } from "./types.js"; -import specs from "./specs/Specs.json" assert { type: "json" }; -import responses from "./specs/responses.json" assert { type: "json" }; import { toolServices } from "./services/toolServices.js"; +import { readFileSync } from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const srcPath = path.resolve(__dirname, "..", "src"); + +const specs = JSON.parse(readFileSync(path.join(srcPath, "specs/Specs.json"), "utf-8")); +const responses = JSON.parse(readFileSync(path.join(srcPath, "specs/responses.json"), "utf-8")); + export class CodegenServer { private static _instance: CodegenServer; private _mcp: McpServer; @@ -76,7 +84,7 @@ export class CodegenServer { } initResponses() { - responses?.forEach(response => { + (responses as toolParameterSchema[])?.forEach((response: toolParameterSchema) => { this._responses.set(response.name, response.text); }); } @@ -86,16 +94,16 @@ export class CodegenServer { for (const schema of schemas) { switch (schema.type) { case "string": - parameter[schema.name] = z.string().describe(schema.description); + parameter[schema.name] = z.string().describe(schema.text); break; case "number": - parameter[schema.name] = z.number().describe(schema.description); + parameter[schema.name] = z.number().describe(schema.text); break; case "boolean": - parameter[schema.name] = z.boolean().describe(schema.description); + parameter[schema.name] = z.boolean().describe(schema.text); break; case "array": - parameter[schema.name] = z.array(z.string()).describe(schema.description); + parameter[schema.name] = z.array(z.string()).describe(schema.text); break; // object parameter not supported yet // case "object": diff --git a/tools/Mcp/src/types.ts b/tools/Mcp/src/types.ts index fd5206b5e19f..e5de0fffcaca 100644 --- a/tools/Mcp/src/types.ts +++ b/tools/Mcp/src/types.ts @@ -1,7 +1,7 @@ export type toolParameterSchema = { name: string; type: string; - description: string; + text: string; } export type toolSchema = { From 7e30f9a390c1b43dabdf8ae3cb519324634266c7 Mon Sep 17 00:00:00 2001 From: Yash <55773468+notyashhh@users.noreply.github.com> Date: Thu, 26 Jun 2025 00:48:46 +1000 Subject: [PATCH 2/6] Corrected download url spelling Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tools/Mcp/src/services/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Mcp/src/services/utils.ts b/tools/Mcp/src/services/utils.ts index 11642322d44d..ad4d65cd5f12 100644 --- a/tools/Mcp/src/services/utils.ts +++ b/tools/Mcp/src/services/utils.ts @@ -124,7 +124,7 @@ export async function getExamplesFromSpecs(workingDirectory: string): Promise Date: Thu, 26 Jun 2025 00:49:36 +1000 Subject: [PATCH 3/6] Updated import statement to reflect filename Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tools/Mcp/src/CodegenServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Mcp/src/CodegenServer.ts b/tools/Mcp/src/CodegenServer.ts index 0b2798be2ab9..a648c4c6bfd7 100644 --- a/tools/Mcp/src/CodegenServer.ts +++ b/tools/Mcp/src/CodegenServer.ts @@ -11,7 +11,7 @@ import { fileURLToPath } from "url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const srcPath = path.resolve(__dirname, "..", "src"); -const specs = JSON.parse(readFileSync(path.join(srcPath, "specs/Specs.json"), "utf-8")); +const specs = JSON.parse(readFileSync(path.join(srcPath, "specs/specs.json"), "utf-8")); const responses = JSON.parse(readFileSync(path.join(srcPath, "specs/responses.json"), "utf-8")); export class CodegenServer { From 11535772c014680638ceef1bf0ad6192b39c287b Mon Sep 17 00:00:00 2001 From: Yash Date: Thu, 26 Jun 2025 00:51:23 +1000 Subject: [PATCH 4/6] Added usage docs to readme --- tools/Mcp/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/Mcp/README.md b/tools/Mcp/README.md index e99d152dabae..204d465f5adc 100644 --- a/tools/Mcp/README.md +++ b/tools/Mcp/README.md @@ -52,6 +52,23 @@ This MCP server is designed to work with Azure PowerShell module development wor ## Usage +### Add as mcp server in Github Copilot Agent mode + +Simple add this mcp server to your user `settings.json` in VsCode to include: + +```json + "mcp": { + "servers": { + "az-pwsh-mcp-server": { + "type": "stdio", + "command": "sh", + "args": ["-c", "npm install && npm run fresh"], + "cwd": "./azure-powershell/tools/Mcp", + }, + } + } +``` + ### As an MCP Server The server runs on stdio and can be integrated with MCP-compatible clients: From fa1392bba2a9fb3c633f14e1df2643dfb3ce8954 Mon Sep 17 00:00:00 2001 From: Yash Date: Thu, 26 Jun 2025 16:29:21 +1000 Subject: [PATCH 5/6] Reverted ToolParameter Schema --- tools/Mcp/src/CodegenServer.ts | 10 +++++----- tools/Mcp/src/types.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/Mcp/src/CodegenServer.ts b/tools/Mcp/src/CodegenServer.ts index a648c4c6bfd7..78c3d233d4f5 100644 --- a/tools/Mcp/src/CodegenServer.ts +++ b/tools/Mcp/src/CodegenServer.ts @@ -85,7 +85,7 @@ export class CodegenServer { initResponses() { (responses as toolParameterSchema[])?.forEach((response: toolParameterSchema) => { - this._responses.set(response.name, response.text); + this._responses.set(response.name, response.description); }); } @@ -94,16 +94,16 @@ export class CodegenServer { for (const schema of schemas) { switch (schema.type) { case "string": - parameter[schema.name] = z.string().describe(schema.text); + parameter[schema.name] = z.string().describe(schema.description); break; case "number": - parameter[schema.name] = z.number().describe(schema.text); + parameter[schema.name] = z.number().describe(schema.description); break; case "boolean": - parameter[schema.name] = z.boolean().describe(schema.text); + parameter[schema.name] = z.boolean().describe(schema.description); break; case "array": - parameter[schema.name] = z.array(z.string()).describe(schema.text); + parameter[schema.name] = z.array(z.string()).describe(schema.description); break; // object parameter not supported yet // case "object": diff --git a/tools/Mcp/src/types.ts b/tools/Mcp/src/types.ts index e5de0fffcaca..9c99b8f1dd3e 100644 --- a/tools/Mcp/src/types.ts +++ b/tools/Mcp/src/types.ts @@ -1,7 +1,7 @@ export type toolParameterSchema = { name: string; + description: string; type: string; - text: string; } export type toolSchema = { From 0d2be2a17f77892843b709e7e1d8c8490717b156 Mon Sep 17 00:00:00 2001 From: Yash Date: Thu, 26 Jun 2025 16:47:37 +1000 Subject: [PATCH 6/6] Added ResponseSchema --- tools/Mcp/src/CodegenServer.ts | 6 +++--- tools/Mcp/src/types.ts | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/Mcp/src/CodegenServer.ts b/tools/Mcp/src/CodegenServer.ts index 78c3d233d4f5..e34173faea28 100644 --- a/tools/Mcp/src/CodegenServer.ts +++ b/tools/Mcp/src/CodegenServer.ts @@ -1,7 +1,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; -import { toolParameterSchema, toolSchema } from "./types.js"; +import { responseSchema, toolParameterSchema, toolSchema } from "./types.js"; import { toolServices } from "./services/toolServices.js"; import { readFileSync } from "fs"; @@ -84,8 +84,8 @@ export class CodegenServer { } initResponses() { - (responses as toolParameterSchema[])?.forEach((response: toolParameterSchema) => { - this._responses.set(response.name, response.description); + (responses as responseSchema[])?.forEach((response: responseSchema) => { + this._responses.set(response.name, response.text); }); } diff --git a/tools/Mcp/src/types.ts b/tools/Mcp/src/types.ts index 9c99b8f1dd3e..f4fea8f07c3c 100644 --- a/tools/Mcp/src/types.ts +++ b/tools/Mcp/src/types.ts @@ -11,6 +11,12 @@ export type toolSchema = { callbackName: string; } +export type responseSchema = { + name: string; + type: string; + text: string; +} + export type yamlContent = { [key: string]: any; }