Thursday, August 28, 2025

Your AI Sidekick: How Claude took over Pritee’s Repetitive tasks

 


It was a classic Wednesday morning in our Bengaluru office. Pritee, one of our sharpest Project Managers, had just stepped out of a stakeholder call. She was juggling three high-priority projects, and you could see the mental load—keeping track of deadlines, risks, and RAG statuses scattered across different Excel sheets and tools.

During our coffee break, she vented, “Yaar, I spend half my day just gathering information. If I could just ask Claude, What’s the health of the phoenix project and are we on track? and get a real answer from my data... that would be a dream.”

We've all been there, right? That’s the classic "last mile" problem with even the most brilliant AI models. They know everything about the world, but they know nothing about your world—your project tracker, your team’s progress, your specific ground reality.

What if you could build a bridge for that? A way to give Claude a special key to unlock your custom tools, so it can do the needful for you. This bridge is what we can call an MCP Server and today, I'll show you how we can build one for Pritee using Python.

What exactly is this MCP Server ?

Imagine Claude is a super-smart new intern. This intern can write, analyse and reason better than anyone. But if you ask them to check the RAG status of your project from an internal dashboard, they'll just stare back blankly. They don’t have access.

An MCP Server is like you giving that intern a set of keys and a clear instruction manual. Each "key" is a tool (an API endpoint), and the "manual" is a specification that tells the intern (Claude) exactly what each key does and how to use it.

So, when Pritee asks, "Hey, what's the status of the phoenix project?", Claude consults its manual, finds the right key (get_project_status), uses it to unlock her server, gets the data, and then gives her a perfectly framed answer. All sorted.

Let's Get Our Hands Dirty: Building a PM's Best Friend in Python

We're going to build a server with two powerful tools for Pritee:

  1. Get Project Status: A tool to fetch a project's health (RAG status) and any overdue tasks.

  2. Log a New Risk: A tool to quickly log a new risk against a project.

We'll use FastMCP, a modern and super-fast Python framework. If you haven't installed it, just run a quick command to install all required modules:

pip install fastmcp pydantic requests


Now, let's create our server file. Call it pm_mcp_server.py

# pm_mcp_server.py

from fastmcp import FastMCP
from pydantic import BaseModel, Field
from datetime import date
import requests

mcp = FastMCP("Pritee's PM Tool Server for Claude")

# --- Mock Database for our Projects ---
# In a real-world scenario, this data would come from Jira, a database, or a project management tool.
mock_project_data = {
    "ProjectPhoenix": {
        "status": "Amber",
        "tasks": [
            {"name": "Finalize UI/UX designs", "due_date": "2025-08-20", "owner": "Hari Prasad"},
            {"name": "API integration", "due_date": "2025-08-30", "owner": "Rishabh Kochar"}
        ],
        "risks": []
    },
    "ProjectTitan": {
        "status": "Green",
        "tasks": [
            {"name": "Complete user testing", "due_date": "2025-09-05", "owner": "Evangeline"},
            {"name": "Deploy to staging", "due_date": "2025-09-15", "owner": "Shashank"}
        ],
        "risks": []
    }
}

# --- Tool 1: Get Project Status ---

class ProjectStatusInput(BaseModel):
    project_name: str = Field(..., description="The name of the project, e.g., 'ProjectPhoenix'.")

@app.post("/get_project_status", tags=["Project Tools"])
def get_project_status(payload: ProjectStatusInput):
    project = mock_project_data.get(payload.project_name)
    if not project:
        return {"status": "error", "message": f"Project '{payload.project_name}' not found."}

    today = date.today()
    overdue_tasks = [
        task for task in project["tasks"] 
        if date.fromisoformat(task["due_date"]) < today
    ]    

    return {
        "project_name": payload.project_name,
        "rag_status": project["status"],
        "overdue_tasks": overdue_tasks
    }

# --- Tool 2: Log a New Risk ---

class LogRiskInput(BaseModel):
    project_name: str = Field(..., description="The project to log the risk against.")
    risk_description: str = Field(..., description="A clear description of the new risk.")
    priority: str = Field(..., description="The priority of the risk (e.g., 'High', 'Medium', 'Low').")

