跳转至

8. RAG 与 MCP

RAG 和 MCP 都是给 agent 扩展上下文与能力,但它们解决的问题不同。

  • RAG:从你的知识库中检索相关内容。
  • MCP:连接外部工具、资源和 prompt,或把你的能力暴露给其他客户端。

RAG 的位置

RAG 不是“把文档贴进 prompt”。一个完整 RAG 流程通常包括:

flowchart LR
  D["文档"] --> C["切块"]
  C --> E["Embedding"]
  E --> V["Vector Store"]
  Q["用户问题"] --> R["检索"]
  V --> R
  R --> A["Agent 生成答案"]

Mastra 提供文档切块、向量查询工具、Graph RAG 等能力。实际项目里你需要关注:

  • 文档来源是否可信。
  • chunk 大小是否适合模型。
  • embedding 模型是否和语言匹配。
  • 检索结果是否需要重排。
  • 答案是否需要引用来源。
  • 用户权限是否会影响可检索文档。

RAG 适合什么

适合:

  • 帮客服 agent 查询知识库。
  • 帮代码 agent 查询内部规范。
  • 帮法务或财务 assistant 查询制度文档。
  • 帮销售 agent 查询产品资料。

不适合:

  • 实时状态查询。用 Tool 查数据库或 API。
  • 强一致业务逻辑。用 Tool 或 Workflow。
  • 需要修改外部系统的操作。用 Tool,并加权限。

MCP 的两个方向

Mastra 支持两个核心类:

  • MCPClient:连接外部 MCP server,拿到工具、资源、prompt。
  • MCPServer:把你的 Mastra tools、agents、workflows 暴露给外部 MCP 客户端。
flowchart LR
  Agent["Mastra Agent"] --> Client["MCPClient"]
  Client --> External["外部 MCP Server"]

  Tools["Mastra Tools / Agents / Workflows"] --> Server["MCPServer"]
  Server --> Other["Claude / Codex / 其他 MCP Client"]

连接外部 MCP Server

src/mastra/mcp/search-client.ts
import { MCPClient } from '@mastra/mcp'

export const searchMcpClient = new MCPClient({
  id: 'search-mcp-client',
  servers: {
    wikipedia: {
      command: 'npx',
      args: ['-y', 'wikipedia-mcp'],
    },
  },
})

把 MCP 工具交给 agent:

src/mastra/agents/research-agent.ts
import { Agent } from '@mastra/core/agent'
import { searchMcpClient } from '../mcp/search-client'

export const researchAgent = new Agent({
  id: 'research-agent',
  name: 'Research Agent',
  instructions: '使用可用 MCP 工具查找背景资料,并用中文总结。',
  model: 'openai/gpt-4o-mini',
  tools: await searchMcpClient.listTools(),
})

这种静态写法适合个人工具、CLI 或单租户服务。

多租户场景用动态 toolsets

如果不同用户有不同 MCP 凭据,不要在 agent 初始化时写死工具。可以在请求时构造 MCPClient,并把 listToolsets() 传给 .generate().stream()

const userMcp = new MCPClient({
  servers: {
    privateSearch: {
      url: new URL('https://example.com/mcp'),
      requestInit: {
        headers: {
          Authorization: `Bearer ${userToken}`,
        },
      },
    },
  },
})

const response = await agent.generate(userPrompt, {
  toolsets: await userMcp.listToolsets(),
})

await userMcp.disconnect()

这能避免把所有用户共享同一套外部工具凭据。

暴露自己的 MCP Server

src/mastra/mcp/travel-mcp-server.ts
import { MCPServer } from '@mastra/mcp'
import { travelAgent } from '../agents/travel-agent'
import { itineraryWorkflow } from '../workflows/itinerary-workflow'
import { cityWeatherTool } from '../tools/city-weather-tool'

export const travelMcpServer = new MCPServer({
  id: 'travel-mcp-server',
  name: 'Travel MCP Server',
  version: '1.0.0',
  agents: { travelAgent },
  workflows: { itineraryWorkflow },
  tools: { cityWeatherTool },
})

注册:

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { travelMcpServer } from './mcp/travel-mcp-server'

export const mastra = new Mastra({
  mcpServers: { travelMcpServer },
})

选择 RAG、Tool、MCP 的判断

需求 首选
查询自己系统里的实时业务数据 Tool
查询大量非结构化文档 RAG
调用外部 agent 工具生态 MCPClient
把自己的能力给其他 agent 用 MCPServer
固定多步骤业务流程 Workflow

不要把 MCP 当成内部模块系统,也不要把 RAG 当成数据库查询。