forked from CodeGraphContext/CodeGraphContext
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrouter.py
More file actions
102 lines (87 loc) · 3.15 KB
/
Copy pathrouter.py
File metadata and controls
102 lines (87 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# src/codegraphcontext/api/router.py
import asyncio
from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks
from typing import Dict, Any, List
from pathlib import Path
from .schemas import (
IndexRequest,
QueryRequest,
SearchRequest,
ToolCallRequest,
ApiResponse
)
from codegraphcontext.server import MCPServer
router = APIRouter()
# Global server instance (initialized on startup)
_server_instance: MCPServer = None
def get_server() -> MCPServer:
global _server_instance
if _server_instance is None:
# Note: In a real production app, we'd handle initialization better
_server_instance = MCPServer(cwd=Path.cwd())
return _server_instance
@router.get("/status", response_model=ApiResponse)
async def get_status(server: MCPServer = Depends(get_server)):
status = server.db_manager.is_connected()
return ApiResponse(
status="ok",
message="Connected" if status else "Disconnected",
data={"database": server.resolved_context.database}
)
@router.get("/tools", response_model=ApiResponse)
async def list_tools(server: MCPServer = Depends(get_server)):
return ApiResponse(
status="ok",
data={"tools": list(server.tools.values())}
)
@router.post("/tools/call", response_model=ApiResponse)
async def call_tool(
request: ToolCallRequest,
server: MCPServer = Depends(get_server)
):
try:
result = await server.handle_tool_call(request.name, request.arguments)
if "error" in result:
return ApiResponse(status="error", error=result["error"])
return ApiResponse(status="ok", data=result)
except Exception as e:
return ApiResponse(status="error", error=str(e))
@router.post("/index", response_model=ApiResponse)
async def index_repository(
request: IndexRequest,
background_tasks: BackgroundTasks,
server: MCPServer = Depends(get_server)
):
# Map to add_code_to_graph tool
args = {
"path": request.path,
"repo_name": request.repo_name,
"branch": request.branch,
"force": request.force
}
# We call handle_tool_call which is async
# But add_code_to_graph starts a background job anyway
result = await server.handle_tool_call("add_code_to_graph", args)
if "error" in result:
raise HTTPException(status_code=400, detail=result["error"])
return ApiResponse(
status="ok",
message="Indexing job started",
data=result
)
@router.post("/query", response_model=ApiResponse)
async def execute_query(
request: QueryRequest,
server: MCPServer = Depends(get_server)
):
result = await server.handle_tool_call("execute_cypher_query", {
"cypher_query": request.query,
"params": request.params
})
if "error" in result:
return ApiResponse(status="error", error=result["error"])
return ApiResponse(status="ok", data=result)
@router.get("/repositories", response_model=ApiResponse)
async def list_repositories(server: MCPServer = Depends(get_server)):
result = await server.handle_tool_call("list_indexed_repositories", {})
return ApiResponse(status="ok", data=result)