Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
3ee71be
app: Add langchain/mcp-adapters 1.0.0
illume Nov 4, 2025
60ccce8
app: main: MCPClient: Add stub MCPClient class and hook it up to main
illume Nov 4, 2025
8d809a9
app: MCPToolStateStore: Add MCPToolStateStore for tool state, stats, …
illume Nov 4, 2025
d99a95d
app: MCPToolStateStore: Add parseServerNameToolName to get separate c…
illume Nov 4, 2025
814f6e4
app: MCPToolStateStore: Add summarizeMcpToolStateChanges and tests
illume Nov 4, 2025
f911b74
app: MCPToolStateStore: Add initConfigFromClientTools
illume Nov 6, 2025
6d1589c
app: MCPToolStateStore: Add validateToolArgs
illume Nov 6, 2025
2802aed
app: MCPToolStateStore: Add showToolsConfigConfirmationDialog
illume Nov 6, 2025
d6552e9
app: settings: runCmd: Extract loadSettings saveSettings into own module
illume Nov 5, 2025
b88d6ff
app: MCPSettings: Add functions for load/save of mcp settings
illume Nov 5, 2025
22ebb22
app: MCPSettings: Add expandEnvAndResolvePaths to process env
illume Nov 5, 2025
a2e8345
app: MCPSettings: Add makeMcpServersFromSettings
illume Nov 6, 2025
35a76e6
app: MCPSettings: Add settingsChanges for human-readable changes
illume Nov 6, 2025
a9fb6b1
app: MCPSettings: Add showSettingsChangeDialog
illume Nov 6, 2025
d3cce24
app: MCPSettings: Add hasClusterDependentServers
illume Nov 6, 2025
0239042
app: MCPClient: Add showConfirmationDialog
illume Nov 6, 2025
16712c6
app: main: MCPClient: Use MultiServerMCPClient from langchain/mcp-ada…
illume Nov 6, 2025
e79685b
app: MCPClient: Add mcpExecuteTool
illume Nov 7, 2025
052a947
app: MCPClient: MCPSettings: Add setupIpcHandlers and ipc methods
illume Nov 7, 2025
c7b7ae4
app: preload: Add mcp APIs to be exposed to frontend/
illume Nov 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,11 @@
electron/windowSize.test.js
electron/env-paths.js
electron/runCmd.test.js
electron/mcp/MCPClient.js
electron/mcp/MCPClient.test.js
electron/mcp/MCPToolStateStore.js
electron/mcp/MCPToolStateStore.test.js
electron/settings.js
electron/settings.test.js
electron/mcp/MCPSettings.js
electron/mcp/MCPSettings.test.js
24 changes: 23 additions & 1 deletion app/electron/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import url from 'url';
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
import i18n from './i18next.config';
import MCPClient from './mcp/MCPClient';
import {
addToPath,
ArtifactHubHeadlampPkg,
Expand All @@ -58,6 +59,9 @@ if (process.env.HEADLAMP_RUN_SCRIPT) {
runScript();
}

// Enabled by default, set HEADLAMP_MCP_ENABLE=false to disable MCP features
const ENABLE_MCP = process.env.HEADLAMP_MCP_ENABLE !== 'false';

dotenv.config({ path: path.join(process.resourcesPath, '.env') });

const isDev = process.env.ELECTRON_DEV || false;
Expand Down Expand Up @@ -139,6 +143,7 @@ const shouldCheckForUpdates = process.env.HEADLAMP_CHECK_FOR_UPDATES !== 'false'

// make it global so that it doesn't get garbage collected
let mainWindow: BrowserWindow | null;
let mcpClient: MCPClient | null = null;

/**
* `Action` is an interface for an action to be performed by the plugin manager.
Expand Down Expand Up @@ -1602,6 +1607,14 @@ function startElecron() {
if (userPluginBinDirs.length > 0) {
addToPath(userPluginBinDirs, 'userPluginBinDirs plugin');
}

if (ENABLE_MCP) {
const configPath = path.join(app.getPath('userData'), 'mcp-tools-config.json');
const settingsPath = path.join(app.getPath('userData'), 'mcp-tools-settings.json');
mcpClient = new MCPClient(configPath, settingsPath);
await mcpClient.initialize();
mcpClient.setMainWindow(mainWindow);
}
}

if (disableGPU) {
Expand Down Expand Up @@ -1632,12 +1645,21 @@ function startElecron() {

app.once('window-all-closed', app.quit);

app.once('before-quit', () => {
app.once('before-quit', async () => {
saveZoomFactor(cachedZoom);
i18n.off('languageChanged');
if (mainWindow) {
mainWindow.removeAllListeners('close');
}

if (mcpClient) {
try {
await mcpClient.cleanup();
mcpClient = null;
} catch (err) {
console.error('Failed to clean up mcpClient:', err);
}
}
});
}

Expand Down
Loading
Loading