huly-mcp-selfhost 3.4.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 (222) hide show
  1. package/.env.example +3 -0
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +54 -16
  4. package/dist/guides/workflow.md +1 -0
  5. package/dist/index.js +105034 -55
  6. package/dist/setup.js +4 -0
  7. package/package.json +12 -11
  8. package/dist/connection.d.ts +0 -100
  9. package/dist/connection.js +0 -344
  10. package/dist/connection.js.map +0 -1
  11. package/dist/env.d.ts +0 -1
  12. package/dist/env.js +0 -17
  13. package/dist/env.js.map +0 -1
  14. package/dist/guard.d.ts +0 -39
  15. package/dist/guard.js +0 -165
  16. package/dist/guard.js.map +0 -1
  17. package/dist/http.d.ts +0 -22
  18. package/dist/http.js +0 -213
  19. package/dist/http.js.map +0 -1
  20. package/dist/index.d.ts +0 -2
  21. package/dist/index.js.map +0 -1
  22. package/dist/junit-cli.d.ts +0 -8
  23. package/dist/junit-cli.js +0 -106
  24. package/dist/junit-cli.js.map +0 -1
  25. package/dist/registry.d.ts +0 -18
  26. package/dist/registry.js +0 -321
  27. package/dist/registry.js.map +0 -1
  28. package/dist/resources.d.ts +0 -19
  29. package/dist/resources.js +0 -255
  30. package/dist/resources.js.map +0 -1
  31. package/dist/schemas.d.ts +0 -1583
  32. package/dist/schemas.js +0 -1097
  33. package/dist/schemas.js.map +0 -1
  34. package/dist/server.d.ts +0 -29
  35. package/dist/server.js +0 -215
  36. package/dist/server.js.map +0 -1
  37. package/dist/tools/activity.d.ts +0 -10
  38. package/dist/tools/activity.js +0 -62
  39. package/dist/tools/activity.js.map +0 -1
  40. package/dist/tools/agent.d.ts +0 -156
  41. package/dist/tools/agent.js +0 -523
  42. package/dist/tools/agent.js.map +0 -1
  43. package/dist/tools/attachments.d.ts +0 -31
  44. package/dist/tools/attachments.js +0 -61
  45. package/dist/tools/attachments.js.map +0 -1
  46. package/dist/tools/calendar.d.ts +0 -49
  47. package/dist/tools/calendar.js +0 -116
  48. package/dist/tools/calendar.js.map +0 -1
  49. package/dist/tools/cards.d.ts +0 -87
  50. package/dist/tools/cards.js +0 -246
  51. package/dist/tools/cards.js.map +0 -1
  52. package/dist/tools/channels.d.ts +0 -118
  53. package/dist/tools/channels.js +0 -211
  54. package/dist/tools/channels.js.map +0 -1
  55. package/dist/tools/comments.d.ts +0 -42
  56. package/dist/tools/comments.js +0 -77
  57. package/dist/tools/comments.js.map +0 -1
  58. package/dist/tools/components.d.ts +0 -45
  59. package/dist/tools/components.js +0 -107
  60. package/dist/tools/components.js.map +0 -1
  61. package/dist/tools/contacts.d.ts +0 -69
  62. package/dist/tools/contacts.js +0 -130
  63. package/dist/tools/contacts.js.map +0 -1
  64. package/dist/tools/crm.d.ts +0 -61
  65. package/dist/tools/crm.js +0 -117
  66. package/dist/tools/crm.js.map +0 -1
  67. package/dist/tools/diagnostics.d.ts +0 -17
  68. package/dist/tools/diagnostics.js +0 -133
  69. package/dist/tools/diagnostics.js.map +0 -1
  70. package/dist/tools/documents.d.ts +0 -100
  71. package/dist/tools/documents.js +0 -294
  72. package/dist/tools/documents.js.map +0 -1
  73. package/dist/tools/drive.d.ts +0 -107
  74. package/dist/tools/drive.js +0 -277
  75. package/dist/tools/drive.js.map +0 -1
  76. package/dist/tools/fields.d.ts +0 -33
  77. package/dist/tools/fields.js +0 -124
  78. package/dist/tools/fields.js.map +0 -1
  79. package/dist/tools/generic.d.ts +0 -72
  80. package/dist/tools/generic.js +0 -242
  81. package/dist/tools/generic.js.map +0 -1
  82. package/dist/tools/github.d.ts +0 -21
  83. package/dist/tools/github.js +0 -80
  84. package/dist/tools/github.js.map +0 -1
  85. package/dist/tools/hr.d.ts +0 -97
  86. package/dist/tools/hr.js +0 -150
  87. package/dist/tools/hr.js.map +0 -1
  88. package/dist/tools/inbox.d.ts +0 -39
  89. package/dist/tools/inbox.js +0 -139
  90. package/dist/tools/inbox.js.map +0 -1
  91. package/dist/tools/inventory.d.ts +0 -61
  92. package/dist/tools/inventory.js +0 -103
  93. package/dist/tools/inventory.js.map +0 -1
  94. package/dist/tools/issues.d.ts +0 -114
  95. package/dist/tools/issues.js +0 -484
  96. package/dist/tools/issues.js.map +0 -1
  97. package/dist/tools/labels.d.ts +0 -87
  98. package/dist/tools/labels.js +0 -232
  99. package/dist/tools/labels.js.map +0 -1
  100. package/dist/tools/log-time.d.ts +0 -25
  101. package/dist/tools/log-time.js +0 -95
  102. package/dist/tools/log-time.js.map +0 -1
  103. package/dist/tools/meetings.d.ts +0 -30
  104. package/dist/tools/meetings.js +0 -78
  105. package/dist/tools/meetings.js.map +0 -1
  106. package/dist/tools/members.d.ts +0 -8
  107. package/dist/tools/members.js +0 -33
  108. package/dist/tools/members.js.map +0 -1
  109. package/dist/tools/message-templates.d.ts +0 -54
  110. package/dist/tools/message-templates.js +0 -88
  111. package/dist/tools/message-templates.js.map +0 -1
  112. package/dist/tools/milestones.d.ts +0 -56
  113. package/dist/tools/milestones.js +0 -172
  114. package/dist/tools/milestones.js.map +0 -1
  115. package/dist/tools/organizations.d.ts +0 -37
  116. package/dist/tools/organizations.js +0 -88
  117. package/dist/tools/organizations.js.map +0 -1
  118. package/dist/tools/overview.d.ts +0 -55
  119. package/dist/tools/overview.js +0 -395
  120. package/dist/tools/overview.js.map +0 -1
  121. package/dist/tools/planner.d.ts +0 -60
  122. package/dist/tools/planner.js +0 -145
  123. package/dist/tools/planner.js.map +0 -1
  124. package/dist/tools/process.d.ts +0 -50
  125. package/dist/tools/process.js +0 -137
  126. package/dist/tools/process.js.map +0 -1
  127. package/dist/tools/products.d.ts +0 -17
  128. package/dist/tools/products.js +0 -45
  129. package/dist/tools/products.js.map +0 -1
  130. package/dist/tools/projects.d.ts +0 -41
  131. package/dist/tools/projects.js +0 -93
  132. package/dist/tools/projects.js.map +0 -1
  133. package/dist/tools/qms.d.ts +0 -57
  134. package/dist/tools/qms.js +0 -171
  135. package/dist/tools/qms.js.map +0 -1
  136. package/dist/tools/recruiting.d.ts +0 -112
  137. package/dist/tools/recruiting.js +0 -203
  138. package/dist/tools/recruiting.js.map +0 -1
  139. package/dist/tools/relations.d.ts +0 -72
  140. package/dist/tools/relations.js +0 -192
  141. package/dist/tools/relations.js.map +0 -1
  142. package/dist/tools/search.d.ts +0 -23
  143. package/dist/tools/search.js +0 -60
  144. package/dist/tools/search.js.map +0 -1
  145. package/dist/tools/sharing.d.ts +0 -62
  146. package/dist/tools/sharing.js +0 -149
  147. package/dist/tools/sharing.js.map +0 -1
  148. package/dist/tools/statuses.d.ts +0 -19
  149. package/dist/tools/statuses.js +0 -93
  150. package/dist/tools/statuses.js.map +0 -1
  151. package/dist/tools/surveys.d.ts +0 -22
  152. package/dist/tools/surveys.js +0 -53
  153. package/dist/tools/surveys.js.map +0 -1
  154. package/dist/tools/templates.d.ts +0 -95
  155. package/dist/tools/templates.js +0 -260
  156. package/dist/tools/templates.js.map +0 -1
  157. package/dist/tools/test-automation.d.ts +0 -81
  158. package/dist/tools/test-automation.js +0 -225
  159. package/dist/tools/test-automation.js.map +0 -1
  160. package/dist/tools/testing.d.ts +0 -234
  161. package/dist/tools/testing.js +0 -401
  162. package/dist/tools/testing.js.map +0 -1
  163. package/dist/tools/workspace-admin.d.ts +0 -55
  164. package/dist/tools/workspace-admin.js +0 -117
  165. package/dist/tools/workspace-admin.js.map +0 -1
  166. package/dist/tools/workspaces.d.ts +0 -6
  167. package/dist/tools/workspaces.js +0 -19
  168. package/dist/tools/workspaces.js.map +0 -1
  169. package/dist/utils/attributes.d.ts +0 -37
  170. package/dist/utils/attributes.js +0 -188
  171. package/dist/utils/attributes.js.map +0 -1
  172. package/dist/utils/classes.d.ts +0 -51
  173. package/dist/utils/classes.js +0 -73
  174. package/dist/utils/classes.js.map +0 -1
  175. package/dist/utils/content.d.ts +0 -11
  176. package/dist/utils/content.js +0 -86
  177. package/dist/utils/content.js.map +0 -1
  178. package/dist/utils/errors.d.ts +0 -11
  179. package/dist/utils/errors.js +0 -24
  180. package/dist/utils/errors.js.map +0 -1
  181. package/dist/utils/files.d.ts +0 -5
  182. package/dist/utils/files.js +0 -50
  183. package/dist/utils/files.js.map +0 -1
  184. package/dist/utils/format.d.ts +0 -8
  185. package/dist/utils/format.js +0 -57
  186. package/dist/utils/format.js.map +0 -1
  187. package/dist/utils/junit.d.ts +0 -13
  188. package/dist/utils/junit.js +0 -81
  189. package/dist/utils/junit.js.map +0 -1
  190. package/dist/utils/markdown.d.ts +0 -14
  191. package/dist/utils/markdown.js +0 -149
  192. package/dist/utils/markdown.js.map +0 -1
  193. package/dist/utils/meeting.d.ts +0 -13
  194. package/dist/utils/meeting.js +0 -118
  195. package/dist/utils/meeting.js.map +0 -1
  196. package/dist/utils/people.d.ts +0 -25
  197. package/dist/utils/people.js +0 -80
  198. package/dist/utils/people.js.map +0 -1
  199. package/dist/utils/redact.d.ts +0 -3
  200. package/dist/utils/redact.js +0 -26
  201. package/dist/utils/redact.js.map +0 -1
  202. package/dist/utils/resolve.d.ts +0 -17
  203. package/dist/utils/resolve.js +0 -54
  204. package/dist/utils/resolve.js.map +0 -1
  205. package/dist/utils/spec.d.ts +0 -10
  206. package/dist/utils/spec.js +0 -90
  207. package/dist/utils/spec.js.map +0 -1
  208. package/dist/utils/storage.d.ts +0 -7
  209. package/dist/utils/storage.js +0 -86
  210. package/dist/utils/storage.js.map +0 -1
  211. package/dist/utils/tasks.d.ts +0 -22
  212. package/dist/utils/tasks.js +0 -81
  213. package/dist/utils/tasks.js.map +0 -1
  214. package/dist/watch.d.ts +0 -62
  215. package/dist/watch.js +0 -405
  216. package/dist/watch.js.map +0 -1
  217. package/scripts/cleanup-issues.js +0 -141
  218. package/scripts/copy-guides.js +0 -18
  219. package/scripts/demo.js +0 -201
  220. package/scripts/import-csv.js +0 -250
  221. package/scripts/sample-tasks.csv +0 -11
  222. package/scripts/setup.js +0 -163
