wolfpack-mcp 1.0.111 → 1.0.113

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,10 +1,14 @@
1
- # Wolfpack MCP Server
1
+ # Clachan MCP Server (formerly Wolfpack)
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/wolfpack-mcp)](https://www.npmjs.com/package/wolfpack-mcp)
4
4
 
5
- Connect your AI assistant to Wolfpack to manage work items, track issues, update documentation, and log progress—all
5
+ Connect your AI assistant to Clachan to manage work items, track issues, update documentation, and log progress—all
6
6
  through natural conversation.
7
7
 
8
+ > **Wolfpack is now Clachan.** Same product, same server, same account. The package is still published as
9
+ > `wolfpack-mcp`, its settings are still `WOLFPACK_*`, and API keys still begin `wfp_`; nothing you have
10
+ > configured needs to change. See [Clachan and Wolfpack](#clachan-and-wolfpack) below.
11
+
8
12
  ## Quick Start
9
13
 
10
14
  There are two ways to connect:
@@ -24,19 +28,20 @@ Add to your Claude Desktop config file:
24
28
  "mcpServers": {
25
29
  "wolfpack": {
26
30
  "type": "url",
27
- "url": "https://wolfpacks.work/mcp"
31
+ "url": "https://app.clachan.ai/mcp"
28
32
  }
29
33
  }
30
34
  }
31
35
  ```
32
36
 
33
- Restart Claude Desktop. You'll be prompted to sign in with your Wolfpack account via OAuth.
37
+ Restart Claude Desktop. You'll be prompted to sign in with your Clachan account via OAuth. The server is also
38
+ still served at `https://wolfpacks.work/mcp`, so an existing configuration keeps working.
34
39
 
35
40
  ### Coding Agents (stdio)
36
41
 
37
42
  #### 1. Generate an API Key
38
43
 
39
- 1. Log in to [wolfpacks.work](https://wolfpacks.work)
44
+ 1. Log in to [app.clachan.ai](https://app.clachan.ai) (or [wolfpacks.work](https://wolfpacks.work), which still works)
40
45
  2. Go to **Account Settings** → **API Keys**
41
46
  3. Click **Create New Key**
42
47
  4. Select the permissions you need (work items, issues, wiki, etc.)
@@ -62,6 +67,24 @@ Restart Claude Desktop. You'll be prompted to sign in with your Wolfpack account
62
67
 
63
68
  **Cursor / Windsurf** — use the same `command`, `args`, and `env` in your editor's MCP configuration.
64
69
 
70
+ The stdio server talks to `https://wolfpacks.work/api/mcp` unless `WOLFPACK_API_URL` says otherwise; both
71
+ domains serve the same deployment, so there is nothing to change during the rename.
72
+
73
+ ## Clachan and Wolfpack
74
+
75
+ The product was renamed from Wolfpack to Clachan in September 2026. Both names are understood while the
76
+ rename settles: the server introduces the product to your assistant as "Clachan (formerly Wolfpack)", so
77
+ asking for "the Wolfpack issue" or "my Clachan work items" means the same thing.
78
+
79
+ What you configure is deliberately **unchanged**, because it is the contract every installed client already
80
+ depends on:
81
+
82
+ - the package name, `wolfpack-mcp`, and the server name `wolfpack` in your MCP configuration
83
+ - the environment variables: `WOLFPACK_API_KEY`, `WOLFPACK_API_URL`, `WOLFPACK_ORG_SLUG`, `WOLFPACK_TEAM_SLUG`
84
+ - the API key prefixes `wfp_sk_` (user) and `wfp_ak_` (agent)
85
+
86
+ If those are ever renamed it will be announced here, with the old spellings kept working alongside the new.
87
+
65
88
  ## Installation
66
89
 
67
90
  ```bash
package/dist/brand.js CHANGED
@@ -8,6 +8,13 @@
8
8
  *
9
9
  * `WOLFPACK_*` variables are this package's public configuration contract with the MCP
10
10
  * clients that already set them, so they are deliberately not renamed here.
11
+ *
12
+ * `productFormerName` is what the product was called before a rename, for as long as the
13
+ * transition lasts (#2592); the server instructions say it once so a user who still uses
14
+ * the old name is understood. Unlike the other two, a blank `PRODUCT_FORMER_NAME` is a
15
+ * value — "no former name" — so a deployment rebranded by its environment can turn the
16
+ * suffix off. Empty in `brand.json` once the transition is over.
11
17
  */
12
18
  export const productName = process.env.PRODUCT_NAME || 'Clachan';
19
+ export const productFormerName = process.env.PRODUCT_FORMER_NAME ?? 'Wolfpack';
13
20
  export const productDomain = process.env.PRODUCT_DOMAIN || 'wolfpacks.work';
@@ -1,4 +1,4 @@
1
- import { productName } from './brand.js';
1
+ import { productFormerName, productName } from './brand.js';
2
2
  /**
3
3
  * Server instructions, returned in the MCP `initialize` result.
4
4
  *
@@ -12,8 +12,13 @@ import { productName } from './brand.js';
12
12
  * Mirrored in `packages/backend/src/mcp/serverInstructions.ts` for the remote
13
13
  * server — the two servers have no shared package, and already keep their tool
14
14
  * descriptions in step by hand.
15
+ *
16
+ * While a rename is in transition the product is introduced as "X (formerly Y)", once
17
+ * (#2592): nothing else tells the model that "the Wolfpack issue" and a Clachan issue are
18
+ * the same thing. The suffix disappears with the former name.
15
19
  */
16
- export const SERVER_INSTRUCTIONS = `${productName} is this project's tracker. Its references override the usual GitHub reading of "#N".
20
+ const formerly = productFormerName ? ` (formerly ${productFormerName})` : '';
21
+ export const SERVER_INSTRUCTIONS = `${productName}${formerly} is this project's tracker. Its references override the usual GitHub reading of "#N".
17
22
 
18
23
  - A bare "#123" — "work on #123", "look at #42" — is ALWAYS a ${productName} work item. Call get_work_item. Do not run \`gh issue view\`, and do not search GitHub for it.
19
24
  - Read a number as a GitHub issue or pull request only when the user says GitHub, PR, or gh — "the GitHub issue #123", "PR #123".
@@ -1,5 +1,6 @@
1
- import { describe, it, expect } from 'vitest';
1
+ import { describe, it, expect, vi } from 'vitest';
2
2
  import { SERVER_INSTRUCTIONS } from './serverInstructions.js';
3
+ import { productFormerName, productName } from './brand.js';
3
4
  describe('SERVER_INSTRUCTIONS', () => {
4
5
  it('claims a bare #N for work items before any tool is chosen (#1373)', () => {
5
6
  // The whole point of the instructions field: a client puts it in the system
@@ -28,4 +29,29 @@ describe('SERVER_INSTRUCTIONS', () => {
28
29
  it('stays short enough to sit in a system prompt', () => {
29
30
  expect(SERVER_INSTRUCTIONS.length).toBeLessThan(1200);
30
31
  });
32
+ it('introduces the product by its former name too, while it has one (#2592)', () => {
33
+ // A user mid-rename still says the old name; nothing else tells the model the
34
+ // two are one product. Read from the brand so the test survives the transition
35
+ // ending — at which point the suffix must be gone, and this asserts that too.
36
+ const expected = productFormerName
37
+ ? `${productName} (formerly ${productFormerName}) is this project's tracker`
38
+ : `${productName} is this project's tracker`;
39
+ expect(SERVER_INSTRUCTIONS).toContain(expected);
40
+ expect(SERVER_INSTRUCTIONS.match(/formerly/g) ?? []).toHaveLength(productFormerName ? 1 : 0);
41
+ });
42
+ it('says nothing about a former name when the deployment sets a blank one', async () => {
43
+ // A blank value is a value here: a deployment rebranded through PRODUCT_NAME must be
44
+ // able to turn the suffix off, otherwise it introduces itself as formerly Wolfpack.
45
+ vi.stubEnv('PRODUCT_FORMER_NAME', '');
46
+ vi.resetModules();
47
+ try {
48
+ const fresh = await import('./serverInstructions.js');
49
+ expect(fresh.SERVER_INSTRUCTIONS).not.toContain('formerly');
50
+ expect(fresh.SERVER_INSTRUCTIONS).toContain(`${productName} is this project's tracker`);
51
+ }
52
+ finally {
53
+ vi.unstubAllEnvs();
54
+ vi.resetModules();
55
+ }
56
+ });
31
57
  });
