diff --git a/compose-obsidian.yml b/compose-obsidian.yml index c371d06..1b4aa80 100644 --- a/compose-obsidian.yml +++ b/compose-obsidian.yml @@ -16,117 +16,14 @@ services: - cortex-network obsidian-mcp: - image: node:20-alpine + build: . container_name: cortex-obsidian-mcp - working_dir: /app - volumes: - - /opt/obsidian/vault:/vault ports: - "3002:3002" + volumes: + - /opt/obsidian/vault:/vault environment: - VAULT_PATH=/vault - 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