MCP server by lgx-lj
SVN MCP Server
基于 Spring AI 构建的 SVN(Subversion)MCP 工具服务器,以 stdio 模式运行,为 AI 客户端提供 SVN 版本管理能力。
技术栈
| 组件 | 版本 | |------|------| | JDK | 21 | | Spring Boot | 3.5.11 | | Spring AI | 1.1.2 | | SVN CLI | 1.14+ |
项目结构
svn-mcp-server/
├── pom.xml
├── README.md
└── src/
├── main/java/com/lgx/svnmcpserver/
│ ├── SvnMcpServerApplication.java # 启动类 + Bean 注册
│ └── mcp/
│ └── SvnTools.java # SVN 工具定义(7个工具)
└── resources/
├── application.yml # 应用配置
└── logback-spring.xml # 日志配置
前置条件
- JDK 21:必须使用 Java 21 及以上版本
- SVN CLI:需要
svn命令行工具,建议 1.14+ 版本 - Maven:确保
mvn命令可用
提示:可通过环境变量
SVN_HOME指定 svn 可执行文件所在目录,不配则自动使用PATH中的svn。
快速开始
1. 构建项目
mvn clean package -DskipTests
构建成功后,可执行 jar 位于 target/svn-mcp-server-1.0.0.jar。
2. 配置 MCP 客户端
jar 包无需手动启动——由 MCP 客户端(如 Claude Code)自动拉起并管理生命周期。
配置位置
以 Claude Code 为例,有两个位置可选:
| 位置 | 路径 | 生效范围 |
|------|------|----------|
| 全局配置 | C:\Users\<用户名>\.claude\settings.json | 所有项目 |
| 项目配置 | <项目根目录>\.claude\settings.json | 仅当前项目 |
在 settings.json 中新增 mcpServers 字段即可:
{
"mcpServers": {
"svn-tools": {
"command": "C:/Users/LiGuoXian/.jdks/ms-21.0.10/bin/java.exe",
"args": [
"-jar",
"D:/SoftwareCoding/workspace/LGX/svn-mcp-server/target/svn-mcp-server-1.0.0.jar"
],
"env": {
"JAVA_OPTS": "-Xmx256m",
"SVN_HOME": "D:/SoftwareCoding/SVN/Subversion-1.14.9-x64/bin"
}
}
}
}
配置项说明:
| 字段 | 说明 |
|------|------|
| command | JDK 21 java.exe 的绝对路径 |
| args | -jar 后跟 jar 包的绝对路径 |
| env.JAVA_OPTS | JVM 启动参数,此处限制最大堆内存为 256MB |
| env.SVN_HOME | svn 命令所在目录(可选),不配则用 PATH 中的 svn |
配置完成后重启客户端即可生效。
3. SVN 认证(重要)
MCP 服务器不需要配置账号密码——它直接调用系统本地的 svn 命令行工具,认证完全依赖 SVN 自身的凭据缓存。
AI 客户端 → MCP 协议 → SvnTools → svn 命令 → 读取本地缓存凭据
首次使用前,手动执行一次 svn 操作,让 SVN 缓存凭据:
# 方式一:checkout 一个仓库,会提示输入账号密码
svn checkout https://your-svn-server/svn/your-project D:/your-local-path
# 方式二:查看仓库信息,也会触发认证
svn info https://your-svn-server/svn/your-project
输入一次账号密码后,SVN 会自动缓存到 %APPDATA%\Subversion\auth(Windows),之后 MCP 调用 svn 命令就能自动使用这些凭据。
总结:只要本机
svn命令能正常工作(凭据已缓存),MCP 就能正常工作。凭据过期后,重新svn info <仓库URL>认证一次即可。
4. 验证连接
配置完成后,在 AI 客户端中询问类似问题即可验证:
- "帮我看看 D:/my-svn-project 的提交历史"
- "查看这个工作区的文件状态"
- "帮我更新一下工作区"
可用工具
SVN MCP 服务器对外暴露以下 7 个工具:
与 Git 命令对比
| 操作 | SVN(本工具) | Git |
|------|--------------|-----|
| 拉取最新代码 | svnUpdate | git pull |
| 查看改动 | svnDiff | git diff |
| 查看状态 | svnStatus | git status |
| 查看日志 | svnLog | git log |
| 行级追溯 | svnBlame | git blame |
| 仓库信息 | svnInfo | git remote -v + git log -1 |
| 目录浏览 | svnList | 无直接对应 |
注意:所有工具均为只读操作(svnUpdate 除外),不提供 commit、add、delete 等写操作。
1. svnLog——提交历史查询
查看 SVN 工作区的提交历史记录。
| 参数 | 类型 | 说明 |
|------|------|------|
| workingDir | String | 工作目录的绝对路径 |
| limit | int | 显示最近多少条记录,默认 20 |
2. svnDiff——差异对比
查看工作区文件与基准版本的差异,输出 unified diff 格式。
| 参数 | 类型 | 说明 |
|------|------|------|
| workingDir | String | 工作目录的绝对路径 |
| filePath | String | 要查看差异的文件(相对路径),不填则对比整个工作区 |
3. svnStatus——工作区状态
查看文件的变更状态。
| 状态码 | 含义 |
|--------|------|
| M | 已修改(Modified) |
| A | 新添加(Added) |
| D | 已删除(Deleted) |
| ? | 未纳入版本控制 |
| 参数 | 类型 | 说明 |
|------|------|------|
| workingDir | String | 工作目录的绝对路径 |
4. svnInfo——仓库信息
查看当前工作区或指定 URL 的 SVN 仓库信息(仓库 URL、当前版本号、最后修改者、最后修改时间)。
| 参数 | 类型 | 说明 |
|------|------|------|
| path | String | 工作目录路径或 SVN 仓库 URL |
5. svnUpdate——更新工作区
将工作区更新到最新版本。相当于 git pull,执行后本地文件直接变成最新版本。
| 参数 | 类型 | 说明 |
|------|------|------|
| workingDir | String | 工作目录的绝对路径 |
6. svnBlame——文件追溯
查看文件每一行的最后修改者和版本号,适合追查某段代码是谁在哪个版本写的。
| 参数 | 类型 | 说明 |
|------|------|------|
| workingDir | String | 工作目录的绝对路径 |
| filePath | String | 要追溯的文件路径(相对于工作目录) |
7. svnList——目录列表
列出 SVN 仓库中的目录和文件,不依赖本地工作副本,可直接传仓库 URL。
| 参数 | 类型 | 说明 |
|------|------|------|
| url | String | SVN 仓库 URL 或本地路径 |
| recursive | boolean | 是否递归列出,默认 false |
关键设计说明
- 日志写入 stderr:stdout 为 MCP 协议专用通道,日志输出到 stderr 和文件
svn-mcp-server.log。 - 无外部依赖:直接调用系统
svn命令行工具,不引入 SVNKit 等第三方库,减少依赖复杂度。 - 安全防护:校验路径中的
..防止目录穿越,校验;|&`等字符防止命令注入。 - 超时保护:每个 svn 命令最多执行 30 秒,超时自动终止进程,避免卡死 MCP 通道。
- 非交互模式:所有 svn 命令自动加
--non-interactive,避免交互式提示卡死进程。