librechat-personal-files-mcp
librechat-personal-files-mcp
MCP-сервер, предоставляющий агентам LibreChat личное файловое хранилище для каждого пользователя, постоянную документацию, индексацию/поиск RAG и публикацию непрозрачных публичных ссылок.
Возможности
Хранилище для каждого пользователя: Личные файлы в
/data/private/<userId>/с полным набором операций CRUD, вывода списка и перемещения.Каталог документации:
save_documentation/update_documentationзаписывают вdocs/и обновляютmemory-index.json(схема v2).Интеграция с RAG:
index_documentотправляет содержимое в rag_api черезPOST /embedс canary-проверкой (issue #305);search_knowledge— для семантического поиска;remove_from_knowledge— для удаления.Публикация в общий доступ:
publish_fileсоздает криптографически случайные токены (≥128 бит); файлы отдаются через NginxX-Accel-RedirectсContent-Disposition: attachment,nosniff,no-store.Строгая безопасность: Отказ по умолчанию (fail-closed) при отсутствии или недействительном
X-User-Id; блокировка path traversal; запрет абсолютных путей; запрет сегментов..; обнаружение выхода через симлинки; защита зарезервированных сегментов; атомарная запись индекса с межпроцессной блокировкой.
Related MCP server: knowledge_mgmt
Архитектура
┌──────────────┐ ┌────────────────────────┐ ┌─────────────┐
│ LibreChat │────▶│ librechat-personal-files-mcp │──▶│ rag_api │
│ (Agent) │ MCP │ (stateless HTTP /mcp) │ │ (vector DB) │
└──────────────┘ └────────────────────────┘ └─────────────┘
│
│ GET /files/{token}
▼
┌──────────────┐
│ Nginx │
│ (X-Accel) │
└──────────────┘
│
▼
┌──────────────┐
│ /data/private│ (read-only bind)
└──────────────┘Быстрый старт (разработка)
cd /opt/LibreChat/mcp-personal-files
python -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest
.venv/bin/python -m ruff check .
# Run server
STORAGE_ROOT=/tmp/pf-private JWT_SECRET=$(openssl rand -hex 32) .venv/bin/personal-files-mcpРазвертывание в продакшене
1. Подготовка хоста (выполняется один раз от имени root)
cd /opt/LibreChat
groupadd -g 2500 lcfiles 2>/dev/null || true
mkdir -p ./data/private/_system
chown -R 2000:2500 ./data/private
chmod 2770 ./data/private
setfacl -R -m g:2500:rX,d:g:2500:rX ./data/private 2>/dev/null || \
echo "ACL tools absent; using 644/755 fallback"
grep -q '^JWT_SECRET=' .env || echo "JWT_SECRET=$(openssl rand -hex 32)" >> .env2. Добавьте в docker-compose.override.yml
Скопируйте блоки из docker-compose.snippet.yml в ваш существующий override-файл.
3. Настройте панель администратора LibreChat
Добавьте в разделе Настройки MCP:
mcpSettings:
allowedAddresses:
- 'librechat-personal-files:8080'
mcpServers:
personal-files:
type: streamable-http
url: http://librechat-personal-files:8080/mcp
timeout: 120000
chatMenu: false
headers:
X-User-ID: '{{LIBRECHAT_USER_ID}}'
X-User-Email: '{{LIBRECHAT_USER_EMAIL}}'Перезапустите LibreChat.
4. Конфигурация Nginx (добавьте в существующий блок server)
limit_req_zone $binary_remote_addr zone=pubfiles:10m rate=5r/s;
location ^~ /files/ {
limit_req zone=pubfiles burst=10 nodelay;
limit_req_status 429;
proxy_pass http://librechat-personal-files:8080/files/;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Real-IP $remote_addr;
}
location ^~ /_protected/ {
internal;
alias /data/private/;
}Перезагрузите Nginx.
Переменные окружения
Переменная | По умолчанию | Описание |
|
| Заголовок, передающий идентификатор пользователя |
|
| Корневой каталог для данных пользователя |
|
| Унаследованная общая область (чтение/запись во время миграции) |
|
| Конечная точка rag_api |
| обязательно | Секрет HS256, общий с LibreChat/rag_api (≥32 символов) |
|
| Базовый URL для публичных ссылок |
|
| Максимальный размер отправляемого файла |
|
| Реестр SQLite для публичных ссылок |
Инструменты MCP
Хранилище
list_files(path="", recursive=false, pattern=null)— список файлов и каталоговread_file(path)— читает текст UTF-8; ошибка для бинарных файлов или файлов размером более 2 МБwrite_file(path, content)— записывает текст (UTF-8), создает родительские каталогиupdate_file(path, content)— обновляет существующий файлdelete_file(path)— удаляет файл или каталогmove_file(src, dst)— перемещает в пределах корневого каталога пользователяget_file_info(path)— метаданные + docindex + статус публикации
Документация
save_documentation(filename, content, title?, description?, tags?, topics?)— сохраняет вdocs/, обновляет индекс, не публикует и не индексируетupdate_documentation(filename, content, ...)— обновляет существующий документget_document_metadata(filename)— полная запись индекса
RAG
search_knowledge(query, limit=8)— семантический поиск (в пределах владельца через JWT)index_document(path)— выполняет эмбеддинг + canary-проверку, обновляет статус индексаremove_from_knowledge(path)— удаляет из rag_api, очищает индексget_index_status()— счетчики + состояние rag_api
Публикация
publish_file(path, expires_in_days?)— создает/повторно использует публичную ссылку, возвращает токен и URLunpublish_file(path_or_token)— отзывает ссылку (файл остается приватным)get_public_link(path)— активная ссылка для путиlist_public_links()— все ссылки пользователя
Модель безопасности
Идентификация: Заголовок
X-User-Idвставляется LibreChat ({{LIBRECHAT_USER_ID}}). Если плейсхолдер не заменен → пустая строка → fail-closed.Fail-closed: Отсутствующий/пустой/недействительный заголовок → HTTP 403
{"error":"missing_user_identity"}или{"error":"invalid_user_identity"}.Безопасность путей: Все пути относительные; абсолютные пути и
..отклоняются; выход через симлинк обнаруживается с помощьюPath.resolve()+ проверки префикса.Изоляция: область владельца rag_api обеспечивается JWT
sub/id= userId (PR #319 влит 2026-08-15).Публичные ссылки: Непрозрачные токены
secrets.token_urlsafe(16); в URL нет пользователя/пути; отзыв через410 Gone; ленивая очистка истекших записей.
Разработка
# Run tests
.venv/bin/pytest -q
# Lint
.venv/bin/ruff check .
# Type check (optional)
.venv/bin/mypy src/personal_files_mcp # if mypy added to depsЛицензия
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to process files locally — OCR images, extract text from PDFs and DOCX, and describe images using local vision models, all without sending data to external services.
- AlicenseNot gradedqualityDmaintenanceEnables uploading, organizing, and semantically searching documents with support for various file types and embedding providers.27MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents with long-term memory and retrieval-augmented generation (RAG) capabilities, allowing them to recall past conversations, search local files, and learn user preferences.MIT
- AlicenseAqualityCmaintenanceProvides AI agents with local file-processing capabilities for token counting, RAG chunking, CSV/JSON conversion, QR generation, and more, while keeping documents private on the user's machine.71MIT
Related MCP Connectors
File uploads for AI agents. Upload, list, and manage files. No signup required.
Securely search and manage workspace context files for AI agents and teams.
Upload any file, get a tracked shareable link. DocSend for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/martinriesel/librechat-personal-files-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server