@che-tools/kaiten-mcp 0.0.0-stage → 1.0.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 (3) hide show
  1. package/README.md +113 -2
  2. package/dist/index.js +11 -0
  3. package/package.json +39 -4
package/README.md CHANGED
@@ -1,3 +1,114 @@
1
- # Temporary Holding Version
1
+ # @che-tools/kaiten-mcp
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ MCP-сервер для [Kaiten](https://kaiten.ru/): пространства, доски, карточки, комментарии, чек-листы, внешние ссылки, поиск.
4
+
5
+ ## Требования
6
+
7
+ - Node.js >= 18
8
+ - Аккаунт Kaiten и API-токен
9
+
10
+ Токен: Настройки профиля → Ключ доступа API → Создать ключ.
11
+ Домен — поддомен инстанса (`mycompany` для `mycompany.kaiten.ru`).
12
+
13
+ ## Переменные окружения
14
+
15
+ | Переменная | Описание |
16
+ | --------------- | -------------------------------- |
17
+ | `KAITEN_DOMAIN` | Поддомен (например, `mycompany`) |
18
+ | `KAITEN_TOKEN` | Bearer-токен API Kaiten |
19
+
20
+ ## Быстрый старт
21
+
22
+ ```bash
23
+ KAITEN_DOMAIN=mycompany KAITEN_TOKEN=xxx npx -y @che-tools/kaiten-mcp
24
+ ```
25
+
26
+ ## Cursor
27
+
28
+ `~/.cursor/mcp.json` или конфиг проекта:
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "kaiten": {
34
+ "command": "npx",
35
+ "args": ["-y", "@che-tools/kaiten-mcp"],
36
+ "env": {
37
+ "KAITEN_DOMAIN": "mycompany",
38
+ "KAITEN_TOKEN": "your-token"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ ## Другие клиенты
46
+
47
+ Конфиг везде один и тот же: `npx` + `-y` + `@che-tools/kaiten-mcp` и переменные `KAITEN_DOMAIN` / `KAITEN_TOKEN`.
48
+
49
+ | Клиент | Куда писать |
50
+ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
51
+ | GitHub Copilot (VS Code) | User MCP config или `.vscode/mcp.json` (`servers`, `"type": "stdio"`) |
52
+ | Claude Desktop | macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`; Windows: `%APPDATA%\Claude\claude_desktop_config.json` (или Settings → Developer → Edit Config) |
53
+ | Claude Code | `claude mcp add --scope user kaiten -e KAITEN_DOMAIN=… -e KAITEN_TOKEN=… -- npx -y @che-tools/kaiten-mcp` · либо `~/.claude.json` / `.mcp.json` |
54
+ | Qwen CLI | `qwen mcp add … -- npx -y @che-tools/kaiten-mcp` · `.qwen/settings.json` |
55
+ | Gemini CLI | `gemini mcp add … -- npx -y @che-tools/kaiten-mcp` · `~/.gemini/settings.json` |
56
+ | KiloCode | Global/Project MCP (`mcp_settings.json` / `.kilocode/mcp.json`) |
57
+
58
+ Пример JSON (Claude Desktop, Claude Code, Qwen, Gemini, KiloCode, Cursor):
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "kaiten": {
64
+ "command": "npx",
65
+ "args": ["-y", "@che-tools/kaiten-mcp"],
66
+ "env": {
67
+ "KAITEN_DOMAIN": "mycompany",
68
+ "KAITEN_TOKEN": "your-token"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ Для Copilot — та же схема, но ключ `servers` и поле `"type": "stdio"`.
76
+
77
+ ## space_id
78
+
79
+ Из ссылки на карточку: `space/20874/boards/card/59923149` → `space_id=20874`, `card_id=59923149`.
80
+ Параметр опциональный; при указании запросы идут через `/spaces/:spaceId/cards/...`.
81
+
82
+ ## Инструменты
83
+
84
+ | Инструмент | Описание |
85
+ | ------------------------------ | --------------------------- |
86
+ | `kaiten_list_spaces` | Список пространств |
87
+ | `kaiten_list_boards` | Список досок |
88
+ | `kaiten_get_board` | Доска по id |
89
+ | `kaiten_list_users` | Список пользователей |
90
+ | `kaiten_get_card` | Карточка по id |
91
+ | `kaiten_create_card` | Создать карточку |
92
+ | `kaiten_move_card` | Переместить карточку |
93
+ | `kaiten_update_card` | Изменить заголовок/описание |
94
+ | `kaiten_get_card_tasks` | Описание и пункты чек-листа |
95
+ | `kaiten_add_checklist` | Добавить чек-лист |
96
+ | `kaiten_add_checklist_item` | Добавить пункт чек-листа |
97
+ | `kaiten_update_checklist_item` | Изменить пункт чек-листа |
98
+ | `kaiten_add_comment` | Добавить комментарий |
99
+ | `kaiten_get_comments` | Список комментариев |
100
+ | `kaiten_add_external_link` | Прикрепить ссылку |
101
+ | `kaiten_update_external_link` | Изменить ссылку |
102
+ | `kaiten_get_external_links` | Список внешних ссылок |
103
+ | `kaiten_search_cards` | Поиск карточек |
104
+ | `kaiten_list_board_cards` | Карточки доски |
105
+
106
+ ## API
107
+
108
+ - Документация: https://developers.kaiten.ru/
109
+ - Базовый URL: `https://<домен>.kaiten.ru/api/v1`
110
+ - Лимит: 5 запросов в секунду
111
+
112
+ ## License
113
+
114
+ MIT
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import{McpServer as E}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as v}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as a}from"zod";import x from"node:fs";var f=process.env.KAITEN_LOG_FILE,T=!f||f==="0"?void 0:f;function p(e){if(console.error(e),T)try{x.appendFileSync(T,e+`
3
+ `)}catch{}}var S=5,K=1e3,y=class{lastReset=Date.now();count=0;async acquire(){let t=Date.now();if(t-this.lastReset>=K&&(this.lastReset=t,this.count=0),this.count+=1,this.count>S){let i=K-(t-this.lastReset);i>0&&await new Promise(n=>setTimeout(n,i)),this.lastReset=Date.now(),this.count=1}}},h=class{baseUrl;token;limiter=new y;constructor(t){let i=t.basePath??"api/v1";this.baseUrl=`https://${t.domain}.kaiten.ru/${i}`,this.token=t.token}asArray(t){return Array.isArray(t)?t:[]}logRequest(t,i,n){let r=n!==void 0&&t!=="GET"?` ${JSON.stringify(n)}`:"";p(`[Kaiten] \u2192 ${t} ${i}${r}`)}logResponse(t,i,n,r){p(`[Kaiten] \u2190 ${t} ${i} ${n} ${r}ms`)}async request(t,i,n){await this.limiter.acquire();let r=i.startsWith("http")?i:`${this.baseUrl}${i}`;this.logRequest(t,i,n);let s=Date.now(),l={Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},m={method:t,headers:l};n!==void 0&&t!=="GET"&&(m.body=JSON.stringify(n));let u=await fetch(r,m);if(this.logResponse(t,i,u.status,Date.now()-s),!u.ok){let g=await u.text(),k;try{let C=JSON.parse(g);k=C.message??C.error??g}catch{k=g||u.statusText}throw new Error(`Kaiten API ${u.status} ${i}: ${k}`)}if(!(u.status===204||u.headers.get("content-length")==="0"))return u.json()}async getSpaces(){let t=await this.request("GET","/spaces");return this.asArray(t)}async getBoards(t){let i=t?`/spaces/${t}/boards`:"/boards",n=await this.request("GET",i);return this.asArray(n)}async getBoard(t){return this.request("GET",`/boards/${t}`)}async getUsers(t){let i=t?`/spaces/${t}/users`:"/users",n=await this.request("GET",i);return this.asArray(n)}cardPath(t,i,n=""){let r=t?`/spaces/${t}/cards/${i}`:`/cards/${i}`;return n?`${r}/${n}`:r}async getCard(t,i){return this.request("GET",this.cardPath(i,t))}async createCard(t,i){let n=i?`/spaces/${i}/cards`:"/cards";return this.request("POST",n,t)}async updateCard(t,i,n){let r=this.cardPath(n,t);return this.request("PATCH",r,i)}async getCardComments(t,i){let n=this.cardPath(i,t,"comments"),r=await this.request("GET",n);return this.asArray(r)}async addComment(t,i,n){let r=this.cardPath(n,t,"comments");return this.request("POST",r,{body:i})}async getChecklists(t,i){let n=this.cardPath(i,t,"checklists"),r=await this.request("GET",n);return this.asArray(r)}async createChecklist(t,i,n){let r=this.cardPath(n,t,"checklists");return this.request("POST",r,{name:i})}async getChecklistItems(t,i){let n=this.cardPath(i,t,"checklist_items"),r=await this.request("GET",n);return this.asArray(r)}async addChecklistItem(t,i,n,r){if(n===void 0){let l={text:i},m=this.cardPath(r,t,"checklist_items");return this.request("POST",m,l)}let s=this.cardPath(r,t,`checklists/${n}/items`);return this.request("POST",s,{text:i})}async updateChecklistItem(t,i,n,r){let s=this.cardPath(r,t,`checklist_items/${i}`),l={};return n.title!==void 0&&(l.name=n.title),n.checked!==void 0&&(l.checked=n.checked),this.request("PATCH",s,l)}async getExternalLinks(t,i){let n=this.cardPath(i,t,"external-links"),r=await this.request("GET",n);return this.asArray(r)}async addExternalLink(t,i,n,r){let s=this.cardPath(r,t,"external-links"),l={url:i};return n!==void 0&&(l.description=n),this.request("POST",s,l)}async updateExternalLink(t,i,n,r){let s=this.cardPath(r,t,`external-links/${i}`),l={};return n.url!==void 0&&(l.url=n.url),n.title!==void 0&&(l.description=n.title),this.request("PATCH",s,l)}async getBoardCards(t,i){let n=i?`/spaces/${i}/boards/${t}/cards`:`/boards/${t}/cards`,r=await this.request("GET",n);return this.asArray(r)}async searchCards(t){let i=new URLSearchParams;t.query&&i.set("q",t.query),t.title&&i.set("title",t.title),t.responsible_id!=null&&i.set("responsible_id",String(t.responsible_id)),t.board_id!=null&&i.set("board_id",String(t.board_id)),t.space_id!=null&&i.set("space_id",String(t.space_id)),t.archived!==void 0&&i.set("archived",String(t.archived));let n=i.toString(),r=n?`/cards?${n}`:"/cards",s=await this.request("GET",r);return this.asArray(s)}};var w=process.env.KAITEN_DOMAIN??"",P=process.env.KAITEN_TOKEN??"",A=process.env.KAITEN_BASE_PATH;(!w||!P)&&(console.error("KAITEN_DOMAIN and KAITEN_TOKEN must be set. Example: KAITEN_DOMAIN=mycompany KAITEN_TOKEN=..."),process.exit(1));var d=new h({domain:w,token:P,basePath:A});function b(e,t,i){let n=i?`${new Date().toISOString()} [${e}] ${t} ${JSON.stringify(i)}`:`${new Date().toISOString()} [${e}] ${t}`;p(n)}var o=new E({name:"kaiten-mcp",version:"1.0.0"});function c(e,t){return async i=>{let n=Date.now();b("info","tool_request",{tool:e,args:i});try{let r=await t(i),s={content:[{type:"text",text:r.text}]};return r.structured!==void 0&&(s.structuredContent=r.structured),b("info","tool_response",{tool:e,ok:!0,ms:Date.now()-n}),s}catch(r){let s=r instanceof Error?r.message:String(r);return b("error","tool_response",{tool:e,ok:!1,error:s,ms:Date.now()-n}),{content:[{type:"text",text:s}],isError:!0}}}}o.registerTool("kaiten_list_spaces",{title:"\u0421\u043F\u0438\u0441\u043E\u043A \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432 Kaiten",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432 (spaces)",inputSchema:{}},c("kaiten_list_spaces",async()=>{let e=await d.getSpaces();return{text:e.length?e.map(i=>`id: ${i.id}, name: ${i.name??"-"}`).join(`
4
+ `):"\u041F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B",structured:{spaces:e}}}));o.registerTool("kaiten_list_boards",{title:"\u0421\u043F\u0438\u0441\u043E\u043A \u0434\u043E\u0441\u043E\u043A Kaiten",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A \u0434\u043E\u0441\u043E\u043A. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E \u043F\u043E id \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 (space_id)",inputSchema:{space_id:a.number().optional()}},c("kaiten_list_boards",async e=>{let t=await d.getBoards(e.space_id);return{text:t.length?t.map(n=>`id: ${n.id}, name: ${n.name??"-"}, space_id: ${n.space_id??"-"}`).join(`
5
+ `):"\u0414\u043E\u0441\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B",structured:{boards:t}}}));o.registerTool("kaiten_get_board",{title:"\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u0441\u043A\u0443 \u043F\u043E id",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0435 \u0434\u043E\u0441\u043A\u0438 \u043F\u043E \u0435\u0451 id",inputSchema:{board_id:a.number()}},c("kaiten_get_board",async e=>{let t=await d.getBoard(e.board_id);return{text:JSON.stringify(t,null,2),structured:{board:t}}}));o.registerTool("kaiten_list_users",{title:"\u0421\u043F\u0438\u0441\u043E\u043A \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 Kaiten",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u0441 id (responsible_id), full_name, email. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E \u043F\u043E space_id \u2014 \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430.",inputSchema:{space_id:a.number().optional()}},c("kaiten_list_users",async e=>{let t=await d.getUsers(e.space_id);return{text:t.length?t.map(n=>`responsible_id: ${n.id}, full_name: ${n.full_name??"-"}, email: ${n.email??"-"}`).join(`
6
+ `):"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B",structured:{users:t}}}));var _=" \u041D\u043E\u043C\u0435\u0440 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u0437 \u0441\u0441\u044B\u043B\u043A\u0438: space/20874/boards/card/59923149 \u2192 space_id=20874, card_id=59923149.",$=5,I=1100;async function R(e,t,i){if(e.every(s=>"archived"in s))return e.filter(s=>!s.archived);let r=[];for(let s=0;s<e.length;s+=$){s>0&&await new Promise(u=>setTimeout(u,I));let l=e.slice(s,s+$),m=await Promise.all(l.map(u=>i.getCard(u.id,t)));r.push(...m.filter(u=>!u.archived))}return r}o.registerTool("kaiten_get_card",{title:"\u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443 \u043F\u043E id",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443 (\u0437\u0430\u0434\u0430\u0447\u0443) \u043F\u043E id, \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u043F\u043E\u043B\u0435 checklists (\u043C\u0430\u0441\u0441\u0438\u0432 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u043E\u0432 \u0441 id, name, items). \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044C space_id."+_,inputSchema:{card_id:a.number(),space_id:a.number().optional()}},c("kaiten_get_card",async e=>{let t=await d.getCard(e.card_id,e.space_id);return{text:JSON.stringify(t,null,2),structured:{card:t}}}));o.registerTool("kaiten_create_card",{title:"\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443",description:"\u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443 \u043D\u0430 \u0434\u043E\u0441\u043A\u0435. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 board_id, column_id \u0438 title. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{board_id:a.number(),column_id:a.number(),title:a.string(),description:a.string().optional(),lane_id:a.number().optional(),space_id:a.number().optional()}},c("kaiten_create_card",async e=>{let t=await d.createCard({board_id:e.board_id,column_id:e.column_id,title:e.title,description:e.description,lane_id:e.lane_id},e.space_id);return{text:`\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0430: id ${t.id}, title: ${t.title??e.title}`,structured:{card:t}}}));o.registerTool("kaiten_move_card",{title:"\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443",description:"\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443 \u043F\u043E \u0434\u043E\u0441\u043A\u0435: \u0443\u043A\u0430\u0436\u0438\u0442\u0435 column_id \u0438 \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438 lane_id, board_id. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),column_id:a.number().optional(),lane_id:a.number().optional(),board_id:a.number().optional(),space_id:a.number().optional()}},c("kaiten_move_card",async e=>{let t={};e.column_id!==void 0&&(t.column_id=e.column_id),e.lane_id!==void 0&&(t.lane_id=e.lane_id),e.board_id!==void 0&&(t.board_id=e.board_id);let i=await d.updateCard(e.card_id,t,e.space_id);return{text:`\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 ${i.id} \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0430`,structured:{card:i}}}));o.registerTool("kaiten_update_card",{title:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443",description:"\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0438/\u0438\u043B\u0438 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),title:a.string().optional(),description:a.string().optional(),space_id:a.number().optional()}},c("kaiten_update_card",async e=>{let t={};e.title!==void 0&&(t.title=e.title),e.description!==void 0&&(t.description=e.description);let i=await d.updateCard(e.card_id,t,e.space_id);return{text:`\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 ${i.id} \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0430`,structured:{card:i}}}));o.registerTool("kaiten_get_card_tasks",{title:"\u0427\u0442\u0435\u043D\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438: \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435, \u043F\u0443\u043D\u043A\u0442\u044B \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u0430. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),space_id:a.number().optional()}},c("kaiten_get_card_tasks",async e=>{let[t,i]=await Promise.all([d.getCard(e.card_id,e.space_id),d.getChecklistItems(e.card_id,e.space_id)]);return{text:[`\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A: ${t.title??"-"}`,`\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435: ${t.description??"-"}`,"\u041F\u0443\u043D\u043A\u0442\u044B:",...i.map(r=>` - ${r.checked?"[x]":"[ ]"} ${r.title??""}`)].join(`
7
+ `),structured:{card:t,checklist_items:i}}}));o.registerTool("kaiten_add_checklist",{title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0447\u0435\u043A-\u043B\u0438\u0441\u0442 \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443",description:"\u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442 (\u0433\u0440\u0443\u043F\u043F\u0443 \u0441 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C) \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),title:a.string(),space_id:a.number().optional()}},c("kaiten_add_checklist",async e=>{let t=await d.createChecklist(e.card_id,e.title,e.space_id);return{text:`\u0427\u0435\u043A-\u043B\u0438\u0441\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D: id ${t.id}, title: ${t.name??e.title}`,structured:{checklist:t}}}));o.registerTool("kaiten_add_checklist_item",{title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0443\u043D\u043A\u0442 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u0430",description:"\u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0443\u043D\u043A\u0442 \u0432 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438. checklist_id \u2014 id \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u0430 (\u0438\u0437 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438: card.checklists[].id). \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),title:a.string(),checklist_id:a.number().optional(),space_id:a.number().optional()}},c("kaiten_add_checklist_item",async e=>{let t=await d.addChecklistItem(e.card_id,e.title,e.checklist_id,e.space_id);return{text:`\u041F\u0443\u043D\u043A\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D: id ${t.id}, title: ${t.title??e.title}`,structured:{item:t}}}));o.registerTool("kaiten_update_checklist_item",{title:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0443\u043D\u043A\u0442 \u0447\u0435\u043A-\u043B\u0438\u0441\u0442\u0430",description:"\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0438/\u0438\u043B\u0438 \u0441\u0442\u0430\u0442\u0443\u0441 (checked) \u043F\u0443\u043D\u043A\u0442\u0430. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),item_id:a.number(),title:a.string().optional(),checked:a.boolean().optional(),space_id:a.number().optional()}},c("kaiten_update_checklist_item",async e=>{let t={};e.title!==void 0&&(t.title=e.title),e.checked!==void 0&&(t.checked=e.checked);let i=await d.updateChecklistItem(e.card_id,e.item_id,t,e.space_id);return{text:`\u041F\u0443\u043D\u043A\u0442 ${i.id} \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D`,structured:{item:i}}}));o.registerTool("kaiten_add_comment",{title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435",description:"\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u044F\u0435\u0442 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043A \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),body:a.string(),space_id:a.number().optional()}},c("kaiten_add_comment",async e=>{let t=await d.addComment(e.card_id,e.body,e.space_id);return{text:`\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D: id ${t.id}`,structured:{comment:t}}}));o.registerTool("kaiten_get_comments",{title:"\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),space_id:a.number().optional()}},c("kaiten_get_comments",async e=>{let t=await d.getCardComments(e.card_id,e.space_id);return{text:t.length?t.map(n=>`id: ${n.id}, body: ${n.body??"-"}`).join(`
8
+ `):"\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 \u043D\u0435\u0442",structured:{comments:t}}}));o.registerTool("kaiten_add_external_link",{title:"\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043A \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435",description:"\u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u043D\u0435\u0448\u043D\u044E\u044E \u0441\u0441\u044B\u043B\u043A\u0443 \u043A \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435, \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E \u0441 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435\u043C. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),url:a.string(),title:a.string().optional(),space_id:a.number().optional()}},c("kaiten_add_external_link",async e=>{let t=await d.addExternalLink(e.card_id,e.url,e.title,e.space_id);return{text:`\u0421\u0441\u044B\u043B\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430: ${e.url}${e.title?` (${e.title})`:""}`,structured:{link:t}}}));o.registerTool("kaiten_update_external_link",{title:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441\u0441\u044B\u043B\u043A\u0438",description:"\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 url \u0438/\u0438\u043B\u0438 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u043E\u0439 \u0441\u0441\u044B\u043B\u043A\u0438. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),link_id:a.number(),url:a.string().optional(),title:a.string().optional(),space_id:a.number().optional()}},c("kaiten_update_external_link",async e=>{let t={};e.url!==void 0&&(t.url=e.url),e.title!==void 0&&(t.title=e.title);let i=await d.updateExternalLink(e.card_id,e.link_id,t,e.space_id);return{text:`\u0421\u0441\u044B\u043B\u043A\u0430 ${e.link_id} \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0430`,structured:{link:i}}}));o.registerTool("kaiten_get_external_links",{title:"\u0421\u0441\u044B\u043B\u043A\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A \u043F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0445 \u043A \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435 \u0432\u043D\u0435\u0448\u043D\u0438\u0445 \u0441\u0441\u044B\u043B\u043E\u043A. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{card_id:a.number(),space_id:a.number().optional()}},c("kaiten_get_external_links",async e=>{let t=await d.getExternalLinks(e.card_id,e.space_id);return{text:t.length?t.map(n=>`id: ${n.id}, url: ${n.url??"-"}, title: ${n.title??"-"}`).join(`
9
+ `):"\u0421\u0441\u044B\u043B\u043E\u043A \u043D\u0435\u0442",structured:{links:t}}}));o.registerTool("kaiten_search_cards",{title:"\u041F\u043E\u0438\u0441\u043A \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",description:"\u041F\u043E\u0438\u0441\u043A \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u043E id (card_id), \u043F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E (title) \u0438\u043B\u0438 \u043F\u043E \u0438\u0441\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044E (responsible_id). archived: false \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u043D\u0435 \u0430\u0440\u0445\u0438\u0432\u043D\u044B\u0435. \u041C\u043E\u0436\u043D\u043E \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0442\u044C board_id \u0438\u043B\u0438 space_id",inputSchema:{card_id:a.number().optional(),title:a.string().optional(),responsible_id:a.number().optional(),query:a.string().optional(),board_id:a.number().optional(),space_id:a.number().optional(),archived:a.union([a.boolean(),a.literal("false")]).optional()}},c("kaiten_search_cards",async e=>{if(e.card_id!=null){let r=await d.getCard(e.card_id,e.space_id);return{text:JSON.stringify(r,null,2),structured:{cards:[r]}}}let t=e.archived===!1||e.archived==="false",i=await d.searchCards({title:e.title,responsible_id:e.responsible_id,query:e.query,board_id:e.board_id,space_id:e.space_id,archived:t?!1:typeof e.archived=="boolean"?e.archived:void 0});return t&&i.length>0&&(i=await R(i,e.space_id,d)),{text:i.length?i.map(r=>`id: ${r.id}, title: ${r.title??"-"}`).join(`
10
+ `):"\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B",structured:{cards:i}}}));o.registerTool("kaiten_list_board_cards",{title:"\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0434\u043E\u0441\u043A\u0438",description:"\u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043F\u0438\u0441\u043E\u043A \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043D\u0430 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0439 \u0434\u043E\u0441\u043A\u0435. \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E space_id."+_,inputSchema:{board_id:a.number(),space_id:a.number().optional()}},c("kaiten_list_board_cards",async e=>{let t=await d.getBoardCards(e.board_id,e.space_id);return{text:t.length?t.map(n=>`id: ${n.id}, title: ${n.title??"-"}`).join(`
11
+ `):"\u041A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043D\u0435\u0442",structured:{cards:t}}}));var L=new v;b("info","kaiten-mcp server starting",{transport:"stdio"});o.connect(L);
package/package.json CHANGED
@@ -1,6 +1,41 @@
1
1
  {
2
2
  "name": "@che-tools/kaiten-mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "description": "MCP сервер для работы с kaiten.ru",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "kaiten-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "clean": "rm -rf dist",
15
+ "build": "npm run clean && npm run build:bundle",
16
+ "build:bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --packages=external --minify --outfile=dist/index.js --banner:js=\"#!/usr/bin/env node\"",
17
+ "typecheck": "tsc --noEmit",
18
+ "start": "node dist/index.js",
19
+ "development": "tsx src/index.ts",
20
+ "prepublishOnly": "npm run build",
21
+ "test": "echo \"Error: no test specified\" && exit 1"
22
+ },
23
+ "author": "Cherehapa",
24
+ "license": "MIT",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.15.0",
30
+ "zod": "^3.25.75"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.0.0",
34
+ "esbuild": "^0.25.12",
35
+ "tsx": "^4.19.0",
36
+ "typescript": "^5.6.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ }
41
+ }