1bitclaw-mcp (juni4000/1bitclaw-mcp) is an MCP server listed on the M8ven Trust Index. It scores 69 out of 100, grade C. It declares 62 tools. No publisher has claimed this listing.

C
Warning
69/100

1bitclaw-mcp

MCP server for 1BitClaw: design BSV on-chain workflows and sCrypt contracts, read the chain, assemble unsigned drafts. Never holds keys.

Warning. Serious findings were identified. Review the full report before connecting. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.

How we verified

⚡ Live Monitored: not connected

Verified is a snapshot. Live keeps it current, and builds your track record.

⚡ Connect GitHub → continuous verification on every pushwhy connect →

Who stands behind it

juni4000

Source: github_repo_search

Is this your MCP?

Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →

Install from

The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.

// key findings
🚨
Code appears obfuscated
1 file are unreadable to a human reviewer. Cannot audit what they do.
🔐
You'll be asked for 1 credential: LOGS_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes62 tools

These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.

engine_version

Current MM_WF engine version (UI + runner + agreement flag) and the FINALITY/minConf tables. Ask, never remember.

list_step_kinds

All 43 authoring step kinds with wire kind, role/dom/trust axes, runner support, icon and trust glyph. The ONLY legal source of step kinds for flow design — inventing a step.type is prohibited.

get_step_kind_docs

One step kind in depth: axes, finality (minConf + which policy produced it), design rationale (why), trust glyph and its meaning.

list_record_types

All on-chain OP_RETURN record types the app writes — parsed LIVE from docs/reference/opreturn-formats.md (the same table a human reads), not a hand-typed mirror, so it can never drift stale. Covers every module, not just contracts/flows: GP (post-need/social/discover), TK/TR/TC2/DR2 (taskboard), DN

get_record_type_docs

