Token导航 LogoToken导航

MCP Server · 开发工具

msr MCP

一个分析Git历史记录并提供多种代码库分析工具的服务,适用于AI客户端直接调用。

未说明官方级别未说明来源级核验工具 13
JavaClaude开发工具Claude DesktopCursor

快速开始

公开资料没有提供安装命令,按仓库或官方文档接入。
作者 / 组织
mfietz
提供方
mfietz

工具数量

13

来源目录标注

资源数量

0

来源目录标注

提示词数量

0

来源目录标注

GitHub Star

0

仓库热度

收录来源

1 个

MCP World

选型结论

msr MCP 属于开发工具类 MCP Server,公开资料标注 13 个工具,通过传输方式未标注接入,适配 Claude Desktop、Claude、Cursor,没有现成的安装命令;接入前先确认权限范围。

分类

开发工具

传输方式

未说明

认证方式

无需认证

部署方式

公开资料未说明

安装与配置

公开目录没有给出安装命令,需要按仓库 README安装;下面按同类条目的通用流程说明。

公开命令不是通用的启动方式,拼不出可靠配置示例;请在客户端 MCP 配置里按官方文档填写 command 和 args。

上手步骤

  1. 1

    先确认运行方式

    公开资料没有标注传输方式,先看仓库 README,确认是本地进程还是远程地址。

  2. 2

    获取服务

    公开目录没有给出安装命令,按仓库 README里的步骤安装或获取服务。

  3. 3

    写入客户端配置

    在客户端的 MCP 配置里填启动命令和参数,保存后完全退出客户端再打开,让新配置生效。

  4. 4

    验证是否可用

    连接成功后客户端会列出 13 个工具,随便调一个只读工具确认能返回结果。

接入前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

公开资料仍需确认:安装命令

详细介绍

msr-mcp——挖掘软件库mcp服务器

分析您的git历史记录,并向任何兼容MCP的AI客户端公开MCP工具 (Claude Desktop、Cursor等)可以直接在存储库内调用。

______________________________________________________________________

工具

工具它做什么
get_summary回购概述:提交次数、日期范围、更改最多的文件
get_hotspots按更改频率×复杂度排名的顶级文件(支持路径/扩展名过滤器)
get_temporal_coupling最常一起更改的文件对
get_file_coupling特定文件的耦合伙伴
get_coupling_clusters经常一起更改的文件组(共同更改集群)
get_file_commit_history使用JIRA段塞提取和过滤器提交一个文件的历史记录
get_file_authors按特定文件的提交次数排名的作者(知识所有者)
get_bus_factor一个作者主导提交的文件(知识孤岛)
get_ownership按提交次数或行数显示每个文件的主要作者
get_churn按添加和删除的总行数排名的顶级文件
get_stale_filesN天内未更改的文件,按复杂性加权
get_index_status当前索引状态(在仍在构建索引时有用)
refresh_index重建完整 .msr/ 从头开始索引

只有 默认分支 (main → master → HEAD)被索引。

语言支持

完整的指标(变化频率、LOC、圈复杂度和认知复杂度)可用于 Java 只有PMD驱动复杂性分析。PMD 7的Kotlin支持尚未公开度量API,因此Kotlin仅获得LOC。所有其他基于文本的语言(TypeScript、Go、Python等)也会获得更改频率和LOC;完全跳过二进制文件。

______________________________________________________________________

先决条件

  • Java 25+ PATH
  • Jbang (适用于零结账使用)

______________________________________________________________________

用法

选项A-Claude CLI(claude mcp add)

在Claude Code中注册msr-mcp的最快方法。

来自最新的GitHub版本 (推荐):

# Download the JAR once
curl -L https://github.com/mfietz/msr-mcp/releases/latest/download/msr-mcp-server.jar \
     -o ~/bin/msr-mcp-server.jar

# Register for all your projects (user scope)
claude mcp add --scope user msr-mcp -- java -jar ~/bin/msr-mcp-server.jar

来自当地建筑:

claude mcp add --scope user msr-mcp -- java -jar /path/to/msr-mcp/target/msr-mcp-server.jar

服务器继承了Claude Code的工作目录,这是您运行时的repo根目录 claude 在git存储库中。使用 --scope project 相反,将配置检查到仓库中 .mcp.json (注意:JAR路径将是特定于机器的)。

______________________________________________________________________

