@progma/mcp-std 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +109 -0
- package/dist/index-v2.d.ts +2 -0
- package/dist/index-v2.js +2 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright (c) 2025 XEED Inc. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
This software is proprietary and confidential.
|
|
4
|
+
Use of this software is subject to the terms of service at https://progma.io/terms
|
|
5
|
+
|
|
6
|
+
Unauthorized copying, modification, distribution, or use of this software,
|
|
7
|
+
via any medium, is strictly prohibited.
|
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# @progma/mcp-std
|
|
2
|
+
|
|
3
|
+
Progma MCP用のStdioアダプター - AIエージェント(Claude Desktop、Clineなど)をProgmaプロジェクト管理に接続します。
|
|
4
|
+
|
|
5
|
+
## インストール
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @progma/mcp-std
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 設定
|
|
12
|
+
|
|
13
|
+
### 環境変数
|
|
14
|
+
|
|
15
|
+
| 変数名 | 必須 | 説明 |
|
|
16
|
+
|--------|------|------|
|
|
17
|
+
| `PERSONAL_ACCESS_TOKEN` | はい | Progmaの個人アクセストークン |
|
|
18
|
+
| `DEFAULT_PROJECT_ID` | いいえ | デフォルトのプロジェクトID |
|
|
19
|
+
| `MCP_SERVER_URL` | いいえ | MCPサーバーURL(デフォルト: `https://mcp.progma.io`) |
|
|
20
|
+
|
|
21
|
+
### Claude Desktop
|
|
22
|
+
|
|
23
|
+
Claude Desktopの設定ファイル(`claude_desktop_config.json`)に以下を追加:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"mcpServers": {
|
|
28
|
+
"progma": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["-y", "@progma/mcp-std"],
|
|
31
|
+
"env": {
|
|
32
|
+
"PERSONAL_ACCESS_TOKEN": "あなたのトークン",
|
|
33
|
+
"DEFAULT_PROJECT_ID": "プロジェクトID"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Cline / その他のMCPクライアント
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"progma": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "@progma/mcp-std"],
|
|
48
|
+
"env": {
|
|
49
|
+
"PERSONAL_ACCESS_TOKEN": "あなたのトークン"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 利用可能なツール
|
|
57
|
+
|
|
58
|
+
### タスク管理
|
|
59
|
+
- `list-tasks` - タスク一覧取得
|
|
60
|
+
- `create-task` - タスク作成
|
|
61
|
+
- `get-task` - タスク詳細取得
|
|
62
|
+
- `update-task` - タスク更新
|
|
63
|
+
- `delete-task` - タスク削除
|
|
64
|
+
|
|
65
|
+
### 課題管理
|
|
66
|
+
- `list-issues` - 課題一覧取得
|
|
67
|
+
- `create-issue` - 課題作成
|
|
68
|
+
- `get-issue` - 課題詳細取得
|
|
69
|
+
- `update-issue` - 課題更新
|
|
70
|
+
- `delete-issue` - 課題削除
|
|
71
|
+
|
|
72
|
+
### ドキュメント管理
|
|
73
|
+
- `list-document-boxes` - ドキュメントボックス一覧取得
|
|
74
|
+
- `list-documents` - ドキュメント一覧取得
|
|
75
|
+
- `get-document` - ドキュメント内容取得
|
|
76
|
+
- `create-document` - ドキュメント作成
|
|
77
|
+
- `update-document` - ドキュメント更新
|
|
78
|
+
- `delete-document` - ドキュメント削除
|
|
79
|
+
|
|
80
|
+
### プロジェクト管理
|
|
81
|
+
- `get-project` - プロジェクト概要取得
|
|
82
|
+
- `get-project-metadata` - プロジェクトメタデータ取得
|
|
83
|
+
- `get-project-summary` - プロジェクトサマリー取得
|
|
84
|
+
- `analyze-progress` - 進捗分析
|
|
85
|
+
|
|
86
|
+
### QA管理表
|
|
87
|
+
- `list-qa-sheets` - QA管理表一覧取得
|
|
88
|
+
- `create-qa-sheet` - QA管理表作成
|
|
89
|
+
- `get-qa-sheet` - QA管理表詳細取得
|
|
90
|
+
- `update-qa-sheet` - QA管理表更新
|
|
91
|
+
- `delete-qa-sheet` - QA管理表削除
|
|
92
|
+
|
|
93
|
+
### 質問管理
|
|
94
|
+
- `list-questions` - 質問一覧取得
|
|
95
|
+
- `create-question` - 質問作成
|
|
96
|
+
- `update-question` - 質問更新
|
|
97
|
+
- `answer-question` - 質問に回答
|
|
98
|
+
- `delete-question` - 質問削除
|
|
99
|
+
|
|
100
|
+
### ユーティリティ
|
|
101
|
+
- `manage-comment` - タスク/課題のコメント管理
|
|
102
|
+
- `read-attachment` - 添付ファイル読み込み
|
|
103
|
+
- `resolve-url` - ProgmaのURL解析
|
|
104
|
+
- `get-workflow-guide` - MCPワークフローガイド取得
|
|
105
|
+
- `get-current-project` / `set-current-project` / `clear-current-project` - 現在のプロジェクトコンテキスト管理
|
|
106
|
+
|
|
107
|
+
## ライセンス
|
|
108
|
+
|
|
109
|
+
Proprietary - All Rights Reserved. Copyright (c) XEED Inc.
|
package/dist/index-v2.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
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("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 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
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@progma/mcp-std",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Stdio adapter for Progma MCP - Connects AI agents (Claude Desktop, Cline, etc.) to Progma project management",
|
|
5
|
+
"main": "dist/index-v2.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"progma-mcp": "dist/index-v2.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/index-v2.js",
|
|
12
|
+
"dist/index-v2.d.ts",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc && esbuild dist/index-v2.js --platform=node --format=esm --minify --outfile=dist/index-v2.min.js && mv dist/index-v2.min.js dist/index-v2.js",
|
|
18
|
+
"start": "node dist/index-v2.js",
|
|
19
|
+
"dev": "ts-node src/index-v2.ts",
|
|
20
|
+
"prepublishOnly": "npm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"mcp",
|
|
24
|
+
"model-context-protocol",
|
|
25
|
+
"claude",
|
|
26
|
+
"ai",
|
|
27
|
+
"project-management",
|
|
28
|
+
"progma",
|
|
29
|
+
"stdio"
|
|
30
|
+
],
|
|
31
|
+
"author": "XEED Inc.",
|
|
32
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
33
|
+
"homepage": "https://progma.io",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@modelcontextprotocol/sdk": "1.25.1",
|
|
39
|
+
"axios": "1.12.1",
|
|
40
|
+
"dotenv": "^16.4.5"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^20.11.24",
|
|
44
|
+
"esbuild": "0.27.2",
|
|
45
|
+
"ts-node": "^10.9.2",
|
|
46
|
+
"typescript": "^5.3.3"
|
|
47
|
+
}
|
|
48
|
+
}
|