Fix #5: 修正部分Agent 無法正常處理錯誤問題

This commit is contained in:
siage 2025-04-19 19:37:29 +08:00
parent 316e692f29
commit ba20709f86
5 changed files with 307 additions and 156 deletions

4
package-lock.json generated
View File

@ -12,7 +12,8 @@
"@modelcontextprotocol/sdk": "^1.0.0", "@modelcontextprotocol/sdk": "^1.0.0",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"zod": "^3.22.4" "zod": "^3.22.4",
"zod-to-json-schema": "^3.24.5"
}, },
"bin": { "bin": {
"mcp-shrimp-task-manager": "dist/index.js" "mcp-shrimp-task-manager": "dist/index.js"
@ -1141,6 +1142,7 @@
"version": "3.24.5", "version": "3.24.5",
"resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz",
"integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==",
"license": "ISC",
"peerDependencies": { "peerDependencies": {
"zod": "^3.24.1" "zod": "^3.24.1"
} }

View File

@ -33,7 +33,8 @@
"@modelcontextprotocol/sdk": "^1.0.0", "@modelcontextprotocol/sdk": "^1.0.0",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"zod": "^3.22.4" "zod": "^3.22.4",
"zod-to-json-schema": "^3.24.5"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20.8.2", "@types/node": "^20.8.2",

View File

@ -1,6 +1,12 @@
import "dotenv/config"; import "dotenv/config";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { zodToJsonSchema } from "zod-to-json-schema";
import {
CallToolRequest,
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
// 導入工具函數 // 導入工具函數
import { import {
@ -51,160 +57,301 @@ async function main() {
console.log("啟動蝦米任務管理器服務..."); console.log("啟動蝦米任務管理器服務...");
// 創建MCP服務器 // 創建MCP服務器
const server = new McpServer({ const server = new Server(
name: "蝦米任務管理器", {
version: "1.0.0", name: "蝦米任務管理器",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// {
// type: "object" as const,
// }
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "plan_task",
description:
"初始化並詳細規劃任務流程,建立明確的目標與成功標準,可選擇參考現有任務進行延續規劃",
inputSchema: zodToJsonSchema(planTaskSchema),
},
{
name: "analyze_task",
description:
"深入分析任務需求並系統性檢查代碼庫,評估技術可行性與潛在風險,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分",
inputSchema: zodToJsonSchema(analyzeTaskSchema),
},
{
name: "reflect_task",
description:
"批判性審查分析結果,評估方案完整性並識別優化機會,確保解決方案符合最佳實踐,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分",
inputSchema: zodToJsonSchema(reflectTaskSchema),
},
{
name: "split_tasks",
description:
"將複雜任務分解為獨立且可追蹤的子任務,建立明確的依賴關係和優先順序。支援四種任務更新模式:追加(append)、覆蓋(overwrite)、選擇性更新(selective)和清除所有任務(clearAllTasks),其中覆蓋模式只會刪除未完成的任務並保留已完成任務,選擇性更新模式可根據任務名稱智能匹配更新現有任務,同時保留其他任務,如果你需要規劃全新的任務請使用清除所有任務模式會清除所有任務並創建備份。請優先使用清除所有任務模式,只有用戶要求變更或修改計畫內容才使用其他模式。\n\n**請參考之前的分析結果提供 pseudocode\n\n**如果任務太多或內容過長請分批使用「split_tasks」工具每次只提交一小部分任務**嚴重警告**你每次呼叫 split_tasks 傳遞的參數不能超過8000個字如果超出 8000 個字請多次呼叫工具完成",
inputSchema: zodToJsonSchema(splitTasksSchema),
},
{
name: "list_tasks",
description:
"生成結構化任務清單,包含完整狀態追蹤、優先級和依賴關係",
inputSchema: zodToJsonSchema(listTasksSchema),
},
{
name: "execute_task",
description:
"按照預定義計劃執行特定任務,確保每個步驟的輸出符合質量標準",
inputSchema: zodToJsonSchema(executeTaskSchema),
},
{
name: "verify_task",
description:
"全面驗證任務完成度,確保所有需求與技術標準都已滿足,並無遺漏細節",
inputSchema: zodToJsonSchema(verifyTaskSchema),
},
{
name: "complete_task",
description:
"正式標記任務為完成狀態,生成詳細的完成報告,並更新關聯任務的依賴狀態",
inputSchema: zodToJsonSchema(completeTaskSchema),
},
{
name: "delete_task",
description:
"刪除未完成的任務,但不允許刪除已完成的任務,確保系統記錄的完整性",
inputSchema: zodToJsonSchema(deleteTaskSchema),
},
{
name: "clear_all_tasks",
description:
"刪除系統中所有未完成的任務,該指令必須由用戶明確確認才能執行",
inputSchema: zodToJsonSchema(clearAllTasksSchema),
},
{
name: "update_task",
description:
"更新任務內容,包括名稱、描述和注記,但不允許修改已完成的任務",
inputSchema: zodToJsonSchema(updateTaskContentSchema),
},
{
name: "update_task_files",
description:
"更新任務相關文件列表,用於記錄與任務相關的代碼文件、參考資料等",
inputSchema: zodToJsonSchema(updateTaskRelatedFilesSchema),
},
{
name: "query_task",
description: "根據關鍵字或ID搜尋任務顯示省略版的任務資訊",
inputSchema: zodToJsonSchema(queryTaskSchema),
},
{
name: "get_task_detail",
description:
"根據任務ID獲取任務的完整詳細信息包括未截斷的實現指南和驗證標準等",
inputSchema: zodToJsonSchema(getTaskDetailSchema),
},
{
name: "process_thought",
description:
"任何需要思考或分析的時候,透過該工具進行靈活的、可適應和發展的思考過程來分析問題,隨著理解的加深,每個想法都可以建立、質疑或修改先前的見解。你可以質疑想法、假設想法、驗證想法,並且可以建立新的想法。你將重複這個過程,直到你對問題有足夠的理解,並且能夠提出有效的解決方案。如果你覺得思考已經充分可以把 nextThoughtNeeded 設為 false 並且停止思考,如果你覺得需要更多的思考你可以隨時變更 total_thoughts 來增加步驟。",
inputSchema: zodToJsonSchema(processThoughtSchema),
},
{
name: "init_project_rules",
description:
"初始化專案規範,當用戶要求產生或初始化專案規範文件時呼叫該工具,如果用戶要求變更或更新專案規範也呼叫該工具",
inputSchema: zodToJsonSchema(initProjectRulesSchema),
},
],
};
}); });
// 註冊工具 - 使用已定義的schema物件並添加內嵌錯誤處理 server.setRequestHandler(
server.tool( CallToolRequestSchema,
"plan_task", async (request: CallToolRequest) => {
"初始化並詳細規劃任務流程,建立明確的目標與成功標準,可選擇參考現有任務進行延續規劃", try {
planTaskSchema.shape, if (!request.params.arguments) {
async (args) => { throw new Error("No arguments provided");
return await planTask(args); }
}
);
server.tool( let parsedArgs;
"analyze_task", switch (request.params.name) {
"深入分析任務需求並系統性檢查代碼庫,評估技術可行性與潛在風險,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分", case "plan_task":
analyzeTaskSchema.shape, parsedArgs = await planTaskSchema.safeParseAsync(
async (args) => { request.params.arguments
return await analyzeTask(args); );
} if (!parsedArgs.success) {
); throw new Error(
`Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
server.tool( );
"reflect_task", }
"批判性審查分析結果,評估方案完整性並識別優化機會,確保解決方案符合最佳實踐,如果需要提供程式碼請使用 pseudocode 格式且盡量精簡只保留核心實現部分", return await planTask(parsedArgs.data);
reflectTaskSchema.shape, case "analyze_task":
async (args) => { parsedArgs = await analyzeTaskSchema.safeParseAsync(
return await reflectTask(args); request.params.arguments
} );
); if (!parsedArgs.success) {
throw new Error(
server.tool( `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
"split_tasks", );
"將複雜任務分解為獨立且可追蹤的子任務,建立明確的依賴關係和優先順序。支援四種任務更新模式:追加(append)、覆蓋(overwrite)、選擇性更新(selective)和清除所有任務(clearAllTasks),其中覆蓋模式只會刪除未完成的任務並保留已完成任務,選擇性更新模式可根據任務名稱智能匹配更新現有任務,同時保留其他任務,如果你需要規劃全新的任務請使用清除所有任務模式會清除所有任務並創建備份。請優先使用清除所有任務模式,只有用戶要求變更或修改計畫內容才使用其他模式。\n\n**請參考之前的分析結果提供 pseudocode\n\n**如果任務太多或內容過長請分批使用「split_tasks」工具每次只提交一小部分任務", }
splitTasksSchema.shape, return await analyzeTask(parsedArgs.data);
async (args) => { case "reflect_task":
return await splitTasks(args); parsedArgs = await reflectTaskSchema.safeParseAsync(
} request.params.arguments
); );
if (!parsedArgs.success) {
server.tool( throw new Error(
"list_tasks", `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
"生成結構化任務清單,包含完整狀態追蹤、優先級和依賴關係", );
listTasksSchema.shape, }
async (args) => { return await reflectTask(parsedArgs.data);
return await listTasks(args); case "split_tasks":
} parsedArgs = await splitTasksSchema.safeParseAsync(
); request.params.arguments
);
server.tool( if (!parsedArgs.success) {
"execute_task", throw new Error(
"按照預定義計劃執行特定任務,確保每個步驟的輸出符合質量標準", `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
executeTaskSchema.shape, );
async (args) => { }
return await executeTask(args); return await splitTasks(parsedArgs.data);
} case "list_tasks":
); parsedArgs = await listTasksSchema.safeParseAsync(
request.params.arguments
server.tool( );
"verify_task", if (!parsedArgs.success) {
"全面驗證任務完成度,確保所有需求與技術標準都已滿足,並無遺漏細節", throw new Error(
verifyTaskSchema.shape, `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
async (args) => { );
return await verifyTask(args); }
} return await listTasks(parsedArgs.data);
); case "execute_task":
parsedArgs = await executeTaskSchema.safeParseAsync(
server.tool( request.params.arguments
"complete_task", );
"正式標記任務為完成狀態,生成詳細的完成報告,並更新關聯任務的依賴狀態", if (!parsedArgs.success) {
completeTaskSchema.shape, throw new Error(
async (args) => { `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
return await completeTask(args); );
} }
); return await executeTask(parsedArgs.data);
case "verify_task":
server.tool( parsedArgs = await verifyTaskSchema.safeParseAsync(
"delete_task", request.params.arguments
"刪除未完成的任務,但不允許刪除已完成的任務,確保系統記錄的完整性", );
deleteTaskSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await deleteTask(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await verifyTask(parsedArgs.data);
// 註冊清除所有任務工具 case "complete_task":
server.tool( parsedArgs = await completeTaskSchema.safeParseAsync(
"clear_all_tasks", request.params.arguments
"刪除系統中所有未完成的任務,該指令必須由用戶明確確認才能執行", );
clearAllTasksSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await clearAllTasks(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await completeTask(parsedArgs.data);
// 註冊更新任務工具 case "delete_task":
server.tool( parsedArgs = await deleteTaskSchema.safeParseAsync(
"update_task", request.params.arguments
"更新任務內容,包括名稱、描述和注記,但不允許修改已完成的任務", );
updateTaskContentSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await updateTaskContent(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await deleteTask(parsedArgs.data);
// 註冊更新任務相關文件工具 case "clear_all_tasks":
server.tool( parsedArgs = await clearAllTasksSchema.safeParseAsync(
"update_task_files", request.params.arguments
"更新任務相關文件列表,用於記錄與任務相關的代碼文件、參考資料等", );
updateTaskRelatedFilesSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await updateTaskRelatedFiles(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await clearAllTasks(parsedArgs.data);
// 註冊查詢任務工具 case "update_task":
server.tool( parsedArgs = await updateTaskContentSchema.safeParseAsync(
"query_task", request.params.arguments
"根據關鍵字或ID搜尋任務顯示省略版的任務資訊", );
queryTaskSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await queryTask(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await updateTaskContent(parsedArgs.data);
// 註冊取得任務完整詳情工具 case "update_task_files":
server.tool( parsedArgs = await updateTaskRelatedFilesSchema.safeParseAsync(
"get_task_detail", request.params.arguments
"根據任務ID獲取任務的完整詳細信息包括未截斷的實現指南和驗證標準等", );
getTaskDetailSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await getTaskDetail(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await updateTaskRelatedFiles(parsedArgs.data);
// 註冊思維鏈工具 case "query_task":
server.tool( parsedArgs = await queryTaskSchema.safeParseAsync(
"process_thought", request.params.arguments
"任何需要思考或分析的時候,透過該工具進行靈活的、可適應和發展的思考過程來分析問題,隨著理解的加深,每個想法都可以建立、質疑或修改先前的見解。你可以質疑想法、假設想法、驗證想法,並且可以建立新的想法。你將重複這個過程,直到你對問題有足夠的理解,並且能夠提出有效的解決方案。如果你覺得思考已經充分可以把 nextThoughtNeeded 設為 false 並且停止思考,如果你覺得需要更多的思考你可以隨時變更 total_thoughts 來增加步驟。", );
processThoughtSchema.shape, if (!parsedArgs.success) {
async (args) => { throw new Error(
return await processThought(args); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
} );
); }
return await queryTask(parsedArgs.data);
// 註冊初始化專案規範工具 case "get_task_detail":
server.tool( parsedArgs = await getTaskDetailSchema.safeParseAsync(
"init_project_rules", request.params.arguments
"初始化專案規範,當用戶要求產生或初始化專案規範文件時呼叫該工具,如果用戶要求變更或更新專案規範也呼叫該工具", );
initProjectRulesSchema.shape, if (!parsedArgs.success) {
async () => { throw new Error(
return await initProjectRules(); `Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
);
}
return await getTaskDetail(parsedArgs.data);
case "process_thought":
parsedArgs = await processThoughtSchema.safeParseAsync(
request.params.arguments
);
if (!parsedArgs.success) {
throw new Error(
`Invalid arguments for tool ${request.params.name}: ${parsedArgs.error.message}`
);
}
return await processThought(parsedArgs.data);
case "init_project_rules":
return await initProjectRules();
default:
throw new Error(`工具 ${request.params.name} 不存在`);
}
} catch (error) {
console.error("Error executing tool:", error);
const errorMsg =
error instanceof Error ? error.message : String(error);
return {
content: [
{
type: "text",
text: `發生錯誤: ${errorMsg} \n 請嘗試修正錯誤並重新嘗試呼叫工具`,
},
],
};
}
} }
); );

View File

@ -46,7 +46,8 @@ export const knowledgeTransferTemplate = `## 知識傳遞機制
// 任務過多處理模板 // 任務過多處理模板
export const taskOverflowTemplate = `## split_tasks 任務太多或內容過長導致「split_tasks」工具無法正常運作時 export const taskOverflowTemplate = `## split_tasks 任務太多或內容過長導致「split_tasks」工具無法正常運作時
- 使使split_tasks - 使使split_tasks
- `; -
- **** split_tasks 8000 8000 `;
// 結尾提醒模板 // 結尾提醒模板
export const conclusionTemplate = `請嚴格審查方案,確保解決方案質量。`; export const conclusionTemplate = `請嚴格審查方案,確保解決方案質量。`;

View File

@ -43,4 +43,4 @@ export const dependencyManagementContent4 = `- 平衡關鍵路徑,優化並行
// 決策點模板 // 決策點模板
export const decisionPointsTemplate = `## 決策點\n\n`; export const decisionPointsTemplate = `## 決策點\n\n`;
export const decisionPointContent1 = `- 發現任務拆分不合理重新呼叫「split_tasks」調整\n`; export const decisionPointContent1 = `- 發現任務拆分不合理重新呼叫「split_tasks」調整\n`;
export const decisionPointContent2 = `- 確認任務拆分完善:生成執行計劃,確定優先順序\n`; export const decisionPointContent2 = `- 確認任務拆分完善:生成執行計劃,確定優先順序\n- **嚴重警告** 你每次呼叫 split_tasks 傳遞的參數不能超過8000個字如果超出 8000 個字請多次呼叫工具完成`;