Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
181 commits
Select commit Hold shift + click to select a range
600632a
perf(mcp): stop memwal_remember blocking on the whole Walrus write
hien-p Sep 15, 2026
35436f2
fix(mcp): match the SDK's real job-timeout shape, not a class name
hien-p Sep 15, 2026
63deb0e
perf(mcp): return memwal_remember at accept, not at done
hien-p Sep 15, 2026
af92c91
perf(relayer): pick the least-loaded upload wallet, not the next one
hien-p Sep 15, 2026
956de95
chore(mcp): move the sidecar off the stale 0.0.3-era SDK pin
hien-p Sep 15, 2026
83534a6
perf(mcp): stop bulk and analyze polling on the SDK's 10s ceiling
hien-p Sep 15, 2026
62fd954
fix(mcp): give each tool its own orphan deadline
hien-p Sep 15, 2026
1540349
perf(sdk): cut poll dead time and collapse replayed writes onto one job
hien-p Sep 15, 2026
d83b900
perf(mcp): return memwal_remember_bulk at accept, like memwal_remember
hien-p Sep 15, 2026
10ba9e1
fix(mcp): bound the relayer calls the SDK leaves without a deadline
hien-p Sep 15, 2026
9385153
fix(sdk): give every relayer request a deadline
hien-p Sep 15, 2026
d6d18b8
fix(relayer): fail remember jobs whose preparation never ran
hien-p Sep 15, 2026
c1b2561
fix(server): recall sort precedence and the embedding size check (WAL…
nikola0x0 Sep 16, 2026
7cbe952
fix(relayer): point the upload-queue saturation alert at real counter…
nikola0x0 Sep 16, 2026
0c765a0
fix(mcp,server): stop losing the delegate key when a login is interru…
nikola0x0 Sep 16, 2026
efd82a9
docs(mcp): tell agents that bulk returns job_ids too
hien-p Sep 16, 2026
a353114
fix(relayer): space out upload retries instead of burning them in a s…
hien-p Sep 16, 2026
524c3e8
fix(mcp): report accepted-then-failed writes on the next recall
hien-p Sep 16, 2026
719feb6
fix(mcp): keep the status wait under the MCP client's own deadline
hien-p Sep 16, 2026
df314c3
test(mcp): assert the batch status accounts for jobs, not that they l…
hien-p Sep 16, 2026
1946ff1
fix(mcp): let the bridge's cold-start tools match what the sidecar ac…
hien-p Sep 16, 2026
1f1210a
fix(mcp): stop a still-uploading row reading as a failed one
hien-p Sep 16, 2026
fa918d3
fix(relayer): stop the orphan sweep from failing healthy bulk and ana…
hien-p Sep 16, 2026
f7ee4cc
fix: sanitize the recall failure report, and stop telling bulk a retr…
hien-p Sep 16, 2026
a4a94e4
fix(sdk): keep the request deadline ref'd so it can actually fire
hien-p Sep 16, 2026
f205b6d
test(server): seed a bulk job the way the routes actually write it
hien-p Sep 16, 2026
99a9bb3
test(mcp): expect memwal_remember_status in cold-start discovery
hien-p Sep 16, 2026
e903f43
fix(mcp): honour the relayer's retry_after instead of dropping the fact
hien-p Sep 16, 2026
1d17fbf
fix(relayer): let a failed job be re-prepared without waiting out the…
hien-p Sep 16, 2026
b793b3f
perf(mcp): return memwal_analyze at accept, like the remember tools
hien-p Sep 16, 2026
8f923d0
fix(relayer): report a failed write once, and let the transfer arm ma…
hien-p Sep 16, 2026
eb8d35d
fix(relayer): back off on the durable upload exit too, not just the l…
hien-p Sep 16, 2026
b551a9f
fix(mcp): keep the sidecar's deadline timer ref'd too
hien-p Sep 16, 2026
da91fed
fix(mcp,sdk): restore the blocking default, and ship the version bump…
hien-p Sep 16, 2026
fbc1d31
revert(sdk): hand the poll cadence back to #902
hien-p Sep 16, 2026
68fd4c4
fix(mcp): close the three gaps D1's default left behind
hien-p Sep 16, 2026
c3882e2
test(mcp): make the dropped-job_id test actually reach the wait path
hien-p Sep 16, 2026
0f4afd8
fix(mcp): stop counting in-flight writes as failed, and correct the t…
hien-p Sep 16, 2026
877a48f
fix(relayer): let a re-tried write be reported if it fails again
hien-p Sep 16, 2026
de98e6c
Merge pull request #918 from MystenLabs/harry/walm-mcp-remember-fast-…
harrymove-ctrl Sep 16, 2026
d71efdb
fix(relayer): apply migration 021 so the failed-write report has its …
hien-p Sep 16, 2026
52b7e1a
fix(relayer): claim the failed-write report at delivery, not before t…
hien-p Sep 16, 2026
0559ad2
fix(mcp): stop analyze counting in-flight writes as failed, and keep …
hien-p Sep 16, 2026
a04186e
fix(mcp): keep bulk's job_ids when the relayer goes quiet, and correc…
hien-p Sep 16, 2026
bc7bf46
docs(mcp): record the 60s client-timeout constraint next to the wait …
hien-p Sep 16, 2026
7a033c9
fix(relayer): give the remember test pool migration 021, and cover th…
hien-p Sep 16, 2026
f2e461d
fix(relayer): serialise VectorDb::new() in tests so the migration cha…
hien-p Sep 16, 2026
8fe4fee
refactor(server): make the migration pipeline a checked list
hien-p Sep 17, 2026
d1df49f
fix(mcp): stop cold start advertising tools the relayer may not serve
hien-p Sep 17, 2026
1857c6b
fix(relayer): stop register-shape rejections burning the whole retry …
hien-p Sep 17, 2026
1a4ccae
fix(sidecar): make a rejected register transaction say what it saw
hien-p Sep 17, 2026
0b2a2bb
fix(sidecar): give the direct-signed register its ValidDuring window
hien-p Sep 17, 2026
723baec
fix(sdk): honour retry-after when a status poll is rate-limited
hien-p Sep 17, 2026
3cb5562
fix(mcp): return memwal_remember at accept so the agent can keep working
hien-p Sep 17, 2026
87573c7
fix(mcp): stop misreporting the rate limit, and keep analyze inside t…
hien-p Sep 17, 2026
9e02194
fix(mcp): stop the handoff test pinning a tool cold start no longer s…
hien-p Sep 17, 2026
8e50a6a
fix(sidecar): give direct storage-node uploads a timeout knob
hien-p Sep 17, 2026
5377867
fix(relayer,mcp): say when accepted writes are not landing
hien-p Sep 17, 2026
d5669d8
fix(mcp): stop a rate-limited poll reading as "still uploading"
hien-p Sep 17, 2026
7d370dc
fix(sidecar): make upload-slot release idempotent and observable
hien-p Sep 17, 2026
22ef36d
fix(relayer): mark exhausted Walrus uploads failed immediately
hien-p Sep 17, 2026
b460135
fix(mcp): pin plugin launchers to published 0.0.14-dev.0
hien-p Sep 17, 2026
d8e2ad0
fix(mcp): create hook state markers exclusively in a private directory
hien-p Sep 17, 2026
0d2b6da
fix(mcp): stop the codex installer from interpolating shell syntax fr…
hien-p Sep 17, 2026
fbc1c59
fix(mcp): require approval before using repo-local credentials
hien-p Sep 17, 2026
ad2dfe5
fix(mcp): remove only MemWal's own codex hook entries
hien-p Sep 17, 2026
1955afb
fix(mcp): launch the MCP server from a trusted absolute path instead …
hien-p Sep 17, 2026
be50acf
fix(mcp): filter credentials from automatic memory and require opt-in
hien-p Sep 17, 2026
60beabd
fix(mcp): redact hex key material by its label, not its entropy
hien-p Sep 17, 2026
780608f
fix(mcp): ask once at login instead of defaulting automatic memory off
hien-p Sep 17, 2026
da73a48
revert: drop the #918 failed-write report (and migration 021)
hien-p Sep 17, 2026
2adfb26
docs: document writes=degraded and the 0.0.14-dev.0 pin
hien-p Sep 17, 2026
d03ac41
docs(mcp): default remember wait is 0 (accept), not 90s
hien-p Sep 17, 2026
3392a8d
fix(mcp): teach agents that job_id-at-accept is the normal remember r…
hien-p Sep 17, 2026
812cfe5
test(mcp): match Settle/settle in cold-start pending-write copy
hien-p Sep 18, 2026
d0a1014
fix(mcp): trust the runtime dir by ownership and location, not absolu…
hien-p Sep 18, 2026
50a61cd
fix(mcp): migrate an existing Codex npx registration instead of skipp…
hien-p Sep 18, 2026
9473826
docs(mcp): correct what the trusted launcher actually guarantees (WAL…
hien-p Sep 18, 2026
f3ac987
fix(mcp): close two holes in the repo-credentials approval gate
hien-p Sep 18, 2026
bbcef34
fix(mcp): stop a repo deciding whether automatic memory is on (WALM-642)
hien-p Sep 18, 2026
7cbdb71
fix(server): widen the credential patterns and bound the URL rule (WA…
hien-p Sep 18, 2026
5cfe1d0
fix(server): scope the screen to the batch and the span, not one stri…
hien-p Sep 18, 2026
ca80771
refactor(server): say plainly when the batch screen has nothing to do…
hien-p Sep 18, 2026
c007c94
fix(relayer): drop leftover failure_reported_at if a preview deploy c…
hien-p Sep 18, 2026
6c4bfa2
fix(mcp): report a terminal status probe as failed, not still uploading
hien-p Sep 18, 2026
13b6de5
fix(mcp): refuse unadvertised tools during cold start, and stop namin…
hien-p Sep 18, 2026
ea91d05
fix(mcp): forget the previous relayer's tool set on reconnect
hien-p Sep 18, 2026
9ece083
fix(relayer): bound the /health write-outcome probe at 1s and fail open
hien-p Sep 18, 2026
66f8eca
docs(mcp): drop the wait-default design history
hien-p Sep 18, 2026
f25b686
docs(mcp): remember returns at accept, not after the Walrus upload
hien-p Sep 18, 2026
c8e072a
feat(python-sdk): list_namespaces() so an agent can discover namespac…
nikola0x0 Sep 18, 2026
bbf1516
fix(status): treat writes=degraded as degraded, not operational
hien-p Sep 18, 2026
e34446a
fix(relayer): index remember_jobs for the /health write-outcome probe
hien-p Sep 18, 2026
e508190
docs: correct the storage-node timeout story and cold-start blob_id c…
hien-p Sep 18, 2026
2a23e87
fix(relayer): recover every CONCURRENTLY-built index, not just 016's
hien-p Sep 18, 2026
7a7eb3d
fix(relayer): do not DROP a live CREATE INDEX CONCURRENTLY
hien-p Sep 18, 2026
9d37b0b
fix(status,relayer): allowlist health writes; do not pool a timeout-0…
hien-p Sep 18, 2026
432b9bd
fix(relayer,status): bound the boot lock, not just the build; allowli…
hien-p Sep 18, 2026
dccce7f
test(relayer): pin the repro for the alert predicate deciding row status
hien-p Sep 18, 2026
cdb3ee4
fix(relayer): statement_timeout does abort lock waits; trim the last …
hien-p Sep 18, 2026
00d0004
chore(relayer,status): drop the comments added in this branch's last …
hien-p Sep 18, 2026
09db12d
fix(relayer): poll the concurrent-index lock instead of blocking on it
hien-p Sep 18, 2026
2ae3f24
fix(chatbot): scope the vote existence check to the chat (WALM-657)
hien-p Sep 21, 2026
9c18485
fix(sdk): anchor the memory trust policy at the start of the prompt (…
hien-p Sep 21, 2026
c5f2512
fix(sdk): keep the request deadline armed across the body read (WALM-…
hien-p Sep 21, 2026
2a697c6
fix(sdk): preserve the wrapped model's specificationVersion (WALM-663)
hien-p Sep 21, 2026
cafcd97
fix(relayer): retry transient Sui GetObject failures instead of 503 (…
hien-p Sep 21, 2026
9b7e43f
fix(mcp): tell the user when recovery switches the active account (WA…
hien-p Sep 21, 2026
06e1d28
fix(sdk): reject signing after destroy() instead of signing with a ze…
hien-p Sep 21, 2026
ba6a907
docs(mcp): document login-pending.json in the README (WALM-647)
hien-p Sep 21, 2026
dbcc086
fix(python-sdk): keep unreturned jobs pending across bulk status poll…
hien-p Sep 21, 2026
42b35d0
fix(sdk): redact IPv6 and 0.0.0.0 loopback forms in error text (WALM-…
hien-p Sep 21, 2026
d14d5fd
docs: attribute the write-ahead login work to 0.0.14 (WALM-649)
hien-p Sep 21, 2026
d8cef1e
fix(relayer): accept an idempotency key on remember bulk (WALM-659)
hien-p Sep 21, 2026
42c04c6
fix(oauth): validate the authorization code before consuming it (WALM…
hien-p Sep 21, 2026
8429818
fix(relayer): re-drive a collapsed bulk item nothing is preparing (WA…
hien-p Sep 21, 2026
8889578
fix(relayer): make the GetObject retry subordinate to the stale-serve…
hien-p Sep 21, 2026
3525e09
fix(relayer): keep a wrapped transient cause out of the shape classifier
hien-p Sep 21, 2026
ef1191e
fix(mcp): keep every job_id when the batch status probe answers for f…
hien-p Sep 21, 2026
ccf81da
test(mcp): pin that a partial batch-status probe drops no job
hien-p Sep 21, 2026
168f0bb
Merge pull request #921 from MystenLabs/harry/walm-918-followups
harrymove-ctrl Sep 21, 2026
2e7e46e
Merge origin/dev into harryphan/walm-649-changelog-attribution
hien-p Sep 21, 2026
39c1df4
Merge branch 'dev' into harryphan/walm-639-repo-credentials-can-silen…
hien-p Sep 21, 2026
722c97e
Merge origin/dev into harryphan/walm-640-npx-can-run-a-projects-fake-…
hien-p Sep 21, 2026
a49ed60
Merge branch 'dev' into harryphan/walm-642-automatic-memory-lacks-con…
hien-p Sep 21, 2026
2b44b79
Merge pull request #958 from MystenLabs/harryphan/walm-639-repo-crede…
harrymove-ctrl Sep 21, 2026
a24860e
Merge pull request #960 from MystenLabs/harryphan/walm-641-codex-hook…
harrymove-ctrl Sep 21, 2026
37edf4d
Merge pull request #963 from MystenLabs/harryphan/walm-644-hook-state…
harrymove-ctrl Sep 21, 2026
83ae72c
Merge pull request #956 from MystenLabs/harryphan/walm-649-changelog-…
harrymove-ctrl Sep 21, 2026
0ab0cd8
Merge branch 'dev' into harryphan/walm-647-document-login-pending
hien-p Sep 21, 2026
f2e95cc
fix(mcp): launcher installs 0.0.14-dev.1, not dev.0
hien-p Sep 21, 2026
55aca37
fix(mcp): do not show a blob_id on a write that has not landed
hien-p Sep 21, 2026
9407bbc
Merge branch 'dev' into harryphan/walm-642-automatic-memory-lacks-con…
hien-p Sep 21, 2026
1156b99
test(mcp): pin what mcpPackageVersion is allowed to be
hien-p Sep 21, 2026
727b326
ci(mcp): check the launcher pin is a version npm actually has
hien-p Sep 21, 2026
bafaa42
fix(mcp): move the launcher pin on to 0.0.14-dev.2
hien-p Sep 21, 2026
643b7e8
ci(mcp): let the release pin ahead of npm, but only on main
hien-p Sep 21, 2026
cdade4a
fix(mcp): refuse a repo-supplied MEMWAL_CREDS_DIR in the auto-save ho…
hien-p Sep 21, 2026
fd83b88
Merge origin/dev into harryphan/walm-614-retry-sui-getobject
hien-p Sep 21, 2026
ecd49f8
Merge remote-tracking branch 'origin/dev' into w646
hien-p Sep 21, 2026
f7cb1a1
Merge remote-tracking branch 'origin/dev' into w947
hien-p Sep 21, 2026
139bf9d
Merge remote-tracking branch 'origin/dev' into w660
hien-p Sep 21, 2026
7615d4b
Merge remote-tracking branch 'origin/dev' into w951
hien-p Sep 21, 2026
b8557fa
Merge remote-tracking branch 'origin/dev' into w954
hien-p Sep 21, 2026
27af5ff
Merge remote-tracking branch 'origin/dev' into w657
hien-p Sep 21, 2026
69e7f25
Merge origin/dev into harryphan/walm-659-bulk-idempotency-key
hien-p Sep 21, 2026
829ddd2
Merge remote-tracking branch 'origin/dev' into w944
hien-p Sep 21, 2026
cda69f9
Merge origin/dev into harryphan/walm-656-validate-before-consume
hien-p Sep 21, 2026
f94ce9a
Merge remote-tracking branch 'origin/dev' into w948
hien-p Sep 21, 2026
0613441
Merge pull request #951 from MystenLabs/harryphan/walm-665-destroy-in…
harrymove-ctrl Sep 21, 2026
4421fd2
Merge pull request #954 from MystenLabs/harryphan/walm-666-redact-loo…
harrymove-ctrl Sep 21, 2026
8798d42
Merge pull request #944 from MystenLabs/harryphan/walm-658-anchor-mem…
harrymove-ctrl Sep 21, 2026
c296cdb
Merge pull request #948 from MystenLabs/harryphan/walm-663-preserve-s…
harrymove-ctrl Sep 21, 2026
0772855
Merge pull request #950 from MystenLabs/harryphan/walm-646-recovery-r…
harrymove-ctrl Sep 21, 2026
4578ed0
Merge pull request #952 from MystenLabs/harryphan/walm-647-document-l…
harrymove-ctrl Sep 21, 2026
233e6a7
Merge pull request #949 from MystenLabs/harryphan/walm-614-retry-sui-…
harrymove-ctrl Sep 21, 2026
ac36986
Merge pull request #955 from MystenLabs/harryphan/walm-659-bulk-idemp…
harrymove-ctrl Sep 21, 2026
4da8c22
Merge pull request #957 from MystenLabs/harryphan/walm-656-validate-b…
harrymove-ctrl Sep 21, 2026
7581d69
Merge pull request #945 from MystenLabs/harryphan/walm-657-scope-vote…
harrymove-ctrl Sep 21, 2026
ab338b3
Merge remote-tracking branch 'origin/dev' into w947
hien-p Sep 21, 2026
01ff313
fix(sdk): keep a classified error when the deadline expires mid-body …
hien-p Sep 21, 2026
adb400e
Merge pull request #947 from MystenLabs/harryphan/walm-648-deadline-a…
harrymove-ctrl Sep 21, 2026
2ce7787
Merge remote-tracking branch 'origin/dev' into w642d
hien-p Sep 21, 2026
c7cb4c3
Merge remote-tracking branch 'origin/dev' into w959
hien-p Sep 21, 2026
5f219dd
Merge remote-tracking branch 'origin/dev' into w962
hien-p Sep 21, 2026
51da674
Merge harryphan/walm-640-npx-can-run-a-projects-fake-mcp-package-even…
hien-p Sep 21, 2026
f8750a0
Merge commit 'adb400e34880097a08a23aff9cc64eed194e6182' into HEAD
Sep 21, 2026
18bf102
Merge pull request #953 from MystenLabs/harryphan/walm-660-python-ret…
harrymove-ctrl Sep 21, 2026
fffe0f8
Merge pull request #959 from MystenLabs/harryphan/walm-640-npx-can-ru…
harrymove-ctrl Sep 21, 2026
cb9ba57
Merge pull request #962 from MystenLabs/harryphan/walm-643-codex-inst…
harrymove-ctrl Sep 21, 2026
eea892f
merge(dev): resolve WALM-642 conflict in remember-bulk
harryphan Sep 21, 2026
36b010f
Merge pull request #961 from MystenLabs/harryphan/walm-642-automatic-…
harrymove-ctrl Sep 21, 2026
0a18348
Merge pull request #922 from MystenLabs/dev
harrymove-ctrl Sep 21, 2026
06d75e2
fix(mcp,server,sdk): say why a recall timed out (WALM-396) (#931)
nikola0x0 Sep 22, 2026
9ee664d
docs: add security policy and fix vulnerability-reporting links
harrymove-ctrl Sep 22, 2026
ee5fad6
Merge pull request #987 from MystenLabs/harry/fix-security-policy-404
harrymove-ctrl Sep 22, 2026
714f1db
docs: route Claude chat setup through OAuth connector
hien-p Sep 22, 2026
40de9b5
docs: point Claude chat users to OAuth from quickstart
hien-p Sep 22, 2026
b9be6b8
docs: document Claude Desktop Code plugin UI
hien-p Sep 22, 2026
f248bd3
Merge pull request #991 from MystenLabs/codex/fix-claude-setup-routing
harrymove-ctrl Sep 22, 2026
8fa42bc
Merge pull request #990 from MystenLabs/dev
harrymove-ctrl Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"name": "memwal",
"source": "./packages/mcp/plugin",
"description": "Automatic Walrus Memory — proactive recall and durable-fact saving via the MemWal MCP + lifecycle hooks.",
"version": "0.0.13"
"version": "0.0.14"
}
]
}
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"name": "memwal",
"source": "./packages/mcp/plugin",
"description": "Automatic Walrus Memory — proactive recall and durable-fact saving via the MemWal MCP + lifecycle hooks.",
"version": "0.0.13"
"version": "0.0.14"
}
]
}
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ body:

Do not paste delegate private keys, mnemonics, or other secrets.

If this is a security finding, use a [private advisory](https://github.com/MystenLabs/MemWal/security/advisories/new) instead of this form.
If this is a security finding, email [security@mystenlabs.com](mailto:security@mystenlabs.com). Do not use this form. See our [security policy](https://github.com/MystenLabs/MemWal/security/policy).

- type: dropdown
id: surface
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ contact_links:
url: https://discord.gg/walrusprotocol
about: Questions and builder support that are not a bug or a feature request.
- name: Report a security vulnerability
url: https://github.com/MystenLabs/MemWal/security/advisories/new
about: Private advisory. Do not file a public issue for security findings.
url: https://github.com/MystenLabs/MemWal/security/policy
about: Email security@mystenlabs.com. Do not report security issues through GitHub or Discord.
64 changes: 64 additions & 0 deletions .github/workflows/check-mcp-pin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Check MCP launcher pin

# The plugin launcher installs whatever `mcpPackageVersion` in
# packages/mcp/plugin/plugin.json names, so a pin npm does not carry breaks every
# fresh plugin install until someone edits the manifest. Whether a version exists
# is a fact about npm rather than about this repository, so no unit test can hold
# it — trusted-launcher.test.mjs checks the shape of the pin and its relationship
# to `version`, and this checks that the thing actually exists.
#
# Its own workflow rather than a job in test.yml for the same reason as
# check-model-ids: the failure can arrive with no commit attached. The `dev`
# dist-tag moves whenever a push to `dev` touches packages/mcp, and that number is
# never committed back, so the manifest drifts on its own. test.yml has no
# schedule trigger.
#
# The registry endpoint is public, so this needs no token and no environment.

on:
pull_request:
# Only when the pin, the check, or the launcher that reads the pin moves.
# Every other PR would be taking a network dependency on npm for nothing.
paths:
- "packages/mcp/plugin/plugin.json"
- "packages/mcp/plugin/scripts/lib/mcp-launch.mjs"
- "scripts/check-mcp-pin.mjs"
- ".github/workflows/check-mcp-pin.yml"
push:
branches: [main, staging, dev]
paths:
- "packages/mcp/plugin/plugin.json"
- "scripts/check-mcp-pin.mjs"
- ".github/workflows/check-mcp-pin.yml"
schedule:
# Catches the drift nobody pushed: a dist-tag that moved under a manifest
# that did not. Reads nothing shared, so it needs no bench-account offset.
- cron: "0 9 * * 1"
workflow_dispatch:

concurrency:
group: check-mcp-pin-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

jobs:
mcp-pin:
name: Launcher pin is published
runs-on: ubuntu-latest
timeout-minutes: 5

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "22"

# No install step: the check is dependency-free and talks to the public
# registry over fetch.
- name: Check the launcher pin against npm
run: node scripts/check-mcp-pin.mjs
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ await memwal.restore("demo");

## Contributing

Report security issues by email to [security@mystenlabs.com](mailto:security@mystenlabs.com). Do not report security issues through GitHub or Discord. See [SECURITY.md](SECURITY.md).

We want to be explicit about this while Walrus Memory is in beta: feedback, bug reports, docs fixes,
examples, and implementation contributions are all welcome.

Expand Down
10 changes: 10 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Security Policy

We appreciate your participation in keeping Walrus Memory secure. This document describes how to report
security vulnerabilities.

## Reporting a Vulnerability

Report security issues by email to
[security@mystenlabs.com](mailto:security@mystenlabs.com).
**Do not report security issues through GitHub or Discord.**
122 changes: 98 additions & 24 deletions apps/app/public/skills/setup
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@ user explicitly asks for developer integration.

## Setup Rules

1. Identify the AI client first. A client that cannot run a local MCP command
but can attach two custom connector headers uses the Remote MCP section
below. Every other client (Claude Desktop, Claude Code, Cursor, Codex,
other local apps) uses the Local MCP Server section. ChatGPT web
connectors are not supported: chatgpt.com exposes only a single bearer
field and cannot supply the required `x-memwal-account-id` header. The
ChatGPT desktop app is a different product: it ships the Codex CLI and
reads `~/.codex`, so treat it as Codex and use the Codex section below.
1. Identify the AI client and mode before checking local prerequisites. Regular
Claude Desktop chat and Claude web use **Claude OAuth Connector** below.
The **Code tab inside Claude Desktop** uses the Claude Code plugin path;
it is not the same setup as regular Desktop chat. If the mode is unclear,
ask which tab the user wants to use. Other local clients use Local MCP
Server. Clients using explicit account/key headers use Remote MCP
(header-capable clients). The ChatGPT desktop app uses the Codex section.
2. Decide whether you have local shell and filesystem access.
3. If you can edit local user config files, do the setup yourself after showing
the config you will add.
Expand Down Expand Up @@ -65,7 +64,38 @@ user explicitly asks for developer integration.
still writing `MEMORY.md`. If Claude's built-in memory is switched on and
competes, tell the user they can turn it off in account settings.

## Requirements
## Claude OAuth Connector (Claude Desktop chat and Claude web)

Use this path for regular Claude chat when custom connectors are available.
Production supports OAuth at `https://relayer.memory.walrus.xyz/api/mcp`.
No local Node.js, `claude` CLI, config-file edits, or manually copied delegate
key are needed. Skip the local requirements and terminal login sections.

1. Ask the user to open Claude's **Settings → Connectors → Add custom connector**
and enter `https://relayer.memory.walrus.xyz/api/mcp`.
2. Follow the browser consent flow with a Sui wallet that owns the Walrus Memory
account. If needed, the flow guides account creation. Explain the scopes
shown on the consent screen: `memwal:read` reads memories, `memwal:write`
saves them, and `offline_access` allows token refresh. The relayer holds an
encrypted delegate private key for this flow. Let the user review and
approve the wallet authorization themselves.
3. Return to Claude, enable the connector for the conversation if needed, and
verify memory tools by saving and recalling a neutral setup-check fact.
If authorization expires, reconnect through Claude's connector settings;
do not prescribe a local `npx` login or require local-only login tools.

This provides memory tools in chat, not the Code plugin's lifecycle hooks.
Do not claim it installs the plugin in the Code tab. If the user wants local
credentials instead, offer the explicit Claude Desktop local MCP option below.
If custom connectors are unavailable, report that limitation before offering
another route; do not silently switch to local installation.

Full consent and disconnect details:
https://docs.wal.app/walrus-memory/mcp/claude-connector
Removing the connector alone does not remove the onchain delegate; the user
can revoke that delegate from the Walrus Memory dashboard.

## Requirements (local MCP and header authentication only)

For local MCP clients, check Node.js:

Expand All @@ -87,7 +117,7 @@ wallet. The sign-in flow writes persistent credentials to:

Those credentials are what survive MCP server restarts.

## Recommended Login
## Recommended Login (local MCP and header authentication only)

When you can run a real terminal command, prefer this first. Run it from the
user's home directory when possible, especially if the current project is a
Expand Down Expand Up @@ -166,10 +196,11 @@ and merge:
}
```

### Claude Desktop
### Claude Desktop local MCP (optional)

Use the config file below. Claude Desktop's Settings > Connectors UI only
supports OAuth remote servers and does not work for Walrus Memory.
For regular chat, prefer the Claude OAuth Connector section above. Use this
local alternative only when the user chooses it; it requires Node.js 20+.
This config does not install the plugin for the Code tab.

Edit:

Expand Down Expand Up @@ -239,11 +270,27 @@ bundles the MCP server plus `SessionStart` / `UserPromptSubmit` / `PostToolUse`
hooks. Those hooks make the agent prefer `memwal_*` over Claude Code's
built-in `MEMORY.md`. MCP-only leaves auto-remember and auto-recall unreliable.

If you have a terminal, run the CLI yourself. Do not ask the user to type
`/plugin` commands unless you cannot run `claude plugin`.
This includes the Code tab inside Claude Desktop. Claude's current Desktop
plugin UI can install plugins without a terminal: open the `+` menu beside the
prompt, choose **Plugins → Add plugin**, select MemWal from a configured
marketplace, then use **Manage plugins** to confirm it is enabled. If the MemWal
marketplace is not listed, add it with the terminal commands below. Do not paste
`/plugin` commands into chat as plain text; that can make the agent edit settings
without installing the plugin.

Having the desktop app installed does not guarantee that the `claude` CLI is
available in a shell. For the terminal route, check `node --version`,
`npm --version`, and `claude --version` first. If a prerequisite is missing,
explain the exact blocker and point to https://nodejs.org/ or
https://code.claude.com/docs/en/setup. Do not create `enabledPlugins` entries
as a substitute for a verified install. If the user only needs regular chat,
offer the OAuth connector instead; it does not add Code hooks.

Run the following as separate commands in a terminal, stopping on the first
failed command:

```bash
claude plugin marketplace add MystenLabs/MemWal
claude plugin marketplace add https://github.com/MystenLabs/MemWal.git
claude plugin install memwal@memwal-plugins -s user
claude plugin list
claude mcp list
Expand All @@ -253,14 +300,25 @@ claude mcp list
enabled. `claude mcp list` should show a connected `memwal` server. If either
command fails, stop and report the exact error.

The slash commands below are only for a human inside an interactive Claude
Code session:
The slash commands are only for an interactive Claude Code session that
actually exposes `/plugin`; they are not chat instructions. The Desktop UI path
above is preferred when available. If `/plugin` is unavailable, use the
terminal route instead:

```text
/plugin marketplace add MystenLabs/MemWal
/plugin marketplace add https://github.com/MystenLabs/MemWal.git
/plugin install memwal@memwal-plugins
```

A delegate key is not required to install the plugin. After installation,
fully quit and reopen Claude Code, then ask it to run `memwal_login` and follow
the browser sign-in. Verify the plugin is enabled, the MCP server is connected,
and a memory can be saved and recalled before reporting success.

If adding the HTTPS source reports an existing marketplace with a different
source, inspect `claude plugin marketplace list` and explain the conflict;
do not remove an existing marketplace or configuration without review.

Preserve an existing user-scope `memwal` MCP server (for example a staging or
pinned version). The plugin adds hooks plus its own server; do not remove the
user server to "clean up".
Expand Down Expand Up @@ -320,13 +378,22 @@ Add an MCP server with:
- command: `npx`
- args: `["-y", "@mysten-incubation/memwal-mcp"]`

## Permissions during local setup

Explain shell-command approvals and the plugin/config files being changed.
These instructions do not require reading Desktop files or controlling Apple
Music. If an unrelated OS permission prompt appears, stop and identify the
exact command and prompt before advising the user to grant access. Do not
request broad filesystem or automation access as a generic installation fix.
Do not attribute a prompt to Claude or MemWal without evidence.

## Restart

Fully quit and reopen the AI client after editing MCP config. On macOS, use
`Cmd+Q`; closing the window is not enough. The first launch may take 5-10
seconds while `npx` fetches the package.

## Verify Tools
## Verify Tools (local MCP)

Fastest check: ask the client to call `memwal_health`. A healthy reply proves
the server is reachable. If health succeeds but memory tools return 401,
Expand Down Expand Up @@ -378,7 +445,8 @@ If the tools support a `namespace` argument, use a setup-only namespace such as
Some clients connect to a remote MCP server URL instead of running a local
command. Use this path only when the client can attach BOTH custom request
headers shown below. A client that exposes only a single bearer/token field
cannot use this path.
cannot use this header-authentication path. Claude Desktop/web should use the
OAuth connector above, which does not require custom headers.

ChatGPT web connectors are not supported. The chatgpt.com connector UI exposes
only one bearer slot, so the required `x-memwal-account-id` header cannot be
Expand Down Expand Up @@ -418,8 +486,8 @@ cat ~/.memwal/credentials.json
settings, never into the chat. You (the agent) must not read or print this
file. Treat the bearer token like an API key and never save it in a repo file.

If the client cannot attach both custom headers, remote MCP is not available
for it today. Tell the user which clients are supported (Claude Desktop, Claude
If the client cannot attach both custom headers, this header-authentication
path is unavailable. For Claude Desktop/web, use OAuth instead. Tell the user which clients are supported (Claude Desktop, Claude
Code, Cursor, Codex) and offer to set one of those up instead. Do not re-run
this skill for the same client.

Expand All @@ -434,14 +502,20 @@ this skill for the same client.
| `codex plugin marketplace add` prints `already added from a different source` | A stale clone is left in `~/.codex/.tmp/marketplaces/memwal-plugins/`. Note the command still exits 0, so a scripted install does not notice. Remove that folder and the empty `~/.codex/plugins/cache/memwal-plugins/`, then add the marketplace again. |
| Cursor shows no Walrus Memory plugin | Confirm the folder `~/.cursor/plugins/local/memwal` exists and holds `.cursor-plugin/plugin.json`, then fully quit and reopen Cursor. There is no `cursor plugin` CLI, so verify from the logs instead: the newest folder under `~/Library/Application Support/Cursor/logs/` on macOS gets an `mcp-server-plugin-memwal-memwal.log` once the plugin loads. A `mcp-server-user-memwal.log` next to it means a duplicate manual entry is still in `~/.cursor/mcp.json`. |
| Memory tools fail with `MCP rate limit: ip_active_cap` (HTTP 429), sometimes followed by 503 | Too many concurrent memwal-mcp sessions from one machine. The usual causes are a duplicate server, where a plugin install sits next to a leftover manual `memwal` entry in the client's MCP config, and stale `memwal-mcp` processes left behind by earlier sessions. Remove the duplicate entry first. Then list the leftovers with `pgrep -fl memwal-mcp` and ask the user which clients they still want running before ending any process. Restart the client afterwards. |
| `claude plugin` commands are not recognized | This Claude Code build has no plugin CLI. Update Claude Code, or use the MCP-only fallback and tell the user hooks are missing. |
| `claude` is missing or `claude plugin` is not recognized | Check CLI availability and version; the Desktop app alone does not guarantee a shell CLI. Install/update Claude Code for the plugin route, or offer OAuth for regular chat. Do not claim a config edit completed installation. |
| Only `memwal_login` works | Credentials are missing. Run `memwal_login` or `npx -y @mysten-incubation/memwal-mcp login --prod`. |
| Memory tools return 401 | The delegate key may be stale or revoked. Run `npx -y @mysten-incubation/memwal-mcp login --prod` again. |
| `memwal_recall` returns nothing although memories were saved before | Run `memwal_restore <namespace>` to rebuild the search index from Walrus, then retry the recall. |
| Sign out | Run `npx -y @mysten-incubation/memwal-mcp --logout`. This removes local credentials but does not revoke the delegate key. |

## Final Report

For OAuth, report connector authorization and save/recall verification status.
Do not require a local restart, credentials file, plugin, or Node.js. If the
user has not completed consent or tools have not been verified, say what is
still pending. Automatic save/recall in regular chat is best-effort, not the
Code plugin's lifecycle-hook behavior.

Keep the final response short and make the restart the first thing the user
sees whenever a restart is required.

Expand Down
12 changes: 9 additions & 3 deletions apps/app/src/pages/ConnectMcp.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,16 @@ describe('MCP sign-in hand-off', () => {
expect(screen.getByText(/Nothing answered on your computer/i)).toBeInTheDocument()
expect(screen.getByText(/stopped waiting after this tab was already open/i)).toBeInTheDocument()
expect(screen.queryByText(/opened too late/i)).not.toBeInTheDocument()
expect(screen.getByText(/Sign in again and open the new link straight away/i)).toBeInTheDocument()
expect(screen.getByText(/left running through the wallet prompt/i)).toBeInTheDocument()
expect(screen.getByText(/unused key from this attempt is already on your account/i)).toBeInTheDocument()
expect(screen.queryByText(/usually works/i)).not.toBeInTheDocument()
// The key is registered and saved by the client that started this
// sign-in, so a restart reclaims it. Signing in again cannot register
// it twice, and removing it from the dashboard throws it away.
expect(screen.getByText(/Restart your MCP client within 24 hours/i)).toBeInTheDocument()
expect(screen.getByText(/only if you mean to abandon it/i)).toBeInTheDocument()
expect(
screen.queryByText(/Remove it from the dashboard if you are not using it/i),
).not.toBeInTheDocument()
expect(screen.queryByText(/Sign in again and open the new link straight away/i)).not.toBeInTheDocument()
})

it('explains an expired link when preflight cannot reach the listener', async () => {
Expand Down
Loading
Loading