跳转至

MCP 协议与工具集成 — 完整教程

一句话说明:MCP(Model Context Protocol,模型上下文协议)是一个开源标准,让 AI 应用(如 Claude Code、OpenCode)能用统一的方式连接外部工具、数据库和 API——白话说就是 AI 的"万能 USB-C 插头"


目录

  1. 为什么要学 MCP
  2. 核心概念白话版
  3. MCP 生态现状
  4. 实操教程:在 OpenCode 中添加 MCP Server
  5. 实操教程:在 Claude Code 中添加 MCP Server
  6. 实操教程:自己写一个 MCP Server
  7. 生信场景 MCP 应用
  8. 常见报错与解决
  9. 速查表
  10. 延伸学习资源

1. 为什么要学 MCP

MCP 解决什么问题?

在没有 MCP 之前,每个 AI 工具要连接外部服务(GitHub、数据库、搜索引擎等),都得自己写一套"连接器"。这就像每个手机厂商都做自己的充电口——你得准备一堆不同的线。

MCP 的出现就是把这些"充电口"统一了

  • 以前(没有 MCP):Claude 想连 GitHub 需要一套代码,连数据库需要另一套,连 Slack 再来一套——每个 AI 工具都要重复造轮子
  • 现在(有 MCP):只要写一个标准的 MCP Server,所有支持 MCP 的 AI 客户端(Claude Code、OpenCode、Cursor、VS Code 等)都能直接用

白话类比:

就像 USB-C 接口统一了手机充电口。以前安卓用 Micro USB、苹果用 Lightning、笔记本用各种圆口。现在都用 USB-C,一根线走天下。MCP 就是 AI 工具界的 USB-C。

为什么 2025-2026 突然火了?

  1. Anthropic 在 2024 年底开源了 MCP 规范,Claude 全线产品(Claude Desktop、Claude Code)率先支持
  2. ChatGPT、VS Code Copilot、Cursor 相继宣布支持 MCP,形成了行业共识
  3. AI Agent(智能体)的爆发:Agent 需要操作真实世界的工具(搜索、写代码、查数据库),MCP 提供了标准化的工具连接方式
  4. 开发者社区快速跟进:GitHub 上已有数百个开源 MCP Server,覆盖 GitHub、Notion、PostgreSQL、文件系统等

对你(生信方向)的意义

  • 你可以让 AI 直接查 NCBI 数据库、操作 R/Python 脚本、连接生信分析 pipeline
  • 面试时能讲清楚 MCP,说明你对 AI 工具生态有深入理解,这是加分项

2. 核心概念白话版

2.1 MCP 是什么

官方定义:MCP 是一个开源协议,定义了 AI 应用与外部工具之间的通信标准。

白话版:MCP 就是一份"说明书",告诉 AI 和工具怎么说话。就像餐厅里服务员(AI)和厨房(工具)之间有一套固定的点单格式——服务员按格式写单子,厨房按格式做菜,谁来当服务员都能用这套格式。

2.2 三个角色:Host、Client、Server

┌─────────────────────────────────┐
│  MCP Host(宿主/AI 应用)         │
│  比如 Claude Code / OpenCode     │
│                                  │
│  ┌───────────┐  ┌───────────┐   │
│  │ MCP Client│  │ MCP Client│   │  ← 每连一个 Server 就创建一个 Client
│  └─────┬─────┘  └─────┬─────┘   │
│        │              │          │
└────────┼──────────────┼──────────┘
         │              │
   ┌─────▼─────┐  ┌────▼──────┐
   │ MCP Server│  │ MCP Server│    ← 实际提供工具/数据的程序
   │ (GitHub)  │  │ (数据库)   │
   └───────────┘  └───────────┘
角色 白话解释 例子
Host(宿主) 就是你用的 AI 应用,它负责管理所有连接 Claude Code、OpenCode、Cursor
Client(客户端) Host 内部自动创建的"连接管道",每连一个 Server 就有一个 Client 你不需要手动管,自动的
Server(服务端) 实际提供功能的程序,可以跑在本地或远程 GitHub Server、文件系统 Server

