跳转到主要内容

教程:我是谁? (Tutorial: Who am I?)

本教程将引导你完成设置 MCP Auth 以认证 (Authentication) 用户并从授权 (Authorization) 服务器获取其身份信息的过程。

完成本教程后,你将获得:

  • ✅ 对如何使用 MCP Auth 进行用户认证 (Authentication) 的基本理解。
  • ✅ 一个 MCP 服务器,提供用于获取用户身份信息的工具。

概览 (Overview)

本教程将涉及以下组件:

  • MCP 服务器:一个简单的 MCP 服务器,使用 MCP 官方 SDK 处理请求。
  • MCP inspector:MCP 服务器的可视化测试工具。它还充当 OAuth / OIDC 客户端,发起授权 (Authorization) 流程并获取访问令牌 (Access token)。
  • 授权 (Authorization) 服务器:一个 OAuth 2.1 或 OpenID Connect 提供商,管理用户身份并颁发访问令牌 (Access token)。

以下是这些组件之间交互的高级流程图:

了解你的授权 (Authorization) 服务器

获取用户身份信息 (Retrieving user identity information)

要完成本教程,你的授权 (Authorization) 服务器应提供用于获取用户身份信息的 API:

Logto 是一个 OpenID Connect 提供商,支持标准的 userinfo 端点 用于获取用户身份信息。

要获取可用于访问 userinfo 端点的访问令牌 (Access token),至少需要两个权限 (Scopes):openidprofile。你可以继续阅读,后续会介绍权限 (Scope) 配置。

动态客户端注册 (Dynamic Client Registration)

本教程不要求动态客户端注册,但如果你希望自动化 MCP 客户端在授权 (Authorization) 服务器的注册流程,它会很有用。详见 是否需要动态客户端注册?

搭建 MCP 服务器

我们将使用 MCP 官方 SDK 创建一个带有 whoami 工具的 MCP 服务器,用于从授权 (Authorization) 服务器获取用户身份信息。

创建新项目 (Create a new project)

mkdir mcp-server
cd mcp-server
uv init # 或使用 `pipenv` 或 `poetry` 创建新虚拟环境

安装 MCP SDK 及依赖 (Install the MCP SDK and dependencies)

pip install "mcp[cli]" starlette uvicorn

或使用你喜欢的其他包管理器,如 uvpoetry

创建 MCP 服务器 (Create the MCP server)

首先,让我们创建一个实现 whoami 工具的 MCP 服务器。

创建名为 whoami.py 的文件,并添加如下代码:

from mcp.server.fastmcp import FastMCP
from starlette.applications import Starlette
from starlette.routing import Mount
from typing import Any

mcp = FastMCP("WhoAmI")

@mcp.tool()
def whoami() -> dict[str, Any]:
    """返回当前用户信息的工具。"""
    return {"error": "Not authenticated"}

app = Starlette(
    routes=[Mount('/', app=mcp.sse_app())]
)

使用以下命令运行服务器:

uvicorn whoami:app --host 0.0.0.0 --port 3001

检查 MCP 服务器 (Inspect the MCP server)

克隆并运行 MCP inspector (Clone and run MCP inspector)

现在 MCP 服务器已运行,我们可以使用 MCP inspector 检查 whoami 工具是否可用。

由于当前实现的限制,我们 fork 了 MCP inspector,使其在认证 (Authentication) 和授权 (Authorization) 方面更灵活和可扩展。我们也已向原仓库提交了 pull request。

运行 MCP inspector,可使用以下命令(需要 Node.js):

git clone https://github.com/mcp-auth/inspector.git
cd inspector
npm install
npm run dev

然后,在浏览器中打开 http://localhost:6274/(或终端显示的其他 URL)访问 MCP inspector。

连接 MCP inspector 到 MCP 服务器 (Connect MCP inspector to the MCP server)

在继续之前,请检查 MCP inspector 中的以下配置:

  • Transport Type:设置为 SSE
  • URL:设置为你的 MCP 服务器的 URL。此处应为 http://localhost:3001/sse

现在你可以点击“Connect”按钮,查看 MCP inspector 是否能连接到 MCP 服务器。如果一切正常,你将在 MCP inspector 中看到“Connected”状态。

检查点:运行 whoami 工具 (Checkpoint: Run the whoami tool)

  1. 在 MCP inspector 顶部菜单点击 "Tools" 标签页。
  2. 点击 "List Tools" 按钮。
  3. 你应该能在页面上看到 whoami 工具,点击它查看工具详情。
  4. 在右侧你会看到 "Run Tool" 按钮,点击运行该工具。
  5. 你将看到工具返回的 JSON 响应 {"error": "Not authenticated"}

