Spaces:
Running
Running
File size: 2,553 Bytes
2517ed6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
"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<MCPContextType | undefined>(undefined);
export function MCPProvider({ children }: { children: React.ReactNode }) {
const [mcpServers, setMcpServers] = useLocalStorage<MCPServer[]>(
STORAGE_KEYS.MCP_SERVERS,
[]
);
const [selectedMcpServers, setSelectedMcpServers] = useLocalStorage<string[]>(
STORAGE_KEYS.SELECTED_MCP_SERVERS,
[]
);
const [mcpServersForApi, setMcpServersForApi] = useState<MCPServerApi[]>([]);
// 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 (
<MCPContext.Provider
value={{
mcpServers,
setMcpServers,
selectedMcpServers,
setSelectedMcpServers,
mcpServersForApi
}}
>
{children}
</MCPContext.Provider>
);
}
export function useMCP() {
const context = useContext(MCPContext);
if (context === undefined) {
throw new Error("useMCP must be used within an MCPProvider");
}
return context;
} |