选项B--JBang(无需结账)

jbang msr-mcp@mfietz/msr-mcp

选项C——从源代码构建

git clone https://github.com/mfietz/msr-mcp.git
cd msr-mcp
mvn package -DskipTests
# JAR: target/msr-mcp-server.jar

其他MCP客户端(克劳德桌面、光标等)

添加到客户端的MCP配置中,指向 workingDirectory 在您的git仓库中:

{
  "mcpServers": {
    "msr-mcp": {
      "command": "java",
      "args": ["-jar", "/path/to/msr-mcp-server.jar"],
      "workingDirectory": "/path/to/your/git/repo"
    }
  }
}

对于JBang,请更换 "command": "java" / "args": ["-jar", "..."] 随着 "command": "jbang" / "args": ["msr-mcp@mfietz/msr-mcp"].

______________________________________________________________________

索引存储

首次启动时,服务器会创建 .msr/ repo根目录中的目录:

.msr/
└── msr.db        # SQLite database (WAL mode)

添加 .msr/ 到 .gitignore (它已经在这个回购中了 .gitignore).

索引已更新 每次启动时递增 --只处理比上次索引提示更新的提交。呼叫 refresh_index 从零开始强制进行全面重建。

重命名的文件会被跟踪:重命名前的历史记录会被结转至新路径。已删除的文件将从复杂性度量表中删除,因此它们不再出现在热点或流失结果中。

______________________________________________________________________

工具参考

get_summary

没有争论。返回回购概述:

{
  "totalCommits": 312,
  "uniqueAuthors": 8,
  "totalFilesTracked": 94,
  "filesWithMetrics": 42,
  "earliestCommitMs": 1704067200000,
  "latestCommitMs": 1741046400000,
  "topChangedFiles": [
    { "filePath": "src/main/java/com/example/Foo.java", "changeFrequency": 47 }
  ],
  "topAuthors": [
    { "name": "Alice", "email": "alice@example.com", "commits": 120 }
  ],
  "languageDistribution": [
    { "extension": ".java", "fileCount": 72 },
    { "extension": ".xml",  "fileCount": 12 }
  ]
}

get_hotspots

topN          int     Max results (default 20)
sinceEpochMs  long    Only include commits after this timestamp (ms)
extension     string  File extension filter, e.g. ".java". Default: all files
pathFilter    string  SQL LIKE path pattern, e.g. "src/service/%". Default: all paths

返回一个按以下方式排序的JSON数组 hotspotScore 下降:

[
  {
    "path": "src/main/java/com/example/Foo.java",
    "changeFrequency": 47,
    "linesOfCode": 312,
    "cyclomaticComplexity": 18,
    "cognitiveComplexity": 24,
    "hotspotScore": 0.93
  }
]

get_temporal_coupling

topN          int     Max results (default 20)
minCoupling   double  Min coupling ratio 0–1 (default 0.3)
fileFilter    string  SQL LIKE pattern, e.g. "%.java"
sinceEpochMs  long    Time window; triggers slower dynamic query when set

没有 sinceEpochMs 快速预聚合 file_coupling 桌子被使用了。 随着 sinceEpochMs 基于CTE的查询直接在 file_changes (速度较慢)。

get_file_coupling

filePath      string  (required) Repo-relative path, e.g. "src/Main.java"
topN          int     Max partner files (default 10)
minCoupling   double  Min coupling ratio 0–1 (default 0.1)
sinceEpochMs  long    Time window; triggers slower dynamic query when set

没有 sinceEpochMs 快速预聚合 file_coupling 桌子被使用了。 随着 sinceEpochMs 基于CTE的查询直接在 file_changes (速度较慢)。

返回与给定文件一起更改最频繁的文件:

[
  {
    "partnerPath": "src/service/OrderService.java",
    "coChanges": 12,
    "targetTotalChanges": 15,
    "partnerTotalChanges": 13,
    "couplingRatio": 0.92
  }
]

get_coupling_clusters

使用双向耦合标识经常一起更改的文件组 (co_changes / MAX(total_a, total_b))排除与所有内容共同更改的中心文件。

两种模式:

  • 全局扫描 (没有 filePath):联合查找所有边≥ minCoupling,返回按平均耦合排序的所有簇。
  • 单文件查找 (filePath set):递归图遍历只返回包含该文件的集群——对于目标查询来说要快得多。
