Skip to content

MCP list_meetings and search return empty when using custom meetings directory (symlink traversal bug) #660

@santiagorozaitti

Description

@santiagorozaitti

Summary

When Transcripted is configured to save meetings to a custom directory (via the native folder picker in settings), the MCP tools list_meetings and search return no results. The tool read_meeting works correctly when given a filename.

Environment

  • Transcripted 1.1.31
  • macOS (Apple Silicon)
  • Custom meetings directory: ~/Library/CloudStorage/Dropbox/Obsidian/[VaultName]/Transcripted/meetings/
  • The custom directory is configured via Transcripted's native settings, which writes meeting .md files there correctly
  • A symlink exists at ~/Library/Application Support/Transcripted/captures/meetings pointing to the custom directory (created manually as a workaround attempt)

Expected behavior

list_meetings and search should find and index meetings regardless of whether they are stored in the default Application Support path or a custom user-configured directory.

Actual behavior

list_meetings returns No meetings found. search returns no results. The MCP SQLite index (mcp_index.sqlite) contains 0 meeting entries even after restarting Transcripted and deleting the index to force a rebuild.

read_meeting works correctly when given the exact filename — it reads the file directly from the filesystem and does not depend on the index.

Root cause hypothesis

The MCP indexer likely uses Node.js fs.readdir() with withFileTypes: true and checks entry.isDirectory() to traverse subdirectories. On macOS, isDirectory() returns false for symlinks to directories (it returns the type of the symlink itself, not the target). This causes the indexer to skip the meetings symlink and produce an empty index.

The fix would be to also check entry.isSymbolicLink() and resolve the target, or use fs.stat() instead of dirent.isDirectory() when traversing the folder tree.

Workaround

None fully working. read_meeting by filename is the only functional MCP tool. Obsidian Copilot (with OpenRouter) serves as an alternative for search/history queries.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions