Files
moss-ai/mcp/didatodolist-mcp/scripts/sanity_openapi_demo.py
雷雨 8635b84b2d init
2025-12-15 22:05:56 +08:00

118 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
最小验证脚本:基于官方 /open/v1 端点,跑通创建→更新→完成→删除 闭环。
前置:已完成 OAuth 认证,存在 oauth_config.json。
步骤:
1) 创建临时项目
2) 在项目下创建任务(含 desc、reminders、items、timeZone/日期)
3) 更新任务(修改 desc/priority/reminders
4) 完成任务
5) 删除任务
6) 删除临时项目
"""
from __future__ import annotations
import sys
import time
from datetime import datetime, timedelta
from tools.official_api import init_api, APIError
from tools.adapter import adapter
def ts() -> str:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def main() -> int:
print(f"[{ts()}] 初始化 OAuth 客户端…")
try:
init_api(config_path="oauth_config.json")
except Exception as e:
print("初始化失败:请先运行 `python scripts/oauth_authenticate.py --port 38000` 完成认证。")
print(f"详情: {e}")
return 1
# 1) 创建临时项目
demo_name = f"MCP Demo {int(time.time())}"
print(f"[{ts()}] 创建演示项目: {demo_name}")
project = adapter.create_project(name=demo_name, color="#F18181")
project_id = project.get("id")
if not project_id:
print("创建项目失败:未返回 id")
return 1
print(f"[{ts()}] 项目ID: {project_id}")
try:
# 2) 创建任务
start_local = (datetime.now() + timedelta(minutes=5)).strftime("%Y-%m-%d %H:%M:%S")
due_local = (datetime.now() + timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S")
print(f"[{ts()}] 创建任务…")
task = adapter.create_task({
"title": "Demo Task",
"projectId": project_id,
"content": "Demo content",
"desc": "Checklist description",
"isAllDay": False,
"startDate": start_local,
"dueDate": due_local,
"timeZone": "Asia/Shanghai",
"reminders": ["TRIGGER:PT0S"],
"repeatFlag": "RRULE:FREQ=DAILY;INTERVAL=1",
"priority": 1,
"sortOrder": 12345,
"items": [
{
"title": "Subtask A",
"isAllDay": False,
"startDate": start_local,
"sortOrder": 1
}
]
})
task_id = task.get("id")
if not task_id:
print("创建任务失败:未返回 id")
return 1
print(f"[{ts()}] 任务ID: {task_id}")
# 3) 更新任务
print(f"[{ts()}] 更新任务…")
task = adapter.update_task(task_id, {
"projectId": project_id,
"desc": "Checklist description (updated)",
"priority": 3,
"reminders": ["TRIGGER:P0DT9H0M0S"],
})
print(f"[{ts()}] 更新后 priority={task.get('priority')} reminders={task.get('reminders')}")
# 4) 完成任务
print(f"[{ts()}] 完成任务…")
adapter.complete_task(project_id, task_id)
tasks_after = adapter.list_tasks(project_id=project_id, completed=True)
done = next((t for t in tasks_after if t.get('id') == task_id), None)
print(f"[{ts()}] 完成校验 isCompleted={done.get('isCompleted') if done else None}")
# 5) 删除任务
print(f"[{ts()}] 删除任务…")
adapter.delete_task(project_id, task_id)
print(f"[{ts()}] 任务已删除")
finally:
# 6) 清理项目
print(f"[{ts()}] 删除项目…")
try:
adapter.delete_project(project_id)
print(f"[{ts()}] 项目已删除")
except APIError as e:
print(f"删除项目失败(可忽略):{e}")
print(f"[{ts()}] 演示完毕 ✅")
return 0
if __name__ == "__main__":
sys.exit(main())