import type { ViteDevServer } from 'vite'
import type { ViteMcpOptions } from './types'
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
import { z } from 'zod'
import { version } from '../package.json'
export function createMcpServerDefault(
options: ViteMcpOptions,
vite: ViteDevServer,
): McpServer {
const server = new McpServer(
{
name: 'vite',
version,
...options.mcpServerInfo,
},
)
server.tool(
'get-vite-config',
'Get the Vite config digest, including the root, resolve, plugins, and environment names.',
{},
async () => ({
content: [{
type: 'text',
text: JSON.stringify({
root: vite.config.root,
resolve: vite.config.resolve,
plugins: vite.config.plugins.map(p => p.name).filter(Boolean),
environmentNames: Object.keys(vite.environments),
}),
}],
}),
)
server.tool(
'get-vite-module-info',
'Get graph information of a module, including importers, imported modules, and compiled result.',
{
filepath: z.string()
.describe('The absolute filepath of the module'),
},
async ({ filepath }) => {
const records: any[] = []
Object.entries(vite.environments).forEach(([key, env]) => {
const mods = env.moduleGraph.getModulesByFile(filepath)
for (const mod of mods || []) {
records.push({
environment: key,
id: mod.id,
url: mod.url,
importers: Array.from(mod.importers),
importedModules: Array.from(mod.importedModules),
meta: mod.meta,
lastHMRTimestamp: mod.lastHMRTimestamp,
transformResult: mod.transformResult,
})
}
})
return {
content: [{
type: 'text',
text: JSON.stringify(records),
}],
}
},
)
return server
}