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()