"use client"; import React, { createContext, useContext, useEffect, useState } from "react"; import { useLocalStorage } from "@/lib/hooks/use-local-storage"; import { STORAGE_KEYS } from "@/lib/constants"; // Define types for MCP server export interface KeyValuePair { key: string; value: string; } export interface MCPServer { id: string; name: string; url: string; type: 'sse' | 'stdio'; command?: string; args?: string[]; env?: KeyValuePair[]; headers?: KeyValuePair[]; description?: string; } // Type for processed MCP server config for API export interface MCPServerApi { type: 'sse' | 'stdio'; url: string; command?: string; args?: string[]; env?: KeyValuePair[]; headers?: KeyValuePair[]; } interface MCPContextType { mcpServers: MCPServer[]; setMcpServers: (servers: MCPServer[]) => void; selectedMcpServers: string[]; setSelectedMcpServers: (serverIds: string[]) => void; mcpServersForApi: MCPServerApi[]; } const MCPContext = createContext(undefined); export function MCPProvider({ children }: { children: React.ReactNode }) { const [mcpServers, setMcpServers] = useLocalStorage( STORAGE_KEYS.MCP_SERVERS, [] ); const [selectedMcpServers, setSelectedMcpServers] = useLocalStorage( STORAGE_KEYS.SELECTED_MCP_SERVERS, [] ); const [mcpServersForApi, setMcpServersForApi] = useState([]); // Process MCP servers for API consumption whenever server data changes useEffect(() => { if (!selectedMcpServers.length) { setMcpServersForApi([]); return; } const processedServers: MCPServerApi[] = selectedMcpServers .map(id => mcpServers.find(server => server.id === id)) .filter((server): server is MCPServer => Boolean(server)) .map(server => ({ type: server.type, url: server.url, command: server.command, args: server.args, env: server.env, headers: server.headers })); setMcpServersForApi(processedServers); }, [mcpServers, selectedMcpServers]); return ( {children} ); } export function useMCP() { const context = useContext(MCPContext); if (context === undefined) { throw new Error("useMCP must be used within an MCPProvider"); } return context; }