新版本Cursor中配置自定义MCP服务器教程,附MCP工具开发实战源码

在 Cursor 中配置自定义 MCP 服务器:打造你的 AI 开发工具链

引言

随着 AI 编程助手的普及,开发者们越来越希望能够定制化自己的开发环境。Cursor 作为一款强大的 AI 编程编辑器,提供了 Model Context Protocol (MCP) 支持,新版本的MCP配置采用json文件配置方式,与老版本配置方式不同。

什么是 MCP?

Model Context Protocol (MCP) 是一种协议,用于连接本地或远程的 AI 模型和服务。它通过标准输入输出(stdio)进行通信,使用 JSON-RPC 2.0 协议格式,让开发者能够扩展 Cursor 的功能,集成自己的 AI 工具。

MCP 的核心优势在于:

  • 标准化协议:统一的 JSON-RPC 2.0 格式
  • 本地集成:无需额外的网络服务
  • 灵活扩展:支持自定义工具和功能
  • 安全可靠:本地运行,数据不外泄

Cursor MCP 配置基础

配置文件位置

Cursor 的 MCP 配置存储在用户设置中,通常位于:

  • Windows: %APPDATA%\.Cursor\mcp.json

配置结构

MCP 配置采用 JSON 格式,基本结构如下:

{"mcpServers": {"server-name": {"command": "python","args": ["script.py"],"cwd": "/path/to/script/directory"}}
}

配置参数说明

  • mcpServers: MCP 服务器配置的根节点
  • server-name: 服务器名称,用于标识不同的 MCP 服务
  • command: 启动命令,通常是 pythonnode
  • args: 命令行参数数组,指定要执行的脚本
  • cwd: 工作目录,脚本文件所在的绝对路径

实战:配置 AI Commit Message 生成器

让我们以一个实用的 AI Commit Message 生成器为例,展示完整的 MCP 配置过程。

项目结构

AI-commit-msg-MCP/
├── cursor_mcp_server_v2.py    # MCP 服务器脚本
├── ai_commit.py               # AI 生成逻辑
├── requirements.txt           # Python 依赖
└── README.md                 # 项目说明

1. 创建 MCP 服务器脚本

首先,我们需要创建一个符合 MCP 协议的服务器脚本:

#!/usr/bin/env python3
"""
Cursor MCP Server - AI Commit Message 生成器
"""import json
import sys
import os
import git
from typing import Dict, Any, Optional
from ai_commit import AICommitGeneratorclass CursorMCPServer:def __init__(self):self.ai_generator = AICommitGenerator()self.request_id = 0self.initialized = Falsedef send_response(self, result: Any = None, error: Any = None):"""发送响应给Cursor"""response = {"jsonrpc": "2.0","id": self.request_id}if error:response["error"] = errorelse:response["result"] = resultprint(json.dumps(response), flush=True)def handle_initialize(self, params: Dict[str, Any]):"""处理初始化请求"""self.initialized = Trueself.send_response({"protocolVersion": "2024-11-05","capabilities": {"tools": {}},"serverInfo": {"name": "ai-commit-mcp","version": "1.0.0"}})def handle_tools_list(self, params: Dict[str, Any]):"""处理工具列表请求"""if not self.initialized:self.send_response(error={"code": -32002,"message": "Server not initialized"})returntools = [{"name": "generate_commit_message","description": "Generate a commit message based on git diff","inputSchema": {"type": "object","properties": {"diff": {"type": "string","description": "Git diff content (optional)"},"repo_path": {"type": "string","description": "Repository path","default": "."}}}},{"name": "get_commit_prompt","description": "Get commit message prompt data for Cursor AI","inputSchema": {"type": "object","properties": {}}},{"name": "get_staged_diff","description": "Get current git staged diff","inputSchema": {"type": "object","properties": {"repo_path": {"type": "string","description": "Repository path","default": "."}}}}]self.send_response({"tools": tools})def handle_tools_call(self, params: Dict[str, Any]):"""处理工具调用请求"""if not self.initialized:self.send_response(error={"code": -32002,"message": "Server not initialized"})returntool_name = params.get("name")tool_args = params.get("arguments", {})try:if tool_name == "generate_commit_message":# 处理生成 commit message 的逻辑diff = tool_args.get("diff", "")repo_path = tool_args.get("repo_path", ".")if diff:prompt_data = self.ai_generator.get_commit_prompt_data(diff, repo_path)else:diff = self.ai_generator.get_staged_diff(repo_path)prompt_data = self.ai_generator.get_commit_prompt_data(diff, repo_path)self.send_response({"content": [{"type": "text","text": f"Commit message prompt generated successfully.\n\n**Prompt for Cursor AI:**\n\n{prompt_data['prompt']}"}]})elif tool_name == "get_commit_prompt":# 获取当前 staged changes 的提示词diff = self.ai_generator.get_staged_diff()prompt_data = self.ai_generator.get_commit_prompt_data(diff)self.send_response({"content": [{"type": "text","text": f"Commit prompt data retrieved.\n\n**Prompt for Cursor AI:**\n\n{prompt_data['prompt']}"}]})elif tool_name == "get_staged_diff":# 获取当前 git staged diffrepo_path = tool_args.get("repo_path", ".")diff = self.ai_generator.get_staged_diff(repo_path)if diff:self.send_response({"content": [{"type": "text","text": f"Current staged diff:\n\n```diff\n{diff}\n```"}]})else:self.send_response({"content": [{"type": "text","text": "No staged changes found."}]})else:self.send_response(error={"code": -32601,"message": f"Tool not found: {tool_name}"})except Exception as e:self.send_response(error={"code": -32603,"message": f"Error calling tool {tool_name}: {str(e)}"})def handle_request(self, request: Dict[str, Any]):"""处理请求"""method = request.get("method")params = request.get("params", {})self.request_id = request.get("id", 0)if method == "initialize":self.handle_initialize(params)elif method == "tools/list":self.handle_tools_list(params)elif method == "tools/call":self.handle_tools_call(params)else:self.send_response(error={"code": -32601,"message": f"Method not found: {method}"})def run(self):"""运行MCP服务器"""print("AI Commit MCP Server started", file=sys.stderr)for line in sys.stdin:try:request = json.loads(line.strip())self.handle_request(request)except json.JSONDecodeError as e:print(f"Invalid JSON: {e}", file=sys.stderr)continueexcept Exception as e:print(f"Error processing request: {e}", file=sys.stderr)continueif __name__ == "__main__":server = CursorMCPServer()server.run()