@app.post("/log_new_risk", tags=["Project Tools"])
def log_new_risk(payload: LogRiskInput):
    project = mock_project_data.get(payload.project_name)
    if not project:
        return {"status": "error", "message": f"Project '{payload.project_name}' not found."}

    new_risk = {"description": payload.risk_description, "priority": payload.priority, "logged_on": str(date.today())}
    project["risks"].append(new_risk) # Adding to our mock data        

    return {"status": "success", "message": f"New risk logged for {payload.project_name}."}


This code sets up an API specifically for a PM's workflow. It checks for overdue tasks by comparing dates and allows for logging new risks on the fly.

Putting It All Together: A PM's Dream Workflow

Okay, so our FastMCP server is humming along nicely on our local machine and is ready for action. Now for the most important step: the actual introduction. How do we make Claude aware of these fantastic new powers we've built for it?

The Handshake: Introducing your Tools to Claude

Think of this part like giving a briefing to a new, super-intelligent team member. You need to give them their tools, tell them where the office is (your server address), and make sure they understand their tasks.

Claude Desktop looks for a JSON configuration file (usually stored in your user directory under .config/calude or a similar path, depending on your OS). If it doesn’t exist, you can create one manually.

The file should be named exactly like claude_desktop_config.json

Inside this JSON, you’ll declare one or more MCP servers under the "mcpServers" key. Each entry includes:

  • A unique server name (e.g., "pm-tool-server")

  • The "type" of connection ("stdio" in most cases)

  • The "command" to launch the server (here, the Python binary).

  • Any "args" needed (the path to your MCP server script).

Here’s an example configuration:

{
  "mcpServers": {
    "pm-tool-server": {
      "type": "stdio",
      "command": "/usr/local/opt/python@3.11/libexec/bin/python",
      "args": ["/Users/nsrikantaiah/Projects/Python/pm-tool-server/pm_mcp_server.py"]
    }
  }
}

This tells Claude Desktop to spin up your pm-tool-server by running the script pm_mcp_server.py using Python. The app will then communicate with it through standard input/output streams.

Once you’ve saved your configuration file, restart Claude Desktop. On startup, it will read the JSON configuration, launch your MCP server and automatically establish the connection.

If everything is set up correctly, Claude will now be able to call your server whenever needed, extending its capabilities seamlessly.

Start Delegating!

Now that Claude is briefed and ready, Pritee can issue commands in plain English in the chat session.

Watch this:

Review the status of Phoenix project. If you find any overdue tasks, create a new medium-priority risk with the description as Potential timeline slippage due to design delays.

Review the status of the Phoenix project. 

Behind the scenes, Claude will execute the command flawlessly:

  • It calls http://127.0.0.1:8000/get_project_status for "Phoenix".

  • Your server sees that the "Finalize UI/UX designs" task is overdue (since today is August 26, 2025, and the due date was August 20, 2025) and returns this information.

  • Finally, it confirms to Pritee that the status was checked and highlights the risks with overdue tasks.

Chat script between Pritee and Claude

From Overwhelmed to Empowered

This isn’t just a flashy tech demo. For Pritee, it’s a shift from being a data collector to becoming a decision-maker. The routine work gets automated, freeing her up to focus on strategy, problem-solving and helping her team without getting burnt. 

When you build a simple MCP server, you’re not merely wiring up another API—you’re creating a personalized extension of your AI. One that adapts to your workflow and truly acts as an assistant.

Now, look at your own daily grind. Which repetitive tasks could you hand over to automation? And what’s the first tool you’d build to make your AI genuinely your own?

Tags: , , , ,
Location: Bengaluru, Karnataka, India

0 comments:

Post a Comment

Featured Post

Your AI Sidekick: How Claude took over Pritee’s Repetitive tasks

  It was a classic Wednesday morning in our Bengaluru office. Pritee, one of our sharpest Project Managers, had just stepped out of a stakeh...