open-meteo-mcp-server 1.3.1 → 1.4.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.
package/README.md CHANGED
@@ -167,6 +167,19 @@ TRANSPORT=http PORT=3000 npx open-meteo-mcp-server
167
167
 
168
168
  This starts an Express server on the specified port (default: 3000) with the MCP endpoint at `/mcp`. The HTTP transport supports session management with unique session IDs per client.
169
169
 
170
+ For production deployments, enable authentication and rate limiting:
171
+
172
+ ```bash
173
+ API_KEY=your-secret-key RATE_LIMIT_RPM=60 TRANSPORT=http PORT=3000 npx open-meteo-mcp-server
174
+ ```
175
+
176
+ Clients must then include the key in every request:
177
+ ```
178
+ Authorization: Bearer your-secret-key
179
+ # or
180
+ X-API-Key: your-secret-key
181
+ ```
182
+
170
183
  #### Using npm scripts
171
184
 
172
185
  ```bash
@@ -284,6 +297,12 @@ All environment variables are optional and have sensible defaults:
284
297
  - `TRANSPORT` - Transport mode: `http` for Streamable HTTP, omit for stdio (default: stdio)
285
298
  - `PORT` - HTTP server port when using HTTP transport (default: 3000)
286
299
 
300
+ #### HTTP Transport Security (optional)
301
+
302
+ - `API_KEY` - When set, all requests to `/mcp` must include this key via `Authorization: Bearer <key>` or `X-API-Key: <key>`. Leave unset for open access (local/dev mode).
303
+ - `RATE_LIMIT_RPM` - Maximum requests per minute per IP (default: `60`). HTTP transport only.
304
+ - `TRUSTED_PROXIES` - Comma-separated list of trusted proxy IPs or CIDR ranges (e.g. `10.0.0.0/8,172.16.0.0/12`). When set, `X-Forwarded-For` is honoured only for requests originating from these addresses. Leave unset to always use the direct connection IP.
305
+
287
306
  ## Usage Examples
288
307
 
289
308
  ### Geocoding and Location Search
@@ -443,7 +462,8 @@ src/
443
462
  ├── index.ts # MCP server entry point
444
463
  ├── client.ts # HTTP client for Open-Meteo API
445
464
  ├── tools.ts # MCP tool definitions
446
- └── types.ts # Zod validation schemas
465
+ ├── types.ts # Zod validation schemas
466
+ └── security.ts # Auth middleware, rate limiter, IP extraction
447
467
  ```
448
468
 
449
469
  ## API Coverage
@@ -485,7 +505,6 @@ The server provides comprehensive error handling with detailed error messages fo
485
505
  ## Performance
486
506
 
487
507
  - Efficient HTTP client with connection pooling
488
- - Request caching for repeated queries
489
508
  - Optimized data serialization
490
509
  - Minimal memory footprint
491
510
 
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/
9
9
  import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
10
10
  import express from 'express';
11
11
  import { OpenMeteoClient } from './client.js';
12
+ import { createAuthMiddleware, createRateLimiter, generateSessionId, getClientIp, sanitizeErrorMessage, } from './security.js';
12
13
  import { ALL_TOOLS } from './tools.js';
13
14
  import { AirQualityParamsSchema, ArchiveParamsSchema, ClimateParamsSchema, EcmwfParamsSchema, ElevationParamsSchema, EnsembleParamsSchema, FloodParamsSchema, ForecastParamsSchema, GeocodingParamsSchema, MarineParamsSchema, SeasonalParamsSchema, } from './types.js';
14
15
  const __filename = fileURLToPath(import.meta.url);
@@ -18,16 +19,6 @@ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-
18
19
  function log(level, event, data = {}) {
19
20
  process.stderr.write(`${JSON.stringify({ timestamp: new Date().toISOString(), level, event, ...data })}\n`);
20
21
  }
21
- // Extracts real client IP, respecting X-Forwarded-For for CDN/proxy setups
22
- function getClientIp(req) {
23
- const xff = req.headers['x-forwarded-for'];
24
- if (xff) {
25
- const first = Array.isArray(xff) ? xff[0] : xff;
26
- const raw = first ?? '';
27
- return (raw.split(',')[0] ?? raw).trim();
28
- }
29
- return req.ip ?? req.socket?.remoteAddress ?? 'unknown';
30
- }
31
22
  class OpenMeteoMCPServer {
32
23
  client;
33
24
  sessionServers = new Map();
@@ -213,21 +204,15 @@ class OpenMeteoMCPServer {
213
204
  req.headers.accept = tokens.join(', ');
214
205
  next();
215
206
  });
