MCP for Beginners TypeScript 实战:基于 JWT 与作用域校验的 MCP 服务器认证实现
教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载导读本篇文章围绕mcp-for-beginners课程中「11-simple-auth」章节的 TypeScript 解决方案展开讲解如何为基于 Express 的 MCPModel Context ProtocolHTTP 服务器加上中间件认证从验证Authorization请求头、校验 JWT 令牌到按User.Read等作用域scope做细粒度授权。读完本文你将能独立跑通整个示例理解服务端中间件的完整校验链路并掌握通过修改作用域来观察认证失败现象的调试方法。认证与授权先厘清两个概念在进入代码之前先明确两个容易混淆的概念见 章节主文档Authentication认证判断来访者是否有权进入系统即是否能够访问承载 MCP Server 能力的资源服务器Authorization授权判断该用户是否有权访问其所请求的具体资源例如只能读取订单而不能删除。最朴素的实现是 Basic Auth客户端在Authorization请求头中携带凭据用户名密码的 Base64 或 API Key服务端通过**中间件middleware**在请求到达业务代码前校验凭据。校验失败时服务端返回401 Unauthorized未认证或403 Forbidden无权限。[!NOTE] 本文 TypeScript 示例基于 MCP2025-11-25规范使用mcp-session-id追踪会话MCP2026-07-28规范已移除initialize握手与协议级会话 ID。差异说明可参考 Whats Changed in MCP: The 2026-07-28 Specification。示例工程全景本示例位于 solution/typescript 目录结构如下solution/typescript/ ├── package.json # 脚本与依赖定义 ├── tsconfig.json └── src/ ├── server.ts # Express MCP Server含认证中间件 ├── client.ts # MCP 客户端携带令牌访问 /mcp ├── util.ts # JWT 生成createToken与校验verifyToken └── test.ts # 读取 .env 中令牌并验证的工具脚本从 package.json 可以看到全部操作都封装为 npm 脚本scripts: { start: node ./build/server.js, client: node ./build/client.js, generate: node ./build/util.js, build: tsc }依赖方面示例使用modelcontextprotocol/sdkStreamable HTTP 传输、expressWeb 框架、jsonwebtokenJWT 签发与校验、dotenv读取 .env 环境变量和zod工具入参 schema 定义。四步跑通示例第 1 步安装依赖npm install第 2 步构建npm run build该命令通过tsc将src/下的 TypeScript 编译到build/目录。第 3 步生成令牌npm run generate这条命令会执行 util.ts 中的createToken()构造一个使用HS256签名的 JWT其 payload 包含sub、name、admin、iat、exp1 小时后过期以及scopes: [Admin.Write, User.Read]然后将令牌写入当前目录的.env文件token...。客户端启动时会读取这个文件。第 4 步启动服务器与客户端先在第一个终端启动服务器npm start再在第二个终端启动客户端npm run client服务器终端应看到类似输出User exists User has required scopes Middleware executed客户端终端应看到类似输出Connected to MCP server with session ID: c1e50d7b-acff-4f11-8f96-5ae490ca1eaa Available tools: { tools: [ { name: process-files, inputSchema: [Object] } ] } Client disconnected. Exiting...客户端成功连接后通过listTools列出了服务端注册的process-files工具。服务端中间件的四道校验关卡核心认证逻辑集中在 server.ts 的app.use(...)中间件中它对所有进入/mcp的请求依次执行四道检查app.use((req, res, next) { // 1. Authorization 请求头是否存在 if(!req.headers[authorization]) { res.status(401).send(Unauthorized); return; } let token req.headers[authorization]; // 2. JWT 是否有效完整性/签名校验 if(!isValid(token)) { res.status(403).send(Forbidden); return; } // 3. 令牌对应的用户是否存在于系统中 if(!isExistingUser(token)) { res.status(403).send(Forbidden); console.log(User does not exist); return; } console.log(User exists); // 4. 令牌是否具备所需作用域 if(!hasScopes(token, [User.Read])){ res.status(403).send(Forbidden - insufficient scopes); return; } console.log(User has required scopes); console.log(Middleware executed); next(); });这四道检查对应了本文开头区分的认证与授权请求头存在性缺失则直接返回401 Unauthorized属于认证失败令牌有效性isValid内部调用verifyTokenjwt.verify校验签名与过期时间失败返回403 Forbidden用户存在性isExistingUser将令牌中的name与内存中的用户列表比对真实项目应查询数据库代码中留有// TODO, check if user exists in DB作用域校验hasScopes检查令牌中的scopes数组是否包含User.Read不满足返回403 Forbidden - insufficient scopes。其中hasScopes的实现server.ts使用了every语义——要求所有必需作用域都存在function hasScopes(scope: string, requiredScopes: string[]) { let decodedToken verifyToken(scope); return requiredScopes.every(scope decodedToken?.scopes.includes(scope)); }值得注意这些检查只是作者强调的最低限度校验集合章节文档原话these are the absolute minimum of checks you should be doing。生产环境还应叠加来源 IP、请求频率防机器人、令牌吊销检查等。客户端如何携带令牌客户端 client.ts 通过dotenv读取.env中的令牌并将其放入传输层requestInit.headersconfig(); let sessionId: string | undefined undefined; let options: StreamableHTTPClientTransportOptions { sessionId: sessionId, requestInit: { headers: { Authorization: process.env.token || secret123 } } }; const serverUrl http://localhost:8000/mcp;随后把options传给StreamableHTTPClientTransport连接成功后记录transport.sessionId并调用client.listTools()。这正是章节文档所说的「两步走」先构造携带凭据的配置对象再将其传给传输层。配套的 test.ts 可以在不启动服务器的情况下独立验证.env中的令牌读取令牌、verifyToken解码、再检查用户是否存在方便排查令牌生成环节的问题。动手实验修改作用域观察认证失败为了验证作用域校验真的生效按章节文档做如下实验。找到 server.ts 中的代码if(!hasScopes(token, [User.Read])){ res.status(403).send(Forbidden - insufficient scopes); }把User.Read改成User.Write然后重新构建并重启服务器npm run build npm start由于当前.env中令牌的scopes只有User.Read和Admin.Write没有User.Write认证会失败。此时客户端终端输出Error initializing client: Error: Error POSTing to endpoint (HTTP 403): Forbidden - insufficient scopes服务器终端则停留在User exists说明请求通过了「用户存在性」检查但在「作用域校验」环节被拦截没有继续往下执行。恢复方式有两种改回服务端代码把User.Write改回User.Read重新npm run build给令牌补上该作用域修改 util.ts 中 payload 的scopes数组例如加入User.Write执行npm run generate重新生成.env再重跑客户端。这个实验直观展示了 MCP 场景下「认证通过、授权失败」的分层现象也是排查403类错误的标准思路先确认令牌是否过期/无效再确认作用域是否满足服务端要求。从 Basic Auth 走向 JWT 与更安全的架构章节主文档 README 详细论述了从简单凭据升级到 JWT 的收益安全性Basic Auth 反复传输凭据JWT 有签发时间与过期时间天然支持基于角色/作用域的细粒度访问控制无状态与可扩展性JWT 自包含用户信息无需服务端会话存储可本地校验互操作与联邦JWT 是 OpenID Connect 的核心配合 Entra ID、Google Identity、Auth0 等身份提供商可支持单点登录模块化与灵活性可配合 Azure API Management、NGINX 等 API 网关使用性能与缓存解码后的 JWT 可缓存减少重复解析开销高级特性支持服务端 introspection有效性检查与 revocation令牌吊销。同时务必注意代码中的安全提醒不要将密钥硬编码在代码里util.ts 的注释明确写着Use env vars in production示例中的your-secret-key仅用于演示传输凭据至少需要 HTTPS还应规划短生命周期访问令牌 长生命周期刷新令牌的机制。课程后续还提供了两处进阶路径将身份模型迁移到标准 IdP如 Entra的 mcp-security-entra以及将 MCP 服务器接入宿主环境的 Setting Up MCP Hosts。总结通过本文你完整走通了mcp-for-beginners课程 11-simple-auth 章节的 TypeScript 样例理解了认证与授权的区别、看到了 Express 中间件如何对/mcp请求实施「请求头 → 令牌 → 用户 → 作用域」四层校验、掌握了npm run generate生成 JWT 令牌并注入.env的流程并通过修改User.Read为User.Write亲手验证了授权失败的行为。这套「中间件 JWT 作用域」的组合正是为后续接入 OAuth 2.1 与标准身份提供商打下的基础。赞分享教程文档人工智能【免费下载链接】mcp-for-beginnersThis open-source curriculum introduces the fundamentals of Model Context Protocol (MCP) through real-world, cross-language examples in .NET, Java, TypeScript, JavaScript, Rust and Python. Designed for developers, it focuses on practical techniques for building modular, scalable, and secure AI workflows from session setup to service orchestration.项目地址https://gitcode.com/GitHub_Trending/mc/mcp-for-beginners点击查看免费下载相关推荐MCP for Beginners TypeScript 简单认证实战用 JWT 与 RBAC 中间件保护 Streamable HTTP 服务MCP for Beginners TypeScript 简单认证实战用 JWT 与 RBAC 中间件保护 Streamable HTTP 服务 导读 本文聚教程文档人工智能基于 MCP Inspector 验证 TypeScript 低层 MCP 服务器构建、工具调用与参数校验实战基于 MCP Inspector 验证 TypeScript 低层 MCP 服务器构建、工具调用与参数校验实战 本文围绕 mcp for beginners教程文档人工智能MCP 服务认证从入门到实战在 mcp-for-beginners 中用 Basic Auth、JWT 与 RBAC 保护你的 MCP ServerMCP 服务认证从入门到实战在 mcp for beginners 中用 Basic Auth、JWT 与 RBAC 保护你的 MCP Server 导读 M教程文档人工智能上一篇ATLauncher 开源项目使用教程下一篇为什么选择Rainbow深度解析7大强化学习技术的完美融合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

