|
|
import gradio as gr |
|
|
import json |
|
|
from datetime import datetime |
|
|
from typing import List, Dict, Optional |
|
|
|
|
|
|
|
|
tasks_db = [] |
|
|
task_id_counter = 1 |
|
|
|
|
|
|
|
|
def create_task(title: str, description: str = "", priority: str = "medium") -> Dict: |
|
|
"""Create a new task""" |
|
|
global task_id_counter |
|
|
task = { |
|
|
"id": task_id_counter, |
|
|
"title": title, |
|
|
"description": description, |
|
|
"priority": priority, |
|
|
"status": "pending", |
|
|
"created_at": datetime.now().isoformat() |
|
|
} |
|
|
tasks_db.append(task) |
|
|
task_id_counter += 1 |
|
|
return {"success": True, "task": task, "message": "Task created successfully"} |
|
|
|
|
|
def list_tasks(status: Optional[str] = None) -> Dict: |
|
|
"""List all tasks or filter by status""" |
|
|
if status: |
|
|
filtered = [t for t in tasks_db if t["status"] == status] |
|
|
return {"success": True, "tasks": filtered, "count": len(filtered)} |
|
|
return {"success": True, "tasks": tasks_db, "count": len(tasks_db)} |
|
|
|
|
|
def update_task(task_id: int, status: str) -> Dict: |
|
|
"""Update task status""" |
|
|
for task in tasks_db: |
|
|
if task["id"] == task_id: |
|
|
task["status"] = status |
|
|
task["updated_at"] = datetime.now().isoformat() |
|
|
return {"success": True, "task": task, "message": "Task updated"} |
|
|
return {"success": False, "message": "Task not found"} |
|
|
|
|
|
def delete_task(task_id: int) -> Dict: |
|
|
"""Delete a task""" |
|
|
global tasks_db |
|
|
initial_len = len(tasks_db) |
|
|
tasks_db = [t for t in tasks_db if t["id"] != task_id] |
|
|
if len(tasks_db) < initial_len: |
|
|
return {"success": True, "message": f"Task {task_id} deleted"} |
|
|
return {"success": False, "message": "Task not found"} |
|
|
|
|
|
def get_task_stats() -> Dict: |
|
|
"""Get task statistics""" |
|
|
stats = { |
|
|
"total": len(tasks_db), |
|
|
"pending": len([t for t in tasks_db if t["status"] == "pending"]), |
|
|
"in_progress": len([t for t in tasks_db if t["status"] == "in_progress"]), |
|
|
"completed": len([t for t in tasks_db if t["status"] == "completed"]) |
|
|
} |
|
|
return {"success": True, "stats": stats} |
|
|
|
|
|
|
|
|
def create_task_ui(title, desc, priority): |
|
|
result = create_task(title, desc, priority) |
|
|
return json.dumps(result, indent=2) |
|
|
|
|
|
def list_tasks_ui(status_filter): |
|
|
status = status_filter if status_filter != "all" else None |
|
|
result = list_tasks(status) |
|
|
return json.dumps(result, indent=2) |
|
|
|
|
|
def update_task_ui(task_id, new_status): |
|
|
result = update_task(int(task_id), new_status) |
|
|
return json.dumps(result, indent=2) |
|
|
|
|
|
def delete_task_ui(task_id): |
|
|
result = delete_task(int(task_id)) |
|
|
return json.dumps(result, indent=2) |
|
|
|
|
|
def stats_ui(): |
|
|
result = get_task_stats() |
|
|
return json.dumps(result, indent=2) |
|
|
|
|
|
|
|
|
with gr.Blocks(title="Task Manager MCP Server") as demo: |
|
|
gr.Markdown( |
|
|
""" |
|
|
# 📋 Task Manager MCP Server |
|
|
### Track 1: Building MCP - MCP 1st Birthday Hackathon |
|
|
|
|
|
This is a simple MCP server providing task management tools for AI agents. |
|
|
|
|
|
**Available Tools:** |
|
|
- Create tasks with title, description, and priority |
|
|
- List all tasks or filter by status |
|
|
- Update task status |
|
|
- Delete tasks |
|
|
- Get task statistics |
|
|
|
|
|
**MCP Integration:** This server can be used by AI agents via the Model Context Protocol |
|
|
to manage tasks programmatically. |
|
|
""" |
|
|
) |
|
|
|
|
|
with gr.Tab("Create Task"): |
|
|
title_input = gr.Textbox(label="Task Title", placeholder="Enter task title") |
|
|
desc_input = gr.Textbox(label="Description", placeholder="Enter description", lines=3) |
|
|
priority_input = gr.Radio(["low", "medium", "high"], label="Priority", value="medium") |
|
|
create_btn = gr.Button("Create Task") |
|
|
create_output = gr.Code(label="Result", language="json") |
|
|
create_btn.click(create_task_ui, [title_input, desc_input, priority_input], create_output) |
|
|
|
|
|
with gr.Tab("List Tasks"): |
|
|
status_filter = gr.Radio(["all", "pending", "in_progress", "completed"], |
|
|
label="Filter by Status", value="all") |
|
|
list_btn = gr.Button("List Tasks") |
|
|
list_output = gr.Code(label="Tasks", language="json") |
|
|
list_btn.click(list_tasks_ui, [status_filter], list_output) |
|
|
|
|
|
with gr.Tab("Update Task"): |
|
|
update_id = gr.Number(label="Task ID", precision=0) |
|
|
update_status = gr.Radio(["pending", "in_progress", "completed"], |
|
|
label="New Status", value="in_progress") |
|
|
update_btn = gr.Button("Update Task") |
|
|
update_output = gr.Code(label="Result", language="json") |
|
|
update_btn.click(update_task_ui, [update_id, update_status], update_output) |
|
|
|
|
|
with gr.Tab("Delete Task"): |
|
|
delete_id = gr.Number(label="Task ID to Delete", precision=0) |
|
|
delete_btn = gr.Button("Delete Task", variant="stop") |
|
|
delete_output = gr.Code(label="Result", language="json") |
|
|
delete_btn.click(delete_task_ui, [delete_id], delete_output) |
|
|
|
|
|
with gr.Tab("Statistics"): |
|
|
stats_btn = gr.Button("Get Statistics") |
|
|
stats_output = gr.Code(label="Statistics", language="json") |
|
|
stats_btn.click(stats_ui, [], stats_output) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |