from crewai import CrewBase, Agent, Task, Crew from crewai_tools import MCPServerAdapter from mcp import StdioServerParameters import os from typing import Dict, Any class CodeReviewCrew(CrewBase): """Code Review Crew for conducting code quality reviews.""" agents_config = "config/agents.yaml" tasks_config = "config/tasks.yaml" def __init__(self): super().__init__() # Configure Semgrep MCP server connection self.semgrep_server_params = StdioServerParameters( command="semgrep", args=["--metrics=off", "--json", "--stdin-display-name", "scanned_code", "--"], env={ **os.environ, "SEMGRAPH_APP_URL": os.getenv("SEMGRAPH_APP_URL", ""), "SEMGRAPH_API_TOKEN": os.getenv("SEMGRAPH_API_TOKEN", ""), } ) @Agent def code_reviewer(self) -> Agent: """Senior Software Engineer agent for code review.""" return Agent( config=self.agents_config["code_reviewer"], tools=[], # Tools will be added via MCP adapter in the task verbose=True ) @Task def code_review_task(self) -> Task: """Task for conducting code review.""" return Task( config=self.tasks_config["code_review_task"], ) @Crew def crew(self) -> Crew: """Create the Code Review crew.""" # Create MCP server adapter for Semgrep semgrep_adapter = MCPServerAdapter(self.semgrep_server_params) return Crew( agents=[self.code_reviewer()], tasks=[self.code_review_task()], process="sequential", verbose=True, tools=semgrep_adapter.tools if hasattr(semgrep_adapter, 'tools') else [], )