{"id":34567361,"url":"https://github.com/vimalk78/fs-mcp","last_synced_at":"2026-05-02T11:39:12.151Z","repository":{"id":326211361,"uuid":"1100786144","full_name":"vimalk78/fs-mcp","owner":"vimalk78","description":"Multi-repository MCP server for Claude Code - access files from multiple repos with a single MCP server","archived":false,"fork":false,"pushed_at":"2025-11-26T10:52:35.000Z","size":20,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-29T09:40:25.988Z","etag":null,"topics":["claude-code","golang","mcp","mcp-server","multi-repo"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vimalk78.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-20T18:53:48.000Z","updated_at":"2025-11-26T10:52:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vimalk78/fs-mcp","commit_stats":null,"previous_names":["vimalk78/fs-mcp"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/vimalk78/fs-mcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimalk78%2Ffs-mcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimalk78%2Ffs-mcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimalk78%2Ffs-mcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimalk78%2Ffs-mcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vimalk78","download_url":"https://codeload.github.com/vimalk78/fs-mcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vimalk78%2Ffs-mcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27999475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","golang","mcp","mcp-server","multi-repo"],"created_at":"2025-12-24T09:11:00.522Z","updated_at":"2025-12-24T09:11:03.507Z","avatar_url":"https://github.com/vimalk78.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Multi-Repository MCP Server\n\nA Model Context Protocol (MCP) server that allows you to access files from multiple repositories without changing your current working directory.\n\n**Built with Go for simplicity and performance.**\n\n## Features\n\n- **Access multiple repositories** from a single location\n- **Four powerful tools**:\n  - `list_repos`: List all configured repositories and their paths\n  - `list_files`: List files in any configured repository\n  - `read_file`: Read files from any repository\n  - `search_files`: Search for files using wildcards (* and ?)\n- **Resource protocol**: Access files via `repo://repo-name/path/to/file` URIs\n- **Auto-reload**: Configuration automatically reloads when `config.json` changes - no restart needed!\n- **Security built-in**:\n  - Path traversal protection\n  - Automatic skipping of hidden files (starting with .)\n  - Automatic skipping of node_modules directories\n\n## Installation\n\n1. Install the binary:\n   ```bash\n   go install github.com/vimalk78/fs-mcp@latest\n   ```\n\n   Or build locally:\n   ```bash\n   go build -o fs-mcp\n   sudo mv fs-mcp /usr/local/bin/  # Optional: install to system path\n   ```\n\n2. Create your config directory and file:\n   ```bash\n   # Create config directory\n   mkdir -p ~/.config/fs-mcp\n\n   # Copy the example config\n   cp config.example.json ~/.config/fs-mcp/config.json\n\n   # Edit with your actual repository paths\n   vim ~/.config/fs-mcp/config.json\n   ```\n\n   Example `~/.config/fs-mcp/config.json`:\n   ```json\n   {\n     \"repositories\": {\n       \"frontend\": \"/home/yourusername/projects/frontend\",\n       \"backend\": \"/home/yourusername/projects/backend\",\n       \"infrastructure\": \"/home/yourusername/projects/infrastructure\"\n     }\n   }\n   ```\n\n   **Important**:\n   - Use absolute paths for your repositories\n   - The default config location is `~/.config/fs-mcp/config.json` (automatically detected)\n   - You can change repository paths anytime without rebuilding - changes auto-reload!\n\nThat's it! You now have a single executable with configurable repositories.\n\n## Configuration\n\n### For Claude Desktop\n\nAdd this to your Claude Desktop configuration file:\n\n**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n**Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"multi-repo\": {\n      \"command\": \"fs-mcp\"\n    }\n  }\n}\n```\n\nOr if you need to specify a custom config location:\n```json\n{\n  \"mcpServers\": {\n    \"multi-repo\": {\n      \"command\": \"fs-mcp\",\n      \"args\": [\"-config\", \"/path/to/your/config.json\"]\n    }\n  }\n}\n```\n\n**Note**:\n- If using `go install`, ensure `$GOPATH/bin` or `$GOBIN` is in your PATH\n- Config auto-detected at `~/.config/fs-mcp/config.json` if `-config` not specified\n\n### For Claude Code\n\nAdd this to your MCP settings file:\n\n**macOS/Linux**: `~/.config/claude-code/mcp_settings.json`\n**Windows**: `%APPDATA%\\claude-code\\mcp_settings.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"multi-repo\": {\n      \"command\": \"fs-mcp\"\n    }\n  }\n}\n```\n\nOr if you need to specify a custom config location:\n```json\n{\n  \"mcpServers\": {\n    \"multi-repo\": {\n      \"command\": \"fs-mcp\",\n      \"args\": [\"-config\", \"/path/to/your/config.json\"]\n    }\n  }\n}\n```\n\n**Note**:\n- If using `go install`, ensure `$GOPATH/bin` or `$GOBIN` is in your PATH\n- Config auto-detected at `~/.config/fs-mcp/config.json` if `-config` not specified\n- **For Claude CLI**: Use `claude --mcp-config ~/.config/claude-code/mcp_settings.json` to load MCP servers\n\n**Important**:\n- Config file default location: `~/.config/fs-mcp/config.json` (automatically detected)\n- Use absolute paths for repository locations in your config file\n- If `fs-mcp` command not found, ensure Go's bin directory is in your PATH\n\n## Usage\n\nOnce configured, you can use the MCP server through Claude:\n\n### List Repositories\n\n```\nWhat repositories do you have access to?\n```\n\nClaude will call:\n```python\nlist_repos()\n```\n\n### List Files\n\n```\nShow me the files in the backend repository\n```\n\nClaude will call:\n```python\nlist_files(repo=\"backend\", path=\".\", recursive=False)\n```\n\n### Read a File\n\n```\nShow me the file backend/src/api.py\n```\n\nClaude will call:\n```python\nread_file(repo=\"backend\", file=\"src/api.py\")\n```\n\n### Search Files\n\n```\nList all TypeScript files in the frontend repository\n```\n\nClaude will call:\n```python\nsearch_files(repo=\"frontend\", pattern=\"*.ts\")\n```\n\n### Using Resources\n\nYou can also access files using the resource URI format:\n\n```\nRead the file at repo://backend/src/api.py\n```\n\n## Tool Reference\n\n### list_repos\n\nLists all configured repositories and their paths.\n\n**Parameters**: None\n\n**Returns**: JSON object with list of repositories and count\n\n**Example**:\n```json\n{\n  \"repositories\": [\n    {\n      \"name\": \"frontend\",\n      \"path\": \"/home/user/projects/frontend\"\n    },\n    {\n      \"name\": \"backend\",\n      \"path\": \"/home/user/projects/backend\"\n    }\n  ],\n  \"count\": 2\n}\n```\n\n### list_files\n\nLists files in a repository directory.\n\n**Parameters**:\n- `repo` (required): Repository name from your REPOS configuration\n- `path` (optional): Path within the repository (default: \".\")\n- `recursive` (optional): Whether to list files recursively (default: false)\n\n**Returns**: JSON object with repository, path, and list of files\n\n**Example**:\n```json\n{\n  \"repository\": \"frontend\",\n  \"path\": \"src\",\n  \"files\": [\n    \"App.tsx\",\n    \"index.ts\",\n    \"components/\"\n  ]\n}\n```\n\n### read_file\n\nReads a file from a repository.\n\n**Parameters**:\n- `repo` (required): Repository name\n- `file` (required): Path to the file within the repository\n\n**Returns**: Plain text with header showing file location and contents\n\n**Example**:\n```\nFile: backend/src/api.py\n\nfrom flask import Flask\napp = Flask(__name__)\n...\n```\n\n### search_files\n\nSearches for files matching a pattern.\n\n**Parameters**:\n- `repo` (required): Repository name\n- `pattern` (required): File name pattern with wildcards (* and ?)\n\n**Returns**: JSON object with repository, pattern, and matching files\n\n**Example**:\n```json\n{\n  \"repository\": \"frontend\",\n  \"pattern\": \"*.ts\",\n  \"matches\": [\n    \"src/index.ts\",\n    \"src/types/user.ts\",\n    \"src/utils/helper.ts\"\n  ]\n}\n```\n\n## Security\n\nThe server implements several security measures:\n\n1. **Path Traversal Protection**: All paths are validated to ensure they stay within configured repository bounds\n2. **Hidden File Filtering**: Files and directories starting with `.` are automatically skipped\n3. **node_modules Filtering**: The `node_modules` directory is automatically skipped\n4. **Read-only Access**: The server only provides read access to files\n\n## Troubleshooting\n\n### Server not appearing in Claude\n\n1. Check that the configuration file is in the correct location\n2. Verify the `fs-mcp` binary is accessible (check PATH or use absolute path)\n3. For Claude CLI: Ensure you're using the `--mcp-config` flag\n4. Restart Claude Desktop/Code after configuration changes\n5. Check the logs for error messages\n\n### Repository path not found\n\n1. Ensure the paths in your config file are absolute paths\n2. Verify the directories exist and are accessible\n3. Check file permissions\n4. Ensure the `-config` flag points to the correct config file path (if specified)\n\n### File not readable\n\n1. Ensure the file is a text file (binary files are not supported)\n2. Check that the file is not in a hidden directory or node_modules\n3. Verify the file path is correct relative to the repository root\n\n## Development\n\nTo modify or extend the server:\n\n1. Edit `multi_repo_server.py`\n2. Add or modify tools in the `@app.call_tool()` handler\n3. Update the tool schemas in `@app.list_tools()`\n4. Test your changes by restarting Claude\n\n## License\n\nThis project is provided as-is for use with Claude.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvimalk78%2Ffs-mcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvimalk78%2Ffs-mcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvimalk78%2Ffs-mcp/lists"}