better-mem0-mcp 1.1.0b20__py3-none-any.whl → 1.1.0b22__py3-none-any.whl

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.
better_mem0_mcp/config.py CHANGED
@@ -33,43 +33,36 @@ class Settings(BaseSettings):
33
33
  embedder_models: str = "gemini/gemini-embedding-001"
34
34
 
35
35
  def setup_api_keys(self) -> dict[str, list[str]]:
36
- """
37
- Parse API_KEYS and set environment variables for LiteLLM.
36
+ """Parse API_KEYS (format: ENV_VAR:key,...) and set env vars.
37
+
38
+ Example:
39
+ API_KEYS="GOOGLE_API_KEY:abc,GOOGLE_API_KEY:def,OPENAI_API_KEY:xyz"
38
40
 
39
41
  Returns:
40
- Dict mapping provider to list of API keys.
42
+ Dict mapping env var name to list of API keys.
41
43
  """
42
- env_map = {
43
- "gemini": "GOOGLE_API_KEY",
44
- "openai": "OPENAI_API_KEY",
45
- "anthropic": "ANTHROPIC_API_KEY",
46
- "groq": "GROQ_API_KEY",
47
- "deepseek": "DEEPSEEK_API_KEY",
48
- "mistral": "MISTRAL_API_KEY",
49
- }
50
-
51
- keys_by_provider: dict[str, list[str]] = {}
44
+ keys_by_env: dict[str, list[str]] = {}
52
45
 
53
46
  for pair in self.api_keys.split(","):
54
47
  pair = pair.strip()
55
48
  if ":" not in pair:
56
49
  continue
57
50
 
58
- provider, key = pair.split(":", 1)
59
- provider = provider.strip().lower()
51
+ env_var, key = pair.split(":", 1)
52
+ env_var = env_var.strip()
60
53
  key = key.strip()
61
54
 
62
55
  if not key:
63
56
  continue
64
57
 
65
- keys_by_provider.setdefault(provider, []).append(key)
58
+ keys_by_env.setdefault(env_var, []).append(key)
66
59
 
67
- # Set first key of each provider as env var (LiteLLM reads from env)
68
- for provider, keys in keys_by_provider.items():
69
- if provider in env_map and keys:
70
- os.environ[env_map[provider]] = keys[0]
60
+ # Set first key of each env var (LiteLLM reads from env)
61
+ for env_var, keys in keys_by_env.items():
62
+ if keys:
63
+ os.environ[env_var] = keys[0]
71
64
 
72
- return keys_by_provider
65
+ return keys_by_env
73
66
 
74
67
  def parse_database_url(self) -> dict:
75
68
  """Parse DATABASE_URL into connection parameters."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: better-mem0-mcp
3
- Version: 1.1.0b20
3
+ Version: 1.1.0b22
4
4
  Summary: Zero-setup MCP Server for AI memory - works with Neon/Supabase
5
5
  Project-URL: Homepage, https://github.com/n24q02m/better-mem0-mcp
6
6
  Project-URL: Repository, https://github.com/n24q02m/better-mem0-mcp.git
@@ -17,7 +17,7 @@ Classifier: Operating System :: OS Independent
17
17
  Classifier: Programming Language :: Python :: 3
18
18
  Classifier: Programming Language :: Python :: 3.13
19
19
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
- Requires-Python: >=3.13
20
+ Requires-Python: ==3.13.*
21
21
  Requires-Dist: google-genai>=1.0.0
22
22
  Requires-Dist: litellm>=1.0.0
23
23
  Requires-Dist: loguru>=0.7.0
@@ -29,16 +29,28 @@ Description-Content-Type: text/markdown
29
29
 
30
30
  # better-mem0-mcp
31
31
 
32
- **Zero-setup** MCP Server for AI memory. Works with Neon/Supabase free tier.
32
+ **Self-hosted MCP Server for AI memory with PostgreSQL (pgvector).**
33
33
 
34
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
34
+ [![PyPI](https://img.shields.io/pypi/v/better-mem0-mcp)](https://pypi.org/project/better-mem0-mcp/)
35
+ [![Docker](https://img.shields.io/docker/v/n24q02m/better-mem0-mcp?label=docker)](https://hub.docker.com/r/n24q02m/better-mem0-mcp)
36
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
37
+
38
+ ## Features
39
+
40
+ - **Self-hosted PostgreSQL** - Your data stays with you (Neon/Supabase free tier supported)
41
+ - **Graph Memory** - SQL-based relationship tracking alongside vector memory
42
+ - **Multi-provider LLM** - Gemini, OpenAI, Anthropic, Groq, DeepSeek, Mistral
43
+ - **Fallback chains** - Multi-key per provider + multi-model fallback
44
+ - **Zero manual setup** - Just `DATABASE_URL` + `API_KEYS`
45
+
46
+ ---
35
47
 
36
48
  ## Quick Start
37
49
 
38
50
  ### 1. Get Prerequisites
39
51
 
40
- - **Database**: [Neon](https://neon.tech) or [Supabase](https://supabase.com) (free tier)
41
- - **API Key**: [Google AI Studio](https://aistudio.google.com/apikey) (free tier)
52
+ - **Database**: [Neon](https://neon.tech) or [Supabase](https://supabase.com) (free tier works)
53
+ - **API Key**: Any supported provider ([Google AI Studio](https://aistudio.google.com/apikey) is free)
42
54
 
43
55
  ### 2. Add to mcp.json
44
56
 
@@ -52,7 +64,7 @@ Description-Content-Type: text/markdown
52
64
  "args": ["better-mem0-mcp@latest"],
53
65
  "env": {
54
66
  "DATABASE_URL": "postgresql://user:pass@xxx.neon.tech/neondb?sslmode=require",
55
- "API_KEYS": "gemini:AIza..."
67
+ "API_KEYS": "GOOGLE_API_KEY:AIza..."
56
68
  }
57
69
  }
58
70
  }
@@ -69,7 +81,7 @@ Description-Content-Type: text/markdown
69
81
  "args": ["run", "-i", "--rm", "-e", "DATABASE_URL", "-e", "API_KEYS", "n24q02m/better-mem0-mcp:latest"],
70
82
  "env": {
71
83
  "DATABASE_URL": "postgresql://...",
72
- "API_KEYS": "gemini:AIza..."
84
+ "API_KEYS": "GOOGLE_API_KEY:AIza..."
73
85
  }
74
86
  }
75
87
  }
@@ -78,7 +90,7 @@ Description-Content-Type: text/markdown
78
90
 
79
91
  ### 3. Done!
80
92
 
81
- Ask Claude: "Remember that I prefer dark mode and use FastAPI"
93
+ Ask your AI: "Remember that I prefer dark mode and use FastAPI"
82
94
 
83
95
  ---
84
96
 
@@ -86,22 +98,25 @@ Ask Claude: "Remember that I prefer dark mode and use FastAPI"
86
98
 
87
99
  | Variable | Required | Description |
88
100
  |----------|----------|-------------|
89
- | `DATABASE_URL` | Yes | PostgreSQL connection string |
90
- | `API_KEYS` | Yes | `provider:key,...` (multi-key per provider OK) |
91
- | `LLM_MODELS` | No | `provider/model,...` (fallback chain) |
92
- | `EMBEDDER_MODELS` | No | `provider/model,...` (fallback chain) |
101
+ | `DATABASE_URL` | Yes | PostgreSQL with pgvector extension |
102
+ | `API_KEYS` | Yes | `ENV_VAR:key` pairs, comma-separated |
103
+ | `LLM_MODELS` | No | Model fallback chain |
104
+ | `EMBEDDER_MODELS` | No | Embedding model chain |
93
105
 
94
- ### Examples
106
+ ### Supported LiteLLM Providers
95
107
 
96
- **Minimal (Gemini only):**
97
- ```
98
- API_KEYS=gemini:AIza...
108
+ Use environment variable names from [LiteLLM docs](https://docs.litellm.ai/):
109
+ `GOOGLE_API_KEY`, `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GROQ_API_KEY`, etc.
110
+
111
+ **Single provider:**
112
+ ```bash
113
+ API_KEYS=GOOGLE_API_KEY:AIza...
99
114
  ```
100
115
 
101
116
  **Multi-key with fallback:**
102
- ```
103
- API_KEYS=gemini:AIza-1,gemini:AIza-2,openai:sk-xxx
104
- LLM_MODELS=gemini/gemini-2.5-flash,openai/gpt-4o-mini
117
+ ```bash
118
+ API_KEYS=GOOGLE_API_KEY:AIza-1,GOOGLE_API_KEY:AIza-2,OPENAI_API_KEY:sk-xxx
119
+ LLM_MODELS=gemini/gemini-3-flash-preview,openai/gpt-4o-mini
105
120
  EMBEDDER_MODELS=gemini/gemini-embedding-001,openai/text-embedding-3-small
106
121
  ```
107
122
 
@@ -109,7 +124,7 @@ EMBEDDER_MODELS=gemini/gemini-embedding-001,openai/text-embedding-3-small
109
124
 
110
125
  | Setting | Default |
111
126
  |---------|---------|
112
- | `LLM_MODELS` | `gemini/gemini-2.5-flash` |
127
+ | `LLM_MODELS` | `gemini/gemini-3-flash-preview` |
113
128
  | `EMBEDDER_MODELS` | `gemini/gemini-embedding-001` |
114
129
 
115
130
  ---
@@ -118,32 +133,41 @@ EMBEDDER_MODELS=gemini/gemini-embedding-001,openai/text-embedding-3-small
118
133
 
119
134
  | Tool | Description |
120
135
  |------|-------------|
121
- | `memory` | `action`: add, search, list, delete |
122
- | `help` | Detailed documentation |
136
+ | `memory` | Memory operations: `add`, `search`, `list`, `delete` |
137
+ | `help` | Get full documentation for tools |
123
138
 
124
- ### Usage
139
+ ### Usage Examples
125
140
 
126
141
  ```json
127
142
  {"action": "add", "content": "I prefer TypeScript over JavaScript"}
128
- {"action": "search", "query": "preferences"}
143
+ {"action": "search", "query": "programming preferences"}
129
144
  {"action": "list"}
130
145
  {"action": "delete", "memory_id": "abc123"}
131
146
  ```
132
147
 
133
148
  ---
134
149
 
135
- ## Why better-mem0-mcp?
150
+ ## Build from Source
136
151
 
137
- | Feature | Official mem0-mcp | better-mem0-mcp |
138
- |---------|-------------------|-----------------|
139
- | Storage | Mem0 Cloud | **Self-hosted PostgreSQL** |
140
- | Graph Memory | No | **Yes (SQL-based)** |
141
- | LLM Provider | OpenAI only | **Any (Gemini/OpenAI/Ollama/...)** |
142
- | Fallback | No | **Yes (multi-key + multi-model)** |
143
- | Setup | API Key | **DATABASE_URL + API_KEYS** |
152
+ ```bash
153
+ git clone https://github.com/n24q02m/better-mem0-mcp
154
+ cd better-mem0-mcp
155
+
156
+ # Setup (requires mise: https://mise.jdx.dev/)
157
+ mise run setup
158
+
159
+ # Run
160
+ uv run better-mem0-mcp
161
+ ```
162
+
163
+ **Requirements:** Python 3.13+
144
164
 
145
165
  ---
146
166
 
167
+ ## Contributing
168
+
169
+ See [CONTRIBUTING.md](CONTRIBUTING.md)
170
+
147
171
  ## License
148
172
 
149
- MIT
173
+ MIT - See [LICENSE](LICENSE)
@@ -1,12 +1,12 @@
1
1
  better_mem0_mcp/__init__.py,sha256=fcqgbz2HvMCPidqqoPvtRky5pGIHP2w9oVim7UQkuBc,106
2
2
  better_mem0_mcp/__main__.py,sha256=IeeRidmZF4oBaamjQM6FUbhXpsSdE4sQF_6y_D2GEE4,116
3
- better_mem0_mcp/config.py,sha256=vgKLIw3jHyeBLTzzBnuHV5x6Nra0Rbav1IJRL8rLCuk,5576
3
+ better_mem0_mcp/config.py,sha256=cqLGzxYno7SgRMn7Y8GOBR0P4CrBuFjsmFpK6eGZhs0,5312
4
4
  better_mem0_mcp/graph.py,sha256=rE9z6XECiAktEqDNgmwqCpFpvKSn3azO9H4sRBhj8UU,6195
5
5
  better_mem0_mcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  better_mem0_mcp/server.py,sha256=QYLP46pz0U9gkxQKB_g8FMga77ywElMMjSCU-hGZQ-M,5499
7
7
  better_mem0_mcp/docs/memory.md,sha256=198dDuAGccG5Ca7rhEXIU03ZhxNKK44B_Brl2glurGc,1608
8
- better_mem0_mcp-1.1.0b20.dist-info/METADATA,sha256=7gH4AcEC-2vrtkp1CPw2GlBIboRhfnWW0_mS7aw0DPU,3891
9
- better_mem0_mcp-1.1.0b20.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
10
- better_mem0_mcp-1.1.0b20.dist-info/entry_points.txt,sha256=2b7E3D6yo94mQXP2Ms0bhUlWkK9f664f0GrstImOq30,57
11
- better_mem0_mcp-1.1.0b20.dist-info/licenses/LICENSE,sha256=d7xQ6sRyeGus6gnvwgqiQtSY7XdFw0Jd0w5-Co_xHnk,1064
12
- better_mem0_mcp-1.1.0b20.dist-info/RECORD,,
8
+ better_mem0_mcp-1.1.0b22.dist-info/METADATA,sha256=GPpfk3pfbGIzWDVgHn6WdZ2G61sStge0k-EYUlrrUS8,4679
9
+ better_mem0_mcp-1.1.0b22.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
10
+ better_mem0_mcp-1.1.0b22.dist-info/entry_points.txt,sha256=2b7E3D6yo94mQXP2Ms0bhUlWkK9f664f0GrstImOq30,57
11
+ better_mem0_mcp-1.1.0b22.dist-info/licenses/LICENSE,sha256=d7xQ6sRyeGus6gnvwgqiQtSY7XdFw0Jd0w5-Co_xHnk,1064
12
+ better_mem0_mcp-1.1.0b22.dist-info/RECORD,,