init
This commit is contained in:
117
mcp/didatodolist-mcp/scripts/sanity_openapi_demo.py
Normal file
117
mcp/didatodolist-mcp/scripts/sanity_openapi_demo.py
Normal file
@@ -0,0 +1,117 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user