电励磁同步电机异步牵入—稳态运行—能耗制动全周期动态特性的Matlab/Simulink仿真研究

电励磁同步电机异步牵入—稳态运行—能耗制动全周期动态特性的Matlab/Simulink仿真研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/10/4 9:10:15 阅读更多 →
用Python下载ERA5再分析数据:从配置到避坑全指南

用Python下载ERA5再分析数据:从配置到避坑全指南

用Python下载ECMWF的ERA-5再分析资料,这事儿听起来像个标准流程,但实际操作里坑不少。ECMWF提供了CDS API,官方也推荐直接用Python的cdsapi库来拉数据,可很多新手卡在第一步:账号怎么注册、密钥文件放哪、脚本怎么写、…

2026/10/4 9:10:15 阅读更多 →
影刀RPA新手教程:什么值得买好价信息监控与推送

影刀RPA新手教程:什么值得买好价信息监控与推送

影刀RPA新手教程:什么值得买好价信息监控与推送 盯好价这事儿,手动盯等于盯不住。什么值得买上你关注的商品可能几周才出现一次历史低价,你不可能一天刷十次页面,等你想起来去看的时候,价格早就回去了。这篇教程讲怎么…

2026/10/4 9:10:15 阅读更多 →

最新新闻

安卓开发中 Cursor Adapter 的适配与优化:TaoToken 统一 Key 接入实践

