进阶主题

自定义路径

自定义模块查找 MCP 定义的位置。

默认路径结构

默认情况下,模块会在以下位置查找定义:

server/
└── mcp/
    ├── tools/
    │   └── # 工具定义
    ├── resources/
    │   └── # 资源定义
    └── prompts/
        └── # 提示词定义

更改基础目录

使用 dir 配置选项更改基础目录:

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/mcp-toolkit'],
  mcp: {
    dir: 'my-mcp', // 在 server/my-mcp/ 中查找,而不是 server/mcp/
  },
})

这将在以下位置查找定义:

server/
└── my-mcp/
    ├── tools/
    │   └── # 工具定义
    ├── resources/
    │   └── # 资源定义
    └── prompts/
        └── # 提示词定义

使用 Hook 扩展路径

对于更高级的用例,可以使用 mcp:definitions:paths hook 来添加需要扫描的额外目录。当你希望在多个模块或层之间共享定义时,这非常有用。

在 nuxt.config.ts 中使用 Hook

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/mcp-toolkit'],
  hooks: {
    'mcp:definitions:paths'(paths) {
      // 添加工具的额外路径
      paths.tools.push('shared/tools')

      // 添加资源的额外路径
      paths.resources.push('shared/resources')

      // 添加提示词的额外路径
      paths.prompts.push('shared/prompts')
    },
  },
})

在自定义模块中使用 Hook

my-module.ts
export default defineNuxtModule({
  setup(options, nuxt) {
    nuxt.hook('mcp:definitions:paths', (paths) => {
      // 添加工具的额外路径
      paths.tools.push('shared/tools')

      // 添加资源的额外路径
      paths.resources.push('shared/resources')

      // 添加提示词的额外路径
      paths.prompts.push('shared/prompts')
    })
  },
})

路径结构

paths 对象具有以下结构:

{
  tools: string[]      // 工具目录路径数组
  resources: string[]  // 资源目录路径数组
  prompts: string[]    // 提示词目录路径数组
  handlers: string[]   // 处理器目录路径数组
}

所有路径均相对于每个 Nuxt 层的 server/ 目录。

示例:共享定义

在多个 Nuxt 层之间共享定义:

project/
├── shared/
│   ├── tools/
│   │   └── common-tool.ts
│   └── resources/
│       └── common-resource.ts
└── apps/
    ├── web/
    │   └── server/
    │       └── mcp/
    │           └── tools/
    │               └── web-tool.ts
    └── api/
        └── server/
            └── mcp/
                └── tools/
                    └── api-tool.ts

配置 hook 以包含共享定义:

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/mcp-toolkit'],
  hooks: {
    'mcp:definitions:paths'(paths) {
      // 包含来自项目根目录的共享工具
      paths.tools.push('../../shared/tools')
      paths.resources.push('../../shared/resources')
      paths.prompts.push('../../shared/prompts')
    },
  },
})

示例:多个源目录

扫描多个目录以查找定义:

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/mcp-toolkit'],
  mcp: {
    dir: 'mcp', // 默认目录
  },
  hooks: {
    'mcp:definitions:paths'(paths) {
      // 添加额外的工具目录
      paths.tools.push('legacy-tools')
      paths.tools.push('new-tools')

      // 添加额外的资源目录
      paths.resources.push('external-resources')
    },
  },
})

这将扫描:

  • server/mcp/tools/(默认)
  • server/legacy-tools/
  • server/new-tools/
  • server/mcp/resources/(默认)
  • server/external-resources/

示例:特定层的路径

在 Nuxt 层设置中,按层配置路径:

layers/api/nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/mcp-toolkit'],
  hooks: {
    'mcp:definitions:paths'(paths) {
      // 仅包含特定于 API 的工具
      paths.tools = ['api/tools']
      paths.resources = ['api/resources']
    },
  },
})

路径解析

路径相对于以下位置进行解析:

  1. 当前 Nuxt 层的 server/ 目录
  2. 项目根目录(用于绝对路径)
// 相对于 server/
paths.tools.push('custom/tools')

// 从项目根目录开始的绝对路径
paths.tools.push('/absolute/path/to/tools')

最佳实践

  1. 使用描述性的目录名称:明确每个目录包含的内容
  2. 保持路径有序:将相关的定义分组在一起
  3. 记录自定义路径:添加注释说明为何使用自定义路径
  4. 测试路径解析:确保路径在所有环境中都能正确解析
  5. 考虑层结构:在复杂的多应用设置中使用层

下一步