@dugynoo/huly-mcp 0.13.0 → 0.14.0

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 (3) hide show
  1. package/README.md +257 -237
  2. package/dist/index.cjs +5586 -5029
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,180 +1,182 @@
1
- # @dugynoo/huly-mcp
2
-
3
- [![npm](https://img.shields.io/npm/v/@dugynoo/huly-mcp)](https://www.npmjs.com/package/@dugynoo/huly-mcp)
4
- [![npm downloads](https://img.shields.io/npm/dm/@dugynoo/huly-mcp)](https://www.npmjs.com/package/@dugynoo/huly-mcp)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
- [![MCP](https://img.shields.io/badge/MCP-compatible-blue)](https://modelcontextprotocol.io)
7
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
8
- [![MCP Server](https://badge.mcpx.dev?type=server&features=tools)](https://github.com/dugynoo/huly-mcp)
9
-
10
- MCP server for [Huly](https://huly.io/) integration.
11
-
12
- > **Fork notice.** This package is a fork of [`@firfi/huly-mcp`](https://github.com/dearlordylord/huly-mcp) maintained by **dugynoo / Effistream**. Compared to upstream it adds:
13
- >
14
- > - `taskType` parameter on `create_issue` / `update_issue` so issues can be created with custom task types (e.g. `Ticket`) and project-scoped statuses (status names like `Created`, `Awaiting approval`).
15
- > - **Process plugin** read-side tools: `list_processes`, `get_process`, `list_executions` (requires a Huly server with the Process plugin enabled, v0.7.382+).
16
- >
17
- > Credits to the upstream authors and contributors — see `LICENSE`.
18
-
19
- ## Installation
20
-
21
- The standard configuration works with most MCP clients:
22
-
23
- ```json
24
- {
25
- "mcpServers": {
26
- "huly": {
27
- "command": "npx",
28
- "args": ["-y", "@dugynoo/huly-mcp@latest"],
29
- "env": {
30
- "HULY_URL": "https://huly.app",
31
- "HULY_EMAIL": "your@email.com",
32
- "HULY_PASSWORD": "yourpassword",
33
- "HULY_WORKSPACE": "yourworkspace"
34
- }
35
- }
36
- }
37
- }
38
- ```
39
-
40
- <details>
41
- <summary>Claude Code</summary>
42
-
43
- ```bash
44
- claude mcp add huly \
45
- -e HULY_URL=https://huly.app \
46
- -e HULY_EMAIL=your@email.com \
47
- -e HULY_PASSWORD=yourpassword \
48
- -e HULY_WORKSPACE=yourworkspace \
49
- -- npx -y @dugynoo/huly-mcp@latest
50
- ```
51
-
52
- Or add to `~/.claude.json` using the standard config above.
53
-
54
- </details>
55
-
56
- <details>
57
- <summary>Claude Desktop</summary>
58
-
59
- Add the standard config to your `claude_desktop_config.json`:
60
-
61
- - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
62
- - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
63
-
64
- </details>
65
-
66
- <details>
67
- <summary>VS Code</summary>
68
-
69
- Add to your user settings (`.vscode/mcp.json`) or use Command Palette → "MCP: Add Server":
70
-
71
- ```json
72
- {
73
- "servers": {
74
- "huly": {
75
- "command": "npx",
76
- "args": ["-y", "@dugynoo/huly-mcp@latest"],
77
- "env": {
78
- "HULY_URL": "https://huly.app",
79
- "HULY_EMAIL": "your@email.com",
80
- "HULY_PASSWORD": "yourpassword",
81
- "HULY_WORKSPACE": "yourworkspace"
82
- }
83
- }
84
- }
85
- }
86
- ```
87
-
88
- </details>
89
-
90
- <details>
91
- <summary>Cursor</summary>
92
-
93
- Add the standard config to `~/.cursor/mcp.json`, or via Settings → Tools & Integrations → New MCP Server.
94
-
95
- </details>
96
-
97
- <details>
98
- <summary>Windsurf</summary>
99
-
100
- Add the standard config to your Windsurf MCP configuration file.
101
-
102
- </details>
103
-
104
- <details>
105
- <summary>OpenCode</summary>
106
-
107
- Open the global configuration file (`~/.config/opencode/opencode.json`) and add this config to the `mcp` section.
108
-
109
- ```json
110
- "huly": {
111
- "type": "local",
112
- "command": ["npx", "-y", "@dugynoo/huly-mcp@latest"],
113
- "environment": {
114
- "HULY_URL": "https://huly.app",
115
- "HULY_EMAIL": "your@email.com",
116
- "HULY_PASSWORD": "yourpassword",
117
- "HULY_WORKSPACE": "yourworkspace"
118
- }
119
- }
120
- ```
121
-
122
- </details>
123
-
124
- ## Updating
125
-
126
- The `@latest` tag in the install command always fetches the newest version. Most MCP clients cache the installed package, so you need to force a re-fetch:
127
-
128
- | Client | How to update |
129
- |--------|--------------|
130
- | **Claude Code** | `claude mcp remove huly` then re-add with the install command above |
131
- | **Claude Desktop** | Restart the app (it runs `npx` on startup) |
132
- | **VS Code / Cursor** | Restart the MCP server from the command palette or reload the window |
133
- | **npx (manual)** | `npx -y @dugynoo/huly-mcp@latest` — the `-y` flag skips the cache when `@latest` resolves to a new version |
134
-
135
- ## HTTP Transport
136
-
137
- By default, the server uses stdio transport. For HTTP transport (Streamable HTTP):
138
-
139
- ```bash
140
- HULY_URL=https://huly.app \
141
- HULY_EMAIL=your@email.com \
142
- HULY_PASSWORD=yourpassword \
143
- HULY_WORKSPACE=yourworkspace \
144
- MCP_TRANSPORT=http \
145
- npx -y @dugynoo/huly-mcp@latest
146
- ```
147
-
148
- Server listens on `http://127.0.0.1:3000/mcp` by default.
149
-
150
- Configure with `MCP_HTTP_PORT` and `MCP_HTTP_HOST`:
151
-
152
- ```bash
153
- MCP_TRANSPORT=http MCP_HTTP_PORT=8080 MCP_HTTP_HOST=0.0.0.0 npx -y @dugynoo/huly-mcp@latest
154
- ```
155
-
156
- ## Environment Variables
157
-
158
- | Variable | Required | Description |
159
- |----------|----------|-------------|
160
- | `HULY_URL` | Yes | Huly instance URL |
161
- | `HULY_EMAIL` | Auth* | Account email |
162
- | `HULY_PASSWORD` | Auth* | Account password |
163
- | `HULY_TOKEN` | Auth* | API token (alternative to email/password) |
164
- | `HULY_WORKSPACE` | Yes | Workspace identifier |
165
- | `HULY_CONNECTION_TIMEOUT` | No | Connection timeout in ms (default: 30000) |
166
- | `MCP_TRANSPORT` | No | Transport type: `stdio` (default) or `http` |
167
- | `MCP_HTTP_PORT` | No | HTTP server port (default: 3000) |
168
- | `MCP_HTTP_HOST` | No | HTTP server host (default: 127.0.0.1) |
169
- | `TOOLSETS` | No | Comma-separated tool categories to expose. If unset, all tools are exposed. Example: `issues,projects,search` |
170
-
171
- *Auth: Provide either `HULY_EMAIL` + `HULY_PASSWORD` or `HULY_TOKEN`.
172
-
1
+ # @dugynoo/huly-mcp
2
+
3
+ [![npm](https://img.shields.io/npm/v/@dugynoo/huly-mcp)](https://www.npmjs.com/package/@dugynoo/huly-mcp)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@dugynoo/huly-mcp)](https://www.npmjs.com/package/@dugynoo/huly-mcp)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![MCP](https://img.shields.io/badge/MCP-compatible-blue)](https://modelcontextprotocol.io)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
8
+ [![MCP Server](https://badge.mcpx.dev?type=server&features=tools)](https://github.com/dugynoo/huly-mcp)
9
+
10
+ MCP server for [Huly](https://huly.io/) integration — 209 tools across 23 categories (issues, projects, tasks, comments, documents, cards, channels, calendar, time tracking, test management, processes, custom fields, attachments, leads and more). Supports custom task types with project-scoped status workflows and read-side Process plugin tools.
11
+
12
+ ## Installation
13
+
14
+ The standard configuration works with most MCP clients:
15
+
16
+ ```json
17
+ {
18
+ "mcpServers": {
19
+ "huly": {
20
+ "command": "npx",
21
+ "args": ["-y", "@dugynoo/huly-mcp@latest"],
22
+ "env": {
23
+ "HULY_URL": "https://huly.app",
24
+ "HULY_EMAIL": "your@email.com",
25
+ "HULY_PASSWORD": "yourpassword",
26
+ "HULY_WORKSPACE": "yourworkspace"
27
+ }
28
+ }
29
+ }
30
+ }
31
+ ```
32
+
33
+ <details>
34
+ <summary>Claude Code</summary>
35
+
36
+ ```bash
37
+ claude mcp add huly \
38
+ -e HULY_URL=https://huly.app \
39
+ -e HULY_EMAIL=your@email.com \
40
+ -e HULY_PASSWORD=yourpassword \
41
+ -e HULY_WORKSPACE=yourworkspace \
42
+ -- npx -y @dugynoo/huly-mcp@latest
43
+ ```
44
+
45
+ Or add to `~/.claude.json` using the standard config above.
46
+
47
+ </details>
48
+
49
+ <details>
50
+ <summary>Claude Desktop</summary>
51
+
52
+ Add the standard config to your `claude_desktop_config.json`:
53
+
54
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
55
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
56
+
57
+ </details>
58
+
59
+ <details>
60
+ <summary>VS Code</summary>
61
+
62
+ Add to your user settings (`.vscode/mcp.json`) or use Command Palette → "MCP: Add Server":
63
+
64
+ ```json
65
+ {
66
+ "servers": {
67
+ "huly": {
68
+ "command": "npx",
69
+ "args": ["-y", "@dugynoo/huly-mcp@latest"],
70
+ "env": {
71
+ "HULY_URL": "https://huly.app",
72
+ "HULY_EMAIL": "your@email.com",
73
+ "HULY_PASSWORD": "yourpassword",
74
+ "HULY_WORKSPACE": "yourworkspace"
75
+ }
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ </details>
82
+
83
+ <details>
84
+ <summary>Cursor</summary>
85
+
86
+ Add the standard config to `~/.cursor/mcp.json`, or via Settings → Tools & Integrations → New MCP Server.
87
+
88
+ </details>
89
+
90
+ <details>
91
+ <summary>Windsurf</summary>
92
+
93
+ Add the standard config to your Windsurf MCP configuration file.
94
+
95
+ </details>
96
+
97
+ <details>
98
+ <summary>OpenCode</summary>
99
+
100
+ Open the global configuration file (`~/.config/opencode/opencode.json`) and add this config to the `mcp` section.
101
+
102
+ ```json
103
+ "huly": {
104
+ "type": "local",
105
+ "command": ["npx", "-y", "@dugynoo/huly-mcp@latest"],
106
+ "environment": {
107
+ "HULY_URL": "https://huly.app",
108
+ "HULY_EMAIL": "your@email.com",
109
+ "HULY_PASSWORD": "yourpassword",
110
+ "HULY_WORKSPACE": "yourworkspace"
111
+ }
112
+ }
113
+ ```
114
+
115
+ </details>
116
+
117
+ ## Updating
118
+
119
+ The `@latest` tag in the install command always fetches the newest version. Most MCP clients cache the installed package, so you need to force a re-fetch:
120
+
121
+ | Client | How to update |
122
+ |--------|--------------|
123
+ | **Claude Code** | `claude mcp remove huly` then re-add with the install command above |
124
+ | **Claude Desktop** | Restart the app (it runs `npx` on startup) |
125
+ | **VS Code / Cursor** | Restart the MCP server from the command palette or reload the window |
126
+ | **npx (manual)** | `npx -y @dugynoo/huly-mcp@latest` the `-y` flag skips the cache when `@latest` resolves to a new version |
127
+
128
+ ## HTTP Transport
129
+
130
+ By default, the server uses stdio transport. For HTTP transport (Streamable HTTP):
131
+
132
+ ```bash
133
+ HULY_URL=https://huly.app \
134
+ HULY_EMAIL=your@email.com \
135
+ HULY_PASSWORD=yourpassword \
136
+ HULY_WORKSPACE=yourworkspace \
137
+ MCP_TRANSPORT=http \
138
+ npx -y @dugynoo/huly-mcp@latest
139
+ ```
140
+
141
+ Server listens on `http://127.0.0.1:3000/mcp` by default.
142
+
143
+ Configure with `MCP_HTTP_PORT` and `MCP_HTTP_HOST`:
144
+
145
+ ```bash
146
+ MCP_TRANSPORT=http MCP_HTTP_PORT=8080 MCP_HTTP_HOST=0.0.0.0 npx -y @dugynoo/huly-mcp@latest
147
+ ```
148
+
149
+ ## Environment Variables
150
+
151
+ | Variable | Required | Description |
152
+ |----------|----------|-------------|
153
+ | `HULY_URL` | Yes | Huly instance URL |
154
+ | `HULY_EMAIL` | Auth* | Account email |
155
+ | `HULY_PASSWORD` | Auth* | Account password |
156
+ | `HULY_TOKEN` | Auth* | API token (alternative to email/password) |
157
+ | `HULY_WORKSPACE` | Yes | Workspace identifier |
158
+ | `HULY_CONNECTION_TIMEOUT` | No | Connection timeout in ms (default: 30000) |
159
+ | `MCP_TRANSPORT` | No | Transport type: `stdio` (default) or `http` |
160
+ | `MCP_HTTP_PORT` | No | HTTP server port (default: 3000) |
161
+ | `MCP_HTTP_HOST` | No | HTTP server host (default: 127.0.0.1) |
162
+ | `TOOLSETS` | No | Comma-separated tool categories to expose. If unset, all tools are exposed. Example: `issues,projects,search` |
163
+
164
+ *Auth: Provide either `HULY_EMAIL` + `HULY_PASSWORD` or `HULY_TOKEN`.
165
+
166
+ ## Differences from `@firfi/huly-mcp`
167
+
168
+ This package is a downstream of [`@firfi/huly-mcp`](https://github.com/dearlordylord/huly-mcp) with two additions:
169
+
170
+ - **`taskType` parameter on `create_issue` and `update_issue`** so issues can be created with custom task types (e.g. `Ticket`, `Bug`, `Feature`) and project-scoped status workflows (`Created`, `Awaiting approval`, etc.). Without this, issues created via MCP fall back to the default task type even when the project defines its own.
171
+ - **Read-side Process plugin tools**: `list_processes`, `get_process`, `list_executions`. Requires a Huly server with the Process plugin enabled (v0.7.382+).
172
+
173
+ Original upstream copyright is preserved in [`LICENSE`](./LICENSE).
174
+
173
175
  <!-- tools:start -->
174
176
  <!-- AUTO-GENERATED from src/mcp/tools/ descriptions. Do not edit manually. Run `pnpm update-readme` to regenerate. -->
175
177
  ## Available Tools
176
178
 
177
- **`TOOLSETS` categories:** `projects`, `issues`, `comments`, `milestones`, `documents`, `storage`, `attachments`, `contacts`, `channels`, `calendar`, `time tracking`, `search`, `activity`, `notifications`, `workspace`, `cards`, `custom-fields`, `labels`, `leads`, `processes`, `tag-categories`, `task-management`, `test-management`
179
+ **`TOOLSETS` categories:** `projects`, `issues`, `comments`, `milestones`, `documents`, `storage`, `attachments`, `contacts`, `channels`, `calendar`, `time tracking`, `search`, `activity`, `notifications`, `workspace`, `associations`, `cards`, `custom-fields`, `labels`, `leads`, `processes`, `tag-categories`, `task-management`, `test-management`, `user-statuses`
178
180
 
179
181
  ### Projects
180
182
 
@@ -402,6 +404,16 @@ MCP_TRANSPORT=http MCP_HTTP_PORT=8080 MCP_HTTP_HOST=0.0.0.0 npx -y @dugynoo/huly
402
404
  | `create_access_link` | Create a Huly workspace access link. Defaults to role GUEST. Supports anonymous reusable guest links by setting personalized=false with notBefore and expiration, and can restrict access to specific Huly space IDs via spaces. |
403
405
  | `get_regions` | Get available regions for workspace creation. Returns region codes and display names. |
404
406
 
407
+ ### Associations
408
+
409
+ | Tool | Description |
410
+ |------|-------------|
411
+ | `list_associations` | List Huly Association definitions in the workspace. Each Association is a typed link between two document classes (e.g. Person ↔ Organization with cardinality 1:1 / 1:N / N:N). Filter by `classA` or `classB`. |
412
+ | `create_association` | Create a new Huly Association between two document classes. Idempotent: returns existing association if one already exists with the same (classA, classB, nameA, nameB) tuple. |
413
+ | `list_relations` | List Huly Relations — concrete links between documents. Filter by `association` (ID), `docA` (source document ID), or `docB` (target document ID). |
414
+ | `create_relation` | Link two documents through an existing Association. Idempotent: returns existing relation if one already connects (docA, docB) via the same association. |
415
+ | `delete_relation` | Remove a Relation between two documents. Idempotent: returns deleted=false if the relation no longer exists. |
416
+
405
417
  ### Cards
406
418
 
407
419
  | Tool | Description |
@@ -446,6 +458,8 @@ MCP_TRANSPORT=http MCP_HTTP_PORT=8080 MCP_HTTP_HOST=0.0.0.0 npx -y @dugynoo/huly
446
458
  | `list_processes` | List Huly Process definitions in the workspace. Each Process is a workflow attached to a card class (master tag). Optionally filter by `masterTag` to find processes for a specific card type. Read-only. |
447
459
  | `get_process` | Fetch a single Huly Process definition by ID or display name. Returns name, description, master tag, and start/automation flags. Read-only. |
448
460
  | `list_executions` | List Process Executions — live or completed workflow runs against specific cards. Filter by `process` (ID or name), `card` (card ID), or `status` (active/done/cancelled). Each execution row includes the current workflow state and an error flag. Read-only. |
461
+ | `start_process` | Start a new Process execution against a card. Resolves the process by ID or display name and creates an active Execution at the first workflow state (lowest rank). The Huly server's process engine then auto-fires OnExecutionStart triggers to advance the execution. |
462
+ | `cancel_execution` | Cancel an in-flight Process execution by setting its status to 'cancelled'. Idempotent — already-cancelled executions return cancelled=false. |
449
463
 
450
464
  ### Tag-Categories
451
465
 
@@ -500,68 +514,74 @@ MCP_TRANSPORT=http MCP_HTTP_PORT=8080 MCP_HTTP_HOST=0.0.0.0 npx -y @dugynoo/huly
500
514
  | `delete_test_result` | Permanently delete a test result. Cannot be undone. |
501
515
  | `run_test_plan` | Execute a test plan: creates a test run and one test result per plan item. Returns the run ID and count of results created. Optionally name the run and set a due date. |
502
516
 
503
- <!-- tools:end -->
517
+ ### User-Statuses
504
518
 
505
- ## Troubleshooting
506
-
507
- ### Passwords with special characters
508
-
509
- If your Huly password contains characters like `*`, `%`, `!`, or `#`, passing it via the CLI `-e` flag may fail because the shell interprets these characters before they reach the process.
510
-
511
- **Solution**: Edit your MCP config file directly instead of using `claude mcp add -e`. In `~/.claude.json` (user scope) or `.mcp.json` (project scope), JSON handles all special characters natively:
512
-
513
- ```json
514
- {
515
- "mcpServers": {
516
- "huly": {
517
- "type": "stdio",
518
- "command": "node",
519
- "args": ["path/to/dist/index.cjs"],
520
- "env": {
521
- "HULY_URL": "https://your-huly-instance.com",
522
- "HULY_EMAIL": "you@example.com",
523
- "HULY_PASSWORD": "p@ss*w0rd!#%",
524
- "HULY_WORKSPACE": "your-workspace"
525
- }
526
- }
527
- }
528
- }
529
- ```
530
-
531
- Alternatively, use `HULY_TOKEN` instead of email/password to bypass password auth entirely (see [Environment Variables](#environment-variables)).
532
-
533
- ### MCP client shows "Failed to reconnect"
534
-
535
- After changing MCP configuration, some clients (including Claude Code) require a full restart — not just a reconnect. Exit the application completely and reopen it.
536
-
537
- You can verify the connection works independently with:
538
- ```bash
539
- claude mcp list # Should show "Connected"
540
- ```
541
-
542
- ### Self-hosted Huly: account locked after failed login attempts
543
-
544
- Huly locks password login after 5 failed API authentication attempts. This commonly happens during initial setup when the password is misconfigured. The lock persists in the database across service restarts.
545
-
546
- **Symptoms**: `PasswordLoginLocked` error from the MCP server, and the Huly web UI shows "Password login is locked due to too many failed attempts. Please use an OTP login method to unlock your account." (OTP won't work without SMTP configured.)
547
-
548
- **Fix** reset the lock counter in CockroachDB:
549
-
550
- ```bash
551
- # Find your account UUID and check lock status
552
- docker exec -e PGPASSWORD=<your_cockroach_password> <cockroach_container> \
553
- cockroach sql --host=localhost --user=<db_user> --database=defaultdb --insecure \
554
- -e "SELECT uuid, failed_login_attempts FROM global_account.account;"
555
-
556
- # Reset the counter
557
- docker exec -e PGPASSWORD=<your_cockroach_password> <cockroach_container> \
558
- cockroach sql --host=localhost --user=<db_user> --database=defaultdb --insecure \
559
- -e "UPDATE global_account.account SET failed_login_attempts = 0 WHERE uuid = '<your_account_uuid>';"
560
- ```
561
-
562
- The CockroachDB credentials can be found in your Huly `compose.yml` or via `docker exec <cockroach_container> env | grep COCKROACH`.
563
-
564
- ### Windows-specific notes
565
-
566
- - **Bash wrapper scripts** (sourcing `.env` files) may not work reliably when launched by MCP clients on Windows. Prefer setting env vars directly in the MCP config JSON.
567
- - **Docker pulls over SSH** may fail on Windows due to credential manager issues. Pull images from the server desktop if needed.
519
+ | Tool | Description |
520
+ |------|-------------|
521
+ | `list_user_statuses` | List Huly user presence records — who is currently online, with their account UUID and last status change timestamp. Filter by `online` (true/false) or `user` (account UUID). Read-only; presence is maintained server-side based on websocket connection state. |
522
+
523
+ <!-- tools:end -->
524
+
525
+ ## Troubleshooting
526
+
527
+ ### Passwords with special characters
528
+
529
+ If your Huly password contains characters like `*`, `%`, `!`, or `#`, passing it via the CLI `-e` flag may fail because the shell interprets these characters before they reach the process.
530
+
531
+ **Solution**: Edit your MCP config file directly instead of using `claude mcp add -e`. In `~/.claude.json` (user scope) or `.mcp.json` (project scope), JSON handles all special characters natively:
532
+
533
+ ```json
534
+ {
535
+ "mcpServers": {
536
+ "huly": {
537
+ "type": "stdio",
538
+ "command": "node",
539
+ "args": ["path/to/dist/index.cjs"],
540
+ "env": {
541
+ "HULY_URL": "https://your-huly-instance.com",
542
+ "HULY_EMAIL": "you@example.com",
543
+ "HULY_PASSWORD": "p@ss*w0rd!#%",
544
+ "HULY_WORKSPACE": "your-workspace"
545
+ }
546
+ }
547
+ }
548
+ }
549
+ ```
550
+
551
+ Alternatively, use `HULY_TOKEN` instead of email/password to bypass password auth entirely (see [Environment Variables](#environment-variables)).
552
+
553
+ ### MCP client shows "Failed to reconnect"
554
+
555
+ After changing MCP configuration, some clients (including Claude Code) require a full restart — not just a reconnect. Exit the application completely and reopen it.
556
+
557
+ You can verify the connection works independently with:
558
+ ```bash
559
+ claude mcp list # Should show "Connected"
560
+ ```
561
+
562
+ ### Self-hosted Huly: account locked after failed login attempts
563
+
564
+ Huly locks password login after 5 failed API authentication attempts. This commonly happens during initial setup when the password is misconfigured. The lock persists in the database across service restarts.
565
+
566
+ **Symptoms**: `PasswordLoginLocked` error from the MCP server, and the Huly web UI shows "Password login is locked due to too many failed attempts. Please use an OTP login method to unlock your account." (OTP won't work without SMTP configured.)
567
+
568
+ **Fix** reset the lock counter in CockroachDB:
569
+
570
+ ```bash
571
+ # Find your account UUID and check lock status
572
+ docker exec -e PGPASSWORD=<your_cockroach_password> <cockroach_container> \
573
+ cockroach sql --host=localhost --user=<db_user> --database=defaultdb --insecure \
574
+ -e "SELECT uuid, failed_login_attempts FROM global_account.account;"
575
+
576
+ # Reset the counter
577
+ docker exec -e PGPASSWORD=<your_cockroach_password> <cockroach_container> \
578
+ cockroach sql --host=localhost --user=<db_user> --database=defaultdb --insecure \
579
+ -e "UPDATE global_account.account SET failed_login_attempts = 0 WHERE uuid = '<your_account_uuid>';"
580
+ ```
581
+
582
+ The CockroachDB credentials can be found in your Huly `compose.yml` or via `docker exec <cockroach_container> env | grep COCKROACH`.
583
+
584
+ ### Windows-specific notes
585
+
586
+ - **Bash wrapper scripts** (sourcing `.env` files) may not work reliably when launched by MCP clients on Windows. Prefer setting env vars directly in the MCP config JSON.
587
+ - **Docker pulls over SSH** may fail on Windows due to credential manager issues. Pull images from the server desktop if needed.