/* Copyright 2026 Marimo. All rights reserved. */ import { CheckSquareIcon, Loader2, RefreshCwIcon } from "lucide-react"; import React from "react"; import type { UseFormReturn } from "react-hook-form"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { FormField, FormItem } from "@/components/ui/form"; import type { UserConfig } from "@/core/config/config-schema"; import { useMCPRefresh, useMCPStatus } from "../mcp/hooks"; import { McpStatusText } from "../mcp/mcp-status-indicator"; import { Button } from "../ui/button"; import { Kbd } from "../ui/kbd"; import { SettingSubtitle } from "./common"; import { useOpenSettingsToTab } from "./state"; interface MCPConfigProps { form: UseFormReturn; onSubmit: (values: UserConfig) => void; } type MCPPreset = "marimo" | "context7"; interface PresetConfig { id: MCPPreset; title: string; description: string; } const PRESET_CONFIGS: PresetConfig[] = [ { id: "marimo", title: "marimo (docs)", description: "Access marimo documentation", }, { id: "context7", title: "Context7", description: "Connect to Context7 MCP server", }, ]; export const MCPConfig: React.FC = ({ form, onSubmit }) => { const { handleClick } = useOpenSettingsToTab(); const { data: status, refetch, isFetching } = useMCPStatus(); const { refresh, isRefreshing } = useMCPRefresh(); const handleRefresh = async () => { await refresh(); refetch(); }; return (
MCP Servers
{status && }
{status?.error && (
{status.error}
)} {status?.servers && (
{Object.entries(status.servers).map(([server, status]) => (
{server}:
))}
)}

Enable Model Context Protocol (MCP) servers to provide additional capabilities and data sources for AI features.

This feature requires the marimo[mcp]{" "} package. See{" "} {" "} for more details.

{ const presets = field.value || []; const togglePreset = (preset: MCPPreset) => { const newPresets = presets.includes(preset) ? presets.filter((p: string) => p !== preset) : [...presets, preset]; field.onChange(newPresets); onSubmit(form.getValues()); }; return (
{PRESET_CONFIGS.map((config) => { const isChecked = presets.includes(config.id); return ( togglePreset(config.id)} >
{config.title} {isChecked ? : null}
{config.description}
); })}
); }} />
); };