projects/unit3/build-mcp-server/starter/server.py (17 lines of code) (raw):
#!/usr/bin/env python3
"""
Module 1: Basic MCP Server - Starter Code
TODO: Implement tools for analyzing git changes and suggesting PR templates
"""
import json
import subprocess
from pathlib import Path
from mcp.server.fastmcp import FastMCP
# Initialize the FastMCP server
mcp = FastMCP("pr-agent")
# PR template directory (shared across all modules)
TEMPLATES_DIR = Path(__file__).parent.parent.parent / "templates"
# TODO: Implement tool functions here
# Example structure for a tool:
# @mcp.tool()
# async def analyze_file_changes(base_branch: str = "main", include_diff: bool = True) -> str:
# """Get the full diff and list of changed files in the current git repository.
#
# Args:
# base_branch: Base branch to compare against (default: main)
# include_diff: Include the full diff content (default: true)
# """
# # Your implementation here
# pass
# Minimal stub implementations so the server runs
# TODO: Replace these with your actual implementations
@mcp.tool()
async def analyze_file_changes(base_branch: str = "main", include_diff: bool = True) -> str:
"""Get the full diff and list of changed files in the current git repository.
Args:
base_branch: Base branch to compare against (default: main)
include_diff: Include the full diff content (default: true)
"""
# TODO: Implement this tool
# IMPORTANT: MCP tools have a 25,000 token response limit!
# Large diffs can easily exceed this. Consider:
# - Adding a max_diff_lines parameter (e.g., 500 lines)
# - Truncating large outputs with a message
# - Returning summary statistics alongside limited diffs
# NOTE: Git commands run in the server's directory by default!
# To run in Claude's working directory, use MCP roots:
# context = mcp.get_context()
# roots_result = await context.session.list_roots()
# working_dir = roots_result.roots[0].uri.path
# subprocess.run(["git", "diff"], cwd=working_dir)
return json.dumps({"error": "Not implemented yet", "hint": "Use subprocess to run git commands"})
@mcp.tool()
async def get_pr_templates() -> str:
"""List available PR templates with their content."""
# TODO: Implement this tool
return json.dumps({"error": "Not implemented yet", "hint": "Read templates from TEMPLATES_DIR"})
@mcp.tool()
async def suggest_template(changes_summary: str, change_type: str) -> str:
"""Let Claude analyze the changes and suggest the most appropriate PR template.
Args:
changes_summary: Your analysis of what the changes do
change_type: The type of change you've identified (bug, feature, docs, refactor, test, etc.)
"""
# TODO: Implement this tool
return json.dumps({"error": "Not implemented yet", "hint": "Map change_type to templates"})
if __name__ == "__main__":
mcp.run()