@progma/mcp-std 1.0.2 → 1.0.4
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-v2.js +1 -1
- package/package.json +1 -1
package/dist/index-v2.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{McpServer as f,ResourceTemplate as h}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as j}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as t}from"zod";import S from"axios";const g=process.env.MCP_SERVER_URL||"https://mcp.progma.io",b=process.env.PERSONAL_ACCESS_TOKEN,I=process.env.DEFAULT_PROJECT_ID;b||(console.error("[stdio-adapter] Warning: PERSONAL_ACCESS_TOKEN\u74B0\u5883\u5909\u6570\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"),console.error("[stdio-adapter] MCP\u8A2D\u5B9A\u3067PERSONAL_ACCESS_TOKEN\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),console.error("[stdio-adapter] \u30B5\u30FC\u30D0\u30FC\u306F\u8D77\u52D5\u3057\u307E\u3059\u304C\u3001API\u547C\u3073\u51FA\u3057\u306F\u5931\u6557\u3057\u307E\u3059\u3002"));const e={projectId:"Project ID*",projectIdOpt:"Project ID?",projectShortName:'Project short name (e.g., "progma"). Auto-resolves projectId if unique.',taskId:'Task ID (ULID or "shortName-number", e.g. "progma-123")',taskIdOpt:'Task ID (ULID or "shortName-number")',taskNumber:"Task number (requires project context)",issueId:'Issue ID (ULID or "shortName-number")',issueIdOpt:'Issue ID (ULID or "shortName-number")',issueNumber:"Issue number (requires project context)",documentId:"Document ID (ULID)",commentId:"Comment ID (ULID)",title:"Title of the item",description:"Detailed description (Markdown supported)",content:"Content text (Markdown supported)",statusId:"Status ID (use list-project-statuses to find IDs)",priorityId:"Priority ID (use list-project-priorities to find IDs)",categoryId:"Category ID (use list-project-categories to find IDs)",assigneeId:"Assignee ID (use list-project-members to find IDs)",dueDate:"Deadline. Often later than completionDate.",startDate:"Work start date.",completionDate:"Work end date (based on effort, not deadline).",parentTaskId:"Parent task ID (for subtasks)",issueIdLink:"Related Issue ID",url:"Progma URL to parse",query:"Search query string",status:"Status name filter",progress:"Progress percentage (0-100)",teamId:"Team ID",workflowId:"Workflow ID",visibility:'Visibility scope ("private", "team", "project")',tags:"Array of tag strings",documentType:"Document type (markdown, richtext, etc.)",fields:"Array of field names to include in response",boxId:"Box ID (container for documents)",folderId:"Folder ID (for organization)",resourceType:"Resource type (task|issue)",action:"Action (create|update|delete|list)"},s=new f({name:"Progma Stdio MCP v2",version:"2.0.0"},{capabilities:{tools:{},resources:{}}});async function n(o,r={}){try{return(await S.post(`${g}${o}`,r,{headers:{Authorization:`Bearer ${b}`,"Content-Type":"application/json"}})).data}catch(a){const l=a;if(l.code==="ECONNREFUSED")throw new Error(`MCP Server is not reachable at ${g}. Please ensure the server is running.`);const d=l.response?.data?.message||l.message||"Unknown error";throw new Error(`API Error (${o}): ${d}`)}}function i(o){return!o.projectId&&!o.projectShortName&&I&&(o.projectId=I),o}function N(){s.tool("list-tasks","Filter by status, assignee, query. Auto-resolves project context.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),statusId:t.string().optional().describe(e.statusId),assigneeId:t.string().optional().describe(e.assigneeId),fields:t.array(t.string()).optional().describe(e.fields),includeAvailableTransitions:t.boolean().optional().describe("Include workflow transitions"),query:t.string().optional().describe(e.query)},async o=>{const r=await n("/mcp-tools/get-tasks",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-task","Create a new task in the project.",{title:t.string().describe(e.title),projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt),description:t.string().optional().describe(e.description),statusId:t.string().optional().describe(e.statusId),priorityId:t.string().optional().describe(e.priorityId),categoryId:t.string().optional().describe(e.categoryId),assigneeId:t.string().optional().describe(e.assigneeId),dueDate:t.string().optional().describe(e.dueDate),startDate:t.string().optional().describe(e.startDate),completionDate:t.string().optional().describe(e.completionDate),parentTaskId:t.string().optional().describe(e.parentTaskId),issueId:t.string().optional().describe(e.issueIdLink),tags:t.array(t.string()).optional().describe(e.tags),workflowId:t.string().optional().describe(e.workflowId),estimatedHours:t.number().optional().describe("Estimated hours (0-9999.99)"),actualHours:t.number().optional().describe("Actual hours (0-9999.99)")},async o=>{const r=await n("/mcp-tools/create-task",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-task","Includes subTasks. Use fields to filter (e.g., title, status, subTasks, progress).",{taskId:t.string().optional().describe(e.taskIdOpt),taskNumber:t.number().optional().describe(e.taskNumber),projectShortName:t.string().optional().describe(e.projectShortName),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/get-task-details",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("update-task","Change status, assignee, progress, dates, etc.",{taskId:t.string().optional().describe(e.taskIdOpt),taskNumber:t.number().optional().describe(e.taskNumber),projectShortName:t.string().optional().describe(e.projectShortName),title:t.string().optional().describe(e.title),description:t.string().optional().describe(e.description),statusId:t.string().optional().describe(e.statusId),priorityId:t.string().optional().describe(e.priorityId),categoryId:t.string().optional().describe(e.categoryId),assigneeId:t.string().optional().describe(e.assigneeId),dueDate:t.string().optional().describe(e.dueDate),startDate:t.string().optional().describe(e.startDate),completionDate:t.string().optional().describe(e.completionDate),parentTaskId:t.string().optional().describe(e.parentTaskId),issueId:t.string().optional().describe(e.issueIdLink),tags:t.array(t.string()).optional().describe(e.tags),workflowId:t.string().optional().describe(e.workflowId),progress:t.number().optional().describe(e.progress),visibility:t.string().optional().describe(e.visibility),teamId:t.string().optional().describe(e.teamId),estimatedHours:t.number().optional().describe("Estimated hours (0-9999.99)"),actualHours:t.number().optional().describe("Actual hours (0-9999.99)")},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/update-task",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("delete-task","Delete a task permanently.",{taskId:t.string().describe(e.taskId)},async o=>{const r=await n("/mcp-tools/delete-task",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-creation-metadata","Get creation metadata (statuses, priorities, etc.)",{resourceType:t.string().describe(e.resourceType),projectId:t.string().optional().describe(e.projectIdOpt),projectShortName:t.string().optional().describe(e.projectShortName)},async o=>{const r=await n("/mcp-tools/get-creation-metadata",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("manage-comment","Manage comments for tasks and issues",{action:t.string().describe(e.action),resourceType:t.string().describe(e.resourceType),resourceId:t.string().optional().describe("Task ID or Issue ID"),resourceNumber:t.number().optional().describe("Task Number or Issue Number"),projectShortName:t.string().optional().describe(e.projectShortName),commentId:t.string().optional().describe(e.commentId),content:t.string().optional().describe(e.content)},async o=>{const{action:r,resourceType:a,resourceId:l,resourceNumber:d,...p}=o;let c="",u={...p};const m=i({...p,projectShortName:o.projectShortName});if(a==="task"?(r==="create"?c="/mcp-tools/create-task-comment":r==="list"?c="/mcp-tools/get-task-comments":r==="update"?c="/mcp-tools/update-task-comment":r==="delete"&&(c="/mcp-tools/delete-task-comment"),u={...m,taskId:l,taskNumber:d}):a==="issue"&&(r==="create"?c="/mcp-tools/create-issue-comment":r==="list"?c="/mcp-tools/get-issue-comments":r==="update"?c="/mcp-tools/update-issue-comment":r==="delete"&&(c="/mcp-tools/delete-issue-comment"),u={...m,issueId:l,issueNumber:d}),!c)throw new Error(`Invalid action "${r}" or resourceType "${a}" for manage-comment`);const y=await n(c,u);return{content:[{type:"text",text:JSON.stringify(y,null,2)}]}}),s.tool("list-issues","List issues with filtering options.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),statusId:t.string().optional().describe(e.statusId),fields:t.array(t.string()).optional().describe(e.fields),query:t.string().optional().describe(e.query)},async o=>{const r=await n("/mcp-tools/get-issues",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-issue","Get detailed information about an issue.",{issueId:t.string().optional().describe(e.issueIdOpt),issueNumber:t.number().optional().describe(e.issueNumber),projectShortName:t.string().optional().describe(e.projectShortName),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/get-issue-details",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("create-issue","Create a new issue.",{projectId:t.string().describe(e.projectId),title:t.string().describe(e.title),description:t.string().optional().describe(e.description)},async o=>{const r=await n("/mcp-tools/create-issue",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-issue","Update an existing issue.",{issueId:t.string().optional().describe(e.issueIdOpt),issueNumber:t.number().optional().describe(e.issueNumber),projectShortName:t.string().optional().describe(e.projectShortName),title:t.string().optional().describe(e.title),description:t.string().optional().describe(e.description),statusId:t.string().optional().describe(e.statusId),priorityId:t.string().optional().describe(e.priorityId),categoryId:t.string().optional().describe(e.categoryId)},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/update-issue",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("delete-issue","Delete an issue permanently.",{issueId:t.string().describe(e.issueId)},async o=>{const r=await n("/mcp-tools/delete-issue",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-document-boxes","Get document boxes and their folder structure",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId)},async o=>{const r=await n("/mcp-tools/list-document-boxes",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-documents","Filter by box, folder, query.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),boxId:t.string().optional().describe(e.boxId),folderId:t.string().optional().describe(e.folderId),fields:t.array(t.string()).optional().describe(e.fields),query:t.string().optional().describe(e.query)},async o=>{const r=await n("/mcp-tools/get-documents",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-document","Returns content. Use fields to filter.",{documentId:t.string().describe(e.documentId),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=await n("/mcp-tools/get-document-content",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-document","Create document",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt),boxId:t.string().optional().describe(e.boxId),folderId:t.string().optional().describe(e.folderId),title:t.string().describe(e.title),content:t.string().describe(e.content),type:t.enum(["markdown","richtext","canvas","excalidraw","folder"]).optional().default("markdown").describe(e.documentType)},async o=>{const r=await n("/mcp-tools/create-document",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-document","Update document.",{documentId:t.string().describe(e.documentId),title:t.string().optional().describe(e.title),content:t.string().optional().describe("New content (optional). Note: For real-time collaborative editing, use the web interface.")},async o=>{const r=await n("/mcp-tools/update-document",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("delete-document","Delete document permanently.",{documentId:t.string().describe(e.documentId)},async o=>{const r=await n("/mcp-tools/delete-document",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-project","Get project",{projectId:t.string().describe(e.projectId)},async o=>{const r=await n("/mcp-tools/get-project-overview",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-project-metadata","Get project metadata (statuses, priorities, members, etc.)",{projectId:t.string().optional().describe(e.projectIdOpt),projectShortName:t.string().optional().describe(e.projectShortName),types:t.array(t.string()).optional().describe("Metadata types to fetch")},async o=>{const r=await n("/mcp-tools/get-project-metadata",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-workflow-guide","Get MCP workflow guide",{},async()=>{const o=await n("/mcp-tools/get-workflow-guide",{});return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}),s.tool("read-attachment","Read attachment content",{fileId:t.string().describe("File ID")},async o=>{const r=await n("/mcp-tools/read-attachment",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("resolve-url","Parse Progma URL",{url:t.string().describe(e.url)},async o=>{const r=await n("/mcp-tools/resolve-url",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-projects","List projects that the user is a member of",{status:t.string().optional().describe("Filter by project status (active, archived, etc.)")},async o=>{const r=await n("/mcp-tools/list-projects",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-project-summary","Get project summary",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt)},async o=>{const r=await n("/mcp-tools/get-project-summary",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("analyze-progress","Analyze progress",{projectId:t.string().describe(e.projectId)},async o=>{const r=await n("/mcp-tools/analyze-progress",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-current-project","Get current project",{},async()=>{const o=await n("/mcp-tools/get-current-project",{});return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}),s.tool("set-current-project","Set current project",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt)},async o=>{const r=await n("/mcp-tools/set-current-project",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("clear-current-project","Clear current project",{},async o=>{const r=await n("/mcp-tools/clear-current-project");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-qa-sheets","List QA sheets for a project.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=await n("/mcp-tools/get-qa-sheets",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-qa-sheet","Create a new QA sheet (QA\u7BA1\u7406\u8868).",{name:t.string().describe("QA sheet name"),projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt)},async o=>{const r=await n("/mcp-tools/create-qa-sheet",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-qa-sheet","Get detailed information about a QA sheet.",{qaSheetId:t.string().optional().describe("QA Sheet ID (ULID)"),qaSheetNumber:t.number().optional().describe("QA Sheet number (requires project context)"),projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=await n("/mcp-tools/get-qa-sheet-details",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-qa-sheet","Update an existing QA sheet.",{qaSheetId:t.string().optional().describe("QA Sheet ID (ULID)"),qaSheetNumber:t.number().optional().describe("QA Sheet number (requires project context)"),projectShortName:t.string().optional().describe(e.projectShortName),name:t.string().optional().describe("New QA sheet name")},async o=>{const r=await n("/mcp-tools/update-qa-sheet",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("delete-qa-sheet","Delete a QA sheet permanently.",{qaSheetId:t.string().describe("QA Sheet ID (ULID)")},async o=>{const r=await n("/mcp-tools/delete-qa-sheet",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-question","Create a new question in a QA sheet.",{qaSheetId:t.string().describe("QA Sheet ID to add question to"),questionContent:t.string().describe("Question text"),answerDeadline:t.string().optional().describe("Answer deadline (ISO 8601 date string)"),answererId:t.string().optional().describe("Answerer user ID"),attachmentIds:t.array(t.string()).optional().describe("Array of attachment IDs")},async o=>{const r=await n("/mcp-tools/create-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-question","Update an existing question.",{questionId:t.string().describe("Question ID (ULID)"),questionContent:t.string().optional().describe("Updated question text"),answerDeadline:t.string().nullable().optional().describe("Answer deadline (ISO 8601), null to clear"),answererId:t.string().nullable().optional().describe("Answerer user ID, null to clear"),status:t.enum(["pending","answered","overdue","onhold","withdrawn"]).optional().describe("Question status"),attachmentIds:t.array(t.string()).optional().describe("Array of attachment IDs")},async o=>{const r=await n("/mcp-tools/update-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("answer-question","Answer a question.",{questionId:t.string().describe("Question ID (ULID)"),answerContent:t.string().describe("Answer text"),attachmentIds:t.array(t.string()).optional().describe("Array of attachment IDs")},async o=>{const r=await n("/mcp-tools/answer-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-questions","List questions with filtering. Can filter by status, answerer, overdue, unanswered, etc.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),qaSheetId:t.string().optional().describe("QA Sheet ID to filter"),status:t.enum(["pending","answered","overdue","onhold","withdrawn"]).optional().describe("Question status filter"),answererId:t.string().optional().describe("Filter by answerer ID (who is assigned to answer)"),questionerId:t.string().optional().describe("Filter by questioner ID (who asked the question)"),isOverdue:t.boolean().optional().describe("Filter only overdue questions"),unanswered:t.boolean().optional().describe("Filter only unanswered questions"),search:t.string().optional().describe("Search keyword in question/answer content"),sortBy:t.enum(["createdAt","updatedAt","questionDate","answerDeadline","number"]).optional().describe("Sort field"),sortDirection:t.enum(["asc","desc"]).optional().describe("Sort direction"),page:t.number().optional().describe("Page number"),pageSize:t.number().optional().describe("Items per page")},async o=>{const r=await n("/mcp-tools/get-questions",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("delete-question","Delete a question permanently.",{questionId:t.string().describe("Question ID (ULID)")},async o=>{const r=await n("/mcp-tools/delete-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}})}function w(){const o=new h("attachment:///{projectId}/{fileId}",{list:async()=>({resources:[]})});s.resource("attachments",o,{description:"Access attached files from tasks and issues"},async(r,a)=>{const l=a.fileId,d=await n("/mcp-tools/read-attachment",{fileId:l});if(!d.data)throw new Error("Failed to read resource");const p=d.data;return{contents:[{uri:r.href,mimeType:p.mimeType||"application/octet-stream",blob:p.content}]}})}async function x(){N(),w();const o=new j;await s.connect(o),console.error("Progma Stdio MCP Server v2 running on stdio")}x().catch(o=>{console.error("Fatal error in main:",o),process.exit(1)});
|
|
2
|
+
import{McpServer as f,ResourceTemplate as h}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as S}from"@modelcontextprotocol/sdk/server/stdio.js";import{z as t}from"zod";import j from"axios";const g=process.env.MCP_SERVER_URL||"https://mcp.progma.io",b=process.env.PERSONAL_ACCESS_TOKEN,I=process.env.DEFAULT_PROJECT_ID;b||(console.error("[stdio-adapter] Warning: PERSONAL_ACCESS_TOKEN\u74B0\u5883\u5909\u6570\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"),console.error("[stdio-adapter] MCP\u8A2D\u5B9A\u3067PERSONAL_ACCESS_TOKEN\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002"),console.error("[stdio-adapter] \u30B5\u30FC\u30D0\u30FC\u306F\u8D77\u52D5\u3057\u307E\u3059\u304C\u3001API\u547C\u3073\u51FA\u3057\u306F\u5931\u6557\u3057\u307E\u3059\u3002"));const e={projectId:"Project ID*",projectIdOpt:"Project ID?",projectShortName:'Project short name (e.g., "progma"). Auto-resolves projectId if unique.',taskId:'Task ID (ULID or "shortName-number", e.g. "progma-123")',taskIdOpt:'Task ID (ULID or "shortName-number")',taskNumber:"Task number (requires project context)",issueId:'Issue ID (ULID or "shortName-number")',issueIdOpt:'Issue ID (ULID or "shortName-number")',issueNumber:"Issue number (requires project context)",documentId:"Document ID (ULID)",commentId:"Comment ID (ULID)",title:"Title of the item",description:"Detailed description (Markdown supported)",content:"Content text (Markdown supported)",statusId:"Status ID (use list-project-statuses to find IDs)",priorityId:"Priority ID (use list-project-priorities to find IDs)",categoryId:"Category ID (use list-project-categories to find IDs)",assigneeId:"Assignee ID (use list-project-members to find IDs)",dueDate:"Deadline. Often later than completionDate.",startDate:"Work start date.",completionDate:"Work end date (based on effort, not deadline).",parentTaskId:"Parent task ID (for subtasks)",issueIdLink:"Related Issue ID",url:"Progma URL to parse",query:"Search query string",status:"Status name filter",progress:"Progress percentage (0-100)",teamId:"Team ID",workflowId:"Workflow ID",visibility:'Visibility scope ("private", "team", "project")',tags:"Array of tag strings",documentType:"Document type (markdown, richtext, etc.)",fields:"Array of field names to include in response",boxId:"Box ID (container for documents)",folderId:"Folder ID (for organization)",resourceType:"Resource type (task|issue)",action:"Action (create|update|delete|list)"},s=new f({name:"Progma Stdio MCP v2",version:"2.0.0"},{capabilities:{tools:{},resources:{}}});async function n(o,r={}){try{return(await j.post(`${g}${o}`,r,{headers:{Authorization:`Bearer ${b}`,"Content-Type":"application/json"}})).data}catch(a){const l=a;if(l.code==="ECONNREFUSED")throw new Error(`MCP Server is not reachable at ${g}. Please ensure the server is running.`);const d=l.response?.data?.message||l.message||"Unknown error";throw new Error(`API Error (${o}): ${d}`)}}function i(o){return!o.projectId&&!o.projectShortName&&I&&(o.projectId=I),o}function N(){s.tool("list-tasks","Filter by status, assignee, query. Auto-resolves project context.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),statusId:t.string().optional().describe(e.statusId),assigneeId:t.string().optional().describe(e.assigneeId),fields:t.array(t.string()).optional().describe(e.fields),includeAvailableTransitions:t.boolean().optional().describe("Include workflow transitions"),query:t.string().optional().describe(e.query)},async o=>{const r=await n("/mcp-tools/get-tasks",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-task","Create a new task in the project.",{title:t.string().describe(e.title),projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt),description:t.string().optional().describe(e.description),statusId:t.string().optional().describe(e.statusId),priorityId:t.string().optional().describe(e.priorityId),categoryId:t.string().optional().describe(e.categoryId),assigneeId:t.string().optional().describe(e.assigneeId),dueDate:t.string().optional().describe(e.dueDate),startDate:t.string().optional().describe(e.startDate),completionDate:t.string().optional().describe(e.completionDate),parentTaskId:t.string().optional().describe(e.parentTaskId),issueId:t.string().optional().describe(e.issueIdLink),tags:t.array(t.string()).optional().describe(e.tags),workflowId:t.string().optional().describe(e.workflowId),estimatedHours:t.number().optional().describe("Estimated hours (0-9999.99)"),actualHours:t.number().optional().describe("Actual hours (0-9999.99)")},async o=>{const r=await n("/mcp-tools/create-task",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-task","Includes subTasks. Use fields to filter (e.g., title, status, subTasks, progress).",{taskId:t.string().optional().describe(e.taskIdOpt),taskNumber:t.number().optional().describe(e.taskNumber),projectShortName:t.string().optional().describe(e.projectShortName),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/get-task-details",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("update-task","Change status, assignee, progress, dates, etc.",{taskId:t.string().optional().describe(e.taskIdOpt),taskNumber:t.number().optional().describe(e.taskNumber),projectShortName:t.string().optional().describe(e.projectShortName),title:t.string().optional().describe(e.title),description:t.string().optional().describe(e.description),statusId:t.string().optional().describe(e.statusId),priorityId:t.string().optional().describe(e.priorityId),categoryId:t.string().optional().describe(e.categoryId),assigneeId:t.string().optional().describe(e.assigneeId),dueDate:t.string().optional().describe(e.dueDate),startDate:t.string().optional().describe(e.startDate),completionDate:t.string().optional().describe(e.completionDate),parentTaskId:t.string().optional().describe(e.parentTaskId),issueId:t.string().optional().describe(e.issueIdLink),tags:t.array(t.string()).optional().describe(e.tags),workflowId:t.string().optional().describe(e.workflowId),progress:t.number().optional().describe(e.progress),visibility:t.string().optional().describe(e.visibility),teamId:t.string().optional().describe(e.teamId),estimatedHours:t.number().optional().describe("Estimated hours (0-9999.99)"),actualHours:t.number().optional().describe("Actual hours (0-9999.99)")},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/update-task",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("delete-task","Delete a task permanently.",{taskId:t.string().describe(e.taskId)},async o=>{const r=await n("/mcp-tools/delete-task",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-creation-metadata","Get creation metadata (statuses, priorities, etc.)",{resourceType:t.string().describe(e.resourceType),projectId:t.string().optional().describe(e.projectIdOpt),projectShortName:t.string().optional().describe(e.projectShortName)},async o=>{const r=await n("/mcp-tools/get-creation-metadata",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("manage-comment","Manage comments for tasks and issues",{action:t.string().describe(e.action),resourceType:t.string().describe(e.resourceType),resourceId:t.string().optional().describe("Task ID or Issue ID"),resourceNumber:t.number().optional().describe("Task Number or Issue Number"),projectShortName:t.string().optional().describe(e.projectShortName),commentId:t.string().optional().describe(e.commentId),content:t.string().optional().describe(e.content)},async o=>{const{action:r,resourceType:a,resourceId:l,resourceNumber:d,...p}=o;let c="",u={...p};const m=i({...p,projectShortName:o.projectShortName});if(a==="task"?(r==="create"?c="/mcp-tools/create-task-comment":r==="list"?c="/mcp-tools/get-task-comments":r==="update"?c="/mcp-tools/update-task-comment":r==="delete"&&(c="/mcp-tools/delete-task-comment"),u={...m,taskId:l,taskNumber:d}):a==="issue"&&(r==="create"?c="/mcp-tools/create-issue-comment":r==="list"?c="/mcp-tools/get-issue-comments":r==="update"?c="/mcp-tools/update-issue-comment":r==="delete"&&(c="/mcp-tools/delete-issue-comment"),u={...m,issueId:l,issueNumber:d}),!c)throw new Error(`Invalid action "${r}" or resourceType "${a}" for manage-comment`);const y=await n(c,u);return{content:[{type:"text",text:JSON.stringify(y,null,2)}]}}),s.tool("list-issues","List issues with filtering options.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),statusId:t.string().optional().describe(e.statusId),fields:t.array(t.string()).optional().describe(e.fields),query:t.string().optional().describe(e.query)},async o=>{const r=await n("/mcp-tools/get-issues",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-issue","Get detailed information about an issue.",{issueId:t.string().optional().describe(e.issueIdOpt),issueNumber:t.number().optional().describe(e.issueNumber),projectShortName:t.string().optional().describe(e.projectShortName),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/get-issue-details",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("create-issue","Create a new issue.",{projectId:t.string().describe(e.projectId),title:t.string().describe(e.title),description:t.string().optional().describe(e.description)},async o=>{const r=await n("/mcp-tools/create-issue",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-issue","Update an existing issue.",{issueId:t.string().optional().describe(e.issueIdOpt),issueNumber:t.number().optional().describe(e.issueNumber),projectShortName:t.string().optional().describe(e.projectShortName),title:t.string().optional().describe(e.title),description:t.string().optional().describe(e.description),statusId:t.string().optional().describe(e.statusId),priorityId:t.string().optional().describe(e.priorityId),categoryId:t.string().optional().describe(e.categoryId)},async o=>{const r=i(o);!r.projectShortName&&r.projectId&&(r.projectShortName=r.projectId);const a=await n("/mcp-tools/update-issue",r);return{content:[{type:"text",text:JSON.stringify(a,null,2)}]}}),s.tool("delete-issue","Delete an issue permanently.",{issueId:t.string().describe(e.issueId)},async o=>{const r=await n("/mcp-tools/delete-issue",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-document-boxes","Get document boxes and their folder structure",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId)},async o=>{const r=await n("/mcp-tools/list-document-boxes",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-documents","Filter by box, folder, query.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),boxId:t.string().optional().describe(e.boxId),folderId:t.string().optional().describe(e.folderId),fields:t.array(t.string()).optional().describe(e.fields),query:t.string().optional().describe(e.query)},async o=>{const r=await n("/mcp-tools/get-documents",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-document","Returns content. Use fields to filter.",{documentId:t.string().describe(e.documentId),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=await n("/mcp-tools/get-document-content",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-document","Create document",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt),boxId:t.string().optional().describe(e.boxId),folderId:t.string().optional().describe(e.folderId),title:t.string().describe(e.title),content:t.string().describe(e.content),type:t.enum(["markdown","richtext","canvas","excalidraw","folder"]).optional().default("markdown").describe(e.documentType)},async o=>{const r=await n("/mcp-tools/create-document",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-document","Update document.",{documentId:t.string().describe(e.documentId),title:t.string().optional().describe(e.title),content:t.string().optional().describe("New content (optional). Note: For real-time collaborative editing, use the web interface.")},async o=>{const r=await n("/mcp-tools/update-document",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("delete-document","Delete document permanently.",{documentId:t.string().describe(e.documentId)},async o=>{const r=await n("/mcp-tools/delete-document",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-project","Get project",{projectId:t.string().describe(e.projectId)},async o=>{const r=await n("/mcp-tools/get-project-overview",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-project-metadata","Get project metadata (statuses, priorities, members, etc.)",{projectId:t.string().optional().describe(e.projectIdOpt),projectShortName:t.string().optional().describe(e.projectShortName),types:t.array(t.string()).optional().describe("Metadata types to fetch")},async o=>{const r=await n("/mcp-tools/get-project-metadata",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-workflow-guide","Get MCP workflow guide",{},async()=>{const o=await n("/mcp-tools/get-workflow-guide",{});return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}),s.tool("read-attachment","Read attachment content",{fileId:t.string().describe("File ID")},async o=>{const r=await n("/mcp-tools/read-attachment",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("resolve-url","Parse Progma URL",{url:t.string().describe(e.url)},async o=>{const r=await n("/mcp-tools/resolve-url",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-projects","List projects that the user is a member of",{status:t.string().optional().describe("Filter by project status (active, archived, etc.)")},async o=>{const r=await n("/mcp-tools/list-projects",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-current-user","Get current authenticated user information",{},async()=>{const o=await n("/mcp-tools/get-current-user",{});return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}),s.tool("get-project-summary","Get project summary",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt)},async o=>{const r=await n("/mcp-tools/get-project-summary",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("analyze-progress","Analyze progress",{projectId:t.string().describe(e.projectId)},async o=>{const r=await n("/mcp-tools/analyze-progress",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-current-project","Get current project",{},async()=>{const o=await n("/mcp-tools/get-current-project",{});return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}}),s.tool("set-current-project","Set current project",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt)},async o=>{const r=await n("/mcp-tools/set-current-project",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("clear-current-project","Clear current project",{},async o=>{const r=await n("/mcp-tools/clear-current-project");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-qa-sheets","List QA sheets for a project.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=await n("/mcp-tools/get-qa-sheets",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-qa-sheet","Create a new QA sheet (QA\u7BA1\u7406\u8868).",{name:t.string().describe("QA sheet name"),projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt)},async o=>{const r=await n("/mcp-tools/create-qa-sheet",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("get-qa-sheet","Get detailed information about a QA sheet.",{qaSheetId:t.string().optional().describe("QA Sheet ID (ULID)"),qaSheetNumber:t.number().optional().describe("QA Sheet number (requires project context)"),projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectIdOpt),fields:t.array(t.string()).optional().describe(e.fields)},async o=>{const r=await n("/mcp-tools/get-qa-sheet-details",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-qa-sheet","Update an existing QA sheet.",{qaSheetId:t.string().optional().describe("QA Sheet ID (ULID)"),qaSheetNumber:t.number().optional().describe("QA Sheet number (requires project context)"),projectShortName:t.string().optional().describe(e.projectShortName),name:t.string().optional().describe("New QA sheet name")},async o=>{const r=await n("/mcp-tools/update-qa-sheet",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("delete-qa-sheet","Delete a QA sheet permanently.",{qaSheetId:t.string().describe("QA Sheet ID (ULID)")},async o=>{const r=await n("/mcp-tools/delete-qa-sheet",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("create-question","Create a new question in a QA sheet.",{qaSheetId:t.string().describe("QA Sheet ID to add question to"),questionContent:t.string().describe("Question text"),answerDeadline:t.string().optional().describe("Answer deadline (ISO 8601 date string)"),answererId:t.string().optional().describe("Answerer user ID"),attachmentIds:t.array(t.string()).optional().describe("Array of attachment IDs")},async o=>{const r=await n("/mcp-tools/create-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("update-question","Update an existing question.",{questionId:t.string().describe("Question ID (ULID)"),questionContent:t.string().optional().describe("Updated question text"),answerDeadline:t.string().nullable().optional().describe("Answer deadline (ISO 8601), null to clear"),answererId:t.string().nullable().optional().describe("Answerer user ID, null to clear"),status:t.enum(["pending","answered","overdue","onhold","withdrawn"]).optional().describe("Question status"),attachmentIds:t.array(t.string()).optional().describe("Array of attachment IDs")},async o=>{const r=await n("/mcp-tools/update-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("answer-question","Answer a question.",{questionId:t.string().describe("Question ID (ULID)"),answerContent:t.string().describe("Answer text"),attachmentIds:t.array(t.string()).optional().describe("Array of attachment IDs")},async o=>{const r=await n("/mcp-tools/answer-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-questions","List questions with filtering. Can filter by status, answerer, overdue, unanswered, etc.",{projectShortName:t.string().optional().describe(e.projectShortName),projectId:t.string().optional().describe(e.projectId),qaSheetId:t.string().optional().describe("QA Sheet ID to filter"),status:t.enum(["pending","answered","overdue","onhold","withdrawn"]).optional().describe("Question status filter"),answererId:t.string().optional().describe("Filter by answerer ID (who is assigned to answer)"),questionerId:t.string().optional().describe("Filter by questioner ID (who asked the question)"),isOverdue:t.boolean().optional().describe("Filter only overdue questions"),unanswered:t.boolean().optional().describe("Filter only unanswered questions"),search:t.string().optional().describe("Search keyword in question/answer content"),sortBy:t.enum(["createdAt","updatedAt","questionDate","answerDeadline","number"]).optional().describe("Sort field"),sortDirection:t.enum(["asc","desc"]).optional().describe("Sort direction"),page:t.number().optional().describe("Page number"),pageSize:t.number().optional().describe("Items per page")},async o=>{const r=await n("/mcp-tools/get-questions",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("delete-question","Delete a question permanently.",{questionId:t.string().describe("Question ID (ULID)")},async o=>{const r=await n("/mcp-tools/delete-question",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("list-notifications","List notifications for the current user. Filter by read status.",{filter:t.enum(["all","unread"]).optional().describe("Filter: all=all notifications, unread=unread only"),page:t.number().optional().describe("Page number (1-based)"),limit:t.number().optional().describe("Items per page (default: 20, max: 100)"),projectId:t.string().optional().describe(e.projectIdOpt),projectShortName:t.string().optional().describe(e.projectShortName)},async o=>{const r=await n("/mcp-tools/list-notifications",i(o));return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("mark-notification-read","Mark specific notifications as read.",{notificationIds:t.array(t.string()).describe("Array of notification IDs to mark as read")},async o=>{const r=await n("/mcp-tools/mark-notification-read",o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),s.tool("mark-all-notifications-read","Mark all notifications as read.",{},async()=>{const o=await n("/mcp-tools/mark-all-notifications-read",{});return{content:[{type:"text",text:JSON.stringify(o,null,2)}]}})}function w(){const o=new h("attachment:///{projectId}/{fileId}",{list:async()=>({resources:[]})});s.resource("attachments",o,{description:"Access attached files from tasks and issues"},async(r,a)=>{const l=a.fileId,d=await n("/mcp-tools/read-attachment",{fileId:l});if(!d.data)throw new Error("Failed to read resource");const p=d.data;return{contents:[{uri:r.href,mimeType:p.mimeType||"application/octet-stream",blob:p.content}]}})}async function x(){N(),w();const o=new S;await s.connect(o),console.error("Progma Stdio MCP Server v2 running on stdio")}x().catch(o=>{console.error("Fatal error in main:",o),process.exit(1)});
|
package/package.json
CHANGED