@gor-dev/yandex-tracker-mcp 1.0.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.
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/dist/client.d.ts +63 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +165 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +422 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +99 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +84 -0
- package/dist/schemas.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sergey Gorban
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Yandex Tracker MCP Server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for integrating with Yandex Tracker API. This server enables LLMs to interact with Yandex Tracker to manage issues, track time, and query project data.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Get Issue Data**: Retrieve detailed information about any issue by its key
|
|
8
|
+
- **Update Issues**: Modify issue fields including status, assignee, estimates, and more
|
|
9
|
+
- **Time Tracking**: Add and retrieve worklog entries (time spent records)
|
|
10
|
+
- **Search Issues**: Query issues using Yandex Tracker's query language
|
|
11
|
+
- **Dual Response Formats**: Get data in JSON (for processing) or Markdown (for readability)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### Quick Install (npx - Recommended)
|
|
16
|
+
|
|
17
|
+
No installation needed! Use directly with npx:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
claude mcp add yandex-tracker \
|
|
21
|
+
-e YANDEX_TRACKER_TOKEN="your_token" \
|
|
22
|
+
-e YANDEX_TRACKER_ORG_ID="your_org_id" \
|
|
23
|
+
-- npx -y yandex-tracker-mcp-server
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Manual Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install
|
|
30
|
+
npm run build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Configuration
|
|
34
|
+
|
|
35
|
+
The server requires authentication credentials to access Yandex Tracker API:
|
|
36
|
+
|
|
37
|
+
### Option 1: OAuth Token (recommended)
|
|
38
|
+
|
|
39
|
+
1. Get your OAuth token from [Yandex OAuth](https://oauth.yandex.ru/)
|
|
40
|
+
2. Find your organization ID in Yandex Tracker settings
|
|
41
|
+
|
|
42
|
+
Set environment variables:
|
|
43
|
+
```bash
|
|
44
|
+
export YANDEX_TRACKER_TOKEN="your_oauth_token"
|
|
45
|
+
export YANDEX_TRACKER_ORG_ID="your_org_id"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Option 2: IAM Token (for Yandex Cloud)
|
|
49
|
+
|
|
50
|
+
For Yandex Cloud organizations, use IAM tokens:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
export YANDEX_TRACKER_IAM_TOKEN="your_iam_token"
|
|
54
|
+
export YANDEX_TRACKER_CLOUD_ORG_ID="your_cloud_org_id"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Claude CLI Integration (Recommended)
|
|
58
|
+
|
|
59
|
+
**Quick install with script:**
|
|
60
|
+
```bash
|
|
61
|
+
./install-to-claude-cli.sh
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Or manually:**
|
|
65
|
+
```bash
|
|
66
|
+
claude mcp add yandex-tracker \
|
|
67
|
+
-e YANDEX_TRACKER_TOKEN="your_oauth_token" \
|
|
68
|
+
-e YANDEX_TRACKER_ORG_ID="your_org_id" \
|
|
69
|
+
-- node /path/to/yandex-tracker-mcp-server/dist/index.js
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
See [CLAUDE_CLI_SETUP.md](./CLAUDE_CLI_SETUP.md) for detailed instructions.
|
|
73
|
+
|
|
74
|
+
### Claude Desktop Integration
|
|
75
|
+
|
|
76
|
+
Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"yandex-tracker": {
|
|
82
|
+
"command": "node",
|
|
83
|
+
"args": ["/path/to/yandex-tracker-mcp-server/dist/index.js"],
|
|
84
|
+
"env": {
|
|
85
|
+
"YANDEX_TRACKER_TOKEN": "your_oauth_token",
|
|
86
|
+
"YANDEX_TRACKER_ORG_ID": "your_org_id"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Available Tools
|
|
94
|
+
|
|
95
|
+
### 1. `yandex_tracker_get_issue`
|
|
96
|
+
|
|
97
|
+
Get detailed information about a specific issue.
|
|
98
|
+
|
|
99
|
+
**Parameters:**
|
|
100
|
+
- `issue_key` (required): Issue key (e.g., "MYQUEUE-123")
|
|
101
|
+
- `response_format` (optional): "json" or "markdown" (default: "markdown")
|
|
102
|
+
|
|
103
|
+
**Example:**
|
|
104
|
+
```
|
|
105
|
+
Get information about issue PROJ-456
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 2. `yandex_tracker_update_issue`
|
|
109
|
+
|
|
110
|
+
Update an existing issue.
|
|
111
|
+
|
|
112
|
+
**Parameters:**
|
|
113
|
+
- `issue_key` (required): Issue key
|
|
114
|
+
- `summary` (optional): New summary/title
|
|
115
|
+
- `description` (optional): New description
|
|
116
|
+
- `status` (optional): Status key (e.g., "open", "inProgress", "closed")
|
|
117
|
+
- `assignee` (optional): Assignee login
|
|
118
|
+
- `originalEstimation` (optional): Original estimate in ISO 8601 format (e.g., "PT8H", "P1D")
|
|
119
|
+
- `estimation` (optional): Remaining estimate in ISO 8601 format
|
|
120
|
+
- `spent` (optional): Time spent in ISO 8601 format
|
|
121
|
+
- `priority` (optional): Priority (e.g., "minor", "normal", "critical")
|
|
122
|
+
- `type` (optional): Issue type (e.g., "task", "bug")
|
|
123
|
+
|
|
124
|
+
**ISO 8601 Duration Examples:**
|
|
125
|
+
- `PT8H` - 8 hours
|
|
126
|
+
- `PT30M` - 30 minutes
|
|
127
|
+
- `P1D` - 1 day (8 business hours)
|
|
128
|
+
- `P1W` - 1 week (5 business days)
|
|
129
|
+
- `P2DT4H` - 2 days and 4 hours
|
|
130
|
+
|
|
131
|
+
**Example:**
|
|
132
|
+
```
|
|
133
|
+
Set estimate for PROJ-456 to 16 hours
|
|
134
|
+
Update issue PROJ-456: set status to "inProgress" and assignee to "john.doe"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 3. `yandex_tracker_add_worklog`
|
|
138
|
+
|
|
139
|
+
Add a time tracking record to an issue.
|
|
140
|
+
|
|
141
|
+
**Parameters:**
|
|
142
|
+
- `issue_key` (required): Issue key
|
|
143
|
+
- `duration` (required): Time spent in ISO 8601 format (e.g., "PT2H30M")
|
|
144
|
+
- `start` (optional): Start time in ISO 8601 format
|
|
145
|
+
- `comment` (optional): Description of work done
|
|
146
|
+
|
|
147
|
+
**Example:**
|
|
148
|
+
```
|
|
149
|
+
Log 3 hours of work on PROJ-456 with comment "Implemented user authentication"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Note:** Yandex Tracker uses business weeks (5 days) and business days (8 hours). When you log time, the system converts it accordingly.
|
|
153
|
+
|
|
154
|
+
### 4. `yandex_tracker_get_worklogs`
|
|
155
|
+
|
|
156
|
+
Get all time tracking records for an issue.
|
|
157
|
+
|
|
158
|
+
**Parameters:**
|
|
159
|
+
- `issue_key` (required): Issue key
|
|
160
|
+
- `response_format` (optional): "json" or "markdown" (default: "markdown")
|
|
161
|
+
|
|
162
|
+
**Example:**
|
|
163
|
+
```
|
|
164
|
+
Show all time logs for PROJ-456
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 5. `yandex_tracker_search_issues`
|
|
168
|
+
|
|
169
|
+
Search for issues using query language or filters.
|
|
170
|
+
|
|
171
|
+
**Parameters:**
|
|
172
|
+
- `query` (optional): Query string (e.g., "Queue: MYQUEUE Assignee: me() Status: open")
|
|
173
|
+
- `filter` (optional): Filter as object (alternative to query)
|
|
174
|
+
- `order` (optional): Sort order array (e.g., ["updated", "-status"])
|
|
175
|
+
- `limit` (optional): Max results (default: 20, max: 100)
|
|
176
|
+
- `offset` (optional): Pagination offset (default: 0)
|
|
177
|
+
- `response_format` (optional): "json" or "markdown" (default: "markdown")
|
|
178
|
+
|
|
179
|
+
**Example:**
|
|
180
|
+
```
|
|
181
|
+
Find all open issues assigned to me in queue PROJ
|
|
182
|
+
Search for bugs with high priority created this week
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Testing
|
|
186
|
+
|
|
187
|
+
Test the server using MCP Inspector:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
npm run inspector
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## API Reference
|
|
194
|
+
|
|
195
|
+
This server uses Yandex Tracker API v2. For more details:
|
|
196
|
+
- [API Documentation](https://yandex.ru/support/tracker/ru/concepts/access)
|
|
197
|
+
- [Getting Issue](https://yandex.cloud/en/docs/tracker/concepts/issues/get-issue)
|
|
198
|
+
- [Updating Issue](https://yandex.cloud/en/docs/tracker/concepts/issues/patch-issue)
|
|
199
|
+
- [Adding Worklog](https://yandex.cloud/en/docs/tracker/concepts/issues/new-worklog)
|
|
200
|
+
|
|
201
|
+
## Architecture
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
src/
|
|
205
|
+
├── index.ts # Main server implementation with tool handlers
|
|
206
|
+
├── client.ts # Yandex Tracker API client
|
|
207
|
+
└── schemas.ts # Zod validation schemas
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Development
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# Install dependencies
|
|
214
|
+
npm install
|
|
215
|
+
|
|
216
|
+
# Build TypeScript
|
|
217
|
+
npm run build
|
|
218
|
+
|
|
219
|
+
# Watch mode for development
|
|
220
|
+
npm run dev
|
|
221
|
+
|
|
222
|
+
# Start server
|
|
223
|
+
npm start
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Error Handling
|
|
227
|
+
|
|
228
|
+
The server provides helpful error messages:
|
|
229
|
+
- **Authentication errors**: Check your token and org ID
|
|
230
|
+
- **404 Not Found**: Issue key doesn't exist
|
|
231
|
+
- **400 Bad Request**: Invalid parameters or format
|
|
232
|
+
- **403 Forbidden**: Insufficient permissions
|
|
233
|
+
|
|
234
|
+
## Security
|
|
235
|
+
|
|
236
|
+
- Never commit your OAuth token or IAM token
|
|
237
|
+
- Use environment variables for credentials
|
|
238
|
+
- Tokens are sent via HTTPS to Yandex Tracker API
|
|
239
|
+
- Consider using IAM tokens for temporary access
|
|
240
|
+
|
|
241
|
+
## License
|
|
242
|
+
|
|
243
|
+
MIT
|
|
244
|
+
|
|
245
|
+
## Sources
|
|
246
|
+
|
|
247
|
+
This implementation is based on:
|
|
248
|
+
- [Yandex Tracker API Documentation](https://yandex.cloud/en/docs/tracker/user/API)
|
|
249
|
+
- [Python Tracker Client](https://github.com/yandex/yandex_tracker_client)
|
|
250
|
+
- [MCP Specification](https://modelcontextprotocol.io/)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yandex Tracker API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides methods to interact with Yandex Tracker API v2
|
|
5
|
+
* API Documentation: https://yandex.ru/support/tracker/ru/concepts/access
|
|
6
|
+
*/
|
|
7
|
+
interface YandexTrackerConfig {
|
|
8
|
+
token?: string;
|
|
9
|
+
iamToken?: string;
|
|
10
|
+
orgId?: string;
|
|
11
|
+
cloudOrgId?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class YandexTrackerClient {
|
|
14
|
+
private readonly authHeader;
|
|
15
|
+
private readonly orgIdHeader;
|
|
16
|
+
constructor(config: YandexTrackerConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Make an authenticated request to Yandex Tracker API
|
|
19
|
+
*/
|
|
20
|
+
private request;
|
|
21
|
+
/**
|
|
22
|
+
* Get issue by key
|
|
23
|
+
* GET /v2/issues/{issueKey}
|
|
24
|
+
*/
|
|
25
|
+
getIssue(issueKey: string): Promise<any>;
|
|
26
|
+
/**
|
|
27
|
+
* Update issue
|
|
28
|
+
* PATCH /v2/issues/{issueKey}
|
|
29
|
+
*/
|
|
30
|
+
updateIssue(issueKey: string, updates: Record<string, any>): Promise<any>;
|
|
31
|
+
/**
|
|
32
|
+
* Add worklog (time spent) to issue
|
|
33
|
+
* POST /v2/issues/{issueKey}/worklog
|
|
34
|
+
*/
|
|
35
|
+
addWorklog(issueKey: string, worklog: {
|
|
36
|
+
duration: string;
|
|
37
|
+
start?: string;
|
|
38
|
+
comment?: string;
|
|
39
|
+
}): Promise<any>;
|
|
40
|
+
/**
|
|
41
|
+
* Get worklogs for issue
|
|
42
|
+
* GET /v2/issues/{issueKey}/worklog
|
|
43
|
+
*/
|
|
44
|
+
getWorklogs(issueKey: string): Promise<any[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Search issues
|
|
47
|
+
* POST /v2/issues/_search
|
|
48
|
+
*/
|
|
49
|
+
searchIssues(params: {
|
|
50
|
+
query?: string;
|
|
51
|
+
filter?: Record<string, any>;
|
|
52
|
+
order?: string[];
|
|
53
|
+
limit?: number;
|
|
54
|
+
offset?: number;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
issues: any[];
|
|
57
|
+
total: number;
|
|
58
|
+
count: number;
|
|
59
|
+
offset: number;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,mBAAmB;IAoBvC;;OAEG;YACW,OAAO;IAwCrB;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI9C;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IA2B/E;;;OAGG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GACA,OAAO,CAAC,GAAG,CAAC;IAmBf;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAInD;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,GAAG,EAAE,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAoCH"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yandex Tracker API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides methods to interact with Yandex Tracker API v2
|
|
5
|
+
* API Documentation: https://yandex.ru/support/tracker/ru/concepts/access
|
|
6
|
+
*/
|
|
7
|
+
const API_BASE_URL = "https://api.tracker.yandex.net/v2";
|
|
8
|
+
export class YandexTrackerClient {
|
|
9
|
+
authHeader;
|
|
10
|
+
orgIdHeader;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
// Determine authentication method
|
|
13
|
+
if (config.iamToken) {
|
|
14
|
+
this.authHeader = `Bearer ${config.iamToken}`;
|
|
15
|
+
}
|
|
16
|
+
else if (config.token) {
|
|
17
|
+
this.authHeader = `OAuth ${config.token}`;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
throw new Error("Either token or iamToken must be provided");
|
|
21
|
+
}
|
|
22
|
+
// Determine organization ID
|
|
23
|
+
if (config.cloudOrgId) {
|
|
24
|
+
this.orgIdHeader = config.cloudOrgId;
|
|
25
|
+
}
|
|
26
|
+
else if (config.orgId) {
|
|
27
|
+
this.orgIdHeader = config.orgId;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
throw new Error("Either orgId or cloudOrgId must be provided");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Make an authenticated request to Yandex Tracker API
|
|
35
|
+
*/
|
|
36
|
+
async request(endpoint, options = {}) {
|
|
37
|
+
const url = `${API_BASE_URL}${endpoint}`;
|
|
38
|
+
const headers = {
|
|
39
|
+
Authorization: this.authHeader,
|
|
40
|
+
"X-Org-ID": this.orgIdHeader,
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
...options.headers,
|
|
43
|
+
};
|
|
44
|
+
const response = await fetch(url, {
|
|
45
|
+
...options,
|
|
46
|
+
headers,
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
let errorMessage = `API request failed: ${response.status} ${response.statusText}`;
|
|
50
|
+
try {
|
|
51
|
+
const errorData = await response.json();
|
|
52
|
+
if (errorData.errorMessages) {
|
|
53
|
+
errorMessage += `\nDetails: ${errorData.errorMessages.join(", ")}`;
|
|
54
|
+
}
|
|
55
|
+
else if (errorData.errors) {
|
|
56
|
+
errorMessage += `\nErrors: ${JSON.stringify(errorData.errors)}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// If parsing error response fails, use default message
|
|
61
|
+
}
|
|
62
|
+
throw new Error(errorMessage);
|
|
63
|
+
}
|
|
64
|
+
// Handle empty responses (e.g., 204 No Content)
|
|
65
|
+
if (response.status === 204) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return response.json();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get issue by key
|
|
72
|
+
* GET /v2/issues/{issueKey}
|
|
73
|
+
*/
|
|
74
|
+
async getIssue(issueKey) {
|
|
75
|
+
return this.request(`/issues/${issueKey}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Update issue
|
|
79
|
+
* PATCH /v2/issues/{issueKey}
|
|
80
|
+
*/
|
|
81
|
+
async updateIssue(issueKey, updates) {
|
|
82
|
+
// Transform simple values to Yandex Tracker format
|
|
83
|
+
const body = {};
|
|
84
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
85
|
+
if (value === undefined)
|
|
86
|
+
continue;
|
|
87
|
+
// Fields that need object format
|
|
88
|
+
if (["status", "type", "priority"].includes(key)) {
|
|
89
|
+
body[key] = { key: value };
|
|
90
|
+
}
|
|
91
|
+
// Assignee can be string (login) or object
|
|
92
|
+
else if (key === "assignee") {
|
|
93
|
+
body[key] = typeof value === "string" ? value : value;
|
|
94
|
+
}
|
|
95
|
+
// Direct fields
|
|
96
|
+
else {
|
|
97
|
+
body[key] = value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return this.request(`/issues/${issueKey}`, {
|
|
101
|
+
method: "PATCH",
|
|
102
|
+
body: JSON.stringify(body),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Add worklog (time spent) to issue
|
|
107
|
+
* POST /v2/issues/{issueKey}/worklog
|
|
108
|
+
*/
|
|
109
|
+
async addWorklog(issueKey, worklog) {
|
|
110
|
+
const body = {
|
|
111
|
+
duration: worklog.duration,
|
|
112
|
+
};
|
|
113
|
+
if (worklog.start) {
|
|
114
|
+
body.start = worklog.start;
|
|
115
|
+
}
|
|
116
|
+
if (worklog.comment) {
|
|
117
|
+
body.comment = worklog.comment;
|
|
118
|
+
}
|
|
119
|
+
return this.request(`/issues/${issueKey}/worklog`, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
body: JSON.stringify(body),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get worklogs for issue
|
|
126
|
+
* GET /v2/issues/{issueKey}/worklog
|
|
127
|
+
*/
|
|
128
|
+
async getWorklogs(issueKey) {
|
|
129
|
+
return this.request(`/issues/${issueKey}/worklog`);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Search issues
|
|
133
|
+
* POST /v2/issues/_search
|
|
134
|
+
*/
|
|
135
|
+
async searchIssues(params) {
|
|
136
|
+
const body = {};
|
|
137
|
+
if (params.query) {
|
|
138
|
+
body.query = params.query;
|
|
139
|
+
}
|
|
140
|
+
if (params.filter) {
|
|
141
|
+
body.filter = params.filter;
|
|
142
|
+
}
|
|
143
|
+
if (params.order) {
|
|
144
|
+
body.order = params.order;
|
|
145
|
+
}
|
|
146
|
+
// Add pagination parameters as query params
|
|
147
|
+
const queryParams = new URLSearchParams();
|
|
148
|
+
const perPage = params.limit || 20;
|
|
149
|
+
const page = Math.floor((params.offset || 0) / perPage) + 1;
|
|
150
|
+
queryParams.append("perPage", perPage.toString());
|
|
151
|
+
queryParams.append("page", page.toString());
|
|
152
|
+
const endpoint = `/issues/_search?${queryParams.toString()}`;
|
|
153
|
+
const issues = await this.request(endpoint, {
|
|
154
|
+
method: "POST",
|
|
155
|
+
body: JSON.stringify(body),
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
issues: Array.isArray(issues) ? issues : [],
|
|
159
|
+
total: issues.length, // Note: Yandex Tracker doesn't return total count in all cases
|
|
160
|
+
count: issues.length,
|
|
161
|
+
offset: params.offset || 0,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { YandexTrackerClient } from "./client.js";
|
|
6
|
+
import { GetIssueArgsSchema, UpdateIssueArgsSchema, AddWorklogArgsSchema, GetWorklogsArgsSchema, SearchIssuesArgsSchema, } from "./schemas.js";
|
|
7
|
+
// Environment variables
|
|
8
|
+
const API_TOKEN = process.env.YANDEX_TRACKER_TOKEN;
|
|
9
|
+
const ORG_ID = process.env.YANDEX_TRACKER_ORG_ID;
|
|
10
|
+
const IAM_TOKEN = process.env.YANDEX_TRACKER_IAM_TOKEN;
|
|
11
|
+
const CLOUD_ORG_ID = process.env.YANDEX_TRACKER_CLOUD_ORG_ID;
|
|
12
|
+
if (!API_TOKEN && !IAM_TOKEN) {
|
|
13
|
+
console.error("Error: YANDEX_TRACKER_TOKEN or YANDEX_TRACKER_IAM_TOKEN must be set", { stdio: "inherit" });
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
if (!ORG_ID && !CLOUD_ORG_ID) {
|
|
17
|
+
console.error("Error: YANDEX_TRACKER_ORG_ID or YANDEX_TRACKER_CLOUD_ORG_ID must be set", { stdio: "inherit" });
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Initialize Yandex Tracker client
|
|
21
|
+
const client = new YandexTrackerClient({
|
|
22
|
+
token: API_TOKEN,
|
|
23
|
+
iamToken: IAM_TOKEN,
|
|
24
|
+
orgId: ORG_ID,
|
|
25
|
+
cloudOrgId: CLOUD_ORG_ID,
|
|
26
|
+
});
|
|
27
|
+
// Initialize MCP server
|
|
28
|
+
const server = new Server({
|
|
29
|
+
name: "yandex-tracker-mcp-server",
|
|
30
|
+
version: "1.0.0",
|
|
31
|
+
}, {
|
|
32
|
+
capabilities: {
|
|
33
|
+
tools: {},
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
// Define available tools
|
|
37
|
+
const tools = [
|
|
38
|
+
{
|
|
39
|
+
name: "yandex_tracker_get_issue",
|
|
40
|
+
description: "Get detailed information about a specific issue by its key (e.g., MYQUEUE-123). Returns issue data including status, assignee, description, estimates, and more.",
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
issue_key: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "Issue key (e.g., MYQUEUE-123)",
|
|
47
|
+
},
|
|
48
|
+
response_format: {
|
|
49
|
+
type: "string",
|
|
50
|
+
enum: ["json", "markdown"],
|
|
51
|
+
description: "Response format: 'json' for structured data or 'markdown' for human-readable format",
|
|
52
|
+
default: "markdown",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
required: ["issue_key"],
|
|
56
|
+
},
|
|
57
|
+
annotations: {
|
|
58
|
+
readOnlyHint: true,
|
|
59
|
+
destructiveHint: false,
|
|
60
|
+
idempotentHint: true,
|
|
61
|
+
openWorldHint: true,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "yandex_tracker_update_issue",
|
|
66
|
+
description: "Update an existing issue. Can modify fields like summary, description, status, assignee, estimates (originalEstimation, estimation), spent time, priority, and more. Use ISO 8601 duration format for time fields (e.g., 'PT8H' for 8 hours, 'P1D' for 1 day, 'P1W' for 1 week).",
|
|
67
|
+
inputSchema: {
|
|
68
|
+
type: "object",
|
|
69
|
+
properties: {
|
|
70
|
+
issue_key: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Issue key (e.g., MYQUEUE-123)",
|
|
73
|
+
},
|
|
74
|
+
summary: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Issue summary/title",
|
|
77
|
+
},
|
|
78
|
+
description: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Issue description",
|
|
81
|
+
},
|
|
82
|
+
status: {
|
|
83
|
+
type: "string",
|
|
84
|
+
description: "Status key or name (e.g., 'open', 'inProgress', 'closed')",
|
|
85
|
+
},
|
|
86
|
+
assignee: {
|
|
87
|
+
type: "string",
|
|
88
|
+
description: "Assignee login or ID",
|
|
89
|
+
},
|
|
90
|
+
originalEstimation: {
|
|
91
|
+
type: "string",
|
|
92
|
+
description: "Original time estimate in ISO 8601 duration format (e.g., 'PT8H', 'P1D', 'P1W')",
|
|
93
|
+
},
|
|
94
|
+
estimation: {
|
|
95
|
+
type: "string",
|
|
96
|
+
description: "Remaining time estimate in ISO 8601 duration format (e.g., 'PT4H', 'P2D')",
|
|
97
|
+
},
|
|
98
|
+
spent: {
|
|
99
|
+
type: "string",
|
|
100
|
+
description: "Time spent in ISO 8601 duration format (e.g., 'PT2H')",
|
|
101
|
+
},
|
|
102
|
+
priority: {
|
|
103
|
+
type: "string",
|
|
104
|
+
description: "Priority key or name (e.g., 'minor', 'normal', 'critical')",
|
|
105
|
+
},
|
|
106
|
+
type: {
|
|
107
|
+
type: "string",
|
|
108
|
+
description: "Issue type key or name (e.g., 'task', 'bug', 'improvement')",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
required: ["issue_key"],
|
|
112
|
+
},
|
|
113
|
+
annotations: {
|
|
114
|
+
readOnlyHint: false,
|
|
115
|
+
destructiveHint: false,
|
|
116
|
+
idempotentHint: false,
|
|
117
|
+
openWorldHint: true,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "yandex_tracker_add_worklog",
|
|
122
|
+
description: "Add a time tracking record (worklog) to an issue. Records how much time was spent working on the issue. Duration is in ISO 8601 format (e.g., 'PT2H30M' for 2 hours 30 minutes, 'PT8H' for 8 hours). Note: Yandex Tracker uses business weeks (5 days) and business days (8 hours).",
|
|
123
|
+
inputSchema: {
|
|
124
|
+
type: "object",
|
|
125
|
+
properties: {
|
|
126
|
+
issue_key: {
|
|
127
|
+
type: "string",
|
|
128
|
+
description: "Issue key (e.g., MYQUEUE-123)",
|
|
129
|
+
},
|
|
130
|
+
duration: {
|
|
131
|
+
type: "string",
|
|
132
|
+
description: "Time spent in ISO 8601 duration format (e.g., 'PT2H', 'PT30M', 'P1D')",
|
|
133
|
+
},
|
|
134
|
+
start: {
|
|
135
|
+
type: "string",
|
|
136
|
+
description: "Start date and time in ISO 8601 format (e.g., '2024-01-15T10:00:00+03:00'). If not specified, current time is used.",
|
|
137
|
+
},
|
|
138
|
+
comment: {
|
|
139
|
+
type: "string",
|
|
140
|
+
description: "Optional comment describing the work done",
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
required: ["issue_key", "duration"],
|
|
144
|
+
},
|
|
145
|
+
annotations: {
|
|
146
|
+
readOnlyHint: false,
|
|
147
|
+
destructiveHint: false,
|
|
148
|
+
idempotentHint: false,
|
|
149
|
+
openWorldHint: true,
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "yandex_tracker_get_worklogs",
|
|
154
|
+
description: "Get all time tracking records (worklogs) for a specific issue. Returns a list of all logged time entries with duration, start time, author, and comments.",
|
|
155
|
+
inputSchema: {
|
|
156
|
+
type: "object",
|
|
157
|
+
properties: {
|
|
158
|
+
issue_key: {
|
|
159
|
+
type: "string",
|
|
160
|
+
description: "Issue key (e.g., MYQUEUE-123)",
|
|
161
|
+
},
|
|
162
|
+
response_format: {
|
|
163
|
+
type: "string",
|
|
164
|
+
enum: ["json", "markdown"],
|
|
165
|
+
description: "Response format: 'json' for structured data or 'markdown' for human-readable format",
|
|
166
|
+
default: "markdown",
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
required: ["issue_key"],
|
|
170
|
+
},
|
|
171
|
+
annotations: {
|
|
172
|
+
readOnlyHint: true,
|
|
173
|
+
destructiveHint: false,
|
|
174
|
+
idempotentHint: true,
|
|
175
|
+
openWorldHint: true,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "yandex_tracker_search_issues",
|
|
180
|
+
description: "Search for issues using Yandex Tracker query language. Supports filters like queue, assignee, status, etc. Returns a list of matching issues with pagination support.",
|
|
181
|
+
inputSchema: {
|
|
182
|
+
type: "object",
|
|
183
|
+
properties: {
|
|
184
|
+
query: {
|
|
185
|
+
type: "string",
|
|
186
|
+
description: "Search query in Yandex Tracker query language (e.g., 'Queue: MYQUEUE Assignee: me() Status: open')",
|
|
187
|
+
},
|
|
188
|
+
filter: {
|
|
189
|
+
type: "object",
|
|
190
|
+
description: "Alternative to query: filter as object (e.g., {queue: 'MYQUEUE', assignee: 'user123'})",
|
|
191
|
+
},
|
|
192
|
+
order: {
|
|
193
|
+
type: "array",
|
|
194
|
+
items: { type: "string" },
|
|
195
|
+
description: "Sort order (e.g., ['updated', '-status', '+priority']). Prefix with '-' for descending, '+' for ascending",
|
|
196
|
+
},
|
|
197
|
+
limit: {
|
|
198
|
+
type: "number",
|
|
199
|
+
description: "Maximum number of results to return (default: 20, max: 100)",
|
|
200
|
+
default: 20,
|
|
201
|
+
},
|
|
202
|
+
offset: {
|
|
203
|
+
type: "number",
|
|
204
|
+
description: "Offset for pagination (default: 0)",
|
|
205
|
+
default: 0,
|
|
206
|
+
},
|
|
207
|
+
response_format: {
|
|
208
|
+
type: "string",
|
|
209
|
+
enum: ["json", "markdown"],
|
|
210
|
+
description: "Response format: 'json' for structured data or 'markdown' for human-readable format",
|
|
211
|
+
default: "markdown",
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
annotations: {
|
|
216
|
+
readOnlyHint: true,
|
|
217
|
+
destructiveHint: false,
|
|
218
|
+
idempotentHint: true,
|
|
219
|
+
openWorldHint: true,
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
// List available tools
|
|
224
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
225
|
+
return { tools };
|
|
226
|
+
});
|
|
227
|
+
// Handle tool calls
|
|
228
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
229
|
+
try {
|
|
230
|
+
const { name, arguments: args } = request.params;
|
|
231
|
+
switch (name) {
|
|
232
|
+
case "yandex_tracker_get_issue": {
|
|
233
|
+
const parsed = GetIssueArgsSchema.parse(args);
|
|
234
|
+
const issue = await client.getIssue(parsed.issue_key);
|
|
235
|
+
const format = parsed.response_format || "markdown";
|
|
236
|
+
if (format === "json") {
|
|
237
|
+
return {
|
|
238
|
+
content: [
|
|
239
|
+
{
|
|
240
|
+
type: "text",
|
|
241
|
+
text: JSON.stringify(issue, null, 2),
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
const markdown = formatIssueAsMarkdown(issue);
|
|
248
|
+
return {
|
|
249
|
+
content: [
|
|
250
|
+
{
|
|
251
|
+
type: "text",
|
|
252
|
+
text: markdown,
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
case "yandex_tracker_update_issue": {
|
|
259
|
+
const parsed = UpdateIssueArgsSchema.parse(args);
|
|
260
|
+
const { issue_key, ...updates } = parsed;
|
|
261
|
+
const updatedIssue = await client.updateIssue(issue_key, updates);
|
|
262
|
+
return {
|
|
263
|
+
content: [
|
|
264
|
+
{
|
|
265
|
+
type: "text",
|
|
266
|
+
text: `✓ Issue ${issue_key} updated successfully\n\n${formatIssueAsMarkdown(updatedIssue)}`,
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
case "yandex_tracker_add_worklog": {
|
|
272
|
+
const parsed = AddWorklogArgsSchema.parse(args);
|
|
273
|
+
const { issue_key, ...worklogData } = parsed;
|
|
274
|
+
const worklog = await client.addWorklog(issue_key, worklogData);
|
|
275
|
+
return {
|
|
276
|
+
content: [
|
|
277
|
+
{
|
|
278
|
+
type: "text",
|
|
279
|
+
text: `✓ Worklog added to ${issue_key}\n\nDuration: ${worklog.duration}\nStart: ${worklog.start}${worklog.comment ? `\nComment: ${worklog.comment}` : ""}`,
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
case "yandex_tracker_get_worklogs": {
|
|
285
|
+
const parsed = GetWorklogsArgsSchema.parse(args);
|
|
286
|
+
const worklogs = await client.getWorklogs(parsed.issue_key);
|
|
287
|
+
const format = parsed.response_format || "markdown";
|
|
288
|
+
if (format === "json") {
|
|
289
|
+
return {
|
|
290
|
+
content: [
|
|
291
|
+
{
|
|
292
|
+
type: "text",
|
|
293
|
+
text: JSON.stringify(worklogs, null, 2),
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
const markdown = formatWorklogsAsMarkdown(worklogs);
|
|
300
|
+
return {
|
|
301
|
+
content: [
|
|
302
|
+
{
|
|
303
|
+
type: "text",
|
|
304
|
+
text: markdown,
|
|
305
|
+
},
|
|
306
|
+
],
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
case "yandex_tracker_search_issues": {
|
|
311
|
+
const parsed = SearchIssuesArgsSchema.parse(args);
|
|
312
|
+
const result = await client.searchIssues(parsed);
|
|
313
|
+
const format = parsed.response_format || "markdown";
|
|
314
|
+
if (format === "json") {
|
|
315
|
+
return {
|
|
316
|
+
content: [
|
|
317
|
+
{
|
|
318
|
+
type: "text",
|
|
319
|
+
text: JSON.stringify(result, null, 2),
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const markdown = formatSearchResultsAsMarkdown(result);
|
|
326
|
+
return {
|
|
327
|
+
content: [
|
|
328
|
+
{
|
|
329
|
+
type: "text",
|
|
330
|
+
text: markdown,
|
|
331
|
+
},
|
|
332
|
+
],
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
default:
|
|
337
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
342
|
+
return {
|
|
343
|
+
content: [
|
|
344
|
+
{
|
|
345
|
+
type: "text",
|
|
346
|
+
text: `Error: ${errorMessage}`,
|
|
347
|
+
},
|
|
348
|
+
],
|
|
349
|
+
isError: true,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
// Formatting helpers
|
|
354
|
+
function formatIssueAsMarkdown(issue) {
|
|
355
|
+
let md = `# ${issue.key}: ${issue.summary}\n\n`;
|
|
356
|
+
md += `**Status:** ${issue.status?.display || issue.status?.key || "N/A"}\n`;
|
|
357
|
+
md += `**Type:** ${issue.type?.display || issue.type?.key || "N/A"}\n`;
|
|
358
|
+
md += `**Priority:** ${issue.priority?.display || issue.priority?.key || "N/A"}\n`;
|
|
359
|
+
md += `**Assignee:** ${issue.assignee?.display || "Unassigned"}\n`;
|
|
360
|
+
md += `**Created:** ${issue.createdAt || "N/A"}\n`;
|
|
361
|
+
md += `**Updated:** ${issue.updatedAt || "N/A"}\n\n`;
|
|
362
|
+
if (issue.originalEstimation) {
|
|
363
|
+
md += `**Original Estimate:** ${issue.originalEstimation}\n`;
|
|
364
|
+
}
|
|
365
|
+
if (issue.estimation) {
|
|
366
|
+
md += `**Remaining Estimate:** ${issue.estimation}\n`;
|
|
367
|
+
}
|
|
368
|
+
if (issue.spent) {
|
|
369
|
+
md += `**Time Spent:** ${issue.spent}\n`;
|
|
370
|
+
}
|
|
371
|
+
if (issue.description) {
|
|
372
|
+
md += `\n## Description\n\n${issue.description}\n`;
|
|
373
|
+
}
|
|
374
|
+
return md;
|
|
375
|
+
}
|
|
376
|
+
function formatWorklogsAsMarkdown(worklogs) {
|
|
377
|
+
if (!worklogs || worklogs.length === 0) {
|
|
378
|
+
return "No worklog entries found.";
|
|
379
|
+
}
|
|
380
|
+
let md = `# Worklog Entries (${worklogs.length})\n\n`;
|
|
381
|
+
for (const log of worklogs) {
|
|
382
|
+
md += `## ${log.createdBy?.display || "Unknown"}\n`;
|
|
383
|
+
md += `**Duration:** ${log.duration}\n`;
|
|
384
|
+
md += `**Start:** ${log.start}\n`;
|
|
385
|
+
md += `**Created:** ${log.createdAt}\n`;
|
|
386
|
+
if (log.comment) {
|
|
387
|
+
md += `**Comment:** ${log.comment}\n`;
|
|
388
|
+
}
|
|
389
|
+
md += `\n`;
|
|
390
|
+
}
|
|
391
|
+
return md;
|
|
392
|
+
}
|
|
393
|
+
function formatSearchResultsAsMarkdown(result) {
|
|
394
|
+
const { issues, total, count, offset } = result;
|
|
395
|
+
if (!issues || issues.length === 0) {
|
|
396
|
+
return "No issues found.";
|
|
397
|
+
}
|
|
398
|
+
let md = `# Search Results\n\n`;
|
|
399
|
+
md += `Found ${total} issues (showing ${count} from offset ${offset})\n\n`;
|
|
400
|
+
for (const issue of issues) {
|
|
401
|
+
md += `## ${issue.key}: ${issue.summary}\n`;
|
|
402
|
+
md += `**Status:** ${issue.status?.display || "N/A"} | `;
|
|
403
|
+
md += `**Priority:** ${issue.priority?.display || "N/A"} | `;
|
|
404
|
+
md += `**Assignee:** ${issue.assignee?.display || "Unassigned"}\n`;
|
|
405
|
+
md += `**Updated:** ${issue.updatedAt}\n\n`;
|
|
406
|
+
}
|
|
407
|
+
if (offset + count < total) {
|
|
408
|
+
md += `\n---\n*Use offset=${offset + count} to see more results*\n`;
|
|
409
|
+
}
|
|
410
|
+
return md;
|
|
411
|
+
}
|
|
412
|
+
// Start server
|
|
413
|
+
async function main() {
|
|
414
|
+
const transport = new StdioServerTransport();
|
|
415
|
+
await server.connect(transport);
|
|
416
|
+
console.error("Yandex Tracker MCP Server running on stdio");
|
|
417
|
+
}
|
|
418
|
+
main().catch((error) => {
|
|
419
|
+
console.error("Server error:", error);
|
|
420
|
+
process.exit(1);
|
|
421
|
+
});
|
|
422
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const GetIssueArgsSchema: z.ZodObject<{
|
|
3
|
+
issue_key: z.ZodString;
|
|
4
|
+
response_format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["json", "markdown"]>>>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
issue_key: string;
|
|
7
|
+
response_format: "json" | "markdown";
|
|
8
|
+
}, {
|
|
9
|
+
issue_key: string;
|
|
10
|
+
response_format?: "json" | "markdown" | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type GetIssueArgs = z.infer<typeof GetIssueArgsSchema>;
|
|
13
|
+
export declare const UpdateIssueArgsSchema: z.ZodObject<{
|
|
14
|
+
issue_key: z.ZodString;
|
|
15
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
16
|
+
description: z.ZodOptional<z.ZodString>;
|
|
17
|
+
status: z.ZodOptional<z.ZodString>;
|
|
18
|
+
assignee: z.ZodOptional<z.ZodString>;
|
|
19
|
+
originalEstimation: z.ZodOptional<z.ZodString>;
|
|
20
|
+
estimation: z.ZodOptional<z.ZodString>;
|
|
21
|
+
spent: z.ZodOptional<z.ZodString>;
|
|
22
|
+
priority: z.ZodOptional<z.ZodString>;
|
|
23
|
+
type: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
issue_key: string;
|
|
26
|
+
status?: string | undefined;
|
|
27
|
+
type?: string | undefined;
|
|
28
|
+
priority?: string | undefined;
|
|
29
|
+
assignee?: string | undefined;
|
|
30
|
+
summary?: string | undefined;
|
|
31
|
+
description?: string | undefined;
|
|
32
|
+
originalEstimation?: string | undefined;
|
|
33
|
+
estimation?: string | undefined;
|
|
34
|
+
spent?: string | undefined;
|
|
35
|
+
}, {
|
|
36
|
+
issue_key: string;
|
|
37
|
+
status?: string | undefined;
|
|
38
|
+
type?: string | undefined;
|
|
39
|
+
priority?: string | undefined;
|
|
40
|
+
assignee?: string | undefined;
|
|
41
|
+
summary?: string | undefined;
|
|
42
|
+
description?: string | undefined;
|
|
43
|
+
originalEstimation?: string | undefined;
|
|
44
|
+
estimation?: string | undefined;
|
|
45
|
+
spent?: string | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
export type UpdateIssueArgs = z.infer<typeof UpdateIssueArgsSchema>;
|
|
48
|
+
export declare const AddWorklogArgsSchema: z.ZodObject<{
|
|
49
|
+
issue_key: z.ZodString;
|
|
50
|
+
duration: z.ZodString;
|
|
51
|
+
start: z.ZodOptional<z.ZodString>;
|
|
52
|
+
comment: z.ZodOptional<z.ZodString>;
|
|
53
|
+
}, "strip", z.ZodTypeAny, {
|
|
54
|
+
duration: string;
|
|
55
|
+
issue_key: string;
|
|
56
|
+
start?: string | undefined;
|
|
57
|
+
comment?: string | undefined;
|
|
58
|
+
}, {
|
|
59
|
+
duration: string;
|
|
60
|
+
issue_key: string;
|
|
61
|
+
start?: string | undefined;
|
|
62
|
+
comment?: string | undefined;
|
|
63
|
+
}>;
|
|
64
|
+
export type AddWorklogArgs = z.infer<typeof AddWorklogArgsSchema>;
|
|
65
|
+
export declare const GetWorklogsArgsSchema: z.ZodObject<{
|
|
66
|
+
issue_key: z.ZodString;
|
|
67
|
+
response_format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["json", "markdown"]>>>;
|
|
68
|
+
}, "strip", z.ZodTypeAny, {
|
|
69
|
+
issue_key: string;
|
|
70
|
+
response_format: "json" | "markdown";
|
|
71
|
+
}, {
|
|
72
|
+
issue_key: string;
|
|
73
|
+
response_format?: "json" | "markdown" | undefined;
|
|
74
|
+
}>;
|
|
75
|
+
export type GetWorklogsArgs = z.infer<typeof GetWorklogsArgsSchema>;
|
|
76
|
+
export declare const SearchIssuesArgsSchema: z.ZodObject<{
|
|
77
|
+
query: z.ZodOptional<z.ZodString>;
|
|
78
|
+
filter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
79
|
+
order: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
80
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
81
|
+
offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
82
|
+
response_format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["json", "markdown"]>>>;
|
|
83
|
+
}, "strip", z.ZodTypeAny, {
|
|
84
|
+
offset: number;
|
|
85
|
+
response_format: "json" | "markdown";
|
|
86
|
+
limit: number;
|
|
87
|
+
filter?: Record<string, any> | undefined;
|
|
88
|
+
query?: string | undefined;
|
|
89
|
+
order?: string[] | undefined;
|
|
90
|
+
}, {
|
|
91
|
+
filter?: Record<string, any> | undefined;
|
|
92
|
+
query?: string | undefined;
|
|
93
|
+
order?: string[] | undefined;
|
|
94
|
+
offset?: number | undefined;
|
|
95
|
+
response_format?: "json" | "markdown" | undefined;
|
|
96
|
+
limit?: number | undefined;
|
|
97
|
+
}>;
|
|
98
|
+
export type SearchIssuesArgs = z.infer<typeof SearchIssuesArgsSchema>;
|
|
99
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,kBAAkB;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAG9D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAGpE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAU/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAGlE,eAAO,MAAM,qBAAqB;;;;;;;;;EAOhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAGpE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EA4BjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// Get issue schema
|
|
3
|
+
export const GetIssueArgsSchema = z.object({
|
|
4
|
+
issue_key: z.string().describe("Issue key (e.g., MYQUEUE-123)"),
|
|
5
|
+
response_format: z
|
|
6
|
+
.enum(["json", "markdown"])
|
|
7
|
+
.optional()
|
|
8
|
+
.default("markdown")
|
|
9
|
+
.describe("Response format"),
|
|
10
|
+
});
|
|
11
|
+
// Update issue schema
|
|
12
|
+
export const UpdateIssueArgsSchema = z.object({
|
|
13
|
+
issue_key: z.string().describe("Issue key (e.g., MYQUEUE-123)"),
|
|
14
|
+
summary: z.string().optional().describe("Issue summary/title"),
|
|
15
|
+
description: z.string().optional().describe("Issue description"),
|
|
16
|
+
status: z.string().optional().describe("Status key or name"),
|
|
17
|
+
assignee: z.string().optional().describe("Assignee login or ID"),
|
|
18
|
+
originalEstimation: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe("Original time estimate in ISO 8601 duration format"),
|
|
22
|
+
estimation: z
|
|
23
|
+
.string()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Remaining time estimate in ISO 8601 duration format"),
|
|
26
|
+
spent: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Time spent in ISO 8601 duration format"),
|
|
30
|
+
priority: z.string().optional().describe("Priority key or name"),
|
|
31
|
+
type: z.string().optional().describe("Issue type key or name"),
|
|
32
|
+
});
|
|
33
|
+
// Add worklog schema
|
|
34
|
+
export const AddWorklogArgsSchema = z.object({
|
|
35
|
+
issue_key: z.string().describe("Issue key (e.g., MYQUEUE-123)"),
|
|
36
|
+
duration: z
|
|
37
|
+
.string()
|
|
38
|
+
.describe("Time spent in ISO 8601 duration format (e.g., 'PT2H', 'P1D')"),
|
|
39
|
+
start: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Start date and time in ISO 8601 format"),
|
|
43
|
+
comment: z.string().optional().describe("Optional comment"),
|
|
44
|
+
});
|
|
45
|
+
// Get worklogs schema
|
|
46
|
+
export const GetWorklogsArgsSchema = z.object({
|
|
47
|
+
issue_key: z.string().describe("Issue key (e.g., MYQUEUE-123)"),
|
|
48
|
+
response_format: z
|
|
49
|
+
.enum(["json", "markdown"])
|
|
50
|
+
.optional()
|
|
51
|
+
.default("markdown")
|
|
52
|
+
.describe("Response format"),
|
|
53
|
+
});
|
|
54
|
+
// Search issues schema
|
|
55
|
+
export const SearchIssuesArgsSchema = z.object({
|
|
56
|
+
query: z
|
|
57
|
+
.string()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Search query in Yandex Tracker query language"),
|
|
60
|
+
filter: z
|
|
61
|
+
.record(z.any())
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("Filter as object"),
|
|
64
|
+
order: z
|
|
65
|
+
.array(z.string())
|
|
66
|
+
.optional()
|
|
67
|
+
.describe("Sort order"),
|
|
68
|
+
limit: z
|
|
69
|
+
.number()
|
|
70
|
+
.optional()
|
|
71
|
+
.default(20)
|
|
72
|
+
.describe("Maximum number of results"),
|
|
73
|
+
offset: z
|
|
74
|
+
.number()
|
|
75
|
+
.optional()
|
|
76
|
+
.default(0)
|
|
77
|
+
.describe("Offset for pagination"),
|
|
78
|
+
response_format: z
|
|
79
|
+
.enum(["json", "markdown"])
|
|
80
|
+
.optional()
|
|
81
|
+
.default("markdown")
|
|
82
|
+
.describe("Response format"),
|
|
83
|
+
});
|
|
84
|
+
//# 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/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gor-dev/yandex-tracker-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Yandex Tracker API integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"yandex-tracker-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"inspector": "npx @modelcontextprotocol/inspector dist/index.js",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"mcp",
|
|
24
|
+
"yandex-tracker",
|
|
25
|
+
"model-context-protocol",
|
|
26
|
+
"yandex",
|
|
27
|
+
"tracker",
|
|
28
|
+
"issue-tracking",
|
|
29
|
+
"project-management",
|
|
30
|
+
"claude",
|
|
31
|
+
"ai"
|
|
32
|
+
],
|
|
33
|
+
"author": "Sergey Gorban",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/gorban-dev/yandex-tracker-mcp-server.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/gorban-dev/yandex-tracker-mcp-server/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/gorban-dev/yandex-tracker-mcp-server#readme",
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18.0.0"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
48
|
+
"zod": "^3.24.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.10.5",
|
|
52
|
+
"typescript": "^5.7.3"
|
|
53
|
+
}
|
|
54
|
+
}
|