白话类比:

Host 就像你的手机,Client 就像手机上的蓝牙连接器,Server 就像蓝牙耳机。你(Host)可以同时连好几个蓝牙设备(Server),每个连接就是一个 Client。

2.3 三种能力:Tool / Resource / Prompt

MCP Server 能向 AI 提供三种东西:

能力 白话解释 例子
Tool(工具) AI 可以调用的"函数/操作" 查天气、查数据库、创建 GitHub Issue
Resource(资源) AI 可以读取的"数据/文件" 数据库表结构、API 返回的 JSON、文件内容
Prompt(提示模板) 预定义的对话模板,帮助 AI 更好地完成特定任务 代码审查模板、数据分析模板

白话类比:

  • Tool = 瑞士军刀上的工具(剪刀、开瓶器)——用来做事
  • Resource = 图书馆的书——用来看/读
  • Prompt = 考试的答题模板——告诉你怎么回答

最常用的是 Tool。大多数 MCP Server 主要暴露 Tool 给 AI 使用。

2.4 两种传输方式:stdio vs HTTP

MCP Server 和 Client 之间有两种"通信管道":

传输方式 白话解释 适用场景
stdio(标准输入输出) Server 作为本地程序运行,通过命令行的输入/输出通信 本地工具(文件操作、本地数据库)
Streamable HTTP Server 跑在远程服务器上,通过 HTTP 网络请求通信 云端服务(GitHub API、Sentry、Notion)

白话类比:

  • stdio = 你在家里直接跟家人说话(面对面,不用网络)
  • HTTP = 你打电话给远方的朋友(需要网络,但能连远方的人)

底层都用 JSON-RPC 2.0 协议(就是一种格式化的 JSON 消息,用来发请求和收响应)。你不需要深究这个细节,知道有这个东西就行。


3. MCP 生态现状

3.1 哪些 AI 工具支持 MCP

截至 2026 年,主流 AI 编码工具基本都已支持 MCP:

工具 支持 MCP 备注
Claude Code Anthropic 官方 CLI,MCP 支持最完善
Claude Desktop 桌面版 Claude
OpenCode 开源 AI 编码 agent,支持本地+远程 MCP
Cursor AI 编辑器
VS Code (Copilot) GitHub Copilot Chat 支持 MCP
ChatGPT OpenAI 后来也跟进了 MCP 支持
Windsurf (Codeium) AI 编码工具

3.2 常用 MCP Server 推荐

以下是社区中最常用的 MCP Server,按类别分类:

通用开发类

Server 名称 功能 传输方式
GitHub MCP 管理 Issue、PR、代码搜索 HTTP
filesystem 读写本地文件 stdio
PostgreSQL (dbhub) 查询数据库 stdio
Sentry 监控错误和异常 HTTP
Context7 搜索框架/库的最新文档 HTTP
Grep by Vercel 搜索 GitHub 上的代码示例 HTTP
Notion 读写 Notion 页面和数据库 HTTP
Slack 读取/发送消息 HTTP

生信相关(可自建)

Server 名称 功能 说明
NCBI Entrez 查 PubMed、GenBank 可封装 Biopython 接口
UniProt 蛋白质数据库查询 可封装 REST API
R/Bioconductor 运行 R 生信分析 可封装 R 脚本调用
BLAST 序列比对 可封装命令行 BLAST+

4. 实操教程:在 OpenCode 中添加 MCP Server

OpenCode 通过项目配置文件 opencode.jsonc(或 opencode.json)来管理 MCP Server。

4.1 配置方法

在项目根目录创建或编辑 opencode.jsonc

// opencode.jsonc - OpenCode 的配置文件
{
  // 引入配置的 JSON Schema,提供自动补全
  "$schema": "https://opencode.ai/config.json",

  // mcp 字段定义所有 MCP Server
  "mcp": {
    // 每个 Server 需要一个唯一的名字
    "server-name": {
      // type: "local"(本地)或 "remote"(远程)
      // command: 本地 Server 的启动命令
      // url: 远程 Server 的地址
      // enabled: 是否启用(默认 true)
      // environment: 环境变量(本地 Server 用)
      // headers: HTTP 请求头(远程 Server 用)
    }
  }
}

