huly-mcp-selfhost 2.1.0 → 3.2.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 (200) hide show
  1. package/.env.example +39 -2
  2. package/README.md +462 -16
  3. package/dist/connection.d.ts +8 -0
  4. package/dist/connection.js +13 -1
  5. package/dist/connection.js.map +1 -1
  6. package/dist/env.d.ts +1 -0
  7. package/dist/env.js +17 -0
  8. package/dist/env.js.map +1 -0
  9. package/dist/guard.d.ts +28 -0
  10. package/dist/guard.js +152 -0
  11. package/dist/guard.js.map +1 -0
  12. package/dist/guides/costs.md +48 -0
  13. package/dist/guides/features.md +49 -0
  14. package/dist/guides/onboarding.md +56 -0
  15. package/dist/guides/workflow.md +57 -0
  16. package/dist/index.js +18 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/junit-cli.d.ts +8 -0
  19. package/dist/junit-cli.js +106 -0
  20. package/dist/junit-cli.js.map +1 -0
  21. package/dist/registry.d.ts +18 -0
  22. package/dist/registry.js +318 -0
  23. package/dist/registry.js.map +1 -0
  24. package/dist/resources.d.ts +12 -0
  25. package/dist/resources.js +212 -0
  26. package/dist/resources.js.map +1 -0
  27. package/dist/schemas.d.ts +1269 -17
  28. package/dist/schemas.js +890 -97
  29. package/dist/schemas.js.map +1 -1
  30. package/dist/server.d.ts +27 -1
  31. package/dist/server.js +197 -128
  32. package/dist/server.js.map +1 -1
  33. package/dist/tools/activity.d.ts +10 -0
  34. package/dist/tools/activity.js +62 -0
  35. package/dist/tools/activity.js.map +1 -0
  36. package/dist/tools/agent.d.ts +156 -0
  37. package/dist/tools/agent.js +523 -0
  38. package/dist/tools/agent.js.map +1 -0
  39. package/dist/tools/attachments.d.ts +4 -4
  40. package/dist/tools/calendar.d.ts +49 -0
  41. package/dist/tools/calendar.js +116 -0
  42. package/dist/tools/calendar.js.map +1 -0
  43. package/dist/tools/cards.d.ts +87 -0
  44. package/dist/tools/cards.js +246 -0
  45. package/dist/tools/cards.js.map +1 -0
  46. package/dist/tools/channels.d.ts +76 -7
  47. package/dist/tools/channels.js +86 -5
  48. package/dist/tools/channels.js.map +1 -1
  49. package/dist/tools/comments.d.ts +16 -4
  50. package/dist/tools/comments.js +26 -9
  51. package/dist/tools/comments.js.map +1 -1
  52. package/dist/tools/components.d.ts +5 -5
  53. package/dist/tools/components.js +4 -22
  54. package/dist/tools/components.js.map +1 -1
  55. package/dist/tools/contacts.d.ts +69 -0
  56. package/dist/tools/contacts.js +130 -0
  57. package/dist/tools/contacts.js.map +1 -0
  58. package/dist/tools/crm.d.ts +61 -0
  59. package/dist/tools/crm.js +117 -0
  60. package/dist/tools/crm.js.map +1 -0
  61. package/dist/tools/documents.d.ts +35 -12
  62. package/dist/tools/documents.js +107 -22
  63. package/dist/tools/documents.js.map +1 -1
  64. package/dist/tools/drive.d.ts +107 -0
  65. package/dist/tools/drive.js +277 -0
  66. package/dist/tools/drive.js.map +1 -0
  67. package/dist/tools/fields.d.ts +33 -0
  68. package/dist/tools/fields.js +124 -0
  69. package/dist/tools/fields.js.map +1 -0
  70. package/dist/tools/generic.d.ts +72 -0
  71. package/dist/tools/generic.js +242 -0
  72. package/dist/tools/generic.js.map +1 -0
  73. package/dist/tools/github.d.ts +21 -0
  74. package/dist/tools/github.js +80 -0
  75. package/dist/tools/github.js.map +1 -0
  76. package/dist/tools/hr.d.ts +97 -0
  77. package/dist/tools/hr.js +150 -0
  78. package/dist/tools/hr.js.map +1 -0
  79. package/dist/tools/inbox.d.ts +23 -0
  80. package/dist/tools/inbox.js +76 -0
  81. package/dist/tools/inbox.js.map +1 -0
  82. package/dist/tools/inventory.d.ts +61 -0
  83. package/dist/tools/inventory.js +103 -0
  84. package/dist/tools/inventory.js.map +1 -0
  85. package/dist/tools/issues.d.ts +63 -12
  86. package/dist/tools/issues.js +259 -48
  87. package/dist/tools/issues.js.map +1 -1
  88. package/dist/tools/labels.d.ts +52 -4
  89. package/dist/tools/labels.js +86 -4
  90. package/dist/tools/labels.js.map +1 -1
  91. package/dist/tools/log-time.d.ts +15 -1
  92. package/dist/tools/log-time.js +70 -6
  93. package/dist/tools/log-time.js.map +1 -1
  94. package/dist/tools/meetings.d.ts +30 -0
  95. package/dist/tools/meetings.js +78 -0
  96. package/dist/tools/meetings.js.map +1 -0
  97. package/dist/tools/members.d.ts +1 -1
  98. package/dist/tools/members.js +17 -1
  99. package/dist/tools/members.js.map +1 -1
  100. package/dist/tools/message-templates.d.ts +54 -0
  101. package/dist/tools/message-templates.js +88 -0
  102. package/dist/tools/message-templates.js.map +1 -0
  103. package/dist/tools/milestones.d.ts +9 -9
  104. package/dist/tools/organizations.d.ts +5 -5
  105. package/dist/tools/organizations.js +2 -1
  106. package/dist/tools/organizations.js.map +1 -1
  107. package/dist/tools/overview.d.ts +55 -0
  108. package/dist/tools/overview.js +395 -0
  109. package/dist/tools/overview.js.map +1 -0
  110. package/dist/tools/planner.d.ts +60 -0
  111. package/dist/tools/planner.js +145 -0
  112. package/dist/tools/planner.js.map +1 -0
  113. package/dist/tools/process.d.ts +50 -0
  114. package/dist/tools/process.js +137 -0
  115. package/dist/tools/process.js.map +1 -0
  116. package/dist/tools/products.d.ts +17 -0
  117. package/dist/tools/products.js +45 -0
  118. package/dist/tools/products.js.map +1 -0
  119. package/dist/tools/projects.d.ts +17 -4
  120. package/dist/tools/projects.js +31 -2
  121. package/dist/tools/projects.js.map +1 -1
  122. package/dist/tools/qms.d.ts +57 -0
  123. package/dist/tools/qms.js +171 -0
  124. package/dist/tools/qms.js.map +1 -0
  125. package/dist/tools/recruiting.d.ts +112 -0
  126. package/dist/tools/recruiting.js +203 -0
  127. package/dist/tools/recruiting.js.map +1 -0
  128. package/dist/tools/relations.d.ts +45 -3
  129. package/dist/tools/relations.js +128 -39
  130. package/dist/tools/relations.js.map +1 -1
  131. package/dist/tools/search.d.ts +14 -1
  132. package/dist/tools/search.js +29 -1
  133. package/dist/tools/search.js.map +1 -1
  134. package/dist/tools/sharing.d.ts +62 -0
  135. package/dist/tools/sharing.js +149 -0
  136. package/dist/tools/sharing.js.map +1 -0
  137. package/dist/tools/statuses.d.ts +3 -3
  138. package/dist/tools/surveys.d.ts +22 -0
  139. package/dist/tools/surveys.js +53 -0
  140. package/dist/tools/surveys.js.map +1 -0
  141. package/dist/tools/templates.d.ts +95 -0
  142. package/dist/tools/templates.js +260 -0
  143. package/dist/tools/templates.js.map +1 -0
  144. package/dist/tools/test-automation.d.ts +81 -0
  145. package/dist/tools/test-automation.js +225 -0
  146. package/dist/tools/test-automation.js.map +1 -0
  147. package/dist/tools/testing.d.ts +234 -0
  148. package/dist/tools/testing.js +401 -0
  149. package/dist/tools/testing.js.map +1 -0
  150. package/dist/tools/workspace-admin.d.ts +55 -0
  151. package/dist/tools/workspace-admin.js +117 -0
  152. package/dist/tools/workspace-admin.js.map +1 -0
  153. package/dist/tools/workspaces.d.ts +1 -1
  154. package/dist/utils/attributes.d.ts +37 -0
  155. package/dist/utils/attributes.js +188 -0
  156. package/dist/utils/attributes.js.map +1 -0
  157. package/dist/utils/classes.d.ts +51 -0
  158. package/dist/utils/classes.js +73 -0
  159. package/dist/utils/classes.js.map +1 -0
  160. package/dist/utils/content.d.ts +11 -0
  161. package/dist/utils/content.js +86 -0
  162. package/dist/utils/content.js.map +1 -0
  163. package/dist/utils/errors.js +1 -1
  164. package/dist/utils/errors.js.map +1 -1
  165. package/dist/utils/files.d.ts +5 -0
  166. package/dist/utils/files.js +50 -0
  167. package/dist/utils/files.js.map +1 -0
  168. package/dist/utils/format.d.ts +2 -0
  169. package/dist/utils/format.js +7 -13
  170. package/dist/utils/format.js.map +1 -1
  171. package/dist/utils/junit.d.ts +13 -0
  172. package/dist/utils/junit.js +81 -0
  173. package/dist/utils/junit.js.map +1 -0
  174. package/dist/utils/markdown.js +9 -4
  175. package/dist/utils/markdown.js.map +1 -1
  176. package/dist/utils/meeting.d.ts +13 -0
  177. package/dist/utils/meeting.js +118 -0
  178. package/dist/utils/meeting.js.map +1 -0
  179. package/dist/utils/people.d.ts +25 -0
  180. package/dist/utils/people.js +80 -0
  181. package/dist/utils/people.js.map +1 -0
  182. package/dist/utils/redact.d.ts +3 -0
  183. package/dist/utils/redact.js +26 -0
  184. package/dist/utils/redact.js.map +1 -0
  185. package/dist/utils/resolve.d.ts +17 -0
  186. package/dist/utils/resolve.js +54 -0
  187. package/dist/utils/resolve.js.map +1 -0
  188. package/dist/utils/spec.d.ts +10 -0
  189. package/dist/utils/spec.js +90 -0
  190. package/dist/utils/spec.js.map +1 -0
  191. package/dist/utils/storage.js +7 -3
  192. package/dist/utils/storage.js.map +1 -1
  193. package/dist/utils/tasks.d.ts +22 -0
  194. package/dist/utils/tasks.js +81 -0
  195. package/dist/utils/tasks.js.map +1 -0
  196. package/dist/watch.d.ts +62 -0
  197. package/dist/watch.js +405 -0
  198. package/dist/watch.js.map +1 -0
  199. package/package.json +4 -3
  200. package/scripts/setup.js +3 -1
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.completeWorkspace = completeWorkspace;
7
+ exports.completeProject = completeProject;
8
+ exports.completeIssue = completeIssue;
9
+ exports.registerResources = registerResources;
10
+ exports.registerPrompts = registerPrompts;
11
+ exports.modifiedOn = modifiedOn;
12
+ exports.registerSubscriptions = registerSubscriptions;
13
+ // MCP resources (issues/documents addressable as huly:// URIs, e.g. @-mentions in Claude Code)
14
+ // and prompts (ready-made workflows, shown as slash commands in Claude Code).
15
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
16
+ const completable_js_1 = require("@modelcontextprotocol/sdk/server/completable.js");
17
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
18
+ const zod_1 = require("zod");
19
+ const tracker_1 = __importDefault(require("@hcengineering/tracker"));
20
+ const task_1 = __importDefault(require("@hcengineering/task"));
21
+ const core_1 = require("@hcengineering/core");
22
+ const connection_1 = require("./connection");
23
+ const people_1 = require("./utils/people");
24
+ const agent_1 = require("./tools/agent");
25
+ const documents_1 = require("./tools/documents");
26
+ const DONE = new Set([task_1.default.statusCategory.Won, task_1.default.statusCategory.Lost]);
27
+ /** Open issues assigned to me, newest first — offered as huly:// resources. */
28
+ async function myOpenIssues(limit = 30) {
29
+ const out = [];
30
+ for (const ws of await (0, connection_1.listWorkspaces)()) {
31
+ try {
32
+ const client = await (0, connection_1.getConnection)(ws.url);
33
+ const me = await (0, people_1.currentPerson)(client);
34
+ const statuses = await client.findAll(tracker_1.default.class.IssueStatus, {});
35
+ const open = statuses.filter((s) => !DONE.has(s.category)).map((s) => s._id);
36
+ const issues = await client.findAll(tracker_1.default.class.Issue, { assignee: me._id, status: { $in: open } }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit });
37
+ for (const i of issues)
38
+ out.push({ uri: `huly://${ws.url}/issue/${i.identifier}`, name: `${i.identifier}: ${i.title}`, description: `Open issue in ${ws.name}` });
39
+ }
40
+ catch { /* a workspace that cannot be read just contributes nothing */ }
41
+ }
42
+ return out.slice(0, limit);
43
+ }
44
+ // ── Argument completions (MCP completion/complete) ───────────────────────────
45
+ // Clients that support completions suggest workspaces, projects and issue ids while typing.
46
+ const MAX = 100;
47
+ const starts = (values, prefix) => values.filter((v) => v.toLowerCase().startsWith(prefix.toLowerCase())).slice(0, MAX);
48
+ async function completeWorkspace(prefix) {
49
+ try {
50
+ return starts((await (0, connection_1.listWorkspaces)()).map((w) => w.url), prefix);
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ async function completeProject(prefix, workspace) {
57
+ try {
58
+ const client = await (0, connection_1.getConnection)(workspace);
59
+ const projects = (await client.findAll(tracker_1.default.class.Project, {})).filter((p) => p.archived !== true);
60
+ return starts(projects.map((p) => p.identifier).sort(), prefix);
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ }
66
+ async function completeIssue(prefix, workspace) {
67
+ try {
68
+ const client = await (0, connection_1.getConnection)(workspace);
69
+ const m = /^([A-Za-z][A-Za-z0-9]*)(?:-(\d*))?$/.exec(prefix.trim());
70
+ if (m == null) {
71
+ // No project typed yet: offer my open issues, newest first.
72
+ const me = await (0, people_1.currentPerson)(client);
73
+ const mine = await client.findAll(tracker_1.default.class.Issue, { assignee: me._id }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit: 50 });
74
+ return mine.map((i) => i.identifier);
75
+ }
76
+ if (m[2] == null) {
77
+ const projects = await completeProject(m[1], workspace);
78
+ return projects.length === 1 ? projects.map((p) => `${p}-`) : projects;
79
+ }
80
+ const project = await client.findOne(tracker_1.default.class.Project, { identifier: m[1].toUpperCase() });
81
+ if (project == null)
82
+ return [];
83
+ const issues = await client.findAll(tracker_1.default.class.Issue, { space: project._id }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit: 500 });
84
+ return starts(issues.map((i) => i.identifier), prefix);
85
+ }
86
+ catch {
87
+ return [];
88
+ }
89
+ }
90
+ const ws = (ctx) => ctx?.arguments?.workspace;
91
+ const wsArg = () => (0, completable_js_1.completable)(zod_1.z.string(), async (v) => await completeWorkspace(v));
92
+ const issueArg = () => (0, completable_js_1.completable)(zod_1.z.string(), async (v, ctx) => await completeIssue(v, ws(ctx)));
93
+ const projectArg = () => (0, completable_js_1.completable)(zod_1.z.string(), async (v, ctx) => await completeProject(v, ws(ctx)));
94
+ function registerResources(server) {
95
+ server.registerResource('issue', new mcp_js_1.ResourceTemplate('huly://{workspace}/issue/{identifier}', {
96
+ list: async () => ({ resources: (await myOpenIssues()).map((r) => ({ ...r, mimeType: 'text/markdown' })) }),
97
+ complete: {
98
+ workspace: async (v) => await completeWorkspace(v),
99
+ identifier: async (v, ctx) => await completeIssue(v, ws(ctx))
100
+ }
101
+ }), { title: 'Huly issue', description: 'Issue with description, sub-issues, blockers, PRs and comments', mimeType: 'text/markdown' }, async (uri, vars) => ({
102
+ contents: [{ uri: uri.href, mimeType: 'text/markdown', text: await (0, agent_1.issueContext)(String(vars.workspace), String(vars.identifier)) }]
103
+ }));
104
+ server.registerResource('document', new mcp_js_1.ResourceTemplate('huly://{workspace}/document/{id}', { list: undefined, complete: { workspace: async (v) => await completeWorkspace(v) } }), { title: 'Huly document', description: 'Document with its content', mimeType: 'text/markdown' }, async (uri, vars) => {
105
+ const result = await (0, documents_1.getDocument)({ workspace: String(vars.workspace), documentId: String(vars.id) });
106
+ return { contents: [{ uri: uri.href, mimeType: 'text/markdown', text: result.content[0].text }] };
107
+ });
108
+ }
109
+ const user = (text) => ({ messages: [{ role: 'user', content: { type: 'text', text } }] });
110
+ function registerPrompts(server) {
111
+ server.registerPrompt('start', {
112
+ title: 'Start working on an issue',
113
+ description: 'Pick up an issue, load its context and propose a plan',
114
+ argsSchema: { workspace: wsArg(), identifier: issueArg() }
115
+ }, ({ workspace, identifier }) => user(`Start work on Huly issue ${identifier} in workspace ${workspace}: call start_work, read the context it returns ` +
116
+ '(description, sub-issues, blockers, PRs, comments). If it is blocked by open issues, say so before doing anything. ' +
117
+ 'Then propose a short implementation plan and use the suggested branch name.'));
118
+ server.registerPrompt('finish', {
119
+ title: 'Finish an issue',
120
+ description: 'Post a work summary, link the PR and move the issue to review',
121
+ argsSchema: { workspace: wsArg(), identifier: issueArg(), pullRequest: zod_1.z.string().optional() }
122
+ }, ({ workspace, identifier, pullRequest }) => user(`Finish Huly issue ${identifier} in workspace ${workspace}: summarise what was changed and how it was verified ` +
123
+ `(be honest about anything not verified), then call finish_work with that summary${pullRequest != null ? ` and pullRequest "${pullRequest}"` : ''}.`));
124
+ server.registerPrompt('plan', {
125
+ title: 'Turn a plan into issues',
126
+ description: 'Epic + sub-issues from a goal or plan, with duplicate check',
127
+ argsSchema: { workspace: wsArg(), projectIdentifier: projectArg(), goal: zod_1.z.string() }
128
+ }, ({ workspace, projectIdentifier, goal }) => user(`Break this down into a Huly epic with sub-issues in project ${projectIdentifier} (workspace ${workspace}):\n\n${goal}\n\n` +
129
+ 'Look up components and milestones first (list_components, list_milestones) and assign each child the fitting ones. ' +
130
+ 'Express ordering with blockedBy. Call create_issue_tree with dryRun=true, show me the plan, and only create it after I confirm.'));
131
+ server.registerPrompt('triage', {
132
+ title: 'Triage my inbox',
133
+ description: 'Go through unread notifications and suggest actions',
134
+ argsSchema: { workspace: wsArg() }
135
+ }, ({ workspace }) => user(`Triage my Huly inbox in workspace ${workspace}: call triage_inbox once (unread items with what changed), group them by urgency, and for each ` +
136
+ 'suggest one action (reply, start work, delegate, mark read). Do not change anything until I pick.'));
137
+ server.registerPrompt('standup', {
138
+ title: 'Stand-up summary',
139
+ description: 'What I did since the last working day, today, blockers',
140
+ argsSchema: { workspace: wsArg(), since: zod_1.z.string().optional() }
141
+ }, ({ workspace, since }) => user(`Write my stand-up for Huly workspace ${workspace}: call standup once${since != null ? ` with since="${since}"` : ''} — it already covers ` +
142
+ 'what I did, what is in progress, blockers and today. Format: Done / In progress / Blocked / Next — short bullet points with issue ids.'));
143
+ }
144
+ // ── Resource subscriptions (resources/subscribe → notifications/resources/updated) ──
145
+ // Huly pushes no per-document events to this client, so subscribed issues/documents are
146
+ // polled for a newer modifiedOn. The timer only runs while something is subscribed.
147
+ /** modifiedOn of the object behind a huly:// URI, or undefined if it cannot be read. */
148
+ async function modifiedOn(uri) {
149
+ const m = /^huly:\/\/([^/]+)\/(issue|document)\/(.+)$/.exec(uri);
150
+ if (m == null)
151
+ return undefined;
152
+ try {
153
+ const client = await (0, connection_1.getConnection)(decodeURIComponent(m[1]));
154
+ const id = decodeURIComponent(m[3]);
155
+ const doc = m[2] === 'issue'
156
+ ? await client.findOne(tracker_1.default.class.Issue, { identifier: id })
157
+ : await client.findOne('document:class:Document', { _id: id });
158
+ return doc?.modifiedOn;
159
+ }
160
+ catch {
161
+ return undefined;
162
+ }
163
+ }
164
+ function registerSubscriptions(server, pollMs = Number(process.env.HULY_SUBSCRIBE_POLL_MS ?? 30_000)) {
165
+ const subscriptions = new Map();
166
+ let timer;
167
+ let polling = false;
168
+ const poll = async () => {
169
+ if (polling)
170
+ return;
171
+ polling = true;
172
+ try {
173
+ for (const [uri, last] of subscriptions) {
174
+ const now = await modifiedOn(uri);
175
+ if (now != null && last != null && now > last) {
176
+ subscriptions.set(uri, now);
177
+ await server.server.sendResourceUpdated({ uri }).catch(() => { });
178
+ }
179
+ else if (last == null && now != null) {
180
+ subscriptions.set(uri, now);
181
+ }
182
+ }
183
+ }
184
+ finally {
185
+ polling = false;
186
+ }
187
+ };
188
+ const sync = () => {
189
+ if (subscriptions.size > 0 && timer == null) {
190
+ timer = setInterval(() => { void poll(); }, Math.max(5_000, pollMs));
191
+ timer.unref();
192
+ }
193
+ else if (subscriptions.size === 0 && timer != null) {
194
+ clearInterval(timer);
195
+ timer = undefined;
196
+ }
197
+ };
198
+ server.server.registerCapabilities({ resources: { subscribe: true, listChanged: true } });
199
+ server.server.setRequestHandler(types_js_1.SubscribeRequestSchema, async (req) => {
200
+ subscriptions.set(req.params.uri, await modifiedOn(req.params.uri));
201
+ sync();
202
+ return {};
203
+ });
204
+ server.server.setRequestHandler(types_js_1.UnsubscribeRequestSchema, async (req) => {
205
+ subscriptions.delete(req.params.uri);
206
+ sync();
207
+ return {};
208
+ });
209
+ server.server.onclose = () => { subscriptions.clear(); sync(); };
210
+ return { poll, subscriptions };
211
+ }
212
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}