mcp_tasks_example.py
1 #!/usr/bin/env python3 2 """ 3 MCP Tasks API Example 4 5 Demonstrates the Tasks API per MCP 2025-11-25 specification. 6 Tasks are durable state machines for tracking long-running operations. 7 8 Usage: 9 python mcp_tasks_example.py 10 """ 11 12 import asyncio 13 from praisonai.mcp_server.tasks import ( 14 TaskManager, 15 TaskStatus, 16 ) 17 18 19 async def simulate_long_operation(method: str, params: dict) -> str: 20 """Simulate a long-running operation.""" 21 print(f" Executing: {method} with {params}") 22 await asyncio.sleep(1) # Simulate work 23 return f"Result for {method}: Success!" 24 25 26 async def main(): 27 print("=" * 60) 28 print("MCP Tasks API Example (2025-11-25 Specification)") 29 print("=" * 60) 30 31 # Create task manager with executor 32 manager = TaskManager(executor=simulate_long_operation) 33 34 # 1. Create a task 35 print("\n1. Creating a task...") 36 task = await manager.create_task( 37 method="tools/call", 38 params={"name": "search", "arguments": {"query": "AI news"}}, 39 metadata={"user": "demo"}, 40 execute=True, # Start execution immediately 41 ) 42 print(f" Task created: {task.id}") 43 print(f" Status: {task.status.value}") 44 print(f" Created at: {task.created_at}") 45 46 # 2. Get task status (poll) 47 print("\n2. Polling task status...") 48 for i in range(3): 49 await asyncio.sleep(0.5) 50 current = manager.get_task(task.id) 51 if current: 52 print(f" Poll {i+1}: status={current.status.value}") 53 if current.status in (TaskStatus.COMPLETED, TaskStatus.FAILED): 54 break 55 56 # 3. Get final result 57 print("\n3. Getting task result...") 58 final = manager.get_task(task.id) 59 if final: 60 print(f" Final status: {final.status.value}") 61 print(f" Result: {final.result}") 62 63 # Show MCP-compliant response format 64 print("\n MCP Response Format:") 65 task_dict = final.to_dict() 66 for key, value in task_dict.items(): 67 print(f" {key}: {value}") 68 69 # 4. Create another task and cancel it 70 print("\n4. Creating and cancelling a task...") 71 task2 = await manager.create_task( 72 method="tools/call", 73 params={"name": "slow_operation"}, 74 execute=False, # Don't execute yet 75 ) 76 print(f" Task created: {task2.id}") 77 78 cancelled = await manager.cancel_task(task2.id) 79 if cancelled: 80 print(f" Task cancelled: {cancelled.status.value}") 81 print(f" Status message: {cancelled.status_message}") 82 83 # 5. List all tasks 84 print("\n5. Listing all tasks...") 85 tasks = manager.list_tasks() 86 for t in tasks: 87 print(f" - {t.id}: {t.status.value}") 88 89 print("\n" + "=" * 60) 90 print("Tasks API Example Complete!") 91 print("=" * 60) 92 93 94 if __name__ == "__main__": 95 asyncio.run(main())