Skip to content

Commit 05ced3b

Browse files
authored
♻️ refactor mcp app/service/db/test case
2 parents b67341a + d8a5268 commit 05ced3b

File tree

7 files changed

+210
-237
lines changed

7 files changed

+210
-237
lines changed

backend/apps/remote_mcp_app.py

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from fastapi.responses import JSONResponse
66
from http import HTTPStatus
77

8-
from consts.exceptions import MCPConnectionError, MCPNameIllegal, MCPDatabaseError
8+
from consts.exceptions import MCPConnectionError, MCPNameIllegal
99
from services.remote_mcp_service import (
1010
add_remote_mcp_server_list,
1111
delete_remote_mcp_server_list,
@@ -33,9 +33,13 @@ async def get_tools_from_remote_mcp(
3333
content={
3434
"tools": [tool.__dict__ for tool in tools_info], "status": "success"}
3535
)
36+
except MCPConnectionError as e:
37+
logger.error(f"Failed to get tools from remote MCP server: {e}")
38+
raise HTTPException(status_code=HTTPStatus.SERVICE_UNAVAILABLE,
39+
detail="MCP connection failed")
3640
except Exception as e:
3741
logger.error(f"get tools from remote MCP server failed, error: {e}")
38-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
42+
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
3943
detail="Failed to get tools from remote MCP server.")
4044

4145

@@ -66,13 +70,9 @@ async def add_remote_proxies(
6670
logger.error(f"Failed to add remote MCP proxy: {e}")
6771
raise HTTPException(status_code=HTTPStatus.SERVICE_UNAVAILABLE,
6872
detail="MCP connection failed")
69-
except MCPDatabaseError as e:
70-
logger.error(f"Failed to add remote MCP proxy: {e}")
71-
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
72-
detail="Failed to add remote MCP proxy, database error")
7373
except Exception as e:
7474
logger.error(f"Failed to add remote MCP proxy: {e}")
75-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
75+
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
7676
detail="Failed to add remote MCP proxy")
7777

7878

@@ -94,13 +94,9 @@ async def delete_remote_proxies(
9494
content={"message": "Successfully deleted remote MCP proxy",
9595
"status": "success"}
9696
)
97-
except MCPDatabaseError as e:
98-
logger.error(f"Failed to delete remote MCP proxy: {e}")
99-
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
100-
detail="Failed to delete remote MCP proxy, database error")
10197
except Exception as e:
10298
logger.error(f"Failed to delete remote MCP proxy: {e}")
103-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
99+
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
104100
detail="Failed to delete remote MCP proxy")
105101

106102

@@ -119,7 +115,7 @@ async def get_remote_proxies(
119115
)
120116
except Exception as e:
121117
logger.error(f"Failed to get remote MCP proxy: {e}")
122-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
118+
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
123119
detail="Failed to get remote MCP proxy")
124120

125121

@@ -134,11 +130,11 @@ async def check_mcp_health(mcp_url: str, service_name: str, authorization: Optio
134130
status_code=HTTPStatus.OK,
135131
content={"status": "success"}
136132
)
137-
except MCPDatabaseError as e:
138-
logger.error(f"Failed to check the health of the MCP server: {e}")
139-
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
140-
detail="Failed to check the health of the MCP server, database error")
133+
except MCPConnectionError as e:
134+
logger.error(f"MCP connection failed: {e}")
135+
raise HTTPException(status_code=HTTPStatus.SERVICE_UNAVAILABLE,
136+
detail="MCP connection failed")
141137
except Exception as e:
142138
logger.error(f"Failed to check the health of the MCP server: {e}")
143-
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
139+
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
144140
detail="Failed to check the health of the MCP server")

backend/database/remote_mcp_db.py

Lines changed: 42 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,67 @@
11
import logging
22
from typing import Any, Dict, List
33

4-
from sqlalchemy.exc import SQLAlchemyError
5-
6-
from consts.exceptions import MCPDatabaseError
74
from database.client import as_dict, filter_property, get_db_session
85
from database.db_models import McpRecord
96

107
logger = logging.getLogger("remote_mcp_db")
118

129