4.2 添加远程 MCP Server(以 Context7 为例)

Context7 是一个帮助 AI 查找最新框架文档的 MCP Server:

// opencode.jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    // context7: 查最新的框架/库文档
    "context7": {
      "type": "remote",                       // 远程服务器
      "url": "https://mcp.context7.com/mcp"   // 服务器地址
    }
  }
}

使用时在提示词中加上 use context7

用 FastAPI 搭建一个 REST API,查一下最新用法。use context7

4.3 添加本地 MCP Server(以 filesystem 为例)

// opencode.jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    // mcp_everything: 官方测试用的全功能 MCP Server
    "mcp_everything": {
      "type": "local",                                              // 本地服务器
      "command": ["npx", "-y", "@modelcontextprotocol/server-everything"],  // 启动命令
      "enabled": true                                                // 启用
    }
  }
}

4.4 添加需要 API Key 的本地 Server

// opencode.jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    // airtable: 连接 Airtable 数据库
    "airtable": {
      "type": "local",
      "command": ["npx", "-y", "airtable-mcp-server"],   // 用 npx 运行
      "enabled": true,
      "environment": {
        // 通过环境变量传入 API Key(不要硬编码密码!)
        "AIRTABLE_API_KEY": "your_api_key_here"
      }
    }
  }
}

4.5 添加需要认证的远程 Server(Sentry 为例)

// opencode.jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sentry": {
      "type": "remote",
      "url": "https://mcp.sentry.dev/mcp",
      "oauth": {}   // 空对象表示使用自动 OAuth 认证
    }
  }
}

添加后,在终端执行认证:

# 在终端中手动触发认证流程
opencode mcp auth sentry

4.6 管理已添加的 MCP Server

# 查看所有 MCP Server 及其认证状态
opencode mcp list

# 登出某个 Server 的认证
opencode mcp logout sentry

在 OpenCode 中还可以: - 通过 "enabled": false 临时禁用某个 Server - 通过 tools 配置用 glob 模式批量管理 - 通过 agent 配置让特定 Agent 才能用某些 MCP


5. 实操教程:在 Claude Code 中添加 MCP Server

Claude Code 使用命令行方式管理 MCP Server。

5.1 添加远程 HTTP Server

# 语法:claude mcp add --transport http <名字> <URL>
# 例子:添加 Notion MCP Server
claude mcp add --transport http notion https://mcp.notion.com/mcp

# 带认证头的例子
claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \
  --header "Authorization: Bearer YOUR_GITHUB_PAT"

5.2 添加本地 stdio Server

# 语法:claude mcp add --transport stdio <名字> -- <启动命令>
# 例子:添加 PostgreSQL 查询工具
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub \
  --dsn "postgresql://readonly:pass@localhost:5432/mydb"

# 带环境变量的例子
claude mcp add --transport stdio airtable \
  --env AIRTABLE_API_KEY=YOUR_KEY \
  -- npx -y airtable-mcp-server

注意:所有选项(--transport--env--scope)必须放在 Server 名字之前-- 双横线之后是传给 MCP Server 的命令和参数。

5.3 管理 Server

# 列出所有已配置的 Server
claude mcp list

# 查看某个 Server 的详情
claude mcp get github

# 删除某个 Server
claude mcp remove github

# 在 Claude Code 内部检查 Server 状态
/mcp

5.4 从 Claude Desktop 导入

如果你已经在 Claude Desktop 里配置过 MCP Server,可以直接导入:

# 自动导入 Claude Desktop 的 MCP 配置
claude mcp add-from-claude-desktop

5.5 配置作用域(scope)

