wolfpack-mcp 1.0.2 → 1.0.4

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
@@ -1,6 +1,9 @@
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
+ [![npm](https://img.shields.io/npm/v/wolfpack-mcp)](https://www.npmjs.com/package/wolfpack-mcp)
4
+
5
+ Connect your AI assistant to Wolfpack to manage work items, track issues, update documentation, and log progress—all
6
+ through natural conversation.
4
7
 
5
8
  ## Installation
6
9
 
@@ -14,22 +17,34 @@ Or use directly with npx (no installation required):
14
17
  npx wolfpack-mcp
15
18
  ```
16
19
 
20
+ ## Quick Start
21
+
22
+ 1. Generate an API key at [wolfpacks.work](https://wolfpacks.work) → Account Settings → API Keys
23
+ 2. Add the server to Claude Desktop (see [Setup](#setup) below)
24
+ 3. Restart Claude Desktop
25
+ 4. Start asking Claude about your work!
26
+
27
+ **Try these prompts:**
28
+
29
+ - "What work items are assigned to me?"
30
+ - "Show me open bugs"
31
+ - "Create a work item to refactor the auth module"
32
+ - "Update issue #42 status to in-progress"
33
+ - "Add a journal entry about today's progress"
34
+
17
35
  ## Setup
18
36
 
19
37
  ### 1. Generate an API Key
20
38
 
21
- 1. Log in to your Wolfpack application at [wolfpacks.work](https://wolfpacks.work)
22
- 2. Navigate to **Account Settings** → **API Keys**
39
+ 1. Log in to [wolfpacks.work](https://wolfpacks.work)
40
+ 2. Go to **Account Settings** → **API Keys**
23
41
  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!
42
+ 4. Select the permissions you need (work items, issues, wiki, etc.)
43
+ 5. Copy your API key immediately—you won't see it again
29
44
 
30
45
  ### 2. Configure Claude Desktop
31
46
 
32
- Add the MCP server to your Claude Desktop configuration:
47
+ Add to your Claude Desktop config file:
33
48
 
34
49
  **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
35
50
  **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
@@ -48,333 +63,253 @@ Add the MCP server to your Claude Desktop configuration:
48
63
  }
49
64
  ```
50
65
 
51
- Replace `wfp_sk_your_api_key_here` with your actual API key.
66
+ ### 3. Restart Claude Desktop
67
+
68
+ After saving the configuration, restart Claude Desktop to connect.
69
+
70
+ ## What You Can Do
71
+
72
+ | Feature | Example Prompts |
73
+ | -------------- | ------------------------------------------------------------------------------------- |
74
+ | **Work Items** | "What's on my plate?" / "Create a task for API updates" / "Mark task #15 as done" |
75
+ | **Issues** | "Show critical bugs" / "File a bug about the login timeout" / "Assign issue #8 to me" |
76
+ | **Wiki** | "Find docs about deployment" / "Create a page for onboarding steps" |
77
+ | **Journal** | "Log my standup notes" / "What did I work on last week?" |
78
+ | **Radar** | "What initiatives are in progress?" / "Show the roadmap" |
52
79
 
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.
80
+ ## Multi-Team Users
54
81
 
55
- **Optional**: To pre-select a specific team, add `WOLFPACK_TEAM_SLUG` to the env:
82
+ If you belong to multiple teams, Claude will ask which team you mean, or you can specify:
83
+
84
+ - "Show my work items for the Platform team"
85
+ - Use `list_teams` to see all your teams
86
+
87
+ To pre-select a default team, add to your config:
56
88
 
57
89
  ```json
58
90
  "env": {
59
- "WOLFPACK_API_KEY": "wfp_sk_your_api_key_here",
60
- "WOLFPACK_TEAM_SLUG": "your-team-slug"
91
+ "WOLFPACK_API_KEY": "wfp_sk_your_api_key_here",
92
+ "WOLFPACK_TEAM_SLUG": "your-team-slug"
61
93
  }
62
94
  ```
63
95
 
64
- ### 3. Restart Claude Desktop
96
+ ## API Key Permissions
65
97
 
66
- After updating the configuration, restart Claude Desktop to load the MCP server.
98
+ When creating your API key, select the permissions you need:
99
+
100
+ | Permission | What It Enables |
101
+ | ----------------------- | ------------------------------- |
102
+ | `mcp:work_items:read` | View your tasks |
103
+ | `mcp:work_items:create` | Create new tasks |
104
+ | `mcp:work_items:update` | Update task status and notes |
105
+ | `mcp:issues:read` | View issues |
106
+ | `mcp:issues:create` | File new issues |
107
+ | `mcp:issues:update` | Update issue status and details |
108
+ | `mcp:wiki:read` | Read documentation |
109
+ | `mcp:wiki:create` | Create new pages |
110
+ | `mcp:wiki:update` | Edit existing pages |
111
+ | `mcp:journal:read` | View journal entries |
112
+ | `mcp:journal:create` | Create journal entries |
113
+ | `mcp:journal:update` | Edit journal entries |
114
+ | `mcp:comments:create` | Add comments to items |
115
+ | `mcp:radar:read` | View initiatives and roadmap |
67
116
 
68
- ## API Key Permissions
117
+ ## Troubleshooting
118
+
119
+ **"WOLFPACK_API_KEY environment variable is required"**
120
+ Check that your Claude Desktop config has the API key set correctly.
121
+
122
+ **"Invalid API key format"**
123
+ API keys must start with `wfp_sk_` (user keys) or `wfp_ak_` (org-managed agent keys).
124
+
125
+ **"Invalid API key"**
126
+ Your key may be incorrect or revoked. Generate a new one from Account Settings.
127
+
128
+ **"API key does not have permission: mcp:..."**
129
+ Create a new key with the required permission enabled.
130
+
131
+ **Connection errors**
132
+ Verify [wolfpacks.work](https://wolfpacks.work) is accessible from your network.
133
+
134
+ ## Security
135
+
136
+ - API keys are scoped to your account and team memberships
137
+ - Permissions are configurable per key—grant only what you need
138
+ - Revoke keys anytime from Account Settings
139
+
140
+ ## Available Tools Reference
69
141
 
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
142
+ <details>
143
+ <summary>Click to expand full tool documentation</summary>
90
144
 
91
145
  ### Teams
92
146
 
93
147
  #### `list_teams`
94
148
 
95
- List all teams you have access to. Use this to discover available teams and get team IDs.
149
+ List all teams you have access to.
96
150
 
97
151
  - **Parameters:** None
98
- - **Returns:** Array of team objects with `id`, `slug`, and `name`
152
+ - **Returns:** Array of teams with `id`, `slug`, and `name`
99
153
 
100
154
  ### Work Items
101
155
 
102
- Work items are tasks or tickets assigned to team members.
103
-
104
156
  #### `list_work_items`
105
157
 
106
- Lists work items assigned to you. By default, excludes completed and closed items to show active work.
158
+ Lists work items assigned to you (excludes completed by default).
107
159
 
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.
160
+ - `team_id` (optional): Filter by team
161
+ - `status` (optional): Filter by status (new, doing, review, completed, blocked)
162
+ - `limit`, `offset` (optional): Pagination
115
163
 
116
164
  #### `get_work_item`
117
165
 
118
- Gets a specific work item by ID or reference number.
166
+ Get a specific work item.
119
167
 
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
168
+ - `work_item_id` (required): UUID or reference number
169
+ - `team_id` (optional): Required when using reference number
124
170
 
125
171
  #### `create_work_item`
126
172
 
127
- Creates a new work item. Requires `mcp:work_items:create` permission.
173
+ Create a new work item.
128
174
 
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
175
+ - `title` (required): Task title
176
+ - `description`, `status`, `priority`, `leading_user_id` (optional)
136
177
 
137
178
  #### `update_work_progress`
138
179
 
139
- Updates the description/notes on a work item. Requires `mcp:work_items:update` permission.
180
+ Update work item description/notes.
140
181
 
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
182
+ - `work_item_id` (required): The work item ID
183
+ - `description` (required): Updated description (markdown)
145
184
 
146
185
  #### `update_work_item_status`
147
186
 
148
- Changes work item status. Requires `mcp:work_items:update` permission.
187
+ Change work item status.
149
188
 
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
189
+ - `work_item_id` (required): The work item ID
190
+ - `status` (required): New status
154
191
 
155
192
  ### Issues
156
193
 
157
- Issues track bugs, feature requests, and other items in the issue tracker.
158
-
159
194
  #### `list_issues`
160
195
 
161
- Lists issues from the team issue tracker. By default, excludes closed issues.
196
+ List issues (excludes closed by default).
162
197
 
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.
198
+ - `team_id`, `status`, `severity`, `type`, `assigned_to_id` (optional): Filters
199
+ - `limit`, `offset` (optional): Pagination
173
200
 
174
201
  #### `get_issue`
175
202
 
176
- Gets a specific issue by ID or reference number.
203
+ Get a specific issue.
177
204
 
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
205
+ - `issue_id` (required): UUID or reference number
206
+ - `team_id` (optional): Required when using reference number
182
207
 
183
208
  #### `create_issue`
184
209
 
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
210
+ Create a new issue.
211
+
212
+ - `title` (required): Issue title
213
+ - `description`, `severity`, `type`, `assigned_to_id`, `environment`, `affected_version`, `reproducible`,
214
+ `steps_to_reproduce`, `expected_behavior`, `actual_behavior` (optional)
200
215
 
201
216
  #### `update_issue`
202
217
 
203
- Updates an existing issue. Requires `mcp:issues:update` permission.
218
+ Update an existing issue.
204
219
 
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
220
+ - `issue_id` (required): The issue UUID
221
+ - `title`, `description`, `status`, `severity`, `assigned_to_id`, `closing_note` (optional)
214
222
 
215
223
  ### Wiki Pages
216
224
 
217
- Wiki pages store team documentation and knowledge base articles.
218
-
219
225
  #### `list_wiki_pages`
220
226
 
221
- Lists wiki pages from your accessible teams.
227
+ List wiki pages.
222
228
 
223
- - **Parameters:**
224
- - `limit` (number, optional): Maximum pages to return
225
- - `offset` (number, optional): Pages to skip
226
- - **Returns:** Array of wiki page objects
229
+ - `limit`, `offset` (optional): Pagination
227
230
 
228
231
  #### `get_wiki_page`
229
232
 
230
- Gets a specific wiki page by ID or slug.
233
+ Get a wiki page by ID or slug.
231
234
 
232
- - **Parameters:**
233
- - `page_id` (string, required): The page UUID or slug (URL path like "getting-started")
234
- - **Returns:** Wiki page object with content
235
+ - `page_id` (required): UUID or slug (e.g., "getting-started")
235
236
 
236
237
  #### `create_wiki_page`
237
238
 
238
- Creates a new wiki page. Requires `mcp:wiki:create` permission.
239
+ Create a new wiki page.
239
240
 
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
241
+ - `slug` (required): URL path
242
+ - `title` (required): Page title
243
+ - `content` (required): Markdown content
245
244
 
246
245
  #### `update_wiki_page`
247
246
 
248
- Updates an existing wiki page. Requires `mcp:wiki:update` permission.
247
+ Update an existing wiki page.
249
248
 
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
249
+ - `page_id` (required): The page UUID
250
+ - `title`, `content` (optional)
255
251
 
256
252
  ### Journal Entries
257
253
 
258
- Journal entries are daily logs, standup notes, or progress updates.
259
-
260
254
  #### `list_journal_entries`
261
255
 
262
- Lists journal entries from your accessible teams.
256
+ List journal entries.
263
257
 
264
- - **Parameters:**
265
- - `limit` (number, optional): Maximum entries to return
266
- - `offset` (number, optional): Entries to skip
267
- - **Returns:** Array of journal entry objects
258
+ - `limit`, `offset` (optional): Pagination
268
259
 
269
260
  #### `get_journal_entry`
270
261
 
271
- Gets a specific journal entry by ID or reference number.
262
+ Get a specific journal entry.
272
263
 
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
264
+ - `entry_id` (required): UUID or reference number
265
+ - `team_id` (optional): Required when using reference number
277
266
 
278
267
  #### `create_journal_entry`
279
268
 
280
- Creates a new journal entry. Requires `mcp:journal:create` permission.
269
+ Create a new journal entry.
281
270
 
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
271
+ - `title` (required): Entry title
272
+ - `content` (required): Markdown content
273
+ - `date` (optional): ISO date string
287
274
 
288
275
  #### `update_journal_entry`
289
276
 
290
- Updates an existing journal entry. Requires `mcp:journal:update` permission.
277
+ Update an existing journal entry.
291
278
 
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
279
+ - `entry_id` (required): The entry UUID
280
+ - `title`, `content` (optional)
297
281
 
298
282
  ### Comments
299
283
 
300
284
  #### `create_work_item_comment`
301
285
 
302
- Adds a comment to a work item. Requires `mcp:comments:create` permission.
286
+ Add a comment to a work item.
303
287
 
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
288
+ - `work_item_id` (required): The work item UUID
289
+ - `content` (required): Markdown content
308
290
 
309
291
  #### `create_issue_comment`
310
292
 
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
293
+ Add a comment to an issue.
317
294
 
318
- ### Radar Items (Initiatives)
295
+ - `issue_id` (required): The issue UUID
296
+ - `content` (required): Markdown content
319
297
 
320
- Radar items are strategic initiatives or roadmap items that group related work.
298
+ ### Radar Items
321
299
 
322
300
  #### `list_radar_items`
323
301
 
324
- Lists radar items from the team. By default, excludes completed items.
302
+ List radar items/initiatives (excludes completed by default).
325
303
 
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.
304
+ - `team_id` (optional): Filter by team
305
+ - `stage` (optional): Filter by stage (pending, now, next, later, completed)
306
+ - `limit`, `offset` (optional): Pagination
333
307
 
334
308
  #### `get_radar_item`
335
309
 
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
310
+ Get a specific radar item.
375
311
 
376
- Ensure:
312
+ - `item_id` (required): UUID or reference number
313
+ - `team_id` (optional): Required when using reference number
377
314
 
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
315
+ </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/dist/config.js CHANGED
@@ -8,12 +8,12 @@ export function validateConfig() {
8
8
  if (!config.apiKey) {
9
9
  console.error('Error: WOLFPACK_API_KEY environment variable is required');
10
10
  console.error('Please set WOLFPACK_API_KEY to your API key from the Wolfpack application');
11
- console.error('Example: WOLFPACK_API_KEY=wfp_sk_...');
11
+ console.error('Example: WOLFPACK_API_KEY=wfp_sk_... (user) or wfp_ak_... (agent)');
12
12
  process.exit(1);
13
13
  }
14
- if (!config.apiKey.startsWith('wfp_sk_')) {
14
+ if (!config.apiKey.startsWith('wfp_sk_') && !config.apiKey.startsWith('wfp_ak_')) {
15
15
  console.error('Error: Invalid API key format');
16
- console.error('API keys should start with "wfp_sk_"');
16
+ console.error('API keys should start with "wfp_sk_" (user) or "wfp_ak_" (agent)');
17
17
  process.exit(1);
18
18
  }
19
19
  console.error(`MCP Server connecting to: ${config.apiUrl}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",