@achieveai/azuredevops-mcp 1.0.0 → 1.1.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.
package/README.md CHANGED
@@ -128,6 +128,40 @@ The integration is organized into eight main tool categories:
128
128
  - Predict build failures
129
129
  - Optimize test selection
130
130
 
131
+ ## Response Format
132
+
133
+ All tool responses return **human-readable markdown** — tables, summaries, confirmations with actionable hints — instead of raw JSON dumps. This makes responses easy to read in any MCP client.
134
+
135
+ **Example: Sprint list**
136
+ ```
137
+ ## Sprints (3 results)
138
+ | Sprint | Dates | Status |
139
+ |--------|-------|--------|
140
+ | Sprint 24 | Jan 6 – Jan 20 | past |
141
+ | Sprint 25 | Jan 20 – Feb 3 | current |
142
+ | Sprint 26 | Feb 3 – Feb 17 | future |
143
+ ```
144
+
145
+ **Example: Work item created**
146
+ ```
147
+ ## ✅ User Story #4521 Created
148
+ **Title:** Add export to PDF
149
+ **Assigned To:** john@example.com
150
+ **State:** New
151
+ 💡 View: https://dev.azure.com/org/project/_workitems/edit/4521
152
+ ```
153
+
154
+ **Example: Error with hint**
155
+ ```
156
+ ## ❌ Error
157
+ Could not find repository "my-repo" in project "MyProject".
158
+ 💡 Hint: Use `listRepositories` to see available repositories.
159
+ ```
160
+
161
+ ### Structured Content for Automation
162
+
163
+ Set `ENABLE_STRUCTURED_CONTENT=true` to include machine-readable JSON in the `structuredContent` field alongside the markdown `content`. This is useful for programmatic consumers that need typed data while still having a human-readable fallback.
164
+
131
165
  ## Installation
132
166
 
133
167
  ### Installing via Smithery
@@ -294,6 +328,7 @@ The server can be configured using the following environment variables:
294
328
  | AZURE_DEVOPS_USERNAME | Username for NTLM/Basic auth | No** | - |
295
329
  | AZURE_DEVOPS_PASSWORD | Password for NTLM/Basic auth | No** | - |
296
330
  | AZURE_DEVOPS_DOMAIN | Domain for NTLM auth | No | - |
331
+ | ENABLE_STRUCTURED_CONTENT | Enable machine-readable JSON in structuredContent field | No | false |
297
332
  | ALLOWED_TOOLS | Comma-separated list of tool methods to enable | No | All tools |
298
333
 
299
334
  \* Required if `AZURE_DEVOPS_IS_ON_PREMISES=true`
@@ -379,6 +414,7 @@ The project is structured as follows:
379
414
  - `Interfaces/`: Type definitions for parameters and responses
380
415
  - `Services/`: Service classes for interacting with Azure DevOps APIs
381
416
  - `Tools/`: Tool implementations that expose functionality to clients
417
+ - `utils/`: Shared formatting utilities (date formatting, markdown tables, emoji maps)
382
418
  - `index.ts`: Main entry point that registers tools and starts the server
383
419
  - `config.ts`: Configuration handling
384
420
 
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatMcpResponse = formatMcpResponse;
4
4
  exports.formatErrorResponse = formatErrorResponse;
5
+ const config_1 = require("../config");
5
6
  /**
6
7
  * Formats a response for MCP compatibility
7
8
  * @param data The data to format
@@ -11,43 +12,21 @@ exports.formatErrorResponse = formatErrorResponse;
11
12
  * @returns MCP-compatible response
12
13
  */
