memoryintelligence-mcp 0.1.7__tar.gz → 0.1.8__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 (17) hide show
  1. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/CHANGELOG.md +14 -0
  2. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/PKG-INFO +3 -3
  3. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/README.md +2 -2
  4. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/pyproject.toml +1 -1
  5. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/__init__.py +1 -1
  6. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/cli.py +22 -6
  7. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/server.py +1 -1
  8. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/.gitignore +0 -0
  9. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/CONTRIBUTING.md +0 -0
  10. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/LICENSE +0 -0
  11. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/__main__.py +0 -0
  12. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/client.py +0 -0
  13. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/config.py +0 -0
  14. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/keys.py +0 -0
  15. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/paths.py +0 -0
  16. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/umo_format.py +0 -0
  17. {memoryintelligence_mcp-0.1.7 → memoryintelligence_mcp-0.1.8}/src/mi_mcp/vault.py +0 -0
@@ -3,6 +3,20 @@
3
3
  All notable changes to `memoryintelligence-mcp` are documented here.
4
4
  The format follows [Keep a Changelog](https://keepachangelog.com/); this project uses [Semantic Versioning](https://semver.org/).
5
5
 
6
+ ## [0.1.8] — 2026-06-10
7
+
8
+ ### Changed
9
+ - **The MCP server id is now `memoryintelligence`** (was `memory-intelligence`).
10
+ This is the id under `mcpServers` in your config and the name in
11
+ `claude mcp add …`. It now matches the brand/package token everywhere else
12
+ (`MemoryIntelligence`, `memoryintelligence-mcp`) instead of splitting the word
13
+ with a dash.
14
+ - **Auto-migration:** `mi-mcp wire`/`setup` removes the old `memory-intelligence`
15
+ entry from every surface (file configs **and** `claude mcp remove`) before
16
+ adding the new id, so an upgrade leaves no duplicate/orphan. `mi-mcp doctor`
17
+ flags a leftover legacy entry and tells you to re-wire. **Action on upgrade:
18
+ run `mi-mcp wire` once.** (Hand-edited configs: rename the key yourself.)
19
+
6
20
  ## [0.1.7] — 2026-06-09
7
21
 
8
22
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memoryintelligence-mcp
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: MCP server for MemoryIntelligence — give Claude a memory you own, set up in one command
5
5
  Project-URL: Homepage, https://memoryintelligence.io
6
6
  Project-URL: Repository, https://github.com/somewhere11/memoryintelligence-mcp
@@ -249,7 +249,7 @@ So a leaked or committed config file exposes **nothing**.
249
249
  HTTPS; nothing else is transmitted, and the server does not log conversation
250
250
  content or your API key. See [memoryintelligence.io/privacy](https://memoryintelligence.io/privacy).
251
251
  - **Off switch.** Clear `~/.memoryintelligence/mcp/opt-in-paths` (captures skip) or
252
- remove the `memory-intelligence` entry from your Claude config to fully unwire.
252
+ remove the `memoryintelligence` entry from your Claude config to fully unwire.
253
253
 
254
254
  Found a vulnerability? See [SECURITY.md](SECURITY.md) — report privately to
255
255
  connect@somewheremedia.com.
@@ -280,7 +280,7 @@ lowercase-hyphen) — but they collapse to one **long form** and one **short for
280
280
  | `memoryintelligence-mcp` | the **PyPI package** (`pip install` / `uvx`) | PyPI normalizes to lowercase + hyphens |
281
281
  | `mi-mcp` | the **command** you run (`mi-mcp setup`) | short for daily use (`memoryintelligence-mcp` is an alias) |
282
282
  | `mi_mcp` | the Python import package | must be a valid identifier — no hyphens |
283
- | `memory-intelligence` | the **server id** in your MCP config | MCP convention: lowercase-hyphen |
283
+ | `memoryintelligence` | the **server id** in your MCP config | matches the brand token (renamed from `memory-intelligence` in 0.1.8) |
284
284
  | `MI_*` (e.g. `MI_API_KEY`) | environment variables / Keychain service | short prefix |
285
285
 
286
286
  And everything written to disk lives under one on-brand namespace:
@@ -214,7 +214,7 @@ So a leaked or committed config file exposes **nothing**.
214
214
  HTTPS; nothing else is transmitted, and the server does not log conversation
215
215
  content or your API key. See [memoryintelligence.io/privacy](https://memoryintelligence.io/privacy).
216
216
  - **Off switch.** Clear `~/.memoryintelligence/mcp/opt-in-paths` (captures skip) or
217
- remove the `memory-intelligence` entry from your Claude config to fully unwire.
217
+ remove the `memoryintelligence` entry from your Claude config to fully unwire.
218
218
 
219
219
  Found a vulnerability? See [SECURITY.md](SECURITY.md) — report privately to
220
220
  connect@somewheremedia.com.
@@ -245,7 +245,7 @@ lowercase-hyphen) — but they collapse to one **long form** and one **short for
245
245
  | `memoryintelligence-mcp` | the **PyPI package** (`pip install` / `uvx`) | PyPI normalizes to lowercase + hyphens |
246
246
  | `mi-mcp` | the **command** you run (`mi-mcp setup`) | short for daily use (`memoryintelligence-mcp` is an alias) |
247
247
  | `mi_mcp` | the Python import package | must be a valid identifier — no hyphens |
248
- | `memory-intelligence` | the **server id** in your MCP config | MCP convention: lowercase-hyphen |
248
+ | `memoryintelligence` | the **server id** in your MCP config | matches the brand token (renamed from `memory-intelligence` in 0.1.8) |
249
249
  | `MI_*` (e.g. `MI_API_KEY`) | environment variables / Keychain service | short prefix |
250
250
 
251
251
  And everything written to disk lives under one on-brand namespace:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "memoryintelligence-mcp"
7
- version = "0.1.7"
7
+ version = "0.1.8"
8
8
  description = "MCP server for MemoryIntelligence — give Claude a memory you own, set up in one command"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """MI MCP Server — MemoryIntelligence tools for Claude."""
2
2
 
3
- __version__ = "0.1.7"
3
+ __version__ = "0.1.8"
@@ -36,7 +36,11 @@ from pathlib import Path
36
36
  from . import paths
37
37
  from .config import load_opt_in_paths
38
38
 
39
- SERVER_KEY = "memory-intelligence"
39
+ SERVER_KEY = "memoryintelligence"
40
+ # Pre-0.1.8 server ids we replace on wire so an upgrade leaves no orphaned entry.
41
+ # (0.1.7 and earlier registered the server as "memory-intelligence" — the one
42
+ # dash-seam that didn't match the brand/package "memoryintelligence".)
43
+ LEGACY_SERVER_KEYS = ("memory-intelligence",)
40
44
 
41
45
  # Wrapper rendered by `wire`. __MI_MCP_BIN__ is replaced with the absolute path
42
46
  # to the mi-mcp binary (resolved at wire time) so the host can spawn it even
@@ -106,8 +110,10 @@ def _wire_code_via_cli(home: Path, wrapper: Path, dry_run: bool) -> bool:
106
110
  if dry_run:
107
111
  print(f" would run: {' '.join(add_cmd)}")
108
112
  return True
109
- # idempotent: drop any existing entry (any scope) first, then add
110
- subprocess.run([claude, "mcp", "remove", SERVER_KEY], capture_output=True, text=True)
113
+ # idempotent + migrate: drop any existing entry current id AND the legacy
114
+ # pre-0.1.8 ids before re-adding, so an upgrade leaves no orphan.
115
+ for key in (SERVER_KEY, *LEGACY_SERVER_KEYS):
116
+ subprocess.run([claude, "mcp", "remove", key], capture_output=True, text=True)
111
117
  r = subprocess.run(add_cmd, capture_output=True, text=True)
112
118
  if r.returncode != 0:
113
119
  print(f" ! claude mcp add failed ({r.stderr.strip()[:160]}); falling back to file")
@@ -188,7 +194,7 @@ def do_wire(home: Path, surfaces: list[str], dry_run: bool) -> None:
188
194
  bin_path = _mi_mcp_bin()
189
195
  entry = {"command": str(wrapper), "args": [], "env": {}}
190
196
 
191
- print(f"{'DRY-RUN: ' if dry_run else ''}wiring memory-intelligence MCP server")
197
+ print(f"{'DRY-RUN: ' if dry_run else ''}wiring {SERVER_KEY} MCP server")
192
198
  print(f" wrapper → {wrapper}")
193
199
  print(f" execs {bin_path}; resolves MI_API_KEY at launch (no key in configs)")
194
200
  if not dry_run:
@@ -207,6 +213,11 @@ def do_wire(home: Path, surfaces: list[str], dry_run: bool) -> None:
207
213
  cfg_path = cfg_paths[s]
208
214
  cfg = _load_json(cfg_path)
209
215
  servers = cfg.setdefault("mcpServers", {})
216
+ # Migrate: drop any pre-0.1.8 id (e.g. "memory-intelligence") so the
217
+ # rename to "memoryintelligence" doesn't leave a duplicate/orphan entry.
218
+ migrated = [k for k in LEGACY_SERVER_KEYS if servers.pop(k, None) is not None]
219
+ if migrated:
220
+ print(f" {s:8} migrated id {', '.join(migrated)} → {SERVER_KEY}")
210
221
  action = "update" if SERVER_KEY in servers else "add"
211
222
  nochange = servers.get(SERVER_KEY) == entry
212
223
  servers[SERVER_KEY] = entry
@@ -270,8 +281,13 @@ def cmd_doctor(argv: list[str]) -> int:
270
281
  critical=False)
