huly-mcp-selfhost 3.3.0 → 3.5.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 (217) hide show
  1. package/.env.example +11 -0
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +126 -17
  4. package/dist/guides/costs.md +2 -1
  5. package/dist/guides/workflow.md +3 -1
  6. package/dist/index.js +105034 -46
  7. package/dist/setup.js +4 -0
  8. package/package.json +12 -11
  9. package/dist/connection.d.ts +0 -78
  10. package/dist/connection.js +0 -271
  11. package/dist/connection.js.map +0 -1
  12. package/dist/env.d.ts +0 -1
  13. package/dist/env.js +0 -17
  14. package/dist/env.js.map +0 -1
  15. package/dist/guard.d.ts +0 -39
  16. package/dist/guard.js +0 -165
  17. package/dist/guard.js.map +0 -1
  18. package/dist/index.d.ts +0 -2
  19. package/dist/index.js.map +0 -1
  20. package/dist/junit-cli.d.ts +0 -8
  21. package/dist/junit-cli.js +0 -106
  22. package/dist/junit-cli.js.map +0 -1
  23. package/dist/registry.d.ts +0 -18
  24. package/dist/registry.js +0 -318
  25. package/dist/registry.js.map +0 -1
  26. package/dist/resources.d.ts +0 -19
  27. package/dist/resources.js +0 -255
  28. package/dist/resources.js.map +0 -1
  29. package/dist/schemas.d.ts +0 -1559
  30. package/dist/schemas.js +0 -1086
  31. package/dist/schemas.js.map +0 -1
  32. package/dist/server.d.ts +0 -29
  33. package/dist/server.js +0 -215
  34. package/dist/server.js.map +0 -1
  35. package/dist/tools/activity.d.ts +0 -10
  36. package/dist/tools/activity.js +0 -62
  37. package/dist/tools/activity.js.map +0 -1
  38. package/dist/tools/agent.d.ts +0 -156
  39. package/dist/tools/agent.js +0 -523
  40. package/dist/tools/agent.js.map +0 -1
  41. package/dist/tools/attachments.d.ts +0 -31
  42. package/dist/tools/attachments.js +0 -61
  43. package/dist/tools/attachments.js.map +0 -1
  44. package/dist/tools/calendar.d.ts +0 -49
  45. package/dist/tools/calendar.js +0 -116
  46. package/dist/tools/calendar.js.map +0 -1
  47. package/dist/tools/cards.d.ts +0 -87
  48. package/dist/tools/cards.js +0 -246
  49. package/dist/tools/cards.js.map +0 -1
  50. package/dist/tools/channels.d.ts +0 -118
  51. package/dist/tools/channels.js +0 -211
  52. package/dist/tools/channels.js.map +0 -1
  53. package/dist/tools/comments.d.ts +0 -42
  54. package/dist/tools/comments.js +0 -77
  55. package/dist/tools/comments.js.map +0 -1
  56. package/dist/tools/components.d.ts +0 -45
  57. package/dist/tools/components.js +0 -107
  58. package/dist/tools/components.js.map +0 -1
  59. package/dist/tools/contacts.d.ts +0 -69
  60. package/dist/tools/contacts.js +0 -130
  61. package/dist/tools/contacts.js.map +0 -1
  62. package/dist/tools/crm.d.ts +0 -61
  63. package/dist/tools/crm.js +0 -117
  64. package/dist/tools/crm.js.map +0 -1
  65. package/dist/tools/documents.d.ts +0 -100
  66. package/dist/tools/documents.js +0 -294
  67. package/dist/tools/documents.js.map +0 -1
  68. package/dist/tools/drive.d.ts +0 -107
  69. package/dist/tools/drive.js +0 -277
  70. package/dist/tools/drive.js.map +0 -1
  71. package/dist/tools/fields.d.ts +0 -33
  72. package/dist/tools/fields.js +0 -124
  73. package/dist/tools/fields.js.map +0 -1
  74. package/dist/tools/generic.d.ts +0 -72
  75. package/dist/tools/generic.js +0 -242
  76. package/dist/tools/generic.js.map +0 -1
  77. package/dist/tools/github.d.ts +0 -21
  78. package/dist/tools/github.js +0 -80
  79. package/dist/tools/github.js.map +0 -1
  80. package/dist/tools/hr.d.ts +0 -97
  81. package/dist/tools/hr.js +0 -150
  82. package/dist/tools/hr.js.map +0 -1
  83. package/dist/tools/inbox.d.ts +0 -23
  84. package/dist/tools/inbox.js +0 -76
  85. package/dist/tools/inbox.js.map +0 -1
  86. package/dist/tools/inventory.d.ts +0 -61
  87. package/dist/tools/inventory.js +0 -103
  88. package/dist/tools/inventory.js.map +0 -1
  89. package/dist/tools/issues.d.ts +0 -112
  90. package/dist/tools/issues.js +0 -474
  91. package/dist/tools/issues.js.map +0 -1
  92. package/dist/tools/labels.d.ts +0 -87
  93. package/dist/tools/labels.js +0 -232
  94. package/dist/tools/labels.js.map +0 -1
  95. package/dist/tools/log-time.d.ts +0 -25
  96. package/dist/tools/log-time.js +0 -95
  97. package/dist/tools/log-time.js.map +0 -1
  98. package/dist/tools/meetings.d.ts +0 -30
  99. package/dist/tools/meetings.js +0 -78
  100. package/dist/tools/meetings.js.map +0 -1
  101. package/dist/tools/members.d.ts +0 -8
  102. package/dist/tools/members.js +0 -33
  103. package/dist/tools/members.js.map +0 -1
  104. package/dist/tools/message-templates.d.ts +0 -54
  105. package/dist/tools/message-templates.js +0 -88
  106. package/dist/tools/message-templates.js.map +0 -1
  107. package/dist/tools/milestones.d.ts +0 -56
  108. package/dist/tools/milestones.js +0 -172
  109. package/dist/tools/milestones.js.map +0 -1
  110. package/dist/tools/organizations.d.ts +0 -37
  111. package/dist/tools/organizations.js +0 -88
  112. package/dist/tools/organizations.js.map +0 -1
  113. package/dist/tools/overview.d.ts +0 -55
  114. package/dist/tools/overview.js +0 -395
  115. package/dist/tools/overview.js.map +0 -1
  116. package/dist/tools/planner.d.ts +0 -60
  117. package/dist/tools/planner.js +0 -145
  118. package/dist/tools/planner.js.map +0 -1
  119. package/dist/tools/process.d.ts +0 -50
  120. package/dist/tools/process.js +0 -137
  121. package/dist/tools/process.js.map +0 -1
  122. package/dist/tools/products.d.ts +0 -17
  123. package/dist/tools/products.js +0 -45
  124. package/dist/tools/products.js.map +0 -1
  125. package/dist/tools/projects.d.ts +0 -41
  126. package/dist/tools/projects.js +0 -93
  127. package/dist/tools/projects.js.map +0 -1
  128. package/dist/tools/qms.d.ts +0 -57
  129. package/dist/tools/qms.js +0 -171
  130. package/dist/tools/qms.js.map +0 -1
  131. package/dist/tools/recruiting.d.ts +0 -112
  132. package/dist/tools/recruiting.js +0 -203
  133. package/dist/tools/recruiting.js.map +0 -1
  134. package/dist/tools/relations.d.ts +0 -72
  135. package/dist/tools/relations.js +0 -192
  136. package/dist/tools/relations.js.map +0 -1
  137. package/dist/tools/search.d.ts +0 -23
  138. package/dist/tools/search.js +0 -60
  139. package/dist/tools/search.js.map +0 -1
  140. package/dist/tools/sharing.d.ts +0 -62
  141. package/dist/tools/sharing.js +0 -149
  142. package/dist/tools/sharing.js.map +0 -1
  143. package/dist/tools/statuses.d.ts +0 -19
  144. package/dist/tools/statuses.js +0 -93
  145. package/dist/tools/statuses.js.map +0 -1
  146. package/dist/tools/surveys.d.ts +0 -22
  147. package/dist/tools/surveys.js +0 -53
  148. package/dist/tools/surveys.js.map +0 -1
  149. package/dist/tools/templates.d.ts +0 -95
  150. package/dist/tools/templates.js +0 -260
  151. package/dist/tools/templates.js.map +0 -1
  152. package/dist/tools/test-automation.d.ts +0 -81
  153. package/dist/tools/test-automation.js +0 -225
  154. package/dist/tools/test-automation.js.map +0 -1
  155. package/dist/tools/testing.d.ts +0 -234
  156. package/dist/tools/testing.js +0 -401
  157. package/dist/tools/testing.js.map +0 -1
  158. package/dist/tools/workspace-admin.d.ts +0 -55
  159. package/dist/tools/workspace-admin.js +0 -117
  160. package/dist/tools/workspace-admin.js.map +0 -1
  161. package/dist/tools/workspaces.d.ts +0 -6
  162. package/dist/tools/workspaces.js +0 -19
  163. package/dist/tools/workspaces.js.map +0 -1
  164. package/dist/utils/attributes.d.ts +0 -37
  165. package/dist/utils/attributes.js +0 -188
  166. package/dist/utils/attributes.js.map +0 -1
  167. package/dist/utils/classes.d.ts +0 -51
  168. package/dist/utils/classes.js +0 -73
  169. package/dist/utils/classes.js.map +0 -1
  170. package/dist/utils/content.d.ts +0 -11
  171. package/dist/utils/content.js +0 -86
  172. package/dist/utils/content.js.map +0 -1
  173. package/dist/utils/errors.d.ts +0 -11
  174. package/dist/utils/errors.js +0 -24
  175. package/dist/utils/errors.js.map +0 -1
  176. package/dist/utils/files.d.ts +0 -5
  177. package/dist/utils/files.js +0 -50
  178. package/dist/utils/files.js.map +0 -1
  179. package/dist/utils/format.d.ts +0 -8
  180. package/dist/utils/format.js +0 -57
  181. package/dist/utils/format.js.map +0 -1
  182. package/dist/utils/junit.d.ts +0 -13
  183. package/dist/utils/junit.js +0 -81
  184. package/dist/utils/junit.js.map +0 -1
  185. package/dist/utils/markdown.d.ts +0 -14
  186. package/dist/utils/markdown.js +0 -149
  187. package/dist/utils/markdown.js.map +0 -1
  188. package/dist/utils/meeting.d.ts +0 -13
  189. package/dist/utils/meeting.js +0 -118
  190. package/dist/utils/meeting.js.map +0 -1
  191. package/dist/utils/people.d.ts +0 -25
  192. package/dist/utils/people.js +0 -80
  193. package/dist/utils/people.js.map +0 -1
  194. package/dist/utils/redact.d.ts +0 -3
  195. package/dist/utils/redact.js +0 -26
  196. package/dist/utils/redact.js.map +0 -1
  197. package/dist/utils/resolve.d.ts +0 -17
  198. package/dist/utils/resolve.js +0 -54
  199. package/dist/utils/resolve.js.map +0 -1
  200. package/dist/utils/spec.d.ts +0 -10
  201. package/dist/utils/spec.js +0 -90
  202. package/dist/utils/spec.js.map +0 -1
  203. package/dist/utils/storage.d.ts +0 -7
  204. package/dist/utils/storage.js +0 -86
  205. package/dist/utils/storage.js.map +0 -1
  206. package/dist/utils/tasks.d.ts +0 -22
  207. package/dist/utils/tasks.js +0 -81
  208. package/dist/utils/tasks.js.map +0 -1
  209. package/dist/watch.d.ts +0 -62
  210. package/dist/watch.js +0 -405
  211. package/dist/watch.js.map +0 -1
  212. package/scripts/cleanup-issues.js +0 -141
  213. package/scripts/copy-guides.js +0 -18
  214. package/scripts/demo.js +0 -201
  215. package/scripts/import-csv.js +0 -250
  216. package/scripts/sample-tasks.csv +0 -11
  217. package/scripts/setup.js +0 -163
