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.
- package/.env.example +16 -0
- package/README.md +189 -0
- package/dist/connection.d.ts +5 -0
- package/dist/connection.js +111 -0
- package/dist/connection.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +177 -0
- package/dist/schemas.js +78 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +48 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/comments.d.ts +9 -0
- package/dist/tools/comments.js +19 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/documents.d.ts +14 -0
- package/dist/tools/documents.js +27 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/issues.d.ts +51 -0
- package/dist/tools/issues.js +179 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/labels.d.ts +35 -0
- package/dist/tools/labels.js +150 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/members.d.ts +6 -0
- package/dist/tools/members.js +17 -0
- package/dist/tools/members.js.map +1 -0
- package/dist/tools/milestones.d.ts +8 -0
- package/dist/tools/milestones.js +26 -0
- package/dist/tools/milestones.js.map +1 -0
- package/dist/tools/projects.d.ts +14 -0
- package/dist/tools/projects.js +33 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/relations.d.ts +27 -0
- package/dist/tools/relations.js +103 -0
- package/dist/tools/relations.js.map +1 -0
- package/dist/tools/search.d.ts +9 -0
- package/dist/tools/search.js +32 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/utils/errors.d.ts +11 -0
- package/dist/utils/errors.js +24 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/format.js +28 -0
- package/dist/utils/format.js.map +1 -0
- package/package.json +63 -0
- package/scripts/cleanup-issues.js +132 -0
- package/scripts/demo.js +193 -0
- package/scripts/import-csv.js +242 -0
- package/scripts/sample-tasks.csv +11 -0
- 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":";;AAaA,sCAOC;AAED,4CAIC;AA6FD,0CAKC;AA5HD,kEAAoG;AACpG,8CAA8E;AAC9E,gEAA2D;AAQ3D,IAAI,KAAK,GAA2B,IAAI,CAAA;AACxC,IAAI,cAAc,GAAoC,IAAI,CAAA;AAEnD,KAAK,UAAU,aAAa;IACjC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAA;IACzC,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC,QAAQ,CAAA;IACnE,cAAc,GAAG,OAAO,EAAE,CAAA;IAC1B,KAAK,GAAG,MAAM,cAAc,CAAA;IAC5B,cAAc,GAAG,IAAI,CAAA;IACrB,OAAO,KAAK,CAAC,QAAQ,CAAA;AACvB,CAAC;AAEM,KAAK,UAAU,gBAAgB;IACpC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,aAAa,CAAA;IAC9C,MAAM,aAAa,EAAE,CAAA;IACrB,OAAO,KAAM,CAAC,aAAa,CAAA;AAC7B,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;IAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAA;IAE/E,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,QAAkB,CAAA;IACtB,IAAI,QAAgB,CAAA;IACpB,IAAI,OAAe,CAAA;IAEnB,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,wEAAwE;QACxE,uEAAuE;QACvE,sDAAsD;QACtD,MAAM,YAAY,GAAG,IAAA,0BAAmB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,mBAAmB,EAAE,CAAA;QAErD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;QACvG,CAAC;QAED,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAChD,qEAAqE;YACrE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;YACpF,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC,QAAoB,CAAA;YACpC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;YACxB,OAAO,GAAG,IAAI,CAAC,KAAM,CAAA;QACvB,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACjD,4EAA4E;YAC5E,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;YACtD,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC,QAAoB,CAAA;YACpC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;YAC3E,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,cAAc,YAAY,gCAAgC,CAAC,CAAA;YAC7E,CAAC;YACD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;YAC1B,OAAO,GAAG,MAAM,CAAC,KAAK,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;QACvG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,uEAAuE;QACvE,IAAI,KAAK,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAA;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,IAAA,0BAAmB,EAAC,WAAW,CAAC,CAAA;QACrD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAE3D,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACxD,CAAC;QAED,+DAA+D;QAC/D,MAAM,mBAAmB,GAAG,IAAA,0BAAmB,EAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7E,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;QAElF,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,cAAc,YAAY,gCAAgC,CAAC,CAAA;QAC7E,CAAC;QAED,QAAQ,GAAG,SAAS,CAAC,QAAoB,CAAA;QACzC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC1B,OAAO,GAAG,MAAM,CAAC,KAAK,CAAA;IACxB,CAAC;IAED,oCAAoC;IACpC,MAAM,aAAa,GAAG,MAAM,IAAA,4BAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,IAAI,mBAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;IAE1D,2DAA2D;IAC3D,MAAM,aAAa,GAAG,IAAA,0BAAmB,EAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAE/D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,CAAA;AACnD,CAAC;AAEM,KAAK,UAAU,eAAe;IACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QACjC,KAAK,GAAG,IAAI,CAAA;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
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
|
+
}>;
|
package/dist/schemas.js
ADDED
|
@@ -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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"}
|
package/dist/server.d.ts
ADDED