@coffeerunhobby/mcp-ha-connect 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.env.example +52 -16
  2. package/CLAUDE.md +75 -0
  3. package/Dockerfile +5 -0
  4. package/dist/config.d.ts +10 -0
  5. package/dist/config.js +59 -3
  6. package/dist/config.js.map +1 -1
  7. package/dist/haClient/automations.js +2 -2
  8. package/dist/haClient/automations.js.map +1 -1
  9. package/dist/haClient/calendars.js +1 -1
  10. package/dist/haClient/calendars.js.map +1 -1
  11. package/dist/haClient/request.d.ts +2 -1
  12. package/dist/haClient/request.js +20 -11
  13. package/dist/haClient/request.js.map +1 -1
  14. package/dist/haClient/services.js +1 -1
  15. package/dist/haClient/services.js.map +1 -1
  16. package/dist/haClient/states.js +1 -1
  17. package/dist/haClient/states.js.map +1 -1
  18. package/dist/omadaClient/auth.d.ts +2 -1
  19. package/dist/omadaClient/auth.js +19 -30
  20. package/dist/omadaClient/auth.js.map +1 -1
  21. package/dist/omadaClient/request.d.ts +2 -1
  22. package/dist/omadaClient/request.js +18 -27
  23. package/dist/omadaClient/request.js.map +1 -1
  24. package/dist/server/auth.d.ts +6 -0
  25. package/dist/server/auth.js +22 -10
  26. package/dist/server/auth.js.map +1 -1
  27. package/dist/server/eventSubscription.d.ts +8 -0
  28. package/dist/server/eventSubscription.js +27 -5
  29. package/dist/server/eventSubscription.js.map +1 -1
  30. package/dist/server/http.d.ts +46 -0
  31. package/dist/server/http.js +143 -28
  32. package/dist/server/http.js.map +1 -1
  33. package/dist/server/rateLimiter.d.ts +16 -1
  34. package/dist/server/rateLimiter.js +32 -11
  35. package/dist/server/rateLimiter.js.map +1 -1
  36. package/dist/server/stdio.js +5 -0
  37. package/dist/server/stdio.js.map +1 -1
  38. package/dist/server/stream.d.ts +25 -0
  39. package/dist/server/stream.js +53 -2
  40. package/dist/server/stream.js.map +1 -1
  41. package/dist/tools/common.d.ts +11 -10
  42. package/dist/tools/common.js +20 -2
  43. package/dist/tools/common.js.map +1 -1
  44. package/dist/utils/config-validations.d.ts +7 -0
  45. package/dist/utils/config-validations.js +17 -0
  46. package/dist/utils/config-validations.js.map +1 -1
  47. package/dist/utils/jwt.d.ts +15 -1
  48. package/dist/utils/jwt.js +29 -4
  49. package/dist/utils/jwt.js.map +1 -1
  50. package/dist/utils/sanitizeError.d.ts +1 -0
  51. package/dist/utils/sanitizeError.js +18 -0
  52. package/dist/utils/sanitizeError.js.map +1 -0
  53. package/dist/utils/tlsDispatcher.d.ts +34 -0
  54. package/dist/utils/tlsDispatcher.js +33 -0
  55. package/dist/utils/tlsDispatcher.js.map +1 -0
  56. package/dist/version.d.ts +1 -1
  57. package/dist/version.js +1 -1
  58. package/docker-compose.yml +4 -1
  59. package/docs/CHANGELOG.md +58 -0
  60. package/openapi.json +1 -1
  61. package/package.json +4 -3
  62. package/src/config.ts +83 -3
  63. package/src/haClient/automations.ts +2 -2
  64. package/src/haClient/calendars.ts +1 -1
  65. package/src/haClient/request.ts +23 -11
  66. package/src/haClient/services.ts +1 -1
  67. package/src/haClient/states.ts +1 -1
  68. package/src/omadaClient/auth.ts +20 -28
  69. package/src/omadaClient/request.ts +19 -25
  70. package/src/server/auth.ts +41 -7
  71. package/src/server/eventSubscription.ts +30 -5
  72. package/src/server/http.ts +165 -29
  73. package/src/server/rateLimiter.ts +43 -11
  74. package/src/server/stdio.ts +6 -0
  75. package/src/server/stream.ts +65 -2
  76. package/src/tools/common.ts +23 -2
  77. package/src/utils/config-validations.ts +15 -0
  78. package/src/utils/jwt.ts +47 -4
  79. package/src/utils/sanitizeError.ts +18 -0
  80. package/src/utils/tlsDispatcher.ts +40 -0
  81. package/src/version.ts +1 -1
  82. package/tests/bdd/configuration.spec.ts +3 -0
  83. package/tests/config.test.ts +3 -0
  84. package/tests/resources/index.test.ts +3 -3
  85. package/tests/security/accessControl.test.ts +223 -0
  86. package/tests/security/authentication.test.ts +117 -0
  87. package/tests/security/configuration.test.ts +170 -0
  88. package/tests/security/cryptoTransport.test.ts +136 -0
  89. package/tests/security/dependencies.test.ts +152 -0
  90. package/tests/security/injection.test.ts +117 -0
  91. package/tests/security/insecureDesign.test.ts +122 -0
  92. package/tests/security/logging.test.ts +131 -0
  93. package/tests/security/resourceConsumption.test.ts +133 -0
  94. package/tests/tools/ai/analyzeSensors.test.ts +3 -3
  95. package/tests/tools/common.test.ts +5 -4
  96. package/tests/tools/homeassistant/handlers.test.ts +2 -2
  97. package/tests/tools/omada/handlers.test.ts +3 -3
