Skip to content

Commit 532f82b

Browse files
refactor: enhance MCP configuration handling in connection settings (#1985)
* refactor: enhance MCP configuration handling in connection settings - Introduced `useMcpConfiguration` hook to fetch MCP configuration directly, simplifying data management. - Updated `McpConfigurationForm` to accept `stateSchema`, `isLoading`, and `error` props for improved state handling. - Removed local state management for MCP scopes in `SettingsTab`, streamlining the component structure. - Enhanced the `ConnectionInspectorViewContent` to utilize the new hook for better integration of MCP settings. * refactor: streamline MCP configuration handling in connection settings - Updated `useMcpConfiguration` to improve data fetching for MCP scopes, enhancing loading state management. - Simplified the `SettingsTab` component by directly utilizing fetched scopes, improving clarity and reducing local state management. - Cleaned up comments and formatting for better code organization.
1 parent afc3fc7 commit 532f82b

File tree

2 files changed

+48
-25
lines changed

2 files changed

+48
-25
lines changed

apps/mesh/src/web/components/details/connection.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ import { useMcp } from "use-mcp/react";
7272
import { z } from "zod";
7373
import { authClient } from "@/web/lib/auth-client";
7474
import { ViewLayout, ViewTabs, ViewActions } from "./layout";
75-
import { McpConfigurationForm } from "./mcp-configuration-form";
75+
import {
76+
McpConfigurationForm,
77+
useMcpConfiguration,
78+
} from "./mcp-configuration-form";
7679

7780
function ConnectionInspectorViewContent() {
7881
const router = useRouter();
@@ -438,7 +441,17 @@ function SettingsTab({
438441
const [mcpInitialState, setMcpInitialState] = useState<
439442
Record<string, unknown>
440443
>(connection.configuration_state ?? {});
441-
const [mcpScopes] = useState<string[]>(connection.configuration_scopes ?? []);
444+
445+
const {
446+
stateSchema: mcpStateSchema,
447+
scopes: fetchedScopes,
448+
isLoading: isMcpConfigLoading,
449+
error: mcpConfigError,
450+
} = useMcpConfiguration(connection.id);
451+
452+
const mcpScopes = isMcpConfigLoading
453+
? (connection.configuration_scopes ?? [])
454+
: fetchedScopes;
442455

443456
// Reset MCP state when connection changes
444457
// oxlint-disable-next-line ban-use-effect/ban-use-effect
@@ -541,10 +554,11 @@ function SettingsTab({
541554
{hasMcpBinding && (
542555
<div className="w-3/5 min-w-0 overflow-auto">
543556
<McpConfigurationForm
544-
connection={connection}
545557
formState={mcpFormState}
546558
onFormStateChange={setMcpFormState}
547-
isSaving={isSavingConfig}
559+
stateSchema={mcpStateSchema}
560+
isLoading={isMcpConfigLoading}
561+
error={mcpConfigError}
548562
/>
549563
</div>
550564
)}

apps/mesh/src/web/components/details/mcp-configuration-form.tsx

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { createToolCaller } from "@/tools/client";
2-
import type { ConnectionEntity } from "@/tools/connection/schema";
32
import { useToolCall } from "@/web/hooks/use-tool-call";
43
import { useProjectContext } from "@/web/providers/project-context-provider";
54
import { Loader2 } from "lucide-react";
@@ -14,11 +13,36 @@ interface McpConfigurationResult {
1413
scopes?: string[];
1514
}
1615

16+
export function useMcpConfiguration(connectionId: string) {
17+
const toolCaller = createToolCaller(connectionId);
18+
19+
const {
20+
data: configResult,
21+
isLoading,
22+
error,
23+
} = useToolCall<Record<string, never>, McpConfigurationResult>({
24+
toolCaller,
25+
toolName: "MCP_CONFIGURATION",
26+
toolInputParams: {},
27+
enabled: !!connectionId,
28+
});
29+
30+
const stateSchema = configResult?.stateSchema ?? {
31+
type: "object",
32+
properties: {},
33+
};
34+
35+
const scopes = configResult?.scopes ?? [];
36+
37+
return { stateSchema, scopes, isLoading, error };
38+
}
39+
1740
export interface McpConfigurationFormProps {
18-
connection: ConnectionEntity;
1941
formState: Record<string, unknown>;
2042
onFormStateChange: (state: Record<string, unknown>) => void;
21-
isSaving: boolean;
43+
stateSchema: Record<string, unknown>;
44+
isLoading: boolean;
45+
error: Error | null;
2246
}
2347

2448
interface FormContext {
@@ -197,29 +221,14 @@ function CustomFieldTemplate(props: FieldTemplateProps) {
197221
}
198222

199223
export function McpConfigurationForm({
200-
connection,
201224
formState,
202225
onFormStateChange,
226+
stateSchema,
227+
isLoading,
228+
error,
203229
}: McpConfigurationFormProps) {
204230
const { org } = useProjectContext();
205231
const navigate = useNavigate();
206-
const toolCaller = createToolCaller(connection.id);
207-
208-
const {
209-
data: configResult,
210-
isLoading,
211-
error,
212-
} = useToolCall<Record<string, never>, McpConfigurationResult>({
213-
toolCaller,
214-
toolName: "MCP_CONFIGURATION",
215-
toolInputParams: {},
216-
enabled: !!connection.id,
217-
});
218-
219-
const stateSchema = configResult?.stateSchema ?? {
220-
type: "object",
221-
properties: {},
222-
};
223232

224233
const handleChange = (data: { formData?: Record<string, unknown> }) => {
225234
if (data.formData) {

0 commit comments

Comments
 (0)