package/.env.example CHANGED
@@ -27,6 +27,14 @@ HULY_PASSWORD=your-password
27
27
  # Host names clients use to reach the container (reverse proxy / public name),
28
28
  # comma-separated. Without it only localhost is accepted (421 "Invalid Host header").
29
29
  # MCP_ALLOWED_HOSTS=huly-mcp.example.com,huly-mcp.example.com:443
30
+ # Docker: the server's own HTTP endpoint (/mcp) instead of mcp-proxy — persistent sessions,
31
+ # one Huly login per person via X-Huly-Token or X-Huly-Email/X-Huly-Password headers.
32
+ # MCP_TRANSPORT=http
33
+ # Bearer token clients must send; required to use the HULY_* login above over HTTP.
34
+ # MCP_AUTH_TOKEN=
35
+ # "Log in with Huly" (OAuth): people add <MCP_PUBLIC_URL>/mcp in their AI app and log in in the browser.
36
+ # MCP_OAUTH_SECRET= # openssl rand -hex 32
37
+ # MCP_PUBLIC_URL=https://huly-mcp.example.com
30
38
 
31
39
  # ─── Single workspace (optional) ─────────────────────────────────────────────
32
40
  # Pin this server to one workspace (slug, name or id). Tools then take no
@@ -46,6 +54,9 @@ HULY_PASSWORD=your-password
46
54
  # Tool annotations (title, read-only / destructive) for clients that use them; ~16% larger tool list.