MCP inspector 首次运行

集成你的授权 (Authorization) 服务器 (Integrate with your authorization server)

完成本节内容时,你需要考虑以下事项:

你的授权 (Authorization) 服务器的发行者 (Issuer) URL

通常是你的授权 (Authorization) 服务器的基础 URL,如 https://auth.example.com。有些提供商可能是类似 https://example.logto.app/oidc 的路径,请查阅你的提供商文档。

如何获取授权 (Authorization) 服务器元数据
  • 如果你的授权 (Authorization) 服务器符合 OAuth 2.0 授权服务器元数据OpenID Connect Discovery,你可以使用 MCP Auth 内置工具自动获取元数据。
  • 如果不符合这些标准,你需要在 MCP 服务器配置中手动指定元数据 URL 或端点。请查阅你的提供商文档获取具体端点。
如何将 MCP inspector 注册为授权 (Authorization) 服务器的客户端
  • 如果你的授权 (Authorization) 服务器支持 动态客户端注册 (Dynamic Client Registration),可以跳过此步骤,MCP inspector 会自动注册为客户端。
  • 如果不支持动态客户端注册,你需要手动在授权 (Authorization) 服务器中注册 MCP inspector 为客户端。
如何获取用户身份信息以及如何配置授权 (Authorization) 请求参数
  • 对于 OpenID Connect 提供商:通常在发起授权 (Authorization) 流程时需要请求至少 openidprofile 权限 (Scopes)。这样授权 (Authorization) 服务器返回的访问令牌 (Access token) 就包含访问 userinfo 端点 所需的权限 (Scopes)。

    注意:部分提供商可能不支持 userinfo 端点。

  • 对于 OAuth 2.0 / OAuth 2.1 提供商:请查阅你的提供商文档,了解如何使用访问令牌 (Access token) 获取用户身份信息,以及发起授权 (Authorization) 流程时获取该访问令牌 (Access token) 所需的参数。

虽然每个提供商可能有自己的具体要求,以下步骤将指导你如何结合 MCP inspector 和 MCP 服务器进行针对不同提供商的配置集成。

注册 MCP inspector 为客户端 (Register MCP inspector as a client)

Logto 集成非常简单,因为它是一个支持标准 userinfo 端点 的 OpenID Connect 提供商。

由于 Logto 目前尚不支持动态客户端注册 (Dynamic Client Registration),你需要手动在 Logto 租户中注册 MCP inspector 为客户端:

  1. 打开 MCP inspector,点击 "OAuth Configuration" 按钮。复制 Redirect URL (auto-populated),如 http://localhost:6274/oauth/callback
  2. 登录 Logto Console(或你的自托管 Logto Console)。
  3. 进入 "Applications" 标签页,点击 "Create application"。在页面底部点击 "Create app without framework"。
  4. 填写应用详情,然后点击 "Create application":
    • 选择应用类型:选择 "Single-page application"。
    • 应用名称:如 "MCP Inspector"。
  5. 在 "Settings / Redirect URIs" 区域,粘贴刚才复制的 Redirect URL (auto-populated),然后点击底部栏的 "Save changes"。
  6. 在顶部卡片中,你会看到 "App ID"。复制它。
  7. 回到 MCP inspector,在 "OAuth Configuration" 区域的 "Client ID" 字段粘贴 "App ID"。
  8. 在 "Auth Params" 字段输入 {"scope": "openid profile email"},确保 Logto 返回的访问令牌 (Access token) 包含访问 userinfo 端点所需的权限 (Scopes)。

配置 MCP Auth (Set up MCP auth)

在你的 MCP 服务器项目中,需要安装 MCP Auth SDK 并配置其使用你的授权 (Authorization) 服务器元数据。

首先,安装 mcpauth 包:

pip install mcpauth

或使用你喜欢的其他包管理器,如 uvpoetry

MCP Auth 需要授权 (Authorization) 服务器元数据以完成初始化。根据你的提供商:

发行者 (Issuer) URL 可在 Logto Console 的应用详情页 "Endpoints & Credentials / Issuer endpoint" 区域找到,类似 https://my-project.logto.app/oidc

更新 whoami.py,加入 MCP Auth 配置:

from mcpauth import MCPAuth
from mcpauth.config import AuthServerType
from mcpauth.utils import fetch_server_config

