Skip to content

Commit f6a0a5b

Browse files
committed
feat: MCP supports selecting workspaces #926
1 parent e5e9e53 commit f6a0a5b

File tree

2 files changed

+38
-21
lines changed

2 files changed

+38
-21
lines changed

backend/apps/chat/models/chat_model.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,11 @@ class ChatMcp(ChatQuestion):
319319
token: str
320320

321321

322+
class McpDs(BaseModel):
323+
token: str = Body(description='用户token')
324+
oid: Optional[int | str] = Body(description='组织ID,如果不传则为最后一次登录SQLBot时所使用的组织ID', default=None)
325+
326+
322327
class ChatStart(BaseModel):
323328
username: str = Body(description='用户名')
324329
password: str = Body(description='密码')
@@ -331,6 +336,8 @@ class McpQuestion(BaseModel):
331336
stream: Optional[bool] = Body(description='是否流式输出,默认为true开启, 关闭false则返回JSON对象', default=True)
332337
lang: Optional[str] = Body(description='语言:zh-CN|en|ko-KR', default='zh-CN')
333338
datasource_id: Optional[int | str] = Body(description='数据源ID,仅当当前对话没有确定数据源时有效', default=None)
339+
oid: Optional[int | str] = Body(
340+
description='组织ID,仅当数据源ID为空时有效,如果不传则为最后一次登录SQLBot时所使用的组织ID', default=None)
334341

335342

336343
class AxisObj(BaseModel):

backend/apps/mcp/mcp.py

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313

1414
from apps.chat.api.chat import create_chat, question_answer_inner
1515
from apps.chat.models.chat_model import ChatMcp, CreateChat, ChatStart, McpQuestion, McpAssistant, ChatQuestion, \
16-
ChatFinishStep
16+
ChatFinishStep, McpDs
1717
from apps.datasource.crud.datasource import get_datasource_list
18-
from apps.system.crud.user import authenticate
18+
from apps.system.crud.user import authenticate, user_ws_options
1919
from apps.system.crud.user import get_db_user
2020
from apps.system.models.system_model import UserWsModel
2121
from apps.system.models.user import UserModel
@@ -81,9 +81,34 @@ def get_user(session: SessionDep, token: str):
8181
return session_user
8282

8383

84-
@router.post("/mcp_ds_list", operation_id="mcp_datasource_list")
85-
async def datasource_list(session: SessionDep, token: str):
84+
@router.post("/mcp_start", operation_id="mcp_start")
85+
async def mcp_start(session: SessionDep, chat: ChatStart):
86+
user: BaseUserDTO = authenticate(session=session, account=chat.username, password=chat.password)
87+
if not user:
88+
raise HTTPException(status_code=400, detail="Incorrect account or password")
89+
90+
if not user.oid or user.oid == 0:
91+
raise HTTPException(status_code=400, detail="No associated workspace, Please contact the administrator")
92+
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
93+
user_dict = user.to_dict()
94+
t = Token(access_token=create_access_token(
95+
user_dict, expires_delta=access_token_expires
96+
))
97+
c = create_chat(session, user, CreateChat(origin=1), False)
98+
return {"access_token": t.access_token, "chat_id": c.id}
99+
100+
101+
@router.post("/mcp_ws_list", operation_id="mcp_ws_list")
102+
async def ws_list(session: SessionDep, token: str):
86103
session_user = get_user(session, token)
104+
return await user_ws_options(session, session_user.id)
105+
106+
107+
@router.post("/mcp_ds_list", operation_id="mcp_datasource_list")
108+
async def datasource_list(session: SessionDep, mcp_ds: McpDs):
109+
session_user = get_user(session, mcp_ds.token)
110+
if mcp_ds.oid is not None:
111+
session_user.oid = mcp_ds.oid
87112
ds_list = get_datasource_list(session=session, user=session_user)
88113
result = []
89114
for item in ds_list:
@@ -103,26 +128,11 @@ async def datasource_list(session: SessionDep, token: str):
103128
# return session.query(AiModelDetail).all()
104129

105130

106-
@router.post("/mcp_start", operation_id="mcp_start")
107-
async def mcp_start(session: SessionDep, chat: ChatStart):
108-
user: BaseUserDTO = authenticate(session=session, account=chat.username, password=chat.password)
109-
if not user:
110-
raise HTTPException(status_code=400, detail="Incorrect account or password")
111-
112-
if not user.oid or user.oid == 0:
113-
raise HTTPException(status_code=400, detail="No associated workspace, Please contact the administrator")
114-
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
115-
user_dict = user.to_dict()
116-
t = Token(access_token=create_access_token(
117-
user_dict, expires_delta=access_token_expires
118-
))
119-
c = create_chat(session, user, CreateChat(origin=1), False)
120-
return {"access_token": t.access_token, "chat_id": c.id}
121-
122-
123131
@router.post("/mcp_question", operation_id="mcp_question")
124132
async def mcp_question(session: SessionDep, chat: McpQuestion):
125133
session_user = get_user(session, chat.token)
134+
if chat.oid is not None:
135+
session_user.oid = chat.oid
126136
ds_id: Optional[int] = None
127137
if chat.datasource_id:
128138
if isinstance(chat.datasource_id, str):

0 commit comments

Comments
 (0)