
1. 项目概述一个为开发者打造的Gitee MCP服务器如果你是一名开发者日常工作中频繁地与代码仓库打交道尤其是国内的Gitee平台那么你很可能已经厌倦了在浏览器、IDE和命令行之间来回切换的繁琐操作。想象一下当你正在IDE里专注地编写一个功能模块突然需要查看某个PR的评论或者想快速创建一个新的Issue来记录一个临时的想法你不得不中断当前的思维流打开浏览器登录Gitee找到对应的仓库……这个过程不仅打断了你的“心流”也降低了工作效率。normal-coder/gitee-mcp-server这个项目就是为了解决这个痛点而生的。它是一个实现了MCPModel Context Protocol协议的服务器专门用于连接你的本地开发环境与Gitee代码托管平台。简单来说它就像在你的电脑和Gitee之间架起了一座专属的、可编程的桥梁。通过这座桥你的AI助手例如Claude Desktop、Cursor等支持MCP的AI工具可以直接“理解”并操作你的Gitee仓库而无需你手动进行网页操作。这个项目的核心价值在于“将平台能力工具化、将工具能力智能化”。它把Gitee的API如仓库管理、Issue追踪、PR审查封装成一套标准化的工具暴露给AI。这意味着你可以用自然语言向你的AI伙伴下达指令比如“帮我在my-project仓库下创建一个标题为‘修复登录页样式错位’的Issue内容描述是……”AI就能通过这个MCP服务器自动调用Gitee的API来完成操作并将结果反馈给你。整个过程无缝衔接让你能更专注于核心的代码逻辑。它适合所有使用Gitee进行代码托管的开发者无论是个人项目维护者还是团队协作中的一员。特别是对于那些已经习惯使用AI辅助编程并希望将代码仓库管理也纳入自动化工作流的效率追求者来说这个项目是一个极具潜力的基础设施组件。2. 核心架构与MCP协议深度解析要理解gitee-mcp-server的精妙之处我们必须先拆解其两大基石项目自身的架构设计以及它所依赖的MCP协议。2.1 MCP协议AI与工具对话的“世界语”MCP即模型上下文协议是由Anthropic公司提出的一种开放标准。你可以把它想象成AI世界里的“USB协议”或“蓝牙协议”。在没有MCP之前每个AI应用如Claude、Cursor想要连接外部工具如数据库、代码仓库、天气API都需要开发者为每个“AI-工具”组合编写特定的、硬编码的集成代码这无疑是重复且低效的。MCP的出现定义了一套标准的“对话”方式服务器Server 即gitee-mcp-server这类项目。它封装了特定领域这里是Gitee的所有能力并以MCP规定的JSON格式对外宣告自己“能做什么”即提供哪些工具和“有什么资源”如可访问的仓库列表。客户端Client 通常是AI应用本身如Claude Desktop。它负责与MCP服务器建立连接获取工具列表并在用户与AI对话的合适时机决定调用哪个工具。协议通信 双方通过标准化的JSON-RPC over STDIO标准输入输出或HTTP进行通信。服务器告诉客户端“我有这些工具Tools和资源Resources。” 客户端在需要时请求“请用工具A执行操作B参数是C。”对于开发者而言MCP的魅力在于“一次实现多处使用”。你只需要按照MCP的规范实现一个Gitee服务器那么所有支持MCP协议的AI客户端就都能立即获得操作Gitee的能力无需每个客户端都单独去集成Gitee API。2.2 gitee-mcp-server 的模块化设计基于MCP协议gitee-mcp-server采用了清晰的分层设计确保代码的可维护性和可扩展性。核心层Core Layer 这一层是项目的心脏主要负责与MCP协议本身的对接。它包含协议适配器 处理所有进出的JSON-RPC消息负责序列化与反序列化确保通信符合MCP规范。工具与资源注册中心 一个核心的注册表。所有具体的Gitee操作功能如create_issue,list_pull_requests都会在这里注册为一个“工具”Tool所有可查询的静态或动态数据如gitee_repository注册为“资源”Resource。当客户端连接时服务器会将这个注册表的内容发送过去。业务逻辑层Business Logic Layer 这一层是项目的大脑封装了所有与Gitee平台交互的具体业务逻辑。它被组织成多个独立的“工具模块”仓库管理模块 实现get_repo_info获取仓库信息、list_branches列出分支等工具。Issue管理模块 实现create_issue、list_issues、update_issue等工具。Pull Request管理模块 实现create_pull_request、list_pull_requests、merge_pull_request等工具。其他模块 还可以扩展代码片段管理、Webhook管理等模块。 每个模块内部会调用下一层Gitee SDK层提供的方法并处理业务级的错误和数据的格式化以生成对AI友好、易于理解的返回结果。Gitee SDK/API层API Layer 这是项目的手脚直接与Gitee官方API交互。项目通常会使用Gitee官方提供的SDK如gitee-api或直接使用requests库封装HTTP请求。这一层负责处理网络通信、认证Access Token、API速率限制、以及将Gitee返回的原始JSON数据转换为内部可用的数据结构。配置与认证层Config Auth Layer 这是项目的通行证。所有对Gitee API的调用都需要认证。这一层管理着Access Token的获取与安全存储 引导用户如何在Gitee上创建具有适当权限如repo,issues,pull_requests等的私人令牌Personal Access Token。配置文件管理 如何通过环境变量如GITEE_ACCESS_TOKEN或配置文件来设置Token和目标仓库等信息避免将敏感信息硬编码在代码中。实操心得模块化的优势这种分层模块化设计使得增加一个新功能变得非常清晰。例如如果你想添加“管理仓库Webhook”的功能你只需要1. 在Gitee SDK层添加调用创建WebhookAPI的方法2. 在业务逻辑层创建一个新的webhook_tool.py模块实现create_webhook工具函数3. 最后在核心层的注册中心注册这个新工具即可。其他现有代码几乎无需改动极大地降低了维护成本和出错概率。3. 从零开始环境配置与服务器部署实操理解了架构我们动手将它运行起来。这里我将以最常见的本地开发场景为例带你完成从环境准备到服务器启动的全过程。3.1 前期准备获取Gitee访问凭证这是最关键的一步没有有效的Token服务器只是一个空壳。登录Gitee 打开 gitee.com 登录你的账号。进入设置 点击右上角头像选择“设置”。创建私人令牌在左侧菜单找到“安全设置”下的“私人令牌”。点击“生成新令牌”。填写令牌描述例如“Local MCP Server”。勾选权限范围 这是最容易出错的地方。根据你希望MCP服务器能做的事情至少需要勾选projects(仓库访问权限)pull_requests(Pull Request读写权限)issues(Issue读写权限)如果你还需要管理仓库成员、Webhook等请勾选对应权限。原则是按需分配最小权限。不要图省事直接勾选所有权限。点击“提交”系统会生成一串以gitee_开头的字符串。请立即复制并妥善保存因为它只显示一次丢失后只能重新生成。3.2 项目获取与依赖安装假设你使用Python环境这是实现MCP服务器的常见语言选择。# 1. 克隆项目代码请替换为实际仓库地址 git clone https://gitee.com/normal-coder/gitee-mcp-server.git cd gitee-mcp-server # 2. 创建并激活虚拟环境推荐避免污染全局环境 python -m venv .venv # Windows .venv\Scripts\activate # Linux/macOS source .venv/bin/activate # 3. 安装项目依赖 # 通常项目根目录会有一个 requirements.txt 文件 pip install -r requirements.txt # 如果项目使用 poetry 或 pdm请参照其对应命令典型的requirements.txt会包含以下核心依赖mcp 官方的MCP协议Python SDK这是基础。gitee或requests 用于调用Gitee API。pydantic 用于数据验证和设置管理。click或typer 用于构建命令行接口。3.3 配置与启动服务器安装好依赖后我们需要配置Token并启动服务器。方式一通过环境变量配置推荐更安全在启动服务器的终端中设置环境变量# Linux/macOS export GITEE_ACCESS_TOKEN你的gitee_xxxx令牌 export GITEE_OWNER你的Gitee用户名 export GITEE_REPO你的仓库名可选部分工具可能需要 # Windows (PowerShell) $env:GITEE_ACCESS_TOKEN你的gitee_xxxx令牌 $env:GITEE_OWNER你的Gitee用户名然后运行项目的主启动脚本python src/main.py # 或者根据项目说明可能是 python -m gitee_mcp_server方式二通过配置文件有些项目会支持config.yaml或.env文件。你需要在项目根目录创建对应的文件并填入配置# config.yaml 示例 gitee: access_token: “你的gitee_xxxx令牌” owner: “你的Gitee用户名”然后启动时指定配置文件路径。验证服务器是否运行成功启动后服务器通常会监听在某个端口如8080或通过stdio等待连接。控制台输出类似“Gitee MCP Server started on stdio”或“Listening on port 8080”的信息即表示启动成功。此时服务器正在等待MCP客户端如Claude Desktop的连接。注意事项Token的安全管理绝不提交 确保.env、config.yaml或任何包含Token的文件被添加到.gitignore中绝对不要提交到版本库。环境变量优先 在生产环境或CI/CD流程中使用环境变量注入Token是最佳实践。定期轮换 像对待密码一样对待你的Access Token定期如每3-6个月更新一次并在Gitee设置中删除旧的、不再使用的令牌。4. 与AI客户端集成以Claude Desktop为例服务器跑起来了但它需要和一个“大脑”AI客户端配合才能发挥作用。这里以目前对MCP支持最友好的Claude Desktop为例展示如何连接。4.1 配置Claude DesktopClaude Desktop允许通过编辑配置文件来添加自定义的MCP服务器。找到配置文件macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.json如果文件或目录不存在可以手动创建。编辑配置文件 打开或创建claude_desktop_config.json文件添加你的gitee-mcp-server配置。配置方式取决于服务器启动模式模式AStdio模式最常用如果你的服务器是通过命令行启动并监听标准输入输出的配置如下{ mcpServers: { gitee: { command: /path/to/your/python, args: [ /full/path/to/gitee-mcp-server/src/main.py ], env: { GITEE_ACCESS_TOKEN: 你的gitee_xxxx令牌, GITEE_OWNER: 你的用户名 } } } }command: 你的Python解释器路径。可以使用which pythonmacOS/Linux或where pythonWindows在虚拟环境激活状态下查询。args: 启动服务器的主Python脚本的绝对路径。env: 在这里直接传递环境变量这是将Token传递给服务器的安全方式。模式BHTTP模式如果你的服务器启动了一个HTTP服务如http://localhost:8080配置会更简单{ mcpServers: { gitee: { url: http://localhost:8080 } } }但需要注意HTTP模式可能涉及跨域或认证问题实现起来比Stdio模式复杂。重启Claude Desktop 保存配置文件后完全退出并重新启动Claude Desktop应用。4.2 验证连接与初步使用重启后Claude Desktop会在启动时自动加载并连接你配置的MCP服务器。查看连接状态 在Claude Desktop中新建一个对话如果你在输入框附近看到一个新的图标可能是一个小工具或齿轮图标点击它如果能看到“Gitee”相关的工具列表说明连接成功。进行第一次对话 你可以尝试输入“帮我查看一下我[你的用户名]/[你的仓库名]这个仓库里所有打开的Issue。” Claude应该会理解你的意图并在后台调用MCP服务器的list_issues工具然后将Gitee返回的结果整理成清晰的列表呈现给你。尝试创建操作 输入“在[你的用户名]/[你的仓库名]仓库创建一个新的Issue标题是‘文档补充MCP集成步骤’内容描述是‘需要详细记录Claude Desktop的配置过程’标签加上‘documentation’和‘enhancement’。” 如果配置正确Claude会调用create_issue工具并在操作成功后给你一个指向新创建Issue的链接。实操心得配置调试最常见的失败原因是路径或环境变量错误。如果连接失败首先检查Claude Desktop的日志通常可以在应用菜单中找到“查看日志”选项。日志会明确显示启动服务器命令时出现的错误比如“python command not found”或“ModuleNotFoundError”。根据错误信息修正command路径、args中的脚本路径或确保env中的变量名与服务器代码读取的变量名完全一致。一个技巧是先在终端手动用配置中的命令和参数启动服务器确保它能独立运行成功再将其配置到Claude中。5. 核心工具详解与高级使用场景连接成功后我们来深入看看gitee-mcp-server具体能通过AI做哪些事情。这些能力都体现在一个个具体的“工具”上。5.1 仓库与代码管理工具这些工具让AI能帮你“看清”仓库的全貌。get_repository_info: 获取仓库的详细信息包括描述、星标数、分支数、更新时间等。你可以问“我的XXX仓库最近有更新吗”list_branches: 列出仓库的所有分支。这对于在合并PR前了解分支状态很有用。get_file_content: 获取仓库中特定文件的原始内容。例如“帮我看一下src/utils/logger.py这个文件里是怎么实现错误处理的。” AI可以读取文件内容并为你分析。search_code: 在仓库内搜索代码。虽然Gitee网页版也有搜索但通过AI你可以用更自然的方式“在我的项目里找找所有用到redis客户端的地方。”5.2 Issue与项目管理工具这是提升协作效率的核心。create_issue: 如前所述快速创建任务、Bug报告或功能提议。你可以口述一个复杂的Bug现象让AI帮你组织成结构清晰的Issue。list_issues: 按状态开放/关闭、标签、创建者等过滤查看Issue。例如“列出所有打有bug标签且未解决的Issue。”update_issue: 更新Issue的状态、标题、描述或标签。你可以说“把第45号Issue的状态改成‘已完成’并加上‘fixed’标签。”create_issue_comment: 在Issue下添加评论。在代码评审时你可以让AI帮你把一段分析文字发表到对应的PR Issue下。5.3 Pull Request管理工具让代码审查流程更顺畅。create_pull_request: 基于两个分支创建PR。你只需要告诉AI“我想把feature/auth分支合并到main分支PR标题是‘用户认证模块’描述是……”。list_pull_requests: 查看所有PR列表及其状态合并、开放、关闭。get_pull_request_details: 获取某个PR的详细信息包括文件改动、评论、审查状态。merge_pull_request: 合并一个PR。在通过其他工具完成代码审查后你可以指令AI执行合并操作。5.4 高级场景组合使用与工作流自动化真正的威力在于将这些工具组合起来形成自动化工作流。场景一每日站会助手你可以让AI在每天早晨自动执行一个查询“列出我名下所有仓库中指派给我且状态为‘进行中’的Issue并按仓库分组。” AI会调用list_issues工具可能需要遍历你的多个仓库整理出一份简洁的报告让你快速了解当天的工作重点。场景二发布准备检查在准备发布新版本时你可以让AI帮你做检查“检查next-release分支相比main分支有哪些未合并的PR同时看看有没有标记为blocker的开放Issue” AI需要组合调用list_pull_requests、get_pull_request_details和list_issues等多个工具为你生成一份发布风险评估报告。场景三智能代码片段管理虽然基础工具可能不直接包含但你可以扩展服务器添加管理Gitee“代码片段”Gist的工具。然后你就可以说“把我刚才写的这个JSON解析函数保存到我的代码片段里命名为‘python_json_utils’设置为公开。” 这对于知识积累和团队分享非常有用。注意事项AI的“理解”与“执行”边界必须清醒认识到AI客户端负责理解你的意图并将其转化为工具调用请求而MCP服务器负责安全、准确地执行具体的API操作。AI并不知道你的Token也无法绕过服务器定义的权限。因此权限控制的关键在服务器配置的Token上。同时AI可能会误解你模糊的指令例如当你说“把最新的PR合并了”AI需要判断“最新”是指创建时间还是更新时间以及目标分支是什么。在关键操作前最好让AI先确认执行计划例如“你将要合并PR #123从feature/x到main确认吗”或者先从查询类操作开始逐步建立信任。6. 开发与扩展指南打造你自己的MCP工具如果你觉得现有的工具不够用或者想为内部平台打造类似的MCP集成那么参与到gitee-mcp-server的开发或基于其模式进行扩展会是一个很好的学习过程。6.1 项目结构导航一个典型的MCP服务器项目结构如下gitee-mcp-server/ ├── src/ │ ├── __init__.py │ ├── main.py # 程序入口初始化MCP服务器并注册工具 │ ├── server.py # MCP服务器核心类继承自mcp.Server │ ├── tools/ # 工具模块目录 │ │ ├── __init__.py │ │ ├── repo_tools.py # 仓库管理工具 │ │ ├── issue_tools.py # Issue管理工具 │ │ └── pr_tools.py # PR管理工具 │ ├── resources/ # 资源定义目录可选 │ ├── models.py # Pydantic数据模型用于请求/响应验证 │ └── config.py # 配置加载逻辑 ├── requirements.txt ├── pyproject.toml └── README.md6.2 添加一个新工具以“删除Issue评论”为例假设我们现在想添加一个delete_issue_comment工具。第一步在Gitee SDK层确认API支持首先查阅Gitee API文档确认存在删除评论的端点例如DELETE /repos/{owner}/{repo}/issues/comments/{id}并在项目内对应的API客户端可能在src/gitee_client.py中添加一个方法# src/gitee_client.py async def delete_issue_comment(self, owner: str, repo: str, comment_id: int) - bool: url fhttps://gitee.com/api/v5/repos/{owner}/{repo}/issues/comments/{comment_id} async with self.session.delete(url, headersself.headers) as resp: return resp.status 204第二步在业务逻辑层实现工具函数在src/tools/目录下找到或创建issue_tools.py添加新的工具函数# src/tools/issue_tools.py from mcp.types import Tool async def delete_issue_comment( owner: str, repo: str, comment_id: int ) - str: 删除指定Issue评论。 Args: owner: 仓库所有者 repo: 仓库名称 comment_id: 要删除的评论ID try: success await gitee_client.delete_issue_comment(owner, repo, comment_id) if success: return f评论(ID: {comment_id}) 删除成功。 else: return f删除评论(ID: {comment_id}) 失败请检查ID是否正确或权限是否足够。 except Exception as e: return f删除评论时发生错误{str(e)} # 将函数封装成MCP工具对象 delete_issue_comment_tool Tool( namedelete_issue_comment, description删除一个指定的Issue评论。需要评论的ID。, inputSchema{ type: object, properties: { owner: {type: string, description: 仓库所有者用户名}, repo: {type: string, description: 仓库名称}, comment_id: {type: integer, description: 要删除的评论ID} }, required: [owner, repo, comment_id] } )注意Tool对象中的inputSchema非常重要它定义了AI在调用此工具时需要提供哪些参数以及参数的格式。这相当于一份给AI的“工具说明书”。第三步在核心层注册工具在服务器初始化文件通常是src/main.py或src/server.py中找到工具注册的地方将新工具添加进去# src/main.py from src.tools.issue_tools import delete_issue_comment, delete_issue_comment_tool async def main(): server mcp.Server(gitee-mcp-server) # 注册工具 server.list_tools() async def handle_list_tools(): return [ # ... 其他已注册的工具 delete_issue_comment_tool ] # 处理工具调用 server.call_tool() async def handle_call_tool(name: str, arguments: dict): if name delete_issue_comment: result await delete_issue_comment( ownerarguments[owner], repoarguments[repo], comment_idarguments[comment_id] ) return [mcp.TextContent(typetext, textresult)] # ... 处理其他工具第四步测试重启你的MCP服务器。在Claude Desktop中通过工具列表查看是否出现了新的“delete_issue_comment”工具。尝试让AI调用它“删除我myrepo仓库下ID为12345的Issue评论。”你需要一个真实的评论ID进行测试。6.3 错误处理与日志优化一个健壮的生产级MCP服务器必须有良好的错误处理和日志记录。精细化错误处理 在工具函数中不要只捕获最顶层的Exception。应该区分网络错误如aiohttp.ClientError、Gitee API返回的业务错误如404 Not Found, 403 Forbidden和参数验证错误。针对不同的错误类型返回给AI最终用户的信息应该清晰、可操作。例如“仓库不存在”、“权限不足无法删除评论”、“评论ID格式错误”。结构化日志 使用logging模块为不同级别INFO, WARNING, ERROR的事件记录日志。在日志中记录工具调用的开始和结束、使用的参数注意过滤敏感信息如Token、Gitee API的响应状态码和耗时。这对于后期监控和调试至关重要。给AI清晰的反馈 MCP服务器返回给客户端的错误信息应该是完整的句子能被AI理解并转述给用户。避免直接抛出一大段Python异常栈。7. 常见问题排查与性能调优在实际使用和开发过程中你可能会遇到一些问题。这里汇总了一些典型场景及其解决方案。7.1 连接与配置问题问题现象可能原因排查步骤与解决方案Claude Desktop 中看不到Gitee工具1. 配置文件路径或格式错误。2. 服务器启动失败。3. Claude未读取新配置。1. 检查claude_desktop_config.json的JSON语法可用在线校验工具。2. 在终端手动运行配置中的command和args看服务器能否独立启动并输出日志。3. 彻底重启Claude Desktop。服务器启动报错ModuleNotFoundErrorPython依赖未安装或虚拟环境未激活。1. 确认终端已进入项目目录并激活了虚拟环境.venv。2. 运行pip install -r requirements.txt重新安装依赖。工具调用返回“认证失败”Gitee Access Token无效或权限不足。1. 在Gitee“私人令牌”页面确认令牌状态为“已启用”。2. 检查令牌权限是否包含了你要执行操作所需的范围如写Issue需要issues权限。3. 确认环境变量或配置文件中Token值正确无多余空格。AI调用工具时参数错误工具函数的inputSchema定义与实现不匹配。1. 检查工具定义中的required字段和properties类型是否与函数参数一致。2. 查看服务器日志确认AI发送的参数是什么与函数期望的是否一致。7.2 性能与稳定性优化当工具变多、使用频繁后性能问题会浮现。使用异步Async 确保整个服务器栈是异步的从MCP库到HTTP客户端如aiohttp。这能保证在等待Gitee API网络响应时服务器可以处理其他请求或工具调用大幅提升并发能力。如果你的工具函数是CPU密集型的例如处理大型代码差异考虑将其放入线程池执行避免阻塞事件循环。实现请求缓存 对于一些不常变化且频繁查询的数据如仓库信息、用户信息可以在内存中实现一个简单的TTL生存时间缓存。例如使用cachetools库的TTLCache。这能显著减少对Gitee API的调用减轻服务器负担并提升响应速度。注意对于写操作或实时性要求高的数据如最新的Issue评论不要缓存。处理API速率限制 Gitee API有调用频率限制。在代码中你需要识别API返回的速率限制错误通常是HTTP 429状态码并实现重试机制例如使用指数退避算法。可以在HTTP客户端层统一添加此逻辑。连接池与超时设置 为你的HTTP客户端配置连接池和合理的超时时间连接超时、读取超时。这能防止因为网络波动导致单个请求长时间挂起进而耗尽服务器资源。7.3 安全加固建议Token最小权限原则 再次强调只为MCP服务器创建所需最小权限的Token。如果它只需要读Issue就不要给它写权限。输入验证与净化 对所有从AI客户端传入的参数进行严格的验证和净化。例如owner和repo参数是否只包含允许的字符comment_id是否为正整数防止注入攻击。限制可操作仓库范围 可以在服务器配置中增加一个ALLOWED_REPOS列表只允许操作指定的仓库即使Token有更广的权限。这为安全增加了一层护栏。审计日志 记录所有工具调用的详细审计日志包括调用时间、工具名、参数脱敏后、调用结果和请求来源如果可能。这对于事后追溯和问题分析非常重要。开发这样一个MCP服务器最深的体会是它不仅仅是一个工具更是一种思维模式的转变。它将原本需要手动点击、肉眼查找的碎片化操作变成了可编程、可组合的原子能力。最大的挑战不在于实现某个具体的API调用而在于如何设计出“AI友好”的工具接口——即inputSchema的描述是否足够清晰、准确能让AI在正确的时机、以正确的参数调用它。同时错误处理的鲁棒性直接决定了用户体验的好坏一个含糊的错误信息会让AI和用户都感到困惑。从简单的查询开始逐步扩展到写操作并在这个过程中不断完善错误反馈和日志是构建一个可靠MCP服务的最佳路径。