@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.
Files changed (3) hide show
  1. package/dist/index.js +11 -0
  2. package/package.json +39 -4
  3. 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": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
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.