@che-tools/kaiten-mcp 0.0.0-stage → 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/dist/index.js +11 -0
- package/package.json +39 -4
- package/README.md +0 -3
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": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
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
|
+
}
|
package/README.md
DELETED