mem-brain-mcp 1.0.4__tar.gz → 1.0.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/PKG-INFO +1 -1
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/pyproject.toml +1 -1
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/__init__.py +1 -1
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/client.py +29 -11
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/server.py +26 -3
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/.dockerignore +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/.env +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/.gitignore +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/README.md +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/TROUBLESHOOTING.md +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/USAGE.md +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/DEPLOYMENT.md +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/alb-target-group.json +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/deploy.sh +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/ecs-service-config.json +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/ecs-task-definition.json +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/security-groups.md +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/docker/Dockerfile +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/__main__.py +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/config.py +0 -0
- {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mem-brain-mcp
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.6
|
|
4
4
|
Summary: MCP Server for Mem-Brain API - Exposes memory operations as MCP tools
|
|
5
5
|
Keywords: ai,claude,cursor,llm,mcp,memory,model-context-protocol
|
|
6
6
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -56,20 +56,37 @@ class APIClient:
|
|
|
56
56
|
url = f"{self.base_url}/{endpoint.lstrip('/')}"
|
|
57
57
|
headers = self._get_headers()
|
|
58
58
|
headers.update(kwargs.pop("headers", {}))
|
|
59
|
+
|
|
60
|
+
# Debug logging for request details
|
|
61
|
+
logger.debug(f"Making {method} request to: {url}")
|
|
62
|
+
logger.debug(f"Headers: {dict((k, v[:20] + '...' if k == 'Authorization' and len(v) > 20 else v) for k, v in headers.items())}")
|
|
63
|
+
if kwargs.get("json"):
|
|
64
|
+
logger.debug(f"Request body: {kwargs.get('json')}")
|
|
65
|
+
if kwargs.get("params"):
|
|
66
|
+
logger.debug(f"Request params: {kwargs.get('params')}")
|
|
59
67
|
|
|
60
68
|
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
61
|
-
response = await client.request(
|
|
62
|
-
method=method,
|
|
63
|
-
url=url,
|
|
64
|
-
headers=headers,
|
|
65
|
-
**kwargs
|
|
66
|
-
)
|
|
67
69
|
try:
|
|
68
|
-
response.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
response = await client.request(
|
|
71
|
+
method=method,
|
|
72
|
+
url=url,
|
|
73
|
+
headers=headers,
|
|
74
|
+
**kwargs
|
|
75
|
+
)
|
|
76
|
+
logger.debug(f"Response status: {response.status_code}")
|
|
77
|
+
logger.debug(f"Response headers: {dict(response.headers)}")
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
response.raise_for_status()
|
|
81
|
+
result = response.json()
|
|
82
|
+
logger.debug(f"Response data keys: {list(result.keys()) if isinstance(result, dict) else 'N/A'}")
|
|
83
|
+
return result
|
|
84
|
+
except httpx.HTTPStatusError as e:
|
|
85
|
+
error_detail = e.response.text if e.response else "No response body"
|
|
86
|
+
logger.error(f"API request failed: {e.request.method} {e.request.url} - {e.response.status_code}: {error_detail}")
|
|
87
|
+
raise
|
|
88
|
+
except httpx.RequestError as e:
|
|
89
|
+
logger.error(f"Request error: {type(e).__name__}: {str(e)}")
|
|
73
90
|
raise
|
|
74
91
|
|
|
75
92
|
async def add_memory(
|
|
@@ -204,6 +221,7 @@ class APIClient:
|
|
|
204
221
|
Returns:
|
|
205
222
|
Statistics response
|
|
206
223
|
"""
|
|
224
|
+
logger.debug("get_stats() called - making request to /stats endpoint")
|
|
207
225
|
return await self._request("GET", "/stats")
|
|
208
226
|
|
|
209
227
|
async def find_path(
|
|
@@ -13,6 +13,7 @@ from starlette.responses import JSONResponse
|
|
|
13
13
|
|
|
14
14
|
from mem_brain_mcp.client import APIClient
|
|
15
15
|
from mem_brain_mcp.config import settings
|
|
16
|
+
from mem_brain_mcp import __version__
|
|
16
17
|
|
|
17
18
|
# The comprehensive agent instructions (embedded for MCP distribution)
|
|
18
19
|
AGENT_INSTRUCTIONS = """You are an intelligent assistant with a persistent, evolving memory graph.
|
|
@@ -143,12 +144,17 @@ async def _get_api_client() -> APIClient:
|
|
|
143
144
|
"""Get API client with per-request JWT token."""
|
|
144
145
|
token = _get_request_token()
|
|
145
146
|
if token:
|
|
146
|
-
|
|
147
|
+
logger.debug(f"Using JWT token from request headers: {token[:20]}...")
|
|
148
|
+
client = APIClient(api_key=token) # api_key parameter now holds JWT token
|
|
149
|
+
logger.debug(f"API client created with base_url: {client.base_url}")
|
|
150
|
+
return client
|
|
147
151
|
# Fallback to config API key (for single-user scenarios)
|
|
148
152
|
if settings.api_key:
|
|
149
153
|
logger.debug("Using config API key as fallback")
|
|
154
|
+
logger.debug(f"API client (fallback) base_url: {api_client.base_url}")
|
|
150
155
|
return api_client # Global instance
|
|
151
156
|
# No token available
|
|
157
|
+
logger.error("No authentication token available - neither from headers nor config")
|
|
152
158
|
raise ToolError("No authentication token provided. Please login using the login tool or configure your JWT token in your MCP client headers.")
|
|
153
159
|
|
|
154
160
|
|
|
@@ -1166,8 +1172,11 @@ async def get_stats(_placeholder: Optional[bool] = None) -> str:
|
|
|
1166
1172
|
# The function actually takes no parameters, but some MCP clients incorrectly require one
|
|
1167
1173
|
try:
|
|
1168
1174
|
logger.info("get_stats called")
|
|
1175
|
+
logger.debug(f"get_stats called with _placeholder={_placeholder} (ignored)")
|
|
1169
1176
|
client = await _get_api_client()
|
|
1177
|
+
logger.debug(f"API client initialized with base_url: {client.base_url}")
|
|
1170
1178
|
result = await client.get_stats()
|
|
1179
|
+
logger.debug(f"get_stats result received: {list(result.keys()) if isinstance(result, dict) else 'N/A'}")
|
|
1171
1180
|
top_tags = ', '.join([f"{tag}({count})" for tag, count in result.get('top_tags', [])[:10]])
|
|
1172
1181
|
return f"""Memory System Statistics:
|
|
1173
1182
|
Total Memories: {result.get('total_memories', 0)}
|
|
@@ -1490,10 +1499,24 @@ async def health_check(request: Request) -> JSONResponse:
|
|
|
1490
1499
|
)
|
|
1491
1500
|
|
|
1492
1501
|
|
|
1502
|
+
def _mask_api_url(url: str) -> str:
|
|
1503
|
+
"""Mask the API URL, showing only the first 1/4 and hiding the rest."""
|
|
1504
|
+
if not url:
|
|
1505
|
+
return "Not set"
|
|
1506
|
+
# Show first 1/4 of the URL, mask the rest
|
|
1507
|
+
url_length = len(url)
|
|
1508
|
+
visible_length = max(1, url_length // 4)
|
|
1509
|
+
if visible_length >= url_length:
|
|
1510
|
+
return url
|
|
1511
|
+
visible_part = url[:visible_length]
|
|
1512
|
+
masked_part = "*" * (url_length - visible_length)
|
|
1513
|
+
return f"{visible_part}{masked_part}"
|
|
1514
|
+
|
|
1515
|
+
|
|
1493
1516
|
def run_server():
|
|
1494
1517
|
"""Run the FastMCP server with HTTP transport."""
|
|
1495
|
-
logger.info(f"Starting Mem-Brain MCP Server on {settings.mcp_server_host}:{settings.mcp_server_port}")
|
|
1496
|
-
logger.info(f"API URL: {settings.api_url}")
|
|
1518
|
+
logger.info(f"Starting Mem-Brain MCP Server v{__version__} on {settings.mcp_server_host}:{settings.mcp_server_port}")
|
|
1519
|
+
logger.info(f"API URL: {_mask_api_url(settings.api_url)}")
|
|
1497
1520
|
logger.info(f"API Key: {'***' if settings.api_key else 'Not set'}")
|
|
1498
1521
|
|
|
1499
1522
|
# Configure CORS for browser-based and MCP clients
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|