@@ -14,6 +14,8 @@ import { ChatInputToast } from "../ChatInputToast";
1414import { createCommandToast , createErrorToast } from "../ChatInputToasts" ;
1515import { parseCommand } from "@/browser/utils/slashCommands/parser" ;
1616import { usePersistedState , updatePersistedState } from "@/browser/hooks/usePersistedState" ;
17+ import { useSettings } from "@/browser/contexts/SettingsContext" ;
18+ import { useWorkspaceContext } from "@/browser/contexts/WorkspaceContext" ;
1719import { useMode } from "@/browser/contexts/ModeContext" ;
1820import { ThinkingSliderComponent } from "../ThinkingSlider" ;
1921import { ModelSettings } from "../ModelSettings" ;
@@ -167,6 +169,8 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
167169 [ setInput ]
168170 ) ;
169171 const preEditDraftRef = useRef < DraftState > ( { text : "" , images : [ ] } ) ;
172+ const { open } = useSettings ( ) ;
173+ const { selectedWorkspace } = useWorkspaceContext ( ) ;
170174 const [ mode , setMode ] = useMode ( ) ;
171175 const { recentModels, addModel, defaultModel, setDefaultModel } = useModelLRU ( ) ;
172176 const commandListId = useId ( ) ;
@@ -730,6 +734,75 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
730734 }
731735
732736 // Handle /vim command
737+ if ( parsed . type === "mcp-open" ) {
738+ setInput ( "" ) ;
739+ open ( "project" ) ;
740+ return ;
741+ }
742+
743+ if ( parsed . type === "mcp-add" || parsed . type === "mcp-remove" ) {
744+ if ( ! api ) {
745+ setToast ( {
746+ id : Date . now ( ) . toString ( ) ,
747+ type : "error" ,
748+ message : "Not connected to server" ,
749+ } ) ;
750+ return ;
751+ }
752+ if ( ! selectedWorkspace ?. projectPath ) {
753+ setToast ( {
754+ id : Date . now ( ) . toString ( ) ,
755+ type : "error" ,
756+ message : "Select a workspace to manage MCP servers" ,
757+ } ) ;
758+ return ;
759+ }
760+
761+ setIsSending ( true ) ;
762+ setInput ( "" ) ;
763+ try {
764+ const projectPath = selectedWorkspace . projectPath ;
765+ const result =
766+ parsed . type === "mcp-add"
767+ ? await api . projects . mcp . add ( {
768+ projectPath,
769+ name : parsed . name ,
770+ command : parsed . command ,
771+ } )
772+ : await api . projects . mcp . remove ( { projectPath, name : parsed . name } ) ;
773+
774+ if ( ! result . success ) {
775+ setToast ( {
776+ id : Date . now ( ) . toString ( ) ,
777+ type : "error" ,
778+ message : result . error ?? "Failed to update MCP servers" ,
779+ } ) ;
780+ setInput ( messageText ) ;
781+ } else {
782+ setToast ( {
783+ id : Date . now ( ) . toString ( ) ,
784+ type : "success" ,
785+ message :
786+ parsed . type === "mcp-add"
787+ ? `Added MCP server ${ parsed . name } `
788+ : `Removed MCP server ${ parsed . name } ` ,
789+ } ) ;
790+ }
791+ } catch ( error ) {
792+ console . error ( "Failed to update MCP servers" , error ) ;
793+ setToast ( {
794+ id : Date . now ( ) . toString ( ) ,
795+ type : "error" ,
796+ message : error instanceof Error ? error . message : "Failed to update MCP servers" ,
797+ } ) ;
798+ setInput ( messageText ) ;
799+ } finally {
800+ setIsSending ( false ) ;
801+ }
802+
803+ return ;
804+ }
805+
733806 if ( parsed . type === "vim-toggle" ) {
734807 setInput ( "" ) ; // Clear input immediately
735808 setVimEnabled ( ( prev ) => ! prev ) ;
0 commit comments