@@ -332,7 +332,8 @@ const SHARED_TOOLS = [
332
332
  },
333
333
  radar_item_id: {
334
334
  type: ['string', 'null'],
335
- description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID. Use null to unlink.',
335
+ description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID. Use null to unlink. ' +
336
+ 'A completed or archived initiative takes no new work: the link is refused.',
336
337
  },
337
338
  category_id: {
338
339
  type: ['string', 'null'],
@@ -613,7 +614,8 @@ const SHARED_TOOLS = [
613
614
  name: 'list_radar_items',
614
615
  permission: 'mcp:radar:read',
615
616
  description: 'List radar items - these are initiatives, epics, or roadmap items that group related work items. Use when user asks about "roadmap", "initiatives", "epics", "projects", "what\'s planned", or "upcoming work". Stage: "now" (current sprint), "next" (upcoming), "later" (future), "pending" (not started), "completed". ' +
616
- 'Archived initiatives are listed too, so you can still find one you were working to — `isArchived: true` marks them. An archived initiative is off the roadmap, so nobody sees it there — do not keep filing work against one.',
617
+ 'Archived initiatives are listed too, so you can still find one you were working to — `isArchived: true` marks them. An archived initiative is off the roadmap, so nobody sees it there. ' +
618
+ 'Neither an archived nor a completed initiative takes new work: a work item linked to one is refused, so file against a live initiative or leave the item unlinked.',
617
619
  inputSchema: {
618
620
  type: 'object',
619
621
  properties: {
@@ -640,6 +642,7 @@ const SHARED_TOOLS = [
640
642
  permission: 'mcp:radar:read',
641
643
  description: 'Get a specific radar item (initiative) by reference number, including its work items and participants. ' +
642
644
  '`isArchived: true` means the initiative has been archived and is off the roadmap. ' +
645
+ 'Neither an archived nor a completed initiative takes new work: a work item linked to one is refused. ' +
643
646
  'IMAGES: Image references in the description (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
644
647
  inputSchema: {
645
648
  type: 'object',
@@ -858,7 +861,8 @@ const SHARED_TOOLS = [
858
861
  },
859
862
  radar_item_id: {
860
863
  type: 'string',
861
- description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID.',
864
+ description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID. ' +
865
+ 'A completed or archived initiative takes no new work: the link is refused.',
862
866
  },
863
867
  depends_on: {
864
868
  type: 'array',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.111",
4
- "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
3
+ "version": "1.0.113",
4
+ "description": "MCP server for Clachan (formerly Wolfpack), AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -23,6 +23,7 @@
23
23
  "keywords": [
24
24
  "mcp",
25
25
  "model-context-protocol",
26
+ "clachan",
26
27
  "wolfpack",
27
28
  "ai",
28
29
  "claude",