271
282
 
272
283
  for s, p in _surface_paths(home).items():
273
- wired = SERVER_KEY in _load_json(p).get("mcpServers", {})
274
- check(f"{s} wired", wired, str(p) if wired else "(not wired)", critical=False)
284
+ servers = _load_json(p).get("mcpServers", {})
285
+ wired = SERVER_KEY in servers
286
+ legacy = [k for k in LEGACY_SERVER_KEYS if k in servers]
287
+ detail = str(p) if wired else "(not wired)"
288
+ if legacy and not wired:
289
+ detail = f"legacy id {', '.join(legacy)} present — run `mi-mcp wire` to migrate"
290
+ check(f"{s} wired", wired, detail, critical=False)
275
291
 
276
292
  print(f"\n {'healthy ✓' if ok else 'issues found ✗'}")
277
293
  return 0 if ok else 1
@@ -139,7 +139,7 @@ def create_server(config: MIConfig | None = None) -> Server:
139
139
  config = MIConfig.from_env()
140
140
 
141
141
  client = MIClient(config)
142
- server = Server("memory-intelligence", instructions=SERVER_INSTRUCTIONS)
142
+ server = Server("memoryintelligence", instructions=SERVER_INSTRUCTIONS)
143
143
 
144
144
  if os.environ.get("MI_MCP_OPT_IN_ALL") == "1":
145
145
  logger.warning(