Scope 说明 存储位置
local(默认) 仅当前项目、仅自己可用 项目目录 .claude/settings.local.json
project 当前项目、团队共享(提交到 Git) 项目根目录 .mcp.json
user 所有项目、仅自己可用 ~/.claude.json
# 添加到用户级别(所有项目都能用)
claude mcp add --transport http sentry --scope user https://mcp.sentry.dev/mcp

6. 实操教程:自己写一个 MCP Server

下面分别用 Python 和 Node.js 写一个最简单的 MCP Server——提供一个"生信工具",能计算 DNA 序列的 GC 含量和反向互补序列。

6.1 Python 版本

安装依赖

# 用 pip 安装 MCP Python SDK
pip install "mcp[cli]"

# 或者用 uv(更推荐)
uv add "mcp[cli]"

完整代码:bioinfo_server.py

#!/usr/bin/env python3
"""
生信 MCP Server - 提供 DNA 序列分析工具
功能:计算 GC 含量、生成反向互补序列
运行方式:python bioinfo_server.py(会以 stdio 模式启动)
"""

# 导入 FastMCP —— MCP Python SDK 的高级封装
# 它会自动把函数的类型注解和文档字符串转成 MCP 工具定义
from mcp.server.fastmcp import FastMCP

# 创建一个 MCP Server 实例,名字叫 "bioinfo"
# 这个名字会在客户端(Claude Code/OpenCode)里显示
mcp = FastMCP("bioinfo")


@mcp.tool()  # 这个装饰器把函数注册为一个 MCP Tool
def gc_content(sequence: str) -> str:
    """
    计算 DNA 序列的 GC 含量(GC content)。

    Args:
        sequence: DNA 序列字符串,只包含 A/T/G/C 四种碱基
    """
    # 把序列统一转成大写,避免大小写问题
    seq = sequence.upper().strip()

    # 检查序列是否只包含合法碱基
    valid_bases = set("ATGC")               # 合法碱基集合
    invalid = set(seq) - valid_bases        # 找出不合法的字符
    if invalid:
        # 如果有非法字符,返回错误提示
        return f"错误:序列包含非法字符 {invalid},只允许 A/T/G/C"

    if len(seq) == 0:
        return "错误:序列为空"

    # 统计 G 和 C 的数量
    gc_count = seq.count("G") + seq.count("C")

    # 计算 GC 含量百分比
    gc_percent = (gc_count / len(seq)) * 100

    # 返回结果
    return (
        f"序列长度: {len(seq)} bp\n"
        f"G 数量: {seq.count('G')}\n"
        f"C 数量: {seq.count('C')}\n"
        f"GC 含量: {gc_percent:.2f}%"
    )


@mcp.tool()  # 再注册一个工具
def reverse_complement(sequence: str) -> str:
    """
    生成 DNA 序列的反向互补序列(Reverse Complement)。

    Args:
        sequence: DNA 序列字符串
    """
    seq = sequence.upper().strip()

    # 碱基互补配对规则:A-T, G-C
    complement_map = {
        "A": "T",   # 腺嘌呤 ↔ 胸腺嘧啶
        "T": "A",
        "G": "C",   # 鸟嘌呤 ↔ 胞嘧啶
        "C": "G",
    }

    # 逐个碱基做互补转换
    try:
        complemented = "".join(
            complement_map[base] for base in seq
        )
    except KeyError as e:
        return f"错误:序列包含非法碱基 {e}"

    # 反向(reverse)互补序列 = 先互补再反转
    rev_comp = complemented[::-1]  # Python 切片反转

    return (
        f"原始序列:     5'-{seq}-3'\n"
        f"反向互补序列: 3'-{rev_comp}-5'\n"
        f"(通常写作:   5'-{rev_comp}-3')"
    )


