Obsidian MCP Server
by cyanheads
Verified
#!/usr/bin/env node
// Debug script to run the server with verbose logging
import fs from 'fs';
import path from 'path';
import { spawn } from 'child_process';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
// Get current directory from import.meta
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Create logs directory if it doesn't exist
const logsDir = path.join(__dirname, 'logs');
if (!fs.existsSync(logsDir)) {
fs.mkdirSync(logsDir, { recursive: true });
}
// Create log file stream
const logFile = path.join(logsDir, `debug-server-${new Date().toISOString().replace(/[:.]/g, '-')}.log`);
const logStream = fs.createWriteStream(logFile, { flags: 'a' });
console.log(`Starting Obsidian MCP Server in debug mode...`);
console.log(`Logs will be written to: ${logFile}`);
// Environment variables from MCP settings
const env = {
...process.env,
DEBUG_JSONRPC: 'true',
NODE_ENV: 'development',
// Required environment variables from MCP settings
OBSIDIAN_API_KEY: '9bde5e9fb07951daa75819a1704ce75fd597955205141d3b39e5e1423ddbc97c',
VERIFY_SSL: 'false',
OBSIDIAN_PROTOCOL: 'https',
OBSIDIAN_HOST: '127.0.0.1',
OBSIDIAN_PORT: '27124',
REQUEST_TIMEOUT: '5000',
MAX_CONTENT_LENGTH: String(50 * 1024 * 1024),
MAX_BODY_LENGTH: String(50 * 1024 * 1024),
RATE_LIMIT_WINDOW_MS: '900000',
RATE_LIMIT_MAX_REQUESTS: '200',
TOOL_TIMEOUT_MS: '60000'
};
// Start the server process
const serverProcess = spawn('node', ['build/index.js'], {
env,
stdio: ['pipe', 'pipe', 'pipe']
});
// Log process output
serverProcess.stdout.on('data', (data) => {
const output = data.toString();
process.stdout.write(output);
logStream.write(`[STDOUT] ${output}`);
});
serverProcess.stderr.on('data', (data) => {
const output = data.toString();
process.stderr.write(output);
logStream.write(`[STDERR] ${output}`);
});
// Handle process exit
serverProcess.on('exit', (code) => {
const message = `Server process exited with code ${code}`;
console.log(message);
logStream.write(`${message}\n`);
logStream.end();
});
// Handle errors
serverProcess.on('error', (err) => {
const message = `Error starting server: ${err.message}`;
console.error(message);
logStream.write(`[ERROR] ${message}\n`);
logStream.end();
});
// Handle uncaught exceptions
process.on('uncaughtException', (err) => {
const message = `Uncaught exception: ${err.message}\n${err.stack}`;
console.error(message);
logStream.write(`[UNCAUGHT] ${message}\n`);
logStream.end();
process.exit(1);
});
// Set up cleanup
const cleanup = () => {
if (serverProcess && !serverProcess.killed) {
serverProcess.kill();
}
logStream.end();
};
process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);