Coverage for aceflow_mcp_server\server.py: 75%
52 statements
« prev ^ index » next coverage.py v7.10.1, created at 2025-08-03 13:42 +0800
« prev ^ index » next coverage.py v7.10.1, created at 2025-08-03 13:42 +0800
1"""AceFlow MCP Server implementation using FastMCP framework."""
3import click
4from fastmcp import FastMCP
5from typing import Dict, Any, Optional
6from .tools import AceFlowTools
7from .resources import AceFlowResources
8from .prompts import AceFlowPrompts
10# Create global FastMCP instance
11mcp = FastMCP("AceFlow")
13# Initialize components
14tools = AceFlowTools()
15resources = AceFlowResources()
16prompts = AceFlowPrompts()
18# Register tools with decorators
19@mcp.tool
20def aceflow_init(
21 mode: str,
22 project_name: Optional[str] = None,
23 directory: Optional[str] = None
24) -> Dict[str, Any]:
25 """Initialize AceFlow project with specified mode."""
26 return tools.aceflow_init(mode, project_name, directory)
28@mcp.tool
29def aceflow_stage(
30 action: str,
31 stage: Optional[str] = None
32) -> Dict[str, Any]:
33 """Manage project stages and workflow."""
34 return tools.aceflow_stage(action, stage)
36@mcp.tool
37def aceflow_validate(
38 mode: str = "basic",
39 fix: bool = False,
40 report: bool = False
41) -> Dict[str, Any]:
42 """Validate project compliance and quality."""
43 return tools.aceflow_validate(mode, fix, report)
45@mcp.tool
46def aceflow_template(
47 action: str,
48 template: Optional[str] = None
49) -> Dict[str, Any]:
50 """Manage workflow templates."""
51 return tools.aceflow_template(action, template)
53# Register resources with decorators
54@mcp.resource("aceflow://project/state/{project_id}")
55def project_state(project_id: str = "current") -> str:
56 """Get current project state."""
57 return resources.project_state(project_id)
59@mcp.resource("aceflow://workflow/config/{config_id}")
60def workflow_config(config_id: str = "default") -> str:
61 """Get workflow configuration."""
62 return resources.workflow_config(config_id)
64@mcp.resource("aceflow://stage/guide/{stage}")
65def stage_guide(stage: str) -> str:
66 """Get stage-specific guidance."""
67 return resources.stage_guide(stage)
69# Register prompts with decorators
70@mcp.prompt
71def workflow_assistant(
72 task: Optional[str] = None,
73 context: Optional[str] = None
74) -> str:
75 """Generate workflow assistance prompt."""
76 return prompts.workflow_assistant(task, context)
78@mcp.prompt
79def stage_guide_prompt(stage: str) -> str:
80 """Generate stage-specific guidance prompt."""
81 return prompts.stage_guide(stage)
84class AceFlowMCPServer:
85 """Main AceFlow MCP Server class."""
87 def __init__(self):
88 """Initialize the MCP server."""
89 self.mcp = mcp
91 def run(self, host: str = "localhost", port: int = 8000, log_level: str = "INFO"):
92 """Start the MCP server."""
93 self.mcp.run(host=host, port=port, log_level=log_level)
96@click.command()
97@click.option('--host', default='localhost', help='Host to bind to')
98@click.option('--port', default=8000, type=int, help='Port to bind to')
99@click.option('--log-level', default='INFO', help='Log level')
100@click.version_option(version="1.0.1")
101def main(host: str, port: int, log_level: str):
102 """Start AceFlow MCP Server."""
103 server = AceFlowMCPServer()
104 server.run(host=host, port=port, log_level=log_level)
107if __name__ == "__main__":
108 main()