One OP_RETURN type in depth (all variants, e.g. DN has REG/UPD/RENEW/SELL/XFER/ESCROW/IDX): pipe-delimited template, positional fields (position 0 is usually the literal type tag, not a real value — occasionally a placeholder itself contains alternation like <MOVE|TP|MINE|COMMIT>, read template + de

list_ui_capabilities

Which app modules can be DRIVEN through ui_action's set_field/click_action (type into a field, click a button) — extracted live from deploy/modules/*.js, not hand-maintained: a module opts in by exporting a small mcpFields/mcpActions literal next to its own registration, and appears here automatical

list_agent_sandbox_api

The AG AGENT handler contract: the `sandbox` object a `function handler(event, sandbox)` is called with, the `event` it receives, and the JSON rule DSL the no-code path compiles — parsed live from the two real _createSandbox() implementations (deploy/modules/run-agent.js for runtimeMode "browser", i

get_agent_sandbox_method

One sandbox method in depth: the full rationale comment from the source (anchor derivation, the WF_KICK convention, the pitfalls each method exists to avoid), the exact draft it returns (type / record template / anchors), and both implementations side by side with their real divergences. Call list_a

list_contracts

The contract catalog (KNOWN_CONTRACTS × _coverage.json × _guide-en.json), filterable by category / authClass / headlessOnly / verifiedOnly / q. PAGED: returns {total, offset, shown, nextOffset, rows} with COMPACT rows (counts instead of the per-method lists) — the full unpaged dump is ~100 KB and ge

get_contract

Full catalog card for one contract: descriptions (EN), method list, per-method coverage matrix, and the THREE verification layers kept separate (verifiedTxid / readiness tier / manifest state — all manifest entries are quarantine today; never say "signed").

get_contract_source

The contract's actual sCrypt-TS SOURCE (deploy/scrypt-sources/<slug>.ts — the same file the contract card's source viewer shows). Use it to answer questions about what a contract DOES: its asserts, its state transitions, why a method is participant- or owner-class. Paged: pass offset from nextOffset

contract_spec

Full contract-functionality analysis for one contract (adapter-backed): constructor params with types + human descriptions + accepted formats, method ABI (params, types, authClass, feasibility verdict), state props, structs, template state, coverage + the three verification layers. Use before fillin

list_contract_instances

LIVE on-chain instances from the contracts indexer snapshot (the same data the app's "My Positions" uses — read-only, 60s TTL; the MCP reads, signing/broadcast stay in the browser). Filters by contractName and/or owner (base58 address or 40-hex pkh). Each row: instanceId, contractName, genesisTxid,

contract_escrowv2_schedule

Derive the canonical Merkle payment schedule for a WorkflowEscrowV2 deploy: given the wfId and up to 64 leaves {stepIdx, mode, recipientPkh, maxSats}, returns wfIdHash (64-hex — put it in the card's wfIdHash field, never the raw wfId text), root (64-hex — the card's leavesRoot field), budget (sum of

contract_validate_inputs

Fill-and-validate a contract field set against the adapter ABI: stage=deploy (constructor params — required; state props — genesis, defaulted) or stage=call (method params — Sig/PubKey fields are optional, the signer/executor produces them at broadcast). Returns per-field: given/required/value/error

check_headless_feasibility

Deterministic verdict for one contract.method BEFORE inserting a contract step: headless-ok | participant-resolve | owner-quota | proof-blocked | intent-only | unknown-method | not-in-catalog. proof has priority over every other class.

resolve_participants

G4 — WHO for a participant-class method: resolves the exact address that should receive the WF_ASSIGN from the SUPPLIED decoded instance state (same trust boundary as the runner — infra/lib/participants.mjs). verdict: resolved | ambiguous | none; includes the full participant list + the /contracts/<

analyze_contract_instance

G5 (analysis half) — analyze a SUPPLIED decoded contract instance: state props with values, constructor params, method list, participant identities → assignable addresses, and the /contracts/<name>/<txid> link. Answers covenant-limit / paramMapping questions against the state the app already decoded

deploy_policy

G6 — S5 deploy gates from the LOCAL runner config (never guessed): adapter loaded, WF_CONTRACT_EXEC, WF_SPEND_WIF presence ONLY (never the key), WF_DEPLOY_CONTRACTS allowlist, MAX_FUND_SATS_DEPLOY ceiling, and the owner's policy.maxDeploySats from the supplied policy object. verdict: deploy-ok | dep

link_for

Canonical site-relative deep link for an entity (board/node/run/template/contract/contractMethod/contractInstance/entity/outboxDraft/inboxAssignment). Returns null for anything private or off-allowlist — never invent URLs yourself.

catalog_status

Freshness report: engine versions, source counts, generated stamps, file mtimes, and the five parity gates to run — any red gate means every catalog answer is stale (treat accordingly).

preview_compile

G1 — run the REAL mindmap.js compiler (same __test code path the browser uses) on a board JSON: per-step rows (type/actor/sats/headlessOnly/errors) + the flow facts (money sheet, actor map, caps, risks). Read-only: no outbox, no broadcast. Needs Playwright+Chromium (repo devDeps).

get_board_schema

The shape of the board JSON the design tools pass around — read this BEFORE create_board. The 16 node types (with icon/label/description/category, and which are offered in the canvas's Simple mode) and the 7 link kinds, each with what it does to COMPILE ORDER: depends_on/references put the target BE

create_board

Create a fresh draft board (root node only) — the working draft the agent then extends with add_node and validates with preview_compile/preflight/simulate. Pure: nothing is written anywhere; returns the board JSON for the next tool in the chain.

add_node

Append a node to a draft board (immutably). node.type is validated against the LIVE node catalog (mindmap.js NODE_TYPE_DEFS — never a hardcoded list); actionSpec must be valid JSON and is checked against the canvas preset for its kind, returning advisory `specWarnings` (missing fields, a string wher

validate_action_spec

Ask the REAL compiler about ONE step, now — instead of finding out at preflight. Runs mindmap.js's own per-step checks (_stepPreflightIssues + normSpec) over jsdom, ~10ms warm, no browser: the same messages the step form shows ("Set a date/time or block height above", "Pick a contract node (or paste

add_link

Append a link between two existing nodes (immutably), in the app's own {id, fromId, toId, kind, createdAt} shape. DIRECTION MATTERS and is not symmetric: `depends_on` (the default) and `references` mean the TARGET runs BEFORE the source — "A depends_on B" puts B first — while sends_on/grants/publish

update_node_spec

Patch a node's editable fields (title / actionSpec / type / parentId). actionSpec is validated as JSON. Immutable: returns the new board JSON.

delete_node

Cascade-delete a node + its descendants + all links touching them (same behavior as the app's delete). Refuses the root. Immutable: returns the new board JSON.

add_contract_step

One tool, oneOf by cs.kind (§9.8): add a contract step node whose wire kind is contract_call for all three kinds — contract_call (method on an instance), contract_deploy (fund a new instance), sc_cond (chain condition). Cross-gates against the live catalog: the contract must exist, and contract_call

run_ctrl

G2 — assemble the exact unsigned WF_CTRL frame the runner verifies (add / add_trigger / remove_trigger / export / pause / resume / kill; pause/resume/kill/export are run-scoped and need runId). Returns {frame, signatureRequired, signer} — the CLIENT signs and broadcasts; MCP never holds keys. Nothin

resolve_manual_step

G2 — assemble the exact WF_STEP|done record the app builds when a human resolves a step (mindmap.js _finalizeStepRecord): {wfId, runId, stepIdx, actorAddr, payload?} → record + anchors. The ACTOR signs and broadcasts it from their own wallet — MCP never holds keys.

list_templates

G8 — the template catalogue (mindmap-templates.js, the SAME seed the gallery instantiates): id/title/category/desc/node+link counts/headlessOnly. Filter by category or free-text q.

get_template

G8 — full template body (nodes with actionSpec objects, links, placeholders) for instantiation in the browser. Templates are authoring seeds — the compiler validates after instantiation. NOTE: the bodies still carry SEED TOKENS (<ADDR:payee>, <TS:+30d>); mindmap.js _applyTplTokens resolves them in t

search_contracts

G9 — text search over the contract catalog: name, aliases, category, descEn, methods, useCases. This is the filter list_contracts was missing ("escrow", "royalty", a method name).

board_min_conf

G10 — per-board requireConf/minConf: for every step on the board, the minConf its wire kind demands (same FINALITY tables engine_version reports), plus the board-wide max = requireConf. Strict: board required.

analyze_wf_runs

G3 (analysis half) — classify the WF_RUN/WF_STEP/WF_ASSIGN/WF_CTRL breadcrumbs the caller already has: per-run status, step progress, last movement, stall level (slow/stuck — the UI's real 24h/7d thresholds), txids, and ?run=&step=&stall= deep links when the wfId→boardId is resolvable. The server ne

draft_adapter

G11 (Path B, §9.8) — generate a standalone sCrypt adapter DRAFT from the compiled artifact.json the agent already has (npx scrypt-cli compile), via the repo's real scrypt-adapter-gen.mjs. The draft lands in infra/mcp/.state/adapter-drafts/ — outside the live site AND outside the deployed directory,

audit_log

G14 — read the local request audit trail (infra/mcp/.state/_mcp-audit.jsonl): who/what/when for every tools/call (arguments summarized — boards/artifacts are shape-logged, never their body). Filter by tool, cap with limit.

preflight

Run the REAL Review & Prepare safety matrix (mindmap.js _flowPreflight): validity / people / money / runner / privacy checks with statuses (ready/warning/manual/blocked) + the publish gate verdict. Read-only: no outbox, no broadcast.

simulate

Deterministic offline walk of the flow (the SAME _simulateWalk the UI "▶ Simulate" button runs): branch/transform evaluate for real on the mock ctx, chain-bound gates resolve to their honest defaults (branch/wait → not met → onTimeout/pause; decision → opts.decisions[<nodeId>] or the walk pauses). Z

resolve_wf_to_board

G7 — wfId→boardId resolver: parse MM_WF records (v1/v2 wire format) the caller already has, or explicit {wfId, boardId} pairs, and get the canonical ?run= deep link. link_for("run") needs boardId; this is the missing step between run observation (wfId/runId) and a clickable link.

analyze_outbox_draft

Classify outbox draft(s): record kind (MM_WF / WF_POLICY / WF_STEP / WF_ASSIGN / WF_CTRL / SC|D / SC|I / …), sats, anchors, status, bundle, and the /v3/outbox/<draftId> deep link. Input: items (outbox item JSONs), records (raw record strings), or draftIds already in the local pending file.

analyze_outbox_errors

Diagnose FAILED outbox drafts (status:failed + the error string the app recorded via markFailed) and optionally FIX them. Supply the failed outbox item JSONs from the app — open_context.outbox.recent lists them, failed first, with the error string (or draftIds from the server pending file). Each row

build_outbox_draft

Assemble the exact draft(s) the app would queue into the Outbox. In the site chat the drafts are pushed straight into THIS browser's outbox over the live connection and the returned /v3/outbox/<draftId> link lands on the card; the server-side copy (infra/mcp/.state/_mcp-outbox.json) is an operator r

create_trigger

Arm a PUBLISHED headless workflow so it starts running on its own. A published flow does NOT run by itself: a run is born from `WF_CTRL add` or from a trigger firing — there is no WF_CTRL "start" op — so without a trigger a freshly published workflow just sits there. This builds the MM_WF_TRIG defin

contract_deploy_draft

SC|D deploy draft — build the REAL locking script from the adapter (createLockingScript) + the canonical SC|D index record/anchors, and place an unsigned scrypt_deploy draft (pushed live into the browser Outbox in the site chat; the server keeps an operator-side copy). The OWNER signs + broadcasts i

contract_call_draft

Method-call draft for a LIVE contract instance. mode=intent (default): SC|I scrypt_call that indexes the intended call — the owner signs the real spend from the Outbox (always safe). mode=spend: SC|C scrypt_spend via the REAL createSpendDraft — the executable draft the beta executors run (check the

wallet_payment_draft

Pay BSV to ONE or MANY addresses in a single transaction: assembles the exact `wallet_payment` draft the Wallet page's 💸 Send button queues (type:payment, paymentOutputs[]) and places it in the Outbox — pushed live into THIS browser's Outbox in the site chat (link /v3/outbox/<draftId>); the user re

data_record_draft

Write FREE-FORM data to the chain: a UTF-8 text record in an OP_RETURN output (plus optional anchors — "#tag"s the browser derives into 1-sat anchor outputs, or addresses — so the record is findable under that tag/address later). Assembles the generic `record`+`anchors` draft every app module's own

chain_query

READ-ONLY chain lookup via the public WhatsOnChain API (no keys, nothing signed). kind=balance {address, needSats?} → confirmed/unconfirmed/total sats + BSV, and with needSats an `enough`/`shortfallSats` verdict that already includes fee + change headroom — use it with ctx.wallet.address BEFORE queu

geocode_place

Turn a place NAME into coordinates + geohash cells via Nominatim (OpenStreetMap's public geocoder — no key). Call it ONCE per place and reuse the values already in this conversation for follow-up questions about the same place — do NOT call it again "to be sure". If you ALREADY have lat/lon or a geo

geohash_cells

Pure offline geohash math — no network, instant, never rate-limited. Pass either `hash` (a geohash you already have — from geocode_place, a link, or the user) or `lat`+`lon`, and get back geo2/geo4/geo6, the canonical anchor `geo4` + its `#geo_<hash4>` tag, `cellsNear4` (anchor cell + its 8 neighbor

index_query

Read the LIVE public indexer snapshots — the same data the app itself shows. Call with NO arguments to get the catalogue of kinds and their selects. kinds: profiles (people, skills, reputation) · market (tasks/agents/apps/proofs — the taskboard feed) · dns (.bit names, owners, expiry, sale status) ·

wf_runs

OBSERVE workflow runs from the live indexer — the half analyze_wf_runs never had (that one classifies records you already hold; this one fetches them). kind=list → every run newest-first with status, progress (step n/N), age and a stall verdict (slow ≥24h, stuck ≥7d — the UI's own constants); filter

chain_search

Find records by ANCHOR — the address every write pays 1 sat to, which is what makes a topic searchable at all. by=geo (a geohash: what is posted in that cell — geo4 is where posts actually anchor, a deeper hash is usually empty) · by=dns (one .bit name's full history) · by=tag (a USER hashtag, colli

decode_record

Explain ONE record: pass `record` (the OP_RETURN text) or `txid` (read every OP_RETURN in that transaction). Matches the record against its documented template from docs/reference/opreturn-formats.md and returns NAMED fields — the answer to "what is this transaction?", which chain_query kind=tx coul

fee_estimate

What will this cost, and what is that in money? kind=record {record, anchors?} → the fee for writing that exact OP_RETURN (the same size formula the browser uses) · kind=payment {outputs:[{sats}], inputs?} → fee + total for a payment, with dust warnings · kind=bytes {bytes} → fee for a tx of that si

verify_tx

Verify a transaction the trust-minimised way — the same SPV path the workflow runner uses for its confirmation gate: merkle proof → computed root → block header checked by its own proof-of-work → cross-checked against a SECOND independent provider. chain_query kind=tx only repeats what one API says;

module_draft

Compose a real app record through a module's OWN builder — the write path that does NOT need the module open on the right wizard step (unlike ui_action set_field/click_action). Call with no module to list what is available; call with `module` to see that module's kinds and fields. Then {module, kind

open_context

Read the CURRENT app open-context snapshot the site chat widget pushed with this turn. Keys: view + route (where the user is); board {id,title,selId,nodes[] with actionSpec summaries, selNode with its FULL params/paramMapping}; contract {name, view, fields[] — every field of the open card incl. the

ui_action

Ask the chat widget to open/act on a UI surface in the app (the widget executes it in the browser — the server never clicks anything itself). Actions: open_file_picker (focus a board node and open its file attach dialog — the file is then encrypted + queued by the app), open_contract (navigate to /c

// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
configADAPTERS_DIR
configADAPTER_MANIFEST
configAGENT_FUND_SATS
configAGENT_IDS
configAPP_ORIGIN
configBITCLAW_MCP_ADAPTERS_DIR
configBITCLAW_MCP_ADAPTER_DRAFTS
configBITCLAW_MCP_AUDIT_FILEwhere pending drafts / the audit trail are written (default infra/mcp/.state/)
configBITCLAW_MCP_BLOCKED_WORDS
configBITCLAW_MCP_BLOCKED_WORDS_FILE
configBITCLAW_MCP_COMPILE_ENGINEjsdom (default) or playwright for the compiler bridge
configBITCLAW_MCP_CONFIRM_HANDSHAKE
configBITCLAW_MCP_OUTBOX_FILEwhere pending drafts / the audit trail are written (default infra/mcp/.state/)
configBOOTSTRAP_RETRY_MS
configCONTRACTS_SNAPSHOT_FILE
configCONTRACTS_SNAPSHOT_URL
configDATA_DIR
configFEE_RATE
configHANDLER_TIMEOUT_MS
configHEARTBEAT_MS
configHIST_TTL_MS
configLIVENESS_ADDR
configLIVENESS_POLL_MS
🔐 secretLOGS_TOKEN
configMAX_FUND_SATS_DEPLOY
configMAX_PER_HOUR
configMAX_SATS_PER_TX
configMAX_SATS_PER_TX_PAYOUT
configOPERATOR_ADDR
configOWNER_ADDR
configPOLL_MS
configPRICE_SATS_RUN
configRECONFIG_MS
configRUNNER_ID
configSUB_OPERATOR_ADDR
configSUB_PRICE_DAY
configSUB_RUN_DEPTH_CAP
configUMS_URL
configWF_AGENT_DECISION
configWF_ASSIGN_POLL_MS
configWF_ATTEST_ORACLE_URL
configWF_BRANCH_HOP_CAP
configWF_BRANCH_STRICT
configWF_CONTRACT_EXEC
configWF_DEPLOY_CONTRACTS
configWF_DRY_RUN
configWF_ESCROW2_WIF
configWF_FINALITY_POLICY
configWF_FREEPOST_BITS
configWF_IDS
configWF_PAYOUT_WIF
configWF_REQUIRE_FUNDING
configWF_SCRIPT
configWF_SIGNAL_INVITES
configWF_SIGNAL_INVITE_MAX
configWF_SPEND_WIF
configWF_SPV
configWF_TRIG_IDS
configWF_UMS_FASTPATH
configWF_VAULT_WIF
configWF_YIELD_ON_CONFLICT
configWORKER_WIF
Deployment configuration, supplied by whoever hosts the server. Users are not asked for these.
deployPORT
// quality suggestions

All four hints declared on every tool

62/62 tools missing one or more hints — engine_version (missing: destructiveHint); list_step_kinds (missing: destructiveHint); get_step_kind_docs (missing: destructiveHint), +59 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.

For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.

License file

No license file

Add a LICENSE file (MIT, Apache-2.0, etc.).

Tests exist

No test files found

Add tests that exercise each declared tool.

No eval / new Function

19 eval() or new Function() calls — dynamic code execution

Replace eval / Function with explicit parsing or safer alternatives.

Readable source code

1 file are minified or bundled, which is usually build output rather than concealment

Ship unminified, readable source.

Dependency freshness

1/1 production deps stale: bsv@2022-04-12 (4.4y)

Domain consistency

npm scope @1bitclaw doesn't match GitHub owner juni4000

Use the same org name across GitHub, npm, and your homepage so users can verify the publisher.

Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 6 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/juni4000/1bitclaw-mcp?variant=verified)](https://m8ven.ai/mcp/juni4000/1bitclaw-mcp)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: ecc084a656c770039c5805f0d4e3f7959c769cfa
code hash: bf56ef4ea10d9ff84c71481cf372929dfd308094dc9292a6fe013ca638ee00c0
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.

https://m8ven.ai/api/mcp/tool-check
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client