MCP 实战:从零搭建 Model Context Protocol Server,让 AI 连接你的工具 TL;DRMCPModel Context Protocol是 Anthropic 推出的开放协议让 AI 模型能标准化地连接外部工具和数据源。本文从协议原理讲起手把手带你用 Python 搭建一个 MCP Server并接入 Claude / Cursor 使用。1. 为什么需要 MCP过去让 AI 调用工具每个应用都要自己实现一遍集成想让 Claude 读数据库 → 自己写一套工具调用逻辑想让 Cursor 访问文件系统 → 再写一套想让自研 Agent 调 API → 又写一套结果就是N 个模型 × M 个工具 N×M 个集成每个都是定制化代码。MCP 的出现解决了这个问题MCP 架构┌──────────────┐ MCP 协议 ┌──────────────┐ │ AI 应用 │ ←────────────→ │ MCP Server │ │ (Claude/Cursor│ (stdio/HTTP) │ (你的工具) │ │ /Agent) │ │ - 数据库 │ └──────────────┘ │ - 文件系统 │ │ - API │ └──────────────┘模型只需要支持 MCP 协议就能连接任意 MCP Server。一次开发处处可用。2. MCP 的核心概念概念说明HostAI 应用本身Claude Desktop、Cursor、自研 AgentClientHost 内部的 MCP 客户端负责和 Server 通信Server提供能力的服务工具、资源、提示词模板Tool可调用的函数如查询数据库、发送邮件Resource可读取的数据如文件、API 响应Prompt预定义的提示词模板3. 搭建第一个 MCP Server3.1 环境准备bashpip install mcp pip install uvicorn # 如果用 HTTP 模式 # 验证安装 python -c import mcp; print(MCP installed)3.2 用 FastMCP 写一个简单 ServerPython - mcp_server.pyfrom mcp.server.fastmcp import FastMCP import sqlite3 import os # 创建 MCP Server mcp FastMCP(company-db-server) DB_PATH ./company.db def get_db_connection(): conn sqlite3.connect(DB_PATH) conn.row_factory sqlite3.Row return conn # Tool 1: 查询员工 def query_employee(name: str) - str: 根据姓名查询员工信息 Args: name: 员工姓名支持模糊匹配 conn get_db_connection() cursor conn.cursor() cursor.execute( SELECT * FROM employees WHERE name LIKE ?, (f%{name}%,) ) rows cursor.fetchall() conn.close() if not rows: return f未找到匹配 {name} 的员工 result [] for row in rows: result.append( f姓名: {row[name]}, 部门: {row[department]}, f职位: {row[title]}, 入职: {row[hire_date]} ) return \n.join(result) # Tool 2: 统计部门人数 def count_department(department: str) - str: 统计某个部门的员工人数 Args: department: 部门名称 conn get_db_connection() cursor conn.cursor() cursor.execute( SELECT COUNT(*) as count FROM employees WHERE department ?, (department,) ) count cursor.fetchone()[count] conn.close() return f部门 {department} 共有 {count} 名员工 # Resource: 数据库 schema schema://employees) def get_schema() - str: 返回 employees 表的字段定义 return employees 表结构 - id: 主键 - name: 姓名 - department: 部门 - title: 职位 - salary: 薪资 - hire_date: 入职日期 # 启动 Serverstdio 模式 if __name__ __main__: mcp.run()3.3 在 Claude Desktop 中配置claude_desktop_config.json{ mcpServers: { company-db: { command: python, args: [/path/to/mcp_server.py] } } }重启 Claude Desktop 后它会自动发现你的 MCP Server你就能直接对话你「公司技术部有多少人」Claude自动调用count_department(技术部)→ 「技术部共有 15 名员工」4. 进阶带鉴权的 MCP Server生产环境需要安全控制。给 MCP Server 加上 API Key 鉴权Python - 带鉴权的 MCP Serverfrom mcp.server.fastmcp import FastMCP from mcp.server import Server from mcp.types import Tool, TextContent import os EXPECTED_TOKEN os.getenv(MCP_TOKEN, default-secret) # 自定义 Server拦截请求做鉴权 server Server(secure-db-server) server.list_tools() async def list_tools() - list[Tool]: return [ Tool( namequery_employee, description查询员工信息, inputSchema{ type: object, properties: { name: {type: string} } } ) ] server.call_tool() async def call_tool(name: str, arguments: dict) - list[TextContent]: # 这里简化真实场景从请求头读取 token if name query_employee: result query_employee(arguments[name]) return [TextContent(typetext, textresult)] return [TextContent(typetext, textUnknown tool)] # 启动 if __name__ __main__: import mcp.server.stdio async def main(): async with mcp.server.stdio.stdio_server() as (read, write): await server.run(read, write, server.create_initialization_options()) asyncio.run(main())5. 实战构建一个 GitHub MCP Server让 AI 能查 Issue、建 PR、读代码Python - github_mcp_server.pyfrom mcp.server.fastmcp import FastMCP import requests import os mcp FastMCP(github-server) GITHUB_TOKEN os.getenv(GITHUB_TOKEN) BASE_URL https://api.github.com HEADERS { Authorization: ftoken {GITHUB_TOKEN}, Accept: application/vnd.github.v3json } def list_open_issues(repo: str, limit: int 10) - str: 列出仓库的开放 Issue Args: repo: 格式为 owner/repo limit: 返回数量限制 response requests.get( f{BASE_URL}/repos/{repo}/issues, headersHEADERS, params{state: open, per_page: limit} ) issues response.json() result [] for issue in issues[:limit]: result.append(f#{issue[number]} {issue[title]} ({issue[html_url]})) return \n.join(result) if result else 没有开放 Issue def create_issue(repo: str, title: str, body: str ) - str: 创建新的 GitHub Issue Args: repo: 格式为 owner/repo title: Issue 标题 body: Issue 内容 response requests.post( f{BASE_URL}/repos/{repo}/issues, headersHEADERS, json{title: title, body: body} ) if response.status_code 201: data response.json() return f✅ 已创建 Issue #{data[number]}: {data[html_url]} return f❌ 创建失败: {response.status_code} {response.text} if __name__ __main__: mcp.run()6. MCP vs Function Calling维度MCPFunction Calling定位标准化协议连接方式模型能力调用方式复用性一次开发多模型使用每个模型各自实现生态跨应用共享 Server绑定单一应用复杂度需要 Server 进程直接传函数定义适用工具生态建设简单工具调用⚠️ 注意MCP 和 Function Calling 不是对立的。MCP Server 底层也是用 Function Calling 实现工具调用只是封装了一层标准化协议让工具可以跨模型、跨应用复用。7. 总结MCP 解决了 AI 工具集成的「N×M 问题」过去每个 AI 应用自己写工具集成重复劳动现在写一次 MCP Server所有支持 MCP 的 AI 应用都能用适合用 MCP 的场景你有一套内部工具/API想让多个 AI 应用都能调用你做 Agent 平台想让用户自己贡献工具你需要统一的安全/鉴权层管理工具访问入门建议先用 FastMCP 写一个简单 Server如查询数据库接入 Claude Desktop 体验。熟悉后再做鉴权、HTTP 模式、多工具编排。如果对你有帮助欢迎在评论区聊聊你用 MCP 踩过的坑。

