Atlas / MCP servers / needmoretruth / nmts-cli

nmts-cliCAUTION

mcp/needmoretruth/nmts-cli

NMTS (NeedMoreTruthStorage · nmts.me) — Command-line and MCP access to NMTS: open-source, end-to-end encrypted storage on the Walrus network. NMTS charges no fee; you pay the network from your own wallet. For people at a terminal and for the agents they run.

Verdict
CAUTION
Grade
D
Trust score
68 /100
Exposed tools
46 31r · 12w · 3d
Transport
stdio
License
Apache-2.0
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Command-line access to NMTS — NeedMoreTruthStorage, end-to-end encrypted cloud storage on the Walrus network, built by one developer (needmoretruth). For people at a terminal, and for the AI agents they run.

한국어 문서 · Talk about NMTS on Discord, in English or Korean. If you are an AI agent, read AGENTS.md instead. It has the tier table, the exit codes and the rules for a run nobody is watching. Status: early. The interface may still change before 1.0. A command added after this file was written is in nmts --help.

🧭 What NMTS is

Storage where the encryption happens on your machine and the keys never leave it. The server receives sealed bytes it cannot open. File contents, names and folders all live inside a sealed list that only your NMTS key opens.

The bytes live on Walrus, a public storage network, paid for on the Sui chain.

  • Storage is bought for a period, not forever. A file has a lease. It can be extended, and

NMTS warns before one runs out.

  • There is no password reset. Your NMTS key is the account. It cannot be recovered or

changed while keeping the files, because nobody, NMTS included, holds a key to them.

  • NMTS charges nothing. Storage is bought from the Walrus network, for a period, from your own

wallet; nothing is paid to NMTS. Uploads here spend credits, which are storage a donation pool has already paid the network for (the weekly free trial) — they are not sold. One command, nmts extend, pays from your own Sui wallet instead, and asks for a separate agreement first, because a signed purchase on a public chain cannot be reversed by anyone.

This tool, the encryption engine and the recovery program are open source under Apache-2.0; the server and the web app are not published.

📦 Install

Node 22.15.0 or newer. Nothing is compiled at install ti

Read from source at commit 508b6693d44fOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code (npm)
claude mcp add nmts-cli -- npx -y @needmoretruth/[email protected] mcp
03

Exposed tools (46)

