mcp-app-architecture
Best practices and guidelines for bootstrapping, defining modules, using dependency injection, managing server lifecycles, and…
Best practices for implementing JWT, API Keys, OAuth 2.1, and RBAC in a NitroStack application.
Claude Code
$ npx -y skills add nitrocloudofficial/nitrostack --skill auth-security --agent claude-code
Codex
$ npx skills add nitrocloudofficial/nitrostack --skill auth-security -a codex -y
Cursor
$ npx skills add nitrocloudofficial/nitrostack --skill auth-security -a cursor -y
Gemini CLI
$ npx skills add nitrocloudofficial/nitrostack --skill auth-security -a gemini-cli -y
GitHub Copilot
$ npx skills add nitrocloudofficial/nitrostack --skill auth-security -a github-copilot -y
OpenCode
$ npx skills add nitrocloudofficial/nitrostack --skill auth-security -a opencode -y
Windsurf
$ npx skills add nitrocloudofficial/nitrostack --skill auth-security -a windsurf -y
name: nitrostack-auth-security description: Best practices for implementing JWT, API Keys, OAuth 2.1, and RBAC in a NitroStack application.
Use this skill when configuring security modules, implementing user authentication, restricting tool access via guards, or handling sensitive tokens.
---
To secure tools with JWT authentication:
import { JWTModule, Module, McpApp } from '@nitrostack/core';
@McpApp({
server: { name: 'my-server', version: '1.0.0' }
})
@Module({
imports: [
JWTModule.forRoot({
secret: process.env.JWT_SECRET!,
expiresIn: '7d',
}),
]
})
export class AppModule {}import { Guard, ExecutionContext, Injectable, ConfigService } from '@nitrostack/core';
import * as jwt from 'jsonwebtoken';
@Injectable()
export class JWTGuard implements Guard {
constructor(private config: ConfigService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const token = this.extractToken(context);
if (!token) return false;
try {
const secret = this.config.get('JWT_SECRET');
const payload = jwt.verify(token, secret) as any;
context.auth = {
subject: payload.sub,
role: payload.role,
token,
};
return true;
} catch {
return false;
}
}
private extractToken(context: ExecutionContext): string | null {
const auth = context.metadata?.authorization;
if (auth?.startsWith('Bearer ')) {
return auth.substring(7);
}
return null;
}
}---
Use `ApiKeyModule` for service-to-service validation.
import { ApiKeyModule, Module } from '@nitrostack/core';
@Module({
imports: [
ApiKeyModule.forRoot({
keysEnvPrefix: 'API_KEY', // Reads API_KEY_1, API_KEY_2, etc.
headerName: 'x-api-key',
hashed: false,
}),
]
})
export class AppModule {}import { Guard, ExecutionContext, ApiKeyModule } from '@nitrostack/core';
export class ApiKeyGuard implements Guard {
async canActivate(context: ExecutionContext): Promise<boolean> {
const apiKey = context.metadata?.['x-api-key'] || context.metadata?.apiKey;
if (!apiKey) return false;
const isValid = await ApiKeyModule.validate(apiKey as string);
if (isValid) {
context.auth = {
subject: `apikey_${(apiKey as string).substring(0, 10)}`,
scopes: ['*'],
};
return true;
}
return false;
}
}---
Chain guards sequentially to implement user-role authorization.
import { Injectable, Guard, ExecutionContext, UseGuards, Tool, z } from '@nitrostack/core';
import { JWTGuard } from './jwt.guard.js';
@Injectable()
export class AdminGuard implements Guard {
async canActivate(context: ExecutionContext): Promise<boolean> {
// Requires JWTGuard to have populated context.auth first
return context.auth?.role === 'admin';
}
}
// Applying chained guards to a tool
export class SystemTools {
@Tool({
name: 'reset_database',
description: 'Dangerous action: wipes database. Admin only.',
inputSchema: z.object({}),
})
@UseGuards(JWTGuard, AdminGuard) // Chain auth first, then role check
async resetDatabase() {
return { success: true };
}
}The full-stack TypeScript framework to build, test, and deploy production-ready MCP servers and AI-native apps.
Best practices and guidelines for bootstrapping, defining modules, using dependency injection, managing server lifecycles, and…
Best practices for implementing and applying Guards, Interceptors, Middleware, Pipes, and Exception Filters in the NitroStack SDK.
Guidelines and patterns for defining Tools, Resources, and Prompts in a NitroStack application with schema validation via Zod,…
Best practices for linking tools to interactive frontend widgets using @Widget and @nitrostack/widgets SDK (including state sync,…
Prisma ORM CLI commands reference covering init, generate, migrate, db, dev, studio, validate, format, debug, and mcp. Use for…
Prisma Client API reference covering model queries, filters, operators, and client methods. Use when writing database queries,…
SpacetimeDB CLI reference for initializing projects, building modules, publishing databases, querying data, and managing servers