wolfpack-mcp 1.0.2 → 1.0.3

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 (3) hide show
  1. package/README.md +156 -226
  2. package/dist/client.js +20 -0
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Wolfpack MCP Server
2
2
 
3
- The Wolfpack MCP (Model Context Protocol) server enables AI assistants to interact with Wolfpack team projects, providing full CRUD operations for work items, issues, wiki pages, journal entries, and more.
3
+ Connect your AI assistant to Wolfpack to manage work items, track issues, update documentation, and log progress—all
4
+ through natural conversation.
4
5
 
5
6
  ## Installation
6
7
 
@@ -14,22 +15,34 @@ Or use directly with npx (no installation required):
14
15
  npx wolfpack-mcp
15
16
  ```
16
17
 
18
+ ## Quick Start
19
+
20
+ 1. Generate an API key at [wolfpacks.work](https://wolfpacks.work) → Account Settings → API Keys
21
+ 2. Add the server to Claude Desktop (see [Setup](#setup) below)
22
+ 3. Restart Claude Desktop
23
+ 4. Start asking Claude about your work!
24
+
25
+ **Try these prompts:**
26
+
27
+ - "What work items are assigned to me?"
28
+ - "Show me open bugs"
29
+ - "Create a work item to refactor the auth module"
30
+ - "Update issue #42 status to in-progress"
31
+ - "Add a journal entry about today's progress"
32
+
17
33
  ## Setup
18
34
 
19
35
  ### 1. Generate an API Key
20
36
 
21
- 1. Log in to your Wolfpack application at [wolfpacks.work](https://wolfpacks.work)
22
- 2. Navigate to **Account Settings** → **API Keys**
37
+ 1. Log in to [wolfpacks.work](https://wolfpacks.work)
38
+ 2. Go to **Account Settings** → **API Keys**
23
39
  3. Click **Create New Key**
24
- 4. Give your key a descriptive name (e.g., "Claude MCP Server")
25
- 5. Select the MCP permissions you want to grant (e.g., work items, issues, wiki)
26
- 6. Choose an expiration period (or "Never expires" for permanent keys)
27
- 7. Click **Create Key**
28
- 8. **Important**: Copy your API key immediately - you won't be able to see it again!
40
+ 4. Select the permissions you need (work items, issues, wiki, etc.)
41
+ 5. Copy your API key immediately—you won't see it again
29
42
 
30
43
  ### 2. Configure Claude Desktop
31
44
 
32
- Add the MCP server to your Claude Desktop configuration:
45
+ Add to your Claude Desktop config file:
33
46
 
34
47
  **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
35
48
  **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
@@ -48,333 +61,250 @@ Add the MCP server to your Claude Desktop configuration:
48
61
  }
49
62
  ```
50
63
 
51
- Replace `wfp_sk_your_api_key_here` with your actual API key.
64
+ ### 3. Restart Claude Desktop
65
+
66
+ After saving the configuration, restart Claude Desktop to connect.
52
67
 
53
- **Team Selection**: If you belong to only one team, it will be selected automatically. If you have multiple teams, use the `list_teams` tool to see them, then specify `team_id` in your tool calls.
68
+ ## What You Can Do
54
69
 
55
- **Optional**: To pre-select a specific team, add `WOLFPACK_TEAM_SLUG` to the env:
70
+ | Feature | Example Prompts |
71
+ | -------------- | ------------------------------------------------------------------------------------- |
72
+ | **Work Items** | "What's on my plate?" / "Create a task for API updates" / "Mark task #15 as done" |
73
+ | **Issues** | "Show critical bugs" / "File a bug about the login timeout" / "Assign issue #8 to me" |
74
+ | **Wiki** | "Find docs about deployment" / "Create a page for onboarding steps" |
75
+ | **Journal** | "Log my standup notes" / "What did I work on last week?" |
76
+ | **Radar** | "What initiatives are in progress?" / "Show the roadmap" |
77
+
78
+ ## Multi-Team Users
79
+
80
+ If you belong to multiple teams, Claude will ask which team you mean, or you can specify:
81
+
82
+ - "Show my work items for the Platform team"
83
+ - Use `list_teams` to see all your teams
84
+
85
+ To pre-select a default team, add to your config:
56
86
 
57
87
  ```json
58
88
  "env": {
59
- "WOLFPACK_API_KEY": "wfp_sk_your_api_key_here",
60
- "WOLFPACK_TEAM_SLUG": "your-team-slug"
89
+ "WOLFPACK_API_KEY": "wfp_sk_your_api_key_here",
90
+ "WOLFPACK_TEAM_SLUG": "your-team-slug"
61
91
  }
62
92
  ```