package/dist/guard.js DELETED
@@ -1,165 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isMutation = isMutation;
4
- exports.projectsIn = projectsIn;
5
- exports.parseWriteProjects = parseWriteProjects;
6
- exports.assertWriteAllowed = assertWriteAllowed;
7
- exports.audit = audit;
8
- exports.isRisky = isRisky;
9
- exports.toolAnnotations = toolAnnotations;
10
- exports.parseConfirmMode = parseConfirmMode;
11
- exports.describeCall = describeCall;
12
- exports.elicitationAsker = elicitationAsker;
13
- exports.guard = guard;
14
- // Cross-cutting checks around every tool call:
15
- // - HULY_WRITE_PROJECTS: changes are only allowed in the listed projects
16
- // - HULY_AUDIT_LOG: every change is appended as one JSON line to this file
17
- // - HULY_CONFIRM: destructive tools ask the user first (MCP elicitation) when the client can ask
18
- const node_fs_1 = require("node:fs");
19
- const TASK_ID = /^([A-Z][A-Z0-9]*)-\d+$/;
20
- const PROJECT_KEYS = new Set(['projectIdentifier', 'targetProjectIdentifier', 'projectIdentifiers']);
21
- /** A tool changes data when its workspace argument is mandatory (reads may omit it). */
22
- function isMutation(tool) {
23
- const ws = tool.schema.shape.workspace;
24
- return ws != null && !ws.isOptional();
25
- }
26
- /** Project keys an argument object refers to: project fields plus every "PROJ-12"-style value. */
27
- function projectsIn(args, key = '') {
28
- const out = new Set();
29
- const visit = (value, k) => {
30
- if (typeof value === 'string') {
31
- if (PROJECT_KEYS.has(k))
32
- out.add(value.toUpperCase());
33
- const m = TASK_ID.exec(value);
34
- if (m != null)
35
- out.add(m[1]);
36
- }
37
- else if (Array.isArray(value)) {
38
- for (const v of value)
39
- visit(v, k);
40
- }
41
- else if (value != null && typeof value === 'object') {
42
- for (const [ck, cv] of Object.entries(value))
43
- visit(cv, ck);
44
- }
45
- };
46
- visit(args, key);
47
- return out;
48
- }
49
- function parseWriteProjects(value) {
50
- const list = (value ?? '').split(',').map((p) => p.trim().toUpperCase()).filter((p) => p !== '');
51
- return list.length > 0 ? new Set(list) : undefined;
52
- }
53
- function assertWriteAllowed(tool, args, allowed) {
54
- if (allowed == null || !isMutation(tool))
55
- return;
56
- const denied = [...projectsIn(args)].filter((p) => !allowed.has(p));
57
- if (denied.length > 0) {
58
- throw new Error(`Huly MCP: ${tool.name} touches project(s) ${denied.join(', ')}, but HULY_WRITE_PROJECTS only allows ${[...allowed].join(', ')}.`);
59
- }
60
- }
61
- function shorten(value, depth = 0) {
62
- if (typeof value === 'string')
63
- return value.length > 200 ? `${value.slice(0, 200)}… (${value.length} chars)` : value;
64
- if (Array.isArray(value))
65
- return depth > 3 ? `[${value.length} items]` : value.map((v) => shorten(v, depth + 1));
66
- if (value != null && typeof value === 'object') {
67
- return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, /base64/i.test(k) ? `[${String(v).length} chars]` : shorten(v, depth + 1)]));
68
- }
69
- return value;
70
- }
71
- function audit(path, tool, args, outcome) {
72
- if (path == null || path === '' || !isMutation(tool))
73
- return;
74
- const entry = { ts: new Date().toISOString(), tool: tool.name, args: shorten(args), ok: outcome.ok, result: outcome.text.split('\n')[0].slice(0, 300) };
75
- try {
76
- (0, node_fs_1.appendFileSync)(path, JSON.stringify(entry) + '\n');
77
- }
78
- catch { /* auditing must never break a tool call */ }
79
- }
80
- // ── Confirmation for destructive tools ───────────────────────────────────────
81
- const RISKY = new Set(['bulk_update_issues', 'move_issue', 'generic_update', 'generic_delete', 'revoke_public_link', 'restore_file_version', 'send_invite', 'set_member_role', 'cancel_execution']);
82
- /** Deletes and bulk/structural changes that are hard to undo. */
83
- function isRisky(name) {
84
- return name.startsWith('delete_') || RISKY.has(name);
85
- }
86
- /**
87
- * MCP tool annotations: reads are read-only; deletes, removals and the risky tools above are
88
- * destructive; every other change (create, add, update, set, …) is marked non-destructive —
89
- * the MCP default for a write tool is "destructive", which would over-warn.
90
- * Off by default (HULY_ANNOTATIONS=1): they add ~16% to tools/list in every session.
91
- */
92
- function toolAnnotations(tool) {
93
- const title = tool.name.replace(/_/g, ' ').replace(/^./, (c) => c.toUpperCase());
94
- if (!isMutation(tool))
95
- return { title, readOnlyHint: true };
96
- return { title, destructiveHint: isRisky(tool.name) || /^(remove|revoke)_/.test(tool.name) };
97
- }
98
- function parseConfirmMode(value) {
99
- const v = (value ?? 'auto').trim().toLowerCase();
100
- if (v === 'auto' || v === 'off' || v === 'strict')
101
- return v;
102
- throw new Error(`HULY_CONFIRM must be auto, off or strict (got '${value ?? ''}').`);
103
- }
104
- /** One readable line per argument, without the workspace and with long values cut. */
105
- function describeCall(tool, args) {
106
- const parts = Object.entries(args ?? {})
107
- .filter(([k, v]) => k !== 'workspace' && v != null && k !== 'confirm')
108
- .map(([k, v]) => `${k}: ${JSON.stringify(shorten(v)).slice(0, 160)}`);
109
- const ws = typeof args?.workspace === 'string' ? ` in workspace ${args.workspace}` : '';
110
- return `Huly: ${tool.name.replace(/_/g, ' ')}${ws}?\n${parts.join('\n')}`;
111
- }
112
- /** MCP elicitation on top of an McpServer. */
113
- function elicitationAsker(server) {
114
- return {
115
- canAsk: () => server.server.getClientCapabilities()?.elicitation?.form != null,
116
- ask: async (message) => {
117
- const res = await server.server.elicitInput({
118
- mode: 'form',
119
- message,
120
- requestedSchema: { type: 'object', properties: { confirm: { type: 'boolean', title: 'Yes, do it', default: false } }, required: ['confirm'] }
121
- });
122
- return res.action === 'accept' && res.content?.confirm === true;
123
- }
124
- };
125
- }
126
- /** Wraps a handler with the write scope check, the confirmation for risky tools and the audit log. */
127
- function guard(tool, env = process.env, asker) {
128
- const allowed = parseWriteProjects(env.HULY_WRITE_PROJECTS);
129
- const auditPath = env.HULY_AUDIT_LOG;
130
- const confirm = parseConfirmMode(env.HULY_CONFIRM);
131
- return async (args) => {
132
- assertWriteAllowed(tool, args, allowed);
133
- if (confirm !== 'off' && isRisky(tool.name) && args?.dryRun !== true) {
134
- const canAsk = asker?.canAsk() === true;
135
- if (!canAsk && confirm === 'strict') {
136
- audit(auditPath, tool, args, { ok: false, text: 'refused: HULY_CONFIRM=strict and the client cannot ask' });
137
- throw new Error(`Huly MCP: ${tool.name} needs a human confirmation (HULY_CONFIRM=strict), but this client cannot ask. Leave it to a person.`);
138
- }
139
- if (canAsk) {
140
- let yes = false;
141
- try {
142
- yes = await asker.ask(describeCall(tool, args));
143
- }
144
- catch (e) {
145
- audit(auditPath, tool, args, { ok: false, text: `confirmation failed: ${e.message}` });
146
- throw new Error(`Huly MCP: could not ask for confirmation of ${tool.name} (${e.message}). Nothing was changed.`);
147
- }
148
- if (!yes) {
149
- audit(auditPath, tool, args, { ok: false, text: 'declined by the user' });
150
- return { content: [{ type: 'text', text: `Cancelled: the user declined ${tool.name}. Nothing was changed — do not retry unless they ask.` }] };
151
- }
152
- }
153
- }
154
- try {
155
- const result = await tool.handler(args);
156
- audit(auditPath, tool, args, { ok: true, text: result.content[0]?.text ?? '' });
157
- return result;
158
- }
159
- catch (e) {
160
- audit(auditPath, tool, args, { ok: false, text: e.message });
161
- throw e;
162
- }
163
- };
164
- }
165
- //# sourceMappingURL=guard.js.map
package/dist/guard.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts DELETED
@@ -1,22 +0,0 @@
1
- import http from 'node:http';
2
- import { type WorkspaceConnectionManager } from './connection';
3
- export interface HttpOptions {
4
- port: number;
5
- host: string;
6
- env: NodeJS.ProcessEnv;
7
- /** Tests: build the manager for a set of credentials. */
8
- createManager?: (creds: Credentials) => WorkspaceConnectionManager;
9
- idleMs?: number;
10
- log?: (line: string) => void;
11
- }
12
- export interface Credentials {
13
- email?: string;
14
- password?: string;
15
- token?: string;
16
- workspace?: string;
17
- }
18
- /** Credentials sent by the client, if any. */
19
- export declare function headerCredentials(req: http.IncomingMessage): Credentials | undefined;
20
- export declare function allowedHosts(value: string | undefined, port: number): string[] | undefined;
21
- export declare function startHttpServer(opts: HttpOptions): http.Server;
22
- export declare function runHttp(argv: string[]): Promise<void>;
package/dist/http.js DELETED
@@ -1,213 +0,0 @@
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.headerCredentials = headerCredentials;
7
- exports.allowedHosts = allowedHosts;
8
- exports.startHttpServer = startHttpServer;
9
- exports.runHttp = runHttp;
10
- // `huly-mcp-selfhost http`: the MCP server over Streamable HTTP, for teams and remote clients.
11
- //
12
- // One MCP session per client. A session either brings its own Huly login in headers
13
- // (X-Huly-Token, or X-Huly-Email + X-Huly-Password; optional X-Huly-Workspace) or uses the
14
- // server's own credentials (HULY_* env) — the latter only behind MCP_AUTH_TOKEN, so an open
15
- // port never acts as the server's account. Each session keeps its connections; idle sessions close.
16
- const node_http_1 = __importDefault(require("node:http"));
17
- const node_crypto_1 = require("node:crypto");
18
- const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
19
- const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
20
- const server_1 = require("./server");
21
- const connection_1 = require("./connection");
22
- const MAX_BODY = 4 * 1024 * 1024;
23
- const header = (req, name) => {
24
- const v = req.headers[name];
25
- const s = Array.isArray(v) ? v[0] : v;
26
- return s != null && s.trim() !== '' ? s.trim() : undefined;
27
- };
28
- /** Credentials sent by the client, if any. */
29
- function headerCredentials(req) {
30
- const token = header(req, 'x-huly-token');
31
- const email = header(req, 'x-huly-email');
32
- const password = header(req, 'x-huly-password');
33
- const workspace = header(req, 'x-huly-workspace');
34
- if (token != null)
35
- return { token, workspace };
36
- if (email != null || password != null) {
37
- if (email == null || password == null)
38
- throw new HttpError(400, 'Send both X-Huly-Email and X-Huly-Password (or X-Huly-Token).');
39
- return { email, password, workspace };
40
- }
41
- return undefined;
42
- }
43
- class HttpError extends Error {
44
- status;
45
- constructor(status, message) {
46
- super(message);
47
- this.status = status;
48
- }
49
- }
50
- function bearerOk(req, expected) {
51
- const got = /^Bearer\s+(.+)$/i.exec(header(req, 'authorization') ?? '')?.[1] ?? '';
52
- const a = Buffer.from(got);
53
- const b = Buffer.from(expected);
54
- return a.length === b.length && (0, node_crypto_1.timingSafeEqual)(a, b);
55
- }
56
- async function readJson(req) {
57
- const chunks = [];
58
- let size = 0;
59
- for await (const chunk of req) {
60
- size += chunk.length;
61
- if (size > MAX_BODY)
62
- throw new HttpError(413, 'Request body too large.');
63
- chunks.push(chunk);
64
- }
65
- if (size === 0)
66
- return undefined;
67
- try {
68
- return JSON.parse(Buffer.concat(chunks).toString('utf8'));
69
- }
70
- catch {
71
- throw new HttpError(400, 'Body is not valid JSON.');
72
- }
73
- }
74
- function sendError(res, status, message) {
75
- if (res.headersSent)
76
- return;
77
- res.writeHead(status, { 'content-type': 'application/json' });
78
- res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32000, message }, id: null }));
79
- }
80
- function allowedHosts(value, port) {
81
- const hosts = (value ?? '').split(',').map((h) => h.trim()).filter((h) => h !== '');
82
- if (hosts.length === 0)
83
- return undefined;
84
- const all = [...hosts, 'localhost', '127.0.0.1'];
85
- return [...new Set(all.flatMap((h) => h.includes(':') ? [h] : [h, `${h}:${port}`]))];
86
- }
87
- function startHttpServer(opts) {
88
- const env = opts.env;
89
- const log = opts.log ?? ((line) => { console.error(`huly-mcp http: ${line}`); });
90
- const authToken = (env.MCP_AUTH_TOKEN ?? '').trim();
91
- const serverCreds = (env.HULY_TOKEN ?? '') !== '' || ((env.HULY_EMAIL ?? '') !== '' && (env.HULY_PASSWORD ?? '') !== '');
92
- const sharedAllowed = serverCreds && authToken !== '';
93
- const make = opts.createManager ?? ((c) => (0, connection_1.createConnectionManager)(c, env));
94
- const hosts = allowedHosts(env.MCP_ALLOWED_HOSTS, opts.port);
95
- const sessions = new Map();
96
- if (serverCreds && authToken === '')
97
- log('the server has its own Huly credentials but MCP_AUTH_TOKEN is not set — they are not used; clients must send their own (X-Huly-Token or X-Huly-Email/X-Huly-Password).');
98
- const closeSession = async (id) => {
99
- const s = sessions.get(id);
100
- if (s == null)
101
- return;
102
- sessions.delete(id);
103
- await s.transport.close().catch(() => { });
104
- if (s.own)
105
- await s.manager.closeAll().catch(() => { });
106
- };
107
- const idleMs = opts.idleMs ?? 30 * 60_000;
108
- const sweeper = setInterval(() => {
109
- const cutoff = Date.now() - idleMs;
110
- for (const [id, s] of sessions)
111
- if (s.lastSeen < cutoff)
112
- void closeSession(id);
113
- }, Math.min(idleMs, 60_000));
114
- sweeper.unref();
115
- const server = node_http_1.default.createServer((req, res) => {
116
- void (async () => {
117
- const url = new URL(req.url ?? '/', 'http://local');
118
- if (url.pathname === '/healthz') {
119
- res.writeHead(204).end();
120
- return;
121
- }
122
- if (url.pathname !== '/mcp') {
123
- sendError(res, 404, 'Not found. The MCP endpoint is /mcp.');
124
- return;
125
- }
126
- if (authToken !== '' && !bearerOk(req, authToken)) {
127
- res.setHeader('www-authenticate', 'Bearer');
128
- sendError(res, 401, 'Missing or wrong bearer token (MCP_AUTH_TOKEN).');
129
- return;
130
- }
131
- const sessionId = header(req, 'mcp-session-id');
132
- const body = req.method === 'POST' ? await readJson(req) : undefined;
133
- const existing = sessionId != null ? sessions.get(sessionId) : undefined;
134
- if (existing != null) {
135
- existing.lastSeen = Date.now();
136
- await (0, connection_1.withConnectionManager)(existing.manager, async () => { await existing.transport.handleRequest(req, res, body); });
137
- return;
138
- }
139
- if (sessionId != null) {
140
- sendError(res, 404, 'Unknown or expired session — start a new one.');
141
- return;
142
- }
143
- if (req.method !== 'POST' || !(0, types_js_1.isInitializeRequest)(body)) {
144
- sendError(res, 400, 'No session: send an initialize request first.');
145
- return;
146
- }
147
- const creds = headerCredentials(req);
148
- if (creds == null && !sharedAllowed) {
149
- sendError(res, 401, serverCreds
150
- ? 'Send your Huly login: X-Huly-Token, or X-Huly-Email and X-Huly-Password. (The server credentials need MCP_AUTH_TOKEN.)'
151
- : 'Send your Huly login: X-Huly-Token, or X-Huly-Email and X-Huly-Password.');
152
- return;
153
- }
154
- const own = creds != null;
155
- const manager = own ? make(creds) : (0, connection_1.getConnectionManager)();
156
- const pinned = creds?.workspace ?? (own ? undefined : env.HULY_WORKSPACE);
157
- const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
158
- sessionIdGenerator: () => (0, node_crypto_1.randomUUID)(),
159
- allowedHosts: hosts,
160
- enableDnsRebindingProtection: hosts != null,
161
- onsessioninitialized: (id) => {
162
- sessions.set(id, { transport, manager, own, lastSeen: Date.now() });
163
- if (own)
164
- void (0, connection_1.withConnectionManager)(manager, async () => await (0, connection_1.prewarm)({ ...creds, HULY_EMAIL: creds.email, HULY_PASSWORD: creds.password, HULY_TOKEN: creds.token }));
165
- }
166
- });
167
- transport.onclose = () => { if (transport.sessionId != null)
168
- void closeSession(transport.sessionId); };
169
- const mcp = (0, connection_1.withConnectionManager)(manager, () => (0, server_1.createServer)({ workspace: pinned }));
170
- await mcp.connect(transport);
171
- await (0, connection_1.withConnectionManager)(manager, async () => { await transport.handleRequest(req, res, body); });
172
- })().catch((e) => {
173
- if (e instanceof HttpError)
174
- sendError(res, e.status, e.message);
175
- else {
176
- log(`request failed: ${e.message}`);
177
- sendError(res, 500, 'Internal error.');
178
- }
179
- });
180
- });
181
- server.on('close', () => {
182
- clearInterval(sweeper);
183
- for (const id of [...sessions.keys()])
184
- void closeSession(id);
185
- });
186
- return server;
187
- }
188
- async function runHttp(argv) {
189
- const arg = (name) => {
190
- const i = argv.indexOf(`--${name}`);
191
- if (i >= 0)
192
- return argv[i + 1];
193
- return argv.find((a) => a.startsWith(`--${name}=`))?.slice(name.length + 3);
194
- };
195
- if (argv.includes('--help')) {
196
- console.log(`huly-mcp-selfhost http [--port 8000] [--host 127.0.0.1]
197
-
198
- MCP over Streamable HTTP at /mcp (health check: /healthz).
199
- MCP_AUTH_TOKEN bearer token clients must send (needed to use the server's own HULY_* login)
200
- MCP_ALLOWED_HOSTS host names clients use (DNS-rebinding protection), e.g. huly-mcp.example.com
201
- Clients can send their own Huly login: X-Huly-Token, or X-Huly-Email + X-Huly-Password; X-Huly-Workspace pins one.`);
202
- return;
203
- }
204
- const port = Number(arg('port') ?? process.env.MCP_PORT ?? 8000);
205
- const host = arg('host') ?? process.env.MCP_HOST ?? '127.0.0.1';
206
- const server = startHttpServer({ port, host, env: process.env });
207
- await new Promise((resolve) => server.listen(port, host, resolve));
208
- console.error(`huly-mcp http: listening on http://${host}:${port}/mcp`);
209
- const stop = () => { server.close(() => process.exit(0)); setTimeout(() => process.exit(0), 3000).unref(); };
210
- process.on('SIGINT', stop);
211
- process.on('SIGTERM', stop);
212
- }
213
- //# sourceMappingURL=http.js.map
package/dist/http.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,wEAAgF;AAChF,qCAAuC;AACvC,6CAAuD;AACvD,+BAAoC;AACpC,mCAAkC;AAClC,2CAAsC;AACtC,iCAAgC;AAChC,2CAAqD;AAErD,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAA,gBAAQ,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC/B,IAAA,kBAAY,GAAE,CAAA;QACd,IAAA,6BAAoB,GAAE,CAAA;QACtB,MAAM,IAAA,cAAO,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAChC,4GAA4G;QAC5G,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAA;QAChC,OAAO,CAAC,qBAAqB,CAAC,CAAA;QAC9B,OAAM;IACR,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,IAAA,oBAAQ,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACrC,OAAO,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;IACD,IAAA,kBAAY,GAAE,CAAA;IACd,oFAAoF;IACpF,2FAA2F;IAC3F,gFAAgF;IAChF,IAAA,6BAAoB,GAAE,CAAA;IACtB,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAA;IAC7B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAA;IAE5C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,IAAA,4BAAe,GAAE,CAAA;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,IAAA,4BAAe,GAAE,CAAA;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,0EAA0E;IAC1E,KAAK,IAAA,oBAAO,GAAE,CAAA;IACd,6DAA6D;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -1,8 +0,0 @@
1
- import { type ImportOptions } from './tools/test-automation';
2
- export declare const JUNIT_HELP = "Usage: huly-mcp junit <report.xml> --project <test project> [options]\n\nImports a JUnit XML report (Jest, Vitest, pytest, Go, Gradle, Maven, xcpretty \u2026) as a Huly test\nrun. Suites and cases that do not exist yet are created. Credentials come from the usual HULY_*\nenvironment variables.\n\nOptions:\n --project <name> Test project (required)\n --workspace <slug> Workspace (needed when the account has several)\n --run <name> Run name (default: \"CI <date time>\")\n --parent-suite <name> Put the report's suites under this suite\n --no-create Only record results for cases that already exist\n --fail-on-failures Exit with code 1 when the report has failed tests\n --dry-run Show what would happen, change nothing\n";
3
- export interface JUnitCliOptions extends Omit<ImportOptions, 'xml'> {
4
- file: string;
5
- failOnFailures: boolean;
6
- }
7
- export declare function parseJUnitArgs(argv: string[]): JUnitCliOptions;
8
- export declare function runJUnit(argv: string[]): Promise<void>;
package/dist/junit-cli.js DELETED
@@ -1,106 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JUNIT_HELP = void 0;
4
- exports.parseJUnitArgs = parseJUnitArgs;
5
- exports.runJUnit = runJUnit;
6
- // `huly-mcp junit <report.xml>`: push a CI test report into Huly as a test run.
7
- const promises_1 = require("node:fs/promises");
8
- const env_1 = require("./env");
9
- const connection_1 = require("./connection");
10
- const test_automation_1 = require("./tools/test-automation");
11
- exports.JUNIT_HELP = `Usage: huly-mcp junit <report.xml> --project <test project> [options]
12
-
13
- Imports a JUnit XML report (Jest, Vitest, pytest, Go, Gradle, Maven, xcpretty …) as a Huly test
14
- run. Suites and cases that do not exist yet are created. Credentials come from the usual HULY_*
15
- environment variables.
16
-
17
- Options:
18
- --project <name> Test project (required)
19
- --workspace <slug> Workspace (needed when the account has several)
20
- --run <name> Run name (default: "CI <date time>")
21
- --parent-suite <name> Put the report's suites under this suite
22
- --no-create Only record results for cases that already exist
23
- --fail-on-failures Exit with code 1 when the report has failed tests
24
- --dry-run Show what would happen, change nothing
25
- `;
26
- function parseJUnitArgs(argv) {
27
- const o = { failOnFailures: false };
28
- const value = (i, flag) => {
29
- const v = argv[i + 1];
30
- if (v == null || v.startsWith('--'))
31
- throw new Error(`${flag} needs a value.`);
32
- return v;
33
- };
34
- for (let i = 0; i < argv.length; i++) {
35
- const a = argv[i];
36
- switch (a) {
37
- case '--project':
38
- o.project = value(i, a);
39
- i++;
40
- break;
41
- case '--workspace':
42
- o.workspace = value(i, a);
43
- i++;
44
- break;
45
- case '--run':
46
- o.runName = value(i, a);
47
- i++;
48
- break;
49
- case '--parent-suite':
50
- o.parentSuite = value(i, a);
51
- i++;
52
- break;
53
- case '--no-create':
54
- o.createMissing = false;
55
- break;
56
- case '--fail-on-failures':
57
- o.failOnFailures = true;
58
- break;
59
- case '--dry-run':
60
- o.dryRun = true;
61
- break;
62
- default:
63
- if (a.startsWith('--'))
64
- throw new Error(`Unknown option ${a}.`);
65
- if (o.file != null)
66
- throw new Error('Only one report file.');
67
- o.file = a;
68
- }
69
- }
70
- if (o.file == null)
71
- throw new Error('Missing report file.');
72
- if (o.project == null)
73
- throw new Error('Missing --project.');
74
- return o;
75
- }
76
- async function runJUnit(argv) {
77
- if (argv.includes('--help') || argv.includes('-h') || argv.length === 0) {
78
- process.stdout.write(exports.JUNIT_HELP);
79
- return;
80
- }
81
- let opts;
82
- try {
83
- opts = parseJUnitArgs(argv);
84
- }
85
- catch (e) {
86
- process.stderr.write(`${e.message}\n\n${exports.JUNIT_HELP}`);
87
- process.exitCode = 2;
88
- return;
89
- }
90
- (0, env_1.normalizeEnv)();
91
- try {
92
- const xml = await (0, promises_1.readFile)(opts.file, 'utf8');
93
- const summary = await (0, test_automation_1.importJUnit)({ ...opts, xml });
94
- process.stdout.write(summary.text.replace(/\*\*/g, '') + '\n');
95
- if (opts.failOnFailures && summary.failed > 0)
96
- process.exitCode = 1;
97
- }
98
- catch (e) {
99
- process.stderr.write(`huly-mcp junit: ${e.message}\n`);
100
- process.exitCode = 1;
101
- }
102
- finally {
103
- await (0, connection_1.closeConnection)();
104
- }
105
- }
106
- //# sourceMappingURL=junit-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"junit-cli.js","sourceRoot":"","sources":["../src/junit-cli.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { z } from 'zod';
2
- export declare const TOOLSETS: readonly ['core', 'agent', 'tracker', 'tracker-admin', 'documents', 'chat', 'contacts', 'inbox', 'activity', 'planner', 'calendar', 'github', 'generic', 'generic-write', 'collaboration', 'cards', 'fields', 'drive', 'templates', 'testing', 'products', 'members', 'recruiting', 'crm', 'hr', 'inventory', 'meetings', 'qms', 'process', 'surveys'];
3
- export type Toolset = typeof TOOLSETS[number];
4
- /** Enabled when HULY_TOOLSETS is not set. 'core' is always enabled. */
5
- export declare const DEFAULT_TOOLSETS: Toolset[];
6
- export interface ToolDef {
7
- name: string;
8
- toolset: Toolset;
9
- description: string;
10
- schema: z.ZodObject<any>;
11
- handler: (args: any) => Promise<{
12
- content: Array<{
13
- type: 'text';
14
- text: string;
15
- }>;
16
- }>;
17
- }
18
- export declare const TOOLS: ToolDef[];