当前位置: 首页 > news >正文

Claude Code SDK 配置Gitlab MCP服务

一、MCP配置前期准备

(一)创建个人令牌/群组令牌

我这里是创建个人令牌,去到首页左上角,点击头像——>偏好设置——>访问令牌——>添加新令牌

(二)配置mcp信息

去到魔塔社区,点击mcp广场,然后搜索gitlab,把刚刚生成的个人令牌粘贴进去

这里的url如果是你自己部署的话,就替换前面的域名即可,比如https://gitlab.com/api/v4就换成http://ip:端口/api/v4,配置完后就会生成对应的sse配置信息

二、Claude Code SDK 配置

这里有一个巨巨巨巨巨坑,正常我们在终端使用claude的时候,偶尔会弹出让你是否确认创建某个文件夹或者其他的操作等信息,如下:

这是cc的一个权限机制,在claude code的文档里面也有提到:

更详细的可以看这篇文章:Claude Code权限模式详解:Default、AcceptEdits、Plan、BypassPermissions四种模式 - 博客 - Hrefgo AI

(一)代码示例

import asyncio
import os
import tracebackfrom datetime import datetime, timedeltafrom claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
from claude_code_sdk.types import (ResultMessage, AssistantMessage, TextBlock,ToolUseBlock, ToolResultBlock
)
from claude_code_sdk._errors import CLIConnectionErroros.environ["ANTHROPIC_API_KEY"] = "你的api key"
os.environ["ANTHROPIC_BASE_URL"] = "https://api.moonshot.cn/anthropic"async def chat():"""Claude Code 聊天助手(每次请求独立客户端,避免流冲突)"""client = Noneresponses = []try:# 每次请求都创建新客户端(避免复用导致的流冲突)mcp_servers = {"mcp-gitlab-server": {"type": "sse","url": "你在魔塔生成的url"}}options = ClaudeCodeOptions(cwd=".",permission_mode="bypassPermissions",  # 绕过权限(!很重要,不然执行不了)mcp_servers=mcp_servers)client = ClaudeSDKClient(options=options)# 连接await client.connect()prompt = "使用mcp-gitlab-server这个mcp工具帮我在gitlab仓库中创建一个名为camel_test的项目"await client.query(prompt, session_id="123456")try:async for message in client.receive_messages():if isinstance(message, AssistantMessage):for block in message.content:if isinstance(block, TextBlock):responses.append({"role": "assistant","content": block.text.strip(),"type": "text"})print({"role": "assistant","content": block.text.strip(),"type": "text"})elif isinstance(block, ToolUseBlock):responses.append({"role": "assistant","content": f"使用工具: {block.name}","type": "tool","metadata": {"tool_name": block.name, "parameters": block.input}})print({"role": "assistant","content": f"使用工具: {block.name}","type": "tool","metadata": {"tool_name": block.name, "parameters": block.input}})elif isinstance(message, ToolResultBlock):status = "成功" if not message.is_error else "失败"responses.append({"role": "system","content": f"工具执行{status}: {message.content}","type": "tool_result","metadata": {"is_error": message.is_error, "tool_use_id": message.tool_use_id}})print({"role": "system","content": f"工具执行{status}: {message.content}","type": "tool_result","metadata": {"is_error": message.is_error, "tool_use_id": message.tool_use_id}})elif isinstance(message, ResultMessage):responses.append({"role": "system","content": "本轮响应结束","type": "result","metadata": {"input_tokens": message.usage.get("input_tokens"),"output_tokens": message.usage.get("output_tokens"),"cost_usd": message.total_cost_usd,"duration_ms": message.duration_ms}})print({"role": "system","content": "本轮响应结束","type": "result","metadata": {"input_tokens": message.usage.get("input_tokens"),"output_tokens": message.usage.get("output_tokens"),"cost_usd": message.total_cost_usd,"duration_ms": message.duration_ms}})break  # 结束接收except Exception as e:if "another coroutine is already waiting" in str(e):print("流读取冲突:可能客户端被复用或并发调用")raiseexcept CLIConnectionError:raise Exception("无法连接到 Claude 服务,请检查网络或 API 密钥配置")except Exception as e:print(f"聊天请求失败: {e}")traceback.print_exc()raise Exception(f"内部错误: {str(e)}")finally:# 确保关闭客户端if client:try:await client.disconnect()except:pass  # 忽略关闭时的异常return responsesif __name__ == "__main__":# 生产环境建议使用 gunicorn + uvicorn 部署start_time = datetime.now()asyncio.run(chat())print(f"总耗时: {(datetime.now() - start_time).total_seconds()} 秒")

