supermemory-agent 0.2.3__tar.gz → 0.2.4__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 (99) hide show
  1. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.github/workflows/publish.yml +20 -5
  2. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/PKG-INFO +28 -1
  3. supermemory_agent-0.2.4/PRIVACY.md +38 -0
  4. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/README.md +27 -0
  5. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/docs/PUBLISHING.md +20 -5
  6. supermemory_agent-0.2.4/docs/RELEASES.md +75 -0
  7. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/pyproject.toml +5 -1
  8. supermemory_agent-0.2.4/scripts/release.py +68 -0
  9. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/server.json +2 -2
  10. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/README.md +2 -0
  11. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/server.py +35 -29
  12. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp_server.py +28 -0
  13. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.claude/skills/supermemory-agent-learning/SKILL.md +0 -0
  14. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.claude/skills/supermemory-agent-learning/examples.md +0 -0
  15. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.claude/skills/supermemory-agent-learning/reference.md +0 -0
  16. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.cursor/skills/supermemory-agent-learning/SKILL.md +0 -0
  17. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.cursor/skills/supermemory-agent-learning/examples.md +0 -0
  18. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.cursor/skills/supermemory-agent-learning/reference.md +0 -0
  19. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.env.example +0 -0
  20. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.gitignore +0 -0
  21. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.mcp.json +0 -0
  22. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/LICENSE +0 -0
  23. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/api/openapi.yaml +0 -0
  24. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/docker-compose.yml +0 -0
  25. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/claude_desktop_config.json +0 -0
  26. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/cursor.mcp.json +0 -0
  27. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/cursor_mcp/mcp.json +0 -0
  28. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/ocr_worker.md +0 -0
  29. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/orchestrator.md +0 -0
  30. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/planner.md +0 -0
  31. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/multi_agent_mcp.py +0 -0
  32. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/run_md_agents.py +0 -0
  33. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/single_agent_mcp.py +0 -0
  34. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/skill_guided_mcp.py +0 -0
  35. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/multi_agent_orchestrator/demo.py +0 -0
  36. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/__init__.py +0 -0
  37. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/analytics/service.py +0 -0
  38. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/collector/__init__.py +0 -0
  39. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/collector/service.py +0 -0
  40. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/distillation/distiller.py +0 -0
  41. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/evaluation/engine.py +0 -0
  42. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/experiments/manager.py +0 -0
  43. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/__init__.py +0 -0
  44. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/confidence.py +0 -0
  45. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/freshness.py +0 -0
  46. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/graph.py +0 -0
  47. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/namespaces.py +0 -0
  48. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/policies.py +0 -0
  49. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/provenance.py +0 -0
  50. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/pruning.py +0 -0
  51. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/retrieval.py +0 -0
  52. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/ttl.py +0 -0
  53. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/validator.py +0 -0
  54. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/optimization/optimizers.py +0 -0
  55. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/promotion/queue.py +0 -0
  56. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/recommendations/engine.py +0 -0
  57. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/reflection/engine.py +0 -0
  58. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/rollback/manager.py +0 -0
  59. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/service.py +0 -0
  60. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/skills/library.py +0 -0
  61. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/telemetry/retrieval.py +0 -0
  62. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/__init__.py +0 -0
  63. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/ports/storage.py +0 -0
  64. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/providers/heuristic.py +0 -0
  65. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/providers/llm.py +0 -0
  66. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/__init__.py +0 -0
  67. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/common.py +0 -0
  68. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/events.py +0 -0
  69. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/graph.py +0 -0
  70. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/lesson.py +0 -0
  71. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/namespace.py +0 -0
  72. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_python/__init__.py +0 -0
  73. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_python/client.py +0 -0
  74. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_server/__init__.py +0 -0
  75. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_server/main.py +0 -0
  76. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/scripts/sync_skills.py +0 -0
  77. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/SKILL.md +0 -0
  78. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/examples.md +0 -0
  79. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/reference.md +0 -0
  80. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/__init__.py +0 -0
  81. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/bridge.py +0 -0
  82. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/handlers.py +0 -0
  83. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/text.py +0 -0
  84. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/__init__.py +0 -0
  85. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/file.py +0 -0
  86. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/postgres_qdrant_redis.py +0 -0
  87. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/sqlite_chroma.py +0 -0
  88. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/conftest.py +0 -0
  89. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/run_all.py +0 -0
  90. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_core.py +0 -0
  91. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp.py +0 -0
  92. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp_comprehensive.py +0 -0
  93. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp_rest_parity.py +0 -0
  94. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_registry.py +0 -0
  95. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_uall.py +0 -0
  96. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/__init__.py +0 -0
  97. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/client.py +0 -0
  98. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/handlers.py +0 -0
  99. {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/server.py +0 -0
@@ -1,4 +1,4 @@
1
- name: Publish PyPI and MCP Registry
1
+ name: Publish Release
2
2
 
3
3
  on:
4
4
  release:
@@ -6,11 +6,11 @@ on:
6
6
  workflow_dispatch:
7
7
 
8
8
  permissions:
9
- contents: read
9
+ contents: write
10
10
  id-token: write
11
11
 
12
12
  jobs:
13
- publish-pypi:
13
+ build-and-publish:
14
14
  runs-on: ubuntu-latest
15
15
  steps:
16
16
  - uses: actions/checkout@v4
@@ -19,12 +19,27 @@ jobs:
19
19
  with:
20
20
  python-version: "3.11"
21
21
 
22
+ - name: Sync version from release tag
23
+ if: github.event_name == 'release'
24
+ run: |
25
+ VERSION="${GITHUB_REF_NAME#v}"
26
+ sed -i "s/^version = \".*\"/version = \"$VERSION\"/" pyproject.toml
27
+ jq --arg v "$VERSION" '.version = $v | .packages[0].version = $v' server.json > server.tmp.json
28
+ mv server.tmp.json server.json
29
+ echo "Building supermemory-agent $VERSION"
30
+
22
31
  - name: Install build tools
23
- run: pip install build twine
32
+ run: pip install build
24
33
 
25
34
  - name: Build package
26
35
  run: python -m build
27
36
 
37
+ - name: Upload release assets
38
+ if: github.event_name == 'release'
39
+ uses: softprops/action-gh-release@v2
40
+ with:
41
+ files: dist/*
42
+
28
43
  - name: Publish to PyPI
29
44
  uses: pypa/gh-action-pypi-publish@release/v1
30
45
  with:
@@ -32,7 +47,7 @@ jobs:
32
47
  skip-existing: true
33
48
 
34
49
  publish-mcp-registry:
35
- needs: publish-pypi
50
+ needs: build-and-publish
36
51
  runs-on: ubuntu-latest
37
52
  steps:
38
53
  - uses: actions/checkout@v4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supermemory-agent
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: SuperMemory: MCP-first learning memory layer for Claude, Cursor, and agent workflows
5
5
  Project-URL: Homepage, https://github.com/YashvantHange/SuperMemory
6
6
  Project-URL: Repository, https://github.com/YashvantHange/SuperMemory
@@ -42,6 +42,10 @@ Description-Content-Type: text/markdown
42
42
 
43
43
  MCP-first learning memory layer for Claude, Cursor, and agent workflows. Captures distilled lessons from failures and corrections (not full transcripts), validates before storage, and improves agents over time through a closed-loop cycle.
44
44
 
45
+ **Monorepo:** MCP server, agent skills (`skills/supermemory-agent-learning/SKILL.md`), REST API, Python SDK, and tests all live in [this repository](https://github.com/YashvantHange/SuperMemory). The PyPI package ships the MCP server and bundled skills together.
46
+
47
+ **Latest release:** [v0.2.4](https://github.com/YashvantHange/SuperMemory/releases/tag/v0.2.4) — each [GitHub Release](https://github.com/YashvantHange/SuperMemory/releases) includes wheel + sdist package assets.
48
+
45
49
  ## Install from PyPI (recommended for Claude / Cursor users)
46
50
 
47
51
  ```bash
@@ -55,6 +59,17 @@ Or with [uv](https://docs.astral.sh/uv/):
55
59
  uvx supermemory-agent --storage .supermemory --transport stdio
56
60
  ```
57
61
 
62
+ After install, bundled agent skills are under `site-packages/skills/supermemory-agent-learning/` (copy to `.cursor/skills/` or `~/.cursor/skills/` as needed).
63
+
64
+ ## Install from GitHub Release
65
+
66
+ Download the wheel from [Releases](https://github.com/YashvantHange/SuperMemory/releases) (each release ships `supermemory_agent-{version}-py3-none-any.whl`):
67
+
68
+ ```bash
69
+ pip install https://github.com/YashvantHange/SuperMemory/releases/download/v0.2.4/supermemory_agent-0.2.4-py3-none-any.whl
70
+ supermemory-agent --storage .supermemory --transport stdio
71
+ ```
72
+
58
73
  ## Install from source (developers)
59
74
 
60
75
  ```bash
@@ -120,6 +135,7 @@ Restart Claude Desktop after editing the config.
120
135
  | **Cursor** | `.cursor/skills/supermemory-agent-learning/` | `~/.cursor/skills/supermemory-agent-learning/` |
121
136
  | **Claude Code** | `.claude/skills/supermemory-agent-learning/` | `~/.claude/skills/supermemory-agent-learning/` |
122
137
  | **Canonical source** | `skills/supermemory-agent-learning/` | edit here, then run `python scripts/sync_skills.py` |
138
+ | **PyPI install** | `site-packages/skills/supermemory-agent-learning/` | bundled with `pip install supermemory-agent` |
123
139
 
124
140
  Mention **SuperMemory**, **agent learning**, or **MCP memory** in chat to load the skill.
125
141
 
@@ -165,6 +181,17 @@ python -m pytest tests/test_core.py -v # GitHub-compatible closed loop
165
181
 
166
182
  MIT — see [LICENSE](LICENSE)
167
183
 
184
+ ## Releases
185
+
186
+ Every version is published to [GitHub Releases](https://github.com/YashvantHange/SuperMemory/releases) with **wheel + sdist** attached, then synced to PyPI and the MCP Registry via CI.
187
+
188
+ ```bash
189
+ # Maintainer: after bumping pyproject.toml + server.json
190
+ python scripts/release.py --title "v0.2.4 — short summary of changes"
191
+ ```
192
+
193
+ See [docs/RELEASES.md](docs/RELEASES.md) for the full release checklist.
194
+
168
195
  ## Publish / list in directories
169
196
 
170
197
  See [docs/PUBLISHING.md](docs/PUBLISHING.md) for MCP Registry, Cursor Directory, and Claude Connectors Directory submission steps.
@@ -0,0 +1,38 @@
1
+ # SuperMemory Privacy Policy
2
+
3
+ **Last updated:** June 13, 2026
4
+ **Contact:** yashvanthange420@gmail.com
5
+
6
+ ## Overview
7
+
8
+ SuperMemory is a local-first MCP server. All learning data is stored on the user's machine in a `.supermemory/` directory. We do not operate a cloud backend for this product.
9
+
10
+ ## Data Collection
11
+
12
+ - SuperMemory stores only data explicitly sent by the user or their AI agent through MCP tools (lessons, policies, skills, event summaries).
13
+ - We do not collect telemetry, analytics, or personal information by default.
14
+ - No data is transmitted to SuperMemory developers unless you voluntarily contact us for support.
15
+
16
+ ## Data Storage
17
+
18
+ - Data is stored locally in the directory configured via `--storage` or `SUPERMEMORY_STORAGE_PATH` (default: `.supermemory/`).
19
+ - Users control retention by deleting their local storage directory.
20
+
21
+ ## Third-Party Sharing
22
+
23
+ - SuperMemory does not share user data with third parties.
24
+ - No third-party AI models are called by the server.
25
+
26
+ ## Security
27
+
28
+ - Local file storage only; no remote authentication required.
29
+ - Optional streamable-http transport runs on localhost by default.
30
+
31
+ ## Your Rights
32
+
33
+ - You may delete all stored data at any time by removing your `.supermemory/` folder.
34
+ - For questions: yashvanthange420@gmail.com or GitHub Issues at https://github.com/YashvantHange/SuperMemory/issues
35
+
36
+ ## Changes
37
+
38
+ We may update this policy on GitHub. Continued use after changes constitutes acceptance.
@@ -4,6 +4,10 @@
4
4
 
5
5
  MCP-first learning memory layer for Claude, Cursor, and agent workflows. Captures distilled lessons from failures and corrections (not full transcripts), validates before storage, and improves agents over time through a closed-loop cycle.
6
6
 
7
+ **Monorepo:** MCP server, agent skills (`skills/supermemory-agent-learning/SKILL.md`), REST API, Python SDK, and tests all live in [this repository](https://github.com/YashvantHange/SuperMemory). The PyPI package ships the MCP server and bundled skills together.
8
+
9
+ **Latest release:** [v0.2.4](https://github.com/YashvantHange/SuperMemory/releases/tag/v0.2.4) — each [GitHub Release](https://github.com/YashvantHange/SuperMemory/releases) includes wheel + sdist package assets.
10
+
7
11
  ## Install from PyPI (recommended for Claude / Cursor users)
8
12
 
9
13
  ```bash
@@ -17,6 +21,17 @@ Or with [uv](https://docs.astral.sh/uv/):
17
21
  uvx supermemory-agent --storage .supermemory --transport stdio
18
22
  ```
19
23
 
24
+ After install, bundled agent skills are under `site-packages/skills/supermemory-agent-learning/` (copy to `.cursor/skills/` or `~/.cursor/skills/` as needed).
25
+
26
+ ## Install from GitHub Release
27
+
28
+ Download the wheel from [Releases](https://github.com/YashvantHange/SuperMemory/releases) (each release ships `supermemory_agent-{version}-py3-none-any.whl`):
29
+
30
+ ```bash
31
+ pip install https://github.com/YashvantHange/SuperMemory/releases/download/v0.2.4/supermemory_agent-0.2.4-py3-none-any.whl
32
+ supermemory-agent --storage .supermemory --transport stdio
33
+ ```
34
+
20
35
  ## Install from source (developers)
21
36
 
22
37
  ```bash
@@ -82,6 +97,7 @@ Restart Claude Desktop after editing the config.
82
97
  | **Cursor** | `.cursor/skills/supermemory-agent-learning/` | `~/.cursor/skills/supermemory-agent-learning/` |
83
98
  | **Claude Code** | `.claude/skills/supermemory-agent-learning/` | `~/.claude/skills/supermemory-agent-learning/` |
84
99
  | **Canonical source** | `skills/supermemory-agent-learning/` | edit here, then run `python scripts/sync_skills.py` |
100
+ | **PyPI install** | `site-packages/skills/supermemory-agent-learning/` | bundled with `pip install supermemory-agent` |
85
101
 
86
102
  Mention **SuperMemory**, **agent learning**, or **MCP memory** in chat to load the skill.
87
103
 
@@ -127,6 +143,17 @@ python -m pytest tests/test_core.py -v # GitHub-compatible closed loop
127
143
 
128
144
  MIT — see [LICENSE](LICENSE)
129
145
 
146
+ ## Releases
147
+
148
+ Every version is published to [GitHub Releases](https://github.com/YashvantHange/SuperMemory/releases) with **wheel + sdist** attached, then synced to PyPI and the MCP Registry via CI.
149
+
150
+ ```bash
151
+ # Maintainer: after bumping pyproject.toml + server.json
152
+ python scripts/release.py --title "v0.2.4 — short summary of changes"
153
+ ```
154
+
155
+ See [docs/RELEASES.md](docs/RELEASES.md) for the full release checklist.
156
+
130
157
  ## Publish / list in directories
131
158
 
132
159
  See [docs/PUBLISHING.md](docs/PUBLISHING.md) for MCP Registry, Cursor Directory, and Claude Connectors Directory submission steps.
@@ -9,7 +9,7 @@ This guide covers listing SuperMemory so **any Claude or Cursor user** can disco
9
9
  | `server.json` | Official [MCP Registry](https://registry.modelcontextprotocol.io) metadata |
10
10
  | `.mcp.json` | Cursor Directory auto-detection ([Open Plugins](https://open-plugins.com)) |
11
11
  | `examples/claude_desktop_config.json` | Claude Desktop MCP config |
12
- | `.github/workflows/publish.yml` | PyPI + MCP Registry on GitHub Release |
12
+ | `.github/workflows/publish.yml` | Build wheel/sdist, attach to GitHub Release, PyPI + MCP Registry |
13
13
 
14
14
  README includes the PyPI ownership marker:
15
15
 
@@ -39,14 +39,28 @@ README includes the PyPI ownership marker:
39
39
 
40
40
  ### Publish (automated — recommended)
41
41
 
42
- 1. Create a GitHub Release (tag e.g. `v0.2.0`).
43
- 2. The `Publish PyPI and MCP Registry` workflow runs automatically.
44
- 3. Verify:
42
+ 1. Bump `version` in `pyproject.toml` and `server.json`, commit, and push to `main`.
43
+ 2. Create a [GitHub Release](https://github.com/YashvantHange/SuperMemory/releases/new) with tag `vX.Y.Z` (must match version).
44
+ 3. The **Publish Release** workflow runs automatically:
45
+ - Builds `supermemory_agent-X.Y.Z-py3-none-any.whl` and `.tar.gz`
46
+ - Uploads both as release assets
47
+ - Publishes to PyPI
48
+ - Publishes to MCP Registry
49
+ 4. Verify:
45
50
 
46
51
  ```bash
47
52
  curl "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.YashvantHange/supermemory"
53
+ pip index versions supermemory-agent
48
54
  ```
49
55
 
56
+ Or use the helper:
57
+
58
+ ```bash
59
+ python scripts/release.py --title "v0.2.4 — short summary"
60
+ ```
61
+
62
+ See [docs/RELEASES.md](RELEASES.md) for the full checklist.
63
+
50
64
  ### Publish (manual)
51
65
 
52
66
  ```bash
@@ -160,7 +174,8 @@ cp -r skills/supermemory-agent-learning ~/.claude/skills/supermemory-agent-learn
160
174
 
161
175
  ## Checklist
162
176
 
163
- - [ ] GitHub Release `v0.2.0` with `PYPI_API_TOKEN` secret set
177
+ - [ ] GitHub Release `v0.2.4` with wheel + sdist assets (see [RELEASES.md](RELEASES.md))
178
+ - [ ] `PYPI_API_TOKEN` secret set for CI
164
179
  - [ ] MCP Registry shows `io.github.YashvantHange/supermemory`
165
180
  - [ ] Submit to [cursor.directory](https://cursor.directory/plugins/new)
166
181
  - [ ] Submit to [Claude Connectors Directory](https://claude.com/docs/connectors/building/submission)
@@ -0,0 +1,75 @@
1
+ # GitHub Releases
2
+
3
+ Every SuperMemory version is published as a [GitHub Release](https://github.com/YashvantHange/SuperMemory/releases) with **installable package assets** attached:
4
+
5
+ | Asset | Purpose |
6
+ |-------|---------|
7
+ | `supermemory_agent-{version}-py3-none-any.whl` | Recommended — `pip install` from file |
8
+ | `supermemory_agent-{version}.tar.gz` | Source distribution |
9
+
10
+ Creating a release also triggers CI to publish the same build to **PyPI** and the **MCP Registry**.
11
+
12
+ ## Release checklist
13
+
14
+ 1. Bump version in `pyproject.toml` and `server.json` (keep them in sync).
15
+ 2. Commit changes with a clear message.
16
+ 3. Push to `main`.
17
+ 4. Create a GitHub Release (tag must match version, e.g. `v0.2.4`).
18
+
19
+ ### Option A — GitHub UI
20
+
21
+ 1. Open [New release](https://github.com/YashvantHange/SuperMemory/releases/new).
22
+ 2. Choose tag `vX.Y.Z` (create from `main` if it does not exist).
23
+ 3. Title example: `v0.2.4 — Skills bundled + tool safety annotations`
24
+ 4. Write release notes (what changed since last tag).
25
+ 5. Click **Publish release**.
26
+
27
+ The `Publish Release` workflow will:
28
+
29
+ - Build wheel + sdist
30
+ - Attach both files to the release
31
+ - Upload to PyPI (`supermemory-agent`)
32
+ - Publish `server.json` to the MCP Registry
33
+
34
+ ### Option B — CLI helper
35
+
36
+ ```bash
37
+ # After bumping pyproject.toml / server.json and pushing:
38
+ python scripts/release.py --title "v0.2.4 — Skills bundled + tool safety annotations"
39
+ ```
40
+
41
+ Requires [GitHub CLI](https://cli.github.com/) (`gh`) authenticated.
42
+
43
+ ### Option C — Manual assets only (no CI)
44
+
45
+ ```bash
46
+ python -m pip install build
47
+ python -m build -n
48
+ gh release create v0.2.4 dist/supermemory_agent-0.2.4* \
49
+ --title "v0.2.4 — Skills bundled + tool safety annotations" \
50
+ --generate-notes
51
+ ```
52
+
53
+ ## Install from a release asset
54
+
55
+ ```bash
56
+ pip install https://github.com/YashvantHange/SuperMemory/releases/download/v0.2.4/supermemory_agent-0.2.4-py3-none-any.whl
57
+ ```
58
+
59
+ Or download the `.whl` and install locally:
60
+
61
+ ```bash
62
+ pip install supermemory_agent-0.2.4-py3-none-any.whl
63
+ supermemory-agent --storage .supermemory --transport stdio
64
+ ```
65
+
66
+ ## Required GitHub secret
67
+
68
+ Set `PYPI_API_TOKEN` under **Settings → Secrets and variables → Actions** so releases can publish to PyPI automatically.
69
+
70
+ ## Version tags
71
+
72
+ | Tag | Highlights |
73
+ |-----|------------|
74
+ | [v0.2.4](https://github.com/YashvantHange/SuperMemory/releases/tag/v0.2.4) | Skills bundled in PyPI wheel; MCP tool safety annotations |
75
+ | [v0.2.0](https://github.com/YashvantHange/SuperMemory/releases/tag/v0.2.0) | First MCP Registry + PyPI publish |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "supermemory-agent"
7
- version = "0.2.3"
7
+ version = "0.2.4"
8
8
  description = "SuperMemory: MCP-first learning memory layer for Claude, Cursor, and agent workflows"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -56,6 +56,10 @@ packages = [
56
56
  [tool.hatch.build.targets.wheel.force-include]
57
57
  "src/supermemory_mcp" = "supermemory_mcp"
58
58
  "storage" = "storage"
59
+ "skills" = "skills"
60
+
61
+ [tool.hatch.build.targets.sdist.force-include]
62
+ "skills" = "skills"
59
63
 
60
64
  [tool.pytest.ini_options]
61
65
  asyncio_mode = "auto"
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env python3
2
+ """Build packages and create a GitHub release with wheel + sdist assets."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import re
8
+ import subprocess
9
+ import sys
10
+ from pathlib import Path
11
+
12
+ ROOT = Path(__file__).resolve().parents[1]
13
+ PYPROJECT = ROOT / "pyproject.toml"
14
+ SERVER_JSON = ROOT / "server.json"
15
+
16
+
17
+ def read_version() -> str:
18
+ text = PYPROJECT.read_text(encoding="utf-8")
19
+ match = re.search(r'^version = "([^"]+)"', text, re.MULTILINE)
20
+ if not match:
21
+ raise SystemExit("Could not read version from pyproject.toml")
22
+ return match.group(1)
23
+
24
+
25
+ def run(cmd: list[str], *, check: bool = True) -> subprocess.CompletedProcess[str]:
26
+ print("+", " ".join(cmd))
27
+ return subprocess.run(cmd, cwd=ROOT, check=check, text=True)
28
+
29
+
30
+ def main() -> None:
31
+ parser = argparse.ArgumentParser(description=__doc__)
32
+ parser.add_argument("--title", help="Release title (default: v{version} — SuperMemory release)")
33
+ parser.add_argument("--notes", help="Release notes file path")
34
+ parser.add_argument("--notes-text", help="Inline release notes")
35
+ parser.add_argument("--draft", action="store_true", help="Create a draft release")
36
+ parser.add_argument("--skip-build", action="store_true", help="Reuse existing dist/ artifacts")
37
+ args = parser.parse_args()
38
+
39
+ version = read_version()
40
+ tag = f"v{version}"
41
+ title = args.title or f"v{version} — SuperMemory release"
42
+
43
+ if not args.skip_build:
44
+ run([sys.executable, "-m", "pip", "install", "build"])
45
+ run([sys.executable, "-m", "build", "-n"])
46
+
47
+ dist = ROOT / "dist"
48
+ assets = sorted(dist.glob(f"supermemory_agent-{version}*"))
49
+ if not assets:
50
+ raise SystemExit(f"No build artifacts found in {dist} for version {version}")
51
+
52
+ cmd = ["gh", "release", "create", tag, *[str(a) for a in assets], "--title", title]
53
+ if args.draft:
54
+ cmd.append("--draft")
55
+ if args.notes:
56
+ cmd.extend(["--notes-file", args.notes])
57
+ elif args.notes_text:
58
+ cmd.extend(["--notes", args.notes_text])
59
+ else:
60
+ cmd.extend(["--generate-notes"])
61
+
62
+ run(cmd)
63
+ print(f"Created {tag} with {len(assets)} package asset(s).")
64
+ print(f"https://github.com/YashvantHange/SuperMemory/releases/tag/{tag}")
65
+
66
+
67
+ if __name__ == "__main__":
68
+ main()
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.YashvantHange/supermemory",
4
4
  "title": "SuperMemory",
5
5
  "description": "MCP-first agent learning: capture failures, validate lessons, retrieve context, improve.",
6
- "version": "0.2.3",
6
+ "version": "0.2.4",
7
7
  "websiteUrl": "https://github.com/YashvantHange/SuperMemory",
8
8
  "repository": {
9
9
  "url": "https://github.com/YashvantHange/SuperMemory",
@@ -14,7 +14,7 @@
14
14
  "registryType": "pypi",
15
15
  "registryBaseUrl": "https://pypi.org",
16
16
  "identifier": "supermemory-agent",
17
- "version": "0.2.3",
17
+ "version": "0.2.4",
18
18
  "runtimeHint": "supermemory-agent",
19
19
  "transport": {
20
20
  "type": "stdio"
@@ -18,6 +18,8 @@ python scripts/sync_skills.py
18
18
 
19
19
  ## Install
20
20
 
21
+ Skills ship in the same repo as the MCP server and are bundled in the `supermemory-agent` PyPI wheel.
22
+
21
23
  ### Cursor (project)
22
24
 
23
25
  Already included at `.cursor/skills/supermemory-agent-learning/`.
@@ -9,6 +9,12 @@ import sys
9
9
  from pathlib import Path
10
10
  from typing import Any
11
11
 
12
+ from mcp.types import ToolAnnotations
13
+
14
+ _RO = ToolAnnotations(readOnlyHint=True, destructiveHint=False)
15
+ _RW = ToolAnnotations(readOnlyHint=False, destructiveHint=False)
16
+ _DX = ToolAnnotations(readOnlyHint=False, destructiveHint=True)
17
+
12
18
  ROOT = Path(__file__).resolve().parents[2]
13
19
  sys.path.insert(0, str(ROOT))
14
20
  sys.path.insert(0, str(ROOT / "packages"))
@@ -33,7 +39,7 @@ def build_server(storage_root: str | None = None):
33
39
  raw = await handle_tool(name, arguments or {}, data_dir=data_dir)
34
40
  return json.loads(raw)
35
41
 
36
- @mcp.tool(name="record_event")
42
+ @mcp.tool(name="record_event", annotations=_RW)
37
43
  async def record_event(
38
44
  event_type: str,
39
45
  summary: str,
@@ -65,7 +71,7 @@ def build_server(storage_root: str | None = None):
65
71
  },
66
72
  )
67
73
 
68
- @mcp.tool(name="record_failure")
74
+ @mcp.tool(name="record_failure", annotations=_RW)
69
75
  async def record_failure(
70
76
  summary: str,
71
77
  workflow: str | None = None,
@@ -95,7 +101,7 @@ def build_server(storage_root: str | None = None):
95
101
  },
96
102
  )
97
103
 
98
- @mcp.tool(name="record_correction")
104
+ @mcp.tool(name="record_correction", annotations=_RW)
99
105
  async def record_correction(
100
106
  summary: str,
101
107
  workflow: str | None = None,
@@ -125,7 +131,7 @@ def build_server(storage_root: str | None = None):
125
131
  },
126
132
  )
127
133
 
128
- @mcp.tool(name="reflect")
134
+ @mcp.tool(name="reflect", annotations=_RW)
129
135
  async def reflect(
130
136
  event_ids: list[str],
131
137
  suggestion: str | None = None,
@@ -137,7 +143,7 @@ def build_server(storage_root: str | None = None):
137
143
  {"event_ids": event_ids, "suggestion": suggestion, "lesson_text": lesson_text},
138
144
  )
139
145
 
140
- @mcp.tool(name="validate")
146
+ @mcp.tool(name="validate", annotations=_RW)
141
147
  async def validate(
142
148
  reflection_id: str | None = None,
143
149
  candidate_lesson: str | None = None,
@@ -155,12 +161,12 @@ def build_server(storage_root: str | None = None):
155
161
  },
156
162
  )
157
163
 
158
- @mcp.tool(name="process_promotions")
164
+ @mcp.tool(name="process_promotions", annotations=_RW)
159
165
  async def process_promotions(limit: int = 50) -> dict[str, Any]:
160
166
  """Process pending validated lessons and promote passing items."""
161
167
  return await _call("process_promotions", {"limit": limit})
162
168
 
163
- @mcp.tool(name="retrieve")
169
+ @mcp.tool(name="retrieve", annotations=_RO)
164
170
  async def retrieve(
165
171
  query: str,
166
172
  workflow: str | None = None,
@@ -192,7 +198,7 @@ def build_server(storage_root: str | None = None):
192
198
  },
193
199
  )
194
200
 
195
- @mcp.tool(name="report_outcome")
201
+ @mcp.tool(name="report_outcome", annotations=_RW)
196
202
  async def report_outcome(
197
203
  lesson_id: str,
198
204
  used: bool,
@@ -214,17 +220,17 @@ def build_server(storage_root: str | None = None):
214
220
  },
215
221
  )
216
222
 
217
- @mcp.tool(name="get_policies")
223
+ @mcp.tool(name="get_policies", annotations=_RO)
218
224
  async def get_policies(namespace: str = "global") -> dict[str, Any]:
219
225
  """Return active policies visible to a namespace."""
220
226
  return await _call("get_policies", {"namespace": namespace})
221
227
 
222
- @mcp.tool(name="add_policy")
228
+ @mcp.tool(name="add_policy", annotations=_RW)
223
229
  async def add_policy(rule: str, namespace: str = "global", priority: int = 100) -> dict[str, Any]:
224
230
  """Add a local policy rule."""
225
231
  return await _call("add_policy", {"rule": rule, "namespace": namespace, "priority": priority})
226
232
 
227
- @mcp.tool(name="add_skill")
233
+ @mcp.tool(name="add_skill", annotations=_RW)
228
234
  async def add_skill(
229
235
  name: str,
230
236
  description: str,
@@ -250,7 +256,7 @@ def build_server(storage_root: str | None = None):
250
256
  },
251
257
  )
252
258
 
253
- @mcp.tool(name="search_skills")
259
+ @mcp.tool(name="search_skills", annotations=_RO)
254
260
  async def search_skills(
255
261
  query: str,
256
262
  workflow: str | None = None,
@@ -263,12 +269,12 @@ def build_server(storage_root: str | None = None):
263
269
  {"query": query, "workflow": workflow, "namespace": namespace, "top_k": top_k},
264
270
  )
265
271
 
266
- @mcp.tool(name="get_skill")
272
+ @mcp.tool(name="get_skill", annotations=_RO)
267
273
  async def get_skill(skill_id: str) -> dict[str, Any]:
268
274
  """Read a reusable skill by ID."""
269
275
  return await _call("get_skill", {"skill_id": skill_id})
270
276
 
271
- @mcp.tool(name="learn.run.start")
277
+ @mcp.tool(name="learn.run.start", annotations=_RW)
272
278
  async def learn_run_start(
273
279
  workflow_id: str,
274
280
  step: str | None = None,
@@ -287,7 +293,7 @@ def build_server(storage_root: str | None = None):
287
293
  },
288
294
  )
289
295
 
290
- @mcp.tool(name="learn.run.event")
296
+ @mcp.tool(name="learn.run.event", annotations=_RW)
291
297
  async def learn_run_event(
292
298
  run_id: str,
293
299
  event_type: str,
@@ -316,7 +322,7 @@ def build_server(storage_root: str | None = None):
316
322
  },
317
323
  )
318
324
 
319
- @mcp.tool(name="learn.run.end")
325
+ @mcp.tool(name="learn.run.end", annotations=_RW)
320
326
  async def learn_run_end(
321
327
  run_id: str,
322
328
  success: bool,
@@ -327,11 +333,11 @@ def build_server(storage_root: str | None = None):
327
333
  {"run_id": run_id, "success": success, "lessons_used": lessons_used or []},
328
334
  )
329
335
 
330
- @mcp.tool(name="learn.store")
336
+ @mcp.tool(name="learn.store", annotations=_RW)
331
337
  async def learn_store(lesson_json: str) -> dict[str, Any]:
332
338
  return await _call("learn.store", {"lesson_json": lesson_json})
333
339
 
334
- @mcp.tool(name="learn.retrieve")
340
+ @mcp.tool(name="learn.retrieve", annotations=_RO)
335
341
  async def learn_retrieve(
336
342
  query: str,
337
343
  workflow: str | None = None,
@@ -350,7 +356,7 @@ def build_server(storage_root: str | None = None):
350
356
  },
351
357
  )
352
358
 
353
- @mcp.tool(name="learn.reflect")
359
+ @mcp.tool(name="learn.reflect", annotations=_RW)
354
360
  async def learn_reflect(
355
361
  event_ids: list[str] | None = None,
356
362
  suggestion: str | None = None,
@@ -375,7 +381,7 @@ def build_server(storage_root: str | None = None):
375
381
  },
376
382
  )
377
383
 
378
- @mcp.tool(name="learn.validate")
384
+ @mcp.tool(name="learn.validate", annotations=_RW)
379
385
  async def learn_validate(
380
386
  failure: str,
381
387
  fix: str,
@@ -392,11 +398,11 @@ def build_server(storage_root: str | None = None):
392
398
  },
393
399
  )
394
400
 
395
- @mcp.tool(name="learn.evaluate")
401
+ @mcp.tool(name="learn.evaluate", annotations=_RO)
396
402
  async def learn_evaluate(run_id: str) -> dict[str, Any]:
397
403
  return await _call("learn.evaluate", {"run_id": run_id})
398
404
 
399
- @mcp.tool(name="learn.feedback")
405
+ @mcp.tool(name="learn.feedback", annotations=_RW)
400
406
  async def learn_feedback(
401
407
  rating: str,
402
408
  comment: str | None = None,
@@ -407,7 +413,7 @@ def build_server(storage_root: str | None = None):
407
413
  {"rating": rating, "comment": comment, "run_id": run_id},
408
414
  )
409
415
 
410
- @mcp.tool(name="learn.improvements")
416
+ @mcp.tool(name="learn.improvements", annotations=_RO)
411
417
  async def learn_improvements(
412
418
  workflow_id: str | None = None,
413
419
  agent_id: str | None = None,
@@ -417,15 +423,15 @@ def build_server(storage_root: str | None = None):
417
423
  {"workflow_id": workflow_id, "agent_id": agent_id},
418
424
  )
419
425
 
420
- @mcp.tool(name="learn.analytics")
426
+ @mcp.tool(name="learn.analytics", annotations=_RO)
421
427
  async def learn_analytics() -> dict[str, Any]:
422
428
  return await _call("learn.analytics", {})
423
429
 
424
- @mcp.tool(name="learn.policies")
430
+ @mcp.tool(name="learn.policies", annotations=_RO)
425
431
  async def learn_policies() -> dict[str, Any]:
426
432
  return await _call("learn.policies", {})
427
433
 
428
- @mcp.tool(name="learn.experiment")
434
+ @mcp.tool(name="learn.experiment", annotations=_RW)
429
435
  async def learn_experiment(
430
436
  resource_id: str,
431
437
  variant_b: str,
@@ -436,7 +442,7 @@ def build_server(storage_root: str | None = None):
436
442
  {"resource_id": resource_id, "variant_b": variant_b, "traffic_split": traffic_split},
437
443
  )
438
444
 
439
- @mcp.tool(name="learn.rollback")
445
+ @mcp.tool(name="learn.rollback", annotations=_DX)
440
446
  async def learn_rollback(
441
447
  resource_type: str,
442
448
  resource_id: str,
@@ -451,11 +457,11 @@ def build_server(storage_root: str | None = None):
451
457
  },
452
458
  )
453
459
 
454
- @mcp.tool(name="learn.skills")
460
+ @mcp.tool(name="learn.skills", annotations=_RO)
455
461
  async def learn_skills(query: str) -> dict[str, Any]:
456
462
  return await _call("learn.skills", {"query": query})
457
463
 
458
- @mcp.tool(name="learn.telemetry")
464
+ @mcp.tool(name="learn.telemetry", annotations=_RW)
459
465
  async def learn_telemetry(
460
466
  lesson_id: str,
461
467
  run_id: str | None = None,
@@ -131,6 +131,34 @@ async def test_mcp_stdio_lists_and_calls_tools(tmp_path):
131
131
  assert skills_data["skills"][0]["skill_id"] == skill_data["id"]
132
132
 
133
133
 
134
+ @pytest.mark.anyio
135
+ async def test_mcp_tools_have_safety_annotations(tmp_path):
136
+ env = os.environ.copy()
137
+ env["PYTHONPATH"] = os.pathsep.join([str(ROOT / "src"), str(ROOT / "packages"), str(ROOT)])
138
+ params = StdioServerParameters(
139
+ command=sys.executable,
140
+ args=[
141
+ "-m",
142
+ "supermemory_mcp.server",
143
+ "--storage",
144
+ str(tmp_path / ".supermemory"),
145
+ "--transport",
146
+ "stdio",
147
+ ],
148
+ env=env,
149
+ )
150
+
151
+ async with stdio_client(params) as (read, write):
152
+ async with ClientSession(read, write) as session:
153
+ await session.initialize()
154
+ tools = await session.list_tools()
155
+ assert len(tools.tools) == 29
156
+ for tool in tools.tools:
157
+ assert tool.annotations is not None, f"{tool.name} missing annotations"
158
+ assert tool.annotations.readOnlyHint is not None
159
+ assert tool.annotations.destructiveHint is not None
160
+
161
+
134
162
  @pytest.fixture
135
163
  def anyio_backend():
136
164
  return "asyncio"