filePath        string  If set: return the cluster for this file. If absent: return all clusters.
minCoupling     double  Min bidirectional coupling ratio 0–1 (default 0.3)
minClusterSize  int     Min files per cluster (default 3, global mode only)
maxClusterSize  int     Max files per cluster; excludes god-clusters (no default)
pathFilter      string  SQL LIKE pattern; keeps clusters where ≥1 file matches, e.g. "src/auth/%"
topN            int     Max clusters to return (default 20, global mode only)
sinceEpochMs    long    Time window; triggers dynamic query when set
[
  {
    "clusterIndex": 1,
    "files": ["src/auth/AuthFilter.java", "src/auth/LoginService.java", "src/auth/TokenStore.java"],
    "edges": [
      { "fileA": "src/auth/AuthFilter.java", "fileB": "src/auth/LoginService.java",
        "coChanges": 18, "couplingRatio": 0.82 }
    ],
    "avgCoupling": 0.76
  }
]

get_file_authors

filePath      string  (required) Repo-relative path, e.g. "src/Main.java"
topN          int     Max authors to return (default 10)
sinceEpochMs  long    Only include commits after this timestamp (ms)

返回按给定文件的提交次数排名的作者:

[
  { "authorEmail": "alice@example.com", "authorName": "Alice", "commitCount": 42 },
  { "authorEmail": "bob@example.com",   "authorName": "Bob",   "commitCount":  7 }
]

get_bus_factor

topN          int     Max results (default 20)
threshold     double  Min dominance ratio 0–1 (default 0.75)
pathFilter    string  SQL LIKE path pattern, e.g. "src/service/%"
sinceEpochMs  long    Only include commits after this timestamp (ms)

返回一个作者制作≥ threshold 在所有提交中,按 dominanceRatio 下降:

[
  {
    "filePath": "src/core/Engine.java",
    "topAuthorEmail": "alice@example.com",
    "topAuthorName": "Alice",
    "topAuthorCommits": 38,
    "totalCommits": 41,
    "dominanceRatio": 0.93
  }
]

get_churn

topN          int     Max results (default 20)
sinceEpochMs  long    Only include commits after this timestamp (ms)
extension     string  File extension filter, e.g. ".java". Default: all files
pathFilter    string  SQL LIKE path pattern, e.g. "src/service/%". Default: all paths

返回按总流失率(添加的行+删除的行)降序排列的文件:

[
  {
    "filePath": "src/main/java/com/example/Foo.java",
    "linesAdded": 840,
    "linesDeleted": 310,
    "churn": 1150,
    "changeFrequency": 47
  }
]

get_ownership

topN          int     Max results (default 20)
ownershipBy   string  Measure by "commits" (default) or "lines"
minOwnership  double  Min ownership ratio 0–1 (default 0.0)
extension     string  File extension filter, e.g. ".java". Default: all files
pathFilter    string  SQL LIKE path pattern, e.g. "src/service/%". Default: all paths
sinceEpochMs  long    Only include commits after this timestamp (ms)

返回每个文件的主要作者,按所有权比率降序排列:

[
  {
    "filePath": "src/core/Engine.java",
    "ownerEmail": "alice@example.com",
    "ownerName": "Alice",
    "ownerCount": 38,
    "totalCount": 41,
    "ownershipRatio": 0.93
  }
]

get_stale_files

长时间未更改的文件,按复杂性加权,可用于查找可能已腐烂的被忽略的代码。

topN          int     Max results (default 20)
minDaysStale  int     Only include files not changed for at least N days (default 180)
extension     string  File extension filter, e.g. ".java". Default: all files
pathFilter    string  SQL LIKE path pattern, e.g. "src/service/%". Default: all paths

返回按过期分数排序的文件(daysSinceLastChange × complexity)下降:

[
  {
    "filePath": "src/legacy/OldParser.java",
    "daysSinceLastChange": 540,
    "ageInDays": 1200,
    "linesOfCode": 420,
    "cyclomaticComplexity": 31,
    "stalenessScore": 0.95
  }
]

get_index_status

没有争论。返回背景索引的当前状态:

{ "status": "READY", "startedAtMs": 1741046400000, "elapsedMs": 4200, "errorMessage": null }

status 是其中之一 NOT_STARTED, INDEXING, READY,或 ERROR。工具返回错误响应,而状态不是 READY.

get_file_commit_history

