# Bug Fix: Read-Only File System Error
**Date:** 2026-01-19
**Issue:** `[Errno 30] Read-only file system: 'audio'`
## Problem
The myaigist MCP server was failing with:
```
❌ Error initializing Transcriber: [Errno 30] Read-only file system: 'audio'
❌ Error initializing agents: [Errno 30] Read-only file system: 'audio'
```
## Root Cause
**Claude Desktop runs MCP servers from a different working directory** than the server script location. When the server used relative paths like `Path('audio')` and `Path('data')`, it tried to create directories in Claude Desktop's working directory, which doesn't have write permissions.
## Solution
Changed all paths from **relative** to **absolute** based on the server script's location.
### Changes Made
#### 1. server.py - Added Absolute Path Constants
**Added after imports:**
```python
# Get the absolute path to this script's directory
SERVER_DIR = Path(__file__).parent.absolute()
AUDIO_DIR = SERVER_DIR / "audio"
DATA_DIR = SERVER_DIR / "data"
```
**Updated agent initialization:**
```python
transcriber = Transcriber(audio_dir=AUDIO_DIR)
qa_agent = QAAgent(data_dir=str(DATA_DIR))
```
**Updated directory creation:**
```python
DATA_DIR.mkdir(exist_ok=True)
AUDIO_DIR.mkdir(exist_ok=True)
```
**Updated all tool references:**
- `cleanup_audio()` - uses `AUDIO_DIR`
- `get_status()` - uses `AUDIO_DIR`
- `serve_audio()` - uses `AUDIO_DIR`
#### 2. mcp_agents/transcriber.py - Accept Audio Directory
**Before:**
```python
def __init__(self):
self.audio_dir = Path('audio') # ❌ Relative path
```
**After:**
```python
def __init__(self, audio_dir: Optional[Path] = None):
"""
Args:
audio_dir: Optional path to audio directory (defaults to 'audio' in cwd)
"""
self.audio_dir = audio_dir if audio_dir else Path('audio') # ✅ Accepts absolute path
```
#### 3. mcp_agents/qa_agent.py - Accept Data Directory
**Before:**
```python
def __init__(self):
vector_store_path = "data/vector_store.pkl" # ❌ Relative path
```
**After:**
```python
def __init__(self, data_dir: str = None):
"""
Args:
data_dir: Optional path to data directory (defaults to 'data' in cwd)
"""
if data_dir:
vector_store_path = str(Path(data_dir) / "vector_store.pkl") # ✅ Absolute path
else:
vector_store_path = "data/vector_store.pkl"
```
## Verification
**Test Output:**
```bash
$ python3 /Users/mikeschwimmer/myaigist_mcp/server.py
🚀 Initializing MyAIGist MCP Server...
📁 Server directory: /Users/mikeschwimmer/myaigist_mcp
📁 Audio directory: /Users/mikeschwimmer/myaigist_mcp/audio
📁 Data directory: /Users/mikeschwimmer/myaigist_mcp/data
✅ Transcriber initialized successfully
📂 Using global vector store: /Users/mikeschwimmer/myaigist_mcp/data/vector_store.pkl
✅ VectorStore initialized with 0 vectors
✅ QAAgent initialized successfully
✅ All agents initialized successfully
🎉 MyAIGist MCP Server is ready!
```
**No more "Read-only file system" errors!** ✅
## Files Modified
1. `/Users/mikeschwimmer/myaigist_mcp/server.py`
- Added SERVER_DIR, AUDIO_DIR, DATA_DIR constants
- Pass absolute paths to agents
- Updated all path references
2. `/Users/mikeschwimmer/myaigist_mcp/mcp_agents/transcriber.py`
- Accept audio_dir parameter
- Added Path import
3. `/Users/mikeschwimmer/myaigist_mcp/mcp_agents/qa_agent.py`
- Accept data_dir parameter
- Added Path import
## Why This Matters
MCP servers run in Claude Desktop's process space, not from the script's directory. Using `__file__` to get the script's location ensures:
✅ Directories are created in the correct location
✅ Works regardless of where Claude Desktop runs from
✅ No permission errors
✅ Persistent storage in expected location
## Status
✅ **FIXED** - Server initializes successfully
✅ **TESTED** - All agents initialize without errors
✅ **VERIFIED** - Directories created at correct locations
✅ **READY** - User can restart Claude Desktop
---
**Previous Error Log:**
```
❌ Error initializing Transcriber: [Errno 30] Read-only file system: 'audio'
```
**Current Output:**
```
✅ Transcriber initialized successfully
✅ All agents initialized successfully
```
**Fix Complexity:** Medium (4 files modified, ~15 lines changed)
**Impact:** Critical - server couldn't start