(二)重要配置

options = ClaudeCodeOptions(cwd=".",permission_mode="bypassPermissions",  # 绕过权限(!很重要,不然执行不了)mcp_servers=mcp_servers)

(三)运行结果


文章转载自:

http://VzyuHjYH.jLktz.cn
http://ieaRgGGm.jLktz.cn
http://7oPKotNx.jLktz.cn
http://YOjskxeP.jLktz.cn
http://CPzpNNhy.jLktz.cn
http://rFmEKsBK.jLktz.cn
http://eQoOi6TK.jLktz.cn
http://DlG0uvWU.jLktz.cn
http://wkrDv4Uv.jLktz.cn
http://EIZoRA4t.jLktz.cn
http://MiL8k1hI.jLktz.cn
http://DmIop3kv.jLktz.cn
http://DvNs3nSN.jLktz.cn
http://R2zy7u6S.jLktz.cn
http://AZPmtTPZ.jLktz.cn
http://lMJAlgsT.jLktz.cn
http://Ai6gVtN7.jLktz.cn
http://kNAf6OOe.jLktz.cn
http://akY7rSt1.jLktz.cn
http://Ia2Ho9gw.jLktz.cn
http://VzkFIynR.jLktz.cn
http://TepI27Ab.jLktz.cn
http://xf0MGhJU.jLktz.cn
http://AzEcsP8X.jLktz.cn
http://O56VNP3v.jLktz.cn
http://rXNmRc1i.jLktz.cn
http://vfQi0jDv.jLktz.cn
http://LuzwKM1w.jLktz.cn
http://L7gxNZaH.jLktz.cn
http://XDvvyWNj.jLktz.cn
http://www.dtcms.com/a/363104.html

相关文章:

  • 《多模态与 AIGC:最火的 AI 应用方向》
  • 线扫相机搭配显微镜:解锁微观世界的 “全景高清” 观察模式
  • [光学原理与应用-366]:ZEMAX - 用成像原理说明人眼为什么能看清物体?
  • Java面试实战系列【JVM篇】- JVM内存结构与运行时数据区详解(共享区域)
  • Java 垃圾回收机制(GC算法、GC收集器如G1、CMS)的必会知识点汇总
  • 企业级架构师综合能力项目案例二(项目性能优化方案JVM+数据库+缓存+代码JUC+消息中间件架构+服务熔断降级)
  • 【实时Linux实战系列】实时运动检测与分析系统
  • 鸿蒙NEXT界面交互全解析:弹出框、菜单、气泡提示与模态页面的实战指南
  • 基于FPGA+DSP数据采集平台DMA应用学习
  • 面经分享一:分布式环境下的事务难题:理论边界、实现路径与选型逻辑
  • 破解数字孪生落地难题的三大法宝:动态映射、模块架构与闭环验证
  • Java全栈SASS程序-设计多租户空间隔离架构
  • Cortex-M0 M3 M4的乘法与除法指令对比
  • Ceph PG scrub 流程
  • 图解设计模式
  • AbMole小课堂丨Trastuzumab:靶向 HER2 的多维作用机制及科研应用详解
  • 移动端富文本markdown中表格滚动与页面滚动的冲突处理:Touch 事件 + 鼠标滚轮精确控制方案
  • 亚信安全亮相鸿蒙生态大会2025 携手鸿蒙生态绘就万物智联新蓝图
  • 技术架构设计--资源与链接、安全灾备
  • 铝基板自动矫平机·再探:从“辊缝”到“微观”的幕后故事
  • SwinIR:基于 Swin Transformer 的图像复原新范式(附视频讲解)
  • 【C++】14. 多态
  • C++ 面试考点 类成员函数的调用时机
  • 服务器的监控和管理手段有哪些?
  • Zephyr如何注册设备实例
  • Android14 init.rc各个阶段的主要操作详解2
  • 【Qt】bug排查笔记——QMetaObject::invokeMethod: No such method
  • 面试_Mysql
  • AdaBoost(Adaptive Boosting,自适应提升算法)总结梳理
  • 04 创建Centos 7操作系统