13-
def create_mcp_record(mcp_data: Dict[str, Any], tenant_id: str, user_id: str) -> bool:
10+
def create_mcp_record(mcp_data: Dict[str, Any], tenant_id: str, user_id: str):
1411
"""
15-
Create a new MCP record
12+
Create new MCP record
1613
1714
:param mcp_data: Dictionary containing MCP information
1815
:param tenant_id: Tenant ID
1916
:param user_id: User ID
2017
:return: Created MCP record
2118
"""
2219
with get_db_session() as session:
23-
try:
24-
# Add default values
25-
mcp_data.update({
26-
"tenant_id": tenant_id,
27-
"user_id": user_id,
28-
"created_by": user_id,
29-
"updated_by": user_id,
30-
"delete_flag": "N"
31-
})
32-
33-
new_mcp = McpRecord(**filter_property(mcp_data, McpRecord))
34-
session.add(new_mcp)
35-
session.flush()
36-
37-
return True
38-
except SQLAlchemyError:
39-
session.rollback()
40-
return False
41-
42-
43-
def delete_mcp_record_by_name_and_url(mcp_name: str, mcp_server: str, tenant_id: str, user_id: str) -> bool:
20+
mcp_data.update({
21+
"tenant_id": tenant_id,
22+
"user_id": user_id,
23+
"created_by": user_id,
24+
"updated_by": user_id,
25+
"delete_flag": "N"
26+
})
27+
new_mcp = McpRecord(**filter_property(mcp_data, McpRecord))
28+
session.add(new_mcp)
29+
30+
31+
def delete_mcp_record_by_name_and_url(mcp_name: str, mcp_server: str, tenant_id: str, user_id: str):
4432
"""
45-
Delete a MCP record by name and URL
33+
Delete MCP record by name and URL
4634
4735
:param mcp_name: MCP name
4836
:param mcp_server: MCP server URL
4937
:param tenant_id: Tenant ID
5038
:param user_id: User ID
51-
:return: True if successful, False otherwise
5239
"""
5340
with get_db_session() as session:
54-
try:
55-
session.query(McpRecord).filter(
56-
McpRecord.mcp_name == mcp_name,
57-
McpRecord.mcp_server == mcp_server,
58-
McpRecord.tenant_id == tenant_id,
59-
McpRecord.delete_flag != 'Y'
60-
).update({"delete_flag": "Y", "updated_by": user_id})
61-
session.commit()
62-
return True
63-
except SQLAlchemyError:
64-
session.rollback()
65-
return False
66-
67-
68-
def update_mcp_status_by_name_and_url(mcp_name: str, mcp_server: str, tenant_id: str, user_id: str, status: bool) -> bool:
41+
session.query(McpRecord).filter(
42+
McpRecord.mcp_name == mcp_name,
43+
McpRecord.mcp_server == mcp_server,
44+
McpRecord.tenant_id == tenant_id,
45+
McpRecord.delete_flag != 'Y'
46+
).update({"delete_flag": "Y", "updated_by": user_id})
47+
48+
49+
def update_mcp_status_by_name_and_url(mcp_name: str, mcp_server: str, tenant_id: str, user_id: str, status: bool):
6950
"""
7051
Update the status of MCP record by name and URL
7152
:param mcp_name: MCP name
7253
:param mcp_server: MCP server URL
7354
:param tenant_id: Tenant ID
7455
:param status: New status (True/False)
7556
:param user_id: User ID
76-
:return: True if successful, False otherwise
7757
"""
7858
with get_db_session() as session:
79-
try:
80-
session.query(McpRecord).filter(
81-
McpRecord.mcp_name == mcp_name,
82-
McpRecord.mcp_server == mcp_server,
83-
McpRecord.tenant_id == tenant_id,
84-
McpRecord.delete_flag != 'Y'
85-
).update({"status": status, "updated_by": user_id})
86-
session.commit()
87-
return True
88-
except SQLAlchemyError:
89-
session.rollback()
90-
return False
59+
session.query(McpRecord).filter(
60+
McpRecord.mcp_name == mcp_name,
61+
McpRecord.mcp_server == mcp_server,
62+
McpRecord.tenant_id == tenant_id,
63+
McpRecord.delete_flag != 'Y'
64+
).update({"status": status, "updated_by": user_id})
9165

9266

