Протоколот за контекст на моделот (MCP) обезбедува моќен, стандардизиран начин за LLMs да комуницираат со надворешни алатки. How do you secure it? Изложувањето на MCP серверот без безбедност е како да ја оставите предната врата на вашата куќа широко отворена.Секој може да влезе и да ги користи вашите алатки, да пристапи до вашите податоци или да предизвика хаос. Овој водич ќе ве води низ обезбедување на Node.js MCP сервер од нула со користење Ние ќе ги покриеме аутентификацијата (кој сте вие?) и овластувањето (што ви е дозволено да направите?), со практични примероци на код врз основа на овој проект кои може да се најдат на . JSON Web Tokens (JWT) Примери на Azure/mcp-container-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: Визуализирање на безбедносниот тек За визуелни ученици, оваа шема на секвенца го илустрира целосниот тек на аутентификација и овластување: Забелешка за усогласеност со спецификациите на МЦП! Важно е да се напомене дека овој водич обезбедува практична, реалниот свет имплементација за обезбедување на MCP сервер, но тоа не е така. целосно спроведување на . not Официјална спецификација за MCP овластување Оваа имплементација се фокусира на цврст, бездржавен и широко сфатен модел со користење на традиционалните JWTs и контрола на пристапот врз основа на улоги (RBAC), што е доволно за многу случаи на употреба. Сепак, за целосна усогласеност со спецификацијата на MCP, ќе треба да имплементирате дополнителни карактеристики. Во иднина, може да истражиме како да ја прошириме нашата имплементација на JWT за целосно да се усогласиме со спецификацијата на MCP. Ние препорачуваме да се погледне на да останете ажурирани и да добивате известувања за идните подобрувања. Репозиториум на GitHub Чекор 1: Дефинирање на улоги и дозволи Пред да напишеме било кој код, мораме да ги дефинираме нашите безбедносни правила. Какви улоги постојат? Што може секоја улога да направи? Ова е темелот на нашиот систем за овластување. Во нашата Датотеката ја дефинираме и Ова го прави нашиот код јасен, читлив и помалку склоен кон типографија. 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], }; Чекор 2: Креирање на JWT услуга Следно, ни треба централизирана услуга за да се справиме со сета логика поврзана со JWT: создавање нови токени за тестирање и, што е најважно, верификација на влезните токени. Еве го комплетното датотеки. ги користи Библиотека за да се направи тежок лифтинг. 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: Изградба на Middleware за аутентификација A "middleware" е функција која работи Вашиот главен обработувач на барање. Тоа е совршено место за поставување на нашата безбедносна проверка. Овој среден софтвер ќе ги испита сите дојдовни барања, барајте JWT во Header и проверете го тоа. Пред Authorization Ако токенот е валиден, тој ги поврзува информациите на корисникот со објектот на барањето за подоцнежна употреба. грешка и го спречува барањето да продолжи понатаму. 401 Unauthorized За да го направиме овој тип безбеден, исто така ќе ги прошириме експресните Интерфејс за да го вклучите нашиот на објектот. 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 серверот Сега имаме сите парчиња, ајде да ги ставиме заедно за да го заштитиме нашиот сервер. Прво, ние ги применуваме нашите middleware до главната MCP крајна точка во Ова обезбедува Барање за Мора да имате валиден 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 сервер. Дефинирање на јасни улоги и дозволи. Создадена е централизирана услуга за управување со JWTs. Изграден е среден софтвер за заштита на сите дојдовни барања. Присилни гранулирани дозволи на ниво на алатката. Вашиот MCP сервер повеќе не е отворена врата – тоа е безбедна услуга.Од тука, можете да ги проширите овие концепти со додавање на повеќе улоги, повеќе дозволи и уште покомплексна деловна логика на вашиот систем за овластување. Нашата ѕвезда да останете ажурирани и да добивате известувања за идните подобрувања. Репозиториум на GitHub