关于 JFrog MCP Server (🧪 Experimental)
JFrog MCP Server 是面向 JFrog Platform API 的 MCP 服务,覆盖仓库管理、构建追踪、发布生命周期等功能。该项目已被弃用且不再维护,README 建议迁移至 JFrog 官方提供的 MCP 服务。
主要功能
- 01创建和管理本地、远程及虚拟仓库
- 02列出和查询构建信息
- 03通过 AQL 查询搜索制品
- 04查询包的版本、漏洞及 curation 状态
- 05汇总 Xray 制品的严重级别问题数量
适用场景
- 01在 MCP 客户端中查询 Artifactory 仓库与构建
- 02检查开源包的已知漏洞与 curation 结果
MCP 相关
该项目是一个 MCP 服务,向 MCP 客户端暴露 JFrog Platform 的仓库、构建、运行时、项目及 Xray 相关工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
⛔ 已弃用 — JFrog MCP Server(实验性)
注意
🚨 此项目已弃用,不再维护 🚨
请勿将此代码库用于新的或现有的集成。
此实验性 MCP 服务已被 JFrog 官方 MCP 服务 取代,该服务由 JFrog 构建、维护并提供支持。官方服务安全、托管于远程、可用于生产环境,并持续接收更新、错误修复和安全补丁。
👉 请改用 JFrog 官方 MCP 服务:
https://jfrog.com/help/r/jfrog-integrations-documentation/jfrog-mcp-server
此代码库将不再收到任何功能、修复或安全更新。以下内容仅为历史参考而保留。
用于 JFrog Platform API 的模型上下文协议(MCP)服务,可进行仓库管理、构建追踪、发布生命周期管理等。
https://github.com/user-attachments/assets/aca3af2b-f294-41c8-8727-799a019a55b5
⚠️ 弃用通知
此项目已弃用,JFrog 不再维护。
该项目最初作为实验项目创建,用于展示 JFrog 与 MCP 的集成能力,JFrog 从未正式支持或验证过此项目。此项目将不再收到更新、错误修复或安全补丁。
JFrog 现在提供了官方、安全且托管于远程的 MCP 服务,可与 JFrog Platform 无缝集成。该托管 MCP 服务由 JFrog 维护,是今后推荐且唯一受支持的选项,可提供更高的安全性、可靠性和支持。
请迁移到官方服务:
功能
- 仓库管理:创建和管理本地、远程和虚拟仓库
- 构建追踪:列出并检索构建信息
- 运行时监控:查看运行时集群和正在运行的容器映像
- Mission Control:查看关联的 JFrog Platform 实例
- 制品搜索:执行强大的 AQL 查询,以搜索制品和构建
- 目录与精选管理:获取软件包信息、版本和漏洞,并检查精选状态
- Xray:获取扫描制品摘要,并按严重程度对每个制品分组
工具
仓库管理
-
check_jfrog_availability- 检查 JFrog 平台是否已就绪并正常运行
- 返回:平台就绪状态
-
create_local_repository- 在 Artifactory 中创建新的本地仓库
- 输入:
key(字符串):仓库键rclass(字符串):仓库类别(必须为 "local")packageType(字符串):仓库的软件包类型description(可选字符串):仓库描述projectKey(可选字符串):要将仓库分配到的项目键environments(可选字符串数组):要分配给仓库的环境
- 返回:已创建的仓库详情
-
create_remote_repository- 在 Artifactory 中创建新的远程仓库,用于代理外部软件包注册表
- 输入:
key(string):仓库键rclass(string):仓库类别(必须为 "remote")packageType(string):仓库的软件包类型url(string):远程仓库的 URLusername(optional string):远程仓库用户名password(optional string):远程仓库密码description(optional string):仓库描述projectKey(optional string):要将仓库分配到的项目键environments(optional string[]):要将仓库分配到的环境- 其他许多用于特定仓库配置的可选参数
- 返回:已创建的仓库详情
-
create_virtual_repository- 在 Artifactory 中创建新的虚拟仓库,以聚合多个仓库
- 输入:
key(string):仓库键rclass(string):仓库类别(必须为 "virtual")packageType(string):仓库的软件包类型repositories(string[]):要纳入虚拟仓库的仓库键列表description(optional string):仓库描述projectKey(optional string):要将仓库分配到的项目键environments(optional string[]):要将仓库分配到的环境- 其他用于特定仓库配置的可选参数
- 返回:已创建的仓库详情
-
list_repositories- 列出 Artifactory 中的所有仓库,并支持可选筛选
- 输入:
type(optional string):按类型筛选仓库(local、remote、virtual、federated、distribution)packageType(optional string):按软件包类型筛选仓库project(optional string):按项目键筛选仓库
- 返回:符合筛选条件的仓库列表
-
set_folder_property- 为 Artifactory 中的文件夹设置属性,并可选择递归应用
- 输入:
folderPath(string):要设置属性的文件夹路径properties(object):要设置的键值对recursive(optional boolean):是否递归为子文件夹应用属性
- 返回:操作结果
-
execute_aql_query- 执行 Artifactory Query Language (AQL) 查询,以搜索 JFrog Artifactory 中的制品、构建或其他实体
- 输入:
query(string):要执行的 AQL 查询。必须遵循 AQL 语法(例如:items.find({"repo":"my-repo"}).include("name","path"))domain(optional string):要搜索的主要领域(items、builds、archive.entries、build.promotions、releases)transitive(optional boolean):是否搜索远程仓库limit(optional number):要返回的最大结果数offset(optional number):要跳过的结果数include_fields(optional string[]):结果中要包含的字段sort_by(optional string):结果排序所依据的字段sort_order(optional string):排序顺序(asc 或 desc)
- 返回:包含元数据的搜索结果
构建管理
-
list_jfrog_builds- 返回 JFrog 平台中的所有构建列表
- 返回:构建列表
-
get_specific_build- 按名称获取特定构建的详情
- 输入:
buildName(string):要获取的构建名称project(optional string):用于限定构建搜索范围的项目键
- 返回:构建详情
运行时管理
10. `list_jfrog_runtime_clusters` - 返回 JFrog 平台中的所有运行时集群列表 - 输入: - `limit`(可选整数):要返回的集群数量上限 - `next_key`(可选字符串):用于分页的下一页键 - 返回:运行时集群列表-
get_jfrog_runtime_specific_cluster- 根据 ID 返回运行时集群
- 输入:
clusterId(整数):要获取的集群 ID
- 返回:集群详情
-
list_jfrog_running_images- 列出各运行时集群中所有正在运行的容器镜像及其安全和运行状态
- 输入:
filters(可选字符串):要应用的筛选条件num_of_rows(可选整数):要返回的行数page_num(可选整数):页码statistics(可选布尔值):是否包含统计信息timePeriod(可选字符串):要查询的时间段
- 返回:正在运行的镜像列表
访问控制
-
list_jfrog_environments- 获取 JFrog 平台中所有环境类型及其详情的列表
- 输入:
- 返回:环境列表
-
list_jfrog_projects- 获取 JFrog 平台中所有项目及其详情的列表
- 输入:
- 返回:项目列表
-
get_specific_project- 获取 JFrog 平台中特定项目的详细信息
- 输入:
project_key(字符串):要获取的项目的唯一键
- 返回:项目详情
-
create_project- 在 JFrog 平台中创建新项目
- 输入:
project_key(字符串):项目的唯一标识符display_name(字符串):项目的显示名称description(字符串):项目描述admin_privileges(对象):项目的管理权限storage_quota_bytes(数字):存储配额,单位为字节(-1 表示不受限制)
- 返回:已创建的项目详情
目录与管理
-
jfrog_get_package_info- 获取软件包的公开信息
- 输入:
type(字符串):软件包类型(pypi、npm、maven、golang、nuget、huggingface、rubygems)name(字符串):软件包在软件包仓库中显示的名称version(可选字符串):软件包版本(默认值:"latest")
- 返回:软件包信息,包括描述、最新版本、许可证和 URL
-
jfrog_get_package_versions- 获取公开软件包的版本列表及其发布日期
- 输入:
type(字符串):软件包类型(pypi、npm、maven、golang、nuget、huggingface、rubygems)name(字符串):软件包在软件包仓库中显示的名称
- 返回:软件包版本列表及其发布日期
-
jfrog_get_package_version_vulnerabilities- 获取影响某个开源软件包特定版本的已知漏洞列表
- 输入:
type(字符串):软件包类型(pypi、npm、maven、golang、nuget、huggingface、rubygems)name(字符串):软件包在软件包仓库中显示的名称version(可选字符串):软件包版本(默认值:"latest")pageSize(可选数字):每页返回的漏洞数量(默认值:10)pageCount(可选数字):要返回的页数(默认值:1)
- 返回:影响指定软件包版本的漏洞列表
-
jfrog_get_vulnerability_info- 获取特定漏洞的详细信息,包括受影响的软件包和版本
- 输入:
cve_id(字符串):要查询的 CVE ID 或漏洞标识符pageSize(可选数字):每页返回的漏洞数量(默认值:10)pageCount(可选数字):返回的页数(默认值:1)
- 返回:漏洞详细信息和受影响的软件包
-
jfrog_get_package_curation_status- 检查特定软件包版本的筛选状态
- 输入:
packageType(字符串):软件包类型(pypi、npm、maven、golang、nuget、huggingface、rubygems)packageName(字符串):软件包在软件包仓库中显示的名称packageVersion(字符串):软件包在软件包仓库中显示的版本
- 返回:筛选状态(approved、blocked 或 inconclusive)
Xray
jfrog_get_artifacts_summary- 获取仓库或构建中制品问题的摘要,按严重级别(Low、Medium、High、Critical、Unkown)分类并计数
- 输入:
paths(字符串数组):用于生成摘要的制品路径数组
- 返回:根据所提供数组中每个制品的各严重级别漏洞数量生成的摘要,以及问题总数
设置
通过 Smithery 安装
要通过 Smithery 自动为 Claude Desktop 安装 mcp-jfrog:
npx -y @smithery/cli install @jfrog/mcp-jfrog --client claude
前提条件
- Node.js v18 或更高版本
- Docker(如果使用 Docker 部署,参阅 Docker 部署)
- 具有适当权限的有效 JFrog 平台实例
- 有权在 JFrog 平台实例中创建和管理访问令牌
环境变量
JFROG_ACCESS_TOKEN:你的 JFrog 访问令牌(必需)JFROG_URL:JFrog 平台的基础 URL(必需)TRANSPORT:要使用的传输模式,设为 'sse' 以启用 SSE 传输(默认值:stdio)PORT:SSE 传输使用的端口号(默认值:8080)CORS_ORIGIN:SSE 连接允许的 CORS 来源(默认值:'*')LOG_LEVEL:日志级别:DEBUG、INFO、WARN、ERROR(默认值:INFO)MAX_RECONNECT_ATTEMPTS:SSE 服务的最大重连尝试次数(默认值:5)RECONNECT_DELAY_MS:重连尝试之间的基础延迟(毫秒)(默认值:2000)
JFrog 令牌(JFROG_ACCESS_TOKEN)
要使用此 MCP 服务,你需要创建 JFrog 访问令牌,或使用具有适当权限的身份令牌:
有关如何创建 JFrog 令牌的信息,请参阅 JFrog 官方文档:
JFrog URL(JFROG_URL)
你的 JFrog 平台实例 URL(例如 https://acme.jfrog.io)
SSE 传输特性
SSE 传输模式包含以下特性:
- 连接管理:每个 SSE 连接都会分配唯一 ID,让客户端在尝试重新连接时能够保持状态。
- 结构化日志:包含时间戳、严重级别和相关上下文信息的详细日志。
- 连接恢复能力:如果服务启动失败,会通过指数退避机制自动尝试重新连接。
- 运行状况端点:
/health端点会返回服务状态信息。 - 连接跟踪:实时跟踪活动连接,并定期记录统计信息。
- 性能指标:跟踪工具操作和 HTTP 请求的执行时间。
使用 SSE 模式时:
- 客户端应连接到
/sse端点,并可选择提供connectionId查询参数来跟踪会话。 - 客户端请求应发送到
/messages端点,并使用相同的connectionId查询参数。 - 服务会通过已建立的 SSE 连接,以服务器发送事件的形式响应。
使用连接 ID 的客户端连接示例:
GET /sse?connectionId=client123
客户端请求示例:
POST /messages?connectionId=client123
Content-Type: application/json
{
"jsonrpc": "2.0",
"method": "listTools",
"id": 1
}
如何构建
使用 git clone 将仓库克隆到本地计算机,然后使用 cd 进入项目目录:
git clone [email protected]:jfrog/mcp-jfrog.git
cd mcp-jfrog
构建为 Docker 镜像:
docker build -t mcp/jfrog -f Dockerfile .
构建为 npm 模块:
npm i && npm run build
使用方法
与 Cursor 配合使用
将以下内容添加到 `~/.cursor/mcp.json`:npm
{
"mcpServers": {
"MCP-JFrog": {
"command": "npm",
"args": [
"exec",
"-y",
"github:jfrog/mcp-jfrog"
],
"env": {
"JFROG_ACCESS_TOKEN": "ACCESS_TOKEN",
"JFROG_URL": "https://<YOUR_JFROG_INSTANCE_URL>"
}
}
},
"mcp-local-dev":{
"command": "node",
"args": [
"/<ABSOLUT_PATH_TO>/mcp-jfrog/dist/index.js"
],
"env": {
"JFROG_ACCESS_TOKEN": "<ACCESS_TOKEN>>",
"JFROG_URL": "<JFROG_URL>"
}
}
}
Docker
{
"mcpServers": {
"jfrog": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"JFROG_ACCESS_TOKEN",
"-e",
"JFROG_URL",
"mcp/jfrog"
],
"env": {
"JFROG_ACCESS_TOKEN": "<YOUR_TOKEN>",
"JFROG_URL": "https://your-instance.jfrog.io"
},
"serverUrl": "http://localhost:8080/sse"
}
}
}
SSE 传输模式
要让 JFrog MCP Server 使用 SSE 传输模式(适用于 Cursor WebView 等 Web 界面):
{
"mcpServers": {
"jfrog-sse": {
"command": "docker",
"args": [
"run",
"--rm",
"-p",
"8080:8080",
"-e",
"TRANSPORT=sse",
"-e",
"PORT=8080",
"-e",
"CORS_ORIGIN=*",
"-e",
"LOG_LEVEL=INFO",
"-e",
"MAX_RECONNECT_ATTEMPTS=5",
"-e",
"RECONNECT_DELAY_MS=2000",
"-e",
"JFROG_ACCESS_TOKEN",
"-e",
"JFROG_URL",
"mcp/jfrog"
],
"env": {
"JFROG_ACCESS_TOKEN": "<YOUR_TOKEN>",
"JFROG_URL": "https://your-instance.jfrog.io",
"serverUrl": "http://localhost:8080/sse"
}
}
}
}
注意:使用 SSE 模式时,需要添加指向 SSE 端点的 serverUrl 参数,并公开服务使用的端口(-p 8080:8080)。
与 Claude Desktop 配合使用
将以下内容添加到 claude_desktop_config.json:
Docker
{
"mcpServers": {
"jfrog": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"JFROG_ACCESS_TOKEN",
"-e",
"JFROG_URL",
"mcp/jfrog"
],
"env": {
"JFROG_ACCESS_TOKEN": "<YOUR_TOKEN>",
"JFROG_URL": "https://your-instance.jfrog.io" // Your JFrog platform URL
},
"serverUrl": "http://localhost:8080/sse"
}
}
}
npm
{
"mcpServers": {
"MCP-JFrog": {
"command": "npm",
"args": [
"exec",
"-y",
"github:jfrog/mcp-jfrog"
],
"env": {
"JFROG_ACCESS_TOKEN": "ACCESS_TOKEN",
"JFROG_URL": "https://<YOUR_JFROG_INSTANCE_URL>"
}
}
}
}
SSE 传输模式
让 Claude Desktop 使用 SSE 传输:
{
"mcpServers": {
"jfrog-sse": {
"command": "docker",
"args": [
"run",
"--rm",
"-p",
"8080:8080",
"-e",
"TRANSPORT=sse",
"-e",
"PORT=8080",
"-e",
"CORS_ORIGIN=*",
"-e",
"LOG_LEVEL=INFO",
"-e",
"MAX_RECONNECT_ATTEMPTS=5",
"-e",
"RECONNECT_DELAY_MS=2000",
"-e",
"JFROG_ACCESS_TOKEN",
"-e",
"JFROG_URL",
"mcp/jfrog"
],
"env": {
"JFROG_ACCESS_TOKEN": "<YOUR_TOKEN>",
"JFROG_URL": "https://your-instance.jfrog.io",
"serverUrl": "http://localhost:8080/sse"
}
}
}
}
</details>
## License
This MCP server is licensed under the Apache License 2.0. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the Apache License 2.0. For more details, please see the LICENSE.md file in the project repository.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。