Skip to content

Commit 6071c70

Browse files
authored
Merge pull request #949 from anthhub/fix/mcp-select
Fix/mcp select
2 parents b90e368 + 3a67bb1 commit 6071c70

File tree

4 files changed

+59
-27
lines changed

4 files changed

+59
-27
lines changed

packages/ai-workspace-common/src/components/canvas/launchpad/chat-panel.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ export const ChatPanel = ({
270270
{
271271
query,
272272
resultId: newResultId,
273-
selectedMcpServers,
274273
selectedSkill,
275274
modelInfo: selectedModel,
276275
contextItems,

packages/ai-workspace-common/src/components/canvas/launchpad/mcp-selector-panel/index.tsx

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -101,31 +101,54 @@ export const McpSelectorPanel: React.FC<McpSelectorPanelProps> = ({ isOpen, onCl
101101
);
102102
}
103103

104-
return mcpServers.map((server) => (
105-
<div
106-
key={server.name}
107-
className={cn(
108-
'group relative flex items-center justify-between',
109-
'rounded-lg border border-solid m-1 py-2 px-3 mb-2',
110-
'cursor-pointer transition-all duration-200',
111-
selectedMcpServers.includes(server.name)
112-
? 'border-[#00968f] bg-[#00968f]/5 dark:bg-[#00968f]/10'
113-
: 'border-black/10 dark:border-gray-700',
114-
'hover:bg-gray-50 hover:border-gray-200 hover:shadow-sm dark:hover:bg-gray-700 dark:hover:border-gray-600',
115-
)}
116-
onClick={() => handleMcpSelect(server.name)}
117-
>
118-
<div className="flex-1 min-w-0 flex items-center">
119-
<ToolOutlined className="text-[#00968f] mr-2" />
120-
<span className="text-[12px] text-gray-700 dark:text-gray-200 font-medium block truncate">
121-
{server.name}
122-
</span>
104+
// 对 mcpServers 进行排序,将已选择的服务器排在前面
105+
const sortedMcpServers = [...mcpServers].sort((a, b) => {
106+
const aSelected = selectedMcpServers.includes(a.name);
107+
const bSelected = selectedMcpServers.includes(b.name);
108+
109+
if (aSelected && !bSelected) return -1;
110+
if (!aSelected && bSelected) return 1;
111+
return 0;
112+
});
113+
114+
return sortedMcpServers.map((server) => {
115+
const displayDescription = server.description || '';
116+
return (
117+
<div
118+
key={server.name}
119+
className={cn(
120+
'group relative flex items-center justify-between',
121+
'rounded-lg border border-solid m-1 py-2 px-3 mb-2',
122+
'cursor-pointer transition-all duration-200',
123+
selectedMcpServers.includes(server.name)
124+
? 'border-[#00968f] bg-[#00968f]/5 dark:bg-[#00968f]/10'
125+
: 'border-black/10 dark:border-gray-700',
126+
'hover:bg-gray-50 hover:border-gray-200 hover:shadow-sm dark:hover:bg-gray-700 dark:hover:border-gray-600',
127+
)}
128+
onClick={() => handleMcpSelect(server.name)}
129+
>
130+
<div className="flex-1 min-w-0 flex flex-col">
131+
{' '}
132+
{/* Changed to flex-col for name and description stacking */}
133+
<div className="flex items-center">
134+
<ToolOutlined className="text-[#00968f] mr-2 flex-shrink-0" />
135+
<span className="text-[12px] text-gray-700 dark:text-gray-200 font-medium block truncate">
136+
{server.name}
137+
</span>
138+
</div>
139+
{/* Display server description */}
140+
<Tooltip title={displayDescription} placement="bottomLeft">
141+
<span className="text-[10px] text-gray-500 dark:text-gray-400 block truncate ml-6">
142+
{displayDescription}
143+
</span>
144+
</Tooltip>
145+
</div>
146+
{selectedMcpServers.includes(server.name) && (
147+
<CheckCircle2 className="w-4 h-4 text-[#00968f] ml-2" />
148+
)}
123149
</div>
124-
{selectedMcpServers.includes(server.name) && (
125-
<CheckCircle2 className="w-4 h-4 text-[#00968f] ml-2" />
126-
)}
127-
</div>
128-
));
150+
);
151+
});
129152
};
130153

131154
return (

packages/ai-workspace-common/src/components/canvas/launchpad/recommend-questions-panel/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { actionEmitter } from '@refly-packages/ai-workspace-common/events/action
1010
import { cn } from '@refly-packages/ai-workspace-common/utils/cn';
1111
import { useContextPanelStore } from '@refly-packages/ai-workspace-common/stores/context-panel';
1212
import { useFindSkill } from '@refly-packages/ai-workspace-common/hooks/use-find-skill';
13+
import { useLaunchpadStoreShallow } from '@refly-packages/ai-workspace-common/stores/launchpad';
1314

1415
interface RecommendQuestionsPanelProps {
1516
isOpen: boolean;
@@ -29,6 +30,10 @@ export const RecommendQuestionsPanel: React.FC<RecommendQuestionsPanelProps> = (
2930

3031
const skill = useFindSkill('recommendQuestions');
3132

33+
const { selectedMcpServers } = useLaunchpadStoreShallow((state) => ({
34+
selectedMcpServers: state.selectedMcpServers,
35+
}));
36+
3237
const fetchRecommendQuestions = async (refresh = false) => {
3338
setLoading(true);
3439
const resultId = genActionResultID();
@@ -40,6 +45,7 @@ export const RecommendQuestionsPanel: React.FC<RecommendQuestionsPanelProps> = (
4045
query: newQAText,
4146
resultId,
4247
contextItems,
48+
selectedMcpServers,
4349
selectedSkill: skill,
4450
modelInfo: selectedModel,
4551
runtimeConfig,

packages/ai-workspace-common/src/hooks/canvas/use-invoke-action.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { codeArtifactEmitter } from '@refly-packages/ai-workspace-common/events/
3131
import { useReactFlow } from '@xyflow/react';
3232
import { detectActualTypeFromType } from '@refly-packages/ai-workspace-common/modules/artifacts/code-runner/artifact-type-util';
3333
import { deletedNodesEmitter } from '@refly-packages/ai-workspace-common/events/deleted-nodes';
34+
import { useLaunchpadStoreShallow } from '@refly-packages/ai-workspace-common/stores/launchpad';
3435

3536
export const useInvokeAction = () => {
3637
const { addNode } = useAddNode();
@@ -555,6 +556,10 @@ export const useInvokeAction = () => {
555556
const findWebsite = useFindWebsite();
556557
const findImages = useFindImages();
557558

559+
const { selectedMcpServers } = useLaunchpadStoreShallow((state) => ({
560+
selectedMcpServers: state.selectedMcpServers,
561+
}));
562+
558563
const invokeAction = useCallback(
559564
(payload: SkillNodeMeta, target: Entity) => {
560565
deletedNodeIdsRef.current = new Set();
@@ -567,7 +572,6 @@ export const useInvokeAction = () => {
567572
modelInfo,
568573
contextItems,
569574
selectedSkill,
570-
selectedMcpServers,
571575
resultId,
572576
version = 0,
573577
tplConfig = {},
@@ -676,7 +680,7 @@ export const useInvokeAction = () => {
676680

677681
return cleanup;
678682
},
679-
[addNode, setNodeDataByEntity, onUpdateResult, createTimeoutHandler],
683+
[addNode, setNodeDataByEntity, onUpdateResult, createTimeoutHandler, selectedMcpServers],
680684
);
681685

682686
return { invokeAction, abortAction };

0 commit comments

Comments
 (0)