13
14
  function formatMcpResponse(data, message, isError = false, includeStructuredContent = false) {
14
- // If message contains markdown formatting (starts with --- or contains table markdown), use it as primary content
15
- if (message && message.length > 120) {
16
- const response = {
17
- content: [
18
- {
19
- type: "text",
20
- text: message
21
- }
22
- ],
23
- rawData: data,
24
- isError
25
- };
26
- // Add structured content if requested
27
- if (includeStructuredContent && data) {
28
- response.structuredContent = {
29
- format: "application/json",
30
- data: data
31
- };
32
- }
33
- return response;
34
- }
15
+ // When a message is provided, use it as the sole content (markdown-formatted tools)
16
+ // Only fall back to JSON dump when no message is provided at all
17
+ const hasMessage = message && message.length > 0;
35
18
  const response = {
36
- content: [
37
- {
38
- type: "text",
39
- text: message || (isError ? "Error occurred" : "Request successful")
40
- },
41
- {
42
- type: "text",
43
- text: typeof data === 'string' ? data : JSON.stringify(data, null, 2)
44
- }
45
- ],
19
+ content: hasMessage
20
+ ? [{ type: "text", text: message }]
21
+ : [
22
+ { type: "text", text: isError ? "Error occurred" : "Request successful" },
23
+ { type: "text", text: typeof data === 'string' ? data : JSON.stringify(data, null, 2) }
24
+ ],
46
25
  rawData: data,
47
26
  isError
48
27
  };
49
- // Add structured content if requested
50
- if (includeStructuredContent && data) {
28
+ // Add structured content if requested AND env toggle is enabled
29
+ if (includeStructuredContent && (0, config_1.isStructuredContentEnabled)() && data) {
51
30
  response.structuredContent = {
52
31
  format: "application/json",
53
32
  data: data
@@ -1 +1 @@
1
- {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../src/Interfaces/Common.ts"],"names":[],"mappings":";;AAuBA,8CAiDC;AAOD,kDAGC;AAnED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAAC,IAAS,EAAE,OAAgB,EAAE,OAAO,GAAG,KAAK,EAAE,wBAAwB,GAAG,KAAK;IAC9G,kHAAkH;IAClH,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAgB;YAC5B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;iBACd;aACF;YACD,OAAO,EAAE,IAAI;YACb,OAAO;SACR,CAAC;QAEF,sCAAsC;QACtC,IAAI,wBAAwB,IAAI,IAAI,EAAE,CAAC;YACrC,QAAQ,CAAC,iBAAiB,GAAG;gBAC3B,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE,IAAI;aACX,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAgB;QAC5B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC;aACrE;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACtE;SACF;QACD,OAAO,EAAE,IAAI;QACb,OAAO;KACR,CAAC;IAEF,sCAAsC;IACtC,IAAI,wBAAwB,IAAI,IAAI,EAAE,CAAC;QACrC,QAAQ,CAAC,iBAAiB,GAAG;YAC3B,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,IAAI;SACX,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,KAAU;IAC5C,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,iBAAiB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,UAAU,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../src/Interfaces/Common.ts"],"names":[],"mappings":";;AAyBA,8CAyBC;AAOD,kDAGC;AA5DD,sCAAuD;AAiBvD;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAAC,IAAS,EAAE,OAAgB,EAAE,OAAO,GAAG,KAAK,EAAE,wBAAwB,GAAG,KAAK;IAC9G,oFAAoF;IACpF,iEAAiE;IACjE,MAAM,UAAU,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAgB;QAC5B,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACnC,CAAC,CAAC;gBACE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,EAAE;gBACzE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;aACxF;QACL,OAAO,EAAE,IAAI;QACb,OAAO;KACR,CAAC;IAEF,gEAAgE;IAChE,IAAI,wBAAwB,IAAI,IAAA,mCAA0B,GAAE,IAAI,IAAI,EAAE,CAAC;QACrE,QAAQ,CAAC,iBAAiB,GAAG;YAC3B,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,IAAI;SACX,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,KAAU;IAC5C,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO,iBAAiB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,UAAU,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;AACpF,CAAC"}
@@ -7,6 +7,7 @@ exports.BoardsSprintsToolMethods = exports.BoardsSprintsTools = void 0;
7
7
  const BoardsSprintsService_1 = require("../Services/BoardsSprintsService");
8
8
  const Common_1 = require("../Interfaces/Common");
9
9
  const getClassMethods_1 = __importDefault(require("../utils/getClassMethods"));
10
+ const formatHelpers_1 = require("../utils/formatHelpers");
10
11
  class BoardsSprintsTools {
11
12
  constructor(config) {
12
13
  this.boardsSprintsService = new BoardsSprintsService_1.BoardsSprintsService(config);
@@ -17,7 +18,14 @@ class BoardsSprintsTools {
17
18
  async getBoards(params) {
18
19
  try {
19
20
  const boards = await this.boardsSprintsService.getBoards(params);
20
- return (0, Common_1.formatMcpResponse)(boards, `Found ${boards.length} boards`);
21
+ const items = Array.isArray(boards) ? boards : [];
22
+ if (items.length === 0) {
23
+ return (0, Common_1.formatMcpResponse)(boards, `## Boards\n\nNo boards found.\n\n💡 Check your team settings or use \`getTeams\` to verify the team ID.`);
24
+ }
25
+ let md = `## Boards\n\n**${items.length} board${items.length !== 1 ? 's' : ''}**\n\n`;
26
+ const rows = items.map((b) => [b.name || 'N/A', b.id || 'N/A']);
27
+ md += (0, formatHelpers_1.markdownTable)(['Name', 'ID'], rows);
28
+ return (0, Common_1.formatMcpResponse)(boards, md, false, true);
21
29
  }
22
30
  catch (error) {
23
31
  console.error('Error in getBoards tool:', error);
@@ -30,7 +38,18 @@ class BoardsSprintsTools {
30
38
  async getBoardColumns(params) {
31
39
  try {
32
40
  const columns = await this.boardsSprintsService.getBoardColumns(params);
33
- return (0, Common_1.formatMcpResponse)(columns, `Found ${columns.length} columns for board ${params.boardId}`);
41
+ const items = Array.isArray(columns) ? columns : [];
42
+ if (items.length === 0) {
43
+ return (0, Common_1.formatMcpResponse)(columns, `## Board Columns\n\nNo columns found for board \`${params.boardId}\`.\n\n💡 Verify the board ID using \`getBoards\`.`);
44
+ }
45
+ let md = `## Board Columns\n\n**${items.length} columns** for board \`${params.boardId}\`\n\n`;
46
+ const rows = items.map((c) => [
47
+ c.name || 'N/A',
48
+ c.columnType || c.stateMappings ? 'Mapped' : 'N/A',
49
+ c.itemLimit ? String(c.itemLimit) : '-'
50
+ ]);
51
+ md += (0, formatHelpers_1.markdownTable)(['Name', 'Type', 'WIP Limit'], rows);
52
+ return (0, Common_1.formatMcpResponse)(columns, md, false, true);
34
53
  }
35
54
  catch (error) {
36
55
  console.error('Error in getBoardColumns tool:', error);
@@ -43,7 +62,41 @@ class BoardsSprintsTools {
43
62
  async getBoardItems(params) {
44
63
  try {
45
64
  const items = await this.boardsSprintsService.getBoardItems(params);
46
- return (0, Common_1.formatMcpResponse)(items, `Retrieved items for board ${params.boardId}`);
65
+ const itemList = Array.isArray(items) ? items : (items?.value || []);
66
+ if (itemList.length === 0) {
67
+ return (0, Common_1.formatMcpResponse)(items, `## Board Items\n\nNo items found on board \`${params.boardId}\`.\n\n💡 The board may be empty or items may not be assigned to columns.`);
68
+ }
69
+ let md = `## Board Items\n\n**${itemList.length} item${itemList.length !== 1 ? 's' : ''}** on board \`${params.boardId}\`\n\n`;
70
+ // Group by column if possible
71
+ const byColumn = {};
72
+ itemList.forEach((item) => {
73
+ const col = item.boardColumn || item.column?.name || 'Unknown';
74
+ if (!byColumn[col])
75
+ byColumn[col] = [];
76
+ byColumn[col].push(item);
77
+ });
78
+ if (Object.keys(byColumn).length > 1) {
79
+ for (const [col, colItems] of Object.entries(byColumn)) {
80
+ md += `### ${col} (${colItems.length})\n\n`;
81
+ const rows = colItems.map((i) => [
82
+ `#${i.id || i.workItem?.id || 'N/A'}`,
83
+ (0, formatHelpers_1.truncateText)(i.title || i.workItem?.fields?.['System.Title'] || 'N/A', 60),
84
+ i.state || i.workItem?.fields?.['System.State'] || '-'
85
+ ]);
86
+ md += (0, formatHelpers_1.markdownTable)(['ID', 'Title', 'State'], rows);
87
+ md += '\n\n';
88
+ }
89
+ }
90
+ else {
91
+ const rows = itemList.map((i) => [
92
+ `#${i.id || i.workItem?.id || 'N/A'}`,
93
+ (0, formatHelpers_1.truncateText)(i.title || i.workItem?.fields?.['System.Title'] || 'N/A', 60),
94
+ i.state || i.workItem?.fields?.['System.State'] || '-',
95
+ i.boardColumn || i.column?.name || '-'
96
+ ]);
97
+ md += (0, formatHelpers_1.markdownTable)(['ID', 'Title', 'State', 'Column'], rows);
98
+ }
99
+ return (0, Common_1.formatMcpResponse)(items, md, false, true);
47
100
  }
48
101
  catch (error) {
49
102
  console.error('Error in getBoardItems tool:', error);
@@ -56,7 +109,8 @@ class BoardsSprintsTools {
56
109
  async moveCardOnBoard(params) {
57
110
  try {
58
111
  const result = await this.boardsSprintsService.moveCardOnBoard(params);
59
- return (0, Common_1.formatMcpResponse)(result, `Moved work item ${params.workItemId} to column ${params.columnId}`);
112
+ const md = `## Card Moved\n\n**#${params.workItemId}** Column \`${params.columnId}\`\n\n💡 Use \`getBoardItems\` to see the updated board state.`;
113
+ return (0, Common_1.formatMcpResponse)(result, md, false, true);
60
114
  }
61
115
  catch (error) {
62
116
  console.error('Error in moveCardOnBoard tool:', error);
@@ -69,7 +123,37 @@ class BoardsSprintsTools {
69
123
  async getSprints(params) {
70
124
  try {
71
125
  const sprints = await this.boardsSprintsService.getSprints(params);
72
- return (0, Common_1.formatMcpResponse)(sprints, `Found ${sprints.length} sprints`);
126
+ const items = Array.isArray(sprints) ? sprints : [];
127
+ if (items.length === 0) {
128
+ return (0, Common_1.formatMcpResponse)(sprints, `## Sprints\n\nNo sprints found.\n\n💡 Use \`createIteration\` to create sprint iterations.`);
129
+ }
130
+ const currentCount = items.filter((s) => (0, formatHelpers_1.getSprintTimeframeLabel)(s.attributes?.timeFrame) === 'Current').length;
131
+ const pastCount = items.filter((s) => (0, formatHelpers_1.getSprintTimeframeLabel)(s.attributes?.timeFrame) === 'Past').length;
132
+ const futureCount = items.filter((s) => (0, formatHelpers_1.getSprintTimeframeLabel)(s.attributes?.timeFrame) === 'Future').length;
133
+ let md = `## Sprints\n\n**${items.length} sprints**`;
134
+ const parts = [];
135
+ if (currentCount > 0)
136
+ parts.push(`${currentCount} current`);
137
+ if (pastCount > 0)
138
+ parts.push(`${pastCount} past`);
139
+ if (futureCount > 0)
140
+ parts.push(`${futureCount} future`);
141
+ if (parts.length > 0)
142
+ md += ` | ${parts.join(', ')}`;
143
+ md += '\n\n';
144
+ const rows = items.map((s) => {
145
+ const tf = s.attributes?.timeFrame;
146
+ const emoji = (0, formatHelpers_1.getSprintTimeframeEmoji)(tf);
147
+ const label = (0, formatHelpers_1.getSprintTimeframeLabel)(tf);
148
+ return [
149
+ s.name || 'N/A',
150
+ s.attributes?.startDate ? (0, formatHelpers_1.formatFullDate)(s.attributes.startDate) : '-',
151
+ s.attributes?.finishDate ? (0, formatHelpers_1.formatFullDate)(s.attributes.finishDate) : '-',
152
+ `${emoji} ${label}`
153
+ ];
154
+ });
155
+ md += (0, formatHelpers_1.markdownTable)(['Name', 'Start', 'End', 'Status'], rows);
156
+ return (0, Common_1.formatMcpResponse)(sprints, md, false, true);
73
157
  }
74
158
  catch (error) {
75
159
  console.error('Error in getSprints tool:', error);
@@ -82,7 +166,29 @@ class BoardsSprintsTools {
82
166
  async getCurrentSprint(params) {
83
167
  try {
84
168
  const sprint = await this.boardsSprintsService.getCurrentSprint(params);
85
- return (0, Common_1.formatMcpResponse)(sprint, sprint ? `Current sprint: ${sprint.name}` : 'No current sprint found');
169
+ if (!sprint) {
170
+ return (0, Common_1.formatMcpResponse)(sprint, `## Current Sprint\n\nNo current sprint found.\n\n💡 Use \`getSprints\` to see all sprints or \`createIteration\` to create one.`);
171
+ }
172
+ const startDate = sprint.attributes?.startDate;
173
+ const endDate = sprint.attributes?.finishDate;
174
+ let md = `## 🏃 Current Sprint\n\n`;
175
+ md += `**${sprint.name}**\n\n`;
176
+ if (startDate && endDate) {
177
+ const start = new Date(startDate);
178
+ const end = new Date(endDate);
179
+ const now = new Date();
180
+ const totalDays = Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
181
+ const daysRemaining = Math.max(0, Math.ceil((end.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)));
182
+ const daysElapsed = totalDays - daysRemaining;
183
+ const pct = totalDays > 0 ? Math.round((daysElapsed / totalDays) * 100) : 0;
184
+ md += `**Dates:** ${(0, formatHelpers_1.formatFullDate)(startDate)} → ${(0, formatHelpers_1.formatFullDate)(endDate)}\n`;
185
+ md += `**Progress:** ${daysElapsed}/${totalDays} days (${pct}%) | **${daysRemaining} days remaining**\n`;
186
+ }
187
+ if (sprint.id)
188
+ md += `**ID:** ${sprint.id}\n`;
189
+ if (sprint.path)
190
+ md += `**Path:** ${sprint.path}\n`;
191
+ return (0, Common_1.formatMcpResponse)(sprint, md, false, true);
86
192
  }
87
193
  catch (error) {
88
194
  console.error('Error in getCurrentSprint tool:', error);
@@ -95,7 +201,21 @@ class BoardsSprintsTools {
95
201
  async getSprintWorkItems(params) {
96
202
  try {
97
203
  const workItems = await this.boardsSprintsService.getSprintWorkItems(params);
98
- return (0, Common_1.formatMcpResponse)(workItems, `Found ${workItems.workItems?.length || 0} work items in sprint ${params.sprintId}`);
204
+ const items = workItems?.workItems || workItems?.workItemRelations || [];
205
+ const itemList = Array.isArray(items) ? items : [];
206
+ if (itemList.length === 0) {
207
+ return (0, Common_1.formatMcpResponse)(workItems, `## Sprint Work Items\n\nNo work items found in sprint \`${params.sprintId}\`.\n\n💡 Items may not be assigned to this sprint yet.`);
208
+ }
209
+ let md = `## Sprint Work Items\n\n**${itemList.length} item${itemList.length !== 1 ? 's' : ''}** in sprint \`${params.sprintId}\`\n\n`;
210
+ const rows = itemList.map((item) => {
211
+ const wi = item.target || item;
212
+ const id = wi.id || wi.workItem?.id || 'N/A';
213
+ const url = wi.url || wi.workItem?.url || '-';
214
+ return [`#${id}`, url !== '-' ? `[Link](${url})` : '-'];
215
+ });
216
+ md += (0, formatHelpers_1.markdownTable)(['ID', 'URL'], rows);
217
+ md += `\n\n💡 Use \`getWorkItemById\` with any ID to see full details.`;
218
+ return (0, Common_1.formatMcpResponse)(workItems, md, false, true);
99
219
  }
100
220
  catch (error) {
101
221
  console.error('Error in getSprintWorkItems tool:', error);
@@ -108,7 +228,30 @@ class BoardsSprintsTools {
108
228
  async getSprintCapacity(params) {
109
229
  try {
110
230
  const capacity = await this.boardsSprintsService.getSprintCapacity(params);
111
- return (0, Common_1.formatMcpResponse)(capacity, `Retrieved capacity for sprint ${params.sprintId}`);
231
+ let md = `## Sprint Capacity\n\n**Sprint:** \`${params.sprintId}\`\n\n`;
232
+ // Handle daysOff and teamSettings if present
233
+ if (capacity?.daysOff) {
234
+ const daysOff = Array.isArray(capacity.daysOff) ? capacity.daysOff : [];
235
+ md += `**Team Days Off:** ${daysOff.length > 0 ? daysOff.length + ' days' : 'None'}\n`;
236
+ }
237
+ if (capacity?.teamMembers || capacity?.value) {
238
+ const members = capacity.teamMembers || capacity.value || [];
239
+ const memberList = Array.isArray(members) ? members : [];
240
+ if (memberList.length > 0) {
241
+ md += `**Team Members with Capacity:** ${memberList.length}\n\n`;
242
+ const rows = memberList.map((m) => {
243
+ const name = m.teamMember?.displayName || m.displayName || 'Unknown';
244
+ const activities = m.activities || [];
245
+ const actStr = activities.map((a) => `${a.name || 'General'}: ${a.capacityPerDay || 0}h/day`).join(', ') || '-';
246
+ return [name, actStr];
247
+ });
248
+ md += (0, formatHelpers_1.markdownTable)(['Member', 'Capacity'], rows);
249
+ }
250
+ }
251
+ else {
252
+ md += `*No capacity data available.*`;
253
+ }
254
+ return (0, Common_1.formatMcpResponse)(capacity, md, false, true);
112
255
  }
113
256
  catch (error) {
114
257
  console.error('Error in getSprintCapacity tool:', error);
@@ -121,9 +264,21 @@ class BoardsSprintsTools {
121
264
  async getTeamMembers(params) {
122
265
  try {
123
266
  const response = await this.boardsSprintsService.getTeamMembers(params);
124
- const members = response.value || response; // Handle both formats
125
- const memberCount = Array.isArray(members) ? members.length : (response.count || 0);
126
- return (0, Common_1.formatMcpResponse)(response, `Found ${memberCount} team members`);
267
+ const members = response.value || response;
268
+ const memberList = Array.isArray(members) ? members : [];
269
+ if (memberList.length === 0) {
270
+ return (0, Common_1.formatMcpResponse)(response, `## Team Members\n\nNo team members found.\n\n💡 Use \`getTeams\` to verify the team ID.`);
271
+ }
272
+ let md = `## Team Members\n\n**${memberList.length} member${memberList.length !== 1 ? 's' : ''}**\n\n`;
273
+ const rows = memberList.map((m) => {
274
+ const identity = m.identity || m;
275
+ const name = identity.displayName || 'Unknown';
276
+ const email = identity.uniqueName || identity.mailAddress || '-';
277
+ const isAdmin = m.isTeamAdmin ? '✅' : '-';
278
+ return [name, email, isAdmin];
279
+ });
280
+ md += (0, formatHelpers_1.markdownTable)(['Name', 'Email', 'Admin'], rows);
281
+ return (0, Common_1.formatMcpResponse)(response, md, false, true);
127
282
  }
128
283
  catch (error) {
129
284
  console.error('Error in getTeamMembers tool:', error);
@@ -136,7 +291,18 @@ class BoardsSprintsTools {
136
291
  async getTeams() {
137
292
  try {
138
293
  const teams = await this.boardsSprintsService.getTeams();
139
- return (0, Common_1.formatMcpResponse)(teams, `Found ${teams.length} teams`);
294
+ const items = Array.isArray(teams) ? teams : [];
295
+ if (items.length === 0) {
296
+ return (0, Common_1.formatMcpResponse)(teams, `## Teams\n\nNo teams found.`);
297
+ }
298
+ let md = `## Teams\n\n**${items.length} team${items.length !== 1 ? 's' : ''}**\n\n`;
299
+ const rows = items.map((t) => [
300
+ t.name || 'N/A',
301
+ t.id || 'N/A',
302
+ (0, formatHelpers_1.truncateText)(t.description || '-', 40)
303
+ ]);
304
+ md += (0, formatHelpers_1.markdownTable)(['Name', 'ID', 'Description'], rows);
305
+ return (0, Common_1.formatMcpResponse)(teams, md, false, true);
140
306
  }
141
307
  catch (error) {
142
308
  console.error('Error in getTeams tool:', error);
@@ -1 +1 @@
1
- {"version":3,"file":"BoardsSprintsTools.js","sourceRoot":"","sources":["../../src/Tools/BoardsSprintsTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BoardsSprintsTools.js","sourceRoot":"","sources":["../../src/Tools/BoardsSprintsTools.ts"],"names":[],"mappings":"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"}