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.
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.github/workflows/publish.yml +20 -5
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/PKG-INFO +28 -1
- supermemory_agent-0.2.4/PRIVACY.md +38 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/README.md +27 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/docs/PUBLISHING.md +20 -5
- supermemory_agent-0.2.4/docs/RELEASES.md +75 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/pyproject.toml +5 -1
- supermemory_agent-0.2.4/scripts/release.py +68 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/server.json +2 -2
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/README.md +2 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/server.py +35 -29
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp_server.py +28 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.claude/skills/supermemory-agent-learning/SKILL.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.claude/skills/supermemory-agent-learning/examples.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.claude/skills/supermemory-agent-learning/reference.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.cursor/skills/supermemory-agent-learning/SKILL.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.cursor/skills/supermemory-agent-learning/examples.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.cursor/skills/supermemory-agent-learning/reference.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.env.example +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.gitignore +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/.mcp.json +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/LICENSE +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/api/openapi.yaml +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/docker-compose.yml +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/claude_desktop_config.json +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/cursor.mcp.json +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/cursor_mcp/mcp.json +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/ocr_worker.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/orchestrator.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/planner.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/multi_agent_mcp.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/run_md_agents.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/single_agent_mcp.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/skill_guided_mcp.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/multi_agent_orchestrator/demo.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/analytics/service.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/collector/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/collector/service.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/distillation/distiller.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/evaluation/engine.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/experiments/manager.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/confidence.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/freshness.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/graph.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/namespaces.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/policies.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/provenance.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/pruning.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/retrieval.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/ttl.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/memory/validator.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/optimization/optimizers.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/promotion/queue.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/recommendations/engine.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/reflection/engine.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/rollback/manager.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/service.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/skills/library.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/telemetry/retrieval.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/ports/storage.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/providers/heuristic.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/providers/llm.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/common.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/events.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/graph.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/lesson.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/schemas/namespace.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_python/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_python/client.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_server/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_server/main.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/scripts/sync_skills.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/SKILL.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/examples.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/reference.md +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/bridge.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/handlers.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/src/supermemory_mcp/text.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/file.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/postgres_qdrant_redis.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/sqlite_chroma.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/conftest.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/run_all.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_core.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp_comprehensive.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_mcp_rest_parity.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_registry.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/tests/test_uall.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/__init__.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/client.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/handlers.py +0 -0
- {supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/uall_mcp/server.py +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: Publish
|
|
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:
|
|
9
|
+
contents: write
|
|
10
10
|
id-token: write
|
|
11
11
|
|
|
12
12
|
jobs:
|
|
13
|
-
publish
|
|
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
|
|
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
|
|
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
|
+
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
|
|
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.
|
|
43
|
-
2.
|
|
44
|
-
3.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
17
|
+
"version": "0.2.4",
|
|
18
18
|
"runtimeHint": "supermemory-agent",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
@@ -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"
|
|
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
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/ocr_worker.md
RENAMED
|
File without changes
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/mcp_agents/agents/orchestrator.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/examples/multi_agent_orchestrator/demo.py
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall/optimization/optimizers.py
RENAMED
|
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
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/packages/uall_core/providers/heuristic.py
RENAMED
|
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
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/SKILL.md
RENAMED
|
File without changes
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/examples.md
RENAMED
|
File without changes
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/skills/supermemory-agent-learning/reference.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supermemory_agent-0.2.3 → supermemory_agent-0.2.4}/storage/adapters/postgres_qdrant_redis.py
RENAMED
|
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
|