跳到主要内容

MCP注册表(2025-09-08)—— 官方MCP注册表API

· 阅读需 3 分钟

翻译自:https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/api/official-registry-api.md

此文档描述了托管在 registry.modelcontextprotocol.io 上的官方 MCP 注册表的 API。

此API基于通用注册表API,并附加了额外的端点和身份验证。有关使用API的实际示例,请参阅API使用指南。有关使用API发布服务器的信息,请参阅发布指南

基础网址

  • 生产环境: https://registry.modelcontextprotocol.io
  • Staging: https://staging.registry.modelcontextprotocol.io

交互式文档

扩展。

官方注册表实现了通用注册表 API,并具有以下特定配置和扩展:

认证

发布需要基于命名空间的身份验证:

  • GitHub OAuth - 用于 io.github.* 命名空间
  • GitHub OIDC - 用于从 GitHub Actions 发布
  • DNS 验证 - 适用于基于域名的命名空间(com.example.*
  • HTTP验证 - 针对基于域名的命名空间(com.example.*

请参阅发布者命令以进行身份验证设置。

包验证

官方注册表在发布时会强制执行额外的包验证要求

服务器列表过滤

官方注册表通过附加查询参数扩展了GET /v0/servers端点,以改进发现和同步功能:

  • 'updated_since' - 过滤在 RFC3339 时间戳之后更新的服务器(例如,'2025-08-07T13:15:04.280Z')
  • search - 在服务器名称中进行不区分大小写的子字符串搜索(例如,filesystem)
    • 这是有意设计得简单的。要进行更高级的搜索和筛选,请使用子注册表。
  • '''version - 按版本筛选(目前仅支持latest用于最新版本)'''

这些扩展使下游注册表能够实现高效的增量同步,并改进了服务器发现。参数可以组合使用,并与标准的基于游标的分页配合工作。

示例:`GET /v0/servers?search=filesystem&updated_since=2025-08-01T00:00:00Z&version=latest

附加终端点

认证端点

  • POST /v0/auth/dns - 用签名的DNS挑战交换认证令牌
  • POST /v0/auth/http - 用签名的HTTP挑战交换认证令牌
  • POST /v0/auth/github-at - 用GitHub访问令牌交换认证令牌
  • POST /v0/auth/github-oidc - 交换GitHub OIDC令牌以获取认证令牌
  • POST /v0/auth/oidc - 用于将谷歌OIDC令牌交换为认证令牌(针对管理员)。

管理员端点

  • GET /metrics - Prometheus 指标端点
  • GET /v0/health - 基本健康检查端点
  • PUT /v0/servers/{id} - 编辑现有服务器

MCP注册表(2025-09-08)—— 发布您的MCP服务器

· 阅读需 10 分钟

翻译自:https://github.com/modelcontextprotocol/registry/blob/main/docs/guides/publishing/publish-server.md

将MCP服务器发布到注册表的完整指南。

[!提示] 使用一个有主动性的 AI 编码助手?只需使用以下提示:

阅读 https://raw.githubusercontent.com/modelcontextprotocol/registry/refs/heads/main/docs/guides/publishing/publish-server.md 和 https://raw.githubusercontent.com/modelcontextprotocol/registry/refs/heads/main/docs/guides/publishing/github-actions.md。评估将此服务器发布到注册表的最佳方法(尽可能优先选择自动的CI流程,而非手动流程),并实施它。如果可能,在告诉用户完成之前,使用适当的 JSON 模式库或用户计算机上可用的工具,根据 $schema 验证 server.json。如果遇到困难,引导用户完成发布过程中他们需要执行的部分(例如,如果是手动发布,需要登录 publisher CLI 时)。

你将学习的内容

在本教程结束时,您将完成以下内容:

  • 为您的MCP服务器创建一个server.json文件
  • 使用注册表进行身份验证
  • 成功发布您的服务器
  • 验证您的服务器出现在注册表中

先决条件

部署选项

您可以通过多种方式使您的MCP服务器可用:

  • 📦 软件包部署:发布到注册表(如 npm、PyPI、Docker Hub 等)并由客户端本地运行
  • 🌐 远程部署:作为网络服务托管,客户端可直接连接
  • 🔄 混合部署:提供打包和远程选项以实现最大灵活性

在官方文档中了解更多关于MCP服务器架构的信息。

第1步:安装Publisher CLI

🍺 macOS/Linux/WSL: 使用 Homebrew(推荐)

需要Homebrew:

brew install mcp-publisher
⬇️ macOS/Linux/WSL:预构建二进制文件
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/
🏗️ macOS/Linux/WSL: 从源码构建

需要 Git、Make 和 Go 1.24+:

# 克隆注册表仓库
git clone https://github.com/modelcontextprotocol/registry
cd registry
make publisher

# 二进制文件将位于bin/mcp-publisher
export PATH=$PATH:$(pwd)/bin
🪟 Windows PowerShell:预先构建的二进制文件
$arch = if ([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture -eq "Arm64") { "arm64" } else { "amd64" }; Invoke-WebRequest -Uri "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_windows_$arch.tar.gz" -OutFile "mcp-publisher.tar.gz"; tar xf mcp-publisher.tar.gz mcp-publisher.exe; rm mcp-publisher.tar.gz
# Move mcp-publisher.exe to a directory in your PATH

步骤 2:初始化您的 server.json

导航到您的服务器目录并创建一个模板:

cd /path/to/your/mcp-server
mcp-publisher init

这会创建一个带有自动检测值的 server.json。你会看到类似以下的内容:

{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
"name": "io.github.yourname/your-server",
"description": "A description of your MCP server",
"version": "1.0.0",
"packages": [
{
"registry_type": "npm",
"identifier": "your-package-name",
"version": "1.0.0"
}
]
}

步骤3:配置您的服务器详细信息

编辑生成的server.json

选择你的命名空间

name 字段决定了认证需求:

  • io.github.yourname/* - 需要 GitHub 认证
  • com.yourcompany/* - 需要进行DNS或HTTP域名验证

配置部署方法

将您的服务器配置为支持软件包、远程或两者兼有。

包部署

添加包验证元数据以证明您对包的所有权。

📦 NPM Packages

要求

在你的 package.json 文件中添加一个 mcpName 字段:

{
"name": "你的npm包",
"version": "1.0.0",
"mcpName": "io.github.username/服务器名字"
}

它是如何工作的

示例服务器.json

{
"name": "io.github.username/server-name",
"packages": [
{
"registry_type": "npm",
"identifier": "your-npm-package",
"version": "1.0.0"
}
]
}

官方的MCP注册表目前仅支持NPM公共注册表(https://registry.npmjs.org)。

🐍 PyPI 软件包

要求

将您的服务器名称以此格式包含在您的包README文件中:

MCP名称格式mcp-name: io.github.username/server-name

将其添加到您的README.md文件中(它会成为PyPI上的软件包描述)。如果您想在其他地方隐藏它,可以将其放在注释中。

它是如何工作的

  • 注册表获取 https://pypi.org/pypi/your-package/json
  • 如果 mcp-name: server-name 在 README 内容中,则通过。

示例服务器.json

{
"name": "io.github.username/server-name",
"packages": [
{
"registry_type": "pypi",
"identifier": "your-pypi-package",
"version": "1.0.0"
}
]
}

官方的MCP注册表目前仅支持官方的PyPI注册表(https://pypi.org)。

📋 NuGet 包

要求

在你的软件包的README文件中使用以下格式包含你的服务器名称:

MCP名称格式mcp-name: io.github.username/server-name

将一个包含服务器名称的README文件添加到你的NuGet包中。如果你想在其他地方隐藏它,可以将其放在注释中。

它是如何工作的

  • 注册表从 https://api.nuget.org/v3-flatcontainer/{id}/{version}/readme 获取自述文件。
  • 如果在README内容中找到mcp-name: server-name,则通过。

示例服务器.json

{
"name": "io.github.username/server-name",
"packages": [
{
"registry_type": "nuget",
"identifier": "Your.NuGet.Package",
"version": "1.0.0"
}
]
}

官方的MCP注册表目前仅支持官方的NuGet注册表(https://api.nuget.org)。

🐳 Docker/OCI 镜像

要求

为您的 Docker 镜像添加一个注释:

LABEL io.modelcontextprotocol.server.name="io.github.username/server-name"

它是如何工作的

  • 注册表使用公共令牌与Docker Hub进行身份验证。
  • 使用 Docker Registry v2 API 获取镜像清单
  • 检查 io.modelcontextprotocol.server.name 注解是否与您的服务器名称匹配。
  • 如果注释缺失或不匹配,则失败

示例服务器.json

{
"name": "io.github.username/server-name",
"packages": [
{
"registry_type": "oci",
"identifier": "yourusername/your-mcp-server",
"version": "1.0.0"
}
]
}

标识符是 namespace/repository,版本是标签,并可以选择性地包括摘要。

官方的MCP注册表目前仅支持官方的Docker注册表(https://docker.io)。

📁 MCPB Packages

要求

MCP参考 - MCPB软件包的URL必须在某处包含“mcp”,以确保上传了正确的工件。这可以通过.mcpb扩展名或在您的存储库名称中实现。

文件完整性 - MCPB 包必须包含用于文件完整性验证的 SHA-256 哈希值。此操作是在发布时必需的,MCP 客户端将在安装前验证该哈希值。

如何生成文件哈希

计算你的MCPB文件的SHA-256哈希值:

openssl dgst -sha256 server.mcpb

示例服务器.json

{
"name": "io.github.username/server-name",
"packages": [
{
"registry_type": "mcpb",
"identifier": "https://github.com/you/your-repo/releases/download/v1.0.0/server.mcpb",
"file_sha256": "fe333e598595000ae021bd27117db32ec69af6987f507ba7a63c90638ff633ce"
}
]
}

文件哈希验证

  • 作者 负责在创建 server.json 时生成正确的 SHA-256 哈希值。
  • MCP 客户端 在安装软件包之前验证哈希值以确保文件完整性。
  • 官方注册表存储哈希但不验证它们。
  • 子注册处可以选择实施自己的验证。这使他们能够对MCPB文件进行安全扫描,并确保客户端获得相同的经过安全扫描的内容。

官方的MCP注册表目前仅支持托管在GitHub或GitLab版本上的工件。

远程部署

remotes 字段添加到您的 server.json 中(可以与 packages 共存):

🌐 远程服务器配置

要求

  • 服务端点:您的MCP服务器必须可以通过指定的URL访问。
  • 传输协议:选择 sse(服务器发送事件)或 streamable-http
  • URL验证:仅适用于域命名空间(请参阅以下URL要求)

示例服务器.json

{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
"name": "com.yourcompany/api-server",
"description": "Cloud-hosted MCP server for API operations",
"version": "2.0.0",
"remotes": [
{
"type": "sse",
"url": "https://mcp.yourcompany.com/sse"
}
]
}

多种交通选项

你可以提供多种连接方式:

{
"remotes": [
{
"type": "sse",
"url": "https://mcp.yourcompany.com/sse"
},
{
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/http"
}
]
}

URL验证要求

  • 对于 com.yourcompany/* 命名空间:URL 必须位于 yourcompany.com 或其子域名。
  • 对于io.github.username/*命名空间:没有URL限制(但您必须通过GitHub进行身份验证)。

身份验证标头(可选)

配置客户端连接时应发送的请求头。

{
"remotes": [
{
"type": "sse",
"url": "https://mcp.yourcompany.com/sse",
"headers": [
{
"name": "X-API-Key",
"description": "API key for authentication",
"is_required": true,
"is_secret": true
}
]
}
]
}

步骤 4:身份验证

根据您的命名空间选择身份验证方法。

GitHub认证(用于io.github.*命名空间)

mcp-publisher login github

这会打开你的浏览器进行OAuth认证。

DNS验证(用于自定义域名)

bash
# 生成密钥对
openssl genpkey -algorithm Ed25519 -out key.pem

# 获取用于DNS记录的公钥
echo "yourcompany.com. IN TXT \"v=MCPv1; k=ed25519; p=$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)\""

# 将TXT记录添加到你的DNS中,然后登录
mcp-publisher login dns --domain yourcompany.com --private-key $(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')

第5步:发布你的服务器

认证完成后,发布您的服务器:

mcp-publisher publish

你将看到类似这样的输出:

✓ Successfully published

步骤6:验证出版物

检查您的服务器是否出现在注册表中,可以通过搜索进行验证:

curl "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.yourname/weather-server"

您应该会在 JSON 响应中看到您的服务器元数据。

故障排除

"包验证失败" - 请确保您的包中包含所需的验证元数据(mcpName字段、README提及或Docker标签)。

"身份验证失败" - 请验证您是否正确设置了DNS记录或已登录到正确的GitHub账户。'''

"命名空间未授权" - 您的身份验证方法与所选的命名空间格式不匹配。

例子

请看这些已发布服务器的实际例子:

下一步

你所完成的事情

您已成功将您的第一个MCP服务器发布到注册表!您的服务器现在可以被MCP客户端发现,并且可以被全球用户安装。

MCP注册表(2025-09-08)—— 通过REST API消费注册表数据

· 阅读需 3 分钟

翻译自:https://github.com/modelcontextprotocol/registry/blob/main/docs/guides/consuming/use-rest-api.md

集成模式和最佳实践:构建使用MCP注册表数据的应用程序。

关键细节

基本URL: https://registry.modelcontextprotocol.io

认证:只读访问不需要认证

  • GET /v0/servers - 列出所有带分页的服务器
  • GET /v0/servers/{id} - 根据UUID获取服务器详细信息

请参阅交互式 API 文档,以获取完整的请求/响应模式。

免责声明:官方注册表不提供正常运行时间或数据持久性的保证。您应该通过缓存设计您的应用程序来应对服务停机。

建立子注册表

创建增强的注册表 - 提取官方注册表数据并添加您自己的元数据,如评级、安全扫描或兼容性信息。

目前我们建议定期抓取 GET /v0/servers 端点。未来我们可能会提供一个 updated_at 的过滤器(#291),以便仅获取最近更改的服务器。

服务器通常是不可变的,除了status字段可以更新为deleted(以及其他状态)。对于这些包,我们建议您也将状态字段更新为deleted或者快速从您的注册表中移除该包。这是因为该状态通常表明它违反了我们的宽松审核指南,暗示它可能是非法的、恶意软件或者垃圾信息。

过滤与增强

官方注册表具有宽松的审核政策,因此您可能需要在注册表数据的基础上实施自己的过滤。

您还可以使用 _meta 字段向服务器添加自定义元数据。例如,用户评分、下载次数或安全扫描结果。如果您这样做,我们建议您将其放在一个以您的组织命名空间命名的键下,例如:

{
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-07-09/server.schema.json",
"name": "io.github.yourname/weather-server",
"description": "天气数据访问的MCP服务器",
"status": "active",
"version": "1.0.0",
"packages": [
{
"registry_type": "npm",
"identifier": "weather-mcp-server",
"version": "1.0.0"
}
],
"_meta": {
"com.example.subregistry/custom": {
"user_rating": 4.5,
"download_count": 12345,
"security_scan": {
"last_scanned": "2024-06-01T12:00:00Z",
"vulnerabilities_found": 0
}
}
}
}

提供一个API

我们建议您的子注册表提供一个符合注册表 API 规范的 API,这样客户端可以轻松地在不同的注册表之间切换。有关详细信息,请参阅注册表 API 文档

MCP客户端集成

将注册表数据转换为客户端配置 - 获取服务器并将包信息转换为MCP客户端的配置格式。

我们强烈建议使用子注册表,而不是直接从官方注册表获取数据。您可能希望使其可配置,以便您的客户端用户可以选择他们首选的注册表,例如,我们预计某些企业用户可能会有自己的注册表。

您的客户端应优雅地处理符合最低规范的注册表,即避免对_meta字段的硬性依赖。

过滤

您可能需要筛选出在status字段中不是active的服务器。

运行服务器

你可以使用 packagesremotes 字段来决定如何运行服务器。这些字段的更多详细信息可以在 server.json 文档 中找到。

模型上下文协议规范(2025-06-18)—— 操作引导

· 阅读需 5 分钟

翻译自:https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation

ℹ️ 协议修订:2025-06-18
ℹ️ 操作引导在此版本的MCP规范中是新引入的,其设计可能会在未来的协议版本中演变。

模型上下文协议(MCP)提供了一种标准化的方式,使服务器能够在与客户端的交互过程中通过客户端向用户请求额外的信息。此流程允许客户端在与用户的交互和数据共享中保持控制,同时使服务器能够动态地收集必要的信息。服务器通过 JSON 模式向用户请求结构化数据以验证响应。

用户交互模型

在MCP中,信息操作引导允许服务器通过启用用户输入请求嵌套在其他MCP服务器功能内部,从而实现交互式工作流程。

实现可以自由地通过任何符合其需求的接口模式来展现操作引导过程——协议本身并未规定任何特定的用户交互模型。

ℹ️ 为了信任与安全及保障:

  • 服务器绝不可使用操作引导性请求获取敏感信息。

应用程序应该:

  • 提供明确显示是哪个服务器正在请求信息的用户界面。

  • 允许用户在发送前审阅和修改他们的回复

  • 尊重用户隐私,并提供明确的拒绝和取消选项

能力

支持操作引导的客户端必须初始化期间声明elicitation功能:

{
"capabilities": {
"elicitation": {}
}
}

协议消息

创建需求操作引导请求

要向用户请求信息,服务器会发送一个 elicitation/create 请求:

简单文本请求

请求:

{
"jsonrpc": "2.0",
"id": 1,
"method": "elicitation/create",
"params": {
"message": "Please provide your GitHub username",
"requestedSchema": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": ["name"]
}
}
}

响应:

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"action": "accept",
"content": {
"name": "octocat"
}
}
}

结构化数据请求

请求:

{
"jsonrpc": "2.0",
"id": 2,
"method": "elicitation/create",
"params": {
"message": "请提供您的联系方式",
"requestedSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "您的全名"
},
"email": {
"type": "string",
"format": "email",
"description": "您的电子邮件地址"
},
"age": {
"type": "number",
"minimum": 18,
"description": "您的年龄"
}
},
"required": ["name", "email"]
}
}
}

响应:

{
"jsonrpc": "2.0",
"id": 2,
"result": {
"action": "accept",
"content": {
"name": "Monalisa Octocat",
"email": "octocat@github.com",
"age": 30
}
}
}

拒绝响应示例:

{
"jsonrpc": "2.0",
"id": 2,
"result": {
"action": "reject"
}
}

取消响应示例:

{
"jsonrpc": "2.0",
"id": 2,
"result": {
"action": "cancel"
}
}

消息流

消息流

请求模式

requestedSchema 字段允许服务器使用受限的 JSON Schema 子集来定义预期响应的结构。为了简化客户端的实现,操作引导模式仅限于具有原始属性的简单对象。

"requestedSchema": {
"type": "object",
"properties": {
"propertyName": {
"type": "string",
"title": "Display Name",
"description": "Description of the property"
},
"anotherProperty": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": ["propertyName"]
}

支持的模式类型

该模式仅限于以下基本类型:

  1. 字符串模式
{
"type": "string",
"title": "显示名称",
"description": "描述文本",
"minLength": 3,
"maxLength": 50,
"pattern": "^[A-Za-z]+$",
"format": "email"
}

支持的格式:emailuridatedate-time

  1. 数字模式
{
"type": "number", // 或 "integer"
"title": "显示名称",
"description": "描述文本",
"minimum": 0,
"maximum": 100
}
  1. 布尔模式

{
"type": "boolean",
"title": "显示名称",
"description": "描述文本",
"default": false
}
  1. 枚举模式

原样返回:

{
"type": "string",
"title": "显示名称",
"description": "描述文本",
"enum": ["option1", "option2", "option3"],
"enumNames": ["Option 1", "Option 2", "Option 3"]
}

客户端可以使用此模式来:

  1. 生成适当的输入表单
  2. 在发送之前验证用户输入。
  3. 为用户提供更好的指导

请注意,为了简化客户端实现,复杂的嵌套结构、对象数组以及其他高级 JSON Schema 功能故意不予支持。

响应行动

启发式响应使用三步动作模型来清楚地区分不同的用户操作:

{
"jsonrpc": "2.0",
"id": 1,
"result": {
"action": "accept", // or "reject" or "cancel"
"content": {
"propertyName": "value",
"anotherProperty": 42
}
}
}

三个响应动作是:

  1. 接受action: "accept"):用户明确批准并提交了数据

    • content 字段包含与请求的模式匹配的提交数据。
    • 示例:用户点击了“提交”、“确定”、“确认”等。
  2. 拒绝action: "reject"):用户明确拒绝了请求

    • 通常省略content字段。
    • 示例:用户点击了“拒绝”、“不接受”、“否”等。
  3. 取消action: "cancel"):用户在未做出明确选择的情况下取消。

    • 通常省略content字段。
    • 示例:用户关闭了对话框,点击了外部区域,按下了 Escape 键等。

服务器应适当处理每种状态。

  • 接受:处理提交的数据
  • 拒绝:处理明确的拒绝(例如,提供替代方案)
  • 取消:处理解散(例如,稍后再次提示)。

安全性考虑

  1. 服务器绝不能通过套取方式请求敏感信息。
  2. 客户端应当实现用户批准控制。
  3. 双方应该根据提供的模式验证提取内容。
  4. 客户端应当清楚表明是哪个服务器正在请求信息。
  5. 客户端允许用户随时拒绝操作引导请求。
  6. 客户端应该实现速率限制。
  7. 客户端应该以一种清晰的方式提出操作引导请求,明确表明所需的信息是什么以及为什么需要这些信息。

模型上下文协议规范(2025-06-18)—— 关键变化

· 阅读需 3 分钟

翻译自:https://modelcontextprotocol.io/specification/2025-06-18/changelog

ℹ️ 此文档列出了自上一篇修订版(2025-03-26)以来对模型上下文协议(MCP)规范所做的更改。

重大变化

  1. 移除对JSON-RPC 批处理 的支持(PR #416)。
  2. 添加对结构化工具输出的支持(PR #371)。
  3. 将MCP服务器分类为OAuth资源服务器,添加受保护的资源元数据以发现相应的授权服务器。(PR #338
  4. 要求MCP客户端实施RFC 8707中描述的资源指示器,以防止恶意服务器获取访问令牌。(PR #734
  5. 请明确授权规范中的安全注意事项以及最佳实践,并在新的安全最佳实践页面中说明。
  6. 添加对 操作引导 的支持,使服务器能够在交互过程中请求用户提供额外信息。(PR #382
  7. 在工具调用结果中添加对 资源链接 的支持。(PR #603
  8. 要求在使用HTTP时,通过MCP-Protocol-Version请求头,在后续请求中指定协商的协议版本(参考PR #548)。
  9. 生命周期操作中的“SHOULD”更改为“MUST”。

其他架构更改

  1. 将“_meta”字段添加到其他接口类型(PR #710),并指定正确用法
  2. context 字段添加到 CompletionRequest 中,为完成请求提供包括先前解析的变量的功能(PR #598)。
  3. 添加title字段以便显示更易于理解的名称,这样name可以作为程序化标识符使用(PR #663)。

完整的变更日志

要查看自上次协议修订以来所做的所有更改的完整列表,请查看 GitHub

模型上下文协议规范(2025-03-26)—— 授权

· 阅读需 9 分钟

翻译自:https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/authorization/

ℹ️ 协议修订:2025-03-26

1. 引言

1.1 目的和范围

模型上下文协议(MCP)在传输层提供了授权能力,允许MCP客户端代表资源所有者向受限的MCP服务器发出请求。本规范定义了基于HTTP传输的授权流程。

1.2 协议要求

MCP实施的授权是可选的。当得到支持时:

  • 使用基于HTTP的传输实现应该遵守本规范。
  • 使用STDIO传输的实现不应该遵循这个规范,而是应该从环境中获取凭据。
  • 使用替代传输实现必须遵循其协议的既定安全最佳实践。

1.3 标准合规性

这种授权机制基于下列已建立的规范,但实现了其特性中的选定子集,以确保在保持简单性的同时,保证安全性和互操作性:

2. 授权流程

2.1 概述

  1. MCP授权实现必须为机密客户端和公开客户端实施OAuth 2.1,并采取适当的安全措施。
  2. MCP鉴权实现应该支持OAuth 2.0动态客户端注册协议(RFC7591)。
  3. MCP服务器应该而MCP客户端必须实现OAuth 2.0授权服务器元数据(RFC8414)。不支持授权服务器元数据的服务器必须遵循默认的URI架构。

2.2 基础的 OAuth 2.1 授权

当授权是必需的而客户端尚未提供证明时,服务器必须HTTP 401 Unauthorized响应。

客户端在收到HTTP 401 未授权后启动OAuth 2.1 IETF 草案的授权流程。

以下展示了使用PKCE的公共客户端的基本OAuth 2.1流程。

OAuth 2.1 流程

2.3 服务器元数据发现

服务器能力发现:

  • MCP 客户端必须遵循在 RFC8414 中定义的 OAuth 2.0 授权服务器元数据协议。
  • MCP服务器应当遵循OAuth 2.0授权服务器元数据协议。
  • 不支持 OAuth 2.0 授权服务器元数据协议的MCP服务器,必须支持后备URL。

发现流程如下图所示:

服务器元数据发现流程

2.3.1 服务器元数据发现头部

在服务器元数据发现过程中,MCP 客户端应该包含头部 MCP-Protocol-Version: <protocol-version>,以便MCP服务器可以根据MCP协议版本进行响应。

例如:MCP-Protocol-Version: 2024-11-05

2.3.2 授权基础网址

授权基础URL 必须 通过舍弃任何现有的 path 组件从MCP服务器URL确定。例如:

如果MCP服务器的URL是https://api.example.com/v1/mcp,那么:

  • 授权基础 URL 是 https://api.example.com
  • 元数据端点 必须 位于 https://api.example.com/.well-known/oauth-authorization-server

这确保了授权端点始终位于托管MCP服务器的域的根级别,无论MCP服务器URL中的路径组件如何。

2.3.3 没有元数据发现功能的服务器的备选方案

对于不实现OAuth 2.0授权服务器元数据的服务器,客户端必须使用以下默认的端点路径,相对于授权基础URL(如第2.3.2节中定义):

端点默认路径描述
授权端点/authorize用于授权请求
令牌端点/token用于令牌交换和刷新
注册端点/register用于动态客户端注册

例如,如果一个MCP服务器托管在https://api.example.com/v1/mcp,那么默认的端点将会是:

客户端必须首先尝试通过元数据文档来发现端点,再回退到默认路径。当使用默认路径时,所有其他协议要求保持不变。

2.3 动态客户端注册

MCP 客户端和服务器应该支持 OAuth 2.0 动态客户端注册协议,以便 MCP 客户端可以在没有用户交互的情况下获取 OAuth 客户端 ID。这为客户端自动向新服务器注册提供了一种标准化的方式,这对于 MCP 来说至关重要,因为:

  • 客户端无法提前知晓所有可能的服务器。
  • 手动注册会给用户带来不便。
  • 它实现了与新服务器的无缝连接
  • 服务器可以实现自己的注册策略

任何不支持动态客户端注册的MCP服务器需要提供其他方法来获取客户端ID(如果适用,还有客户端密钥)。对于这些服务器之一,MCP客户端将必须选择以下方式之一:

  1. 硬编码一个客户端ID(如果适用,还包括客户端密钥)专门用于那个MCP服务器,或者
  2. 向用户展示一个用户界面,让他们在注册了OAuth客户端后输入这些详细信息(例如,通过服务器托管的配置界面)。

2.4 授权流程步骤

完整的授权流程如下进行:

授权流程步骤

2.4.1 决策流概述

决策流概述

2.5 访问令牌的使用

2.5.1 令牌要求

访问令牌处理必须符合OAuth 2.1 第5节对资源请求的要求。具体来说:

  1. MCP 客户端必须使用授权请求头字段 第5.1.1节
Authorization: Bearer <access-token>

请注意,在客户端向服务器发送的每个HTTP请求中都必须包含授权信息,即使它们是同一个逻辑会话的一部分。

  1. 访问令牌必须不能包含在URI查询字符串中。

示例请求:

GET /v1/contexts HTTP/1.1
Host: mcp.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

2.5.2 令牌处理

资源服务器必须按照第5.2节所描述的方式验证访问令牌。如果验证失败,服务器必须根据第5.3节的错误处理要求做出响应。无效或过期的令牌必须收到HTTP 401响应。

2.6 安全考虑

以下安全要求必须被实施:

  1. 客户端必须根据OAuth 2.0的最佳实践安全地存储令牌。
  2. 服务器应该执行令牌的过期和轮换。
  3. 所有授权终端点必须通过HTTPS服务。
  4. 服务器必须验证重定向URI以防止公开重定向漏洞
  5. 重定向URI 必须 是localhost URLs或HTTPS URLs。

2.7 错误处理

服务器必须为授权错误返回适当的HTTP状态码。

状态码描述使用场景
401未授权需要授权或令牌无效
403禁止访问权限范围无效或权限不足
400错误的请求授权请求格式错误

2.8 实施要求

  1. 实现必须遵循OAuth 2.1安全最佳实践
  2. PKCE对所有客户端来说都是必需
  3. 为了增强安全性,应该实施令牌轮换
  4. 令牌的有效期应该根据安全需求来限定。

2.9 第三方授权流程

2.9.1 概述

MCP服务器可以通过第三方授权服务器支持委派授权。在这个流程中,MCP服务器既是OAuth客户端(对第三方授权服务器而言)也是OAuth授权服务器(对MCP客户端而言)。

2.9.2 流程描述

第三方授权流程包括以下步骤:

  1. MCP客户端与MCP服务器启动标准的OAuth流程
  2. MCP服务器将用户重定向到第三方授权服务器。
  3. 用户授权第三方服务器
  4. 第三方服务器带着授权码重定向回MCP服务器。
  5. MCP服务器交换代码以获取第三方访问令牌
  6. MCP 服务器生成了绑定到第三方会话的自有访问令牌。
  7. MCP服务器完成与MCP客户端的原始OAuth流程

第三方授权流程

2.9.3 会话绑定要求

MCP服务器实现第三方授权必须

  1. 维持第三方令牌与发行的MCP令牌之间的安全映射。
  2. 在承认MCP令牌之前验证第三方令牌的状态
  3. 实施适当的令牌生命周期管理
  4. 处理第三方令牌过期和更新

2.9.4 安全性考虑

在实现第三方授权时,服务器必须

  1. 验证所有重定向URI
  2. 安全地存储第三方凭据
  3. 实现适当的会话超时处理
  4. 考虑令牌链接的安全隐患
  5. 实现对第三方授权失败的适当错误处理

3. 最佳实践

3.1 本地客户端作为公共OAuth 2.1 客户端

我们强烈推荐本地客户端作为公共客户端实施OAuth 2.1:

  1. 利用代码挑战(PKCE)进行授权请求以防止拦截攻击
  2. 为本地系统实现适当的安全令牌存储
  3. 遵循令牌刷新的最佳实践以维持会话
  4. 正确处理令牌过期和续订

3.2 授权元数据发现

我们强烈建议所有客户端实施元数据发现。这减少了用户手动提供端点的需求,或者客户端回退到定义的默认值。

3.3 动态客户端注册

由于客户端事先不知道MCP服务器的集合,我们强烈推荐实施动态客户端注册。这允许应用程序自动注册到MCP服务器,并且消除了用户手动获取客户端ID的需求。

模型上下文协议规范(2025-03-26)—— 关键变化

· 阅读需 2 分钟

翻译自:https://spec.modelcontextprotocol.io/specification/2025-03-26/changelog/

此文件列出了自上一修订版2024-11-05以来,模型上下文协议(MCP)规范所做的更改。

重大变化

  1. 添加了一个基于OAuth 2.1的全面**授权框架**(PR #133
  2. 替换了先前的HTTP+SSE传输,采用了更灵活的**可流式HTTP传输**(PR #206)。
  3. 增加了对JSON-RPC **批处理**的支持(PR #228
  4. 为了更好地描述工具行为,例如它是只读的还是具有破坏性的,我们增加了全面的工具注释(PR #185)。

其他架构更改

  • ProgressNotification中添加了message字段,以提供描述性的状态更新。
  • 增加了对音频数据的支持,与现有的文本和图像内容类型一起使用。
  • 添加了completions功能,用于明确指示对参数自动完成建议的支持。

查看更新后的Schema以获取更多细节。

完整的更新日志

要查看自上次协议修订以来所做的所有更改的完整列表,请访问GitHub

模型上下文协议规范(2025-03-26)—— 传输

· 阅读需 10 分钟

翻译自:https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/transports/

ℹ️ 协议修订:2025-03-26

MCP 使用 JSON-RPC 来编码消息。JSON-RPC 消息必须使用 UTF-8 编码。

该协议目前定义了两种标准的传输机制用于客户端与服务器之间的通信:

  1. 通过标准输入和标准输出进行通信
  2. 可流式传输的HTTP

客户端在可能的情况下应该支持标准输入输出。

客户端和服务器也可以以可插拔方式实现自定义传输

标准输入输出

stdio 传输中:

  • 客户端作为一个子进程启动MCP服务器。
  • 服务器从其标准输入(stdin)读取JSON-RPC消息,并将消息发送到其标准输出(stdout)。
  • 消息可以是JSON-RPC请求、通知、响应,或者是一个包含一个或多个请求和/或通知的JSON-RPC批处理
  • 消息通过换行符进行界定,并且必须不包含嵌入的换行符。
  • 服务器可以将UTF-8字符串写入其标准错误(stderr)用于记录日志。客户端可以捕获、转发或忽略这些日志记录。
  • 服务器绝对不可以向它的stdout写入任何非有效MCP消息的内容。
  • 客户端绝不能向服务器的stdin写入任何不是有效MCP消息的内容。

stdio传输

可流式传输的HTTP

ℹ️ 这替换了协议版本 2024-11-05 中的HTTP+SSE 传输。请参阅下面的向后兼容性指南。

可流式的HTTP传输中,服务器作为一个独立的进程运行,可以处理多个客户端连接。这种传输使用HTTP POST和GET请求。服务器可以选择使用服务器发送事件(SSE)来流式传输多个服务器消息。这允许基本的MCP服务器,以及支持流式传输和服务器到客户端通知和请求的更丰富功能的服务器。

服务器必须提供一个支持POST和GET方法的单一HTTP端点路径(以下称为MCP端点)。例如,这可以是像https://example.com/mcp这样的URL。

向服务器发送消息

每个从客户端发送的JSON-RPC消息必须是一个对MCP端点的新的HTTP POST请求。

  1. 客户端必须使用HTTP POST方法向MCP端点发送JSON-RPC消息。

  2. 客户端必须包含一个Accept头部,列出application/jsontext/event-stream作为支持的内容类型。

  3. POST请求的主体必须成为以下之一:

    • 一个单独的JSON-RPC 请求通知响应
    • 一个数组 批处理 一个或多个请求和/或通知
    • 一个数组 批处理 一个或多个响应
  4. 如果输入仅仅包含(任意数量的)JSON-RPC 通知响应:

    • 如果服务器接受输入,服务器必须返回HTTP状态码202 Accepted并且不包含任何内容。
    • 如果服务器不能接受输入,它必须返回一个HTTP错误状态码(例如,400错误的请求)。HTTP响应体可以包含一个没有id的JSON-RPC错误响应
  5. 如果输入包含任意数量的JSON-RPC请求,服务器必须返回Content-Type: text/event-stream以初始化一个SSE流,或者返回Content-Type: application/json以返回一个JSON对象。客户端必须支持这两种情况。

  6. 如果服务器启动一个SSE流:

    • SSE流应该最终包括针对POST正文中发送的每个JSON-RPC请求的一个JSON-RPC响应。这些响应可以批处理的

    • 服务器可以在发送JSON-RPC响应之前发送JSON-RPC请求通知。这些消息应该与发起的客户端请求有关。这些请求和*通知可以批处理

    • 服务器在发送每个收到的JSON-RPC请求的响应之前,不应该关闭SSE流,除非会话过期。

    • 在所有JSON-RPC响应发送完毕后,服务器应该关闭SSE流。

    • 断开连接可能随时可能发生(例如,由于网络条件)。因此:

      • 断开连接不应该被解释为客户端取消了它的请求。
      • 为了取消,客户端应该明确发送一个MCP CancelledNotification
      • 为了避免由于连接断开而导致消息丢失,服务器可以使流可以恢复

监听服务器的消息

  1. 客户端可以向MCP端点发出HTTP GET请求。这可以用来打开一个SSE流,允许服务器与客户端通信,而无需客户端首先通过HTTP POST发送数据。
  2. 客户端必须包含一个Accept头部,列出text/event-stream作为支持的内容类型。
  3. 服务器必须对这个HTTP GET请求返回Content-Type: text/event-stream,或者返回HTTP 405 方法不被允许,表明服务器在这个端点不提供SSE流。
  4. 如果服务器启动一个SSE流:
    • 服务器可以在流上发送JSON-RPC的请求通知。这些请求通知 可以批处理的
    • 这些消息应该与客户端同时运行的任何JSON-RPC请求无关。
    • 服务器不得在流上发送JSON-RPC response除非恢复与先前客户端请求关联的流。恢复
    • 服务器可能会在任何时间关闭SSE流。
    • 客户端可以在任何时候关闭SSE流。

多重连接

  1. 客户端可以同时保持与多个SSE流的连接。

  2. 服务器必须将其每一条JSON-RPC消息只发送在一条已连接的流上;也就是说,它不得在多个流中广播相同的消息。

    • 通过使流可恢复可能可以降低消息丢失的风险。

恢复性和重传

为了支持恢复断开的连接,并重新传送可能丢失的信息:

  1. 正如在SSE标准介绍的,服务器可以附加一个id到他们的SSE事件中。

    • 如果存在,该ID 必须 在该会话中的所有流之间全局唯一——或者如果没有使用会话管理,那么在与那个特定客户端的所有流之间全局唯一。
  2. 如果客户希望在连接断开后恢复,它应该向MCP端点发起一个HTTP GET请求,并包含Last-Event-ID标头用于指示它收到的最后一个事件ID。

    • 服务器可以使用此头部来重放在最后一个事件ID之后本应发送的消息,在被断开的流上,并从那个点恢复流。
    • 服务器不得重播本应在不同流上交付的消息。

换言之,这些事件 ID 应该由服务器在每个流的基础上分配,以便在特定流内充当游标。

会话管理

一个MCP“会话”包含客户端与服务端之间逻辑上相关的交互,始于初始化阶段。为了支持想要建立有状态会话的服务器:

  1. 使用可流式传输的HTTP协议的服务器可以在初始化时分配一个会话ID,通过在载有InitializeResult的HTTP响应中增加Mcp-Session-Id头传递给访问方。

    • 会话ID 应该 是全球唯一且加密安全的(例如,一个安全生成的UUID、一个JWT或一个加密散列)。
    • 会话ID 必须 只包含可见的ASCII字符(范围从0x21到0x7E)。
  2. 如果一个Mcp-Session-Id在初始化期间由服务器返回,使用 Streamable HTTP 传输的客户端必须包在所有随后的HTTP请求中包含该头部。

    • 需要会话 ID 的服务器应该对没有 Mcp-Session-Id 头部的请求(初始化除外)以 HTTP 400 错误请求响应。
  3. 服务器可以在任何时候终止会话,在此之后,它必须用HTTP 404未找到对包含该会话ID的请求作出响应。

  4. 当客户端在包含Mcp-Session-Id的请求中收到HTTP 404响应时,它必须通过发送一个没有附加会话ID的新InitializeRequest来开始一个新会话。

  5. 客户端不再需要某个特定会话时(例如,因为用户要离开该客户端应用程序)应该向MCP端点发送一个包含Mcp-Session-Id头部HTTP DELETE请求,用来明确结束会话。

    • 服务器可以使用HTTP 405方法不允许响应此请求,表明服务器不允许客户端终止会话。

时序图

可流式传输的HTTP传输

向后兼容性

客户端和服务器可以通过以下方式与已弃用的HTTP+SSE传输(来自2024-11-05的协议版本)保持向后兼容:

想要支持旧版客户端的服务器应该:

  • 继续同时托管旧传输的SSE(Server-Sent Events)和POST端点,以及为可流式HTTP传输定义的新的“MCP端点”。
    • 也可以将旧的POST端点和新的MCP端点结合起来使用,但这可能会引入不必要的复杂性。

想要支持旧服务器的客户端应该:

  1. 接受用户提供的一个MCP服务器的URL,该URL可能指向使用旧传输协议或新传输协议的服务器。

  2. 尝试向该URL发送一个包含有InitializeRequest和前述Accept头部的POST请求:

    • 如果成功,客户端可以假设这是一个支持新的Streamable HTTP传输的服务器。
    • 如果它失败并返回一个HTTP 4xx状态码(例如,405 方法不允许 或 404 未找到):
      • 向服务器URL发起一个GET请求,期待这将打开一个SSE流,并将endpoint事件作为第一个事件返回。
      • endpoint 事件到达时,客户端可以认为这是一个运行着旧版HTTP+SSE传输协议的服务器,并且应该使用该传输协议进行所有后续的通信。

自定义传输

客户端和服务器可以根据其特定需求实现额外的自定义传输机制。该协议与传输方式无关,可以在支持双向消息交换的任何通信渠道上实现。

选择支持自定义传输的实施者必须确保它们保留由MCP定义的JSON-RPC消息格式和生命周期要求。自定义传输应当记录它们特定的连接建立和消息交换模式以便于对接。

模型上下文协议规范(2025-03-26)

· 阅读需 4 分钟

翻译自:https://spec.modelcontextprotocol.io/specification/2025-03-26/

ℹ️ 协议修订:2025-03-26

模型上下文协议 (MCP) 是一个开放的协议,它使得语言模型应用程序与外部数据源和工具之间的无缝集成成为可能。无论您是在构建一个由人工智能驱动的集成开发环境(IDE),增强一个聊天界面,还是创建自定义的AI工作流程,MCP都提供了一种标准化的方式连接语言模型与它们所需的上下文。

这个规范定义了权威的协议要求,基于位于schema.ts的TypeScript Schema。

对于实施指南和示例,请访问 modelcontextprotocol.io

本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“NOT RECOMMENDED”、“MAY”和“OPTIONAL”应当按照BCP 14 [RFC2119] [RFC8174]所描述的意义进行解读,当且仅当它们如本文所示全部以大写字母出现时。

概览

MCP为应用程序提供了一种标准化的方式来:

  • 与语言模型分享上下文信息
  • 向人工智能系统暴露工具和能力
  • 构建可组合的集成和工作流程

该协议使用 JSON-RPC 2.0消息来建立以下之间的通信:

  • 主机:发起连接的LLM应用程序
  • 客户端:宿主应用程序内部的连接器
  • 服务器:提供上下文和能力的服务

MCP 从 语言服务器协议 中获得了一些灵感,该协议标准化了如何在整个开发工具生态系统中增加对编程语言的支持。与此类似,MCP 标准化了如何将额外的上下文和工具集成到 AI 应用的生态系统中。

关键细节

基础协议

  • JSON-RPC 消息格式
  • 有状态连接
  • 服务器和客户端能力协商

特性

服务器向客户提供以下任一特性:

  • 资源:上下文与数据,供用户或人工智能模型使用
  • 提示:为用户提供的模板化消息和工作流程
  • 工具:AI模型执行的函数

客户端可能会向服务器提供以下功能:

  • 采样:服务器主动的代理行为和递归的大型语言模型交互

附加工具

  • 配置
  • 进度跟踪
  • 取消
  • 错误报告
  • 记录

安全与信任与安全保障

模型上下文协议通过任意数据访问和代码执行路径开启了强大的功能。随着这种能力的增加,所有实现者必须仔细考虑重要的安全和信任问题。

关键原则

  1. 用户同意与控制
    • 用户必须明确同意并理解所有数据访问和操作。
    • 用户必须保留对哪些数据被共享以及采取什么行动的控制权。
    • 实施者应为审查和授权活动提供清晰的用户界面。
  2. 数据隐私
    • 主机在将用户数据暴露给服务器之前,必须获得用户的明确同意。
    • 主机在未经用户同意的情况下不得将资源数据传输到其他地方。
    • 用户数据应该通过适当的访问控制来保护。
  3. 工具安全
    • 工具代表任意代码执行,必须谨慎对待。
      • 特别是,工具行为的描述,如注解,应被视为不可信的,除非它们来自于一个可信的服务器。
    • 主机在调用任何工具之前必须获得用户的明确同意。
    • 用户应在授权使用每个工具之前了解它的功能。
  4. LLM 采样控制
    • 用户必须明确批准任何LLM抽样请求。
    • 用户应该控制:
      • 是否会发生抽样
      • 实际将要发送的提示
      • 服务器可以看到什么结果
    • 该协议有意限制了服务器对提示的可见性。

实施指南

虽然MCP本身不能在协议层面强制执行这些安全原则,但是实现者应该

  1. 将强大的同意和授权流程构建到他们的应用程序中
  2. 提供清晰的安全隐患文档说明
  3. 实施适当的访问控制和数据保护
  4. 在他们的集成中遵循安全最佳实践。
  5. 在他们的功能设计中考虑隐私影响。

在Linux系统上手动配置iSCSI设备

· 阅读需 5 分钟

翻译自:https://www.ibm.com/docs/en/tsmfve/7.1.8?topic=tasks-manually-configuring-iscsi-device-linux-system

这个程序描述了在iSCSI挂载操作中如何配置一个Linux系统。来自Tivoli® 存储管理器服务器存储的VM快照将被挂载。

在你开始之前

在进行iSCSI挂载时,会在Tivoli存储管理器恢复代理系统上创建一个iSCSI目标。Tivoli存储管理器恢复代理系统上不需要Microsoft iSCSI发起器。

提示: Open-iSCSI Initiator随Red Hat Enterprise Linux和SUSE Linux Enterprise Server一起提供。

在您继续执行此任务之前,请审核以下iSCSI要求:

  • 您可以从任何系统连接到iSCSI目标,以创建包含备份数据的卷。您可以从另一个系统挂载这个卷。
  • 任何需要连接到iSCSI目标的系统都需要一个iSCSI发起器。
  • 必须在需要恢复数据的系统上安装一个iSCSI发起器。
  • 如果一个卷跨越多个磁盘,您必须挂载所有需要的磁盘。当使用镜像卷时,只需挂载镜像磁盘中的一个。挂载一个磁盘可以防止耗时的同步操作。

关于这个任务

完成这些步骤来配置在iSCSI装载操作期间使用的Linux系统:

程序

  1. 记录要恢复数据的系统上的iSCSI发起者名称。

iSCSI发起程序的名称位于

/etc/iscsi/initiatorname.iscsi

文件。如果这

发起者名称=

值为空,请使用以下命令创建一个初始化器名称:

twauslbkpoc01:~ # /sbin/iscsi-iname

以下是一个示例的发起者名称:

iqn.2005-03.org.open-iscsi:3f5058b1d0a0
  1. 将发起方名称添加到 /etc/iscsi/initiatorname.iscsi 文件中。

    1. 使用 vi 命令编辑 /etc/iscsi/initiatorname.iscsi 文件。例如:
twauslbkpoc01:~ # vi /etc/iscsi/initiatorname.iscsi
  1. 更新 InitiatorName= 参数为启动者名称。例如:
InitiatorName=iqn.2005-03.org.open-iscsi:3f5058b1d0a0
  1. 在安装了Tivoli存储管理器恢复代理(或iSCSI目标)的系统上完成以下步骤:

    1. 启动Tivoli存储管理器恢复代理。完成选择TSM服务器和选择快照对话框,然后点击挂载

    2. 在 "选择挂载目的地" 对话框中,选择 "挂载一个 iSCSI 目标"。

    3. 创建一个目标名称。确保它是唯一的,并且你可以从运行iSCSI启动器的系统中识别出它。例如:

iscsi-mount-tsm4ve
  1. 输入在步骤1中记录的iSCSI发起者名称,然后点击确定

  2. 请验证您刚刚挂载的卷是否显示在已挂载的卷字段中。

  3. 在步骤1中选定的发起系统上,定位并启动iSCSI发起器程序。

    1. 通过发出这个命令来验证iSCSI服务是否正在运行:

Red Hat Enterprise Linux:

service iscsi status

SUSE Linux Enterprise Server:

service open-iscsi status

如果服务没有运行,执行此命令以启动服务:

Red Hat Enterprise Linux:

service iscsi start

SUSE Linux Enterprise Server:

service open-iscsi start
  1. 通过执行这个命令来连接到iSCSI目标:
iscsiadm -m discovery -t sendtargets -p <IP/hostname of Tivoli Storage Manager recovery agent system> --login
  1. 通过执行以下命令来验证一个新的原始设备是否可用:
fdisk -l
  1. 挂载文件系统:

对于非LVM卷,请执行以下命令。在这个例子中,新设备是

/dev/sdb1

冒号

mkdir /mountdir
mount /dev/sdb1 /mountdir

对于LVM卷,在Linux客户端完成以下任务:

  1. 确保Linux系统上有vgimportclone脚本。这个脚本不包含在基础(默认)的LVM包中。因此,您可能需要将LVM包更新到提供此脚本的版本。

  2. 发行

vgimportclone

命令并包含一个新的基础卷组名称(

VolGroupSnap01

例如:

vgimportclone --basevgname /dev/VolGroupSnap01 /dev/sdb1
  1. 发行

    lvchange

command to mark the logical volume as active. For example:

lvchange -a y /dev/VolGroupSnap01/LogVol00
  1. 执行这些命令来挂载卷:
mkdir /mountdir
mount -o ro /dev/VolGroupSnap01/LogVol00 /mountdir
  1. 在文件恢复操作完成后,执行这些命令:

    • 对于非LVM卷,执行以下命令:

      1. 卸载文件系统:
umount /dev/sdb1 /mountdir
  1. 移除该卷。如果该卷是卷组的一部分,首先需要通过以下命令将卷从卷组中移除:
vgreduce <your_volume_group> /dev/sdb1

执行这个命令来移除卷:

pvremove /dev/sdb1
  1. 退出单个目标:
iscsiadm --mode node --targetname <target_name> --logout
  1. 退出所有目标:
iscsiadm --mode node --logout
  • 对于LVM卷,在Linux客户端上完成以下任务:

    1. 卸载文件系统:
unmount /mountdir
  1. 移除逻辑卷:
lvm lvremove LogVol00
  1. 删除卷组:
lvm vgremove VolGroupSnap01
  1. 退出单个目标:
iscsiadm --mode node --targetname <target_name> --logout
  1. 退出所有目标:
iscsiadm --mode node --logout