63
93
 
64
- ### 3. Restart Claude Desktop
94
+ ## API Key Permissions
65
95
 
66
- After updating the configuration, restart Claude Desktop to load the MCP server.
96
+ When creating your API key, select the permissions you need:
97
+
98
+ | Permission | What It Enables |
99
+ | ----------------------- | ------------------------------- |
100
+ | `mcp:work_items:read` | View your tasks |
101
+ | `mcp:work_items:create` | Create new tasks |
102
+ | `mcp:work_items:update` | Update task status and notes |
103
+ | `mcp:issues:read` | View issues |
104
+ | `mcp:issues:create` | File new issues |
105
+ | `mcp:issues:update` | Update issue status and details |
106
+ | `mcp:wiki:read` | Read documentation |
107
+ | `mcp:wiki:create` | Create new pages |
108
+ | `mcp:wiki:update` | Edit existing pages |
109
+ | `mcp:journal:read` | View journal entries |
110
+ | `mcp:journal:create` | Create journal entries |
111
+ | `mcp:journal:update` | Edit journal entries |
112
+ | `mcp:comments:create` | Add comments to items |
113
+ | `mcp:radar:read` | View initiatives and roadmap |
67
114
 
68
- ## API Key Permissions
115
+ ## Troubleshooting
116
+
117
+ **"WOLFPACK_API_KEY environment variable is required"**
118
+ Check that your Claude Desktop config has the API key set correctly.
69
119
 