9367
def get_mcp_records_by_tenant(tenant_id: str) -> List[Dict[str, Any]]:
@@ -115,17 +89,13 @@ def get_mcp_server_by_name_and_tenant(mcp_name: str, tenant_id: str) -> str:
11589
:return: MCP server address, empty string if not found
11690
"""
11791
with get_db_session() as session:
118-
try:
119-
mcp_record = session.query(McpRecord).filter(
120-
McpRecord.mcp_name == mcp_name,
121-
McpRecord.tenant_id == tenant_id,
122-
McpRecord.delete_flag != 'Y'
123-
).first()
92+
mcp_record = session.query(McpRecord).filter(
93+
McpRecord.mcp_name == mcp_name,
94+
McpRecord.tenant_id == tenant_id,
95+
McpRecord.delete_flag != 'Y'
96+
).first()
12497

125-
return mcp_record.mcp_server if mcp_record else ""
126-
except SQLAlchemyError as e:
127-
logger.error(f"Error getting MCP server by name and tenant: {str(e)}")
128-
raise MCPDatabaseError("Error getting MCP server by name and tenant")
98+
return mcp_record.mcp_server if mcp_record else ""
12999

130100

131101
def check_mcp_name_exists(mcp_name: str, tenant_id: str) -> bool:
@@ -137,14 +107,9 @@ def check_mcp_name_exists(mcp_name: str, tenant_id: str) -> bool:
137107
:return: True if name exists, False otherwise
138108
"""
139109
with get_db_session() as session:
140-
try:
141-
mcp_record = session.query(McpRecord).filter(
142-
McpRecord.mcp_name == mcp_name,
143-
McpRecord.tenant_id == tenant_id,
144-
McpRecord.delete_flag != 'Y'
145-
).first()
146-
147-
return mcp_record is not None
148-
except SQLAlchemyError as e:
149-
logger.error(f"Error checking if MCP name exists: {str(e)}")
150-
raise MCPDatabaseError("Error checking if MCP name exists")
110+
mcp_record = session.query(McpRecord).filter(
111+
McpRecord.mcp_name == mcp_name,
112+
McpRecord.tenant_id == tenant_id,
113+
McpRecord.delete_flag != 'Y'
114+
).first()
115+
return mcp_record is not None

backend/services/remote_mcp_service.py

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
from fastmcp import Client
3-
from consts.exceptions import MCPConnectionError, MCPNameIllegal, MCPDatabaseError
3+
from consts.exceptions import MCPConnectionError, MCPNameIllegal
44

