From ee8a538bd091aee4afd490c30740d91062bb546e Mon Sep 17 00:00:00 2001 From: Marc Blatter Date: Sun, 2 Aug 2026 11:36:15 +0000 Subject: [PATCH] compose-obsidian.yml aktualisiert --- compose-obsidian.yml | 111 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 102 insertions(+), 9 deletions(-) diff --git a/compose-obsidian.yml b/compose-obsidian.yml index 47abea2..c371d06 100644 --- a/compose-obsidian.yml +++ b/compose-obsidian.yml @@ -14,11 +14,6 @@ services: restart: unless-stopped networks: - cortex-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:5984/_up"] - interval: 30s - timeout: 10s - retries: 3 obsidian-mcp: image: node:20-alpine @@ -26,14 +21,112 @@ services: working_dir: /app volumes: - /opt/obsidian/vault:/vault - - ./mcp-server.js:/app/server.js ports: - "3002:3002" environment: - - NODE_ENV=production - VAULT_PATH=/vault - - MCP_PORT=3002 - command: sh -c "npm init -y && npm install express cors body-parser && node server.js" + command: > + /bin/sh -c " + npm init -y && + npm install express cors body-parser && + cat > server.js << 'EOFSERVER' + const express = require('express'); + const fs = require('fs'); + const path = require('path'); + const cors = require('cors'); + + const app = express(); + app.use(cors()); + app.use(express.json()); + + const VAULT_PATH = '/vault'; + + app.post('/api/mcp/search', (req, res) => { + const { query } = req.body; + try { + const results = []; + const walk = (dir) => { + const files = fs.readdirSync(dir); + files.forEach(file => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + if (stat.isDirectory() && !file.startsWith('.')) { + walk(filePath); + } else if (file.endsWith('.md')) { + const content = fs.readFileSync(filePath, 'utf8'); + if (content.includes(query)) { + results.push({ + file: path.relative(VAULT_PATH, filePath), + matches: content.split('\n').filter(l => l.includes(query)) + }); + } + } + }); + }; + walk(VAULT_PATH); + res.json({ results, count: results.length }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.post('/api/mcp/create', (req, res) => { + const { title, content, tags } = req.body; + try { + const filename = title.toLowerCase().replace(/\s+/g, '-') + '.md'; + const filepath = path.join(VAULT_PATH, filename); + const frontmatter = \`--- +title: \${title} +tags: [\${tags?.join(', ') || ''}] +created: \${new Date().toISOString()} +--- + +\`; + fs.writeFileSync(filepath, frontmatter + (content || '')); + res.json({ success: true, file: filename }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.get('/api/mcp/note/:filename', (req, res) => { + try { + const filepath = path.join(VAULT_PATH, req.params.filename); + const content = fs.readFileSync(filepath, 'utf8'); + res.json({ content }); + } catch (err) { + res.status(404).json({ error: 'Note not found' }); + } + }); + + app.get('/api/mcp/notes', (req, res) => { + try { + const notes = []; + const walk = (dir) => { + const files = fs.readdirSync(dir); + files.forEach(file => { + const filePath = path.join(dir, file); + const stat = fs.statSync(filePath); + if (stat.isDirectory() && !file.startsWith('.')) { + walk(filePath); + } else if (file.endsWith('.md')) { + notes.push(path.relative(VAULT_PATH, filePath)); + } + }); + }; + walk(VAULT_PATH); + res.json({ notes }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.listen(3002, () => { + console.log('Obsidian MCP Server running on port 3002'); + }); + EOFSERVER + node server.js + " restart: unless-stopped networks: - cortex-network