47
55
  # HULY_ANNOTATIONS=1
48
56
 
57
+ # Connect at start-up so the first call is fast (default on); 0 = connect on the first call.
58
+ # HULY_PREWARM=0
59
+
49
60
  # ─── Guard rails for agents (optional) ───────────────────────────────────────
50
61
  # Only allow changes in these projects (reads are never blocked):
51
62
  # HULY_WRITE_PROJECTS=TSK,WEB
package/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to [huly-mcp-selfhost](https://www.npmjs.com/package/huly-mcp-selfhost). Versions follow [semver](https://semver.org).
4
4
 
5
+ ### 3.5.0 — 2026-11-11
6
+
7
+ - **Fixed: MCP registry name** — the registry namespace is case-sensitive and must match the GitHub owner: `io.github.JoKeks2023/huly-mcp-selfhost` (was lowercase, refused with 403). A test checks it.
8
+ - **Fixed: `check_setup` in HTTP/OAuth sessions** reported "No credentials" — it read the server's environment instead of the session's own login. Found while testing OAuth from Claude Code.
9
+ - **Install size: 126 MB → 4.3 MB.** The package is now one bundled, readable file (`dist/index.js`, esbuild, not minified) with no runtime dependencies — the first `npx huly-mcp-selfhost` downloads 900 kB instead of ~180 packages. Verified from a clean install of the packed tarball: MCP over stdio, CLI, reads (issues, documents via the front service, reports, search, inbox, drive), writes with undo, HTTP with header login and OAuth. `huly-mcp-setup` still works (now a small wrapper for `huly-mcp setup`).
10
+ - **Fixed: `create_issue_tree` dropped the epic's component, milestone and status** — the epic only took title, description, priority and labels; anything else was silently ignored (and the dry run did not show it). The epic now takes `componentLabel`, `milestoneLabel`, `assignee` and `statusName` (children get `statusName` too), the top-level `componentLabel`/`milestoneLabel` defaults apply to the epic as well, and the dry run lists them.
11
+ - **Fixed: unknown fields in nested objects are rejected instead of dropped** — in `create_issue_tree`, issue templates, test cases, persons, inventory variants and generic writes. A test keeps every tool that way.
12
+ - **New: log in with Huly (OAuth)** — with `MCP_OAUTH_SECRET` and `MCP_PUBLIC_URL`, the HTTP server is an OAuth 2.1 server: people add `…/mcp` in Claude Code, Claude's custom connectors or another OAuth-capable client and log in in the browser with their own Huly account (password, or a one-time e-mail code for Google/GitHub accounts). Stateless (AES-256-GCM sealed registrations, codes and tokens — no database, survives restarts); the password is never stored; 1-hour access tokens, rotating 30-day refresh tokens, login throttling, PKCE and client registration from the MCP SDK. Verified live against a self-hosted Huly, including Claude Code's own OAuth flow (client registration, browser login, tools as that person).
13
+ - **New: `undo_changes`** — undo your last changes made through this server, newest first: created objects are removed, changed fields get their old values, deleted objects come back with the same id and data (verified live: an issue deleted and restored with its description). Dry run by default; an object someone else changed since is skipped and named (`force` overrides). Works for every write tool without per-tool code — writes are recorded as their reverse while a tool runs; issue counters are never wound back. History per process (stdio) or per session (HTTP), last 50 changes.
14
+ - **New: command line for every tool** — `huly-mcp <tool> --param value` (or `npx huly-mcp-selfhost …`): `tools` to search, `help <tool>` with types, allowed values and defaults generated from the same schemas the MCP server uses; values read by type, lists by repeating a flag, JSON for nested values, `--input`/`--json`, `--<param>-file`; a positional value for tools with one required parameter; the same write scope, audit log and confirmation (hard-to-undo tools ask in a terminal, scripts need `--yes`); `--format json`; exit codes 0/1/2 with "did you mean" hints; bash/zsh completion for tools, options and values. Verified live (read, JSON output, create with a description from a file, guarded delete).
15
+
16
+ ### 3.4.0 — 2026-11-11
17
+
18
+ - **New: team server over HTTP** — `huly-mcp-selfhost http` (Docker: `MCP_TRANSPORT=http`) serves MCP at `/mcp` with persistent sessions instead of a proxy. Every client can bring its own Huly login (`X-Huly-Token` or `X-Huly-Email`/`X-Huly-Password`, optional `X-Huly-Workspace`), so one server works for a whole team and each person acts as themselves. The server's own login is only used behind `MCP_AUTH_TOKEN`. Measured: first call of a session ~0.2 s.
19
+ - **New: `check_setup`** — one call that diagnoses the setup: version and newer releases, login (incl. API-token expiry), workspaces, front URL, active settings; never prints secrets.
20
+ - **New: `manage_notifications`** — for one object: pin/unpin, hide/unhide, mark unread, unarchive, follow/unfollow. Verified live.
21
+ - **Huly API tokens** (Settings → API tokens) work as `HULY_TOKEN`: the server stays in the token's workspace, checks the expiry before connecting and explains expired or revoked tokens. Built from Huly's source; not yet tested against a live server that issues such tokens.
22
+ - **`list_issues`: two new filters** — `title` (title contains text, case-insensitive) and `due` (`overdue`, `set`, `none`). Both run as one query on the server and combine with all other filters. Verified live on a self-hosted instance.
23
+ - **Faster first call:** the server logs in and opens the workspace (when there is only one, e.g. pinned with `HULY_WORKSPACE`) in the background right after start-up. Measured on a self-hosted instance: first `list_issues` 4.4 s → 0.17 s; start-up itself unchanged. `HULY_PREWARM=0` turns it off; a failed login is reported by the first real call as before.
24
+ - **Fixed: MCP registry entry.** The `server.json` description was longer than the registry's 100 characters, so 3.3.0 was refused there; a test now checks the length and the release workflow warns when the registry refuses an entry.
25
+ - **Docs:** clearer positioning ("Huly for AI agents"), a table of measured token costs and a measured comparison with another popular Huly MCP server (2.9× less text per answer, 14× smaller tool definitions) in the README.
26
+
5
27
  ### 3.3.0 — 2026-11-11
6
28
 
7
29
  - **Claude Code plugin: `/huly:setup`** — the agent asks once per repo how Huly is used there (role, where new issues go, initiative, how token-saving) and writes the answers as a `## Huly` section; every later session follows it. You choose where: `CLAUDE.md` (shared), `CLAUDE.local.md` (only you; added to `.gitignore` if needed) or split — shared rules in `CLAUDE.md`, initiative and efficiency in `CLAUDE.local.md`. The project and its GitHub sync are detected first, so only the questions that matter are asked; "Not now" writes nothing. Optional import: status set, components, milestones, TODO/FIXME proposals, architecture document. The session-start hook reads the rules from all three files and offers `/huly:setup` while a repo has none.
package/README.md CHANGED
@@ -3,22 +3,66 @@
3
3
  [![npm](https://img.shields.io/npm/v/huly-mcp-selfhost?label=npm)](https://www.npmjs.com/package/huly-mcp-selfhost)
4
4
  [![CI](https://github.com/JoKeks2023/huly-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/JoKeks2023/huly-mcp/actions/workflows/ci.yml)
5
5
  [![Docker Pulls](https://img.shields.io/docker/pulls/jokeks2023/huly-mcp)](https://hub.docker.com/r/jokeks2023/huly-mcp)
6
- [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.jokeks2023%2Fhuly--mcp--selfhost-blue)](https://registry.modelcontextprotocol.io)
6
+ [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.JoKeks2023%2Fhuly--mcp--selfhost-blue)](https://registry.modelcontextprotocol.io)
7
7
  [![License: EPL-2.0](https://img.shields.io/badge/license-EPL--2.0-blue)](https://github.com/JoKeks2023/huly-mcp/blob/main/LICENSE)
8
8
 
9
- **The MCP server for [Huly](https://huly.io) — self-hosted or Huly Cloud.** Let Claude and other AI agents work in your Huly workspaces: issues, epics, milestones, documents, chat, inbox, planner, test management and more — 224 tools, built to spend as few tokens as possible.
9
+ **Huly for AI agents.** An MCP server for [Huly](https://huly.io) — self-hosted or Huly Cloud — that lets Claude and other agents work in your workspaces: issues, epics, milestones, documents, chat, inbox, planner, test management and more. 227 tools, built for agent workflows and to spend as few tokens as possible.
10
10
 
11
- [Website](https://jokeks2023.github.io/huly-mcp/) · [Quick start](#quick-start) · [Tools](#tools-224-total-grouped-in-toolsets) · [Claude Code plugin](#claude-code-plugin) · [Changelog](https://github.com/JoKeks2023/huly-mcp/blob/main/CHANGELOG.md)
11
+ [Website](https://jokeks2023.github.io/huly-mcp/) · [Quick start](#quick-start) · [Tools](#tools-227-total-grouped-in-toolsets) · [Claude Code plugin](#claude-code-plugin) · [Changelog](https://github.com/JoKeks2023/huly-mcp/blob/main/CHANGELOG.md)
12
12
 
13
13
  ## Highlights
14
14
 
15
15
  - **Everything in Huly:** tracker, documents, chat, inbox, activity, planner, calendar, GitHub PRs, contacts, drive, cards, templates, test management, recruiting, CRM, HR and more — plus read access to *any* Huly class.
16
16
  - **Made for agents:** one-call overviews (`my_day`, `standup`, `project_report`, `get_issue_context`), `start_work` → `finish_work`, plans → epics with sub-issues, specs and meeting notes → issues, claims for parallel agents, and `huly-mcp watch` to hand issues to Claude from Huly.
17
- - **Few tokens:** tools come in toolsets (default ≈10k tokens, everything ≈23k), optionally loaded on demand; pin a workspace for −10 %; compact outputs; wrong parameters are rejected with the valid list instead of silently ignored.
18
- - **Safe by default:** every change names its workspace, risky tools ask first, writes can be limited to projects, optional audit log.
17
+ - **Few tokens:** tools come in toolsets (default ≈11k tokens, everything ≈24k), optionally loaded on demand; pin a workspace for −10 %; compact outputs; wrong parameters are rejected with the valid list instead of silently ignored.
18
+ - **Safe by default:** every change names its workspace, risky tools ask first, writes can be limited to projects, optional audit log — and `undo_changes` reverses your last changes.
19
+ - **Small and quick to install:** one self-contained package of ~4 MB (900 kB download) — no 180 dependencies to fetch on the first `npx`.
20
+ - **No telemetry.** The server talks to your Huly server and nothing else: no analytics, no usage tracking, nothing to opt out of. (The only other request, the npm version check, runs when you call `check_setup`.)
19
21
  - **Claude Code plugin:** `/huly:setup` asks once per repo how Huly is used there and writes the rules; skill, hooks and `/huly:*` commands. Guides and a `setup` prompt for every other MCP client too.
20
22
  - **Self-hosted first:** document and description content, file uploads and internal URLs work on `huly-selfhost`; one account, all its workspaces.
21
23
 
24
+ ## Tokens, measured
25
+
26
+ What the model reads — measured on a real self-hosted project (≈60 issues):
27
+
28
+ | | Characters | ≈ Tokens |
29
+ |---|--:|--:|
30
+ | Tool list, default toolsets (99 tools, each callable directly) | 38,259 | 10.9k |
31
+ | Tool list, pinned workspace | 34,567 | 9.9k |
32
+ | Open issues of a project (one call, ≈30 issues) | 2,768 | 0.8k |
33
+ | One issue with description | 318 | 0.1k |
34
+ | Project report (done, in progress, blocked, milestones, PRs, time) | ~2,700 | 0.8k |
35
+ | My day (calendar, to-dos, my issues, PRs, inbox) | ~1,200 | 0.3k |
36
+
37
+ Lists default to open items, empty fields are left out, and one call answers what would otherwise take four or five. Per call and question: [`costs.md`](https://github.com/JoKeks2023/huly-mcp/blob/main/plugin/skills/huly/costs.md).
38
+
39
+ ### Compared with another popular Huly MCP server
40
+
41
+ <picture>
42
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/JoKeks2023/huly-mcp/main/docs/assets/benchmark-dark.svg">
43
+ <img alt="Characters per answer: huly-mcp-selfhost needs 2.9× less text per answer (median), 14× smaller tool definitions, one call instead of up to four" src="https://raw.githubusercontent.com/JoKeks2023/huly-mcp/main/docs/assets/benchmark-light.svg" width="900">
44
+ </picture>
45
+
46
+ Same self-hosted Huly, same questions, the best parameters on both sides, measured 2026-11-11. For the other server only the text content is counted, not the duplicate JSON copy it also returns. Where we return more (components), it is because we include each component's description and code paths.
47
+
48
+ <details>
49
+ <summary>All numbers (characters)</summary>
50
+
51
+ | Question | huly-mcp-selfhost | Other server | Ratio |
52
+ |---|--:|--:|--:|
53
+ | Open issues of a project | 2,768 (1 call) | 11,601 (3 calls) | 4.2× less |
54
+ | Issues in progress | 211 (1 call) | 790 (1 call) | 3.7× less |
55
+ | One issue | 318 (1 call) | 585 (1 call) | 1.8× less |
56
+ | Everything about an issue (fields, sub-issues, comments, relations) | 1,246 (1 call) | 3,585 (4 calls) | 2.9× less |
57
+ | Search | 406 (1 call) | 1,405 (1 call) | 3.5× less |
58
+ | Projects | 550 (1 call) | 1,041 (1 call) | 1.9× less |
59
+ | Milestones | 208 (1 call) | 503 (1 call) | 2.4× less |
60
+ | Components | 1,302 (1 call) | 692 (1 call) | 2.0× more |
61
+ | Documents of a teamspace | 106 (1 call) | 305 (1 call) | 2.9× less |
62
+ | Tool definitions (49 tools with the same name) | 15,728 | 216,890 | 13.8× less |
63
+
64
+ </details>
65
+
22
66
  ## Quick start
23
67
 
24
68
  You need Node.js 20+ and a Huly account — [Huly Cloud](https://huly.app) or self-hosted.
@@ -55,7 +99,7 @@ Then run `/huly:setup` in a repository. Details: [Claude Code plugin](#claude-co
55
99
 
56
100
  Config file locations and examples for each client: [Compatible clients](#compatible-clients).
57
101
 
58
- **Server for a team or remote clients** — run the Docker image (HTTP/SSE on port 8000): see [Docker](#docker).
102
+ **Server for a team or remote clients** — `huly-mcp-selfhost http` or the Docker image; everyone logs in with their own Huly account in the browser (OAuth): see [Team server over HTTP](#team-server-over-http).
59
103
 
60
104
  Then ask: *"What's on my plate today?"*, *"Plan the login redesign as an epic in WEB"*, *"Write release notes for v1.2"*. More in [Example prompts](#example-prompts).
61
105
 
@@ -70,7 +114,7 @@ The repo is also a Claude Code plugin marketplace. The plugin bundles the MCP se
70
114
  /plugin install huly@huly-mcp
71
115
  ```
72
116
 
73
- > **Note:** the plugin starts the npm package at exactly its own version (e.g. `huly-mcp-selfhost@3.3.0`; the plugin directory does not accept version ranges), so a plugin update brings the matching server. To try a local checkout instead: `npm run build`, then point `plugin/.mcp.json` at `dist/index.js` and start `claude --plugin-dir ./plugin`.
117
+ > **Note:** the plugin starts the npm package at exactly its own version (e.g. `huly-mcp-selfhost@3.5.0`; the plugin directory does not accept version ranges), so a plugin update brings the matching server. To try a local checkout instead: `npm run build`, then point `plugin/.mcp.json` at `dist/index.js` and start `claude --plugin-dir ./plugin`.
74
118
 
75
119
  Claude Code then asks for your Huly settings (e-mail + password or token, and for self-hosted Huly the accounts and front URL; passwords and tokens go to the OS keychain).
76
120
 
@@ -91,7 +135,31 @@ Without the plugin, the same server works in Claude Code as a plain MCP server (
91
135
 
92
136
  ---
93
137
 
94
- ## Tools (224 total, grouped in toolsets)
138
+ ## Command line
139
+
140
+ Every tool also works from the terminal — for scripts, CI and quick looks without a chat. Same login (`HULY_*` environment or `--env-file`), same safety rules (write scope, audit log, confirmation for hard-to-undo changes).
141
+
142
+ ```bash
143
+ npm install -g huly-mcp-selfhost # or: npx huly-mcp-selfhost <command>
144
+
145
+ huly-mcp tools issue # find tools
146
+ huly-mcp help list_issues # parameters, types, allowed values, defaults
147
+ huly-mcp get_issue PROJ-12 # one required parameter can be given directly
148
+ huly-mcp list_issues --project PROJ --due overdue --assignee null
149
+ huly-mcp create_issue -w acme --project PROJ --title "Fix login" --description-file notes.md
150
+ huly-mcp bulk_update_issues --identifiers PROJ-1 --identifiers PROJ-2 --status-name Done --yes
151
+ huly-mcp my_day --format json | jq -r .text
152
+ ```
153
+
154
+ - **Parameters** come from the same schemas the MCP server sends to Claude, so `help` is always current. Names work as `--project-identifier` or `--projectIdentifier`; common short forms (`--project`, `--status`, `--milestone`, …) too. Values are read by type: numbers, `true`/`false`, `null` to clear, repeat a flag for lists, JSON for nested values. `--json '{…}'` or `--input file.json` (`-` = stdin) pass everything at once; `--<text-param>-file` reads a text value from a file.
155
+ - **Hard-to-undo tools** (deletes, bulk changes, moves) ask in a terminal; in scripts they run only with `--yes`.
156
+ - **Exit codes:** 0 ok · 1 the tool failed or was cancelled · 2 wrong usage (unknown tool or option — with a "did you mean …").
157
+ - **Output:** the tool's Markdown; `--format json` gives `{"ok", "tool", "text"}` (errors too). The Huly SDK's own logging is silenced; `HULY_DEBUG=1` shows it on stderr.
158
+ - **Shell completion** for tools, options and allowed values: `eval "$(huly-mcp completion zsh)"` (or `bash`) in your shell profile.
159
+
160
+ ---
161
+
162
+ ## Tools (227 total, grouped in toolsets)
95
163
 
96
164
  All tools except `list_workspaces` take a `workspace` argument — required for every change, optional for reads when only one workspace is available.
97
165
 
@@ -101,7 +169,7 @@ Every tool schema is sent to the model in each session (Claude Desktop loads all
101
169
 
102
170
  ```bash
103
171
  HULY_TOOLSETS=all # everything
104
- HULY_TOOLSETS=tracker,documents,planner # just these ('core' = list_workspaces is always on)
172
+ HULY_TOOLSETS=tracker,documents,planner # just these ('core' = list_workspaces, check_setup and undo_changes, always on)
105
173
  ```
106
174
 
107
175
  **Load on demand** (`HULY_DYNAMIC_TOOLSETS=1`): `HULY_TOOLSETS` becomes the starting set, and Claude loads more toolsets itself via `enable_toolsets`. Called without arguments, it lists every toolset with its tools; called with names, it loads them and tells the client that the tool list changed. With `HULY_TOOLSETS=agent,inbox` a session starts at ≈1.8k tokens instead of ≈9–11k. This needs a client that reloads the tool list on `notifications/tools/list_changed`: it is tested with the MCP SDK client, but **not yet verified in Claude Desktop**. Without the variable, nothing changes.
@@ -113,7 +181,7 @@ HULY_TOOLSETS=tracker,documents,planner # just these ('core' = list_workspaces i
113
181
  | `documents` | ✓ | 8 | teamspaces and documents (tree, move, rename) |
114
182
  | `chat` | ✓ | 12 | channels, DMs, threads, edit/delete, reactions, pins |
115
183
  | `contacts` | ✓ | 11 | members, organizations, persons, contact channels |
116
- | `inbox` | ✓ | 3 | notifications, triage (what changed since last read), mark read/archive |
184
+ | `inbox` | ✓ | 4 | notifications, triage (what changed since last read), mark read/archive; pin, hide, mark unread, follow/unfollow per object |
117
185
  | `activity` | ✓ | 1 | change history of an issue/object |
118
186
  | `planner` | ✓ | 5 | to-dos, time blocking |
119
187
  | `generic` | ✓ | 4 | fulltext search across everything, read any Huly class |
@@ -140,10 +208,10 @@ HULY_TOOLSETS=tracker,documents,planner # just these ('core' = list_workspaces i
140
208
 
141
209
  Context cost of `tools/list` (≈3.5 chars/token):
142
210
 
143
- | | default (96 tools) | `all` (224 tools) |
211
+ | | default (99 tools) | `all` (227 tools) |
144
212
  |---|--:|--:|
145
- | several workspaces | ~36.5k chars ≈ **10.4k tokens** | ~81.6k chars ≈ **23.3k tokens** |
146
- | pinned with `HULY_WORKSPACE` | ~33k chars ≈ **9.4k tokens** | ~73.3k chars ≈ **20.9k tokens** |
213
+ | several workspaces | ~38.3k chars ≈ **10.9k tokens** | ~83.5k chars ≈ **23.9k tokens** |
214
+ | pinned with `HULY_WORKSPACE` | ~34.6k chars ≈ **9.9k tokens** | ~75.0k chars ≈ **21.4k tokens** |
147
215
 
148
216
  For comparison, 2.2.0 needed ≈12.8k tokens for 64 tools. **Using one workspace? Set `HULY_WORKSPACE`** — the `workspace` argument then disappears from every tool (−10%). **Claude Code** loads MCP tools on demand, so there even `HULY_TOOLSETS=all` costs little up front.
149
217
 
@@ -223,11 +291,13 @@ Options: `--run <name>`, `--parent-suite <suite>`, `--no-create` (only existing
223
291
  | Category | Tool | Description |
224
292
  |----------|------|-------------|
225
293
  | **Workspaces** | `list_workspaces` | List the workspaces this account can access (name, slug, id) |
294
+ | | `undo_changes` | Undo your last changes made through this server, newest first: what was created is removed, changed fields get their old values, deleted objects come back with the same id and data. Dry run by default; skips (and says so) when someone changed the object since — `force` overrides. Covers every write tool; history per process (stdio) or per session (HTTP), last 50 changes |
295
+ | | `check_setup` | Diagnose the setup in one call: version and whether a newer one exists, login (incl. API-token expiry), workspaces, front URL reachable, active settings — never prints secrets |
226
296
  | **Projects** | `list_projects` | List all projects in a workspace |
227
297
  | | `get_project` | Get project details + available statuses |
228
298
  | | `create_project` | Create a new tracker project with a unique identifier *(tracker-admin)* |
229
299
  | | `update_project` | Change name, description, default assignee or default status *(tracker-admin)* |
230
- | **Issues** | `list_issues` | List issues — open ones by default (`status: "all"` or a status name for others), filterable by priority, milestone, component, label, assignee, parent; `offset` pages through long lists ("51–100 of 118") |
300
+ | **Issues** | `list_issues` | List issues — open ones by default (`status: "all"` or a status name for others), filterable by priority, milestone, component, label, assignee, parent (`null` = none for each), text in the title and due date (`overdue`, `set`, `none`); `offset` pages through long lists ("51–100 of 118") |
231
301
  | | `get_issue` | Full details of an issue (e.g. `PROJ-42`): assignee, milestone, component, labels, parent, links |
232
302
  | | `create_issue` | Create a new issue (with optional Markdown description) |
233
303
  | | `update_issue` | Update title, description, status, priority, assignee, due date, component, milestone |
@@ -303,6 +373,7 @@ Options: `--run <name>`, `--parent-suite <suite>`, `--no-create` (only existing
303
373
  | **Inbox** (`inbox`) | `list_notifications` | Your notifications, grouped by issue/PR/document |
304
374
  | | `triage_inbox` | Work through the inbox in one call: per unread item its status and assignee, which fields changed and the new comments (plain text, shortened) since you last read it |
305
375
  | | `mark_notifications_read` | Mark read by object, ids or all; optionally archive |
376
+ | | `manage_notifications` | For one object: `pin`/`unpin`, `hide`/`unhide`, `unread`, `unarchive`, `follow`/`unfollow` (follow = its changes reach your inbox) |
306
377
  | **Activity** (`activity`) | `get_activity` | Who changed what, plus comments, for an issue or object |
307
378
  | **Planner** (`planner`) | `list_todos` | Your to-dos (open/done, due date filter) |
308
379
  | | `create_todo` | Create a to-do, optionally attached to an issue |
@@ -399,6 +470,11 @@ A single Huly account can belong to several workspaces — e.g. a personal one a
399
470
  | `HULY_AGENT_NAME` | no | Default agent name for `claim_issue` (default `claude`) |
400
471
  | `HULY_CONFIRM` | no | `auto` (default), `strict` or `off` — ask before deletes and other risky tools (see [Agent workflow](#agent-workflow)) |
401
472
  | `HULY_FILE_ROOT` | no | Directory for local files: `upload_file` (`localPath`) and `download_file` (`savePath`) only work inside it. Off when unset — the server may run remotely |
473
+ | `MCP_TRANSPORT` | no | Docker only: `http` = the server's own HTTP endpoint (`/mcp`, per-user logins) instead of mcp-proxy (see [Team server over HTTP](#team-server-over-http)) |
474
+ | `MCP_OAUTH_SECRET` | no | HTTP mode: turns on "log in with Huly" (OAuth); at least 32 characters, e.g. `openssl rand -hex 32` (see [Team server over HTTP](#team-server-over-http)) |
475
+ | `MCP_PUBLIC_URL` | with OAuth | The HTTPS address clients reach the server at (issuer and login page), e.g. `https://huly-mcp.example.com` |
476
+ | `MCP_AUTH_TOKEN` | no | HTTP mode: bearer token every client must send; required before the server's own `HULY_*` login is used over HTTP |
477
+ | `HULY_PREWARM` | no | `0` turns off connecting at start-up. By default the server logs in (and opens the workspace when there is only one) right after it starts, so the first tool call answers in well under a second instead of 4–12 s |
402
478
  | `HULY_SUBSCRIBE_POLL_MS` | no | How often subscribed `huly://` resources are checked for changes (default 30000, minimum 5000) |
403
479
 
404
480
  ---
@@ -433,6 +509,10 @@ A token copied from the browser (DevTools → Application → Local Storage →
433
509
 
434
510
  > Tokens expire after some time. If you get an auth error, run `npx huly-mcp-selfhost setup` again or switch to email + password.
435
511
 
512
+ **Option C — API token (Huly → Settings → API tokens; in Huly's development branch since 2026-08, not yet in every release or self-hosted install):** bound to one workspace, with an expiry date, revocable without changing your password — the best choice for agents and CI. Use it as `HULY_TOKEN`. The server keeps it to its own workspace (even where Huly itself would allow switching), checks the expiry up front, and `check_setup` warns two weeks before it runs out. Tested against Huly's token format, not yet against a live server that issues such tokens.
513
+
514
+ **Something not working?** Ask Claude to run `check_setup`: version (and whether a newer one exists), login, workspaces, whether the front URL is reachable and which settings are active — without printing secrets.
515
+
436
516
  **Self-hosted Huly:**
437
517
 
438
518
  ```bash
@@ -627,7 +707,7 @@ For network access (HTTP/SSE) use the [Docker image](#docker).
627
707
 
628
708
  ### npx (recommended)
629
709
 
630
- Every client example uses `"command": "npx", "args": ["-y", "huly-mcp-selfhost"]`. Pin a version (`huly-mcp-selfhost@3.3.0`) if you want updates only when you choose.
710
+ Every client example uses `"command": "npx", "args": ["-y", "huly-mcp-selfhost"]`. Pin a version (`huly-mcp-selfhost@3.5.0`) if you want updates only when you choose.
631
711
 
632
712
  ### From source
633
713
 
@@ -657,6 +737,33 @@ docker compose up -d
657
737
 
658
738
  The container wraps the server with [`mcp-proxy`](https://github.com/sparfenyuk/mcp-proxy) to expose it over HTTP/SSE at `:8000/sse`, since standard MCP stdio transport can't be reached over a network directly. **Behind a reverse proxy or on a public hostname, set `MCP_ALLOWED_HOSTS`** to the host name(s) clients use, e.g. `MCP_ALLOWED_HOSTS=huly-mcp.example.com`. Otherwise mcp-proxy only accepts `localhost` and answers `421 Invalid Host header`. See [`Dockerfile`](https://github.com/JoKeks2023/huly-mcp/blob/main/Dockerfile) / [`docker-compose.yml`](https://github.com/JoKeks2023/huly-mcp/blob/main/docker-compose.yml).
659
739
 
740
+ ### Team server over HTTP
741
+
742
+ `huly-mcp-selfhost http` serves MCP over Streamable HTTP at `/mcp` (health check `/healthz`) — no proxy, one long-lived session per client, so logins and connections are reused (the first call of a session takes ~0.2 s). In Docker: `MCP_TRANSPORT=http`.
743
+
744
+ ```bash
745
+ npx huly-mcp-selfhost http --host 0.0.0.0 --port 8000
746
+ ```
747
+
748
+ **Everyone with their own Huly account.** A client sends its own login as headers; the session then acts as that person:
749
+
750
+ ```bash
751
+ claude mcp add --transport http huly https://huly-mcp.example.com/mcp \
752
+ --header "X-Huly-Token: <your token>" # or X-Huly-Email + X-Huly-Password
753
+ # optional: --header "X-Huly-Workspace: acme" # pin one workspace (fewer tokens)
754
+ ```
755
+
756
+ **Log in with Huly (OAuth).** Set `MCP_OAUTH_SECRET` (`openssl rand -hex 32`) and `MCP_PUBLIC_URL` (the HTTPS address clients reach, e.g. `https://huly-mcp.example.com`). Then people simply add `https://huly-mcp.example.com/mcp` in their AI app — Claude Code (`claude mcp add --transport http huly …`), Claude's custom connectors and other OAuth-capable MCP clients — and log in in the browser with their own Huly account: e-mail + password, or a one-time code by e-mail for Google/GitHub accounts. One server, as many people as you like, nobody handles tokens.
757
+
758
+ - Stateless: registrations, codes and tokens are sealed with AES-256-GCM under `MCP_OAUTH_SECRET` — no database, logins survive restarts. Changing the secret logs everyone out.
759
+ - The Huly password goes only to your Huly server; the server keeps just the resulting Huly token, inside the sealed tokens. Access tokens last 1 hour, refresh tokens 30 days and work once (rotation). Login attempts are throttled per address.
760
+ - The protocol parts (client registration, PKCE, token endpoint, metadata) are the MCP SDK's own; this server adds the login page and the tokens.
761
+ - `X-Huly-Workspace` still pins a workspace. In OAuth mode `/mcp` needs the OAuth token; `MCP_AUTH_TOKEN` and the `X-Huly-*` login headers are for the other mode.
762
+
763
+ **One shared account.** The server's own `HULY_*` login is only used behind a bearer token — set `MCP_AUTH_TOKEN` and give clients `Authorization: Bearer <token>`. Without it an open port would act as that account, so the server refuses and asks for per-user headers instead. With `MCP_AUTH_TOKEN` set, every request needs the bearer token, also when it brings its own login.
764
+
765
+ Set `MCP_ALLOWED_HOSTS` to the host names clients use (DNS-rebinding protection). Use HTTPS (reverse proxy) as soon as logins travel over a network. Idle sessions close after 30 minutes.
766
+
660
767
  ---
661
768
 
662
769
  ## Example prompts
@@ -839,6 +946,8 @@ See [`src/connection.ts`](https://github.com/JoKeks2023/huly-mcp/blob/main/src/c
839
946
  npm ci && npm run build && npm test
840
947
  ```
841
948
 
949
+ `npm run build` type-checks (`tsc --noEmit`) and bundles `src/` with all dependencies into one readable file, `dist/index.js` (esbuild, not minified), plus `dist/guides/`. The published package therefore has no runtime dependencies; everything in `package.json` is a dev dependency. Tests run on the TypeScript sources (`tsx`).
950
+
842
951
  GitHub Actions check every pull request:
843
952
 
844
953
  | Workflow | What it checks |
@@ -878,13 +987,13 @@ See [CHANGELOG.md](https://github.com/JoKeks2023/huly-mcp/blob/main/CHANGELOG.md
878
987
 
879
988
  ## Credits
880
989
 
881
- Started as a fork of [varaprasadreddy9676/huly-mcp](https://github.com/varaprasadreddy9676/huly-mcp) (npm `huly-mcp-sdk`) by SaiVaraprasad Medapati and grown from its 33 tools to 224, with self-hosted support, toolsets, agent workflow and the Claude Code plugin. Published separately as `huly-mcp-selfhost`. Not affiliated with Huly Labs.
990
+ Started as a fork of [varaprasadreddy9676/huly-mcp](https://github.com/varaprasadreddy9676/huly-mcp) (npm `huly-mcp-sdk`) by SaiVaraprasad Medapati and grown from its 33 tools to 227, with self-hosted support, toolsets, agent workflow and the Claude Code plugin. Published separately as `huly-mcp-selfhost`. Not affiliated with Huly Labs.
882
991
 
883
992
  ## Links
884
993
 
885
994
  - Website: https://jokeks2023.github.io/huly-mcp/
886
995
  - Source and issues: https://github.com/JoKeks2023/huly-mcp
887
- - npm: https://www.npmjs.com/package/huly-mcp-selfhost · Docker: https://hub.docker.com/r/jokeks2023/huly-mcp · MCP Registry: `io.github.jokeks2023/huly-mcp-selfhost`
996
+ - npm: https://www.npmjs.com/package/huly-mcp-selfhost · Docker: https://hub.docker.com/r/jokeks2023/huly-mcp · MCP Registry: `io.github.JoKeks2023/huly-mcp-selfhost`
888
997
  - Security: [SECURITY.md](https://github.com/JoKeks2023/huly-mcp/blob/main/SECURITY.md)
889
998
 
890
999
  ## License
@@ -12,12 +12,13 @@ Every Huly call costs a round trip and its output stays in context. Aim for **on
12
12
  | Everything about PROJ-12 before working on it | `get_issue_context` | ~1.3k | `get_issue` + `list_sub_issues` + `list_comments` + relations (4+ calls) |
13
13
  | Status/assignee of PROJ-12 | `get_issue` | ~0.4k | `get_issue_context` |
14
14
  | What changed? | `changes_since` with `projectIdentifiers` and a short `since` | — | whole workspace for 7d: ~8k |
15
+ | Inbox housekeeping for one object (pin, hide, unread, follow) | `manage_notifications` | small | several updates |
15
16
  | What needs my attention? | `triage_inbox` with a small `limit` | ~4k at 10 | `list_notifications` + `get_issue` per item |
16
17
  | What's in release v1.2? | `release_notes` | ~2k | `list_issues milestoneLabel=…` + reading every issue |
17
18
  | Find issues about X | `search_issues` | ~2k | `list_issues status=all` and scanning |
18
19
  | Find anything (docs, chat, issues) | `search` | ~2.5k | several list calls |
19
20
 
20
- **Narrow lists with filters, not by reading them:** `list_issues` takes `status` (`open` default, `all`, or a name), `assignee` (`null` = unassigned), `milestoneLabel`, `componentLabel`, `labelName`, `parentIdentifier` (`null` = top level) and `limit`.
21
+ **Narrow lists with filters, not by reading them:** `list_issues` takes `status` (`open` default, `all`, or a name), `assignee` (`null` = unassigned), `milestoneLabel`, `componentLabel`, `labelName`, `parentIdentifier` (`null` = top level), `title` (contains text), `due` (`overdue`, `set`, `none`) and `limit`.
21
22
 
22
23
  **Avoid** `query_documents` / generic tools when a specific tool exists: one issue there is ~1.8k raw fields vs ~0.4k from `get_issue`. Use them only for classes without a tool.
23
24
 
@@ -19,7 +19,7 @@ Keep Huly current as you work, in the same turn as the action. Every call costs
19
19
  | Everything about PROJ-12 | `get_issue_context` (just status/assignee: `get_issue`) |
20
20
  | Find something | `search_issues`, `search` — not `list_issues status=all` |
21
21
 
22
- Narrow lists with filters (`status`, `assignee`, `milestoneLabel`, `componentLabel`, `parentIdentifier`, `limit`). More questions with measured sizes: [costs.md](costs.md).
22
+ Narrow lists with filters (`status`, `assignee`, `milestoneLabel`, `componentLabel`, `parentIdentifier`, `title`, `due: overdue`, `limit`). More questions with measured sizes: [costs.md](costs.md).
23
23
 
24
24
  ## 2. Pick up and hand back
25
25
 
@@ -52,6 +52,8 @@ Narrow lists with filters (`status`, `assignee`, `milestoneLabel`, `componentLab
52
52
  ## 5. Be careful with
53
53
 
54
54
  - Bulk changes, `move_issue`, deletes: show what will change first.
55
+ - A change went wrong: `undo_changes` (dry run first) reverses your last changes through this server — don't repair by hand.
55
56
  - GitHub-synced projects: every change appears on GitHub too; don't cross-post.
56
57
  - `HULY_WRITE_PROJECTS` refusals: tell the user, don't work around them.
58
+ - Huly calls fail with login/connection errors: run `check_setup` and show the user what it says.
57
59
  - A tool you need is missing: it is in a disabled toolset — `enable_toolsets` if available, otherwise tell the user which toolset to enable ([features.md](features.md)).