55
from database.remote_mcp_db import create_mcp_record, delete_mcp_record_by_name_and_url, get_mcp_records_by_tenant, \
66
check_mcp_name_exists, update_mcp_status_by_name_and_url
@@ -38,30 +38,19 @@ async def add_remote_mcp_server_list(tenant_id: str,
3838
insert_mcp_data = {"mcp_name": remote_mcp_server_name,
3939
"mcp_server": remote_mcp_server,
4040
"status": True}
41-
create_result = create_mcp_record(
41+
create_mcp_record(
4242
mcp_data=insert_mcp_data, tenant_id=tenant_id, user_id=user_id)
4343

44-
if not create_result:
45-
logger.error(
46-
f"add_remote_mcp_server_list failed, tenant_id: {tenant_id}, user_id: {user_id}, remote_mcp_server: {remote_mcp_server}, remote_mcp_server_name: {remote_mcp_server_name}")
47-
raise MCPDatabaseError(
48-
"Failed to add remote MCP proxy, database error")
49-
5044

5145
async def delete_remote_mcp_server_list(tenant_id: str,
5246
user_id: str,
5347
remote_mcp_server: str,
5448
remote_mcp_server_name: str):
5549
# delete the record in the PG database
56-
delete_result = delete_mcp_record_by_name_and_url(mcp_name=remote_mcp_server_name,
57-
mcp_server=remote_mcp_server,
58-
tenant_id=tenant_id,
59-
user_id=user_id)
60-
if not delete_result:
61-
logger.error(
62-
f"delete_remote_mcp_server_list failed, tenant_id: {tenant_id}, user_id: {user_id}, remote_mcp_server: {remote_mcp_server}, remote_mcp_server_name: {remote_mcp_server_name}")
63-
raise MCPDatabaseError(
64-
"Failed to delete remote MCP server")
50+
delete_mcp_record_by_name_and_url(mcp_name=remote_mcp_server_name,
51+
mcp_server=remote_mcp_server,
52+
tenant_id=tenant_id,
53+
user_id=user_id)
6554

6655

6756
async def get_remote_mcp_server_list(tenant_id: str):
@@ -79,14 +68,16 @@ async def get_remote_mcp_server_list(tenant_id: str):
7968

8069
async def check_mcp_health_and_update_db(mcp_url, service_name, tenant_id, user_id):
8170
# check the health of the MCP server
82-
status = await mcp_server_health(remote_mcp_server=mcp_url)
71+
try:
72+
status = await mcp_server_health(remote_mcp_server=mcp_url)
73+
except Exception:
74+
status = False
8375
# update the status of the MCP server in the database
84-
if not update_mcp_status_by_name_and_url(
76+
update_mcp_status_by_name_and_url(
8577
mcp_name=service_name,
8678
mcp_server=mcp_url,
8779
tenant_id=tenant_id,
8880
user_id=user_id,
89-
status=status
90-
):
91-
raise MCPDatabaseError(
92-
"Failed to update the status of the MCP server in the database")
81+
status=status)
82+
if not status:
83+
raise MCPConnectionError("MCP connection failed")

frontend/services/mcpService.ts

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,8 @@ export const getMcpServerList = async () => {
6868
let errorMessage = data.message || t('mcpService.message.getServerListFailed');
6969

7070
switch (response.status) {
71-
case 400:
72-
errorMessage = t('mcpService.message.getRemoteProxyFailed');
73-
break;
74-
case 404:
75-
errorMessage = t('mcpService.message.resourceNotFound');
76-
break;
7771
case 500:
78-
errorMessage = t('mcpService.message.serverInternalError');
72+
errorMessage = t('mcpService.message.getRemoteProxyFailed');
7973
break;
8074
case 503:
8175
errorMessage = t('mcpService.message.serviceUnavailable');
@@ -175,14 +169,8 @@ export const deleteMcpServer = async (mcpUrl: string, serviceName: string) => {
175169
let errorMessage = data.message || t('mcpService.message.deleteServerFailed');
176170

177171
switch (response.status) {
178-
case 400:
179-
errorMessage = t('mcpService.message.deleteProxyFailed');
180-
break;
181-
case 404:
182-
errorMessage = t('mcpService.message.serverNotFound');
183-
break;
184172
case 500:
185-
errorMessage = t('mcpService.message.serverInternalError');
173+
errorMessage = t('mcpService.message.deleteProxyFailed');
186174
break;
187175
default:
188176
errorMessage = data.message || t('mcpService.message.deleteServerFailed');
@@ -230,14 +218,8 @@ export const getMcpTools = async (serviceName: string, mcpUrl: string) => {
230218
let errorMessage = data.message || t('mcpService.message.getToolsFailed');
231219

232220
switch (response.status) {
233-
case 400:
234-
errorMessage = t('mcpService.message.getToolsFromServerFailed');
235-
break;
236-
case 404:
237-
errorMessage = t('mcpService.message.serverNotFound');
238-
break;
239221
case 500:
240-
errorMessage = t('mcpService.message.serverInternalError');
222+
errorMessage = t('mcpService.message.getToolsFromServerFailed');
241223
break;
242224
case 503:
243225
errorMessage = t('mcpService.message.cannotConnectToServer');
@@ -337,10 +319,14 @@ export const checkMcpServerHealth = async (mcpUrl: string, serviceName: string)
337319
message: data.message || t('mcpService.message.healthCheckSuccess')
338320
};
339321
} else {
322+
let errorMessage = data.message || t('mcpService.message.healthCheckFailed');
323+
if (response.status === 503) {
324+
errorMessage = t('mcpService.message.cannotConnectToServer');
325+
}
340326
return {
341327
success: false,
342328
data: null,
343-
message: data.message || t('mcpService.message.healthCheckFailed')
329+
message: errorMessage
344330
};
345331
}
346332
} catch (error) {

0 commit comments

Comments
 (0)