huly-mcp-sdk 0.2.1

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 (53) hide show
  1. package/.env.example +16 -0
  2. package/README.md +189 -0
  3. package/dist/connection.d.ts +5 -0
  4. package/dist/connection.js +111 -0
  5. package/dist/connection.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +25 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/schemas.d.ts +177 -0
  10. package/dist/schemas.js +78 -0
  11. package/dist/schemas.js.map +1 -0
  12. package/dist/server.d.ts +2 -0
  13. package/dist/server.js +48 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/tools/comments.d.ts +9 -0
  16. package/dist/tools/comments.js +19 -0
  17. package/dist/tools/comments.js.map +1 -0
  18. package/dist/tools/documents.d.ts +14 -0
  19. package/dist/tools/documents.js +27 -0
  20. package/dist/tools/documents.js.map +1 -0
  21. package/dist/tools/issues.d.ts +51 -0
  22. package/dist/tools/issues.js +179 -0
  23. package/dist/tools/issues.js.map +1 -0
  24. package/dist/tools/labels.d.ts +35 -0
  25. package/dist/tools/labels.js +150 -0
  26. package/dist/tools/labels.js.map +1 -0
  27. package/dist/tools/members.d.ts +6 -0
  28. package/dist/tools/members.js +17 -0
  29. package/dist/tools/members.js.map +1 -0
  30. package/dist/tools/milestones.d.ts +8 -0
  31. package/dist/tools/milestones.js +26 -0
  32. package/dist/tools/milestones.js.map +1 -0
  33. package/dist/tools/projects.d.ts +14 -0
  34. package/dist/tools/projects.js +33 -0
  35. package/dist/tools/projects.js.map +1 -0
  36. package/dist/tools/relations.d.ts +27 -0
  37. package/dist/tools/relations.js +103 -0
  38. package/dist/tools/relations.js.map +1 -0
  39. package/dist/tools/search.d.ts +9 -0
  40. package/dist/tools/search.js +32 -0
  41. package/dist/tools/search.js.map +1 -0
  42. package/dist/utils/errors.d.ts +11 -0
  43. package/dist/utils/errors.js +24 -0
  44. package/dist/utils/errors.js.map +1 -0
  45. package/dist/utils/format.d.ts +4 -0
  46. package/dist/utils/format.js +28 -0
  47. package/dist/utils/format.js.map +1 -0
  48. package/package.json +63 -0
  49. package/scripts/cleanup-issues.js +132 -0
  50. package/scripts/demo.js +193 -0
  51. package/scripts/import-csv.js +242 -0
  52. package/scripts/sample-tasks.csv +11 -0
  53. package/scripts/setup.js +103 -0