70
- Each API key has granular permissions that control which MCP tools are available:
71
-
72
- | Permission | Tools Enabled |
73
- | ----------------------- | -------------------------------------------------- |
74
- | `mcp:work_items:read` | `list_work_items`, `get_work_item` |
75
- | `mcp:work_items:create` | `create_work_item` |
76
- | `mcp:work_items:update` | `update_work_progress`, `update_work_item_status` |
77
- | `mcp:issues:read` | `list_issues`, `get_issue` |
78
- | `mcp:issues:create` | `create_issue` |
79
- | `mcp:issues:update` | `update_issue` |
80
- | `mcp:wiki:read` | `list_wiki_pages`, `get_wiki_page` |
81
- | `mcp:wiki:create` | `create_wiki_page` |
82
- | `mcp:wiki:update` | `update_wiki_page` |
83
- | `mcp:journal:read` | `list_journal_entries`, `get_journal_entry` |
84
- | `mcp:journal:create` | `create_journal_entry` |
85
- | `mcp:journal:update` | `update_journal_entry` |
86
- | `mcp:comments:create` | `create_work_item_comment`, `create_issue_comment` |
87
- | `mcp:radar:read` | `list_radar_items`, `get_radar_item` |
88
-
89
- ## Available Tools
120
+ **"Invalid API key"**
121
+ Your key may be incorrect or revoked. Generate a new one from Account Settings.
122
+
123
+ **"API key does not have permission: mcp:..."**
124
+ Create a new key with the required permission enabled.
125
+
126
+ **Connection errors**
127
+ Verify [wolfpacks.work](https://wolfpacks.work) is accessible from your network.
128
+
129
+ ## Security
130
+
131
+ - API keys are scoped to your account and team memberships
132
+ - Permissions are configurable per key—grant only what you need
133
+ - Revoke keys anytime from Account Settings
134
+
135
+ ## Available Tools Reference
136
+
137
+ <details>
138
+ <summary>Click to expand full tool documentation</summary>
90
139
 
91
140
  ### Teams
92
141
 
93
142
  #### `list_teams`
94
143
 
95
- List all teams you have access to. Use this to discover available teams and get team IDs.
144
+ List all teams you have access to.
96
145
 
97
146
  - **Parameters:** None
98
- - **Returns:** Array of team objects with `id`, `slug`, and `name`
147
+ - **Returns:** Array of teams with `id`, `slug`, and `name`
99
148
 
100
149
  ### Work Items
101
150
 
102
- Work items are tasks or tickets assigned to team members.
103
-
104
151
  #### `list_work_items`
105
152
 
106
- Lists work items assigned to you. By default, excludes completed and closed items to show active work.
153
+ Lists work items assigned to you (excludes completed by default).
107
154
 
108
- - **Parameters:**
109
- - `team_id` (number, optional): Team ID (use `list_teams` to get IDs)
110
- - `status` (string, optional): Filter by status (new, doing, review, completed, blocked). Use `completed` or `closed` to see those items.
111
- - `limit` (number, optional): Maximum number of items to return
112
- - `offset` (number, optional): Number of items to skip for pagination
113
- - **Returns:** Array of work item objects
114
- - **Note:** Results are automatically paginated. If there are more than 200 items, you'll receive a truncation warning with the first 50 items.
155
+ - `team_id` (optional): Filter by team
156
+ - `status` (optional): Filter by status (new, doing, review, completed, blocked)
157
+ - `limit`, `offset` (optional): Pagination
115
158
 
116
159
  #### `get_work_item`
117
160
 
118
- Gets a specific work item by ID or reference number.
161
+ Get a specific work item.
119
162
 
120
- - **Parameters:**
121
- - `work_item_id` (string, required): The work item ID (UUID) or refId (number)
122
- - `team_id` (number, optional): Team ID (required when using refId)
123
- - **Returns:** Work item object with full description
163
+ - `work_item_id` (required): UUID or reference number
164
+ - `team_id` (optional): Required when using reference number
124
165
 
125
166
  #### `create_work_item`
126
167
 
127
- Creates a new work item. Requires `mcp:work_items:create` permission.
168
+ Create a new work item.
128
169
 
129
- - **Parameters:**
130
- - `title` (string, required): Title of the work item
131
- - `description` (string, optional): Description/notes (markdown)
132
- - `status` (string, optional): Initial status (new, doing, review, completed, blocked - defaults to 'new')
133
- - `priority` (number, optional): Priority level (0-4, higher is more important)
134
- - `leading_user_id` (string, optional): User ID to assign
135
- - **Returns:** The created work item object
170
+ - `title` (required): Task title
171
+ - `description`, `status`, `priority`, `leading_user_id` (optional)
136
172
 
137
173
  #### `update_work_progress`
138
174
 
139
- Updates the description/notes on a work item. Requires `mcp:work_items:update` permission.
175
+ Update work item description/notes.
140
176
 
141
- - **Parameters:**
142
- - `work_item_id` (string, required): The work item ID
143
- - `description` (string, required): Complete updated description (markdown)
144
- - **Returns:** The updated work item object
177
+ - `work_item_id` (required): The work item ID
178
+ - `description` (required): Updated description (markdown)
145
179
 
146
180
  #### `update_work_item_status`
147
181
 
148
- Changes work item status. Requires `mcp:work_items:update` permission.
182
+ Change work item status.
149
183
 
150
- - **Parameters:**
151
- - `work_item_id` (string, required): The work item ID
152
- - `status` (string, required): New status (new, doing, review, completed, blocked)
153
- - **Returns:** The updated work item object
184
+ - `work_item_id` (required): The work item ID
185
+ - `status` (required): New status
154
186
 
155
187
  ### Issues
156
188
 
157
- Issues track bugs, feature requests, and other items in the issue tracker.
158
-
159
189
  #### `list_issues`
160
190
 
161
- Lists issues from the team issue tracker. By default, excludes closed issues.
191
+ List issues (excludes closed by default).
162
192
 
163
- - **Parameters:**
164
- - `team_id` (number, optional): Team ID to filter issues
165
- - `status` (string, optional): Filter by status (open, in-progress, resolved, closed). Use `closed` to see closed items.
166
- - `severity` (string, optional): Filter by severity (low, medium, high, critical)
167
- - `type` (string, optional): Filter by type (bug, feature-request, task, improvement, question)
168
- - `assigned_to_id` (string, optional): Filter by assignee ('unassigned' or 'me' for special cases)
169
- - `limit` (number, optional): Maximum number of items
170
- - `offset` (number, optional): Items to skip
171
- - **Returns:** Array of issue objects
172
- - **Note:** Results are automatically paginated. If there are more than 200 items, you'll receive a truncation warning.
193
+ - `team_id`, `status`, `severity`, `type`, `assigned_to_id` (optional): Filters
194
+ - `limit`, `offset` (optional): Pagination
173
195
 
174
196
  #### `get_issue`
175
197
 
176
- Gets a specific issue by ID or reference number.
198
+ Get a specific issue.
177
199
 
178
- - **Parameters:**
179
- - `issue_id` (string, required): The issue ID (UUID) or refId (number)
180
- - `team_id` (number, optional): Team ID (required when using refId)
181
- - **Returns:** Issue object with comment and attachment counts
200
+ - `issue_id` (required): UUID or reference number
201
+ - `team_id` (optional): Required when using reference number
182
202
 
183
203
  #### `create_issue`
184
204
 
185
- Creates a new issue. Requires `mcp:issues:create` permission.
186
-
187
- - **Parameters:**
188
- - `title` (string, required): Issue title
189
- - `description` (string, optional): Issue description
190
- - `severity` (string, optional): Severity level (low, medium, high, critical)
191
- - `type` (string, optional): Issue type (bug, feature-request, task, improvement, question)
192
- - `assigned_to_id` (string, optional): User ID to assign
193
- - `environment` (string, optional): Environment where issue occurred
194
- - `affected_version` (string, optional): Version affected
195
- - `reproducible` (boolean, optional): Whether reproducible
196
- - `steps_to_reproduce` (string, optional): Steps to reproduce
197
- - `expected_behavior` (string, optional): Expected behavior
198
- - `actual_behavior` (string, optional): Actual behavior observed
199
- - **Returns:** The created issue object
205
+ Create a new issue.
206
+
207
+ - `title` (required): Issue title
208
+ - `description`, `severity`, `type`, `assigned_to_id`, `environment`, `affected_version`, `reproducible`,
209
+ `steps_to_reproduce`, `expected_behavior`, `actual_behavior` (optional)
200
210
 
201
211
  #### `update_issue`
202
212
 
203
- Updates an existing issue. Requires `mcp:issues:update` permission.
213
+ Update an existing issue.
204
214
 
205
- - **Parameters:**
206
- - `issue_id` (string, required): The issue UUID
207
- - `title` (string, optional): Updated title
208
- - `description` (string, optional): Updated description
209
- - `status` (string, optional): Updated status (open, in-progress, resolved, closed)
210
- - `severity` (string, optional): Updated severity
211
- - `assigned_to_id` (string, optional): Updated assignee
212
- - `closing_note` (string, optional): Note when closing
213
- - **Returns:** The updated issue object
215
+ - `issue_id` (required): The issue UUID
216
+ - `title`, `description`, `status`, `severity`, `assigned_to_id`, `closing_note` (optional)
214
217
 
215
218
  ### Wiki Pages
216
219
 
217
- Wiki pages store team documentation and knowledge base articles.
218
-
219
220
  #### `list_wiki_pages`
220
221
 
221
- Lists wiki pages from your accessible teams.
222
+ List wiki pages.
222
223
 
223
- - **Parameters:**
224
- - `limit` (number, optional): Maximum pages to return
225
- - `offset` (number, optional): Pages to skip
226
- - **Returns:** Array of wiki page objects
224
+ - `limit`, `offset` (optional): Pagination
227
225
 
228
226
  #### `get_wiki_page`
229
227
 
230
- Gets a specific wiki page by ID or slug.
228
+ Get a wiki page by ID or slug.
231
229
 
232
- - **Parameters:**
233
- - `page_id` (string, required): The page UUID or slug (URL path like "getting-started")
234
- - **Returns:** Wiki page object with content
230
+ - `page_id` (required): UUID or slug (e.g., "getting-started")
235
231
 
236
232
  #### `create_wiki_page`
237
233
 
238
- Creates a new wiki page. Requires `mcp:wiki:create` permission.
234
+ Create a new wiki page.
239
235
 
240
- - **Parameters:**
241
- - `slug` (string, required): URL slug for the page (without team prefix)
242
- - `title` (string, required): Page title
243
- - `content` (string, required): Page content (markdown)
244
- - **Returns:** The created wiki page object
236
+ - `slug` (required): URL path
237
+ - `title` (required): Page title
238
+ - `content` (required): Markdown content
245
239
 
246
240
  #### `update_wiki_page`
247
241
 
248
- Updates an existing wiki page. Requires `mcp:wiki:update` permission.
242
+ Update an existing wiki page.
249
243
 
250
- - **Parameters:**
251
- - `page_id` (string, required): The page UUID
252
- - `title` (string, optional): Updated title
253
- - `content` (string, optional): Updated content (markdown)
254
- - **Returns:** The updated wiki page object
244
+ - `page_id` (required): The page UUID
245
+ - `title`, `content` (optional)
255
246
 
256
247
  ### Journal Entries
257
248
 
258
- Journal entries are daily logs, standup notes, or progress updates.
259
-
260
249
  #### `list_journal_entries`
261
250
 
262
- Lists journal entries from your accessible teams.
251
+ List journal entries.
263
252
 
264
- - **Parameters:**
265
- - `limit` (number, optional): Maximum entries to return
266
- - `offset` (number, optional): Entries to skip
267
- - **Returns:** Array of journal entry objects
253
+ - `limit`, `offset` (optional): Pagination
268
254
 
269
255
  #### `get_journal_entry`
270
256
 
271
- Gets a specific journal entry by ID or reference number.
257
+ Get a specific journal entry.
272
258
 
273
- - **Parameters:**
274
- - `entry_id` (string, required): The entry UUID or refId
275
- - `team_id` (number, optional): Team ID (required when using refId)
276
- - **Returns:** Journal entry object
259
+ - `entry_id` (required): UUID or reference number
260
+ - `team_id` (optional): Required when using reference number
277
261
 
278
262
  #### `create_journal_entry`
279
263
 
280
- Creates a new journal entry. Requires `mcp:journal:create` permission.
264
+ Create a new journal entry.
281
265
 
282
- - **Parameters:**
283
- - `title` (string, required): Entry title
284
- - `content` (string, required): Entry content (markdown)
285
- - `date` (string, optional): Entry date (ISO format, defaults to now)
286
- - **Returns:** The created journal entry object
266
+ - `title` (required): Entry title
267
+ - `content` (required): Markdown content
268
+ - `date` (optional): ISO date string
287
269
 
288
270
  #### `update_journal_entry`
289
271
 
290
- Updates an existing journal entry. Requires `mcp:journal:update` permission.
272
+ Update an existing journal entry.
291
273
 
292
- - **Parameters:**
293
- - `entry_id` (string, required): The entry UUID
294
- - `title` (string, optional): Updated title
295
- - `content` (string, optional): Updated content (markdown)
296
- - **Returns:** The updated journal entry object
274
+ - `entry_id` (required): The entry UUID
275
+ - `title`, `content` (optional)
297
276
 
298
277
  ### Comments
299
278
 
300
279
  #### `create_work_item_comment`
301
280
 
302
- Adds a comment to a work item. Requires `mcp:comments:create` permission.
281
+ Add a comment to a work item.
303
282
 
304
- - **Parameters:**
305
- - `work_item_id` (string, required): The work item UUID
306
- - `content` (string, required): Comment content (markdown)
307
- - **Returns:** The created comment object
283
+ - `work_item_id` (required): The work item UUID
284
+ - `content` (required): Markdown content
308
285
 
309
286
  #### `create_issue_comment`
310
287
 
311
- Adds a comment to an issue. Requires `mcp:comments:create` permission.
312
-
313
- - **Parameters:**
314
- - `issue_id` (string, required): The issue UUID
315
- - `content` (string, required): Comment content (markdown)
316
- - **Returns:** The created comment object
288
+ Add a comment to an issue.
317
289
 
318
- ### Radar Items (Initiatives)
290
+ - `issue_id` (required): The issue UUID
291
+ - `content` (required): Markdown content
319
292
 
320
- Radar items are strategic initiatives or roadmap items that group related work.
293
+ ### Radar Items
321
294
 
322
295
  #### `list_radar_items`
323
296
 
324
- Lists radar items from the team. By default, excludes completed items.
297
+ List radar items/initiatives (excludes completed by default).
325
298
 
326
- - **Parameters:**
327
- - `team_id` (number, optional): Team ID to filter
328
- - `stage` (string, optional): Filter by stage (pending, now, next, later, completed). Use `completed` to see completed items.
329
- - `limit` (number, optional): Maximum items to return
330
- - `offset` (number, optional): Items to skip
331
- - **Returns:** Array of radar item objects
332
- - **Note:** Results are automatically paginated. If there are more than 200 items, you'll receive a truncation warning.
299
+ - `team_id` (optional): Filter by team
300
+ - `stage` (optional): Filter by stage (pending, now, next, later, completed)
301
+ - `limit`, `offset` (optional): Pagination
333
302
 
334
303
  #### `get_radar_item`
335
304
 
336
- Gets a specific radar item by ID or reference number.
337
-
338
- - **Parameters:**
339
- - `item_id` (string, required): The radar item ID (UUID) or refId (number)
340
- - `team_id` (number, optional): Team ID (required when using refId)
341
- - **Returns:** Radar item object with work items and participants
342
-
343
- ## Automatic Updates
344
-
345
- The MCP server checks for updates on startup. If a newer version is available, you'll see a notification in the server logs with instructions to update:
346
-
347
- ```
348
- npm install -g wolfpack-mcp@latest
349
- ```
350
-
351
- ## Security
352
-
353
- - API keys authenticate with your Wolfpack account
354
- - Each key has configurable permissions for granular access control
355
- - Two-layer permission system: API key permissions checked first, then team role permissions
356
- - All operations are scoped to teams you are a member of
357
- - API keys can be revoked at any time from the Wolfpack application
358
- - All changes are logged with `source: 'mcp'` for audit trails
359
-
360
- ## Troubleshooting
361
-
362
- ### "WOLFPACK_API_KEY environment variable is required"
363
-
364
- This error means the API key is not configured. Check your Claude Desktop configuration file and ensure the `WOLFPACK_API_KEY` is set correctly.
365
-
366
- ### "Invalid API key"
367
-
368
- Your API key may be incorrect or has been revoked. Generate a new API key from the Wolfpack application.
369
-
370
- ### "API key does not have permission: mcp:..."
371
-
372
- Your API key doesn't have the required MCP permission. Create a new key with the appropriate permissions enabled.
373
-
374
- ### Connection errors
305
+ Get a specific radar item.
375
306
 
376
- Ensure:
307
+ - `item_id` (required): UUID or reference number
308
+ - `team_id` (optional): Required when using reference number
377
309
 
378
- 1. The Wolfpack service is available at [wolfpacks.work](https://wolfpacks.work)
379
- 2. Your network allows connections to the backend
380
- 3. If self-hosting, verify `WOLFPACK_API_URL` points to the correct backend URL
310
+ </details>
package/dist/client.js CHANGED
@@ -43,6 +43,10 @@ export class WolfpackClient {
43
43
  firstParams.set('offset', '0');
44
44
  const firstQuery = firstParams.toString();
45
45
  const firstPage = await this.api.get(`${endpoint}${firstQuery ? `?${firstQuery}` : ''}`);
46
+ // Validate response structure
47
+ if (!firstPage || !Array.isArray(firstPage.items)) {
48
+ throw new Error(`Invalid API response from ${endpoint}: expected { items: [], total: number } but got ${JSON.stringify(firstPage)}`);
49
+ }
46
50
  // If total exceeds threshold, return first page with truncation warning
47
51
  if (firstPage.total > MAX_ITEMS_THRESHOLD) {
48
52
  return {
@@ -92,6 +96,10 @@ export class WolfpackClient {
92
96
  params.append('offset', options.offset.toString());
93
97
  const query = params.toString();
94
98
  const response = await this.api.get(`/work-items${query ? `?${query}` : ''}`);
99
+ // Validate response structure
100
+ if (!response || !Array.isArray(response.items)) {
101
+ throw new Error(`Invalid API response from /work-items: expected { items: [], total: number } but got ${JSON.stringify(response)}`);
102
+ }
95
103
  return {
96
104
  items: response.items,
97
105
  total: response.total,
@@ -155,6 +163,10 @@ export class WolfpackClient {
155
163
  params.append('offset', options.offset.toString());
156
164
  const query = params.toString();
157
165
  const response = await this.api.get(`/radar-items${query ? `?${query}` : ''}`);
166
+ // Validate response structure
167
+ if (!response || !Array.isArray(response.items)) {
168
+ throw new Error(`Invalid API response from /radar-items: expected { items: [], total: number } but got ${JSON.stringify(response)}`);
169
+ }
158
170
  return {
159
171
  items: response.items,
160
172
  total: response.total,
@@ -199,6 +211,10 @@ export class WolfpackClient {
199
211
  params.append('offset', options.offset.toString());
200
212
  const query = params.toString();
201
213
  const response = await this.api.get(`/issues${query ? `?${query}` : ''}`);
214
+ // Validate response structure
215
+ if (!response || !Array.isArray(response.items)) {
216
+ throw new Error(`Invalid API response from /issues: expected { items: [], total: number } but got ${JSON.stringify(response)}`);
217
+ }
202
218
  return {
203
219
  items: response.items,
204
220
  total: response.total,
@@ -243,6 +259,10 @@ export class WolfpackClient {
243
259
  params.append('offset', options.offset.toString());
244
260
  const query = params.toString();
245
261
  const response = await this.api.get(`/wiki-pages${query ? `?${query}` : ''}`);
262
+ // Validate response structure
263
+ if (!response || !Array.isArray(response.items)) {
264
+ throw new Error(`Invalid API response from /wiki-pages: expected { items: [], total: number } but got ${JSON.stringify(response)}`);
265
+ }
246
266
  return {
247
267
  items: response.items,
248
268
  total: response.total,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",