216
- // Generate unique session IDs for each client
217
- const sessionIdGenerator = () => {
218
- const timestamp = Date.now().toString(36);
219
- const random1 = Math.random().toString(36).substring(2, 15);
220
- const random2 = Math.random().toString(36).substring(2, 15);
221
- const random3 = Math.random().toString(36).substring(2, 15);
222
- return `${timestamp}-${random1}-${random2}-${random3}`;
223
- };
207
+ app.use(createRateLimiter());
208
+ app.use(createAuthMiddleware());
224
209
  app.post('/mcp', async (req, res) => {
225
210
  const remoteIp = getClientIp(req);
226
211
  const userAgent = req.headers['user-agent'] ?? 'unknown';
227
212
  try {
228
213
  const method = req.body?.method || 'unknown';
229
- // Extract session ID from headers
230
- const sessionId = (req.headers['mcp-session-id'] || req.headers['Mcp-Session-Id']);
214
+ // Extract session ID from headers (Express normalises headers to lowercase)
215
+ const sessionId = req.headers['mcp-session-id'];
231
216
  log('info', 'http_request', {
232
217
  method,
233
218
  session_id: sessionId ? sessionId.substring(0, 8) : null,
@@ -250,7 +235,7 @@ class OpenMeteoMCPServer {
250
235
  return;
251
236
  }
252
237
  // Generate a new session ID
253
- const newSessionId = sessionIdGenerator();
238
+ const newSessionId = generateSessionId();
254
239
  log('info', 'session_created', { session_id: newSessionId.substring(0, 8) });
255
240
  // Create server and transport for this new session
256
241
  const server = this.createServer();
@@ -314,7 +299,7 @@ class OpenMeteoMCPServer {
314
299
  jsonrpc: '2.0',
315
300
  error: {
316
301
  code: -32603,
317
- message: `Internal error: ${errorMessage}`,
302
+ message: sanitizeErrorMessage(err),
318
303
  },
319
304
  id: req.body?.id || null,
320
305
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { NextFunction, Request, Response } from 'express';
2
+ /**
3
+ * Generates a cryptographically secure session ID using the Web Crypto API
4
+ * (built-in since Node.js 14.17). Never use Math.random() for session IDs.
5
+ */
6
+ export declare function generateSessionId(): string;
7
+ /**
8
+ * Express middleware that enforces API key authentication when the API_KEY
9
+ * environment variable is set. When API_KEY is not configured, all requests
10
+ * are allowed through (development/local mode).
11
+ *
12
+ * Accepts the key via:
13
+ * - Authorization: Bearer <key>
14
+ * - X-API-Key: <key>
15
+ */
16
+ export declare function createAuthMiddleware(): (req: Request, res: Response, next: NextFunction) => void;
17
+ /**
18
+ * Returns a safe, generic error message for HTTP responses.
19
+ * Never expose internal error details (stack traces, connection strings,
20
+ * internal hostnames) to clients.
21
+ */
22
+ export declare function sanitizeErrorMessage(_err: unknown): string;
23
+ /**
24
+ * Returns the real client IP, respecting X-Forwarded-For only when the
25
+ * direct connection comes from a trusted proxy (TRUSTED_PROXIES env var).
26
+ *
27
+ * TRUSTED_PROXIES: comma-separated list of IPs or CIDR ranges.
28
+ * e.g. "10.0.0.0/8,192.168.1.1"
29
+ *
30
+ * When TRUSTED_PROXIES is not set, X-Forwarded-For is always ignored to
31
+ * prevent IP spoofing.
32
+ */
33
+ export declare function getClientIp(req: Request): string;
34
+ /**
35
+ * Creates an express-rate-limit middleware.
36
+ * Reads RATE_LIMIT_RPM from env (default: 60 requests per minute).
37
+ * Uses trusted-proxy-aware IP extraction for the key.
38
+ */
39
+ export declare function createRateLimiter(): import("express-rate-limit").RateLimitRequestHandler;
40
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG/D;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,KAC1B,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAqB/D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE1D;AAyBD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAoBhD;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,yDAWhC"}
@@ -0,0 +1,115 @@
1
+ import rateLimit from 'express-rate-limit';
2
+ /**
3
+ * Generates a cryptographically secure session ID using the Web Crypto API
4
+ * (built-in since Node.js 14.17). Never use Math.random() for session IDs.
5
+ */
6
+ export function generateSessionId() {
7
+ return crypto.randomUUID();
8
+ }
9
+ /**
10
+ * Express middleware that enforces API key authentication when the API_KEY
11
+ * environment variable is set. When API_KEY is not configured, all requests
12
+ * are allowed through (development/local mode).
13
+ *
14
+ * Accepts the key via:
15
+ * - Authorization: Bearer <key>
16
+ * - X-API-Key: <key>
17
+ */
18
+ export function createAuthMiddleware() {
19
+ return (req, res, next) => {
20
+ const apiKey = process.env.API_KEY;
21
+ // No API_KEY configured → open mode (local / dev)
22
+ if (!apiKey) {
23
+ next();
24
+ return;
25
+ }
26
+ const bearer = req.headers.authorization?.startsWith('Bearer ')
27
+ ? req.headers.authorization.slice(7)
28
+ : undefined;
29
+ const headerKey = req.headers['x-api-key'];
30
+ if (bearer === apiKey || headerKey === apiKey) {
31
+ next();
32
+ return;
33
+ }
34
+ res.status(401).json({ error: 'Unauthorized: valid API key required' });
35
+ };
36
+ }
37
+ /**
38
+ * Returns a safe, generic error message for HTTP responses.
39
+ * Never expose internal error details (stack traces, connection strings,
40
+ * internal hostnames) to clients.
41
+ */
42
+ export function sanitizeErrorMessage(_err) {
43
+ return 'Internal server error';
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Trusted-proxy-aware IP extraction
47
+ // ---------------------------------------------------------------------------
48
+ /** Converts an IPv4 address string to a 32-bit integer. */
49
+ function ipToInt(ip) {
50
+ return ip.split('.').reduce((acc, octet) => (acc << 8) | parseInt(octet, 10), 0) >>> 0;
51
+ }
52
+ /** Returns true if `ip` matches the given CIDR (e.g. "10.0.0.0/8") or exact IP. */
53
+ function ipMatchesCidr(ip, cidr) {
54
+ if (!cidr.includes('/'))
55
+ return ip === cidr;
56
+ const [network, prefixStr] = cidr.split('/');
57
+ if (!network || prefixStr === undefined)
58
+ return false;
59
+ const prefix = parseInt(prefixStr, 10);
60
+ const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;
61
+ return (ipToInt(ip) & mask) === (ipToInt(network) & mask);
62
+ }
63
+ function isIpTrusted(ip, trustedList) {
64
+ return trustedList.some((cidr) => ipMatchesCidr(ip, cidr));
65
+ }
66
+ /**
67
+ * Returns the real client IP, respecting X-Forwarded-For only when the
68
+ * direct connection comes from a trusted proxy (TRUSTED_PROXIES env var).
69
+ *
70
+ * TRUSTED_PROXIES: comma-separated list of IPs or CIDR ranges.
71
+ * e.g. "10.0.0.0/8,192.168.1.1"
72
+ *
73
+ * When TRUSTED_PROXIES is not set, X-Forwarded-For is always ignored to
74
+ * prevent IP spoofing.
75
+ */
76
+ export function getClientIp(req) {
77
+ const socketIp = req.ip ?? req.socket?.remoteAddress ?? 'unknown';
78
+ const trustedProxies = process.env.TRUSTED_PROXIES;
79
+ if (trustedProxies) {
80
+ const trustedList = trustedProxies
81
+ .split(',')
82
+ .map((s) => s.trim())
83
+ .filter(Boolean);
84
+ if (socketIp !== 'unknown' && isIpTrusted(socketIp, trustedList)) {
85
+ const xff = req.headers['x-forwarded-for'];
86
+ if (xff) {
87
+ const raw = Array.isArray(xff) ? (xff[0] ?? '') : xff;
88
+ const first = raw.split(',')[0]?.trim();
89
+ if (first)
90
+ return first;
91
+ }
92
+ }
93
+ }
94
+ return socketIp;
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Rate limiter
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Creates an express-rate-limit middleware.
101
+ * Reads RATE_LIMIT_RPM from env (default: 60 requests per minute).
102
+ * Uses trusted-proxy-aware IP extraction for the key.
103
+ */
104
+ export function createRateLimiter() {
105
+ const rpm = parseInt(process.env.RATE_LIMIT_RPM ?? '60', 10);
106
+ const max = Number.isFinite(rpm) && rpm > 0 ? rpm : 60;
107
+ return rateLimit({
108
+ windowMs: 60_000,
109
+ max,
110
+ standardHeaders: true,
111
+ legacyHeaders: false,
112
+ keyGenerator: (req) => getClientIp(req),
113
+ });
114
+ }
115
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-meteo-mcp-server",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "Model Context Protocol server for Open-Meteo weather APIs",
5
5
  "main": "dist/index.js",
6
6
  "bin": {