@mcp.tool()
def sequence_stats(sequence: str) -> str:
    """
    统计 DNA 序列的基本信息(碱基组成、长度等)。

    Args:
        sequence: DNA 序列字符串
    """
    seq = sequence.upper().strip()

    if len(seq) == 0:
        return "错误:序列为空"

    # 统计各碱基数量
    counts = {base: seq.count(base) for base in "ATGC"}

    # 计算分子量(粗略估算,每个核苷酸约 330 Da)
    mol_weight = len(seq) * 330

    return (
        f"序列长度: {len(seq)} bp\n"
        f"碱基组成:\n"
        f"  A (腺嘌呤):  {counts['A']} ({counts['A']/len(seq)*100:.1f}%)\n"
        f"  T (胸腺嘧啶): {counts['T']} ({counts['T']/len(seq)*100:.1f}%)\n"
        f"  G (鸟嘌呤):  {counts['G']} ({counts['G']/len(seq)*100:.1f}%)\n"
        f"  C (胞嘧啶):  {counts['C']} ({counts['C']/len(seq)*100:.1f}%)\n"
        f"GC 含量: {(counts['G']+counts['C'])/len(seq)*100:.2f}%\n"
        f"估算分子量: ~{mol_weight:,} Da"
    )


# 主入口:以 stdio 方式运行 Server
if __name__ == "__main__":
    # transport="stdio" 表示通过标准输入/输出通信
    # 这是本地 MCP Server 的标准方式
    mcp.run(transport="stdio")

配置到 OpenCode

// opencode.jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bioinfo": {
      "type": "local",
      "command": ["python", "/home/pweaz/mcp-servers/bioinfo_server.py"],
      "enabled": true
    }
  }
}

配置到 Claude Code

claude mcp add --transport stdio bioinfo -- python /home/pweaz/mcp-servers/bioinfo_server.py

6.2 Node.js / TypeScript 版本

初始化项目

# 创建项目目录
mkdir bioinfo-mcp && cd bioinfo-mcp

# 初始化 npm 项目
npm init -y

# 安装 MCP TypeScript SDK 和 Zod(参数校验)
npm install @modelcontextprotocol/sdk zod@3
npm install -D @types/node typescript

# 创建源码目录
mkdir src

package.json 关键配置

{
  "type": "module",
  "scripts": {
    "build": "tsc",
    "start": "node build/index.js"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "Node16",
    "moduleResolution": "Node16",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true
  },
  "include": ["src/**/*"]
}

完整代码:src/index.ts

/**
 * 生信 MCP Server (TypeScript 版本)
 * 提供 DNA 序列分析工具:GC 含量、反向互补、碱基统计
 */

// 导入 MCP SDK 的核心类
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
// 导入 stdio 传输层(通过标准输入输出通信)
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
// 导入 zod 用于参数校验(MCP SDK 用它定义工具的输入格式)
import { z } from "zod";

// 创建 MCP Server 实例
const server = new McpServer({
  name: "bioinfo",       // Server 名称
  version: "1.0.0",      // 版本号
});

// 注册工具 1:计算 GC 含量
server.registerTool(
  "gc_content",  // 工具名称(AI 调用时用这个名字)
  {
    // 工具描述(AI 用这个描述来判断什么时候该调用这个工具)
    description: "计算 DNA 序列的 GC 含量百分比",
    // 输入参数的 schema(用 zod 定义)
    inputSchema: {
      sequence: z
        .string()                           // 参数类型:字符串
        .describe("DNA 序列,只包含 A/T/G/C"),  // 参数描述
    },
  },
  // 工具的实际执行逻辑
  async ({ sequence }) => {
    const seq = sequence.toUpperCase().trim();  // 转大写、去空格

    // 校验序列合法性
    if (!/^[ATGC]+$/.test(seq)) {
      return {
        content: [{ type: "text", text: "错误:序列包含非法字符,只允许 A/T/G/C" }],
      };
    }

    // 统计 G 和 C 的数量
    const gcCount = (seq.match(/[GC]/g) || []).length;
    const gcPercent = ((gcCount / seq.length) * 100).toFixed(2);

    return {
      // MCP 工具的返回格式:content 数组,每个元素有 type 和 text
      content: [
        {
          type: "text",
          text: `序列长度: ${seq.length} bp\nGC 含量: ${gcPercent}%`,
        },
      ],
    };
  }
);

// 注册工具 2:反向互补序列
server.registerTool(
  "reverse_complement",
  {
    description: "生成 DNA 序列的反向互补序列",
    inputSchema: {
      sequence: z.string().describe("DNA 序列"),
    },
  },
  async ({ sequence }) => {
    const seq = sequence.toUpperCase().trim();

    // 碱基互补映射
    const complementMap: Record<string, string> = {
      A: "T", T: "A", G: "C", C: "G",
    };

    // 生成互补序列
    const complement = seq
      .split("")
      .map((base) => complementMap[base] || "?")
      .join("");

    // 反转得到反向互补
    const revComp = complement.split("").reverse().join("");

    return {
      content: [
        {
          type: "text",
          text: `原始序列: 5'-${seq}-3'\n反向互补: 5'-${revComp}-3'`,
        },
      ],
    };
  }
);

// 主函数:启动 Server
async function main() {
  // 创建 stdio 传输层
  const transport = new StdioServerTransport();
  // 连接 Server 到传输层
  await server.connect(transport);
  // 日志输出到 stderr(重要!stdio Server 不能用 console.log)
  console.error("Bioinfo MCP Server 已启动 (stdio 模式)");
}

// 运行主函数
main().catch((error) => {
  console.error("启动失败:", error);
  process.exit(1);
});

构建和使用

# 编译 TypeScript
npm run build

# 配置到 Claude Code
claude mcp add --transport stdio bioinfo -- node /path/to/bioinfo-mcp/build/index.js

# 配置到 OpenCode(在 opencode.jsonc 中)
// opencode.jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bioinfo": {
      "type": "local",
      "command": ["node", "/path/to/bioinfo-mcp/build/index.js"],
      "enabled": true
    }
  }
}

6.3 重要注意事项

  1. stdio Server 禁止用 print()/console.log() 输出到 stdout——这会破坏 JSON-RPC 消息格式。调试信息用 print(..., file=sys.stderr)console.error()
  2. Tool 的描述要写清楚——AI 靠描述来决定什么时候调用你的工具
  3. 参数要有类型注解和说明——这样 AI 才知道传什么参数

7. 生信场景 MCP 应用

7.1 连接 NCBI 数据库

你可以写一个 MCP Server,封装 Biopython 的 Entrez 接口:

from mcp.server.fastmcp import FastMCP
from Bio import Entrez  # Biopython 的 NCBI 接口

mcp = FastMCP("ncbi")
Entrez.email = "your_email@example.com"  # NCBI 要求提供邮箱

@mcp.tool()
def search_pubmed(query: str, max_results: int = 5) -> str:
    """
    在 PubMed 上搜索文献。

    Args:
        query: 搜索关键词(如 "gut microbiome type 2 diabetes")
        max_results: 返回结果数量,默认 5
    """
    # 调用 NCBI Entrez 搜索接口
    handle = Entrez.esearch(db="pubmed", term=query, retmax=max_results)
    record = Entrez.read(handle)
    handle.close()

    ids = record["IdList"]  # 获取文献 ID 列表
    if not ids:
        return f"未找到与 '{query}' 相关的文献"

    # 获取文献摘要
    handle = Entrez.efetch(db="pubmed", id=ids, rettype="abstract", retmode="text")
    abstracts = handle.read()
    handle.close()

    return f"找到 {record['Count']} 篇文献,展示前 {len(ids)} 篇:\n\n{abstracts}"

7.2 自动化分析 pipeline

用 MCP 把你的生信分析脚本暴露给 AI:

import subprocess
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("bioinfo_pipeline")

@mcp.tool()
def run_fastqc(input_file: str) -> str:
    """
    对 FASTQ 文件运行 FastQC 质控。

    Args:
        input_file: FASTQ 文件的绝对路径
    """
    # 执行 FastQC 命令
    result = subprocess.run(
        ["fastqc", input_file, "-o", "/home/pweaz/results/qc/"],
        capture_output=True,  # 捕获标准输出和标准错误
        text=True             # 以文本模式返回
    )

    if result.returncode == 0:
        return f"FastQC 完成!结果保存在 /home/pweaz/results/qc/\n{result.stdout}"
    else:
        return f"FastQC 失败:\n{result.stderr}"

@mcp.tool()
def run_kraken2(input_file: str, database: str = "/db/kraken2/standard") -> str:
    """
    用 Kraken2 进行物种分类(宏基因组分析核心步骤)。

    Args:
        input_file: 输入的 FASTQ 文件路径
        database: Kraken2 数据库路径
    """
    output_file = input_file.replace(".fastq", "_kraken2.txt")
    report_file = input_file.replace(".fastq", "_kraken2_report.txt")

    result = subprocess.run(
        [
            "kraken2",
            "--db", database,
            "--output", output_file,
            "--report", report_file,
            input_file
        ],
        capture_output=True,
        text=True
    )

    if result.returncode == 0:
        return f"Kraken2 分类完成!\n报告: {report_file}\n{result.stderr}"
    else:
        return f"Kraken2 失败:\n{result.stderr}"

7.3 面试中怎么讲 MCP + 生信

你可以这样在面试中展示你的 AI 工具理解:

"我在毕业项目中研究了 2 型糖尿病的肠道菌群宏基因组数据。在日常分析中,我使用了 MCP 协议把常用的生信工具(如 FastQC、Kraken2、PubMed 搜索)封装成 MCP Server,这样 AI 编码助手就能直接帮我调用这些工具,比如说'帮我对 sample_01.fastq 做质控',AI 就会自动调用 FastQC 并返回结果。MCP 的好处是标准化——同一个 Server 在 Claude Code、OpenCode、Cursor 里都能用,不用重复配置。"


8. 常见报错与解决

报错 1:spawn xxx ENOENT

原因:系统找不到 MCP Server 的启动命令(如 npxpythonnode)。

解决

# 检查命令是否在 PATH 中
which npx    # Linux/Mac
where npx    # Windows

# 如果找不到,用绝对路径
claude mcp add --transport stdio bioinfo -- /usr/bin/python3 /path/to/server.py

报错 2:Server connection failed / timeout

原因:MCP Server 启动超时(默认 5 秒)。Server 可能在安装依赖或初始化。

解决

# Claude Code:增加超时时间(毫秒)
MCP_TIMEOUT=30000 claude