filePath      string  (required) Repo-relative path, e.g. "src/Main.java"
limit         int     Max commits (default 50)
sinceEpochMs  long    Only include commits after this timestamp (ms)
jiraSlug      string  Filter by JIRA slug; supports LIKE patterns, e.g. "PROJ-123" or "PROJ-%"

refresh_index

没有争论。从头开始清除并重建整个索引。退货:

{ "status": "ok", "commitsProcessed": 1234, "filesIndexed": 89, "durationMs": 4200, "errorMessage": null }

______________________________________________________________________

延伸阅读

模型上下文协议

采矿软件库——书籍

  • 亚当·托恩希尔, *你的代码作为犯罪现场* (Pragmatic Programmers,2015)——引入热点分析和时间耦合作为实用的重构指南
  • 亚当·托恩希尔, *软件设计X射线* (Pragmatic Programmers,2018)——通过团队层面和架构分析扩展了该方法

实现类似想法的工具

  • CodeScene --Tornhill的商业平台;关于MSR驱动的见解在规模上是什么样的有用参考
  • 代码maat --Tornhill的原始开源命令行MSR工具(Clojure)

学术背景

______________________________________________________________________

释放

推标签 v* 触发构建和附加胖JAR的发布工作流:

git tag v1.0.0 && git push origin v1.0.0

工具与能力

工具数量

13

资源数量

0

提示词数量

0

能力标签

Git分析Java本地部署代码库工具软件开发历史记录分析AI集成

支持客户端

Claude DesktopClaudeCursor

数量来自来源目录的标注,具体工具清单以官方文档为准。

典型使用场景

让助手直接读代码

把仓库、提交记录和 issue 交给模型检索,补全和重构时不用来回复制文件。

在对话里跑命令

触发构建、测试和脚本,执行结果直接回到上下文,省去切终端。

接进开发流程

把 PR、CI 状态和代码审查接进助手,减少在几个工具之间跳。

选择建议

值得选的地方

  • 工具数量 13 个,一次接入能覆盖的操作比单点工具更全。
  • 已经适配 Claude Desktop、Claude、Cursor,换客户端不用重新研究配置。
  • 公开说明写得比较完整,接入前能看清能力边界。

先想清楚的地方

  • 公开资料没有可直接复制的安装命令,第一次接入要自己找入口。
  • 公开摘要偏短,具体能力和限制要回到仓库确认。
  • 第三方目录整理,版本更新和行为细节以官方仓库为准。

更适合

  • 需要在开发工具场景里让模型直接调用外部能力的人。
  • 已经在用 Claude Desktop 的用户,接入路径最短。
  • 愿意照着官方文档一步步配环境的人。

不太适合

  • 希望一条命令就装好、不想看文档的人。
  • 需要厂商级 SLA 和技术支持的生产环境。

同类对比

5 个同类
MCP Server工具数传输方式安装命令收录来源最后核验
msr MCP

MCP World · 本页

13未说明未标注1 个2026-05-17
Git 838e2ec1

MCP World

12stdio有2 个2026-05-17
Markitdown MCP 2c653a5f

MCP World

1stdio有1 个2026-05-17
Context7 831acf40

MCP World

0stdio有1 个2026-05-17
Context7 MCP C671e75a

MCP World

0stdio有1 个2026-05-17

按同分类和工具数量挑出最接近的几条,字段以各自详情页为准。

常见问题

5 条

msr MCP 怎么安装?

公开目录没有给出可以直接复制的安装命令,需要按仓库 README里的步骤安装;装好后写进客户端的 MCP 配置再重启。

msr MCP 怎么在 Claude Desktop、Cursor 里配置?

它是传输方式未标注,客户端配置里要写启动命令和参数,运行环境是 未标注;保存后完全退出客户端再打开,配置才会生效。

msr MCP 收费吗?

本站只整理公开资料,不代收费用,也没有标注具体价格。是否收费取决于服务本身和背后的接口额度,正式使用前按官方说明确认。

msr MCP 需要 API Key 吗?

公开资料标注为无需认证,装好就能连;如果实际调用时报鉴权错误,按官方文档补上凭据。

msr MCP 支持哪些客户端?

公开资料标注支持 Claude Desktop、Claude、Cursor;其他客户端只要能配置 MCP Server,也能用同样的命令或地址接入。

来源信息

继续浏览同类 MCP