@@ -6,9 +6,11 @@ import { createServer as createHttpServer } from 'node:http';
6
6
  import { EventSubscriber } from '../haClient/events.js';
7
7
  import { logger } from '../utils/logger.js';
8
8
  import { handleStreamRequest } from './stream.js';
9
- import { handleEventSubscription, getClientCount } from './eventSubscription.js';
9
+ import { handleEventSubscription } from './eventSubscription.js';
10
10
  import { RateLimiter } from './rateLimiter.js';
11
11
  import { createAuthMiddleware } from './auth.js';
12
+ import { Permission, hasPermission, getPermissionNames } from '../permissions/index.js';
13
+ import { sanitizeError } from '../utils/sanitizeError.js';
12
14
  import { VERSION } from '../version.js';
13
15
  // Session storage for stateful mode
14
16
  const sessions = new Map();
@@ -38,19 +40,48 @@ function wrapResponseWithTiming(res) {
38
40
  return { res, startTime };
39
41
  }
40
42
  /**
41
- * Parse JSON body from request
43
+ * Maximum accepted request body size, in bytes (M5 / OWASP API4:2023).
44
+ * 1 MB is comfortably above any legitimate MCP/JSON-RPC or REST payload.
42
45
  */
43
- function parseBody(req) {
46
+ export const MAX_BODY_BYTES = 1024 * 1024;
47
+ /**
48
+ * Parse a JSON request body, enforcing a hard size cap (M5).
49
+ *
50
+ * If the streamed body exceeds `maxBytes` the promise rejects with a 413-tagged
51
+ * error and the socket is destroyed, so an attacker cannot exhaust memory by
52
+ * streaming an unbounded payload. Buffering stops the moment the cap is crossed.
53
+ */
54
+ export function parseBody(req, maxBytes = MAX_BODY_BYTES) {
44
55
  return new Promise((resolve, reject) => {
45
- let body = '';
46
- req.on('data', (chunk) => (body += chunk.toString()));
56
+ const chunks = [];
57
+ let size = 0;
58
+ let aborted = false;
59
+ req.on('data', (chunk) => {
60
+ if (aborted) {
61
+ return;
62
+ }
63
+ const buf = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
64
+ size += buf.length;
65
+ if (size > maxBytes) {
66
+ aborted = true;
67
+ const err = new Error('Request body too large');
68
+ err.statusCode = 413;
69
+ reject(err);
70
+ req.destroy();
71
+ return;
72
+ }
73
+ chunks.push(buf);
74
+ });
47
75
  req.on('end', () => {
48
- if (!body) {
76
+ if (aborted) {
77
+ return;
78
+ }
79
+ if (chunks.length === 0) {
49
80
  resolve(undefined);
50
81
  return;
51
82
  }
52
83
  try {
53
- resolve(JSON.parse(body));
84
+ resolve(JSON.parse(Buffer.concat(chunks).toString('utf8')));
54
85
  }
55
86
  catch (error) {
56
87
  reject(new Error(`Invalid JSON: ${error.message}`));
@@ -59,6 +90,22 @@ function parseBody(req) {
59
90
  req.on('error', reject);
60
91
  });
61
92
  }
93
+ /** Extract a numeric HTTP status from a thrown value, if present. */
94
+ function errorStatusCode(error) {
95
+ const code = error?.statusCode;
96
+ return typeof code === 'number' ? code : undefined;
97
+ }
98
+ /**
99
+ * Apply baseline security response headers (L4 / OWASP A05:2021).
100
+ *
101
+ * Cheap, static defenses applied to every response: block MIME sniffing,
102
+ * forbid framing (clickjacking), and avoid leaking full URLs in the Referer.
103
+ */
104
+ export function applySecurityHeaders(res) {
105
+ res.setHeader('X-Content-Type-Options', 'nosniff');
106
+ res.setHeader('X-Frame-Options', 'DENY');
107
+ res.setHeader('Referrer-Policy', 'no-referrer');
108
+ }
62
109
  /**
63
110
  * Send JSON response with proper Content-Length header
64
111
  */
@@ -70,24 +117,16 @@ function sendJson(res, statusCode, data) {
70
117
  res.end(payload);
71
118
  }
72
119
  /**
73
- * Handle health check endpoint
120
+ * Handle health check endpoint (M7 / OWASP A09:2021).
121
+ *
122
+ * `/health` is unauthenticated (it is on the auth skip-list so container/orchestrator
123
+ * probes can reach it). It therefore returns liveness ONLY — never version, auth
124
+ * method, AI provider URLs, client counts, or any other internal configuration that
125
+ * would aid an unauthenticated attacker fingerprinting the deployment. Operators who
126
+ * need that detail can query the authenticated MCP tools (e.g. `getVersion`).
74
127
  */
75
- function handleHealthCheck(res, config, aiEnabled, eventsEnabled) {
76
- sendJson(res, 200, {
77
- status: 'healthy',
78
- version: VERSION,
79
- transport: 'stream',
80
- stateful: config.stateful,
81
- authMethod: config.authMethod,
82
- aiEnabled,
83
- aiProvider: aiEnabled ? config.aiProvider : undefined,
84
- aiUrl: aiEnabled ? config.aiUrl : undefined,
85
- aiModel: aiEnabled ? config.aiModel : undefined,
86
- eventsEnabled,
87
- eventsPath: eventsEnabled ? config.sseEventsPath : undefined,
88
- eventsConnectedClients: eventsEnabled ? getClientCount() : undefined,
89
- rateLimitEnabled: config.rateLimitEnabled,
90
- });
128
+ export function handleHealthCheck(res) {
129
+ sendJson(res, 200, { status: 'healthy' });
91
130
  }
92
131
  /**
93
132
  * Add CORS headers for REST API endpoints (always enabled for Open WebUI compatibility)
@@ -99,15 +138,61 @@ function addRestApiCors(req, res) {
99
138
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
100
139
  res.setHeader('Access-Control-Max-Age', '86400');
101
140
  }
141
+ /**
142
+ * Resolve the permission a REST `/api/*` route requires.
143
+ *
144
+ * Each route mirrors the `Permission.*` bit of its MCP-tool twin so the REST
145
+ * bridge cannot be used to bypass RBAC (finding H1 / OWASP A01:2021, BFLA).
146
+ * Read routes require QUERY; the service-call route requires CONTROL (matching
147
+ * the `callService` tool). Unknown routes return `null` — the handler falls
148
+ * through to a 404, which needs no permission.
149
+ */
150
+ export function requiredRestPermission(method, pathname) {
151
+ const m = method.toUpperCase();
152
+ if (m === 'GET') {
153
+ if (pathname === '/api/states' ||
154
+ pathname === '/api/sensors' ||
155
+ pathname === '/api/search' ||
156
+ pathname === '/api/version' ||
157
+ /^\/api\/states\/[^/]+$/.test(pathname) ||
158
+ /^\/api\/entities\/[^/]+$/.test(pathname) ||
159
+ /^\/api\/history\/[^/]+$/.test(pathname)) {
160
+ return Permission.QUERY;
161
+ }
162
+ }
163
+ if (m === 'POST' && /^\/api\/services\/[^/]+\/[^/]+$/.test(pathname)) {
164
+ return Permission.CONTROL;
165
+ }
166
+ return null;
167
+ }
102
168
  /**
103
169
  * Handle REST API requests for Open WebUI compatibility
104
170
  * These endpoints translate REST calls to Home Assistant API calls
105
171
  */
106
- async function handleRestApi(req, res, url, client) {
172
+ export async function handleRestApi(req, res, url, client) {
107
173
  // Always add CORS for REST API
108
174
  addRestApiCors(req, res);
109
175
  const parsedUrl = new URL(url, `http://${req.headers.host}`);
110
176
  const pathname = parsedUrl.pathname;
177
+ // H1: enforce RBAC on REST routes before touching Home Assistant.
178
+ const required = requiredRestPermission(req.method ?? 'GET', pathname);
179
+ if (required !== null) {
180
+ // Fail closed: a missing mask grants nothing.
181
+ const userPermissions = req.auth?.extra?.permissions ?? 0;
182
+ if (!hasPermission(userPermissions, required)) {
183
+ logger.warn('REST API permission denied', {
184
+ method: req.method,
185
+ path: pathname,
186
+ required: getPermissionNames(required),
187
+ has: getPermissionNames(userPermissions),
188
+ });
189
+ sendJson(res, 403, {
190
+ error: 'Forbidden',
191
+ message: `This endpoint requires permission: ${getPermissionNames(required).join(', ')}`,
192
+ });
193
+ return;
194
+ }
195
+ }
111
196
  try {
112
197
  // GET /api/states - Get all entity states
113
198
  if (req.method === 'GET' && pathname === '/api/states') {
@@ -190,10 +275,18 @@ async function handleRestApi(req, res, url, client) {
190
275
  sendJson(res, 404, { error: 'API endpoint not found' });
191
276
  }
192
277
  catch (error) {
278
+ // M5: a body that exceeded the size cap surfaces as 413, not a generic 500.
279
+ if (errorStatusCode(error) === 413) {
280
+ if (!res.headersSent) {
281
+ sendJson(res, 413, { error: 'Payload Too Large', message: 'Request body exceeds the size limit' });
282
+ }
283
+ return;
284
+ }
193
285
  logger.error('REST API error', { error, url });
286
+ // M6: log the detail above; never echo raw error text to the client.
194
287
  sendJson(res, 500, {
195
288
  error: 'Internal server error',
196
- message: error instanceof Error ? error.message : String(error),
289
+ message: sanitizeError(error),
197
290
  });
198
291
  }
199
292
  }
@@ -382,6 +475,8 @@ export async function startHttpServer(options) {
382
475
  windowMs: config.rateLimitWindowMs,
383
476
  maxRequests: config.rateLimitMaxRequests,
384
477
  skipPaths: [healthPath, '/openapi.json'],
478
+ // M4: only trust forwarding headers from configured proxies.
479
+ trustedProxies: config.rateLimitTrustedProxies,
385
480
  })
386
481
  : null;
387
482
  // Initialize auth middleware
@@ -390,6 +485,9 @@ export async function startHttpServer(options) {
390
485
  secret: config.authSecret,
391
486
  permissions: config.permissions,
392
487
  skipPaths: [healthPath, '/openapi.json'],
488
+ requireExp: config.authRequireExp,
489
+ issuer: config.authIssuer,
490
+ audience: config.authAudience,
393
491
  });
394
492
  // Initialize event subscriber if SSE events are enabled and HA is configured
395
493
  let eventSubscriber = null;
@@ -425,6 +523,8 @@ export async function startHttpServer(options) {
425
523
  const server = createHttpServer(async (req, originalRes) => {
426
524
  // Wrap response to add Server-Timing header
427
525
  const { res } = wrapResponseWithTiming(originalRes);
526
+ // L4: baseline security headers on every response.
527
+ applySecurityHeaders(res);
428
528
  const url = req.url ?? '/';
429
529
  const urlPath = url.split('?')[0];
430
530
  // Handle OPTIONS (CORS preflight) - add CORS headers for REST API endpoints
@@ -455,7 +555,7 @@ export async function startHttpServer(options) {
455
555
  try {
456
556
  // Health check endpoint
457
557
  if (config.httpEnableHealthcheck && url === healthPath) {
458
- handleHealthCheck(res, config, !!aiClient, !!eventSubscriber);
558
+ handleHealthCheck(res);
459
559
  return;
460
560
  }
461
561
  // SSE Event Subscription endpoint
@@ -500,19 +600,34 @@ export async function startHttpServer(options) {
500
600
  sendJson(res, 404, { error: 'Not found' });
501
601
  }
502
602
  catch (error) {
603
+ // M5: oversize body → 413 rather than a generic 500.
604
+ if (errorStatusCode(error) === 413) {
605
+ if (!res.headersSent) {
606
+ sendJson(res, 413, { error: 'Payload Too Large', message: 'Request body exceeds the size limit' });
607
+ }
608
+ return;
609
+ }
503
610
  logger.error('HTTP request error', {
504
611
  error,
505
612
  method: req.method,
506
613
  url,
507
614
  });
508
615
  if (!res.headersSent) {
616
+ // M6: detail is logged above; the client gets only a generic message.
509
617
  sendJson(res, 500, {
510
618
  error: 'Internal server error',
511
- message: error instanceof Error ? error.message : String(error),
619
+ message: sanitizeError(error),
512
620
  });
513
621
  }
514
622
  }
515
623
  });
624
+ // M5: bound how long a client may take to deliver headers/body so a slow-loris
625
+ // connection cannot tie up a socket indefinitely. These cap request *intake*
626
+ // time, not response duration, so long-lived SSE streams are unaffected.
627
+ server.headersTimeout = 30_000; // 30s to send all request headers
628
+ server.requestTimeout = 60_000; // 60s to deliver the complete request
629
+ server.keepAliveTimeout = 5_000; // 5s idle on a keep-alive connection
630
+ server.maxRequestsPerSocket = 0; // unlimited (default); explicit for clarity
516
631
  // Graceful shutdown handler
517
632
  let isShuttingDown = false;
518
633
  const gracefulShutdown = async (signal) => {
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,13 @@ export interface RateLimitConfig {
8
8
  maxRequests?: number;
9
9
  skipPaths?: string[];
10
10
  keyGenerator?: (req: IncomingMessage) => string;
11
+ /**
12
+ * Immediate-peer IPs whose forwarding headers (CF-Connecting-IP / X-Forwarded-For /
13
+ * X-Real-IP) may be trusted to identify the real client (M4). Empty by default —
14
+ * with no trusted proxy, client-supplied headers are IGNORED and the socket
15
+ * address is used, so a forged header cannot evade limits or grow the bucket map.
16
+ */
17
+ trustedProxies?: string[];
11
18
  }
12
19
  /**
13
20
  * Rate Limiter class
@@ -17,11 +24,19 @@ export declare class RateLimiter {
17
24
  private readonly maxRequests;
18
25
  private readonly skipPaths;
19
26
  private readonly keyGenerator;
27
+ private readonly trustedProxies;
20
28
  private readonly entries;
21
29
  private cleanupInterval;
22
30
  constructor(config?: RateLimitConfig);
31
+ /** First value of a possibly-array header, trimmed; undefined if absent/empty. */
32
+ private firstHeader;
23
33
  /**
24
- * Default key generator - uses IP address
34
+ * Default key generator (M4 / OWASP API4:2023).
35
+ *
36
+ * Client-supplied forwarding headers are honored ONLY when the immediate peer
37
+ * (`socket.remoteAddress`) is a configured trusted proxy. Otherwise we key on the
38
+ * socket address — an attacker cannot forge that, so they can neither evade the
39
+ * limit by rotating X-Forwarded-For nor exhaust memory with unbounded forged keys.
25
40
  */
26
41
  private defaultKeyGenerator;
27
42
  /**
@@ -11,32 +11,53 @@ export class RateLimiter {
11
11
  maxRequests;
12
12
  skipPaths;
13
13
  keyGenerator;
14
+ trustedProxies;
14
15
  entries = new Map();
15
16
  cleanupInterval = null;
16
17
  constructor(config = {}) {
17
18
  this.windowMs = config.windowMs ?? 60000; // 1 minute default
18
19
  this.maxRequests = config.maxRequests ?? 100; // 100 requests per minute
19
20
  this.skipPaths = new Set(config.skipPaths ?? ['/health', '/healthcheck']);
20
- this.keyGenerator = config.keyGenerator ?? this.defaultKeyGenerator;
21
+ this.trustedProxies = new Set(config.trustedProxies ?? []);
22
+ // Bind so a custom generator OR the default both see `this`.
23
+ this.keyGenerator = config.keyGenerator ?? ((req) => this.defaultKeyGenerator(req));
21
24
  // Start cleanup interval to prevent memory leaks
22
25
  this.startCleanup();
23
26
  }
27
+ /** First value of a possibly-array header, trimmed; undefined if absent/empty. */
28
+ firstHeader(value) {
29
+ const v = Array.isArray(value) ? value[0] : value;
30
+ const trimmed = v?.trim();
31
+ return trimmed ? trimmed : undefined;
32
+ }
24
33
  /**
25
- * Default key generator - uses IP address
34
+ * Default key generator (M4 / OWASP API4:2023).
35
+ *
36
+ * Client-supplied forwarding headers are honored ONLY when the immediate peer
37
+ * (`socket.remoteAddress`) is a configured trusted proxy. Otherwise we key on the
38
+ * socket address — an attacker cannot forge that, so they can neither evade the
39
+ * limit by rotating X-Forwarded-For nor exhaust memory with unbounded forged keys.
26
40
  */
27
41
  defaultKeyGenerator(req) {
28
- // Try to get real IP from common proxy headers
29
- const forwardedFor = req.headers['x-forwarded-for'];
30
- if (forwardedFor) {
31
- const ips = Array.isArray(forwardedFor) ? forwardedFor[0] : forwardedFor;
32
- return ips.split(',')[0].trim();
42
+ const socketAddr = req.socket?.remoteAddress ?? 'unknown';
43
+ if (!this.trustedProxies.has(socketAddr)) {
44
+ return socketAddr;
45
+ }
46
+ // Behind a trusted proxy: prefer Cloudflare's single-client CF-Connecting-IP,
47
+ // then the left-most X-Forwarded-For hop, then X-Real-IP.
48
+ const cf = this.firstHeader(req.headers['cf-connecting-ip']);
49
+ if (cf) {
50
+ return cf;
51
+ }
52
+ const xff = this.firstHeader(req.headers['x-forwarded-for']);
53
+ if (xff) {
54
+ return xff.split(',')[0].trim();
33
55
  }
34
- const realIp = req.headers['x-real-ip'];
56
+ const realIp = this.firstHeader(req.headers['x-real-ip']);
35
57
  if (realIp) {
36
- return Array.isArray(realIp) ? realIp[0] : realIp;
58
+ return realIp;
37
59
  }
38
- // Fall back to socket remote address
39
- return req.socket.remoteAddress ?? 'unknown';
60
+ return socketAddr;
40
61
  }
41
62
  /**
42
63
  * Start periodic cleanup of expired entries
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/server/rateLimiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/server/rateLimiter.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,14 @@
4
4
  */
5
5
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
6
  import { logger } from '../utils/logger.js';
7
+ import { setLocalFullTrust } from '../tools/common.js';
7
8
  import { createServer } from './common.js';
8
9
  export async function startStdioServer(options) {
9
10
  logger.info('Starting stdio server');
11
+ // L3: stdio has no per-request auth; the local process owner is trusted. Grant
12
+ // full permissions to tool calls that arrive without an explicit mask. HTTP
13
+ // transports never enable this — they fail closed on a missing mask.
14
+ setLocalFullTrust(true);
10
15
  const server = createServer(options);
11
16
  const transport = new StdioServerTransport();
12
17
  logger.info('Connecting stdio server');
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/server/stdio.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAIjF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2B;IAChE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/server/stdio.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAIjF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2B;IAChE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAErC,+EAA+E;IAC/E,4EAA4E;IAC5E,qEAAqE;IACrE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAClD,CAAC"}
@@ -20,6 +20,31 @@ export interface StreamTransportOptions {
20
20
  aiClient?: LocalAIClient;
21
21
  config: EnvironmentConfig;
22
22
  }
23
+ export interface TransportSecurityOptions {
24
+ allowedOrigins: string[];
25
+ allowedHosts: string[];
26
+ enableDnsRebindingProtection: boolean;
27
+ }
28
+ /**
29
+ * Build the DNS-rebinding protection options for the Streamable HTTP transport
30
+ * (M3 / OWASP A05:2021).
31
+ *
32
+ * Host-header validation is **opt-in**. The SDK only validates the `Host` header
33
+ * when `allowedHosts` is non-empty (EXACT string match), and only validates
34
+ * `Origin` when `allowedOrigins` is non-empty. CORS/Origin enforcement already
35
+ * lives in the HTTP layer, so this helper governs ONLY the Host check and leaves
36
+ * `allowedOrigins` empty to avoid double-enforcing origins at the transport.
37
+ *
38
+ * - `MCP_HTTP_ALLOWED_HOSTS` UNSET → Host validation OFF (protection disabled).
39
+ * This preserves pre-1.3.0 behavior: an upgrade never silently 403s clients
40
+ * that reach the server by a host not listed in the (CORS) origins. The
41
+ * server's own reachable host and its allowed CORS origins are frequently
42
+ * different addresses, so deriving hosts from origins would break real setups.
43
+ * - `MCP_HTTP_ALLOWED_HOSTS` SET → enforce exactly those host[:port] values, plus
44
+ * loopback/bind-address conveniences so on-box health checks and local tools
45
+ * keep working. Any other `Host` header is rejected with a 403.
46
+ */
47
+ export declare function buildTransportSecurityOptions(config: EnvironmentConfig): TransportSecurityOptions;
23
48
  /**
24
49
  * Creates a Streamable HTTP transport
25
50
  * This implements the MCP protocol version 2025-03-26
@@ -6,6 +6,55 @@ import { randomUUID } from 'node:crypto';
6
6
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
7
7
  import { logger } from '../utils/logger.js';
8
8
  import { createServer } from './common.js';
9
+ /**
10
+ * Build the DNS-rebinding protection options for the Streamable HTTP transport
11
+ * (M3 / OWASP A05:2021).
12
+ *
13
+ * Host-header validation is **opt-in**. The SDK only validates the `Host` header
14
+ * when `allowedHosts` is non-empty (EXACT string match), and only validates
15
+ * `Origin` when `allowedOrigins` is non-empty. CORS/Origin enforcement already
16
+ * lives in the HTTP layer, so this helper governs ONLY the Host check and leaves
17
+ * `allowedOrigins` empty to avoid double-enforcing origins at the transport.
18
+ *
19
+ * - `MCP_HTTP_ALLOWED_HOSTS` UNSET → Host validation OFF (protection disabled).
20
+ * This preserves pre-1.3.0 behavior: an upgrade never silently 403s clients
21
+ * that reach the server by a host not listed in the (CORS) origins. The
22
+ * server's own reachable host and its allowed CORS origins are frequently
23
+ * different addresses, so deriving hosts from origins would break real setups.
24
+ * - `MCP_HTTP_ALLOWED_HOSTS` SET → enforce exactly those host[:port] values, plus
25
+ * loopback/bind-address conveniences so on-box health checks and local tools
26
+ * keep working. Any other `Host` header is rejected with a 403.
27
+ */
28
+ export function buildTransportSecurityOptions(config) {
29
+ const explicitHosts = config.httpAllowedHosts ?? [];
30
+ // Opt-out by default: no explicit hosts ⇒ no Host-header validation.
31
+ if (explicitHosts.length === 0) {
32
+ return { allowedOrigins: [], allowedHosts: [], enableDnsRebindingProtection: false };
33
+ }
34
+ const port = config.httpPort ?? 3000;
35
+ const bindAddr = config.httpBindAddr ?? '127.0.0.1';
36
+ const hosts = new Set();
37
+ for (const entry of explicitHosts) {
38
+ try {
39
+ // Accept a full URL form (e.g. https://example.com) → host header form.
40
+ hosts.add(new URL(entry).host);
41
+ }
42
+ catch {
43
+ // Bare hostname / IP[:port] already in host-header form.
44
+ hosts.add(entry);
45
+ }
46
+ }
47
+ // Always permit direct loopback / bind-address access on the listen port.
48
+ for (const host of [bindAddr, 'localhost', '127.0.0.1']) {
49
+ hosts.add(host);
50
+ hosts.add(`${host}:${port}`);
51
+ }
52
+ return {
53
+ allowedOrigins: [],
54
+ allowedHosts: [...hosts],
55
+ enableDnsRebindingProtection: true,
56
+ };
57
+ }
9
58
  /**
10
59
  * Creates a Streamable HTTP transport
11
60
  * This implements the MCP protocol version 2025-03-26
@@ -18,10 +67,12 @@ export function createStreamTransport(options) {
18
67
  if (!enableStatefulSessions) {
19
68
  logger.info('Starting Streamable HTTP transport in stateless mode; Mcp-Session-Id headers are optional');
20
69
  }
70
+ const security = buildTransportSecurityOptions(config);
21
71
  const transport = new StreamableHTTPServerTransport({
22
72
  sessionIdGenerator,
23
- allowedOrigins: config.httpAllowedOrigins,
24
- enableDnsRebindingProtection: true,
73
+ allowedOrigins: security.allowedOrigins,
74
+ allowedHosts: security.allowedHosts,
75
+ enableDnsRebindingProtection: security.enableDnsRebindingProtection,
25
76
  onsessioninitialized: (sessionId) => {
26
77
  logger.info('Session initialized', { sessionId });
27
78
  },
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/server/stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/server/stream.ts"],"names":[],"mappings":"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"}