mcp-for-beginners 实战:用 TypeScript 构建并验证带 JWT 认证的 MCP Server
教程文档人工智能【免费下载链接】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 JWT 的 MCP Server 认证示例的安装、构建、运行与验证全过程。你将学会如何用npm脚本一键生成令牌、启动服务端与客户端并通过修改 scope 的实验亲眼验证 403 拒绝行为从而理解 MCP 服务中认证Authentication与授权Authorization的落地方式。示例概览从无认证到 JWT 的基本一步在 11-simple-auth 章节 中作者把 MCP 服务的安全演进拆成了三个阶段完全无认证 → 基础认证Basic Auth直接发送Authorization头→ JWT 令牌认证。本节 TypeScript 解决方案正是第三阶段的成果它把整套方案落成了一份可运行、可实验的最小工程位置在解决方案说明英文原版源码目录03-GettingStarted/11-simple-auth/solution/typescript/src/包含server.ts服务端、client.ts客户端、util.tsJWT 生成与校验、test.ts令牌自检整个示例的核心链路是客户端读取.env中的 JWT放入 HTTPAuthorization请求头请求先经过 Express 中间件中间件依次校验「头是否存在 → 令牌签名是否有效 → 用户是否存在于系统 → 是否具备所需 scope」校验通过后请求才被转发到基于modelcontextprotocol/sdk的 MCP Server处理process-files等工具调用。第一步安装依赖与构建示例使用 TypeScript 编写、以 ES Module 方式运行源码位于src/编译产物输出到build/。安装依赖只需在解决方案目录执行npm install项目核心依赖见 package.jsonmodelcontextprotocol/sdkMCP 官方 SDK提供McpServer、StreamableHTTPServerTransport与客户端组件express承载 HTTP 路由与中间件的 Web 框架jsonwebtokenJWT 的签名与校验dotenv从.env文件读取令牌到环境变量zod定义 MCP 工具的输入 Schema。安装完成后编译 TypeScriptnpm run buildbuild脚本对应tsc会把src/下的.ts文件编译为build/下的 JavaScript。后续所有运行命令start、client、generate都基于编译后的build/目录执行因此修改源码后必须重新npm run build才生效这一点在后面的 scope 实验里尤为重要。第二步生成 JWT 令牌运行npm run generate该命令对应node ./build/util.js会调用 util.ts 中的createToken()生成一个 JWT 并写入项目根目录的.env文件格式为token生成的JWT客户端运行时将从该文件读取令牌。从源码看这个令牌的构成非常清晰const payload { sub: 1234567890, name: User usersson, admin: true, iat: Math.floor(Date.now() / 1000), // 签发时间 exp: Math.floor(Date.now() / 1000) 60 * 60, // 1 小时后过期 scopes: [Admin.Write, User.Read] // 令牌携带的权限范围 }; const token jwt.sign(payload, secretKey, { algorithm: HS256, header: { alg: HS256, typ: JWT } }); fs.writeFileSync(path.join(process.cwd(), .env), token${token}\n);几个值得注意的细节签名算法是 HS256签名密钥硬编码为your-secret-key源码注释明确提示生产环境必须改用环境变量等安全方式管理密钥令牌是有时间限制的1 小时过期这是相比 Basic Auth 的一次重要安全升级scopes数组声明了令牌拥有的权限Admin.Write和User.Read。后续 scope 实验正是围绕这个数组展开的。第三步启动服务端与客户端先启动服务端npm start对应node ./build/server.js服务端会在8000 端口监听路由为/mcp。然后在另一个终端运行客户端npm run client对应node ./build/client.js。客户端启动时会加载.env中的令牌将其放入Authorization请求头连接http://localhost:8000/mcp并调用listTools列出可用工具详见 client.ts。预期输出认证成功时服务端终端会依次打印以下日志对应中间件的每一步校验User exists User has required scopes Middleware executed客户端终端则会看到连接成功、会话 ID 与可用工具列表Connected to MCP server with session ID: c1e50d7b-acff-4f11-8f96-5ae490ca1eaa Available tools: { tools: [ { name: process-files, inputSchema: [Object] } ] } Client disconnected. Exiting...会话 ID如c1e50d7b-acff-4f11-8f96-5ae490ca1eaa是服务端通过randomUUID()生成的用于在transports映射中按会话维护流式 HTTP 传输实例。可用工具process-files是示例注册的一个 MCP 工具它会遍历一批待处理的 CSV 文件sales1.csv、sales2.csv、sales3.csv对未处理的文件逐条发送notifications/message通知并返回处理数量见 server.ts。第四步Scope 实验 —— 亲眼看授权如何失败运行示例只是热身这份文档的精髓在于一个「动手改代码」的实验用来确认 scope 校验真实生效。在 server.ts 中找到中间件里的这段校验if(!hasScopes(token, [User.Read])){ res.status(403).send(Forbidden - insufficient scopes); }它要求传入的令牌必须包含User.Read这个 scope。现在把它改成User.Write然后重新构建并重启服务端npm run build npm start由于生成的令牌只包含Admin.Write和User.Read不包含User.Write你会看到认证失败客户端终端报错Error initializing client: Error: Error POSTing to endpoint (HTTP 403): Forbidden - insufficient scopes服务端终端只打印到User exists也就是说请求在「用户存在」校验之后、scope 校验环节被 403 拦下中间件没有继续向后放行——这正好印证了hasScopes的实现逻辑function hasScopes(scope: string, requiredScopes: string[]) { let decodedToken verifyToken(scope); return requiredScopes.every(scope decodedToken?.scopes.includes(scope)); }它要求令牌的scopes数组必须同时包含所有必需 scopeevery语义。如何恢复文档给了两种等价恢复方式任选其一把令牌里加上User.Writescope即修改 util.ts 的scopes数组后重新npm run generate再重跑客户端直接把 server.ts 的校验改回[User.Read]。深入源码认证中间件的四层防线理解了运行与实验之后再把 server.ts 中的认证逻辑串起来可以看到中间件其实做了四层递进检查app.use((req, res, next) { // 第 1 层Authorization 头是否存在缺失返回 401 if(!req.headers[authorization]) { res.status(401).send(Unauthorized); return; } // 第 2 层JWT 签名是否有效无效返回 403 let token req.headers[authorization]; if(!isValid(token)) { res.status(403).send(Forbidden); return; } // 第 3 层令牌对应用户是否存在于系统不存在返回 403 if(!isExistingUser(token)) { res.status(403).send(Forbidden); console.log(User does not exist); return; } console.log(User exists); // 第 4 层令牌是否具备所需 scope不满足返回 403 if(!hasScopes(token, [User.Read])){ res.status(403).send(Forbidden - insufficient scopes); return; } console.log(User has required scopes); console.log(Middleware executed); next(); });注意 HTTP 状态码的语义区分401Unauthorized用于认证失败如缺少凭证头403Forbidden用于授权失败如令牌无效、用户不存在、scope 不足。这与 11-simple-auth 章节 中对认证你是谁与授权你能做什么的定义一一对应。isExistingUser的实现是简化版——它只是在一个硬编码数组里查找用户名const users [user1, User usersson]; function isExistingUser(token) { let decodedToken verifyToken(token); // TODO, check if user exists in DB return users.includes(decodedToken?.name || ); }源码中的TODO注释也明确提示真实系统里应把用户列表替换为数据库查询甚至交由身份提供方IdP来校验。除此之外test.ts 提供了一个离线自检工具它读取.env中的令牌并调用verifyToken解码同时检查User usersson是否存在于用户列表中适合在排查「令牌为什么被拒」时快速定位问题。从中间件到会话MCP 流式 HTTP 的服务端骨架认证只是入口MCP 请求本身通过StreamableHTTPServerTransport处理。服务端在app.post(/mcp)路由中按会话管理传输实例若请求头带mcp-session-id且存在于transports映射则复用已有传输若无会话 ID 且请求体是initialize请求则新建传输注册sessionIdGenerator: () randomUUID()生成会话 ID并在onsessioninitialized时把传输存入映射其余情况返回400 Bad Request: No valid session ID provided。同时app.get(/mcp)用于服务端经 SSE 向客户端推送通知app.delete(/mcp)用于终止会话。需要说明的是从章节文档中的警告看这套基于mcp-session-id的会话跟踪示例针对的是 MCP2025-11-25规范MCP2026-07-28规范移除了initialize握手与协议级会话 ID新实现应使用自包含请求详情可参考 01-CoreConcepts/mcp-2026-07-28.md。安全边界与下一步演进这份示例刻意保持了「简单到可以读懂」的粒度文档和源码都对安全边界做了明确提示密钥不能硬编码util.ts中的your-secret-key仅供演示生产环境应放入环境变量或密钥管理服务令牌应可撤销HS256 对称签名配合固定密钥一旦泄露难以吊销需要引入令牌黑名单、过期刷新或改用 RS256 IdP 等机制不应把明文凭证写在代码里客户端client.ts虽然演示时回退到secret123但实际应始终从环境变量读取令牌process.env.token。从课程的整体路线看本示例是通往更完善安全模型的起点若想进一步了解基于 Entra 等身份提供方的企业级认证方案可继续阅读 05-AdvancedTopics/mcp-security-entra/README.md章节中还附有基础认证Basic Auth的完整实现见 code/basic 目录可与本示例对比直观体会 JWT 带来的改进。学完认证后下一步是了解如何把 MCP 服务接入各类宿主环境见 12-mcp-hosts 章节。小结通过这份 TypeScript 解决方案你可以完整经历「安装 → 构建 → 生成令牌 → 启动服务端 → 运行客户端 → 修改 scope 验证授权失败」的全过程并在源码层面理解 MCP 认证的中间件四层检查、JWT 的构造与校验、以及流式 HTTP 传输的会话管理。从无认证到 Basic Auth 再到 JWT再到基于 IdP 的标准身份模型这正是 mcp-for-beginners 课程为开发者铺好的安全演进路径。赞分享教程文档人工智能【免费下载链接】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 实战用 PyJWT 构建与验证 JWT为 MCP Server 打造认证基础mcp for beginners 实战用 PyJWT 构建与验证 JWT为 MCP Server 打造认证基础 本篇技术指南以 mcp for begin教程文档人工智能mcp-for-beginners 实战在 TypeScript 中运行 JWT 认证实验jwt-labmcp for beginners 实战在 TypeScript 中运行 JWT 认证实验jwt lab 本指南以 03 GettingStarted/1教程文档人工智能MCP 简单认证实践从 Basic Auth 到 JWT 的 TypeScript 实战mcp-for-beginnersMCP 简单认证实践从 Basic Auth 到 JWT 的 TypeScript 实战mcp for beginners 导读 本指南围绕开源课程 mc教程文档人工智能上一篇在 ik_llama.cpp 中运行 1.58-bit BitNet 与兼容 GGUF 模型I2_S 重量化、IQ2_BN 与 llama-server 实战指南下一篇千古前端图文教程Vue 2 系统指令全解——插值表达式、v-bind、v-on 与跑马灯实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

汽油PHEV热管理回路

汽油PHEV热管理回路

一、高温回路二、冷媒回路三、低温回路四、整个回路

2026/10/9 5:25:29 阅读更多 →
柴油ICE的热管理系统

柴油ICE的热管理系统

一、高温回路二、冷媒回路三、低温回路四、整个回路

2026/10/9 5:25:29 阅读更多 →
GO面试题 Go基础面试题

GO面试题 Go基础面试题

Golang面试题 Go 语言这几年在后端岗位的面试里出现得越来越频繁,尤其是字节、腾讯、美团这类大厂,Go 岗位的面试题难度其实不低。很多人第一次接触 Go 面试会有点懵,语言本身学起来挺快的,但面试要考的那些底层原理,…

2026/10/9 5:24:29 阅读更多 →

最新新闻

基于WPF的AGV上位机执行系统开发实战:从MES集成到多车调度

基于WPF的AGV上位机执行系统开发实战:从MES集成到多车调度

1. 先从业务链条说起:ERP、MES和AGV之间谁指挥谁接到这个项目的时候,客户现场的ERP和MES已经稳定跑了好几年,生产工单、物料清单、工序报工都走得好好的。真正的问题出在物流环节:车间两万多平米,物料转运全靠人工叉车…

2026/10/9 5:59:57 阅读更多 →
基于C#的SPC产品质量在线分析系统:完整源码与实时判异实现

基于C#的SPC产品质量在线分析系统:完整源码与实时判异实现

简介:这是一套面向计算机、自动化等专业学生与从业者的SPC产品质量在线分析系统C#完整源码,可直接用于毕业设计、期末课程设计或课程大作业,也可作为质量管理类桌面应用的入门参考。项目基于Visual Studio 2013与SQL Server 2012开发&#xf…

2026/10/9 5:59:57 阅读更多 →
高性能TCP服务器设计实战:从epoll到内核调优全解析

高性能TCP服务器设计实战:从epoll到内核调优全解析

1. 把“高性能TCP服务器”拆开看:高并发不等于高性能聊到高性能TCP服务器,很多人第一反应是上DPDK、上RDMA、上XDP,好像不搞点内核旁路的东西就不配叫高性能。但我在实际项目里踩过的坑告诉我,大多数业务场景根本用不到那套东西&a…

2026/10/9 5:59:57 阅读更多 →
JavaWeb物流管理系统源码解析:从Controller命名到项目跑通

JavaWeb物流管理系统源码解析:从Controller命名到项目跑通

简介:这份资源是面向JavaWeb初学者与课程设计者的物流管理系统完整项目包,适合用于毕业设计、课程实训或自学练手,帮助理解企业级物流业务从需求到落地的实现路径。压缩包共717个文件,约30.67MB,以java源码、jsp页面、…

2026/10/9 5:59:57 阅读更多 →
OpenClaw:开源多智能体协作框架的本地部署与实战解析

OpenClaw:开源多智能体协作框架的本地部署与实战解析

OpenClaw最近在开发者社区和AI爱好者圈子里刷屏刷得有点凶,GitHub上的star涨得飞快,各大平台的教程也是一夜之间冒出来一堆。我陆续收到好几个朋友私信问这玩意到底是个啥、值不值得折腾。老实说,我第一次看到这个名字的时候也愣了一下&#…

2026/10/9 5:59:57 阅读更多 →
JavaFX模拟磁盘文件系统课设:FAT表与磁盘调度实现指南

JavaFX模拟磁盘文件系统课设:FAT表与磁盘调度实现指南

简介:这份资源是面向高校计算机专业学生的操作系统课程设计完整方案,聚焦模拟磁盘文件系统的实现,适合正在完成课设或希望深入理解存储管理原理的学习者。包内共48个文件,以java源码与class编译文件为核心,辅以fxml界面…

2026/10/9 5:58:57 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

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/8 15:26:32 阅读更多 →
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/8 15:26:40 阅读更多 →
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/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →