The Model Context Protocol (MCP) ապահովում է հզոր, ստանդարտել ճանապարհ է LLMs ինտեգրել արտաքին գործիքների հետ: Բայց այն ժամանակ, երբ դուք փոխվել է տեղական մոդել է իրական աշխարհում ծրագրային, մի կարեւոր հարց է: How do you secure it? MCP- ի սերվերի բացառումը առանց անվտանգության, ինչպիսիք են ձեր տանիքի տանիքի տանիքը լայնորեն բացվել: Ոչ ոք կարող է գնել եւ օգտագործել ձեր գործիքները, հասնել ձեր տվյալները, կամ վտանգավորել: Այս մեթոդը կօգնի ձեզ ապահովել Node.js MCP սերվեր, օգտագործելով Մենք կպահել ենք հավելվածությունը (որ եք?) եւ հավելվածությունը (հա թե ինչ կարող եք անել?), ինչպես նաեւ գործնական կոդը նմուշներ, որոնք հիմնված են այս նախագծի վրա, որոնք կարող են գտնվել: . JSON Web Tokens (JWT) Azure- նամակներ / mcp-containers-ts Արդյունքը: Արդյոք ոչ մի պաշտպանված է Մեր նպատակն է ստանալ հիմնական MCP սերվեր եւ ավելացնել ուժեղ անվտանգության մակերեսը, որը: every request to ensure it comes from a known user. Authenticates the user, granting them specific permissions based on their role (e.g., vs. ). Authorizes admin readonly individual tools, so only authorized users can access them. Protects Ինչո՞ւ JWT- ը լավ է MCP անվտանգության համար JWT- ը արդյունաբերության ստանդարտ է APIs- ի ապահովման համար, եւ այն հարմար է MCP սերվերի համար մի քանի հիմնական պատճառների համար: Each JWT contains all the information needed to verify a user. The server doesn't need to store session information, which makes it highly scalable—perfect for handling many concurrent requests from AI agents. Stateless: A JWT can carry user details, their role, and specific permissions directly within its payload. Self-Contained: JWTs are digitally signed. If a token is modified in any way, the signature becomes invalid, and the server will reject it. Tamper-Proof: A single JWT can be used to access multiple secured services, which is common in microservice architectures. Portable: Տեսագրություն Security Flow Օգտագործվողների համար, այս սխալների սխալը ցույց է տալիս ամբողջական հավելվածության եւ հավելվածության թռիչք: MCP Specification Compliance-ի մասին տեղեկատվություն! Դա կարեւոր է իմանալ, որ այս ուղեցույցը ապահովում է MCP- ի սերվերի անվտանգության գործառույթը, բայց դա Բարձրորեն իրականացնում է . not MCP- ի գրասենյակը Այս մատակարարման կենտրոնում է հզոր, անսահմանափակ եւ լայնորեն հասանելի մոդել, որը օգտագործում է հիմնական JWTs- ում եւ role-based access control (RBAC) - ում, որը բավական է բազմաթիվ օգտագործման պայմանների համար: Բայց MCP- ի մատակարարման համար պետք է մատակարարել լրացուցիչ գործառույթներ: Հաջորդ հոդվածում, մենք կարող ենք ուսումնասիրել, թե ինչպես կարող ենք մեր JWT- ի մատակարարման լայնացնել, որպեսզի բոլորը մատակարարել MCP- ի մատակարարման համար: Մենք առաջարկում ենք տեսնել Տեղադրել եւ ստանալ տեղեկություններ ապագա բարելավությունների մասին. GitHub-ի վերահսկողություն Step 1: Տպագրություն Roles and Permissions Երբ ցանկացած կոդը գրել է, մենք պետք է սահմանենք մեր անվտանգության պայմանները: Ի՞նչ գործերը ունենք: Ի՞նչ կարող է անել յուրաքանչյուր գործը: Սա մեր հաստատման համակարգի հիմնադրամ է: Մեր Ֆիլմը, մենք defined եւ Այսպիսով մեր կոդը հուսալի է, հուսալի է եւ հուսալի է տպագրելու համար: src/auth/authorization.ts UserRole Permission // src/auth/authorization.ts export enum UserRole { ADMIN = "admin", USER = "user", READONLY = "readonly", } export enum Permission { CREATE_TODOS = "create:todos", READ_TODOS = "read:todos", UPDATE_TODOS = "update:todos", DELETE_TODOS = "delete:todos", LIST_TOOLS = "list:tools", } // This interface defines the structure of our authenticated user export interface AuthenticatedUser { id: string; role: UserRole; permissions: Permission[]; } // A simple map to assign default permissions to each role const rolePermissions: Record<UserRole, Permission[]> = { [UserRole.ADMIN]: Object.values(Permission), // Admin gets all permissions [UserRole.USER]: [ Permission.CREATE_TODOS, Permission.READ_TODOS, Permission.UPDATE_TODOS, Permission.LIST_TOOLS, ], [UserRole.READONLY]: [Permission.READ_TODOS, Permission.LIST_TOOLS], }; Հաջորդ: JWT ծառայությունը ստեղծում է Հաջորդը, մենք պետք է կենտրոնացած ծառայություն, որը աշխատում է բոլոր JWT- ի հետ կապված logic- ի: ստեղծել նոր tokens փորձարկման համար եւ, ամենամեծ կարեւորը, վերահսկել ներքին tokens. Այստեղ է ամբողջական Ֆիլմը օգտագործվում է Գրասենյակը հզոր է տվել. src/auth/jwt.ts jsonwebtoken // src/auth/jwt.ts import * as jwt from "jsonwebtoken"; import { AuthenticatedUser, getPermissionsForRole, UserRole, } from "./authorization.js"; // These values should come from environment variables for security const JWT_SECRET = process.env.JWT_SECRET!; const JWT_AUDIENCE = process.env.JWT_AUDIENCE!; const JWT_ISSUER = process.env.JWT_ISSUER!; const JWT_EXPIRY = process.env.JWT_EXPIRY || "2h"; if (!JWT_SECRET || !JWT_AUDIENCE || !JWT_ISSUER) { throw new Error("JWT environment variables are not set!"); } /** * Generates a new JWT for a given user payload. * Useful for testing or generating tokens on demand. */ export function generateToken( user: Partial<AuthenticatedUser> & { id: string } ): string { const payload = { id: user.id, role: user.role || UserRole.USER, permissions: user.permissions || getPermissionsForRole(user.role || UserRole.USER), }; return jwt.sign(payload, JWT_SECRET, { algorithm: "HS256", expiresIn: JWT_EXPIRY, audience: JWT_AUDIENCE, issuer: JWT_ISSUER, }); } /** * Verifies an incoming JWT and returns the authenticated user payload if valid. */ export function verifyToken(token: string): AuthenticatedUser { try { const decoded = jwt.verify(token, JWT_SECRET, { algorithms: ["HS256"], audience: JWT_AUDIENCE, issuer: JWT_ISSUER, }) as jwt.JwtPayload; // Ensure the decoded token has the fields we expect if (typeof decoded.id !== "string" || typeof decoded.role !== "string") { throw new Error("Token payload is missing required fields."); } return { id: decoded.id, role: decoded.role as UserRole, permissions: decoded.permissions || [], }; } catch (error) { // Log the specific error for debugging, but return a generic message console.error("JWT verification failed:", error.message); if (error instanceof jwt.TokenExpiredError) { throw new Error("Token has expired."); } if (error instanceof jwt.JsonWebTokenError) { throw new Error("Invalid token."); } throw new Error("Could not verify token."); } } Արդյունք 3: Բարձրացնել Authentication Middleware «Middleware» մի գործառույթ է, որը աշխատում է Ձեր հիմնական պահանջի վերահսկողը: Դա կատարյալ վայր է մեր անվտանգության վերահսկողության համար: Այս middleware- ը պետք է վերահսկել բոլոր ստացած պահանջները, տեսնել JWT- ը Header, եւ ստուգեք այն. Նախորդ Authorization Եթե token- ը ճշգրիտ է, ապա այն օգտագործողի տվյալները մուտքագրում է պահանջի նյութը հետո օգտագործման համար: Եթե ոչ, ապա այն անմիջապես ուղարկել է սխալ է, եւ կանգնեցնում է պահանջը ավելացնել. 401 Unauthorized Այս տպագրության ապահովման համար մենք կարող ենք նաեւ լայնացնել Express- ի Interface- ը ներառում է մեր Հիմնական Object Request user // src/server-middlewares.ts import { Request, Response, NextFunction } from "express"; import { verifyToken, AuthenticatedUser } from "./auth/jwt.js"; // Extend the global Express Request interface to add our custom 'user' property declare global { namespace Express { interface Request { user?: AuthenticatedUser; } } } export function authenticateJWT( req: Request, res: Response, next: NextFunction ): void { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith("Bearer ")) { res.status(401).json({ error: "Authentication required", message: "Authorization header with 'Bearer' scheme must be provided.", }); return; } const token = authHeader.substring(7); // Remove "Bearer " try { const userPayload = verifyToken(token); req.user = userPayload; // Attach user payload to the request next(); // Proceed to the next middleware or request handler } catch (error) { res.status(401).json({ error: "Invalid token", message: error.message, }); } } 4-րդ քայլ: MCP Server- ի պաշտպանություն Այժմ մենք ունենք բոլոր բաղադրիչները. Տեսենք այն միասին, որպեսզի պաշտպանենք մեր սերվերը: Առաջին, մենք օգտագործում ենք մեր Հիմնական MCP Endpoint Սա ապահովում է Խնդրում ենք Դա պետք է լինել valid JWT. authenticateJWT src/index.ts every /mcp // src/index.ts // ... other imports import { authenticateJWT } from "./server-middlewares.js"; // ... const MCP_ENDPOINT = "/mcp"; const app = express(); // Apply security middleware ONLY to the MCP endpoint app.use(MCP_ENDPOINT, authenticateJWT); // ... rest of the file Հաջորդը, մենք կունենենք մեր մանրամասները: Տեսենք, որ Գործընթացներ Մենք կարող ենք փոխել այն, որպեսզի ստուգել, թե ինչ է հավատալված օգտագործողը: Արդյոք, երբ դուք կարող եք վերադարձնել գործիքների ցուցակը. ListTools src/server.ts Permission.LIST_TOOLS // src/server.ts // ... other imports import { hasPermission, Permission } from "./auth/authorization.js"; // ... inside the StreamableHTTPServer class private setupServerRequestHandlers() { this.server.setRequestHandler(ListToolsRequestSchema, async (request) => { // The user is attached to the request by our middleware const user = this.currentUser; // 1. Check for an authenticated user if (!user) { return this.createRPCErrorResponse("Authentication required."); } // 2. Check if the user has the specific permission to list tools if (!hasPermission(user, Permission.LIST_TOOLS)) { return this.createRPCErrorResponse( "Insufficient permissions to list tools." ); } // 3. If checks pass, filter tools based on user's permissions const allowedTools = TodoTools.filter((tool) => { const requiredPermissions = this.getToolRequiredPermissions(tool.name); // The user must have at least one of the permissions required for the tool return requiredPermissions.some((p) => hasPermission(user, p)); }); return { jsonrpc: "2.0", tools: allowedTools, }; }); // ... other request handlers } Այս փոխանակման հետ, մի օգտագործողի հետ Գործիքները կարող են տեղադրվել, բայց օգտագործողը չի կարող տեղադրել Արդյոք մուտքագրման թույլ կտենա. readonly LIST_TOOLS Հետեւություն եւ հաջորդ քայլեր Շնորհակալություն! Դուք հաջողությամբ տեղադրել եք հզոր ճշգրիտման եւ ճշգրիտման մակերեսը ձեր MCP սերվերի համար: Հետեւելով այս քայլերը, դուք ունեք: Տեղադրված են հուսալի գործառույթներ եւ թույլականեր: Տեղադրվել է JWT-ների կառավարման կենտրոնացած ծառայություն: Բարձրացվել է middleware- ը, որը պաշտպանում է բոլոր մուտքագրված պահանջները: Գործիքային մակարդակում պահանջված granular հզորություններ. Ձեր MCP սերվորը դեռ չի բաց է, դա անվտանգ ծառայություն: Այստեղից, դուք կարող եք լայնացնել այդ պտուտակները, ավելացնել ավելի գործառույթներ, ավելի իրավունքներ, եւ նույնիսկ ավելի հարմարավետ բիզնես ռեժիմը ձեր հաստատման համակարգին: Մեր գիշեր Տեղադրել եւ ստանալ տեղեկություններ ապագա բարելավությունների մասին. GitHub-ի վերահսկողություն