相关新闻

最新新闻

具身智能精密装配赛上位机开发:TCP通讯、协议解析与实时调度实战指南

具身智能精密装配赛上位机开发:TCP通讯、协议解析与实时调度实战指南

1. 先搞清楚“具身智能精密装配赛”到底要解决什么问题看到“具身智能精密装配赛”这个标题,很多人的第一反应可能是“这比赛要用机器人做装配”,然后就开始琢磨机械臂、视觉算法或者强化学习。但结合“线下赛区需要智能体上位机教学及tcp通讯”这个关键…

2026/8/26 0:00:17
缓存穿透、击穿与雪崩:原理、区别与Spring Boot+Redis实战解决方案

缓存穿透、击穿与雪崩:原理、区别与Spring Boot+Redis实战解决方案

大家好,我是专注于后端技术分享的博主。在构建高并发系统时,缓存是提升性能、保护数据库的利器。然而,如果使用不当,缓存也可能成为系统稳定性的“阿喀琉斯之踵”。缓存穿透、击穿和雪崩是三个高频出现且极易混淆的故障场景&#…

2026/8/26 0:00:17
免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

2026/8/26 0:00:17
Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

2026/8/26 0:00:17
Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:17
基于Hadoop大数据的微博舆情分析可视化系统(源码+lw+部署文档+讲解等)

基于Hadoop大数据的微博舆情分析可视化系统(源码+lw+部署文档+讲解等)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/25 23:55:17