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.
Files changed (21) hide show
  1. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/PKG-INFO +1 -1
  2. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/pyproject.toml +1 -1
  3. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/__init__.py +1 -1
  4. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/client.py +29 -11
  5. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/server.py +26 -3
  6. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/.dockerignore +0 -0
  7. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/.env +0 -0
  8. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/.gitignore +0 -0
  9. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/README.md +0 -0
  10. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/TROUBLESHOOTING.md +0 -0
  11. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/USAGE.md +0 -0
  12. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/DEPLOYMENT.md +0 -0
  13. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/alb-target-group.json +0 -0
  14. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/deploy.sh +0 -0
  15. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/ecs-service-config.json +0 -0
  16. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/ecs-task-definition.json +0 -0
  17. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/aws/security-groups.md +0 -0
  18. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/docker/Dockerfile +0 -0
  19. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/__main__.py +0 -0
  20. {mem_brain_mcp-1.0.4 → mem_brain_mcp-1.0.6}/src/mem_brain_mcp/config.py +0 -0
  21. {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.4
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mem-brain-mcp"
3
- version = "1.0.4"
3
+ version = "1.0.6"
4
4
  description = "MCP Server for Mem-Brain API - Exposes memory operations as MCP tools"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.14"
@@ -1,4 +1,4 @@
1
1
  """Mem-Brain MCP Server - Exposes Mem-Brain API as MCP tools."""
2
2
 
3
- __version__ = "1.0.4"
3
+ __version__ = "1.0.6"
4
4
 
@@ -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.raise_for_status()
69
- return response.json()
70
- except httpx.HTTPStatusError as e:
71
- error_detail = e.response.text if e.response else "No response body"
72
- logger.error(f"API request failed: {e.request.method} {e.request.url} - {e.response.status_code}: {error_detail}")
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
- return APIClient(api_key=token) # api_key parameter now holds JWT token
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