2. Cursor MCP 配置

在 Cursor 的设置中添加以下配置:

{"mcpServers": {"ai-commit-mcp": {"command": "python","args": ["cursor_mcp_server_v2.py"],"cwd": "D:/myproject/AI-commit-msg-MCP"}}
}

3. 配置说明

  • ai-commit-mcp: 服务器名称,可以自定义
  • command: 使用 Python 解释器
  • args: 指定要执行的脚本文件
  • cwd: 脚本文件所在的绝对路径(注意使用正斜杠)

4. 重启 Cursor

配置完成后,必须重启 Cursor 才能生效。

使用自定义 MCP 工具

验证配置

重启 Cursor 后,你应该能在工具面板中看到 3 个新工具:

  • generate_commit_message
  • get_commit_prompt
  • get_staged_diff

在聊天中使用

在 Cursor 的 AI 聊天中,你可以直接使用这些工具:

请帮我生成一个 commit message

AI 会自动调用相应的工具来获取 git diff 并生成提示词。

手动调用工具

你也可以明确指定要使用的工具:

请使用 get_commit_prompt 工具获取当前的 commit 提示词

高级配置技巧

1. 多服务器配置

你可以配置多个 MCP 服务器:

{"mcpServers": {"ai-commit-mcp": {"command": "python","args": ["cursor_mcp_server_v2.py"],"cwd": "D:/myproject/AI-commit-msg-MCP"},"code-analyzer": {"command": "node","args": ["analyzer.js"],"cwd": "C:/tools/code-analyzer"},"test-generator": {"command": "python","args": ["test_gen.py"],"cwd": "/home/user/test-tools"}}
}

2. 环境变量配置

如果需要传递环境变量,可以添加 env 配置:

{"mcpServers": {"ai-commit-mcp": {"command": "python","args": ["cursor_mcp_server_v2.py"],"cwd": "D:/myproject/AI-commit-msg-MCP","env": {"OPENAI_API_KEY": "your-api-key","DEBUG": "true"}}}
}

3. 不同操作系统的路径配置

为了跨平台兼容,建议使用正斜杠:

{"mcpServers": {"ai-commit-mcp": {"command": "python","args": ["cursor_mcp_server_v2.py"],"cwd": "D:/myproject/AI-commit-msg-MCP"}}
}

故障排除