31 read · 12 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
angryreadalways fails
confirm_itreadasks
echoreadgive back what it was given
nmts_balancereadHow many credits this account has left, what that buys, and the ceilings on spending.
nmts_credits_transferwriteMove credits from this account to another account of the SAME FAMILY — the account a
nmts_depositwriteRead or set how many credits this account sets aside as a deposit on each credit-paid
nmts_devicesreadWhat is signed in to this NMTS account: for each device, when it was first signed in,
nmts_expiringreadFiles whose bought storage runs out soon, with how long each has left. Storage on NMTS
nmts_getwriteFetch one file from the NMTS account, decrypt it, and write it into ${ctx.outDir}. Takes
nmts_label_renamewriteRename a label on every file that carries it. Changes only the file list; costs nothing.
nmts_listreadList the files stored in the NMTS account, as JSON. Paths are what nmts_get takes.
nmts_loss_recheckreadAsk the chain right now about one storage object listed by nmts_losses. Costs nothing.
nmts_lossesreadStorage objects paid with this account
nmts_markwritePut a mark on files, or take one off.
nmts_mkdirreadMake a folder in the NMTS account, including any parent folders that are missing.
nmts_movewriteMove one or more entries into a folder in the NMTS account. Nothing is re-uploaded and
nmts_noticereadOne notice in full, as the dated text the board
nmts_noticesreadThe NMTS notice board as JSON, newest first: interruptions, incidents, and the notice
nmts_paddingwriteRead or set how file sizes are hidden on the storage network: standard (a few fixed
nmts_privacydestructiveThe NMTS Privacy Policy in force, as text, with its version and effective date at the
nmts_public_codereadThe account
nmts_public_code_newreadMake a new public code for this account — the next number from the same NMTS key — and
nmts_public_code_revokedestructiveRevoke one of this account
nmts_pullreadFetch a whole folder — or the whole account, if no folder is named — and rebuild its
nmts_pushwriteUpload a whole directory from this machine, rebuilding its shape in the account.
nmts_putwriteEncrypt one file from this machine and upload it to the NMTS account. ${SPENDS} A name
nmts_receivereadFetch a file another account shared with this one, using an id from nmts_shares, and
nmts_renamewriteRename one entry in the NMTS account. The name lives inside the sealed list, so this
nmts_restorereadTake files back out of the NMTS account
nmts_sharereadGive another NMTS account the key to one file in this account. ⛔ IT CANNOT BE TAKEN
nmts_sharesreadFiles this account has shared with somebody, and files somebody has shared with it. The
nmts_shares_sentreadWho one file in the account was shared with: recipient address, since when, and the
nmts_support_listreadThe reports this account has filed from the command line, with their codes, what each
nmts_support_replyreadAnswer in a report
nmts_support_sendwriteFile a report with the developer of NMTS: a bug, a confusing message, an idea, a
nmts_support_showreadOne report and everything said in it, oldest first, using a code from nmts_support_list.
nmts_termsdestructiveThe NMTS Terms of Service in force, as text, with its version and effective date at the
nmts_trashwritePut files in the NMTS account
nmts_unlabel_allreadTake one label off every file that carries it. Changes only the file list; costs nothing.
nmts_unsharereadWithdraw a share this account made, using an id from nmts_shares. It stops any further
nmts_usagereadHow much this account holds: how many files and folders, how many bytes, how much is in
nmts_wallet_activityreadThe recent transactions of the wallet this account derives (newest first, 20 at most),
nmts_wallet_storagereadThe storage resources (size × time on the storage network) this wallet holds unbound —
nmts_whoamireadWhich NMTS account this machine holds the NMTS key for. Derived here, offline: it says
spenderreadwould spend unless held back
stuckreadfails with something to do about it
04

Trust audit

CAUTIONgrade D · trust 68/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (5 observation(s))
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (24)

MEDIUMInventory / provenance · inv.binary · CWE-1104
vendor/nmts-crypto/nmts_crypto_wasm_bg.wasm
nmts_crypto_wasm_bg.wasm
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/env.test.ts:32
const secret = "SOME-ACCOUNT-CODE-SHAPED-STRING-XYZ";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/link.test.ts:23
const TOKEN = "AbCdEfGhIjKlMnOpQrStUv";
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/redact.test.ts:97
redact("-----BEGIN PRIVATE KEY-----\nMIIBVgIBADAN\nAQEA\n-----END PRIVATE KEY-----"), // nmts-secret-scan: allow a twelve-byte fixture, not a key
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/redact.test.ts:100
assert.equal(redact("it printed -----BEGIN OPENSSH PRIVATE KEY-----"), "it printed [secret]"); // nmts-secret-scan: allow header only, no key
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
nmts_privacy, nmts_public_code_revoke, nmts_terms
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
dist/s3/body-measure.js:14
this.md5 = plan.contentMd5 === null ? null : createHash("md5");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
dist/s3/spool.js:36
const digest = options.md5 ? createHash("md5") : null;
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/s3/body-measure.ts:18
this.md5 = plan.contentMd5 === null ? null : createHash("md5");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/s3/spool.ts:60
const digest = options.md5 ? createHash("md5") : null;
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
test/s3-body.test.ts:98
const md5 = createHash("md5").update(DATA).digest("base64");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/mcp.test.ts:203
for (const climbing of ["../../etc/passwd", "/etc/passwd", "..", ".", "sub/../../../out", "..\\..\\win"]) {
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/update-check.test.ts:92
for (const bad of ["v0.2.0", "0.2", "1.0.0 ; rm -rf /", "../../etc", ""]) {
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/windows-names.test.ts:76
() => safeJoin("/tmp/dest", "a/../../etc/passwd", platform),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.ko.md:459
This account's drive is being served at http://127.0.0.1:9000, to this machine only.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.ko.md:460
endpoint        http://127.0.0.1:9000
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.ko.md:484
endpoint=http://127.0.0.1:9000 \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:500
This account's drive is being served at http://127.0.0.1:9000, to this machine only.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:501
endpoint        http://127.0.0.1:9000
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
dist/bytes.js:37
const binary = atob(standard.padEnd(standard.length + ((4 - (standard.length % 4)) % 4), "="));
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/bytes.ts:40
const binary = atob(standard.padEnd(standard.length + ((4 - (standard.length % 4)) % 4), "="));
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
test/s3-gateway-delete.test.ts:214
`<?xml version="1.0"?><!-- a note --><Delete a='1' b="2"><Object><Key><![CDATA[x<y>&z]]></Key>` +
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@mysten/sui, @mysten/walrus, @noble/curves, @noble/hashes, uqr, @types/node, typescript
Why it matters. 7 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
CHANGELOG.md:10
step, makes an API key (read, write, spend) and stores both in the credentials file. A pass works
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 508b6693d44ffull audit observations/trust-audit/mcp-server/needmoretruth__nmts-cli.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11508b6693d44fCAUTIOND68first audit
06

Questions

What is the nmts-cli MCP server?

NMTS (NeedMoreTruthStorage · nmts.me) — Command-line and MCP access to NMTS: open-source, end-to-end encrypted storage on the Walrus network. NMTS charges no fee; you pay the network from your own wallet. For people at a terminal and for the agents they run.

What tools does nmts-cli expose?

46 in total: 31 read-only, 12 that write, and 3 that can delete or overwrite (nmts_privacy, nmts_public_code_revoke, nmts_terms). Every one is listed on this page with its risk.

Is nmts-cli safe to connect to an agent?

With care. The audit graded it D (68/100) and found 24 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does nmts-cli need?

No credential environment variables were found in its source, so it appears to need none.

How does nmts-cli run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as nmts-crypto-wasm at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (508b6693d44f), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement