词元广场TOKPUB.COM - 欢迎您,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
课程信息 预计学时:4-6小时 难度等级:⭐⭐ 入门级(有Claude Code基础即可) 更新日期:2026年4月 适用版本:MCP规范 2025-11-25 / Claude Code v2.1.133(验证于 2026-05-08) 前置要求:已完成Claude Code安装和基础使用
根据你的情况选择学习路径:这是一篇3000+行的长教程,不用全看!根据你的目标选择路径。
✅ 术语表(5分钟) - 快速了解MCP核心概念
✅ 第一部分:MCP简介(10分钟) - 理解MCP是什么
✅ 第二部分:5分钟快速开始(15分钟) - 配置第一个MCP服务器
✅ 第三部分3.1-3.3:配置GitHub和数据库MCP(30分钟)🔧 第六部分:故障排查 - 按错误类型查找解决方案
🔧 第七部分:FAQ - 20个常见问题解答Ctrl + F 搜索你的错误信息关键词| 想学什么 | 看哪几节 | 预计时间 |
|---|---|---|
| 自定义MCP开发 | 第五部分 | 1.5小时 |
| 三作用域配置 | 第三部分3.4节 | 30分钟 |
| MCP工作原理 | 第四部分 | 45分钟 |
| 安全最佳实践 | 第三部分3.5节 | 20分钟 |
| 术语 | 英文全称 | 通俗解释 | 生活类比 |
|---|---|---|---|
| JSON | JavaScript Object Notation | 一种通用的数 据格式,用花括号{}组织数据,MCP配置文件就是JSON格式 | 标准化的表格模板 |
~(波浪号) | Home Directory | 用户的"家目录",macOS是/Users/用户名,Linux是/home/用户名,Windows对应C:\Users\用户名 | 你电脑上"我的文档"的上级目录 |
| MCP | Model Context Protocol | AI工具的"USB接口标准",让AI能连接各种外部工具 | USB接口标准 |
| MCP Server | - | 符合MCP标准的"工具包",提供特定功能 | USB设备(U盘、键盘) |
| MCP Client | - | 连接和使用MCP Server的程序 | 电脑的USB接口 |
| MCP Host | - | 运行MCP Client的宿主程序(如Claude Code) | 电脑主机 |
| Tools | - | MCP Server提供的"工具函数",AI可以调用 | 工具箱里的锤子、螺丝刀 |
| Resources | - | MCP Server提供的"数据资源",AI可以读取 | 参考书、资料库 |
| Prompts | - | MCP Server提供的"预设模板",标准化交互 | 填空表格、问卷模板 |
| STDIO | Standard Input/Output | "直连线"传输方式,本地进程通信 | USB直连线 |
| HTTP | Hypertext Transfer Protocol | "网线"传输方式,支持远程通信 | 网线/WiFi |
| JSON-RPC | JSON Remote Procedure Call | MCP的通信协议,用JSON格式传递消息 | 对讲机的通话格式 |
| 作用域 | Scope | 配置的生效范围(Local/Project/User) | 房间/楼层/整栋楼 |
| npx | Node Package eXecute | 临时运行npm包的工具 | 租借工具(用完还) |
| 环境变量 | Environment Variable | 系统级配置,存储敏感信息 | 保险柜里的密码本 |
一句话理解:MCP(Model Context Protocol)是AI工具的"USB接口标准",让任何AI应用都能即插即用地连接各种外部服务。
问题:每个AI工具都要单独对接,重复造轮子
Claude Desktop → [自定义代码] → GitHub
Claude Desktop → [自定义代码] → 数据库
Claude Desktop → [自定义代码] → 文件系统
VS Code + AI → [另一套代码] → GitHub
VS Code + AI → [另一套代码] → 数据库
...无限重复...解决方案:统一接口,一次开发到处使用
Claude Desktop ──┐
VS Code + AI ────┼── MCP协议 ── GitHub MCP Server
Cursor ──────────┤ 数据库 MCP Server
任何AI工具 ──────┘ 文件系统 MCP Server生活类比: 没有USB标准:每个品牌的键盘、鼠标都需要专用接口,换电脑就要换设备 有USB标准后:任何USB键盘 都能插任何电脑,即插即用
| 对比维度 | 传统集成方式 | MCP方式 |
|---|---|---|
| 开发成本 | 每个工具单独对接,重复开发 | 一次开发,多处复用 |
| 兼容性 | 各平台接口不兼容 | 开放标准,跨平台通用 |
| 安全性 | 安全边界模糊 | 明确的权限控制和隔离 |
| 维护成本 | 高(每个集成都要维护) | 低(社区共建,生态复用) |
| 学习成本 | 高(每个工具API不同) | 低(统一协议,学一次用到处) |
📌 信息来源:MCP官方文档 | GitHub公告 | 验证日期:2026-02-25
| 时间 | 里程碑事件 | 意义 |
|---|---|---|
| 2024年11月 | Anthropic发布MCP 1.0规范 | 开创AI工具标准化先河 |
| 2025年3月 | 发布2025-03-26版本 | 引入Streamable HTTP传输,废弃SSE |
| 2025年6月 | 发布2025-06-18版本 | 进一步完善协议规范 |
| 2025年11月 | 发布2025-11-25版本 | 当前最新稳定版本 |
| 2025年12月9日 | MCP捐赠给Linux基金会AAIF | 成为行业标准,OpenAI/Google/Microsoft等巨头支持 |
💡 重要事件:2025年12月9日,Anthropic将MCP捐赠给Linux 基金会下的Agentic AI Foundation(AAIF)。这意味着MCP从"Anthropic的协议"变成了"行业标准",OpenAI、Google DeepMind、Microsoft等主流AI厂商都已表态支持。
你:帮我在data目录下创建一个config.json文件
Claude Code(通过Filesystem MCP):
1. [调用] list_directory("./data") - 检查目录存在
2. [调用] write_file("./data/config.json", "{}") - 创建文件
3. [返回] 文件创建成功!路径:./data/config.json你:帮我创建一个Issue,标题是"修复登录bug"
Claude Code(通过GitHub MCP):
1. [调用] create_issue(owner, repo, title, body) - 创建Issue
2. [返回] Issue创建成功!链接:https://github.com/xxx/xxx/issues/123你:查一下用户表有多少条记录
Claude Code(通过SQLite MCP):
1. [调用] read_query("SELECT COUNT(*) FROM users")
2. [返回] 用户表共有 1,234 条记录你:帮我查一下Next.js 15的App Router怎么用
Claude Code(通过Context7 MCP):
1. [调用] resolve_library_id("next.js")
2. [调用] get_library_docs("/vercel/next.js", "app router")
3. [返回] 这是Next.js 15 App Router的最新文档...你:搜一下2025年最新的AI编程工具
Claude Code(通过Brave Search MCP):
1. [调用] brave_web_search("2025 AI编程工具", count=5)
2. [返回] 搜索结果:1. xxx 2. xxx 3. xxx ...本节目的:用最快速度配置第一个MCP服务器,让你立即看到效果! ⏱️ 预计时间:5-10分钟
.mcp.json 文件💡 你有两种选择: 选择A:在Claude Code对话框里说人话(推荐新手) 帮我创建项目MCP配置文件 .mcp.json,配置一个filesystem服务器 ,允许访问当前目录(换行用 Shift + Enter,最后按Enter发送)Claude Code会自动帮你创建正确格式的配置文件! 选择B:在终端里用命令行(熟悉命令行的用户)
见下方PowerShell/Bash代码
# 进入你的项目目录
cd C:\你的项目路径
# 创建.mcp.json文件(PowerShell 7推荐)
@'
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
"env": {}
}
}
}
'@ | Out-File -FilePath ".mcp.json" -Encoding utf8.mcp.json(注意开头有个点){
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
"env": {}
}
}
}💡 配置说明: "filesystem":服务器名称,你可以自己起名"command": "npx":使用npx运行"-y":自动同意安装"@modelcontextprotocol/server-filesystem":官方Filesystem MCP包名".":允许访问的目录(当前目录)
Claude Code v2.1.92
Working directory: /你的项目路径
MCP servers connected:
✓ filesystem (3 tools available)
You: █✅ 关键确认:看到 ✓ filesystem说明MCP服务器连接成功!
.mcp.json 文件在项目根目录你:列出当前目录下的所有文件Claude Code:
[调用 filesystem.list_directory]
路径: .
目录内容:
- .mcp.json (配置文件)
- package.json
- src/
- node_modules/
...你:读取package.json文件内容
你:在src目录下创建一个test.txt文件,内容是"Hello MCP"
你:搜索所有.js文件.mcp.json 文件存在且格式正确list_directory 工具read_file 工具write_file 工具(会请求确认)本节目的:学会配置10+最常用的MCP服务器 ⏱️ 预计时间:1-2小时
.mcp.json 文件:{
"mcpServers": {
"服务器名称1": {
"command": "启动命令",
"args": ["参数1", "参数2"],
"env": {
"环境变量名": "值"
}
},
"服务器名称2": {
...
}
}
}| 字段 | 必需 | 说明 | 示例 |
|---|---|---|---|
command | ✅ | 启动命令 | "npx", "node", "python" |
args | ✅ | 命令参数数组 | ["-y", "@modelcontextprotocol/server-xxx"] |
env | ❌ | 环境变量对象 | {"API_KEY": "xxx"} |
timeout | ❌ | 超时时间(毫秒) | 60000 |
| 对比维度 | JSON配置文件 | CLI命令 |
|---|---|---|
| 适合场景 | 团队项目、版本控制 | 快速测试、个人配置 |
| 可读性 | 高(结构清晰) | 中 |
| 批量配置 | 方便(一个文件) | 不便(逐个添加) |
| 版本控制 | 支持 | 不支持 |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
功能:完整的GitHub仓库管理能力,包括创建仓库、管理Issue、PR等
repo(完整仓库访问)workflow(如需管理Actions)⚠️ 安全提醒:Token只显示一次,关闭页面就看不到了!
# 永久设置环境变量
[System.Environment]::SetEnvironmentVariable('GITHUB_PERSONAL_ACCESS_TOKEN', 'ghp_你的Token', 'User')
# 验证
$env:GITHUB_PERSONAL_ACCESS_TOKEN
# 应显示你的Token.mcp.json 中添加:{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
}
}
}
}💡 说明: ${GITHUB_PERSONAL_ACCESS_TOKEN}会自动读取环境变量,不用把Token直接写在配置文件里
| 工具名 | 功能 | 参数 |
|---|---|---|
create_repository | 创建仓库 | name, description, private |
get_file_contents | 获取文件内容 | owner, repo, path |
push_files | 推送文件 | owner, repo, branch, files |
create_issue | 创建Issue | owner, repo, title, body |
create_pull_request | 创建PR | owner, repo, title, head, base |
fork_repository | Fork仓库 | owner, repo |
create_branch | 创建分支 | owner, repo, branch |
search_repositories | 搜索仓库 | query |
search_code | 搜索代码 | query |
search_issues | 搜索Issues | query |
功能:本地SQLite数据库的完整访问,无需安装数据库软件
{
"mcpServers": {
"sqlite": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "./data/app.db"],
"env": {}
}
}
}💡 说明:最后的参数是数据库文件路径,不存在会自动创建。SQLite MCP是Python包,需要用 uvx而非npx
| 工具名 | 功能 | 参数 |
|---|---|---|
read_query | 执行SELECT查询 | query |
write_query | 执行INSERT/UPDATE/DELETE | query |
create_table | 创建表 | query |
list_tables | 列出所有表 | - |
describe_table | 获取表结构 | table_name |
append_insight | 添加分析洞察 | insight |
你:创建一个users表,包含id、name、email字段
你:插入一条记录:张三,zhangsan@example.com
你:查询所有用户功能:连接PostgreSQL数据库,支持查询和结构检查
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://user:password@localhost:5432/database"]
}
}
}⚠️ 安全建议: 使用只读数据库用户 不要在配置文件中硬编码密码 连接字符串通过 args传递,可使用环境变量替代硬编码:"postgresql://${PGUSER}:${PGPASSWORD}@localhost:5432/database"
| 工具名 | 功能 | 参数 |
|---|---|---|
query | 执行SQL查询 | sql |
💡 说明: query是唯一的Tool。表结构信息(schemas、tables、columns)通过MCP的Resources机制自动暴露,无需手动调用工具即可获取
🎯 关键点:理解配置的作用域和优先级,是正确使用MCP的关键!
| 作用域 | 存储位置 | 优先级 | 适用场景 |
|---|---|---|---|
| Local | ~/.claude.json 项目条目 | 最高 | 个人私有配置、含API Key |
| Project | 项目根目录 .mcp.json | 中等 | 团队共享、版本控制 |
| User | ~/.claude.json 全局部分 | 最低 | 个人常用工具 |
💡 Windows用户路径说明: ~/.claude.json在Windows上对应:C:\Users\你的用户名\.claude.json可以在资源管理器地址栏输入 %USERPROFILE%快速跳转到用户目录作用域 名称说明: Local(本地):虽然叫"本地",但实际是"项目级个人私有配置"——只对当前项目生效,且不提交到Git Project(项目):项目级共享配置,整个团队都能看到 User(用户):全局个人配置,所有项目都能用
Local > Project > Usergithub 服务器:User作用域:GITHUB_PERSONAL_ACCESS_TOKEN = "user-token"
Project作用域:GITHUB_PERSONAL_ACCESS_TOKEN = "${GITHUB_PERSONAL_ACCESS_TOKEN}"
Local作用域:GITHUB_PERSONAL_ACCESS_TOKEN = "local-override-token"
最终生效:Local作用域的配置(local-override-token)| 场景 | 推荐作用域 | 原因 |
|---|---|---|
| 包含API密钥的配置 | Local | 安全,不会提交到Git |
| 团队必需的工具 | Project | 团队共享,可版本控制 |
| 个人常用工具 | User | 全局可用 |
| 临时测试配置 | Local | 不影响其他配置 |
| CI/CD使用 | Project | 可自动化部署 |
~/.claude.json):{
"mcpServers": {
"/Users/me/project1": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx_local_override"
}
}
}
}
}.mcp.json):{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
}
}
}
}功能:隐私优先的Web搜索,免费层每月2000次查询
{
"mcpServers": {
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "${BRAVE_API_KEY}"
}
}
}
}功能:获取1000+流行框架的最新文档,解决AI训练数据过时问题
{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"],
"env": {}
}
}
}你:查一下React 19的新特性
Claude Code:
1. [调用] resolve_library_id("react")
2. [调用] get_library_docs("/facebook/react", "react 19", 5000)
3. [返回] React 19新特性包括:...注意:Context7 免费额度为每月 1,000 次请求(2026年1月从 6,000 次下调),每小时限 60 次。超出需配置 API Key。
功能:MCP 服务器可提供交互式用户界面,直接在聊天中渲染图表、表单、仪表盘
功能:延迟加载 MCP 工具定义,减少上下文占用高达 95%
你:帮我查一下Slack里的消息
Claude Code:
1. [ToolSearch] 搜索 "slack" → 找到 mcp__slack__read_channel
2. [加载] 按需加载 slack 工具定义
3. [调用] mcp__slack__read_channel(...)alwaysLoad 跳 过懒加载alwaysLoad: true,让它的工具跳过 ToolSearch 延迟,始终立即可用:{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"alwaysLoad": true
}
}
}alwaysLoad: true:工具定义直接注入上下文,无需 ToolSearch 搜索alwaysLoad: false:走标准 ToolSearch 懒加载(默认)alwaysLoad 可省去每次搜索的开销;低频 MCP 保持默认懒加载即可。功能:MCP 服务器可在运行时通过交互对话框向用户请求结构化输入
1. Claude Code 调用 MCP 工具
2. MCP 服务器发现需要额外信息(如选择数据库、确认操作等)
3. MCP 服务器发起 elicitation 请求
4. Claude Code 向用户显示交互对话框(表单、选择框等)
5. 用户填写/选择后,结果返回 MCP 服务器
6. MCP 服务器继续执行操作⚠️ 版本要求:需要 Claude Code v2.1.69+ 支持。Elicitation 请求可在 Hooks 系统中通过 Elicitation/ElicitationResult事件进行拦截和自定义处理。
功能:支持连接远程运行的 MCP 服务器(HTTP 传输),不限于本地进程
功能:跨会话保存信息,记住用户偏好和项目上下文
{
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"],
"env": {}
}
}
}功能:获取网页内容,转换为Markdown格式
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {}
}
}
}功能:结构化的顺序思考过程,用于分解复杂问题
{
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"],
"env": {}
}
}
}功能:无头浏览器自动化,网页截图、表单填写、数据采集
{
"mcpServers": {
"puppeteer": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-puppeteer"],
"env": {}
}
}
}.mcp.json):{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./src", "./docs", "./data"],
"env": {}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
}
},
"sqlite": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "./data/app.db"],
"env": {}
},
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"],
"env": {}
},
"brave-search": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "${BRAVE_API_KEY}"
}
},
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"],
"env": {}
},
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"],
"env": {}
}
}
}| 分类 | 服务器 | 用途 | 需要API Key | 重要 |
|---|---|---|---|---|
| 数据 | filesystem | 文件读写 | ❌ | ⭐ |
| 数据 | sqlite | SQLite数据库 | ❌ | ⭐ |
| 数据 | postgres | PostgreSQL数据库 | ❌(需连接串) | |
| 数据 | memory | 持久化记忆 | ❌ | |
| 搜索 | brave-search | 网页搜索 | ✅ | ⭐ |
| 搜索 | fetch | 网页获取 | ❌ | |
| 开发 | github | GitHub仓库管理 | ✅ | ⭐ |
| 开发 | gitlab | GitLab仓库管理 | ✅ | |
| 开发 | git | 本地Git操作 | ❌ | |
| 知识 | context7 | 技术文档 | ❌ | ⭐ |
| 思考 | sequential-thinking | 顺序推理 | ❌ | |
| 自动化 | puppeteer | 浏览器自动化 | ❌ |
本节目的:理解MCP底层工作机制,帮助排查问题和开发自定义服务器 ⏱️ 预计时间:30-45分钟 💡 可跳过:如果你只是想使用MCP,不打算开发自定义服务器,可以跳过本节
这是什么? STDIO是最基础的传输方式,MCP客户端和服务器通过进程间的标准输入输出流通信。
┌──────────────────┐ ┌──────────────────┐
│ MCP Client │ │ MCP Server │
│ (Claude Code) │ │ (subprocess) │
├──────────────────┤ ├──────────────────┤
│ │ stdin │ │
│ 发送请求 ────────┼─── ─────►│ 接收并处理 │
│ │ │ │
│ │ stdout │ │
│ 接收响应 ◄───────┼─────────│ 发送响应 │
│ │ │ │
│ │ stderr │ │
│ 查看日志 ◄───────┼─────────│ 输出日志 │
└──────────────────┘ └──────────────────┘这是什么? HTTP传输让MCP服务器可以运行在远程机器上,通过网络通信。
┌──────────────────┐ HTTP ┌──────────────────┐
│ MCP Client │ POST │ MCP Server │
│ │────────►│ (Remote) │
│ │ │ │
│ │ SSE │ │
│ 接收流式响应 ◄───┼─────────│ 流式返回 │
└──────────────────┘ └──────────────────┘| 特性 | STDIO | HTTP |
|---|---|---|
| 部署位置 | 本地 | 本地或远程 |
| 网络需求 | 无 | 需要HTTP |
| 性能 | 最优 | 略有开销 |
| 安全性 | 进程隔离 | 需要认证 |
| 适用场景 | 单客户端本地工具 | 分布式/远程服务 |
| 复杂度 | 简单 | 中等 |
| 推荐度 | ⭐⭐⭐⭐⭐(本地) | ⭐⭐⭐⭐(远程) |
这是什么? JSON-RPC是MCP使用的通信协议,所有消息都是JSON格式。
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "read_file",
"arguments": {
"path": "/path/to/file.txt"
}
}
}jsonrpc:协议版本,必须是"2.0"id:请求标识符,用于匹配响应method:要调用的方法名params:方法参数(可选){
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "文件内容..."
}
]
}
}{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32600,
"message": "Invalid Request",
"data": "详细错误信息"
}
}{
"jsonrpc": "2.0",
"method": "notifications/progress",
"params": {
"progressToken": "token-123",
"progress": 50,
"total": 100
}
}💡 通知 vs 请求:通知没有 id字段,不需要响应
| 错误码 | 含义 | 说明 |
|---|---|---|
| -32700 | Parse error | JSON解析失败 |
| -32600 | Invalid Request | 请求格式无效 |
| -32601 | Method not found | 方法不存在 |
| -32602 | Invalid params | 参数无效 |
| -32603 | Internal error | 服务器内部错误 |
这是什么? Tools是MCP服务器提供的"函数",AI可 以调用它们执行操作。
{
"name": "read_file",
"description": "读取指定路径的文件内容",
"inputSchema": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "文件的绝对路径"
}
},
"required": ["path"]
}
}这是什么? Resources是MCP服务器提供的"数据",AI可以读取它们。
{
"uri": "file:///project/README.md",
"name": "项目说明文档",
"mimeType": "text/markdown"
}这是什么? Prompts是MCP服务器提供的"模板",预定义的交互方式。
{
"name": "code_review",
"description": "代码审查提示词模板",
"arguments": [
{
"name": "code",
"description": "要审查的代码",
"required": true
}
]
}1. 初始化阶段
Client → Server: initialize请求(发送客户端能力)
Server → Client: initialize响应(发送服务器能力)
Client → Server: initialized通知(确 认初始化完成)
2. 操作阶段
Client → Server: 发送各种请求(tools/call, resources/read等)
Server → Client: 返回响应或错误
Server → Client: 可选发送通知(进度更新等)
3. 关闭阶段
Client/Server: 关闭连接
Server: 清理资源本节目的:学会开发自己的MCP服务器 ⏱️ 预计时间:1.5-2小时 💡 前置要求:熟悉TypeScript/JavaScript基础
| 技术栈 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| Node.js + TypeScript | 通用工具、API集成 | 生态丰富,开发快速 | 性能略低 |
| Python | 数据处理、AI模型集成 | 库丰富,语法简洁 | 打包复杂 |
# 检查Node.js版本(需要18+)
node --version
# 预期输出:v18.x.x 或更高
# 检查npm版本
npm --version
# 预期输出:9.x.x 或更高
# 安装TypeScript(如果没有)
npm install -g typescript
tsc --version
# 预期输出:Version 5.x.xtsconfig.json:{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}package.json:{
"name": "my-first-mcp",
"version": "1.0.0",
"type": "module",
"description": "我的第一个MCP服务器",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"bin": {
"my-first-mcp": "dist/index.js"
},
"scripts": {
"build": "tsc",
"dev": "ts-node --esm src/index.ts",
"start": "node dist/index.js",
"watch": "tsc --watch"
},
"keywords": ["mcp", "claude", "ai-tools"],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"ts-node": "^10.9.0",
"typescript": "^5.0.0"
}
}| 配置项 | 说明 |
|---|---|
"type": "module" | 启用ES模块支持 |
"bin" | 定义命令行入口(用于 npx my-first-mcp) |
"build" | 编译TypeScript到 dist/ |
"dev" | 开发模式运行 |
my-first-mcp/
├── src/
│ ├── index.ts # 入口文件
│ ├── tools/ # 工具定义
│ │ └── hello.ts
│ ├── resources/ # 资源定义
│ │ └── config.ts
│ └── types/ # 类型定义
│ └── index.ts
├── dist/ # 编译输出(自动生成)
├── .gitignore
├── package.json
└── tsconfig.json.gitignore:node_modules/
dist/
*.log
.DS_Store
.envsrc/index.ts:💡 说明:服务器启动后会等待stdin输入,这是正常的。按 Ctrl+C退出。
.mcp.json 中添加:{
"mcpServers": {
"my-first-mcp": {
"command": "node",
"args": ["/path/to/my-first-mcp/dist/index.js"],
"env": {}
}
}
}⚠️ 注意:替换 /path/to/my-first-mcp为你的实际路径
Claude Code:
[调用 my-first-mcp.hello_world]
参数: {"name": "老金"}
Hello, 老金! 这是来自my-first-mcp的问候!这是什么? MCP Inspector是官方提供的调试工具,可以交互式测试MCP服务器。
src/index.ts 的工具列表中添加:CallToolRequestSchema 处理器中添加:{
"name": "@your-username/my-first-mcp",
"version": "1.0.0",
"description": "我的第一个MCP服务器",
"main": "dist/index.js",
"bin": {
"my-first-mcp": "dist/index.js"
},
"repository": {
"type": "git",
"url": "https://github.com/your-username/my-first-mcp"
},
"keywords": ["mcp", "claude", "ai-tools"],
"license": "MIT"
}{
"mcpServers": {
"my-first-mcp": {
"command": "npx",
"args": ["-y", "@your-username/my-first-mcp"],
"env": {}
}
}
}本节目的:帮助你快速定位和解决MCP配置问题 ⏱️ 预计时间:按需查阅
问题出现
│
▼
1. 检查配置文件 ─── JSON格式错误?→ 修复JSON
│
▼
2. 检查服务器状态 ─── 服务器启动失败?→ 查看日志
│
▼
3. 检查环境变量 ─── API Key缺失?→ 配置环境变量
│
▼
4. 检查网络 ─── 无法下载包?→ 配置镜像/代理
│
▼
5. 检查版本 ─── 版本不兼容?→ 更新Node.js/SDKError: MCP server 'xxx' failed to start| 原因 | 解决方案 |
|---|---|
| Node.js版本过低 | 升级到v18+ |
| npx不可用 | 重装npm或使用npm安装 |
| 网络无法访问npm | 配置国内镜像 |
| 包名写错 | 检查包名拼写 |
SyntaxError: Unexpected token in JSON| 错误 | 示例 | 修复 |
|---|---|---|
| 缺少逗号 | "a": 1 "b": 2 | "a": 1, "b": 2 |
| 多余逗号 | "a": 1,} | "a": 1} |
| 使用单引号 | 'key': 'value' | "key": "value" |
| 未闭合的引号 | "key: "value" | "key": "value" |
Error: GITHUB_PERSONAL_ACCESS_TOKEN is required
Error: Missing required environment variable# 检查环境变量
$env:GITHUB_PERSONAL_ACCESS_TOKEN
# 如果为空,说明未设置
# 设置环境变量
[System.Environment]::SetEnvironmentVariable('GITHUB_PERSONAL_ACCESS_TOKEN', 'your-token', 'User')
# 重启终端后验证
$env:GITHUB_PERSONAL_ACCESS_TOKENnpm ERR! code ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org failedGet-Content "$env:LOCALAPPDATA\Claude\logs\mcp*.log" -Wait| 对比 | MCP | 普通API |
|---|---|---|
| 定位 | 通用协议标准 | 具体服务接口 |
| 兼容性 | 跨平台、跨AI | 仅特定服务 |
| 学习成本 | 学一次用到处 | 每个API都不同 |
| 类比 | USB标准 | 某品牌的USB设备 |
package.json、.git目录同级。| 情况 | 选择 |
|---|---|
| 包含API Key | Local(不会提交Git) |
| 团队共享 | Project |
| 个人常用 | User |
| 临时测试 | Local |
${VAR} 语法不生效?echo $VAR 验证{
"mcpServers": {
"sqlite-app": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "./app.db"]
},
"sqlite-analytics": {
"command": "uvx",
"args": ["mcp-server-sqlite", "--db-path", "./analytics.db"]
}
}
}.mcp.json在项目根目录