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.
- package/README.md +156 -226
- package/dist/client.js +20 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Wolfpack MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
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
|
|
22
|
-
2.
|
|
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.
|
|
25
|
-
5.
|
|
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
|
|
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
|
-
|
|
64
|
+
### 3. Restart Claude Desktop
|
|
65
|
+
|
|
66
|
+
After saving the configuration, restart Claude Desktop to connect.
|
|
52
67
|
|
|
53
|
-
|
|
68
|
+
## What You Can Do
|
|
54
69
|
|
|
55
|
-
|
|
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
|
-
|
|
60
|
-
|
|
89
|
+
"WOLFPACK_API_KEY": "wfp_sk_your_api_key_here",
|
|
90
|
+
"WOLFPACK_TEAM_SLUG": "your-team-slug"
|
|
61
91
|
}
|
|
62
92
|
```
|
|
63
93
|
|
|
64
|
-
|
|
94
|
+
## API Key Permissions
|
|
65
95
|
|
|
66
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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.
|
|
144
|
+
List all teams you have access to.
|
|
96
145
|
|
|
97
146
|
- **Parameters:** None
|
|
98
|
-
- **Returns:** Array of
|
|
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
|
|
153
|
+
Lists work items assigned to you (excludes completed by default).
|
|
107
154
|
|
|
108
|
-
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
161
|
+
Get a specific work item.
|
|
119
162
|
|
|
120
|
-
-
|
|
121
|
-
|
|
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
|
-
|
|
168
|
+
Create a new work item.
|
|
128
169
|
|
|
129
|
-
-
|
|
130
|
-
|
|
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
|
-
|
|
175
|
+
Update work item description/notes.
|
|
140
176
|
|
|
141
|
-
-
|
|
142
|
-
|
|
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
|
-
|
|
182
|
+
Change work item status.
|
|
149
183
|
|
|
150
|
-
-
|
|
151
|
-
|
|
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
|
-
|
|
191
|
+
List issues (excludes closed by default).
|
|
162
192
|
|
|
163
|
-
-
|
|
164
|
-
|
|
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
|
-
|
|
198
|
+
Get a specific issue.
|
|
177
199
|
|
|
178
|
-
-
|
|
179
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
213
|
+
Update an existing issue.
|
|
204
214
|
|
|
205
|
-
-
|
|
206
|
-
|
|
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
|
-
|
|
222
|
+
List wiki pages.
|
|
222
223
|
|
|
223
|
-
-
|
|
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
|
-
|
|
228
|
+
Get a wiki page by ID or slug.
|
|
231
229
|
|
|
232
|
-
-
|
|
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
|
-
|
|
234
|
+
Create a new wiki page.
|
|
239
235
|
|
|
240
|
-
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
242
|
+
Update an existing wiki page.
|
|
249
243
|
|
|
250
|
-
-
|
|
251
|
-
|
|
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
|
-
|
|
251
|
+
List journal entries.
|
|
263
252
|
|
|
264
|
-
-
|
|
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
|
-
|
|
257
|
+
Get a specific journal entry.
|
|
272
258
|
|
|
273
|
-
-
|
|
274
|
-
|
|
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
|
-
|
|
264
|
+
Create a new journal entry.
|
|
281
265
|
|
|
282
|
-
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
-
|
|
272
|
+
Update an existing journal entry.
|
|
291
273
|
|
|
292
|
-
-
|
|
293
|
-
|
|
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
|
-
|
|
281
|
+
Add a comment to a work item.
|
|
303
282
|
|
|
304
|
-
-
|
|
305
|
-
|
|
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
|
-
|
|
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
|
-
|
|
290
|
+
- `issue_id` (required): The issue UUID
|
|
291
|
+
- `content` (required): Markdown content
|
|
319
292
|
|
|
320
|
-
Radar
|
|
293
|
+
### Radar Items
|
|
321
294
|
|
|
322
295
|
#### `list_radar_items`
|
|
323
296
|
|
|
324
|
-
|
|
297
|
+
List radar items/initiatives (excludes completed by default).
|
|
325
298
|
|
|
326
|
-
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
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
|
-
|
|
307
|
+
- `item_id` (required): UUID or reference number
|
|
308
|
+
- `team_id` (optional): Required when using reference number
|
|
377
309
|
|
|
378
|
-
|
|
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,
|