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 +161 -226
- package/dist/client.js +20 -0
- package/dist/config.js +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Wolfpack MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](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
|
|
22
|
-
2.
|
|
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.
|
|
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!
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
80
|
+
## Multi-Team Users
|
|
54
81
|
|
|
55
|
-
|
|
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
|
-
|
|
60
|
-
|
|
91
|
+
"WOLFPACK_API_KEY": "wfp_sk_your_api_key_here",
|
|
92
|
+
"WOLFPACK_TEAM_SLUG": "your-team-slug"
|
|
61
93
|
}
|
|
62
94
|
```
|
|
63
95
|
|
|
64
|
-
|
|
96
|
+
## API Key Permissions
|
|
65
97
|
|
|
66
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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.
|
|
149
|
+
List all teams you have access to.
|
|
96
150
|
|
|
97
151
|
- **Parameters:** None
|
|
98
|
-
- **Returns:** Array of
|
|
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
|
|
158
|
+
Lists work items assigned to you (excludes completed by default).
|
|
107
159
|
|
|
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.
|
|
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
|
-
|
|
166
|
+
Get a specific work item.
|
|
119
167
|
|
|
120
|
-
-
|
|
121
|
-
|
|
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
|
-
|
|
173
|
+
Create a new work item.
|
|
128
174
|
|
|
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
|
|
175
|
+
- `title` (required): Task title
|
|
176
|
+
- `description`, `status`, `priority`, `leading_user_id` (optional)
|
|
136
177
|
|
|
137
178
|
#### `update_work_progress`
|
|
138
179
|
|
|
139
|
-
|
|
180
|
+
Update work item description/notes.
|
|
140
181
|
|
|
141
|
-
-
|
|
142
|
-
|
|
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
|
-
|
|
187
|
+
Change work item status.
|
|
149
188
|
|
|
150
|
-
-
|
|
151
|
-
|
|
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
|
-
|
|
196
|
+
List issues (excludes closed by default).
|
|
162
197
|
|
|
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.
|
|
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
|
-
|
|
203
|
+
Get a specific issue.
|
|
177
204
|
|
|
178
|
-
-
|
|
179
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
218
|
+
Update an existing issue.
|
|
204
219
|
|
|
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
|
|
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
|
-
|
|
227
|
+
List wiki pages.
|
|
222
228
|
|
|
223
|
-
-
|
|
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
|
-
|
|
233
|
+
Get a wiki page by ID or slug.
|
|
231
234
|
|
|
232
|
-
-
|
|
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
|
-
|
|
239
|
+
Create a new wiki page.
|
|
239
240
|
|
|
240
|
-
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
247
|
+
Update an existing wiki page.
|
|
249
248
|
|
|
250
|
-
-
|
|
251
|
-
|
|
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
|
-
|
|
256
|
+
List journal entries.
|
|
263
257
|
|
|
264
|
-
-
|
|
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
|
-
|
|
262
|
+
Get a specific journal entry.
|
|
272
263
|
|
|
273
|
-
-
|
|
274
|
-
|
|
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
|
-
|
|
269
|
+
Create a new journal entry.
|
|
281
270
|
|
|
282
|
-
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
-
|
|
277
|
+
Update an existing journal entry.
|
|
291
278
|
|
|
292
|
-
-
|
|
293
|
-
|
|
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
|
-
|
|
286
|
+
Add a comment to a work item.
|
|
303
287
|
|
|
304
|
-
-
|
|
305
|
-
|
|
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
|
-
|
|
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
|
-
|
|
295
|
+
- `issue_id` (required): The issue UUID
|
|
296
|
+
- `content` (required): Markdown content
|
|
319
297
|
|
|
320
|
-
Radar
|
|
298
|
+
### Radar Items
|
|
321
299
|
|
|
322
300
|
#### `list_radar_items`
|
|
323
301
|
|
|
324
|
-
|
|
302
|
+
List radar items/initiatives (excludes completed by default).
|
|
325
303
|
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
312
|
+
- `item_id` (required): UUID or reference number
|
|
313
|
+
- `team_id` (optional): Required when using reference number
|
|
377
314
|
|
|
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
|
|
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}`);
|