feat: them tool list-mongo-collections va find-mongo-documents

parent 01a1baec
# 1. Môi trường và biến nhạy cảm
.env
# 2. File sinh ra từ quá trình chạy Python
__pycache__/
*.py[cod]
*$py.class
# 3. Cấu hình IDE cá nhân
.vscode/
# 4. Thư mục cấu hình tool/agent nội bộ ở local
.zencoder/
.zenflow/
# 5. Cấu hình của nền tảng khác
.github/
# 6. Thư mục chứa môi trường ảo
venv/
# 7. Thư mục chứa dữ liệu MongoDB
mongo_data/
# 8. Thư mục chứa dữ liệu Qdrant
qdrant_data/
version: "3.8"
services:
qdrant:
image: qdrant/qdrant:latest
container_name: qdrant_local
ports:
- "7333:6333" # Map port 7333 ở local vào port 6333 của Qdrant REST API
volumes:
- ./qdrant_data:/qdrant/storage
restart: unless-stopped
mongodb:
image: mongo:latest
container_name: mongodb_local
ports:
- "27017:27017"
volumes:
- ./mongo_data:/data/db
restart: unless-stopped
\ No newline at end of file
import json
import ast
from pymongo import MongoClient
from pymongo.errors import OperationFailure
import os
import pathlib
from dotenv import load_dotenv
......@@ -18,6 +21,19 @@ QDRANT_HOST = os.getenv("QDRANT_HOST", "192.168.0.29")
QDRANT_PORT = int(os.getenv("QDRANT_PORT", 7333))
COLLECTION_NAME = "multi_project_memory" # Collection chung cho tất cả project
GITLAB = Gitlab(os.getenv("GITLAB_URL"), private_token=os.getenv("GITLAB_TOKEN"))
MONGO_URI = os.getenv("MONGO_URI", "mongodb://localhost:27017/")
MONGO_DB_NAME = os.getenv("MONGO_DB_NAME", "meu_rca")
mongo_client = None
mongo_db = None
if MONGO_URI:
try:
mongo_client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000)
mongo_db = mongo_client[MONGO_DB_NAME]
mongo_client.admin.command('ping')
print("✅ Đã kết nối MongoDB thành công.")
except Exception as e:
print(f"❌ Lỗi kết nối MongoDB: {e}")
# Clients
qdrant = QdrantClient(host=QDRANT_HOST, port=QDRANT_PORT)
......@@ -55,6 +71,11 @@ class DeleteContextModel(BaseModel):
class DeleteProjectContextModel(BaseModel):
project_id: str
class MongoFindModel(BaseModel):
collection_name: str
query: str = "{}"
limit: int = 5
@app.get("/agent-context")
def load_agent_context():
workspace_root = pathlib.Path.cwd()
......@@ -234,6 +255,49 @@ def delete_project_context(project_id: str):
)
return f"Deleted all contexts for project '{project_id}'"
@app.get("/list-mongo-collections")
def list_mongo_collections_api():
"""Lấy danh sách các collections hiện có trong MongoDB"""
if mongo_db is None:
return {"error": "MongoDB chưa được cấu hình hoặc kết nối thất bại."}
try:
# Lấy danh sách collections trong database
collections = mongo_db.list_collection_names()
return {"database": MONGO_DB_NAME, "collections": collections}
except Exception as e:
return {"error": f"Lỗi khi lấy danh sách collections: {str(e)}"}
@app.post("/find-mongo-documents")
def find_mongo_documents_api(data: MongoFindModel):
"""Tìm kiếm an toàn (Read-Only) trong một MongoDB collection"""
if mongo_db is None:
return {"error": "MongoDB chưa được cấu hình."}
try:
# Chuyển đổi chuỗi query thành dict một cách an toàn (Anti-Injection)
try:
query_dict = json.loads(data.query)
except Exception:
query_dict = ast.literal_eval(data.query)
if not isinstance(query_dict, dict):
return {"error": "Tham số query phải là một JSON object hợp lệ."}
# Ép limit tối đa là 10 để bảo vệ hệ thống (Hard Limit)
safe_limit = min(max(1, data.limit), 10)
# Ép buộc chỉ được phép đọc (Read-Only)
cursor = mongo_db[data.collection_name].find(query_dict).limit(safe_limit)
results = list(cursor)
# Chuẩn hóa dữ liệu (Serialization)
for doc in results:
if "_id" in doc:
doc["_id"] = str(doc["_id"])
return {"results": results}
except Exception as e:
return {"error": f"Lỗi truy vấn: {str(e)}"}
if __name__ == "__main__":
import uvicorn
uvicorn.run("memory_mcp_server:app", host="0.0.0.0", port=8090)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment