|
1 |
| -import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js' |
| 1 | +import type { Component } from '@nuxt/schema' |
| 2 | +import type { Unimport } from 'unimport' |
2 | 3 | import { addVitePlugin, defineNuxtModule } from '@nuxt/kit'
|
3 | 4 | import { ViteMcp } from 'vite-plugin-mcp'
|
4 | 5 | import { version } from '../package.json'
|
5 | 6 |
|
6 |
| -// Module options TypeScript interface definition |
7 |
| -export interface ModuleOptions {} |
| 7 | +export interface ModuleOptions { |
| 8 | + /** |
| 9 | + * Update MCP url to `.cursor/mcp.json` automatically |
| 10 | + * |
| 11 | + * @default true |
| 12 | + */ |
| 13 | + updateCursorMcpJson?: boolean |
| 14 | +} |
8 | 15 |
|
9 | 16 | export default defineNuxtModule<ModuleOptions>({
|
10 | 17 | meta: {
|
11 | 18 | name: 'nuxt-mcp',
|
12 | 19 | configKey: 'mcp',
|
13 | 20 | },
|
14 | 21 | // Default configuration options of the Nuxt module
|
15 |
| - defaults: {}, |
16 |
| - async setup(_options, nuxt) { |
| 22 | + defaults: { |
| 23 | + updateCursorMcpJson: true, |
| 24 | + }, |
| 25 | + async setup(options, nuxt) { |
| 26 | + let unimport: Unimport |
| 27 | + let components: Component[] = [] |
| 28 | + nuxt.hook('imports:context', (_unimport) => { |
| 29 | + unimport = _unimport |
| 30 | + }) |
| 31 | + nuxt.hook('components:extend', (_components) => { |
| 32 | + components = _components |
| 33 | + }) |
| 34 | + |
17 | 35 | addVitePlugin(ViteMcp({
|
| 36 | + port: nuxt.options.devServer.port, |
| 37 | + updateCursorMcpJson: { |
| 38 | + enabled: !!options.updateCursorMcpJson, |
| 39 | + serverName: 'nuxt', |
| 40 | + }, |
18 | 41 | mcpServerInfo: {
|
19 | 42 | name: 'nuxt',
|
20 | 43 | version,
|
21 | 44 | },
|
22 |
| - mcpServerSetup(server) { |
23 |
| - server.resource( |
24 |
| - 'nuxt', |
25 |
| - new ResourceTemplate('nuxt://{name}', { list: undefined }), |
26 |
| - async (uri, { name }) => { |
| 45 | + mcpServerSetup(mcp) { |
| 46 | + mcp.tool( |
| 47 | + 'get-nuxt-config', |
| 48 | + 'Get the Nuxt configuration', |
| 49 | + {}, |
| 50 | + async () => { |
27 | 51 | return {
|
28 |
| - contents: [{ uri: uri.href, text: `Hello, ${name}!` }], |
| 52 | + content: [{ |
| 53 | + type: 'text', |
| 54 | + text: JSON.stringify({ |
| 55 | + ssr: !!nuxt.options.ssr, |
| 56 | + appDir: nuxt.options.appDir, |
| 57 | + srcDir: nuxt.options.srcDir, |
| 58 | + rootDir: nuxt.options.rootDir, |
| 59 | + alias: nuxt.options.alias, |
| 60 | + runtimeConfig: { |
| 61 | + public: nuxt.options.runtimeConfig.public, |
| 62 | + }, |
| 63 | + modules: nuxt.options._installedModules.map(i => i.meta.name || (i as any).name).filter(Boolean), |
| 64 | + imports: { |
| 65 | + autoImport: !!nuxt.options.imports.autoImport, |
| 66 | + ...nuxt.options.imports, |
| 67 | + }, |
| 68 | + components: nuxt.options.components, |
| 69 | + }), |
| 70 | + }], |
| 71 | + } |
| 72 | + }, |
| 73 | + ) |
| 74 | + |
| 75 | + mcp.tool( |
| 76 | + 'get-nuxt-auto-imports-items', |
| 77 | + 'Get the Nuxt configuration as JSON', |
| 78 | + {}, |
| 79 | + async () => { |
| 80 | + return { |
| 81 | + content: [{ |
| 82 | + type: 'text', |
| 83 | + text: JSON.stringify({ |
| 84 | + items: await unimport.getImports(), |
| 85 | + }), |
| 86 | + }], |
| 87 | + } |
| 88 | + }, |
| 89 | + ) |
| 90 | + |
| 91 | + mcp.tool( |
| 92 | + 'get-nuxt-components', |
| 93 | + 'Get components registered in the Nuxt app', |
| 94 | + {}, |
| 95 | + async () => { |
| 96 | + return { |
| 97 | + content: [{ |
| 98 | + type: 'text', |
| 99 | + text: JSON.stringify(components), |
| 100 | + }], |
29 | 101 | }
|
30 | 102 | },
|
31 | 103 | )
|
32 |
| - }, |
33 |
| - port: nuxt.options.devServer.port, |
34 |
| - updateCursorMcpJson: { |
35 |
| - enabled: true, |
36 |
| - serverName: 'nuxt', |
37 | 104 | },
|
38 | 105 | }))
|
39 | 106 | },
|
|
0 commit comments