UNPKG

sap-b1-mcp-server

Version:

SAP Business One Service Layer MCP Server

165 lines (141 loc) โ€ข 6.29 kB
#!/usr/bin/env node import { execSync } from 'child_process'; import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'; import { resolve, join, dirname } from 'path'; import { fileURLToPath } from 'url'; import os from 'os'; import readline from 'readline'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); console.log('๐Ÿš€ SAP B1 MCP Server - Claude Desktop Setup'); console.log('=============================================\n'); // Get package installation directory const packageDir = resolve(__dirname, '..'); console.log(`๐Ÿ“ Package directory: ${packageDir}`); // Detect OS and set config path let configDir, configFile, osName; if (process.platform === 'darwin') { configDir = join(os.homedir(), 'Library/Application Support/Claude'); osName = 'macOS'; } else if (process.platform === 'win32') { configDir = join(os.homedir(), 'AppData/Roaming/Claude'); osName = 'Windows'; } else { configDir = join(os.homedir(), '.config/Claude'); osName = 'Linux'; } configFile = join(configDir, 'claude_desktop_config.json'); console.log(`๐Ÿ–ฅ๏ธ Detected OS: ${osName}`); console.log(`๐Ÿ“ Claude config directory: ${configDir}`); console.log(`๐Ÿ“„ Config file: ${configFile}`); // Create Claude config directory if it doesn't exist try { if (!existsSync(configDir)) { console.log('๐Ÿ“ Creating Claude config directory...'); mkdirSync(configDir, { recursive: true }); } } catch (error) { console.error('โŒ Failed to create config directory:', error.message); process.exit(1); } // Get bun path let bunPath; try { bunPath = execSync('which bun', { encoding: 'utf8' }).trim(); console.log(`โœ… Bun found at: ${bunPath}`); } catch (error) { console.error('โŒ Bun is not found in PATH'); console.error(' Please install Bun: https://bun.sh'); process.exit(1); } function askQuestion(question) { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); return new Promise((resolve) => { rl.question(question, (answer) => { rl.close(); resolve(answer); }); }); } async function getSAPCredentials() { console.log('\n๐Ÿ” SAP B1 Configuration Required'); console.log('Please provide your SAP Business One credentials:'); const serverUrl = await askQuestion('SAP B1 Server URL (e.g., https://server:50000): '); const database = await askQuestion('SAP B1 Database Name: '); const username = await askQuestion('SAP B1 Username: '); const password = await askQuestion('SAP B1 Password: '); return { serverUrl, database, username, password }; } async function main() { try { const { serverUrl, database, username, password } = await getSAPCredentials(); console.log('\nโš™๏ธ Creating Claude Desktop configuration...'); // Create configuration const config = { mcpServers: { "sap-b1": { command: bunPath, args: [join(packageDir, 'dist/index.js')], cwd: packageDir, env: { MCP_TRANSPORT: "stdio", SAP_B1_SERVER_URL: serverUrl, SAP_B1_DATABASE: database, SAP_B1_USERNAME: username, SAP_B1_PASSWORD: password, SAP_B1_SESSION_TIMEOUT: "30", LOG_LEVEL: "INFO", NODE_ENV: "production" } } } }; // Handle existing config if (existsSync(configFile)) { console.log('โš ๏ธ Claude Desktop config file already exists!'); const backup = await askQuestion('Create backup and replace? (y/n): '); if (backup.toLowerCase() !== 'y') { console.log('โŒ Setup cancelled.'); console.log('\n๐Ÿ“‹ Manual configuration needed. Add this to your Claude Desktop config:'); console.log(JSON.stringify(config, null, 2)); process.exit(0); } // Create backup const backupFile = `${configFile}.backup.${Date.now()}`; execSync(`cp "${configFile}" "${backupFile}"`); console.log(`๐Ÿ’พ Backup created: ${backupFile}`); } // Write configuration writeFileSync(configFile, JSON.stringify(config, null, 2)); console.log('โœ… Configuration created successfully!\n'); console.log('๐Ÿ“‹ Configuration Summary:'); console.log(` ๐Ÿท๏ธ Server name: sap-b1`); console.log(` ๐Ÿ”ง Command: ${bunPath} ${join(packageDir, 'dist/index.js')}`); console.log(` ๐Ÿ“ Working directory: ${packageDir}`); console.log(` ๐Ÿš€ Transport: STDIO`); console.log(` ๐Ÿ” SAP Server: ${serverUrl}`); console.log(` ๐Ÿ—„๏ธ Database: ${database}`); console.log(` ๐Ÿ‘ค Username: ${username}`); console.log(` ๐Ÿ”’ Password: ***masked***\n`); console.log('๐ŸŽ‰ Setup Complete!\n'); console.log('๐Ÿ“‹ Next Steps:'); console.log('1. ๐Ÿ”„ Restart Claude Desktop completely'); console.log('2. ๐Ÿ†• Start a new conversation in Claude Desktop'); console.log('3. ๐Ÿ” Look for MCP connection indicator (๐Ÿ”Œ)'); console.log('4. ๐Ÿ’ฌ Try asking: "What MCP tools do you have access to?"'); console.log('5. ๐Ÿงช Test with: "Check my SAP session status"'); console.log('\n๐Ÿ“š Available Tools (26+ total):'); console.log(' ๐Ÿ”‘ Authentication (3): login, logout, session status'); console.log(' ๐Ÿ‘ฅ Master Data (9): business partners, items, warehouses, price lists'); console.log(' ๐Ÿ“„ Documents (6): orders, purchase orders, invoices'); console.log(' ๐Ÿ” Queries (2): custom queries, cross-joins'); console.log(' ๐Ÿ“Š Stock & Pricing (4): item stock, item prices โญ NEW'); } catch (error) { console.error('โŒ Setup failed:', error.message); process.exit(1); } } main();