package/.env.example ADDED
@@ -0,0 +1,16 @@
1
+ # ─── Required ────────────────────────────────────────────────────────────────
2
+ HULY_WORKSPACE=your-workspace-slug # e.g. "myteam" from huly.app/myteam
3
+
4
+ # ─── Authentication (choose ONE option) ──────────────────────────────────────
5
+
6
+ # Option A — Token auth (recommended for SSO / Google / GitHub accounts)
7
+ # Run the interactive setup wizard to get a token via email OTP:
8
+ # npm run setup
9
+ # HULY_TOKEN=your-token-here
10
+
11
+ # Option B — Email + password auth (only works if you set a password on huly.app)
12
+ # HULY_EMAIL=your-email@example.com
13
+ # HULY_PASSWORD=your-password
14
+
15
+ # ─── Optional ────────────────────────────────────────────────────────────────
16
+ # HULY_ACCOUNTS_URL=https://account.huly.app # default shown; change for self-hosted
package/README.md ADDED
@@ -0,0 +1,189 @@
1
+ # huly-mcp-sdk
2
+
3
+ > The most complete MCP server for [Huly](https://huly.app) — the open-source project management platform.
4
+
5
+ Connects **Claude Desktop** (and any [MCP](https://modelcontextprotocol.io)-compatible client) directly to your Huly workspace. Manage issues, labels, relations, milestones, documents, and more — all via natural language.
6
+
7
+ ---
8
+
9
+ ## Tools (20 total)
10
+
11
+ | Category | Tool | Description |
12
+ |----------|------|-------------|
13
+ | **Projects** | `list_projects` | List all projects in the workspace |
14
+ | | `get_project` | Get project details + available statuses |
15
+ | **Issues** | `list_issues` | List issues with optional status/priority/assignee filters |
16
+ | | `get_issue` | Get full details of an issue (e.g. `PROJ-42`) |
17
+ | | `create_issue` | Create a new issue |
18
+ | | `update_issue` | Update title, status, priority, assignee, or due date |
19
+ | | `delete_issue` | Permanently delete an issue by identifier |
20
+ | **Comments** | `add_comment` | Add a comment to an issue |
21
+ | **Labels** | `list_labels` | List all labels in the workspace with color + usage count |
22
+ | | `create_label` | Create a new label with an optional hex color |
23
+ | | `add_label` | Add a label to an issue (auto-creates the label if it doesn't exist) |
24
+ | | `remove_label` | Remove a label from an issue |
25
+ | **Relations** | `add_relation` | Mark two issues as related (bidirectional) |
26
+ | | `add_blocked_by` | Mark an issue as blocked by another issue |
27
+ | | `set_parent` | Set or clear the parent epic of an issue |
28
+ | **Members** | `list_members` | List workspace members |
29
+ | **Milestones** | `list_milestones` | List milestones for a project |
30
+ | **Documents** | `list_teamspaces` | List document teamspaces |
31
+ | | `list_documents` | List documents in a teamspace |
32
+ | **Search** | `search_issues` | Full-text search across all issues |
33
+
34
+ ---
35
+
36
+ ## Requirements
37
+
38
+ - Node.js >= 20
39
+ - A Huly account — [huly.app](https://huly.app) (cloud) or self-hosted
40
+
41
+ ---
42
+
43
+ ## Quick Start
44
+
45
+ ### 1. Install
46
+
47
+ ```bash
48
+ git clone https://github.com/varaprasadreddy9676/huly-mcp.git
49
+ cd huly-mcp
50
+ npm install
51
+ npm run build
52
+ ```
53
+
54
+ ### 2. Authenticate
55
+
56
+ Run the interactive setup wizard — it sends a one-time code to your email (works for Google/GitHub SSO accounts too):
57
+
58
+ ```bash
59
+ npm run setup
60
+ ```
61
+
62
+ The wizard will ask for your email address and workspace slug, send a 6-digit OTP to your inbox, and write a `.env` file automatically.
63
+
64
+ **Your workspace slug** is the part of your Huly URL after the domain: `huly.app/`**`myteam`** → slug is `myteam`.
65
+
66
+ > If you prefer, you can write `.env` manually — see [Manual Auth](#manual-auth) below.
67
+
68
+ ### 3. Configure Claude Desktop
69
+
70
+ Add this to your Claude Desktop config:
71
+
72
+ - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
73
+ - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
74
+
75
+ ```json
76
+ {
77
+ "mcpServers": {
78
+ "huly": {
79
+ "command": "node",
80
+ "args": ["/absolute/path/to/huly-mcp/dist/index.js"],
81
+ "env": {
82
+ "HULY_TOKEN": "paste-token-from-.env-here",
83
+ "HULY_WORKSPACE": "your-workspace-slug"
84
+ }
85
+ }
86
+ }
87
+ }
88
+ ```
89
+
90
+ Restart Claude Desktop after saving.
91
+
92
+ ---
93
+
94
+ ## Example Prompts
95
+
96
+ **Issues:**
97
+ - *"List all in-progress issues in the PROJ project"*
98
+ - *"Create a high-priority issue in PROJ titled 'Fix login timeout'"*
99
+ - *"Update PROJ-42 status to Done and assign it to Sarah"*
100
+ - *"Search for issues related to authentication"*
101
+ - *"Add a comment to PROJ-15 saying the fix is deployed"*
102
+
103
+ **Labels:**
104
+ - *"List all labels in my workspace"*
105
+ - *"Add the label 'bug' to PROJ-42"*
106
+ - *"Create a label called 'backend' with color #3b82f6"*
107
+ - *"Remove the 'wontfix' label from PROJ-10"*
108
+
109
+ **Relations:**
110
+ - *"Mark PROJ-55 as blocked by PROJ-12"*
111
+ - *"Mark PROJ-30 and PROJ-31 as related"*
112
+ - *"Set PROJ-42 as a subtask of PROJ-5"*
113
+
114
+ **Other:**
115
+ - *"List all projects and their member counts"*
116
+ - *"Show milestones for the PROJ project"*
117
+ - *"List all documents in the Engineering teamspace"*
118
+
119
+ ---
120
+
121
+ ## Bulk CSV Import
122
+
123
+ Import many issues at once from a CSV file — useful for migrating from other tools:
124
+
125
+ ```bash
126
+ node scripts/import-csv.js tasks.csv PROJ
127
+ ```
128
+
129
+ **CSV format:**
130
+
131
+ ```csv
132
+ title,priority,status,dueDate
133
+ Fix login bug,High,In Progress,2025-04-01
134
+ Add dark mode,Medium,,
135
+ Improve performance,Urgent,,2025-05-01
136
+ ```
137
+
138
+ Required column: `title`. Optional: `priority` (Urgent/High/Medium/Low), `status` (must match a status name in the project), `dueDate` (YYYY-MM-DD).
139
+
140
+ Auth is read from your `.env` file automatically.
141
+
142
+ ---
143
+
144
+ ## Manual Auth
145
+
146
+ If you prefer to set up `.env` by hand, create a `.env` file in the project root:
147
+
148
+ **Option A — Token (recommended for all account types):**
149
+
150
+ ```bash
151
+ HULY_WORKSPACE=your-workspace-slug
152
+ HULY_TOKEN=your-token-here
153
+ ```
154
+
155
+ To get a token without the setup wizard:
156
+ 1. Go to [huly.app](https://huly.app) → open browser DevTools → Application → Local Storage → `https://huly.app` → copy the `token` value.
157
+
158
+ > Tokens expire after some time. If you get an auth error, run `npm run setup` again or refresh the token from DevTools.
159
+
160
+ **Option B — Email + password:**
161
+
162
+ Only works if you have a password set on your account (Profile → Security → Change password).
163
+
164
+ ```bash
165
+ HULY_EMAIL=your@email.com
166
+ HULY_PASSWORD=yourpassword
167
+ HULY_WORKSPACE=your-workspace-slug
168
+ ```
169
+
170
+ **Self-hosted Huly:**
171
+
172
+ ```bash
173
+ HULY_ACCOUNTS_URL=https://your-huly-instance.com/account
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Architecture
179
+
180
+ - **Single long-lived WebSocket connection** — connects once per process via `@hcengineering/server-client`, not per tool call (model load takes 1–3 s, so this keeps tools fast)
181
+ - **Lazy init** — connects on the first tool call so auth errors surface clearly in Claude
182
+ - **Dual auth** — OTP token (works for Google/GitHub SSO) or email + password
183
+ - **Stdio transport** — standard MCP transport compatible with Claude Desktop and any MCP client
184
+
185
+ ---
186
+
187
+ ## License
188
+
189
+ [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
@@ -0,0 +1,5 @@
1
+ import { type AccountClient } from '@hcengineering/account-client';
2
+ import { TxOperations } from '@hcengineering/core';
3
+ export declare function getConnection(): Promise<TxOperations>;
4
+ export declare function getAccountClient(): Promise<AccountClient>;
5
+ export declare function closeConnection(): Promise<void>;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConnection = getConnection;
4
+ exports.getAccountClient = getAccountClient;
5
+ exports.closeConnection = closeConnection;
6
+ const account_client_1 = require("@hcengineering/account-client");
7
+ const core_1 = require("@hcengineering/core");
8
+ const server_client_1 = require("@hcengineering/server-client");
9
+ let state = null;
10
+ let connectPromise = null;
11
+ async function getConnection() {
12
+ if (state !== null)
13
+ return state.txClient;
14
+ if (connectPromise !== null)
15
+ return (await connectPromise).txClient;
16
+ connectPromise = connect();
17
+ state = await connectPromise;
18
+ connectPromise = null;
19
+ return state.txClient;
20
+ }
21
+ async function getAccountClient() {
22
+ if (state !== null)
23
+ return state.accountClient;
24
+ await getConnection();
25
+ return state.accountClient;
26
+ }
27
+ async function connect() {
28
+ const email = process.env.HULY_EMAIL;
29
+ const password = process.env.HULY_PASSWORD;
30
+ const workspaceUrl = process.env.HULY_WORKSPACE;
31
+ const hulyToken = process.env.HULY_TOKEN;
32
+ const accountsUrl = process.env.HULY_ACCOUNTS_URL ?? 'https://account.huly.app';
33
+ if (workspaceUrl == null) {
34
+ throw new Error('Missing required env var: HULY_WORKSPACE');
35
+ }
36
+ let socialId;
37
+ let endpoint;
38
+ let wsToken;
39
+ if (hulyToken != null) {
40
+ // Token-based auth — for SSO accounts (Google/GitHub login on huly.app)
41
+ // Get the token from your browser: huly.app → DevTools → Application →
42
+ // Local Storage → huly.app → look for the key "token"
43
+ const authedClient = (0, account_client_1.getClient)(accountsUrl, hulyToken);
44
+ const info = await authedClient.getLoginInfoByToken();
45
+ if (info == null) {
46
+ throw new Error('HULY_TOKEN is invalid or expired. Please get a fresh token from huly.app DevTools.');
47
+ }
48
+ if ('endpoint' in info && info.endpoint != null) {
49
+ // It's a WorkspaceLoginInfo — already has endpoint + workspace token
50
+ if (info.socialId == null) {
51
+ throw new Error('Token auth: no socialId in token. Try a workspace-scoped token.');
52
+ }
53
+ socialId = info.socialId;
54
+ endpoint = info.endpoint;
55
+ wsToken = info.token;
56
+ }
57
+ else if ('token' in info && info.token != null) {
58
+ // It's a plain LoginInfo (account-level token) — still need selectWorkspace
59
+ if (info.socialId == null) {
60
+ throw new Error('Token auth: no socialId returned.');
61
+ }
62
+ socialId = info.socialId;
63
+ const wsInfo = await authedClient.selectWorkspace(workspaceUrl, 'external');
64
+ if (wsInfo.endpoint == null || wsInfo.token == null) {
65
+ throw new Error(`Workspace '${workspaceUrl}' not found or not accessible.`);
66
+ }
67
+ endpoint = wsInfo.endpoint;
68
+ wsToken = wsInfo.token;
69
+ }
70
+ else {
71
+ throw new Error('Token auth: unexpected response from getLoginInfoByToken. Token may be incomplete.');
72
+ }
73
+ }
74
+ else {
75
+ // Email + password auth — for accounts with a password set on huly.app
76
+ if (email == null || password == null) {
77
+ throw new Error('Missing credentials. Provide HULY_TOKEN (for SSO accounts) or both HULY_EMAIL and HULY_PASSWORD.');
78
+ }
79
+ // Step 1: login → get account token + socialId
80
+ const unauthClient = (0, account_client_1.getClient)(accountsUrl);
81
+ const loginInfo = await unauthClient.login(email, password);
82
+ if (loginInfo.token == null) {
83
+ throw new Error('Login failed: no token returned. Check credentials.');
84
+ }
85
+ if (loginInfo.socialId == null) {
86
+ throw new Error('Login failed: no socialId returned.');
87
+ }
88
+ // Step 2: select workspace → get WS endpoint + workspace token
89
+ const authedAccountClient = (0, account_client_1.getClient)(accountsUrl, loginInfo.token);
90
+ const wsInfo = await authedAccountClient.selectWorkspace(workspaceUrl, 'external');
91
+ if (wsInfo.endpoint == null || wsInfo.token == null) {
92
+ throw new Error(`Workspace '${workspaceUrl}' not found or not accessible.`);
93
+ }
94
+ socialId = loginInfo.socialId;
95
+ endpoint = wsInfo.endpoint;
96
+ wsToken = wsInfo.token;
97
+ }
98
+ // Step 3: open WebSocket connection
99
+ const rawConnection = await (0, server_client_1.createClient)(endpoint, wsToken);
100
+ const txClient = new core_1.TxOperations(rawConnection, socialId);
101
+ // Build workspace-scoped account client for member lookups
102
+ const accountClient = (0, account_client_1.getClient)(accountsUrl, wsToken);
103
+ return { txClient, rawConnection, accountClient };
104
+ }
105
+ async function closeConnection() {
106
+ if (state !== null) {
107
+ await state.rawConnection.close();
108
+ state = null;
109
+ }
110
+ }
111
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
5
+ const server_1 = require("./server");
6
+ const connection_1 = require("./connection");
7
+ async function main() {
8
+ const server = (0, server_1.createServer)();
9
+ const transport = new stdio_js_1.StdioServerTransport();
10
+ process.on('SIGINT', async () => {
11
+ await (0, connection_1.closeConnection)();
12
+ process.exit(0);
13
+ });
14
+ process.on('SIGTERM', async () => {
15
+ await (0, connection_1.closeConnection)();
16
+ process.exit(0);
17
+ });
18
+ await server.connect(transport);
19
+ // Process stays alive — connection maintained until shutdown
20
+ }
21
+ main().catch((err) => {
22
+ console.error('Fatal error starting huly-mcp:', err);
23
+ process.exit(1);
24
+ });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,wEAAgF;AAChF,qCAAuC;AACvC,6CAA8C;AAE9C,KAAK,UAAU,IAAI;IACjB,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,6DAA6D;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,177 @@
1
+ import { z } from 'zod';
2
+ export declare const GetProjectSchema: z.ZodObject<{
3
+ identifier: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ identifier: string;
6
+ }, {
7
+ identifier: string;
8
+ }>;
9
+ export declare const ListIssuesSchema: z.ZodObject<{
10
+ projectIdentifier: z.ZodString;
11
+ status: z.ZodOptional<z.ZodString>;
12
+ priority: z.ZodOptional<z.ZodEnum<["NoPriority", "Urgent", "High", "Medium", "Low"]>>;
13
+ limit: z.ZodDefault<z.ZodNumber>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ projectIdentifier: string;
16
+ limit: number;
17
+ status?: string | undefined;
18
+ priority?: "Medium" | "NoPriority" | "Urgent" | "High" | "Low" | undefined;
19
+ }, {
20
+ projectIdentifier: string;
21
+ status?: string | undefined;
22
+ priority?: "Medium" | "NoPriority" | "Urgent" | "High" | "Low" | undefined;
23
+ limit?: number | undefined;
24
+ }>;
25
+ export declare const GetIssueSchema: z.ZodObject<{
26
+ identifier: z.ZodString;
27
+ }, "strip", z.ZodTypeAny, {
28
+ identifier: string;
29
+ }, {
30
+ identifier: string;
31
+ }>;
32
+ export declare const CreateIssueSchema: z.ZodObject<{
33
+ projectIdentifier: z.ZodString;
34
+ title: z.ZodString;
35
+ priority: z.ZodDefault<z.ZodEnum<["NoPriority", "Urgent", "High", "Medium", "Low"]>>;
36
+ statusName: z.ZodOptional<z.ZodString>;
37
+ dueDate: z.ZodOptional<z.ZodString>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ title: string;
40
+ projectIdentifier: string;
41
+ priority: "Medium" | "NoPriority" | "Urgent" | "High" | "Low";
42
+ statusName?: string | undefined;
43
+ dueDate?: string | undefined;
44
+ }, {
45
+ title: string;
46
+ projectIdentifier: string;
47
+ priority?: "Medium" | "NoPriority" | "Urgent" | "High" | "Low" | undefined;
48
+ statusName?: string | undefined;
49
+ dueDate?: string | undefined;
50
+ }>;
51
+ export declare const DeleteIssueSchema: z.ZodObject<{
52
+ identifier: z.ZodString;
53
+ }, "strip", z.ZodTypeAny, {
54
+ identifier: string;
55
+ }, {
56
+ identifier: string;
57
+ }>;
58
+ export declare const UpdateIssueSchema: z.ZodObject<{
59
+ identifier: z.ZodString;
60
+ title: z.ZodOptional<z.ZodString>;
61
+ statusName: z.ZodOptional<z.ZodString>;
62
+ priority: z.ZodOptional<z.ZodEnum<["NoPriority", "Urgent", "High", "Medium", "Low"]>>;
63
+ dueDate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ identifier: string;
66
+ title?: string | undefined;
67
+ priority?: "Medium" | "NoPriority" | "Urgent" | "High" | "Low" | undefined;
68
+ statusName?: string | undefined;
69
+ dueDate?: string | null | undefined;
70
+ }, {
71
+ identifier: string;
72
+ title?: string | undefined;
73
+ priority?: "Medium" | "NoPriority" | "Urgent" | "High" | "Low" | undefined;
74
+ statusName?: string | undefined;
75
+ dueDate?: string | null | undefined;
76
+ }>;
77
+ export declare const AddCommentSchema: z.ZodObject<{
78
+ identifier: z.ZodString;
79
+ message: z.ZodString;
80
+ }, "strip", z.ZodTypeAny, {
81
+ message: string;
82
+ identifier: string;
83
+ }, {
84
+ message: string;
85
+ identifier: string;
86
+ }>;
87
+ export declare const ListMilestonesSchema: z.ZodObject<{
88
+ projectIdentifier: z.ZodString;
89
+ }, "strip", z.ZodTypeAny, {
90
+ projectIdentifier: string;
91
+ }, {
92
+ projectIdentifier: string;
93
+ }>;
94
+ export declare const ListDocumentsSchema: z.ZodObject<{
95
+ teamspaceId: z.ZodString;
96
+ }, "strip", z.ZodTypeAny, {
97
+ teamspaceId: string;
98
+ }, {
99
+ teamspaceId: string;
100
+ }>;
101
+ export declare const SearchIssuesSchema: z.ZodObject<{
102
+ query: z.ZodString;
103
+ limit: z.ZodDefault<z.ZodNumber>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ limit: number;
106
+ query: string;
107
+ }, {
108
+ query: string;
109
+ limit?: number | undefined;
110
+ }>;
111
+ export declare const ListLabelsSchema: z.ZodObject<{
112
+ projectIdentifier: z.ZodOptional<z.ZodString>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ projectIdentifier?: string | undefined;
115
+ }, {
116
+ projectIdentifier?: string | undefined;
117
+ }>;
118
+ export declare const CreateLabelSchema: z.ZodObject<{
119
+ title: z.ZodString;
120
+ color: z.ZodOptional<z.ZodString>;
121
+ }, "strip", z.ZodTypeAny, {
122
+ title: string;
123
+ color?: string | undefined;
124
+ }, {
125
+ title: string;
126
+ color?: string | undefined;
127
+ }>;
128
+ export declare const AddLabelSchema: z.ZodObject<{
129
+ identifier: z.ZodString;
130
+ labelName: z.ZodString;
131
+ }, "strip", z.ZodTypeAny, {
132
+ identifier: string;
133
+ labelName: string;
134
+ }, {
135
+ identifier: string;
136
+ labelName: string;
137
+ }>;
138
+ export declare const RemoveLabelSchema: z.ZodObject<{
139
+ identifier: z.ZodString;
140
+ labelName: z.ZodString;
141
+ }, "strip", z.ZodTypeAny, {
142
+ identifier: string;
143
+ labelName: string;
144
+ }, {
145
+ identifier: string;
146
+ labelName: string;
147
+ }>;
148
+ export declare const AddRelationSchema: z.ZodObject<{
149
+ identifier: z.ZodString;
150
+ relatedTo: z.ZodString;
151
+ }, "strip", z.ZodTypeAny, {
152
+ identifier: string;
153
+ relatedTo: string;
154
+ }, {
155
+ identifier: string;
156
+ relatedTo: string;
157
+ }>;
158
+ export declare const AddBlockedBySchema: z.ZodObject<{
159
+ identifier: z.ZodString;
160
+ blockedBy: z.ZodString;
161
+ }, "strip", z.ZodTypeAny, {
162
+ identifier: string;
163
+ blockedBy: string;
164
+ }, {
165
+ identifier: string;
166
+ blockedBy: string;
167
+ }>;
168
+ export declare const SetParentSchema: z.ZodObject<{
169
+ identifier: z.ZodString;
170
+ parentIdentifier: z.ZodOptional<z.ZodNullable<z.ZodString>>;
171
+ }, "strip", z.ZodTypeAny, {
172
+ identifier: string;
173
+ parentIdentifier?: string | null | undefined;
174
+ }, {
175
+ identifier: string;
176
+ parentIdentifier?: string | null | undefined;
177
+ }>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SetParentSchema = exports.AddBlockedBySchema = exports.AddRelationSchema = exports.RemoveLabelSchema = exports.AddLabelSchema = exports.CreateLabelSchema = exports.ListLabelsSchema = exports.SearchIssuesSchema = exports.ListDocumentsSchema = exports.ListMilestonesSchema = exports.AddCommentSchema = exports.UpdateIssueSchema = exports.DeleteIssueSchema = exports.CreateIssueSchema = exports.GetIssueSchema = exports.ListIssuesSchema = exports.GetProjectSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const PriorityEnum = zod_1.z.enum(['NoPriority', 'Urgent', 'High', 'Medium', 'Low']);
6
+ exports.GetProjectSchema = zod_1.z.object({
7
+ identifier: zod_1.z.string().describe('Project identifier, e.g. "PROJ"')
8
+ });
9
+ exports.ListIssuesSchema = zod_1.z.object({
10
+ projectIdentifier: zod_1.z.string().describe('Project identifier, e.g. "PROJ"'),
11
+ status: zod_1.z.string().optional().describe('Filter by status name, e.g. "In Progress"'),
12
+ priority: PriorityEnum.optional().describe('Filter by priority'),
13
+ limit: zod_1.z.number().int().min(1).max(250).default(50).describe('Max issues to return')
14
+ });
15
+ exports.GetIssueSchema = zod_1.z.object({
16
+ identifier: zod_1.z.string().describe('Issue identifier, e.g. "PROJ-123"')
17
+ });
18
+ exports.CreateIssueSchema = zod_1.z.object({
19
+ projectIdentifier: zod_1.z.string().describe('Project identifier, e.g. "PROJ"'),
20
+ title: zod_1.z.string().min(1).describe('Issue title'),
21
+ priority: PriorityEnum.default('NoPriority').describe('Issue priority'),
22
+ statusName: zod_1.z.string().optional().describe('Status name (defaults to project default)'),
23
+ dueDate: zod_1.z.string().optional().describe('Due date as ISO 8601 string, e.g. "2026-04-01"')
24
+ });
25
+ exports.DeleteIssueSchema = zod_1.z.object({
26
+ identifier: zod_1.z.string().describe('Issue identifier to delete, e.g. "PROJ-123"')
27
+ });
28
+ exports.UpdateIssueSchema = zod_1.z.object({
29
+ identifier: zod_1.z.string().describe('Issue identifier, e.g. "PROJ-123"'),
30
+ title: zod_1.z.string().optional().describe('New title'),
31
+ statusName: zod_1.z.string().optional().describe('New status name'),
32
+ priority: PriorityEnum.optional().describe('New priority'),
33
+ dueDate: zod_1.z.string().nullable().optional().describe('New due date (ISO 8601) or null to clear')
34
+ });
35
+ exports.AddCommentSchema = zod_1.z.object({
36
+ identifier: zod_1.z.string().describe('Issue identifier, e.g. "PROJ-123"'),
37
+ message: zod_1.z.string().min(1).describe('Comment text')
38
+ });
39
+ exports.ListMilestonesSchema = zod_1.z.object({
40
+ projectIdentifier: zod_1.z.string().describe('Project identifier, e.g. "PROJ"')
41
+ });
42
+ exports.ListDocumentsSchema = zod_1.z.object({
43
+ teamspaceId: zod_1.z.string().describe('Teamspace _id from list_teamspaces')
44
+ });
45
+ exports.SearchIssuesSchema = zod_1.z.object({
46
+ query: zod_1.z.string().min(1).describe('Search query'),
47
+ limit: zod_1.z.number().int().min(1).max(50).default(20).describe('Max results')
48
+ });
49
+ // ── Labels ────────────────────────────────────────────────────────────────────
50
+ exports.ListLabelsSchema = zod_1.z.object({
51
+ projectIdentifier: zod_1.z.string().optional().describe('Optional project filter (currently returns all workspace labels)')
52
+ });
53
+ exports.CreateLabelSchema = zod_1.z.object({
54
+ title: zod_1.z.string().min(1).describe('Label name'),
55
+ color: zod_1.z.string().optional().describe('Hex color, e.g. "#FF6B6B" (optional)')
56
+ });
57
+ exports.AddLabelSchema = zod_1.z.object({
58
+ identifier: zod_1.z.string().describe('Issue identifier, e.g. "PROJ-123"'),
59
+ labelName: zod_1.z.string().min(1).describe('Label name to add (auto-created if it does not exist)')
60
+ });
61
+ exports.RemoveLabelSchema = zod_1.z.object({
62
+ identifier: zod_1.z.string().describe('Issue identifier, e.g. "PROJ-123"'),
63
+ labelName: zod_1.z.string().min(1).describe('Label name to remove')
64
+ });
65
+ // ── Relations ─────────────────────────────────────────────────────────────────
66
+ exports.AddRelationSchema = zod_1.z.object({
67
+ identifier: zod_1.z.string().describe('Issue identifier, e.g. "PROJ-123"'),
68
+ relatedTo: zod_1.z.string().describe('Related issue identifier, e.g. "PROJ-456"')
69
+ });
70
+ exports.AddBlockedBySchema = zod_1.z.object({
71
+ identifier: zod_1.z.string().describe('Issue that is blocked, e.g. "PROJ-123"'),
72
+ blockedBy: zod_1.z.string().describe('Issue that blocks it, e.g. "PROJ-100"')
73
+ });
74
+ exports.SetParentSchema = zod_1.z.object({
75
+ identifier: zod_1.z.string().describe('Child issue identifier, e.g. "PROJ-123"'),
76
+ parentIdentifier: zod_1.z.string().nullable().optional().describe('Parent issue identifier, or null to clear parent')
77
+ });
78
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createServer(): McpServer;