skills-ws
Version:
87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.
84 lines (66 loc) • 3.23 kB
Markdown
## Contents
- 8. Express.js Architecture
- Full Production Server Structure
- Critical Express.js Ordering
## 8. Express.js Architecture
### Full Production Server Structure
```
src/
├── index.ts # Entry point (stdio)
├── http-server.ts # Streamable HTTP server (/mcp)
├── auth/
│ ├── middleware.ts # Three-tier auth
│ ├── oauth.ts # OAuth 2.1 bearer verifier (JWKS)
│ ├── rate-limiter.ts # Rate limiting logic
│ └── x402.ts # x402 v2 verify + settle helpers
├── tools/
│ ├── screenshot.ts # Screenshot tool
│ ├── dns.ts # DNS lookup tool
│ ├── whois.ts # WHOIS tool
│ ├── ssl.ts # SSL check tool
│ ├── ocr.ts # OCR tool
│ └── blockchain.ts # EVM tools
├── monitoring/
│ ├── logger.ts # Structured logging
│ └── metrics.ts # Usage metrics per tier
└── config.ts # Environment config
```
### Critical Express.js Ordering
```typescript
// THE ORDER MATTERS. Get this wrong and webhooks break silently.
const app = express();
// 1. Raw body for webhooks — MUST be before express.json()
app.use("/webhooks/stripe", express.raw({ type: "application/json" }));
app.use("/webhooks/github", express.raw({ type: "application/json" }));
// 2. JSON parser for everything else
app.use(express.json({ limit: "1mb" }));
// 3. CORS — fail CLOSED. Never "*", and especially never "*" with credentials:true
// (the browser rejects that combo, and a wildcard on an auth endpoint is unsafe).
const allowedOrigins = (process.env.ALLOWED_ORIGINS || "").split(",").map(s => s.trim()).filter(Boolean);
app.use(cors({
origin: allowedOrigins.length ? allowedOrigins : false, // no env set ⇒ deny all cross-origin
methods: ["GET", "POST", "DELETE", "OPTIONS"],
allowedHeaders: ["Content-Type", "Mcp-Session-Id", "Last-Event-ID", "Authorization", "X-API-Key", "PAYMENT-SIGNATURE", "Accept-Payment"],
exposedHeaders: ["Mcp-Session-Id", "PAYMENT-REQUIRED", "PAYMENT-RESPONSE"],
credentials: true, // safe now: only echoed for explicitly listed origins, never "*"
}));
// 4. Request logging
app.use((req, _res, next) => {
console.log(`${new Date().toISOString()} ${req.method} ${req.path} [${req.ip}]`);
next();
});
// 5. Health check (no auth)
app.get("/health", (_req, res) => res.json({ status: "ok", version: "1.0.0", uptime: process.uptime() }));
// 6. Admin endpoints (admin auth)
// app.get("/admin/stats", adminAuth, statsHandler);
// 7. Webhook endpoints (signature verification, raw body)
// app.post("/webhooks/stripe", stripeWebhookHandler);
// 8. Pricing / docs (public)
// app.get("/pricing", pricingHandler);
// 9. MCP endpoints (three-tier auth) — Streamable HTTP is the default (see §2a/§6).
// app.post("/mcp", mcpPostHandler); // JSON-RPC requests (+ initialize)
// app.get("/mcp", sessionRequest); // server→client SSE stream / resume
// app.delete("/mcp", sessionRequest); // session teardown
// Legacy HTTP+SSE clients only (backward-compat appendix): app.get("/sse", ...); app.post("/messages", ...);
```
---