wolfpack-mcp 1.0.1 → 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 -215
- package/dist/client.js +20 -0
- package/dist/index.js +46 -1
- 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,322 +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.
|
|
119
|
+
|
|
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
|
|
69
134
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
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
|
|
155
|
+
- `team_id` (optional): Filter by team
|
|
156
|
+
- `status` (optional): Filter by status (new, doing, review, completed, blocked)
|
|
157
|
+
- `limit`, `offset` (optional): Pagination
|
|
114
158
|
|
|
115
159
|
#### `get_work_item`
|
|
116
160
|
|
|
117
|
-
|
|
161
|
+
Get a specific work item.
|
|
118
162
|
|
|
119
|
-
-
|
|
120
|
-
|
|
121
|
-
- `team_id` (number, optional): Team ID (required when using refId)
|
|
122
|
-
- **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
|
|
123
165
|
|
|
124
166
|
#### `create_work_item`
|
|
125
167
|
|
|
126
|
-
|
|
168
|
+
Create a new work item.
|
|
127
169
|
|
|
128
|
-
-
|
|
129
|
-
|
|
130
|
-
- `description` (string, optional): Description/notes (markdown)
|
|
131
|
-
- `status` (string, optional): Initial status (new, doing, review, completed, blocked - defaults to 'new')
|
|
132
|
-
- `priority` (number, optional): Priority level (0-4, higher is more important)
|
|
133
|
-
- `leading_user_id` (string, optional): User ID to assign
|
|
134
|
-
- **Returns:** The created work item object
|
|
170
|
+
- `title` (required): Task title
|
|
171
|
+
- `description`, `status`, `priority`, `leading_user_id` (optional)
|
|
135
172
|
|
|
136
173
|
#### `update_work_progress`
|
|
137
174
|
|
|
138
|
-
|
|
175
|
+
Update work item description/notes.
|
|
139
176
|
|
|
140
|
-
-
|
|
141
|
-
|
|
142
|
-
- `description` (string, required): Complete updated description (markdown)
|
|
143
|
-
- **Returns:** The updated work item object
|
|
177
|
+
- `work_item_id` (required): The work item ID
|
|
178
|
+
- `description` (required): Updated description (markdown)
|
|
144
179
|
|
|
145
180
|
#### `update_work_item_status`
|
|
146
181
|
|
|
147
|
-
|
|
182
|
+
Change work item status.
|
|
148
183
|
|
|
149
|
-
-
|
|
150
|
-
|
|
151
|
-
- `status` (string, required): New status (new, doing, review, completed, blocked)
|
|
152
|
-
- **Returns:** The updated work item object
|
|
184
|
+
- `work_item_id` (required): The work item ID
|
|
185
|
+
- `status` (required): New status
|
|
153
186
|
|
|
154
187
|
### Issues
|
|
155
188
|
|
|
156
|
-
Issues track bugs, feature requests, and other items in the issue tracker.
|
|
157
|
-
|
|
158
189
|
#### `list_issues`
|
|
159
190
|
|
|
160
|
-
|
|
191
|
+
List issues (excludes closed by default).
|
|
161
192
|
|
|
162
|
-
-
|
|
163
|
-
|
|
164
|
-
- `status` (string, optional): Filter by status (open, in-progress, resolved, closed)
|
|
165
|
-
- `severity` (string, optional): Filter by severity (low, medium, high, critical)
|
|
166
|
-
- `type` (string, optional): Filter by type (bug, feature-request, task, improvement, question)
|
|
167
|
-
- `assigned_to_id` (string, optional): Filter by assignee ('unassigned' or 'me' for special cases)
|
|
168
|
-
- `limit` (number, optional): Maximum number of items
|
|
169
|
-
- `offset` (number, optional): Items to skip
|
|
170
|
-
- **Returns:** Array of issue objects
|
|
193
|
+
- `team_id`, `status`, `severity`, `type`, `assigned_to_id` (optional): Filters
|
|
194
|
+
- `limit`, `offset` (optional): Pagination
|
|
171
195
|
|
|
172
196
|
#### `get_issue`
|
|
173
197
|
|
|
174
|
-
|
|
198
|
+
Get a specific issue.
|
|
175
199
|
|
|
176
|
-
-
|
|
177
|
-
|
|
178
|
-
- `team_id` (number, optional): Team ID (required when using refId)
|
|
179
|
-
- **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
|
|
180
202
|
|
|
181
203
|
#### `create_issue`
|
|
182
204
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
- `severity` (string, optional): Severity level (low, medium, high, critical)
|
|
189
|
-
- `type` (string, optional): Issue type (bug, feature-request, task, improvement, question)
|
|
190
|
-
- `assigned_to_id` (string, optional): User ID to assign
|
|
191
|
-
- `environment` (string, optional): Environment where issue occurred
|
|
192
|
-
- `affected_version` (string, optional): Version affected
|
|
193
|
-
- `reproducible` (boolean, optional): Whether reproducible
|
|
194
|
-
- `steps_to_reproduce` (string, optional): Steps to reproduce
|
|
195
|
-
- `expected_behavior` (string, optional): Expected behavior
|
|
196
|
-
- `actual_behavior` (string, optional): Actual behavior observed
|
|
197
|
-
- **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)
|
|
198
210
|
|
|
199
211
|
#### `update_issue`
|
|
200
212
|
|
|
201
|
-
|
|
213
|
+
Update an existing issue.
|
|
202
214
|
|
|
203
|
-
-
|
|
204
|
-
|
|
205
|
-
- `title` (string, optional): Updated title
|
|
206
|
-
- `description` (string, optional): Updated description
|
|
207
|
-
- `status` (string, optional): Updated status (open, in-progress, resolved, closed)
|
|
208
|
-
- `severity` (string, optional): Updated severity
|
|
209
|
-
- `assigned_to_id` (string, optional): Updated assignee
|
|
210
|
-
- `closing_note` (string, optional): Note when closing
|
|
211
|
-
- **Returns:** The updated issue object
|
|
215
|
+
- `issue_id` (required): The issue UUID
|
|
216
|
+
- `title`, `description`, `status`, `severity`, `assigned_to_id`, `closing_note` (optional)
|
|
212
217
|
|
|
213
218
|
### Wiki Pages
|
|
214
219
|
|
|
215
|
-
Wiki pages store team documentation and knowledge base articles.
|
|
216
|
-
|
|
217
220
|
#### `list_wiki_pages`
|
|
218
221
|
|
|
219
|
-
|
|
222
|
+
List wiki pages.
|
|
220
223
|
|
|
221
|
-
-
|
|
222
|
-
- `limit` (number, optional): Maximum pages to return
|
|
223
|
-
- `offset` (number, optional): Pages to skip
|
|
224
|
-
- **Returns:** Array of wiki page objects
|
|
224
|
+
- `limit`, `offset` (optional): Pagination
|
|
225
225
|
|
|
226
226
|
#### `get_wiki_page`
|
|
227
227
|
|
|
228
|
-
|
|
228
|
+
Get a wiki page by ID or slug.
|
|
229
229
|
|
|
230
|
-
-
|
|
231
|
-
- `page_id` (string, required): The page UUID or slug (URL path like "getting-started")
|
|
232
|
-
- **Returns:** Wiki page object with content
|
|
230
|
+
- `page_id` (required): UUID or slug (e.g., "getting-started")
|
|
233
231
|
|
|
234
232
|
#### `create_wiki_page`
|
|
235
233
|
|
|
236
|
-
|
|
234
|
+
Create a new wiki page.
|
|
237
235
|
|
|
238
|
-
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
- `content` (string, required): Page content (markdown)
|
|
242
|
-
- **Returns:** The created wiki page object
|
|
236
|
+
- `slug` (required): URL path
|
|
237
|
+
- `title` (required): Page title
|
|
238
|
+
- `content` (required): Markdown content
|
|
243
239
|
|
|
244
240
|
#### `update_wiki_page`
|
|
245
241
|
|
|
246
|
-
|
|
242
|
+
Update an existing wiki page.
|
|
247
243
|
|
|
248
|
-
-
|
|
249
|
-
|
|
250
|
-
- `title` (string, optional): Updated title
|
|
251
|
-
- `content` (string, optional): Updated content (markdown)
|
|
252
|
-
- **Returns:** The updated wiki page object
|
|
244
|
+
- `page_id` (required): The page UUID
|
|
245
|
+
- `title`, `content` (optional)
|
|
253
246
|
|
|
254
247
|
### Journal Entries
|
|
255
248
|
|
|
256
|
-
Journal entries are daily logs, standup notes, or progress updates.
|
|
257
|
-
|
|
258
249
|
#### `list_journal_entries`
|
|
259
250
|
|
|
260
|
-
|
|
251
|
+
List journal entries.
|
|
261
252
|
|
|
262
|
-
-
|
|
263
|
-
- `limit` (number, optional): Maximum entries to return
|
|
264
|
-
- `offset` (number, optional): Entries to skip
|
|
265
|
-
- **Returns:** Array of journal entry objects
|
|
253
|
+
- `limit`, `offset` (optional): Pagination
|
|
266
254
|
|
|
267
255
|
#### `get_journal_entry`
|
|
268
256
|
|
|
269
|
-
|
|
257
|
+
Get a specific journal entry.
|
|
270
258
|
|
|
271
|
-
-
|
|
272
|
-
|
|
273
|
-
- `team_id` (number, optional): Team ID (required when using refId)
|
|
274
|
-
- **Returns:** Journal entry object
|
|
259
|
+
- `entry_id` (required): UUID or reference number
|
|
260
|
+
- `team_id` (optional): Required when using reference number
|
|
275
261
|
|
|
276
262
|
#### `create_journal_entry`
|
|
277
263
|
|
|
278
|
-
|
|
264
|
+
Create a new journal entry.
|
|
279
265
|
|
|
280
|
-
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
- `date` (string, optional): Entry date (ISO format, defaults to now)
|
|
284
|
-
- **Returns:** The created journal entry object
|
|
266
|
+
- `title` (required): Entry title
|
|
267
|
+
- `content` (required): Markdown content
|
|
268
|
+
- `date` (optional): ISO date string
|
|
285
269
|
|
|
286
270
|
#### `update_journal_entry`
|
|
287
271
|
|
|
288
|
-
|
|
272
|
+
Update an existing journal entry.
|
|
289
273
|
|
|
290
|
-
-
|
|
291
|
-
|
|
292
|
-
- `title` (string, optional): Updated title
|
|
293
|
-
- `content` (string, optional): Updated content (markdown)
|
|
294
|
-
- **Returns:** The updated journal entry object
|
|
274
|
+
- `entry_id` (required): The entry UUID
|
|
275
|
+
- `title`, `content` (optional)
|
|
295
276
|
|
|
296
277
|
### Comments
|
|
297
278
|
|
|
298
279
|
#### `create_work_item_comment`
|
|
299
280
|
|
|
300
|
-
|
|
281
|
+
Add a comment to a work item.
|
|
301
282
|
|
|
302
|
-
-
|
|
303
|
-
|
|
304
|
-
- `content` (string, required): Comment content (markdown)
|
|
305
|
-
- **Returns:** The created comment object
|
|
283
|
+
- `work_item_id` (required): The work item UUID
|
|
284
|
+
- `content` (required): Markdown content
|
|
306
285
|
|
|
307
286
|
#### `create_issue_comment`
|
|
308
287
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
- **Parameters:**
|
|
312
|
-
- `issue_id` (string, required): The issue UUID
|
|
313
|
-
- `content` (string, required): Comment content (markdown)
|
|
314
|
-
- **Returns:** The created comment object
|
|
288
|
+
Add a comment to an issue.
|
|
315
289
|
|
|
316
|
-
|
|
290
|
+
- `issue_id` (required): The issue UUID
|
|
291
|
+
- `content` (required): Markdown content
|
|
317
292
|
|
|
318
|
-
Radar
|
|
293
|
+
### Radar Items
|
|
319
294
|
|
|
320
295
|
#### `list_radar_items`
|
|
321
296
|
|
|
322
|
-
|
|
297
|
+
List radar items/initiatives (excludes completed by default).
|
|
323
298
|
|
|
324
|
-
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
- `limit` (number, optional): Maximum items to return
|
|
328
|
-
- `offset` (number, optional): Items to skip
|
|
329
|
-
- **Returns:** Array of radar item objects
|
|
299
|
+
- `team_id` (optional): Filter by team
|
|
300
|
+
- `stage` (optional): Filter by stage (pending, now, next, later, completed)
|
|
301
|
+
- `limit`, `offset` (optional): Pagination
|
|
330
302
|
|
|
331
303
|
#### `get_radar_item`
|
|
332
304
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
- **Parameters:**
|
|
336
|
-
- `item_id` (string, required): The radar item ID (UUID) or refId (number)
|
|
337
|
-
- `team_id` (number, optional): Team ID (required when using refId)
|
|
338
|
-
- **Returns:** Radar item object with work items and participants
|
|
339
|
-
|
|
340
|
-
## Security
|
|
341
|
-
|
|
342
|
-
- API keys authenticate with your Wolfpack account
|
|
343
|
-
- Each key has configurable permissions for granular access control
|
|
344
|
-
- Two-layer permission system: API key permissions checked first, then team role permissions
|
|
345
|
-
- All operations are scoped to teams you are a member of
|
|
346
|
-
- API keys can be revoked at any time from the Wolfpack application
|
|
347
|
-
- All changes are logged with `source: 'mcp'` for audit trails
|
|
348
|
-
|
|
349
|
-
## Troubleshooting
|
|
350
|
-
|
|
351
|
-
### "WOLFPACK_API_KEY environment variable is required"
|
|
352
|
-
|
|
353
|
-
This error means the API key is not configured. Check your Claude Desktop configuration file and ensure the `WOLFPACK_API_KEY` is set correctly.
|
|
354
|
-
|
|
355
|
-
### "Invalid API key"
|
|
356
|
-
|
|
357
|
-
Your API key may be incorrect or has been revoked. Generate a new API key from the Wolfpack application.
|
|
358
|
-
|
|
359
|
-
### "API key does not have permission: mcp:..."
|
|
360
|
-
|
|
361
|
-
Your API key doesn't have the required MCP permission. Create a new key with the appropriate permissions enabled.
|
|
362
|
-
|
|
363
|
-
### Connection errors
|
|
305
|
+
Get a specific radar item.
|
|
364
306
|
|
|
365
|
-
|
|
307
|
+
- `item_id` (required): UUID or reference number
|
|
308
|
+
- `team_id` (optional): Required when using reference number
|
|
366
309
|
|
|
367
|
-
|
|
368
|
-
2. Your network allows connections to the backend
|
|
369
|
-
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/dist/index.js
CHANGED
|
@@ -3,8 +3,51 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
+
import { createRequire } from 'module';
|
|
6
7
|
import { WolfpackClient } from './client.js';
|
|
7
8
|
import { validateConfig, config } from './config.js';
|
|
9
|
+
// Get current package version
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const packageJson = require('../package.json');
|
|
12
|
+
const CURRENT_VERSION = packageJson.version;
|
|
13
|
+
const PACKAGE_NAME = packageJson.name;
|
|
14
|
+
// Check for updates from npm registry
|
|
15
|
+
async function checkForUpdates() {
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
|
|
18
|
+
headers: { Accept: 'application/json' },
|
|
19
|
+
signal: AbortSignal.timeout(5000), // 5 second timeout
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok)
|
|
22
|
+
return;
|
|
23
|
+
const data = (await response.json());
|
|
24
|
+
const latestVersion = data.version;
|
|
25
|
+
if (latestVersion && latestVersion !== CURRENT_VERSION) {
|
|
26
|
+
const [latestMajor, latestMinor, latestPatch] = latestVersion.split('.').map(Number);
|
|
27
|
+
const [currentMajor, currentMinor, currentPatch] = CURRENT_VERSION.split('.').map(Number);
|
|
28
|
+
// Check if latest is actually newer
|
|
29
|
+
const isNewer = latestMajor > currentMajor ||
|
|
30
|
+
(latestMajor === currentMajor && latestMinor > currentMinor) ||
|
|
31
|
+
(latestMajor === currentMajor &&
|
|
32
|
+
latestMinor === currentMinor &&
|
|
33
|
+
latestPatch > currentPatch);
|
|
34
|
+
if (isNewer) {
|
|
35
|
+
console.error('');
|
|
36
|
+
console.error('╔════════════════════════════════════════════════════════════╗');
|
|
37
|
+
console.error('║ UPDATE AVAILABLE ║');
|
|
38
|
+
console.error(`║ ${PACKAGE_NAME} ${CURRENT_VERSION} → ${latestVersion}`.padEnd(61) + '║');
|
|
39
|
+
console.error('║ ║');
|
|
40
|
+
console.error('║ Run: npm install -g wolfpack-mcp@latest ║');
|
|
41
|
+
console.error('║ Or update your package.json and run: npm install ║');
|
|
42
|
+
console.error('╚════════════════════════════════════════════════════════════╝');
|
|
43
|
+
console.error('');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Silently ignore update check failures - don't block startup
|
|
49
|
+
}
|
|
50
|
+
}
|
|
8
51
|
// Work Item schemas
|
|
9
52
|
const ListWorkItemsSchema = z.object({
|
|
10
53
|
team_id: z.number().optional().describe('Team ID to filter work items'),
|
|
@@ -915,6 +958,8 @@ class WolfpackMCPServer {
|
|
|
915
958
|
});
|
|
916
959
|
}
|
|
917
960
|
async start() {
|
|
961
|
+
// Check for updates (non-blocking)
|
|
962
|
+
checkForUpdates();
|
|
918
963
|
// Resolve team on startup
|
|
919
964
|
if (config.teamSlug) {
|
|
920
965
|
// Explicit team slug configured - use it
|
|
@@ -950,7 +995,7 @@ class WolfpackMCPServer {
|
|
|
950
995
|
}
|
|
951
996
|
const transport = new StdioServerTransport();
|
|
952
997
|
await this.server.connect(transport);
|
|
953
|
-
console.error(
|
|
998
|
+
console.error(`Wolfpack MCP Server v${CURRENT_VERSION} started`);
|
|
954
999
|
}
|
|
955
1000
|
}
|
|
956
1001
|
// Validate configuration before starting
|