feat(mcp): 云端 MCP 工具从 8 个扩到 12 个
#159 只包了读 + 建 + 取消,日常闭环还缺:读产物文件、 读完整结果、重试、合并。新增 get_task_files(path 为 worktree 内相对路径,服务端 _safe_worktree_path 防逃逸, MCP 层不展开绝对路径)、get_task_result_full(依赖 #162 的 /result-full 端点,未部署前该工具回 404 isError,不炸)、 retry_task、merge_task(写操作,服务端状态机校验,非法 转换 409 原样透传,MCP 层不绕过)。 单测 test_mcp_server 10 项(含新增翻译 1 项)。
This commit is contained in:
1 parent
9a11ef27b8
commit
d5a602f7d3
2 files changed
+73
-3
No files matched your search
@@ -39,6 +39,16 @@ class FakeTransport:
|
||||
return 200, {"total_tokens": 10}
|
||||
if path == "/tasks/t1/trace":
|
||||
return 200, {"entries": []}
|
||||
if path == "/tasks/t1/files":
|
||||
return 200, {"files": [{"path": "a.py"}]}
|
||||
if path == "/tasks/t1/files?path=a.py":
|
||||
return 200, {"content": "print(1)"}
|
||||
if path == "/tasks/t1/result-full":
|
||||
return 200, {"result_text_full": "full-result"}
|
||||
if path == "/tasks/t1/retry":
|
||||
return 200, {"id": "t1", "status": "queued"}
|
||||
if path == "/tasks/t1/merge":
|
||||
return 200, {"id": "t1", "status": "merged"}
|
||||
if path == "/tasks/nope":
|
||||
return 404, {"error": "not found"}
|
||||
return 400, {"error": "bad request"}
|
||||
@@ -111,6 +121,28 @@ class MCPServerTestCase(unittest.TestCase):
|
||||
payload = json.loads(resp["result"]["content"][0]["text"])
|
||||
self.assertEqual(payload["http_status"], 404)
|
||||
|
||||
def test_new_tools_translate_to_rest(self):
|
||||
is_error, payload = self.server.call_tool(
|
||||
"get_task_files", {"task_id": "t1"})
|
||||
self.assertFalse(is_error)
|
||||
self.assertEqual(payload["files"][0]["path"], "a.py")
|
||||
is_error, payload = self.server.call_tool(
|
||||
"get_task_files", {"task_id": "t1", "path": "a.py"})
|
||||
self.assertFalse(is_error)
|
||||
self.assertEqual(payload["content"], "print(1)")
|
||||
is_error, payload = self.server.call_tool(
|
||||
"get_task_result_full", {"task_id": "t1"})
|
||||
self.assertFalse(is_error)
|
||||
self.assertEqual(payload["result_text_full"], "full-result")
|
||||
is_error, payload = self.server.call_tool(
|
||||
"retry_task", {"task_id": "t1"})
|
||||
self.assertFalse(is_error)
|
||||
self.assertEqual(payload["status"], "queued")
|
||||
is_error, payload = self.server.call_tool(
|
||||
"merge_task", {"task_id": "t1"})
|
||||
self.assertFalse(is_error)
|
||||
self.assertEqual(payload["status"], "merged")
|
||||
|
||||
def test_missing_arg_is_error_not_rest_call(self):
|
||||
before = len(self.transport.calls)
|
||||
is_error, payload = self.server.call_tool("list_tasks", {})
|
||||
|
||||
Reference in new issue
Block a user