提示词

输入、处理器与消息

Zod 参数、处理器返回类型、角色和多消息提示。

输入模式

使用 Zod 定义并验证提示参数:

server/mcp/prompts/translate.ts
import { z } from 'zod'
import { defineMcpPrompt } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpPrompt({
  name: 'translate',
  inputSchema: {
    // 必需的字符串参数
    text: z.string().describe('待翻译文本'),

    // 必需的枚举参数
    targetLanguage: z.enum(['en', 'fr', 'es', 'de']).describe('目标语言'),

    // 可选参数
    sourceLanguage: z.string().optional().describe('源语言(如果未提供则自动检测)'),

    // 带默认值的可选参数
    formality: z.enum(['formal', 'informal']).default('formal'),
  },
  handler: async ({ text, targetLanguage, sourceLanguage, formality }) => {
    // 实现
  },
})

常见参数类型

Zod 类型示例描述
z.string()z.string().min(1)带验证的字符串
z.enum()z.enum(['a', 'b'])枚举
z.optional()z.string().optional()可选字段
z.default()z.string().default('value')带默认值的字段
注意:提示参数必须是字符串。请使用 z.string(),并在需要时在处理器中将其转换为其他类型。

参数自动补全

使用 completable() 包裹模式字段,以便在客户端填写提示参数时提供自动补全建议:

server/mcp/prompts/review-code.ts
export default defineMcpPrompt({
  description: '审查代码最佳实践',
  inputSchema: {
    language: completable(
      z.string().describe('编程语言'),
      value => ['typescript', 'javascript', 'python', 'rust', 'go']
        .filter(lang => lang.startsWith(value)),
    ),
  },
  handler: async ({ language }) => {
    return `请审查以下 ${language} 代码的最佳实践和潜在问题。`
  },
})

completable 辅助函数会自动导入,并从 MCP SDK 中重新导出。回调会接收当前输入值,并返回匹配的建议。

处理器函数

处理器会接收已验证的参数(如果提供了 inputSchema)并返回一个提示结果。

返回类型

处理器支持两种返回类型:

// 返回字符串 — 自动包装为单个用户消息
handler: async () => '你是一个乐于助人的助手。'

// 带参数
handler: async ({ topic }) => `帮我理解 ${topic}`
当返回字符串时,它会根据 role 选项(默认为 'user')自动包装为 { messages: [{ role, content: { type: 'text', text: '...' } }] }

处理器参数

// 没有 inputSchema — 无参数
handler: async () => '消息文本'

// 有 inputSchema — 接收已验证的参数
handler: async (args, extra) => {
  // args: 与 inputSchema 匹配的已验证参数
  // extra: 请求处理器的额外信息
  return `包含 ${args.param} 的消息`
}

消息角色

提示可以返回不同角色的消息:

return {
  messages: [{
    role: 'user',
    content: {
      type: 'text',
      text: '带有说明的用户消息',
    },
  }],
}
注意:MCP 规范仅支持 userassistant 角色。若要提供上下文或说明,请将它们包含在 user 消息文本中。

多条消息

返回多条消息以创建对话流程:

server/mcp/prompts/conversation.ts
import { defineMcpPrompt } from '@nuxtjs/mcp-toolkit/server'

export default defineMcpPrompt({
  name: 'conversation-starter',
  inputSchema: {
    topic: z.string().describe('对话主题'),
  },
  handler: async ({ topic }) => {
    return {
      messages: [
        {
          role: 'user',
          content: {
            type: 'text',
            text: `你是一个乐于助人的助手。让我们来讨论 ${topic}`,
          },
        },
        {
          role: 'assistant',
          content: {
            type: 'text',
            text: `我很乐意和你讨论 ${topic}`,
          },
        },
      ],
    }
  },
})