安卓开发中 Cursor Adapter 的适配与优化:TaoToken 统一 Key 接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:51:39 阅读更多 →
COMSOL纳秒脉冲激光烧蚀模拟:移动网格与温度场调参实战

COMSOL纳秒脉冲激光烧蚀模拟:移动网格与温度场调参实战

看到这个标题,我真的太有感触了。用COMSOL做纳秒脉冲激光烧蚀的移动网格模拟,几乎每个刚接触的人都会在这个问题上卡上几周。案例库里的模型跑得挺顺畅,一旦换成自己的纳秒脉冲参数,温度场就各种放飞自我——要么直接窜到几十万开…

2026/10/4 9:51:39 阅读更多 →
掌握Superpowers Skills:用TaoToken统一Key打通AI工具链的实战配置

掌握Superpowers Skills:用TaoToken统一Key打通AI工具链的实战配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:51:39 阅读更多 →
Cursor插件开发避坑指南:plugin.json契约与TypeScript SDK实战

Cursor插件开发避坑指南:plugin.json契约与TypeScript SDK实战

1. 项目概述:从“plugins”这个词开始,我们到底在谈什么?“plugins”——这个词在当前开发者工具生态里,已经不是简单的“插件”两个字能概括的了。它是一套运行时可插拔的能力交付机制,是现代AI原生编辑器&#xff08…

2026/10/4 9:51:39 阅读更多 →
插件机制深度解析:从生命周期到加载器实现与故障排查

插件机制深度解析:从生命周期到加载器实现与故障排查

先交代一下背景:我这些年做开发,跟“插件”这两个字打交道的时间加起来可能比写业务代码还长。从嵌入式调试工具里挂的辅助脚本,到音乐类应用里换音源、换歌词的扩展包,再到各种 Web 框架启动时报的那句failed to load plugins&am…

2026/10/4 9:51:39 阅读更多 →
Himalaya pimdir.root 路径 Shell 展开:让 `~/.local/state/neverest/…` 真正指向家目录下的离线邮件仓库

Himalaya pimdir.root 路径 Shell 展开:让 `~/.local/state/neverest/…` 真正指向家目录下的离线邮件仓库

CLI 【免费下载链接】himalaya CLI to manage emails 项目地址: https://gitcode.com/gh_mirrors/hi/himalaya 点击查看 免费下载 本篇技术指南围绕 himalaya 的 pimdir 变更 pimdir-root-shell-expand 展开,讲解 pimdir.root 配置项的 ~ 与环境变量展开…

2026/10/4 9:50:38 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →