From a6f3d6c539d59bac3e434fd85c628cf40a43f0d1 Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Mon, 27 Oct 2025 20:14:33 +0100 Subject: [PATCH] fix: move tools registration to composable --- packages/nuxt-mcp/src/module.ts | 5 +- packages/nuxt-mcp/src/tools/runtime.ts | 157 +++++++++++++------------ 2 files changed, 86 insertions(+), 76 deletions(-) diff --git a/packages/nuxt-mcp/src/module.ts b/packages/nuxt-mcp/src/module.ts index 4872537..2154634 100644 --- a/packages/nuxt-mcp/src/module.ts +++ b/packages/nuxt-mcp/src/module.ts @@ -5,7 +5,7 @@ import type { McpToolContext } from './types' import { addVitePlugin, defineNuxtModule } from '@nuxt/kit' import { ViteMcp } from 'vite-plugin-mcp' import { promptNuxtBasic } from './prompts/basic' -import { toolsNuxtRuntime } from './tools/runtime' +import { useToolsRuntime } from './tools/runtime' import { toolsScaffold } from './tools/scaffold' export interface ModuleOptions extends ViteMcpOptions { @@ -35,6 +35,7 @@ export default defineNuxtModule({ async setup(options, nuxt) { const unimport = promiseWithResolve() const nitro = promiseWithResolve() + const { registerTools } = useToolsRuntime() nuxt.hook('imports:context', (_unimport) => { unimport.resolve(_unimport) @@ -69,7 +70,7 @@ export default defineNuxtModule({ } promptNuxtBasic(context) - toolsNuxtRuntime(context) + registerTools(context) toolsScaffold(context) // eslint-disable-next-line ts/ban-ts-comment diff --git a/packages/nuxt-mcp/src/tools/runtime.ts b/packages/nuxt-mcp/src/tools/runtime.ts index b45037f..41d9491 100644 --- a/packages/nuxt-mcp/src/tools/runtime.ts +++ b/packages/nuxt-mcp/src/tools/runtime.ts @@ -1,87 +1,96 @@ import type { Component, NuxtPage } from '@nuxt/schema' import type { McpToolContext } from '../types' +import { useNuxt } from '@nuxt/kit' -export function toolsNuxtRuntime({ mcp, nuxt, unimport }: McpToolContext): void { - mcp.tool( - 'get-nuxt-config', - 'Get the Nuxt configuration, including the ssr, appDir, srcDir, rootDir, alias, runtimeConfig, modules, etc.', - {}, - async () => { - return { - content: [{ - type: 'text', - text: JSON.stringify({ - ssr: !!nuxt.options.ssr, - appDir: nuxt.options.appDir, - srcDir: nuxt.options.srcDir, - rootDir: nuxt.options.rootDir, - alias: nuxt.options.alias, - runtimeConfig: { - public: nuxt.options.runtimeConfig.public, - }, - modules: nuxt.options._installedModules.map(i => i.meta.name || (i as any).name).filter(Boolean), - imports: { - autoImport: !!nuxt.options.imports.autoImport, - ...nuxt.options.imports, - }, - components: nuxt.options.components, - }), - }], - } - }, - ) +export function useToolsRuntime(): { + registerTools: (context: McpToolContext) => void +} { + const nuxt = useNuxt() - mcp.tool( - 'list-nuxt-auto-imports-items', - 'List auto-imports items, when importing new functions to the code, check available items from this tool.', - {}, - async () => { - return { - content: [{ - type: 'text', - text: JSON.stringify({ - items: await (await unimport).getImports(), - }, null, 2), - }], - } - }, - ) + let pages: NuxtPage[] = [] + nuxt.hook('pages:extend', (_pages) => { + pages = _pages + }) let components: Component[] = [] nuxt.hook('components:extend', (_components) => { components = _components }) - mcp.tool( - 'list-nuxt-components', - 'List registered components in the Nuxt app. When adding importing new components, check available components from this tool.', - {}, - async () => { - return { - content: [{ - type: 'text', - text: JSON.stringify(components, null, 2), - }], - } - }, - ) + function registerTools({ mcp, unimport }: McpToolContext): void { + mcp.tool( + 'get-nuxt-config', + 'Get the Nuxt configuration, including the ssr, appDir, srcDir, rootDir, alias, runtimeConfig, modules, etc.', + {}, + async () => { + return { + content: [{ + type: 'text', + text: JSON.stringify({ + ssr: !!nuxt.options.ssr, + appDir: nuxt.options.appDir, + srcDir: nuxt.options.srcDir, + rootDir: nuxt.options.rootDir, + alias: nuxt.options.alias, + runtimeConfig: { + public: nuxt.options.runtimeConfig.public, + }, + modules: nuxt.options._installedModules.map(i => i.meta.name || (i as any).name).filter(Boolean), + imports: { + autoImport: !!nuxt.options.imports.autoImport, + ...nuxt.options.imports, + }, + components: nuxt.options.components, + }), + }], + } + }, + ) - let pages: NuxtPage[] = [] - nuxt.hook('pages:extend', (_pages) => { - pages = _pages - }) + mcp.tool( + 'list-nuxt-auto-imports-items', + 'List auto-imports items, when importing new functions to the code, check available items from this tool.', + {}, + async () => { + return { + content: [{ + type: 'text', + text: JSON.stringify({ + items: await (await unimport).getImports(), + }, null, 2), + }], + } + }, + ) + + mcp.tool( + 'list-nuxt-components', + 'List registered components in the Nuxt app. When adding importing new components, check available components from this tool.', + {}, + async () => { + return { + content: [{ + type: 'text', + text: JSON.stringify(components, null, 2), + }], + } + }, + ) + + mcp.tool( + 'list-nuxt-pages', + 'List registered pages and their metadata in the Nuxt app.', + {}, + async () => { + return { + content: [{ + type: 'text', + text: JSON.stringify(pages, null, 2), + }], + } + }, + ) + } - mcp.tool( - 'list-nuxt-pages', - 'List registered pages and their metadata in the Nuxt app.', - {}, - async () => { - return { - content: [{ - type: 'text', - text: JSON.stringify(pages, null, 2), - }], - } - }, - ) + return { registerTools } }