harmony-mcp 1.5.0 → 1.5.2

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.
Files changed (4) hide show
  1. package/README.md +120 -141
  2. package/dist/cli.js +19 -18
  3. package/dist/index.js +10 -10
  4. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # harmony-mcp
2
2
 
3
- MCP (Model Context Protocol) server for Harmony Kanban board. Enables AI coding agents (Claude Code, OpenAI Codex, Cursor, Windsurf) to interact with your Harmony boards.
3
+ MCP (Model Context Protocol) server for [Harmony](https://gethmy.com).
4
+ Enables AI coding agents (Claude Code, OpenAI Codex, Cursor, Windsurf) to interact with your Harmony boards.
4
5
 
5
6
  ## Features
6
7
 
@@ -10,69 +11,84 @@ MCP (Model Context Protocol) server for Harmony Kanban board. Enables AI coding
10
11
  - **Agent Session Tracking** - track work progress with timer badges
11
12
  - **Auto-Assignment** - automatically assign cards to you when starting agent sessions
12
13
  - **Multi-Agent Support** - works with Claude Code, Codex, Cursor, Windsurf
13
- - **One-Command Setup** - auto-configure all supported agents
14
+ - **Smart Setup** - one command configures everything
14
15
  - **Natural Language Processing** via voice-nlu edge function
15
16
  - **API Key Authentication** - no database credentials required
16
17
 
17
18
  ## Quick Start
18
19
 
19
- ### 1. Generate an API Key
20
+ ### 1. Get an API Key
20
21
 
21
22
  1. Log into [Harmony](https://gethmy.com)
22
- 2. Go to **Account → API Keys**
23
+ 2. Go to **[API Keys](https://gethmy.com/user/keys)**
23
24
  3. Click **"Generate New Key"**
24
- 4. Copy the key (it starts with `hmy_`)
25
+ 4. Copy the key (starts with `hmy_`)
25
26
 
26
- ### 2. Run Setup (Recommended)
27
+ ### 2. Run Setup
27
28
 
28
29
  ```bash
29
30
  npx harmony-mcp setup
30
31
  ```
31
32
 
32
- This interactive wizard will:
33
- - Prompt for your API key
34
- - Auto-detect your installed AI agents (Claude Code, Cursor, Windsurf, Codex)
35
- - Configure all detected agents automatically
36
- - Optionally install globally for faster startup
33
+ The smart setup wizard will:
37
34
 
38
- ### Alternative: Global Install
35
+ - Validate your API key
36
+ - Detect installed AI agents (Claude Code, Cursor, Windsurf, Codex)
37
+ - Install skills globally (recommended) or locally
38
+ - Let you select your workspace and project
39
39
 
40
- If you prefer a global installation:
40
+ That's it! You're ready to use Harmony with your AI agent.
41
+
42
+ ### Adding to a New Project
43
+
44
+ Just run setup again in the new project directory:
41
45
 
42
46
  ```bash
43
- npm install -g harmony-mcp
44
- harmony-mcp setup
47
+ cd my-new-project
48
+ npx harmony-mcp setup
45
49
  ```
46
50
 
47
- ### Manual Setup
51
+ It detects your existing configuration and only asks for the project context.
48
52
 
49
- For manual configuration of Claude Code:
53
+ ## CLI Commands
50
54
 
51
55
  ```bash
52
- claude mcp add harmony -- harmony-mcp serve
53
- ```
56
+ # Setup (recommended)
57
+ npx harmony-mcp setup # Smart setup wizard
54
58
 
55
- Or add to `~/.claude/settings.json`:
59
+ # Setup with flags (non-interactive)
60
+ npx harmony-mcp setup --api-key KEY --global --workspace ID --project ID
56
61
 
57
- ```json
58
- {
59
- "mcpServers": {
60
- "harmony": {
61
- "command": "harmony-mcp",
62
- "args": ["serve"]
63
- }
64
- }
65
- }
62
+ # Status and management
63
+ npx harmony-mcp status # Show current configuration
64
+ npx harmony-mcp reset # Clear all configuration
65
+
66
+ # Server (called by agents automatically)
67
+ npx harmony-mcp serve # Start MCP server
66
68
  ```
67
69
 
70
+ ### Setup Options
71
+
72
+ | Flag | Description |
73
+ | -------------------------- | ---------------------------------------------------- |
74
+ | `-k, --api-key <key>` | API key (skips prompt) |
75
+ | `-e, --email <email>` | Your email for auto-assignment |
76
+ | `-a, --agents <agents...>` | Agents to configure: claude, codex, cursor, windsurf |
77
+ | `-g, --global` | Install skills globally (recommended) |
78
+ | `-l, --local` | Install skills locally in project directory |
79
+ | `-w, --workspace <id>` | Set workspace context |
80
+ | `-p, --project <id>` | Set project context |
81
+ | `--skip-context` | Skip workspace/project selection |
82
+ | `-f, --force` | Overwrite existing configuration |
83
+
68
84
  ## Supported AI Agents
69
85
 
70
- | Agent | MCP Config | Workflow Command |
71
- | ---------------- | ------------------------------------- | ------------------------ |
72
- | **Claude Code** | `~/.claude/settings.json` | `/hmy #42` |
73
- | **OpenAI Codex** | `~/.codex/config.toml` | `/prompts:hmy #42` |
74
- | **Cursor** | `.cursor/mcp.json` | MCP tools auto-available |
75
- | **Windsurf** | `~/.codeium/windsurf/mcp_config.json` | MCP tools auto-available |
86
+ | Agent | Workflow Command | Config Location |
87
+ | ---------------- | ------------------------ | ------------------------------------- |
88
+ | **Claude Code** | `/hmy #42` | `~/.claude/settings.json` |
89
+ | **OpenAI Codex** | `/prompts:hmy #42` | `~/.codex/config.toml` |
90
+ | **Cursor** | MCP tools auto-available | `.cursor/mcp.json` |
91
+ | **Windsurf** | MCP tools auto-available | `~/.codeium/windsurf/mcp_config.json` |
76
92
 
77
93
  ## Card Workflow
78
94
 
@@ -81,40 +97,11 @@ When you start working on a card (e.g., `/hmy #42`):
81
97
  1. **Find** - Locates the card by short ID, UUID, or name
82
98
  2. **Move** - Moves the card to "In Progress" column
83
99
  3. **Label** - Adds the "agent" label to indicate AI is working
84
- 4. **Assign** - Auto-assigns the card to you (if `userEmail` is configured)
100
+ 4. **Assign** - Auto-assigns the card to you (if email is configured)
85
101
  5. **Track** - Starts a session timer visible in the UI
86
102
  6. **Implement** - Work on the task with progress updates
87
103
  7. **Complete** - Move to "Review" when done
88
104
 
89
- ## CLI Commands
90
-
91
- ```bash
92
- # Setup (recommended)
93
- harmony-mcp setup # Interactive setup wizard (recommended)
94
-
95
- # Legacy configuration commands
96
- harmony-mcp configure # Set up API key (interactive)
97
- harmony-mcp configure -k KEY -e EMAIL # Set up with API key and email
98
- harmony-mcp init # Initialize for AI agents (interactive)
99
- harmony-mcp init --all # Configure all supported agents
100
- harmony-mcp init --detect # Auto-detect and configure installed agents
101
- harmony-mcp init --agent X Y # Configure specific agents
102
- harmony-mcp init -w WS -p PROJ # Initialize with local workspace/project context
103
-
104
- # Status and management
105
- harmony-mcp status # Show current config (global and local)
106
- harmony-mcp reset # Clear configuration
107
- harmony-mcp set-workspace ID # Set active workspace (global)
108
- harmony-mcp set-workspace ID -l # Set active workspace (local project)
109
- harmony-mcp set-project ID # Set active project (global)
110
- harmony-mcp set-project ID -l # Set active project (local project)
111
- harmony-mcp set-user-email EMAIL # Set email for auto-assignment
112
- harmony-mcp clear-user-email # Disable auto-assignment
113
-
114
- # Server
115
- harmony-mcp serve # Start MCP server
116
- ```
117
-
118
105
  ## Available Tools
119
106
 
120
107
  ### Card Operations
@@ -197,6 +184,7 @@ harmony-mcp serve # Start MCP server
197
184
  | `customConstraints` | Additional instructions to append |
198
185
 
199
186
  **Variants:**
187
+
200
188
  - `analysis` - Understand the problem and create a plan
201
189
  - `draft` - Design a solution approach
202
190
  - `execute` - Full implementation (default)
@@ -208,74 +196,58 @@ The prompt builder automatically infers the agent role based on card labels (bug
208
196
  You can also call the Harmony API directly from any HTTP client:
209
197
 
210
198
  ```bash
211
- curl -X GET "https://gethmy.com/api/workspaces" \
199
+ curl -X GET "https://gethmy.com/api/v1/workspaces" \
212
200
  -H "X-API-Key: hmy_your_key_here"
213
201
  ```
214
202
 
215
203
  ### API Endpoints
216
204
 
217
- | Endpoint | Method | Description |
218
- | ---------------------------- | ------ | -------------------------- |
219
- | `/workspaces` | GET | List workspaces |
220
- | `/workspaces/:id/projects` | GET | List projects in workspace |
221
- | `/workspaces/:id/members` | GET | Get workspace members |
222
- | `/board/:projectId` | GET | Get full board state |
223
- | `/cards` | POST | Create card |
224
- | `/cards/:id` | GET | Get card |
225
- | `/cards/:id` | PATCH | Update card |
226
- | `/cards/:id` | DELETE | Delete card |
227
- | `/cards/:id/move` | POST | Move card |
228
- | `/search?q=query` | GET | Search cards |
229
- | `/columns` | POST | Create column |
230
- | `/columns/:id` | PATCH | Update column |
231
- | `/columns/:id` | DELETE | Delete column |
232
- | `/labels` | POST | Create label |
233
- | `/cards/:id/labels` | POST | Add label to card |
234
- | `/cards/:id/labels/:labelId` | DELETE | Remove label |
235
- | `/subtasks` | POST | Create subtask |
236
- | `/subtasks/:id/toggle` | POST | Toggle subtask |
237
- | `/subtasks/:id` | DELETE | Delete subtask |
238
- | `/cards/:id/links` | GET | Get card links |
239
- | `/cards/:id/links` | POST | Create card link |
240
- | `/links/:id` | DELETE | Delete card link |
241
- | `/cards/:id/prompt` | GET | Generate prompt from card |
242
- | `/nlu` | POST | Process natural language |
205
+ | Endpoint | Method | Description |
206
+ | ------------------------------- | ------ | -------------------------- |
207
+ | `/v1/workspaces` | GET | List workspaces |
208
+ | `/v1/workspaces/:id/projects` | GET | List projects in workspace |
209
+ | `/v1/workspaces/:id/members` | GET | Get workspace members |
210
+ | `/v1/board/:projectId` | GET | Get full board state |
211
+ | `/v1/cards` | POST | Create card |
212
+ | `/v1/cards/:id` | GET | Get card |
213
+ | `/v1/cards/:id` | PATCH | Update card |
214
+ | `/v1/cards/:id` | DELETE | Delete card |
215
+ | `/v1/cards/:id/move` | POST | Move card |
216
+ | `/v1/search?q=query` | GET | Search cards |
217
+ | `/v1/columns` | POST | Create column |
218
+ | `/v1/columns/:id` | PATCH | Update column |
219
+ | `/v1/columns/:id` | DELETE | Delete column |
220
+ | `/v1/labels` | POST | Create label |
221
+ | `/v1/cards/:id/labels` | POST | Add label to card |
222
+ | `/v1/cards/:id/labels/:labelId` | DELETE | Remove label |
223
+ | `/v1/subtasks` | POST | Create subtask |
224
+ | `/v1/subtasks/:id/toggle` | POST | Toggle subtask |
225
+ | `/v1/subtasks/:id` | DELETE | Delete subtask |
226
+ | `/v1/cards/:id/links` | GET | Get card links |
227
+ | `/v1/cards/:id/links` | POST | Create card link |
228
+ | `/v1/links/:id` | DELETE | Delete card link |
229
+ | `/v1/cards/:id/prompt` | GET | Generate prompt from card |
230
+ | `/v1/nlu` | POST | Process natural language |
243
231
 
244
232
  ## Configuration
245
233
 
246
234
  ### Global Configuration
247
235
 
248
- Your global configuration is stored in `~/.harmony-mcp/config.json`:
236
+ Stored in `~/.harmony-mcp/config.json`:
249
237
 
250
238
  ```json
251
239
  {
252
240
  "apiKey": "hmy_...",
253
241
  "apiUrl": "https://gethmy.com/api",
242
+ "userEmail": "you@example.com",
254
243
  "activeWorkspaceId": null,
255
- "activeProjectId": null,
256
- "userEmail": "you@example.com"
244
+ "activeProjectId": null
257
245
  }
258
246
  ```
259
247
 
260
- ### Auto-Assignment
261
-
262
- When `userEmail` is configured, cards are automatically assigned to you when you start an agent session (e.g., via `/hmy #42`). This helps track who is working on what.
263
-
264
- To enable auto-assignment:
265
- ```bash
266
- harmony-mcp set-user-email you@example.com
267
- ```
268
-
269
- To disable auto-assignment:
270
- ```bash
271
- harmony-mcp clear-user-email
272
- ```
273
-
274
- The email must match your Harmony account email to work correctly.
275
-
276
248
  ### Local Project Configuration
277
249
 
278
- For multi-project workflows, you can set project-specific context using local configuration. This is stored in `.harmony-mcp.json` in your project root:
250
+ Stored in `.harmony-mcp.json` in your project root:
279
251
 
280
252
  ```json
281
253
  {
@@ -288,45 +260,52 @@ For multi-project workflows, you can set project-specific context using local co
288
260
 
289
261
  **Security**: API key is never stored locally (only in global config) to prevent accidental commits.
290
262
 
291
- #### Setting Local Context
263
+ ### Auto-Assignment
292
264
 
293
- ```bash
294
- # During initialization
295
- harmony-mcp init --workspace <ws-id> --project <proj-id>
265
+ When your email is configured during setup, cards are automatically assigned to you when you start an agent session (e.g., via `/hmy #42`). This helps track who is working on what.
266
+
267
+ To update your email:
296
268
 
297
- # Or separately
298
- harmony-mcp set-workspace <id> --local
299
- harmony-mcp set-project <id> --local
269
+ ```bash
270
+ npx harmony-mcp setup --email you@example.com
300
271
  ```
301
272
 
302
- #### Viewing Configuration
273
+ The email must match your Harmony account email to work correctly.
274
+
275
+ ### Viewing Configuration
303
276
 
304
277
  ```bash
305
- harmony-mcp status
278
+ npx harmony-mcp status
306
279
  ```
307
280
 
308
281
  Example output:
309
282
 
310
283
  ```
311
284
  Status: Configured
312
- API Key: hmy_abc1...
313
- API URL: https://gethmy.com/api
314
- User Email: y***@example.com
315
-
316
- Global Context:
317
- Workspace: <global-ws-id>
318
- Project: <global-proj-id>
319
-
320
- Local Context (.harmony-mcp.json):
321
- Workspace: <local-ws-id>
322
- Project: <local-proj-id>
323
285
 
324
- Active (effective):
325
- Workspace: <local-ws-id> ← local
326
- Project: <local-proj-id> ← local
286
+ API:
287
+ Key: hmy_abc1...
288
+ URL: https://gethmy.com/api
289
+ Email: y***@example.com
290
+
291
+ Skills:
292
+ Installed: Yes (global)
293
+ ~/.agents/skills/hmy/SKILL.md
294
+
295
+ Context:
296
+ Local config: .harmony-mcp.json
297
+ Workspace: my-team-id
298
+ Project: my-project-id
299
+ Global config: ~/.harmony-mcp/config.json
300
+ Workspace: (not set)
301
+ Project: (not set)
302
+
303
+ Active (effective):
304
+ Workspace: my-team-id ← local
305
+ Project: my-project-id ← local
327
306
  ```
328
307
 
329
- #### Recommended .gitignore
308
+ ### Recommended .gitignore
330
309
 
331
310
  Add this to prevent accidentally committing local config:
332
311
 
@@ -339,10 +318,10 @@ Add this to prevent accidentally committing local config:
339
318
  ```
340
319
  ┌─────────────────┐ MCP Protocol ┌──────────────────┐
341
320
  │ Claude Code │ ───────────────────────▶│ harmony-mcp │
342
- Claude Desktop │ │ (local server) │
343
- Custom Agents │ └────────┬─────────┘
344
- └─────────────────┘
345
- │ API Key Auth
321
+ Cursor │ │ (local server) │
322
+ Windsurf │ └────────┬─────────┘
323
+ │ Codex │
324
+ └─────────────────┘ │ API Key Auth
346
325
 
347
326
  ┌──────────────────┐
348
327
  │ Harmony API │
@@ -358,7 +337,7 @@ Add this to prevent accidentally committing local config:
358
337
 
359
338
  **Key Benefits:**
360
339
 
361
- - No Database credentials needed - just a Harmony API key
340
+ - No database credentials needed - just a Harmony API key
362
341
  - Any Harmony user can use it
363
342
  - Business logic stays in Harmony
364
343
  - Centralized security and rate limiting
package/dist/cli.js CHANGED
@@ -29478,24 +29478,24 @@ function areSkillsInstalled(cwd) {
29478
29478
  foundPaths.push(globalSkillPath);
29479
29479
  return { installed: true, location: "global", paths: foundPaths };
29480
29480
  }
29481
- const claudeGlobalCommand = join(home, ".claude", "commands", "hmy.md");
29482
- if (existsSync(claudeGlobalCommand)) {
29483
- foundPaths.push(claudeGlobalCommand);
29484
- return { installed: true, location: "global", paths: foundPaths };
29485
- }
29486
- const claudeGlobalSkill = join(home, ".claude", "skills", "hmy", "SKILL.md");
29481
+ const claudeGlobalSkill = join(home, ".claude", "skills", "hmy.md");
29487
29482
  if (existsSync(claudeGlobalSkill)) {
29488
29483
  foundPaths.push(claudeGlobalSkill);
29489
29484
  return { installed: true, location: "global", paths: foundPaths };
29490
29485
  }
29491
- const localSkillPath = join(workingDir, ".claude", "skills", "hmy", "SKILL.md");
29486
+ const claudeGlobalSkillAlt = join(home, ".claude", "skills", "hmy", "SKILL.md");
29487
+ if (existsSync(claudeGlobalSkillAlt)) {
29488
+ foundPaths.push(claudeGlobalSkillAlt);
29489
+ return { installed: true, location: "global", paths: foundPaths };
29490
+ }
29491
+ const localSkillPath = join(workingDir, ".claude", "skills", "hmy.md");
29492
29492
  if (existsSync(localSkillPath)) {
29493
29493
  foundPaths.push(localSkillPath);
29494
29494
  return { installed: true, location: "local", paths: foundPaths };
29495
29495
  }
29496
- const localCommandPath = join(workingDir, ".claude", "commands", "hmy.md");
29497
- if (existsSync(localCommandPath)) {
29498
- foundPaths.push(localCommandPath);
29496
+ const localSkillPathAlt = join(workingDir, ".claude", "skills", "hmy", "SKILL.md");
29497
+ if (existsSync(localSkillPathAlt)) {
29498
+ foundPaths.push(localSkillPathAlt);
29499
29499
  return { installed: true, location: "local", paths: foundPaths };
29500
29500
  }
29501
29501
  return { installed: false, location: null, paths: [] };
@@ -31864,8 +31864,9 @@ function getAgentFiles(agentId, cwd, installMode = "global") {
31864
31864
  const symlinks = [];
31865
31865
  switch (agentId) {
31866
31866
  case "claude": {
31867
- const commandContent = `---
31868
- description: Start working on a Harmony card (moves to In Progress, adds agent label)
31867
+ const skillContent = `---
31868
+ name: hmy
31869
+ description: Start working on a Harmony card. Use when given a card reference like #42, UUID, or card name to implement.
31869
31870
  argument-hint: <card-reference>
31870
31871
  ---
31871
31872
 
@@ -31873,18 +31874,18 @@ ${HARMONY_WORKFLOW_PROMPT.replace("Your agent identifier", "claude-code").replac
31873
31874
  `;
31874
31875
  if (installMode === "global") {
31875
31876
  files.push({
31876
- path: join3(GLOBAL_SKILLS_DIR, "claude", "hmy.md"),
31877
- content: commandContent,
31877
+ path: join3(GLOBAL_SKILLS_DIR, "hmy", "SKILL.md"),
31878
+ content: skillContent,
31878
31879
  type: "text"
31879
31880
  });
31880
31881
  symlinks.push({
31881
- target: join3(GLOBAL_SKILLS_DIR, "claude", "hmy.md"),
31882
- link: join3(home, ".claude", "commands", "hmy.md")
31882
+ target: join3(GLOBAL_SKILLS_DIR, "hmy"),
31883
+ link: join3(home, ".claude", "skills", "hmy")
31883
31884
  });
31884
31885
  } else {
31885
31886
  files.push({
31886
- path: join3(cwd, ".claude", "commands", "hmy.md"),
31887
- content: commandContent,
31887
+ path: join3(cwd, ".claude", "skills", "hmy", "SKILL.md"),
31888
+ content: skillContent,
31888
31889
  type: "text"
31889
31890
  });
31890
31891
  }
package/dist/index.js CHANGED
@@ -27241,24 +27241,24 @@ function areSkillsInstalled(cwd) {
27241
27241
  foundPaths.push(globalSkillPath);
27242
27242
  return { installed: true, location: "global", paths: foundPaths };
27243
27243
  }
27244
- const claudeGlobalCommand = join(home, ".claude", "commands", "hmy.md");
27245
- if (existsSync(claudeGlobalCommand)) {
27246
- foundPaths.push(claudeGlobalCommand);
27247
- return { installed: true, location: "global", paths: foundPaths };
27248
- }
27249
- const claudeGlobalSkill = join(home, ".claude", "skills", "hmy", "SKILL.md");
27244
+ const claudeGlobalSkill = join(home, ".claude", "skills", "hmy.md");
27250
27245
  if (existsSync(claudeGlobalSkill)) {
27251
27246
  foundPaths.push(claudeGlobalSkill);
27252
27247
  return { installed: true, location: "global", paths: foundPaths };
27253
27248
  }
27254
- const localSkillPath = join(workingDir, ".claude", "skills", "hmy", "SKILL.md");
27249
+ const claudeGlobalSkillAlt = join(home, ".claude", "skills", "hmy", "SKILL.md");
27250
+ if (existsSync(claudeGlobalSkillAlt)) {
27251
+ foundPaths.push(claudeGlobalSkillAlt);
27252
+ return { installed: true, location: "global", paths: foundPaths };
27253
+ }
27254
+ const localSkillPath = join(workingDir, ".claude", "skills", "hmy.md");
27255
27255
  if (existsSync(localSkillPath)) {
27256
27256
  foundPaths.push(localSkillPath);
27257
27257
  return { installed: true, location: "local", paths: foundPaths };
27258
27258
  }
27259
- const localCommandPath = join(workingDir, ".claude", "commands", "hmy.md");
27260
- if (existsSync(localCommandPath)) {
27261
- foundPaths.push(localCommandPath);
27259
+ const localSkillPathAlt = join(workingDir, ".claude", "skills", "hmy", "SKILL.md");
27260
+ if (existsSync(localSkillPathAlt)) {
27261
+ foundPaths.push(localSkillPathAlt);
27262
27262
  return { installed: true, location: "local", paths: foundPaths };
27263
27263
  }
27264
27264
  return { installed: false, location: null, paths: [] };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harmony-mcp",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "MCP server for Harmony Kanban board - enables AI coding agents to manage your boards",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",