auth_issuer = '<issuer-endpoint>'  # 替换为你的发行者 (Issuer) 端点
auth_server_config = fetch_server_config(auth_issuer, type=AuthServerType.OIDC)
mcp_auth = MCPAuth(server=auth_server_config)

现在,我们需要创建一个自定义访问令牌 (Access token) 校验器,用于通过 MCP inspector 提供的访问令牌 (Access token) 从授权服务器获取用户身份信息。

import pydantic
import requests
from mcpauth.exceptions import (
    MCPAuthTokenVerificationException,
    MCPAuthTokenVerificationExceptionCode,
)
from mcpauth.types import AuthInfo

def verify_access_token(token: str) -> AuthInfo:
    """
    通过从授权服务器获取用户信息来校验提供的 Bearer 令牌 (Access token)。
    如果令牌有效,则返回包含用户信息的 `AuthInfo` 对象。

    :param token: 从 MCP inspector 接收到的 Bearer 令牌 (Access token)。
    """

    issuer = auth_server_config.metadata.issuer
    endpoint = auth_server_config.metadata.userinfo_endpoint # 提供方应支持 userinfo endpoint
    if not endpoint:
        raise ValueError(
            "Auth server metadata 中未配置 userinfo endpoint。"
        )

    try:
        response = requests.get(
            endpoint,
            headers={"Authorization": f"Bearer {token}"}, # 标准 Bearer 令牌 (Access token) 头
        )
        response.raise_for_status() # 确保 HTTP 错误时抛出异常
        json = response.json() # 解析 JSON 响应
        return AuthInfo(
            token=token,
            subject=json.get("sub"), # 'sub' 是主体 (Subject)(用户 ID)的标准声明 (Claim)
            issuer=issuer, # 使用元数据中的发行者 (Issuer)
            claims=json, # 包含 userinfo endpoint 返回的所有声明 (Claims)(JSON 字段)
        )
    # `AuthInfo` 是 Pydantic 模型,校验错误通常意味着响应结构不匹配预期
    except pydantic.ValidationError as e:
        raise MCPAuthTokenVerificationException(
            MCPAuthTokenVerificationExceptionCode.INVALID_TOKEN,
            cause=e,
        )
    # 处理请求过程中可能发生的其他异常
    except Exception as e:
        raise MCPAuthTokenVerificationException(
            MCPAuthTokenVerificationExceptionCode.TOKEN_VERIFICATION_FAILED,
            cause=e,
        )

更新 MCP 服务器 (Update MCP server)

我们快完成了!现在需要更新 MCP 服务器,应用 MCP Auth 路由和中间件函数,并让 whoami 工具返回实际的用户身份信息。

@mcp.tool()
def whoami() -> dict[str, Any]:
    """返回当前用户信息的工具。"""
    return (
        mcp_auth.auth_info.claims
        if mcp_auth.auth_info # 由 Bearer auth 中间件填充
        else {"error": "Not authenticated"}
    )

# ...

bearer_auth = Middleware(mcp_auth.bearer_auth_middleware(verify_access_token))
app = Starlette(
    routes=[
        # 添加元数据路由 (`/.well-known/oauth-authorization-server`)
        mcp_auth.metadata_route(),
        # 用 Bearer auth 中间件保护 MCP 服务器
        Mount('/', app=mcp.sse_app(), middleware=[bearer_auth]),
    ],
)

检查点:带认证 (Authentication) 运行 whoami 工具 (Checkpoint: Run the whoami tool with authentication)

重启你的 MCP 服务器,并在浏览器中打开 MCP inspector。当你点击 "Connect" 按钮时,应会被重定向到授权 (Authorization) 服务器的登录页面。

登录后返回 MCP inspector,重复上一个检查点的操作运行 whoami 工具。这一次,你应该能看到授权 (Authorization) 服务器返回的用户身份信息。

MCP inspector whoami 工具结果

信息

完整 MCP 服务器(OIDC 版本)代码请参考 MCP Auth Python SDK 仓库

结语 (Closing notes)

🎊 恭喜你!你已成功完成本教程。让我们回顾一下所做的内容:

  • 搭建了带有 whoami 工具的基础 MCP 服务器
  • 使用 MCP Auth 将 MCP 服务器与授权 (Authorization) 服务器集成
  • 配置 MCP Inspector 以认证 (Authentication) 用户并获取其身份信息

你还可以探索一些进阶主题,包括:

欢迎查阅更多教程和文档,充分发挥 MCP Auth 的能力。