@etm-professional-control/winccoa-mcp-server 1.0.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/.env.example +72 -0
- package/README.md +92 -0
- package/build/config/server.config.d.ts +52 -0
- package/build/config/server.config.d.ts.map +1 -0
- package/build/config/server.config.js +87 -0
- package/build/config/server.config.js.map +1 -0
- package/build/index_http.d.ts +2 -0
- package/build/index_http.d.ts.map +1 -0
- package/build/index_http.js +299 -0
- package/build/index_http.js.map +1 -0
- package/build/index_stdio.d.ts +2 -0
- package/build/index_stdio.d.ts.map +1 -0
- package/build/index_stdio.js +27 -0
- package/build/index_stdio.js.map +1 -0
- package/build/server.d.ts +12 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +211 -0
- package/build/server.js.map +1 -0
- package/build/tool_loader.d.ts +14 -0
- package/build/tool_loader.d.ts.map +1 -0
- package/build/tool_loader.js +63 -0
- package/build/tool_loader.js.map +1 -0
- package/build/tools/datapoints/dp_basic.d.ts +8 -0
- package/build/tools/datapoints/dp_basic.d.ts.map +1 -0
- package/build/tools/datapoints/dp_basic.js +148 -0
- package/build/tools/datapoints/dp_basic.js.map +1 -0
- package/build/tools/datapoints/dp_create.d.ts +8 -0
- package/build/tools/datapoints/dp_create.d.ts.map +1 -0
- package/build/tools/datapoints/dp_create.js +99 -0
- package/build/tools/datapoints/dp_create.js.map +1 -0
- package/build/tools/datapoints/dp_set.d.ts +8 -0
- package/build/tools/datapoints/dp_set.d.ts.map +1 -0
- package/build/tools/datapoints/dp_set.js +55 -0
- package/build/tools/datapoints/dp_set.js.map +1 -0
- package/build/tools/datapoints/dp_types.d.ts +8 -0
- package/build/tools/datapoints/dp_types.d.ts.map +1 -0
- package/build/tools/datapoints/dp_types.js +45 -0
- package/build/tools/datapoints/dp_types.js.map +1 -0
- package/build/utils/helpers.d.ts +35 -0
- package/build/utils/helpers.d.ts.map +1 -0
- package/build/utils/helpers.js +96 -0
- package/build/utils/helpers.js.map +1 -0
- package/config/demo-project-instructions.md +36 -0
- package/config/server.config.d.ts +78 -0
- package/config/server.config.d.ts.map +1 -0
- package/package.json +67 -0
- package/src/fields/default.md +56 -0
- package/src/fields/oil.md +56 -0
- package/src/fields/transport.md +79 -0
package/.env.example
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# MCP Server Configuration for WinCC OA
|
|
2
|
+
# Copy this file to .env and configure for your deployment
|
|
3
|
+
|
|
4
|
+
# ====================
|
|
5
|
+
# REQUIRED SETTINGS
|
|
6
|
+
# ====================
|
|
7
|
+
|
|
8
|
+
# API Token for authentication (REQUIRED - no default for security)
|
|
9
|
+
# Generate a secure token: openssl rand -hex 32
|
|
10
|
+
MCP_API_TOKEN=
|
|
11
|
+
|
|
12
|
+
# ====================
|
|
13
|
+
# SERVER CONFIGURATION
|
|
14
|
+
# ====================
|
|
15
|
+
|
|
16
|
+
# Server Mode: 'http' or 'stdio'
|
|
17
|
+
MCP_MODE=http
|
|
18
|
+
|
|
19
|
+
# HTTP Server Settings
|
|
20
|
+
MCP_HTTP_PORT=3000
|
|
21
|
+
MCP_HTTP_HOST=0.0.0.0
|
|
22
|
+
|
|
23
|
+
# Authentication Type: 'bearer' or 'api-key'
|
|
24
|
+
MCP_AUTH_TYPE=bearer
|
|
25
|
+
|
|
26
|
+
# ====================
|
|
27
|
+
# SECURITY SETTINGS
|
|
28
|
+
# ====================
|
|
29
|
+
|
|
30
|
+
# Rate Limiting
|
|
31
|
+
RATE_LIMIT_ENABLED=true
|
|
32
|
+
RATE_LIMIT_WINDOW_MS=60000
|
|
33
|
+
RATE_LIMIT_MAX=100
|
|
34
|
+
|
|
35
|
+
# IP Filtering (comma-separated lists)
|
|
36
|
+
IP_FILTER_ENABLED=false
|
|
37
|
+
IP_WHITELIST=
|
|
38
|
+
IP_BLACKLIST=
|
|
39
|
+
|
|
40
|
+
# CORS Configuration
|
|
41
|
+
MCP_CORS_ENABLED=false
|
|
42
|
+
MCP_CORS_ORIGINS=*
|
|
43
|
+
MCP_CORS_CREDENTIALS=false
|
|
44
|
+
|
|
45
|
+
# SSL/TLS Configuration
|
|
46
|
+
MCP_SSL_ENABLED=false
|
|
47
|
+
MCP_SSL_CERT_PATH=/path/to/cert.pem
|
|
48
|
+
MCP_SSL_KEY_PATH=/path/to/key.pem
|
|
49
|
+
MCP_SSL_CA_PATH=/path/to/ca.pem
|
|
50
|
+
|
|
51
|
+
# ====================
|
|
52
|
+
# WINCC OA SETTINGS
|
|
53
|
+
# ====================
|
|
54
|
+
|
|
55
|
+
# Field Configuration
|
|
56
|
+
WINCCOA_FIELD=default
|
|
57
|
+
|
|
58
|
+
# Project Instructions (optional)
|
|
59
|
+
# IMPORTANT: Path must be relative to the WinCC OA project directory (not the MCP server directory)
|
|
60
|
+
# For demo/testing: Use the included demo project instructions
|
|
61
|
+
WINCCOA_PROJECT_INSTRUCTIONS=./javascript/mcpServer/config/demo-project-instructions.md
|
|
62
|
+
# For production: Create your own project-specific instructions
|
|
63
|
+
# WINCCOA_PROJECT_INSTRUCTIONS=/path/to/your/project-instructions.md
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# ====================
|
|
67
|
+
# TOOLS CONFIGURATION
|
|
68
|
+
# ====================
|
|
69
|
+
|
|
70
|
+
# Tools to load (comma-separated list of relative paths without .js extension)
|
|
71
|
+
# Available tools: datapoints/dp_basic, datapoints/dp_create, datapoints/dp_set, datapoints/dp_types
|
|
72
|
+
TOOLS=datapoints/dp_basic,datapoints/dp_create,datapoints/dp_set,datapoints/dp_types
|
package/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# WinCC OA MCP Server
|
|
2
|
+
|
|
3
|
+
**AI Integration for Industrial Automation**
|
|
4
|
+
|
|
5
|
+
This Model Context Protocol (MCP) server connects AI assistants to WinCC OA SCADA systems, enabling intelligent automation and monitoring for industrial environments.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
**Ask your AI:**
|
|
10
|
+
- "Show me all temperature values in the plant"
|
|
11
|
+
- "Which pumps are currently running?"
|
|
12
|
+
- "Set the setpoint for pump P-101 to 50%"
|
|
13
|
+
- "Create a production report for today"
|
|
14
|
+
|
|
15
|
+
### 1. Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# In your WinCC OA project directory
|
|
19
|
+
cd <OA_ProjPath>/javascript
|
|
20
|
+
mkdir mcpServer && cd mcpServer
|
|
21
|
+
|
|
22
|
+
# Install packages
|
|
23
|
+
npm install @etm/winccoa-mcp-server
|
|
24
|
+
npm install file:C:/Siemens/Automation/WinCC_OA/3.20/javascript/winccoa-manager
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. Configure
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Copy and edit configuration
|
|
31
|
+
cp .env.example .env
|
|
32
|
+
notepad .env # Windows
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Minimal .env setup:**
|
|
36
|
+
```env
|
|
37
|
+
# Generate with: openssl rand -hex 32
|
|
38
|
+
MCP_API_TOKEN=your-secure-token-here
|
|
39
|
+
|
|
40
|
+
# Choose industry context
|
|
41
|
+
WINCCOA_FIELD=default # or 'oil', 'transport'
|
|
42
|
+
|
|
43
|
+
# Configure available tools
|
|
44
|
+
TOOLS=datapoints/dp_basic,datapoints/dp_set,datapoints/dp_types
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. Start Server
|
|
48
|
+
|
|
49
|
+
Add JavaScript Manager in WinCC OA:
|
|
50
|
+
- **Manager Type:** JavaScript Manager
|
|
51
|
+
- **Script Path:** `mcpServer/index_http.js`
|
|
52
|
+
|
|
53
|
+
### 4. Connect Claude Desktop
|
|
54
|
+
|
|
55
|
+
Edit `%APPDATA%/Claude/claude_desktop_config.json`:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"mcpServers": {
|
|
60
|
+
"winccoa": {
|
|
61
|
+
"command": "npx",
|
|
62
|
+
"args": ["mcp-remote", "http://localhost:3000/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE"]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Documentation
|
|
69
|
+
|
|
70
|
+
- **[📦 Installation Guide](docs/INSTALLATION.md)** - Complete setup instructions
|
|
71
|
+
- **[⚙️ Configuration](docs/CONFIGURATION.md)** - All .env options and server modes
|
|
72
|
+
- **[🔧 Tools](docs/TOOLS.md)** - Available tools and custom development
|
|
73
|
+
- **[📝 Instructions](docs/INSTRUCTIONS.md)** - Industry templates and project customization
|
|
74
|
+
- **[🔍 Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and limitations
|
|
75
|
+
|
|
76
|
+
## Features
|
|
77
|
+
|
|
78
|
+
✅ **Secure API** - Token-based authentication
|
|
79
|
+
✅ **Industry Templates** - Pre-configured for Oil & Gas, Transportation
|
|
80
|
+
✅ **Custom Tools** - Extend with your own WinCC OA integrations
|
|
81
|
+
✅ **Project Rules** - Plant-specific AI guidance
|
|
82
|
+
✅ **Dynamic Loading** - Configure only needed tools
|
|
83
|
+
|
|
84
|
+
## Support
|
|
85
|
+
|
|
86
|
+
- **Repository:** [GitHub](https://github.com/winccoa/winccoa-ae-js-mcpserver)
|
|
87
|
+
- **Issues:** [Report Bug](https://github.com/winccoa/winccoa-ae-js-mcpserver/issues)
|
|
88
|
+
- **WinCC OA Docs:** [Official Documentation](https://www.winccoa.com/product-information/documentation.html)
|
|
89
|
+
|
|
90
|
+
## License
|
|
91
|
+
|
|
92
|
+
ISC - See LICENSE.md for details.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function loadSSLConfig(): {
|
|
2
|
+
cert: NonSharedBuffer & string;
|
|
3
|
+
key: NonSharedBuffer & string;
|
|
4
|
+
ca: NonSharedBuffer | undefined;
|
|
5
|
+
} | null;
|
|
6
|
+
export function validateConfig(): string[];
|
|
7
|
+
export namespace serverConfig {
|
|
8
|
+
let mode: string;
|
|
9
|
+
namespace http {
|
|
10
|
+
let port: number;
|
|
11
|
+
let host: string;
|
|
12
|
+
namespace auth {
|
|
13
|
+
let enabled: boolean;
|
|
14
|
+
let type: string;
|
|
15
|
+
let token: string | undefined;
|
|
16
|
+
namespace jwt {
|
|
17
|
+
let enabled_1: boolean;
|
|
18
|
+
export { enabled_1 as enabled };
|
|
19
|
+
export let secret: string | undefined;
|
|
20
|
+
export let expiresIn: string;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
namespace cors {
|
|
24
|
+
let enabled_2: boolean;
|
|
25
|
+
export { enabled_2 as enabled };
|
|
26
|
+
export let origins: string[];
|
|
27
|
+
export let credentials: boolean;
|
|
28
|
+
}
|
|
29
|
+
namespace ssl {
|
|
30
|
+
let enabled_3: boolean;
|
|
31
|
+
export { enabled_3 as enabled };
|
|
32
|
+
export let cert: string | undefined;
|
|
33
|
+
export let key: string | undefined;
|
|
34
|
+
export let ca: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
namespace security {
|
|
38
|
+
namespace rateLimit {
|
|
39
|
+
let enabled_4: boolean;
|
|
40
|
+
export { enabled_4 as enabled };
|
|
41
|
+
export let windowMs: number;
|
|
42
|
+
export let max: number;
|
|
43
|
+
}
|
|
44
|
+
namespace ipFilter {
|
|
45
|
+
let enabled_5: boolean;
|
|
46
|
+
export { enabled_5 as enabled };
|
|
47
|
+
export let whitelist: string[];
|
|
48
|
+
export let blacklist: string[];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=server.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.config.d.ts","sourceRoot":"","sources":["../../src/config/server.config.js"],"names":[],"mappings":"AAgEA;;;;SAcC;AAGD,2CAiBC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
// Server deployment configuration
|
|
4
|
+
export const serverConfig = {
|
|
5
|
+
// Server mode configuration
|
|
6
|
+
mode: process.env.MCP_MODE || 'http', // 'http' or 'stdio'
|
|
7
|
+
// HTTP server configuration
|
|
8
|
+
http: {
|
|
9
|
+
port: parseInt(process.env.MCP_HTTP_PORT || '3000'),
|
|
10
|
+
host: process.env.MCP_HTTP_HOST || '0.0.0.0', // Listen on all interfaces for server deployment
|
|
11
|
+
// Authentication configuration
|
|
12
|
+
auth: {
|
|
13
|
+
enabled: true, // Always enabled for security
|
|
14
|
+
type: process.env.MCP_AUTH_TYPE || 'bearer', // 'bearer' or 'api-key'
|
|
15
|
+
token: process.env.MCP_API_TOKEN, // Required - no default
|
|
16
|
+
// Additional auth options for future expansion
|
|
17
|
+
jwt: {
|
|
18
|
+
enabled: process.env.MCP_JWT_ENABLED === 'true',
|
|
19
|
+
secret: process.env.MCP_JWT_SECRET,
|
|
20
|
+
expiresIn: process.env.MCP_JWT_EXPIRES_IN || '24h'
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
// CORS configuration for browser-based clients
|
|
24
|
+
cors: {
|
|
25
|
+
enabled: process.env.MCP_CORS_ENABLED === 'true',
|
|
26
|
+
origins: process.env.MCP_CORS_ORIGINS ? process.env.MCP_CORS_ORIGINS.split(',') : ['*'],
|
|
27
|
+
credentials: process.env.MCP_CORS_CREDENTIALS === 'true'
|
|
28
|
+
},
|
|
29
|
+
// SSL/TLS configuration
|
|
30
|
+
ssl: {
|
|
31
|
+
enabled: process.env.MCP_SSL_ENABLED === 'true',
|
|
32
|
+
cert: process.env.MCP_SSL_CERT_PATH,
|
|
33
|
+
key: process.env.MCP_SSL_KEY_PATH,
|
|
34
|
+
ca: process.env.MCP_SSL_CA_PATH
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
// Security configuration
|
|
38
|
+
security: {
|
|
39
|
+
// Rate limiting
|
|
40
|
+
rateLimit: {
|
|
41
|
+
enabled: process.env.RATE_LIMIT_ENABLED !== 'false',
|
|
42
|
+
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '60000'), // 1 minute
|
|
43
|
+
max: parseInt(process.env.RATE_LIMIT_MAX || '100') // requests per window
|
|
44
|
+
},
|
|
45
|
+
// IP whitelist/blacklist
|
|
46
|
+
ipFilter: {
|
|
47
|
+
enabled: process.env.IP_FILTER_ENABLED === 'true',
|
|
48
|
+
whitelist: process.env.IP_WHITELIST ? process.env.IP_WHITELIST.split(',') : [],
|
|
49
|
+
blacklist: process.env.IP_BLACKLIST ? process.env.IP_BLACKLIST.split(',') : []
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
// Helper function to load SSL certificates
|
|
54
|
+
export function loadSSLConfig() {
|
|
55
|
+
const config = serverConfig.http.ssl;
|
|
56
|
+
if (!config.enabled)
|
|
57
|
+
return null;
|
|
58
|
+
try {
|
|
59
|
+
return {
|
|
60
|
+
cert: readFileSync(config.cert),
|
|
61
|
+
key: readFileSync(config.key),
|
|
62
|
+
ca: config.ca ? readFileSync(config.ca) : undefined
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error('Failed to load SSL certificates:', error);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Validate configuration
|
|
71
|
+
export function validateConfig() {
|
|
72
|
+
console.log('🔍 Starting configuration validation...');
|
|
73
|
+
console.log('🔍 process.env.MCP_API_TOKEN:', process.env.MCP_API_TOKEN ? 'SET' : 'NOT SET');
|
|
74
|
+
console.log('🔍 serverConfig.http.auth.token:', serverConfig.http.auth.token ? 'SET' : 'NOT SET');
|
|
75
|
+
const errors = [];
|
|
76
|
+
// Always require API token
|
|
77
|
+
if (!serverConfig.http.auth.token) {
|
|
78
|
+
console.log('❌ MCP_API_TOKEN validation failed');
|
|
79
|
+
errors.push('MCP_API_TOKEN must be set in environment variables or .env file');
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log('✅ MCP_API_TOKEN validation passed');
|
|
83
|
+
}
|
|
84
|
+
console.log('🔍 Validation completed with', errors.length, 'errors');
|
|
85
|
+
return errors;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=server.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.config.js","sourceRoot":"","sources":["../../src/config/server.config.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index_http.d.ts","sourceRoot":"","sources":["../src/index_http.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/*******************************************************/
|
|
2
|
+
/* */
|
|
3
|
+
/* This file was initially creates by Martin Kumhera */
|
|
4
|
+
/* and extended by AI with CNS (UNS) functions! */
|
|
5
|
+
/* */
|
|
6
|
+
/*******************************************************/
|
|
7
|
+
// Try to load dotenv if available BEFORE importing config
|
|
8
|
+
try {
|
|
9
|
+
const dotenv = await import('dotenv');
|
|
10
|
+
const path = await import('path');
|
|
11
|
+
const { fileURLToPath } = await import('url');
|
|
12
|
+
const fs = await import('fs');
|
|
13
|
+
// Get the directory of the current script
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = path.dirname(__filename);
|
|
16
|
+
// Check if .env file exists
|
|
17
|
+
const envPath = path.join(__dirname, '.env');
|
|
18
|
+
if (fs.existsSync(envPath)) {
|
|
19
|
+
// Load .env from the script directory
|
|
20
|
+
const result = dotenv.config({ path: envPath });
|
|
21
|
+
console.log(`✓ .env file found and loaded from: ${envPath}`);
|
|
22
|
+
// Debug: Check if dotenv actually loaded the variables
|
|
23
|
+
if (result.error) {
|
|
24
|
+
console.log(`✗ Error loading .env file: ${result.error}`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log(`✓ dotenv.config() successful`);
|
|
28
|
+
console.log(`✓ MCP_API_TOKEN after loading: ${process.env.MCP_API_TOKEN ? 'SET' : 'NOT SET'}`);
|
|
29
|
+
if (process.env.MCP_API_TOKEN) {
|
|
30
|
+
console.log(`✓ MCP_API_TOKEN value: ${process.env.MCP_API_TOKEN.substring(0, 8)}...`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(`✗ .env file not found at: ${envPath}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// dotenv not available, continue without it
|
|
40
|
+
console.log('dotenv not available, using environment variables directly');
|
|
41
|
+
}
|
|
42
|
+
// Import modules dynamically after dotenv is loaded
|
|
43
|
+
console.log('🔄 Starting module imports...');
|
|
44
|
+
let StreamableHTTPServerTransport, express, initializeServer, serverConfig, loadSSLConfig, validateConfig, https, createRequire, require, cors, rateLimit;
|
|
45
|
+
try {
|
|
46
|
+
console.log('🔄 Importing StreamableHTTPServerTransport...');
|
|
47
|
+
({ StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js"));
|
|
48
|
+
console.log('✅ StreamableHTTPServerTransport imported');
|
|
49
|
+
console.log('🔄 Importing express...');
|
|
50
|
+
express = (await import('express')).default;
|
|
51
|
+
console.log('✅ Express imported');
|
|
52
|
+
console.log('🔄 Importing server.js...');
|
|
53
|
+
({ initializeServer } = await import('./server.js'));
|
|
54
|
+
console.log('✅ server.js imported');
|
|
55
|
+
console.log('🔄 Importing server.config.js...');
|
|
56
|
+
({ serverConfig, loadSSLConfig, validateConfig } = await import('./config/server.config.js'));
|
|
57
|
+
console.log('✅ server.config.js imported');
|
|
58
|
+
console.log('🔍 serverConfig.http.auth.token:', serverConfig.http.auth.token ? 'SET' : 'NOT SET');
|
|
59
|
+
console.log('🔄 Importing https...');
|
|
60
|
+
https = await import('https');
|
|
61
|
+
console.log('✅ https imported');
|
|
62
|
+
({ createRequire } = await import('module'));
|
|
63
|
+
require = createRequire(import.meta.url);
|
|
64
|
+
cors = require('cors');
|
|
65
|
+
rateLimit = require('express-rate-limit');
|
|
66
|
+
console.log('✅ All modules imported successfully');
|
|
67
|
+
}
|
|
68
|
+
catch (importError) {
|
|
69
|
+
console.error('❌ Error importing modules:', importError);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
let server;
|
|
73
|
+
// ==================== EXPRESS SERVER SETUP ====================
|
|
74
|
+
console.log('🔄 Setting up Express server...');
|
|
75
|
+
const app = express();
|
|
76
|
+
app.use(express.json());
|
|
77
|
+
console.log('✅ Express JSON middleware enabled');
|
|
78
|
+
// Apply CORS if enabled
|
|
79
|
+
if (serverConfig.http.cors.enabled) {
|
|
80
|
+
console.log('🔄 Setting up CORS middleware...');
|
|
81
|
+
app.use(cors({
|
|
82
|
+
origin: serverConfig.http.cors.origins,
|
|
83
|
+
credentials: serverConfig.http.cors.credentials
|
|
84
|
+
}));
|
|
85
|
+
console.log('✅ CORS middleware enabled for origins:', serverConfig.http.cors.origins);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log('ℹ️ CORS disabled');
|
|
89
|
+
}
|
|
90
|
+
// Apply rate limiting if enabled
|
|
91
|
+
if (serverConfig.security.rateLimit.enabled) {
|
|
92
|
+
console.log('🔄 Setting up rate limiting middleware...');
|
|
93
|
+
const limiter = rateLimit({
|
|
94
|
+
windowMs: serverConfig.security.rateLimit.windowMs,
|
|
95
|
+
max: serverConfig.security.rateLimit.max,
|
|
96
|
+
message: 'Too many requests from this IP, please try again later.'
|
|
97
|
+
});
|
|
98
|
+
app.use('/mcp', limiter);
|
|
99
|
+
console.log('✅ Rate limiting enabled:', serverConfig.security.rateLimit.max, 'requests per', serverConfig.security.rateLimit.windowMs, 'ms');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log('ℹ️ Rate limiting disabled');
|
|
103
|
+
}
|
|
104
|
+
// IP filtering middleware
|
|
105
|
+
if (serverConfig.security.ipFilter.enabled) {
|
|
106
|
+
console.log('🔄 Setting up IP filtering middleware...');
|
|
107
|
+
app.use((req, res, next) => {
|
|
108
|
+
const clientIp = req.ip || req.connection.remoteAddress;
|
|
109
|
+
console.log('🔍 IP filter check for:', clientIp);
|
|
110
|
+
// Check whitelist
|
|
111
|
+
if (serverConfig.security.ipFilter.whitelist.length > 0) {
|
|
112
|
+
if (!serverConfig.security.ipFilter.whitelist.includes(clientIp)) {
|
|
113
|
+
console.log('❌ IP not whitelisted:', clientIp);
|
|
114
|
+
return res.status(403).json({
|
|
115
|
+
jsonrpc: '2.0',
|
|
116
|
+
error: {
|
|
117
|
+
code: -32003,
|
|
118
|
+
message: 'Forbidden: IP not whitelisted',
|
|
119
|
+
},
|
|
120
|
+
id: null,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
console.log('✅ IP whitelisted:', clientIp);
|
|
124
|
+
}
|
|
125
|
+
// Check blacklist
|
|
126
|
+
if (serverConfig.security.ipFilter.blacklist.includes(clientIp)) {
|
|
127
|
+
console.log('❌ IP blacklisted:', clientIp);
|
|
128
|
+
return res.status(403).json({
|
|
129
|
+
jsonrpc: '2.0',
|
|
130
|
+
error: {
|
|
131
|
+
code: -32003,
|
|
132
|
+
message: 'Forbidden: IP blacklisted',
|
|
133
|
+
},
|
|
134
|
+
id: null,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
next();
|
|
138
|
+
});
|
|
139
|
+
console.log('✅ IP filtering enabled. Whitelist:', serverConfig.security.ipFilter.whitelist, 'Blacklist:', serverConfig.security.ipFilter.blacklist);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log('ℹ️ IP filtering disabled');
|
|
143
|
+
}
|
|
144
|
+
// Authentication middleware
|
|
145
|
+
function authenticate(req, res, next) {
|
|
146
|
+
console.log('🔍 Authentication check started');
|
|
147
|
+
console.log('🔍 Auth enabled:', serverConfig.http.auth.enabled);
|
|
148
|
+
console.log('🔍 Auth type:', serverConfig.http.auth.type);
|
|
149
|
+
if (!serverConfig.http.auth.enabled) {
|
|
150
|
+
console.log('ℹ️ Authentication disabled, skipping');
|
|
151
|
+
return next();
|
|
152
|
+
}
|
|
153
|
+
let token;
|
|
154
|
+
if (serverConfig.http.auth.type === 'bearer') {
|
|
155
|
+
const authHeader = req.headers['authorization'];
|
|
156
|
+
console.log('🔍 Authorization header:', authHeader ? `${authHeader.substring(0, 20)}...` : 'NOT SET');
|
|
157
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
158
|
+
token = authHeader.replace('Bearer ', '');
|
|
159
|
+
console.log('🔍 Bearer token extracted:', token ? `${token.substring(0, 8)}...` : 'NOT FOUND');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else if (serverConfig.http.auth.type === 'api-key') {
|
|
163
|
+
token = req.headers['x-api-key'] || req.query.apiKey;
|
|
164
|
+
console.log('🔍 API key token:', token ? `${token.substring(0, 8)}...` : 'NOT FOUND');
|
|
165
|
+
}
|
|
166
|
+
// Fallback to body token for backward compatibility
|
|
167
|
+
token = token || req.body?.token;
|
|
168
|
+
console.log('🔍 Final token (after fallback):', token ? `${token.substring(0, 8)}...` : 'NOT FOUND');
|
|
169
|
+
console.log('🔍 Expected token:', serverConfig.http.auth.token ? `${serverConfig.http.auth.token.substring(0, 8)}...` : 'NOT SET');
|
|
170
|
+
if (token !== serverConfig.http.auth.token) {
|
|
171
|
+
console.log('❌ Authentication failed: token mismatch');
|
|
172
|
+
return res.status(401).json({
|
|
173
|
+
jsonrpc: '2.0',
|
|
174
|
+
error: {
|
|
175
|
+
code: -32001,
|
|
176
|
+
message: 'Unauthorized: Invalid or missing token',
|
|
177
|
+
},
|
|
178
|
+
id: null,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
console.log('✅ Authentication successful');
|
|
182
|
+
next();
|
|
183
|
+
}
|
|
184
|
+
app.post('/mcp', authenticate, async (req, res) => {
|
|
185
|
+
console.log('📨 Received POST MCP request');
|
|
186
|
+
console.log('🔍 Request body size:', JSON.stringify(req.body).length, 'bytes');
|
|
187
|
+
console.log('🔍 Request headers:', Object.keys(req.headers));
|
|
188
|
+
try {
|
|
189
|
+
console.log('🔄 Creating StreamableHTTPServerTransport...');
|
|
190
|
+
const transport = new StreamableHTTPServerTransport({
|
|
191
|
+
sessionIdGenerator: undefined,
|
|
192
|
+
});
|
|
193
|
+
res.on('close', () => {
|
|
194
|
+
console.log('📪 Request closed');
|
|
195
|
+
transport.close();
|
|
196
|
+
server.close();
|
|
197
|
+
});
|
|
198
|
+
console.log('🔄 Connecting server to transport...');
|
|
199
|
+
await server.connect(transport);
|
|
200
|
+
console.log('✅ Server connected to transport');
|
|
201
|
+
console.log('🔄 Handling request...');
|
|
202
|
+
await transport.handleRequest(req, res, req.body);
|
|
203
|
+
console.log('✅ Request handled successfully');
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.error('❌ Error handling MCP request:', error);
|
|
207
|
+
console.error('❌ Error stack:', error.stack);
|
|
208
|
+
if (!res.headersSent) {
|
|
209
|
+
res.status(500).json({
|
|
210
|
+
jsonrpc: '2.0',
|
|
211
|
+
error: {
|
|
212
|
+
code: -32603,
|
|
213
|
+
message: 'Internal server error',
|
|
214
|
+
},
|
|
215
|
+
id: null,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
app.get('/mcp', async (req, res) => {
|
|
221
|
+
console.log('📨 Received GET MCP request (not allowed)');
|
|
222
|
+
res.writeHead(405).end(JSON.stringify({
|
|
223
|
+
jsonrpc: "2.0",
|
|
224
|
+
error: {
|
|
225
|
+
code: -32000,
|
|
226
|
+
message: "Method not allowed."
|
|
227
|
+
},
|
|
228
|
+
id: null
|
|
229
|
+
}));
|
|
230
|
+
});
|
|
231
|
+
app.delete('/mcp', async (req, res) => {
|
|
232
|
+
console.log('📨 Received DELETE MCP request (not allowed)');
|
|
233
|
+
res.writeHead(405).end(JSON.stringify({
|
|
234
|
+
jsonrpc: "2.0",
|
|
235
|
+
error: {
|
|
236
|
+
code: -32000,
|
|
237
|
+
message: "Method not allowed."
|
|
238
|
+
},
|
|
239
|
+
id: null
|
|
240
|
+
}));
|
|
241
|
+
});
|
|
242
|
+
// Health check endpoint
|
|
243
|
+
app.get('/health', (req, res) => {
|
|
244
|
+
res.json({
|
|
245
|
+
status: 'ok',
|
|
246
|
+
service: 'WinCC OA MCP Server',
|
|
247
|
+
version: '3.0.0',
|
|
248
|
+
timestamp: new Date().toISOString()
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
// Initialize and start the server
|
|
252
|
+
async function start() {
|
|
253
|
+
// Validate configuration
|
|
254
|
+
const configErrors = validateConfig();
|
|
255
|
+
if (configErrors.length > 0) {
|
|
256
|
+
console.error('Configuration errors:');
|
|
257
|
+
configErrors.forEach(error => console.error(` - ${error}`));
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
server = await initializeServer();
|
|
261
|
+
const { host, port } = serverConfig.http;
|
|
262
|
+
// Create HTTP or HTTPS server
|
|
263
|
+
let httpServer;
|
|
264
|
+
if (serverConfig.http.ssl.enabled) {
|
|
265
|
+
const sslConfig = loadSSLConfig();
|
|
266
|
+
if (!sslConfig) {
|
|
267
|
+
console.error('SSL is enabled but certificates could not be loaded');
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
httpServer = https.createServer(sslConfig, app);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
httpServer = app;
|
|
274
|
+
}
|
|
275
|
+
httpServer.listen(port, host, () => {
|
|
276
|
+
const protocol = serverConfig.http.ssl.enabled ? 'https' : 'http';
|
|
277
|
+
console.log(`MCP Extended WinCC OA Server with CNS/UNS`);
|
|
278
|
+
console.log(`Server listening on ${protocol}://${host}:${port}`);
|
|
279
|
+
console.log(`Health check: ${protocol}://${host}:${port}/health`);
|
|
280
|
+
if (serverConfig.http.auth.enabled) {
|
|
281
|
+
console.log(`Authentication: ${serverConfig.http.auth.type}`);
|
|
282
|
+
if (serverConfig.http.auth.token) {
|
|
283
|
+
console.log(`API Token: ${serverConfig.http.auth.token.substring(0, 8)}... (first 8 chars shown)`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.log('⚠️ WARNING: Authentication is disabled!');
|
|
288
|
+
}
|
|
289
|
+
if (serverConfig.http.cors.enabled) {
|
|
290
|
+
console.log('CORS enabled for:', serverConfig.http.cors.origins);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
start().catch((error) => {
|
|
295
|
+
console.error("Failed to start server:", error);
|
|
296
|
+
process.exit(1);
|
|
297
|
+
});
|
|
298
|
+
export {};
|
|
299
|
+
//# sourceMappingURL=index_http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index_http.js","sourceRoot":"","sources":["../src/index_http.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index_stdio.d.ts","sourceRoot":"","sources":["../src/index_stdio.js"],"names":[],"mappings":""}
|