diff --git a/apps/code/src/renderer/components/MainLayout.tsx b/apps/code/src/renderer/components/MainLayout.tsx
index af6b83c5a..cb2696f69 100644
--- a/apps/code/src/renderer/components/MainLayout.tsx
+++ b/apps/code/src/renderer/components/MainLayout.tsx
@@ -10,6 +10,7 @@ import { CommandMenu } from "@features/command/components/CommandMenu";
import { CommandCenterView } from "@features/command-center/components/CommandCenterView";
import { InboxView } from "@features/inbox/components/InboxView";
import { useInboxDeepLink } from "@features/inbox/hooks/useInboxDeepLink";
+import { McpServersView } from "@features/mcp-servers/components/McpServersView";
import { FolderSettingsView } from "@features/settings/components/FolderSettingsView";
import { SettingsDialog } from "@features/settings/components/SettingsDialog";
import { useSettingsDialogStore } from "@features/settings/stores/settingsDialogStore";
@@ -129,6 +130,8 @@ export function MainLayout() {
{view.type === "command-center" && }
{view.type === "skills" && }
+
+ {view.type === "mcp-servers" && }
diff --git a/apps/code/src/renderer/features/settings/components/sections/McpServersSettings.tsx b/apps/code/src/renderer/features/mcp-servers/components/McpServersView.tsx
similarity index 90%
rename from apps/code/src/renderer/features/settings/components/sections/McpServersSettings.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/McpServersView.tsx
index 1623735e7..0c13063da 100644
--- a/apps/code/src/renderer/features/settings/components/sections/McpServersSettings.tsx
+++ b/apps/code/src/renderer/features/mcp-servers/components/McpServersView.tsx
@@ -1,4 +1,6 @@
-import { useMcpServers } from "@features/settings/hooks/useMcpServers";
+import { useMcpServers } from "@features/mcp-servers/hooks/useMcpServers";
+import { useSetHeaderContent } from "@hooks/useSetHeaderContent";
+import { Plugs } from "@phosphor-icons/react";
import {
AlertDialog,
Box,
@@ -14,10 +16,10 @@ import type {
} from "@renderer/api/posthogClient";
import { useQueryClient } from "@tanstack/react-query";
import { useCallback, useEffect, useMemo, useState } from "react";
-import { AddCustomServerForm } from "./mcp/AddCustomServerForm";
-import { MarketplaceView } from "./mcp/MarketplaceView";
-import { McpInstalledRail } from "./mcp/McpInstalledRail";
-import { ServerDetailView } from "./mcp/ServerDetailView";
+import { AddCustomServerForm } from "./parts/AddCustomServerForm";
+import { MarketplaceView } from "./parts/MarketplaceView";
+import { McpInstalledRail } from "./parts/McpInstalledRail";
+import { ServerDetailView } from "./parts/ServerDetailView";
type SceneView =
| { kind: "marketplace" }
@@ -25,7 +27,7 @@ type SceneView =
| { kind: "detail-template"; templateId: string }
| { kind: "add-custom" };
-export function McpServersSettings() {
+export function McpServersView() {
const queryClient = useQueryClient();
const [view, setView] = useState({ kind: "marketplace" });
const [query, setQuery] = useState("");
@@ -43,6 +45,22 @@ export function McpServersSettings() {
null,
);
+ const headerContent = useMemo(
+ () => (
+
+
+
+ MCP servers
+
+
+ ),
+ [],
+ );
+ useSetHeaderContent(headerContent);
+
const {
installations,
installationsLoading,
@@ -254,7 +272,7 @@ export function McpServersSettings() {
})();
return (
-
+
-
+
{mainContent}
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/AddCustomServerForm.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/AddCustomServerForm.tsx
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/AddCustomServerForm.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/AddCustomServerForm.tsx
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/MarketplaceView.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/MarketplaceView.tsx
similarity index 99%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/MarketplaceView.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/MarketplaceView.tsx
index bb72a8061..6abfbcaff 100644
--- a/apps/code/src/renderer/features/settings/components/sections/mcp/MarketplaceView.tsx
+++ b/apps/code/src/renderer/features/mcp-servers/components/parts/MarketplaceView.tsx
@@ -1,7 +1,7 @@
import {
filterServersByCategory,
filterServersByQuery,
-} from "@features/settings/hooks/mcpFilters";
+} from "@features/mcp-servers/hooks/mcpFilters";
import { MagnifyingGlass, Plus, X } from "@phosphor-icons/react";
import {
Button,
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/McpInstalledRail.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/McpInstalledRail.tsx
similarity index 98%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/McpInstalledRail.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/McpInstalledRail.tsx
index ce97ce103..13665b15a 100644
--- a/apps/code/src/renderer/features/settings/components/sections/mcp/McpInstalledRail.tsx
+++ b/apps/code/src/renderer/features/mcp-servers/components/parts/McpInstalledRail.tsx
@@ -1,4 +1,4 @@
-import { filterInstallationsByQuery } from "@features/settings/hooks/mcpFilters";
+import { filterInstallationsByQuery } from "@features/mcp-servers/hooks/mcpFilters";
import { MagnifyingGlass, Plus, X } from "@phosphor-icons/react";
import {
Flex,
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/ServerCard.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/ServerCard.tsx
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/ServerCard.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/ServerCard.tsx
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/ServerDetailView.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx
similarity index 99%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/ServerDetailView.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx
index a1f5e609a..3b6ec7784 100644
--- a/apps/code/src/renderer/features/settings/components/sections/mcp/ServerDetailView.tsx
+++ b/apps/code/src/renderer/features/mcp-servers/components/parts/ServerDetailView.tsx
@@ -1,4 +1,4 @@
-import { useMcpInstallationTools } from "@features/settings/hooks/useMcpInstallationTools";
+import { useMcpInstallationTools } from "@features/mcp-servers/hooks/useMcpInstallationTools";
import {
ArrowClockwise,
ArrowLeft,
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/ToolPolicyToggle.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/ToolPolicyToggle.tsx
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/ToolPolicyToggle.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/ToolPolicyToggle.tsx
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/ToolRow.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/ToolRow.tsx
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/ToolRow.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/ToolRow.tsx
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/icons.tsx b/apps/code/src/renderer/features/mcp-servers/components/parts/icons.tsx
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/icons.tsx
rename to apps/code/src/renderer/features/mcp-servers/components/parts/icons.tsx
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/statusBadge.test.ts b/apps/code/src/renderer/features/mcp-servers/components/parts/statusBadge.test.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/statusBadge.test.ts
rename to apps/code/src/renderer/features/mcp-servers/components/parts/statusBadge.test.ts
diff --git a/apps/code/src/renderer/features/settings/components/sections/mcp/statusBadge.ts b/apps/code/src/renderer/features/mcp-servers/components/parts/statusBadge.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/components/sections/mcp/statusBadge.ts
rename to apps/code/src/renderer/features/mcp-servers/components/parts/statusBadge.ts
diff --git a/apps/code/src/renderer/features/settings/hooks/mcpFilters.test.ts b/apps/code/src/renderer/features/mcp-servers/hooks/mcpFilters.test.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/hooks/mcpFilters.test.ts
rename to apps/code/src/renderer/features/mcp-servers/hooks/mcpFilters.test.ts
diff --git a/apps/code/src/renderer/features/settings/hooks/mcpFilters.ts b/apps/code/src/renderer/features/mcp-servers/hooks/mcpFilters.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/hooks/mcpFilters.ts
rename to apps/code/src/renderer/features/mcp-servers/hooks/mcpFilters.ts
diff --git a/apps/code/src/renderer/features/settings/hooks/mcpToolBulk.test.ts b/apps/code/src/renderer/features/mcp-servers/hooks/mcpToolBulk.test.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/hooks/mcpToolBulk.test.ts
rename to apps/code/src/renderer/features/mcp-servers/hooks/mcpToolBulk.test.ts
diff --git a/apps/code/src/renderer/features/settings/hooks/mcpToolBulk.ts b/apps/code/src/renderer/features/mcp-servers/hooks/mcpToolBulk.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/hooks/mcpToolBulk.ts
rename to apps/code/src/renderer/features/mcp-servers/hooks/mcpToolBulk.ts
diff --git a/apps/code/src/renderer/features/settings/hooks/useMcpInstallationTools.ts b/apps/code/src/renderer/features/mcp-servers/hooks/useMcpInstallationTools.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/hooks/useMcpInstallationTools.ts
rename to apps/code/src/renderer/features/mcp-servers/hooks/useMcpInstallationTools.ts
diff --git a/apps/code/src/renderer/features/settings/hooks/useMcpServers.ts b/apps/code/src/renderer/features/mcp-servers/hooks/useMcpServers.ts
similarity index 100%
rename from apps/code/src/renderer/features/settings/hooks/useMcpServers.ts
rename to apps/code/src/renderer/features/mcp-servers/hooks/useMcpServers.ts
diff --git a/apps/code/src/renderer/features/settings/components/SettingsDialog.tsx b/apps/code/src/renderer/features/settings/components/SettingsDialog.tsx
index 43ccb5914..01c73dc4d 100644
--- a/apps/code/src/renderer/features/settings/components/SettingsDialog.tsx
+++ b/apps/code/src/renderer/features/settings/components/SettingsDialog.tsx
@@ -22,7 +22,6 @@ import {
HardDrives,
Keyboard,
Palette,
- Plugs,
SignOut,
TrafficSignal,
TreeStructure,
@@ -37,7 +36,6 @@ import { ClaudeCodeSettings } from "./sections/ClaudeCodeSettings";
import { CloudEnvironmentsSettings } from "./sections/CloudEnvironmentsSettings";
import { EnvironmentsSettings } from "./sections/environments/EnvironmentsSettings";
import { GeneralSettings } from "./sections/GeneralSettings";
-import { McpServersSettings } from "./sections/McpServersSettings";
import { PersonalizationSettings } from "./sections/PersonalizationSettings";
import { PlanUsageSettings } from "./sections/PlanUsageSettings";
import { ShortcutsSettings } from "./sections/ShortcutsSettings";
@@ -51,7 +49,6 @@ interface SidebarItem {
label: string;
icon: ReactNode;
hasChevron?: boolean;
- fullwidth?: boolean;
}
const SIDEBAR_ITEMS: SidebarItem[] = [
@@ -75,12 +72,6 @@ const SIDEBAR_ITEMS: SidebarItem[] = [
icon: ,
},
{ id: "claude-code", label: "Claude Code", icon: },
- {
- id: "mcp-servers",
- label: "MCP servers",
- icon: ,
- fullwidth: true,
- },
{ id: "shortcuts", label: "Shortcuts", icon: },
{
@@ -101,7 +92,6 @@ const CATEGORY_TITLES: Record = {
"cloud-environments": "Cloud environments",
personalization: "Personalization",
"claude-code": "Claude Code",
- "mcp-servers": "MCP Servers",
shortcuts: "Shortcuts",
signals: "Signals",
@@ -118,7 +108,6 @@ const CATEGORY_COMPONENTS: Record = {
"cloud-environments": CloudEnvironmentsSettings,
personalization: PersonalizationSettings,
"claude-code": ClaudeCodeSettings,
- "mcp-servers": McpServersSettings,
shortcuts: ShortcutsSettings,
signals: SignalSourcesSettings,
@@ -169,8 +158,6 @@ export function SettingsDialog() {
}
const ActiveComponent = CATEGORY_COMPONENTS[activeCategory];
- const activeItem = sidebarItems.find((i) => i.id === activeCategory);
- const isFullwidth = !!activeItem?.fullwidth;
const initials = user
? user.first_name && user.last_name
@@ -278,22 +265,16 @@ export function SettingsDialog() {
fill="url(#settings-dot-pattern)"
/>
- {isFullwidth ? (
-
- ) : (
-
-
-
-
- {CATEGORY_TITLES[activeCategory]}
-
-
-
-
-
- )}
+
+
+
+
+ {CATEGORY_TITLES[activeCategory]}
+
+
+
+
+
diff --git a/apps/code/src/renderer/features/settings/stores/settingsDialogStore.ts b/apps/code/src/renderer/features/settings/stores/settingsDialogStore.ts
index 69660dded..6e15a18c6 100644
--- a/apps/code/src/renderer/features/settings/stores/settingsDialogStore.ts
+++ b/apps/code/src/renderer/features/settings/stores/settingsDialogStore.ts
@@ -10,7 +10,6 @@ export type SettingsCategory =
| "personalization"
| "claude-code"
| "shortcuts"
- | "mcp-servers"
| "signals"
| "updates"
| "advanced";
diff --git a/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx b/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx
index 47222ff98..14b768738 100644
--- a/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx
+++ b/apps/code/src/renderer/features/sidebar/components/SidebarMenu.tsx
@@ -28,6 +28,7 @@ import { useSidebarData } from "../hooks/useSidebarData";
import { useTaskViewed } from "../hooks/useTaskViewed";
import { CommandCenterItem } from "./items/CommandCenterItem";
import { InboxItem, NewTaskItem } from "./items/HomeItem";
+import { McpServersItem } from "./items/McpServersItem";
import { SkillsItem } from "./items/SkillsItem";
import { SidebarItem } from "./SidebarItem";
import { TaskListView } from "./TaskListView";
@@ -40,6 +41,7 @@ function SidebarMenuComponent() {
navigateToInbox,
navigateToCommandCenter,
navigateToSkills,
+ navigateToMcpServers,
} = useNavigationStore();
const { data: allTasks = [] } = useTasks();
@@ -114,6 +116,10 @@ function SidebarMenuComponent() {
navigateToSkills();
};
+ const handleMcpServersClick = () => {
+ navigateToMcpServers();
+ };
+
const handleTaskClick = (taskId: string) => {
const task = taskMap.get(taskId);
if (task) {
@@ -292,6 +298,13 @@ function SidebarMenuComponent() {
/>
+
+
+
+
void;
+}
+
+export function McpServersItem({ isActive, onClick }: McpServersItemProps) {
+ return (
+ }
+ label="MCP servers"
+ isActive={isActive}
+ onClick={onClick}
+ />
+ );
+}
diff --git a/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts b/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts
index 141049b25..4dc20b092 100644
--- a/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts
+++ b/apps/code/src/renderer/features/sidebar/hooks/useSidebarData.ts
@@ -40,6 +40,7 @@ export interface SidebarData {
isInboxActive: boolean;
isCommandCenterActive: boolean;
isSkillsActive: boolean;
+ isMcpServersActive: boolean;
isLoading: boolean;
activeTaskId: string | null;
pinnedTasks: TaskData[];
@@ -58,7 +59,8 @@ interface ViewState {
| "inbox"
| "archived"
| "command-center"
- | "skills";
+ | "skills"
+ | "mcp-servers";
data?: Task;
}
@@ -123,6 +125,7 @@ export function useSidebarData({
const isInboxActive = activeView.type === "inbox";
const isCommandCenterActive = activeView.type === "command-center";
const isSkillsActive = activeView.type === "skills";
+ const isMcpServersActive = activeView.type === "mcp-servers";
const activeTaskId =
activeView.type === "task-detail" && activeView.data
@@ -232,6 +235,7 @@ export function useSidebarData({
isInboxActive,
isCommandCenterActive,
isSkillsActive,
+ isMcpServersActive,
isLoading,
activeTaskId,
pinnedTasks,
diff --git a/apps/code/src/renderer/stores/navigationStore.ts b/apps/code/src/renderer/stores/navigationStore.ts
index 32232fd4f..3edf3bcba 100644
--- a/apps/code/src/renderer/stores/navigationStore.ts
+++ b/apps/code/src/renderer/stores/navigationStore.ts
@@ -19,7 +19,8 @@ type ViewType =
| "inbox"
| "archived"
| "command-center"
- | "skills";
+ | "skills"
+ | "mcp-servers";
export interface TaskInputReportAssociation {
reportId: string;
@@ -60,6 +61,7 @@ interface NavigationStore {
navigateToArchived: () => void;
navigateToCommandCenter: () => void;
navigateToSkills: () => void;
+ navigateToMcpServers: () => void;
goBack: () => void;
goForward: () => void;
canGoBack: () => boolean;
@@ -93,6 +95,9 @@ const isSameView = (view1: ViewState, view2: ViewState): boolean => {
if (view1.type === "skills" && view2.type === "skills") {
return true;
}
+ if (view1.type === "mcp-servers" && view2.type === "mcp-servers") {
+ return true;
+ }
return false;
};
@@ -271,6 +276,10 @@ export const useNavigationStore = create()(
navigate({ type: "skills" });
},
+ navigateToMcpServers: () => {
+ navigate({ type: "mcp-servers" });
+ },
+
goBack: () => {
const { history, historyIndex } = get();
if (historyIndex > 0) {