Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import json
|
| 3 |
+
from datetime import datetime
|
| 4 |
+
from typing import List, Dict, Optional
|
| 5 |
+
|
| 6 |
+
# Simple in-memory task storage
|
| 7 |
+
tasks_db = []
|
| 8 |
+
task_id_counter = 1
|
| 9 |
+
|
| 10 |
+
# MCP Server Tool Functions
|
| 11 |
+
def create_task(title: str, description: str = "", priority: str = "medium") -> Dict:
|
| 12 |
+
"""Create a new task"""
|
| 13 |
+
global task_id_counter
|
| 14 |
+
task = {
|
| 15 |
+
"id": task_id_counter,
|
| 16 |
+
"title": title,
|
| 17 |
+
"description": description,
|
| 18 |
+
"priority": priority,
|
| 19 |
+
"status": "pending",
|
| 20 |
+
"created_at": datetime.now().isoformat()
|
| 21 |
+
}
|
| 22 |
+
tasks_db.append(task)
|
| 23 |
+
task_id_counter += 1
|
| 24 |
+
return {"success": True, "task": task, "message": "Task created successfully"}
|
| 25 |
+
|
| 26 |
+
def list_tasks(status: Optional[str] = None) -> Dict:
|
| 27 |
+
"""List all tasks or filter by status"""
|
| 28 |
+
if status:
|
| 29 |
+
filtered = [t for t in tasks_db if t["status"] == status]
|
| 30 |
+
return {"success": True, "tasks": filtered, "count": len(filtered)}
|
| 31 |
+
return {"success": True, "tasks": tasks_db, "count": len(tasks_db)}
|
| 32 |
+
|
| 33 |
+
def update_task(task_id: int, status: str) -> Dict:
|
| 34 |
+
"""Update task status"""
|
| 35 |
+
for task in tasks_db:
|
| 36 |
+
if task["id"] == task_id:
|
| 37 |
+
task["status"] = status
|
| 38 |
+
task["updated_at"] = datetime.now().isoformat()
|
| 39 |
+
return {"success": True, "task": task, "message": "Task updated"}
|
| 40 |
+
return {"success": False, "message": "Task not found"}
|
| 41 |
+
|
| 42 |
+
def delete_task(task_id: int) -> Dict:
|
| 43 |
+
"""Delete a task"""
|
| 44 |
+
global tasks_db
|
| 45 |
+
initial_len = len(tasks_db)
|
| 46 |
+
tasks_db = [t for t in tasks_db if t["id"] != task_id]
|
| 47 |
+
if len(tasks_db) < initial_len:
|
| 48 |
+
return {"success": True, "message": f"Task {task_id} deleted"}
|
| 49 |
+
return {"success": False, "message": "Task not found"}
|
| 50 |
+
|
| 51 |
+
def get_task_stats() -> Dict:
|
| 52 |
+
"""Get task statistics"""
|
| 53 |
+
stats = {
|
| 54 |
+
"total": len(tasks_db),
|
| 55 |
+
"pending": len([t for t in tasks_db if t["status"] == "pending"]),
|
| 56 |
+
"in_progress": len([t for t in tasks_db if t["status"] == "in_progress"]),
|
| 57 |
+
"completed": len([t for t in tasks_db if t["status"] == "completed"])
|
| 58 |
+
}
|
| 59 |
+
return {"success": True, "stats": stats}
|
| 60 |
+
|
| 61 |
+
# Gradio Interface Functions
|
| 62 |
+
def create_task_ui(title, desc, priority):
|
| 63 |
+
result = create_task(title, desc, priority)
|
| 64 |
+
return json.dumps(result, indent=2)
|
| 65 |
+
|
| 66 |
+
def list_tasks_ui(status_filter):
|
| 67 |
+
status = status_filter if status_filter != "all" else None
|
| 68 |
+
result = list_tasks(status)
|
| 69 |
+
return json.dumps(result, indent=2)
|
| 70 |
+
|
| 71 |
+
def update_task_ui(task_id, new_status):
|
| 72 |
+
result = update_task(int(task_id), new_status)
|
| 73 |
+
return json.dumps(result, indent=2)
|
| 74 |
+
|
| 75 |
+
def delete_task_ui(task_id):
|
| 76 |
+
result = delete_task(int(task_id))
|
| 77 |
+
return json.dumps(result, indent=2)
|
| 78 |
+
|
| 79 |
+
def stats_ui():
|
| 80 |
+
result = get_task_stats()
|
| 81 |
+
return json.dumps(result, indent=2)
|
| 82 |
+
|
| 83 |
+
# Create Gradio Interface
|
| 84 |
+
with gr.Blocks(title="Task Manager MCP Server") as demo:
|
| 85 |
+
gr.Markdown(
|
| 86 |
+
"""
|
| 87 |
+
# 📋 Task Manager MCP Server
|
| 88 |
+
### Track 1: Building MCP - MCP 1st Birthday Hackathon
|
| 89 |
+
|
| 90 |
+
This is a simple MCP server providing task management tools for AI agents.
|
| 91 |
+
|
| 92 |
+
**Available Tools:**
|
| 93 |
+
- Create tasks with title, description, and priority
|
| 94 |
+
- List all tasks or filter by status
|
| 95 |
+
- Update task status
|
| 96 |
+
- Delete tasks
|
| 97 |
+
- Get task statistics
|
| 98 |
+
|
| 99 |
+
**MCP Integration:** This server can be used by AI agents via the Model Context Protocol
|
| 100 |
+
to manage tasks programmatically.
|
| 101 |
+
"""
|
| 102 |
+
)
|
| 103 |
+
|
| 104 |
+
with gr.Tab("Create Task"):
|
| 105 |
+
title_input = gr.Textbox(label="Task Title", placeholder="Enter task title")
|
| 106 |
+
desc_input = gr.Textbox(label="Description", placeholder="Enter description", lines=3)
|
| 107 |
+
priority_input = gr.Radio(["low", "medium", "high"], label="Priority", value="medium")
|
| 108 |
+
create_btn = gr.Button("Create Task")
|
| 109 |
+
create_output = gr.Code(label="Result", language="json")
|
| 110 |
+
create_btn.click(create_task_ui, [title_input, desc_input, priority_input], create_output)
|
| 111 |
+
|
| 112 |
+
with gr.Tab("List Tasks"):
|
| 113 |
+
status_filter = gr.Radio(["all", "pending", "in_progress", "completed"],
|
| 114 |
+
label="Filter by Status", value="all")
|
| 115 |
+
list_btn = gr.Button("List Tasks")
|
| 116 |
+
list_output = gr.Code(label="Tasks", language="json")
|
| 117 |
+
list_btn.click(list_tasks_ui, [status_filter], list_output)
|
| 118 |
+
|
| 119 |
+
with gr.Tab("Update Task"):
|
| 120 |
+
update_id = gr.Number(label="Task ID", precision=0)
|
| 121 |
+
update_status = gr.Radio(["pending", "in_progress", "completed"],
|
| 122 |
+
label="New Status", value="in_progress")
|
| 123 |
+
update_btn = gr.Button("Update Task")
|
| 124 |
+
update_output = gr.Code(label="Result", language="json")
|
| 125 |
+
update_btn.click(update_task_ui, [update_id, update_status], update_output)
|
| 126 |
+
|
| 127 |
+
with gr.Tab("Delete Task"):
|
| 128 |
+
delete_id = gr.Number(label="Task ID to Delete", precision=0)
|
| 129 |
+
delete_btn = gr.Button("Delete Task", variant="stop")
|
| 130 |
+
delete_output = gr.Code(label="Result", language="json")
|
| 131 |
+
delete_btn.click(delete_task_ui, [delete_id], delete_output)
|
| 132 |
+
|
| 133 |
+
with gr.Tab("Statistics"):
|
| 134 |
+
stats_btn = gr.Button("Get Statistics")
|
| 135 |
+
stats_output = gr.Code(label="Statistics", language="json")
|
| 136 |
+
stats_btn.click(stats_ui, [], stats_output)
|
| 137 |
+
|
| 138 |
+
if __name__ == "__main__":
|
| 139 |
+
demo.launch()
|