# OpenCode:在配置中设置 timeout
"my-server": {
  "type": "local",
  "command": ["npx", "-y", "some-server"],
  "timeout": 30000   // 30 }

报错 3:JSON-RPC error / Server 返回乱码

原因:Server 代码中用了 print()(Python)或 console.log()(Node.js)输出到 stdout,破坏了 JSON-RPC 消息。

解决

# Python:错误写法
print("调试信息")           # 会写到 stdout,破坏通信

# Python:正确写法
import sys
print("调试信息", file=sys.stderr)   # 写到 stderr,不影响通信
import logging
logging.info("调试信息")             # logging 默认写 stderr

// Node.js:错误写法
console.log("调试信息");    // 写到 stdout

// Node.js:正确写法
console.error("调试信息");  // 写到 stderr

报错 4:Tool not found / AI 说找不到工具

原因:MCP Server 已配置但工具没被 AI 发现,或 Server 未成功启动。

解决

# 在 Claude Code 中检查 Server 状态
/mcp

# 在 OpenCode 中查看 mcp 列表
opencode mcp list

# 确认 Server 启动没报错——手动运行试试
python bioinfo_server.py   # 应该会挂起等待输入,而不是报错

报错 5:401 Unauthorized / 认证失败

原因:远程 MCP Server 需要认证(OAuth 或 API Key),但没有提供或已过期。

解决

# Claude Code:重新认证
/mcp
# 选择对应 Server -> Clear authentication -> 重新认证

# OpenCode:手动触发认证
opencode mcp auth server-name

# 检查 API Key 是否正确设置
echo $MY_API_KEY

报错 6:context limit exceeded / 上下文超限

原因:MCP 工具定义太多,占用了大量上下文 token。GitHub MCP Server 尤其容易出这个问题。

解决

# 方案 1:只启用真正需要的 MCP Server
# 方案 2:在 Claude Code 中开启 Tool Search(默认已开)
ENABLE_TOOL_SEARCH=true claude

# 方案 3:在 OpenCode 中按 agent 分配 MCP
# 全局禁用所有 MCP 工具,然后在特定 agent 中启用需要的
"tools": { "my-mcp*": false },
"agent": {
  "my-agent": {
    "tools": { "my-mcp*": true }
  }
}


9. 速查表

MCP 核心概念速查

概念 白话一句话
MCP AI 工具的"万能 USB-C 插头"标准
Host 你用的 AI 应用(Claude Code/OpenCode)
Client Host 内部自动创建的连接管道
Server 提供工具/数据的程序
Tool AI 能调用的函数(做事)
Resource AI 能读取的数据(看/读)
Prompt 预定义的对话模板
stdio 本地进程通信(不走网络)
HTTP 远程网络通信(走网络)

OpenCode MCP 配置速查

// opencode.jsonc 模板
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    // 本地 Server
    "local-example": {
      "type": "local",
      "command": ["python", "/path/to/server.py"],
      "enabled": true,
      "environment": { "KEY": "value" },
      "timeout": 10000
    },
    // 远程 Server
    "remote-example": {
      "type": "remote",
      "url": "https://mcp.example.com/mcp",
      "enabled": true,
      "headers": { "Authorization": "Bearer token" }
    }
  }
}

Claude Code MCP 命令速查

命令 说明
claude mcp add --transport http <名字> <URL> 添加远程 HTTP Server
claude mcp add --transport stdio <名字> -- <命令> 添加本地 stdio Server
claude mcp add-json <名字> '<JSON>' 用 JSON 直接添加
claude mcp list 列出所有 Server
claude mcp get <名字> 查看 Server 详情
claude mcp remove <名字> 删除 Server
claude mcp add-from-claude-desktop 从 Claude Desktop 导入
/mcp 在会话中查看 Server 状态

Python MCP Server 模板

from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-server")

@mcp.tool()
def my_tool(param: str) -> str:
    """工具描述,AI 靠这个来判断何时调用。"""
    return f"结果: {param}"

if __name__ == "__main__":
    mcp.run(transport="stdio")

10. 延伸学习资源

官方资源

资源 链接 说明
MCP 官方文档 https://modelcontextprotocol.io 协议规范、SDK 文档
MCP GitHub https://github.com/modelcontextprotocol SDK 源码、示例 Server
OpenCode MCP 文档 https://opencode.ai/docs/mcp-servers/ OpenCode 配置指南
Claude Code MCP 文档 https://docs.anthropic.com/en/docs/claude-code/mcp Claude Code 配置指南

社区资源

资源 说明
https://github.com/modelcontextprotocol/servers 官方维护的 MCP Server 合集
MCP Inspector 调试 MCP Server 的交互式工具
Awesome MCP Servers GitHub 上的社区 Server 推荐列表

推荐学习路径

  1. 第一步:在 OpenCode/Claude Code 中添加一个现成的 MCP Server(如 Context7),体验 MCP 的效果
  2. 第二步:阅读官方文档的 Architecture 页面,理解 Host/Client/Server 的关系
  3. 第三步:用 Python FastMCP 写一个自己的简单 Server(参考本文第 6 节)
  4. 第四步:把你的生信分析脚本封装成 MCP Server,在日常工作中使用
  5. 进阶:学习 Resource 和 Prompt 的用法,做更复杂的 Server

最后提醒:MCP 是 2025-2026 年 AI 工具生态中最重要的基础设施标准之一。理解它不仅帮你更高效地使用 AI 工具,在面试中展示你对 MCP 的理解,也能体现你紧跟技术前沿的学习能力。