常见问题

  1. 工具显示为 0 个

    • 检查配置文件路径是否正确
    • 确保脚本文件存在且有执行权限
    • 重启 Cursor
  2. 工具调用失败

    • 检查 Python 环境是否正确
    • 查看 Cursor 输出面板的错误信息
    • 确保依赖包已安装
  3. 路径问题

    • 使用绝对路径
    • 避免路径中包含中文字符
    • 使用正斜杠作为路径分隔符

调试技巧

  1. 查看 Cursor 输出面板

    • 打开 Cursor 的输出面板
    • 查看 MCP 相关的日志信息
  2. 测试 MCP 服务器

    • 创建测试脚本验证服务器功能
    • 确保 JSON-RPC 协议实现正确
  3. 检查文件权限

    • 确保脚本文件可读可执行
    • 检查工作目录权限

最佳实践

1. 项目组织

  • 将 MCP 服务器脚本放在独立的目录中
  • 使用版本控制管理配置
  • 创建详细的文档说明

2. 错误处理

  • 实现完善的错误处理机制
  • 提供有意义的错误信息
  • 记录详细的日志信息

3. 性能优化

  • 避免在工具调用中执行耗时操作
  • 使用异步处理处理复杂任务
  • 合理缓存计算结果

4. 安全性

  • 验证输入参数
  • 避免执行危险操作
  • 保护敏感信息

扩展思路

1. 集成更多 AI 服务

你可以基于 MCP 协议集成各种 AI 服务:

  • 代码审查工具
  • 文档生成器
  • 测试用例生成器
  • 性能分析工具

2. 创建工具链

将多个 MCP 服务器组合成完整的开发工具链:

  • 代码分析 → 测试生成 → 文档更新
  • 提交信息生成 → 代码审查 → 部署

3. 社区贡献

将你的 MCP 工具开源,供其他开发者使用:

  • 发布到 GitHub
  • 创建详细的安装文档
  • 提供示例和教程

总结

Cursor 的 MCP 功能为开发者提供了强大的扩展能力,让我们能够定制化自己的 AI 开发环境。通过本文的介绍,你应该已经了解了如何配置和使用自定义 MCP 服务器。

关键要点:

  1. MCP 配置必须重启 Cursor 生效
  2. 使用绝对路径避免路径问题
  3. 实现正确的 JSON-RPC 2.0 协议
  4. 提供完善的错误处理和日志记录

随着 AI 编程助手的发展,MCP 协议将成为连接各种 AI 工具的重要桥梁。掌握 MCP 配置技能,将让你在 AI 编程时代拥有更强的竞争力。

开始你的 MCP 之旅,打造属于你的 AI 开发工具链吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/914884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试十二之vue3基础

一、ref和reactive在 Vue 3 中,ref 和 reactive 是两种主要的响应式数据创建方式,它们各有特点和适用场景。1.refref 主要用于创建单个值的响应式引用,通常用于基本类型数据,如数字、字符串等。使用 ref 创建的引用对象可以通过 .…

设计模式四:装饰模式(Decorator Pattern)

装饰模式是一种结构型设计模式,它允许你动态地给一个对象添加额外的职责,相比继承更加灵活。1. 模式定义装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。2. 模式结构主要角色&#…

神经网络常见激活函数 14-Mish函数

文章目录Mish函数导函数函数和导函数图像优缺点PyTorch 中的 Mish 函数TensorFlow 中的 Mish 函数Mish 论文 https://arxiv.org/pdf/1908.08681 函数导函数 Mish函数 Mish(x)x⋅tanh⁡⁣(softplus(x))x⋅tanh⁡⁣(ln⁡⁣(1ex))\begin{aligned} \text{Mish}(x) & x \cdot \t…

LAMP迁移LNMP Nginx多站点配置全流程

文章目录前言备份与停止服务nginx安装与配置nginx 编译安装配置服务php-fpm多站点配置phf-fpm介绍多站点配置nginx 多站点配置nginx ssl 配置参考前言 之前服务器使用的是 LAMP环境,想充分利用服务器资源,再运行另外一个站点 在LAMP环境下应该是也可以…

Nginx屏蔽国外IP访问

下载IP列表 # 下载到文件 wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest # 直接输出到终端 curl -sSL https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest得到一份国内IP配置 # 原始IP列表格式:apnic|CN|ipv4|218.78.0.0|1310…

stl-string模拟

1.介绍主要进行cpp中string的模拟,方便我们更好的对stl进行使用,string没有模板,我们将头文件和函数写在两个不同的文件2.头文件3.cpp文件如有问题,欢迎纠正!

基于MATLAB的极限学习机ELM的数据回归预测方法应用

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取 或者私信获取。 1.项目背景 在当今的数据驱动时代,准确且高效的预测模型对于解决复杂问题至关重要。极限学习机&#…

芯谷科技--双四通道模拟/数字多路复用器74HC4052

在电子系统中,信号的多路复用与解复用是常见的需求,特别是在需要对多个信号源进行选择和切换的场景中。芯谷科技推出的 74HC4052 双四通道模拟/数字多路复用器/解复用器,以其高效、灵活的设计,为工程师提供了可靠的解决方案。产品…

基于MATLAB的极限学习机ELM的数据分类预测方法应用

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取 或者私信获取。 1.项目背景 在现代数据挖掘与机器学习领域,面对日益复杂的数据结构和快速增长的数据量,开…

复合机器人在生物制药实验室上下料搬运案例

在医疗行业的物料搬运环节,传统的人工操作模式逐渐暴露出诸多弊端,成为制约企业发展的瓶颈。富唯智能通过引入先进的复合机器人技术,为医疗企业提供了高效、智能的上下料搬运解决方案,助力医疗行业实现自动化与智能化升级。​客户…

嵌入式学习-PyTorch(7)-day23

损失函数的调用import torch from torch import nn from torch.nn import L1Lossinputs torch.tensor([1.0,2.0,3.0]) target torch.tensor([1.0,2.0,5.0])inputs torch.reshape(inputs, (1, 1, 1, 3)) target torch.reshape(target, (1, 1, 1, 3)) #损失函数 loss L1Loss…

用 Ray 跨节点调用 GPU 部署 DeepSeek 大模型,实现分布式高效推理

在大模型时代,单节点 GPU 资源往往难以满足大模型(如 7B/13B 参数模型)的部署需求。借助 Ray 分布式框架,我们可以轻松实现跨节点 GPU 资源调度,让大模型在多节点间高效运行。本文将以 DeepSeek-llm-7B-Chat 模型为例&…

快速了解 HTTPS

1. 引入 在 HTTP 协议 章节的 reference 段,曾提到过 HTTPS。这里对HTTPS进行详细介绍。 HTTPS 是在 HTTP 的基础上,引入了一个加密层 (SSL)。HTTP 是明文传输的 (不安全)。当下所见到的大部分网站都是 HTTPS 的。 起初是拜运营商劫持所赐(…

mysql备份与视图

要求:1.将mydb9_stusys数据库下的student、sc 和course表,备份到本地主机保存为st_msg_bak.sql文件,然后将数据表恢复到自建的db_test数据库中;2.在db_test数据库创建一视图 stu_info,查询全体学生的姓名,性别,课程名&…

【数据结构】 链表 + 手动实现单链表和双链表的接口(图文并茂附完整源码)

文章目录 一、 链表的概念及结构 二、链表的分类 ​编辑 三、手动实现单链表 1、定义单链表的一个节点 2、打印单链表 3、创建新节点 4、单链表的尾插 5、单链表的头插 6、单链表的尾删 7、单链表的头删 8、单链表的查找 9、在指定位置之前插入一个新节点 10、在指…

Go语言时间控制:定时器技术详细指南

1. 定时器基础:从 time.Sleep 到 time.Timer 的进化为什么 time.Sleep 不够好?在 Go 编程中,很多人初学时会用 time.Sleep 来实现时间控制。比如,想让程序暂停 2 秒,代码可能是这样:package mainimport (&q…

C# 转换(显式转换和强制转换)

显式转换和强制转换 如果要把短类型转换为长类型,让长类型保存短类型的所有位很简单。然而,在其他情况下, 目标类型也许无法在不损失数据的情况下容纳源值。 例如,假设我们希望把ushort值转化为byte。 ushort可以保存任何0~65535的…

浅谈自动化设计最常用的三款软件catia,eplan,autocad

笔者从上半年开始接触这三款软件,掌握了基础用法,但是过了一段时间不用,发现再次用,遇到的问题短时间解决不了,忘记的有点多,这里记录一下,防止下次忘记Elpan:问题1QF01是柜安装板上的一个部件&…

网络编程7.17

练习&#xff1a;服务器&#xff1a;#include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &…

c++ 模板元编程

听说模板元编程能在编译时计算出常量&#xff0c;简单测试下看看&#xff1a;template<int N> struct Summation {static constexpr int value N Summation<N - 1>::value; // 计算 1 2 ... N 的值 };template<> struct Summation<1> { // 递归终…