@mcsherrylabs/evolver-mcp 0.8.4 → 0.8.6
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.
- package/deploy/Dockerfile +28 -0
- package/deploy/docker-compose.yml +12 -3
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +10 -1
- package/dist/install.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# evolver-mcp follower node image: bakes the devnet-follower config INTO the image so the
|
|
2
|
+
# published `npx … install` never depends on a checkout path. The base image is the pinned
|
|
3
|
+
# evolver-node; we add only the three static config files under /config and keep the base's
|
|
4
|
+
# runtime user/entrypoint (which the compose `entrypoint:` then overrides with node-join.sh).
|
|
5
|
+
#
|
|
6
|
+
# WHY NOT A BIND MOUNT (./config:/config:ro): a bind mount's host path is resolved by the Docker
|
|
7
|
+
# daemon, which runs on the HOST. When `install` runs inside a rig dev container, the daemon's
|
|
8
|
+
# idea of `/workspace` is a different directory than the container's, so `./config` is empty and
|
|
9
|
+
# the node boots with `/config/node-join.sh: No such file`. Baking removes the path entirely.
|
|
10
|
+
|
|
11
|
+
ARG EVOLVER_REGISTRY=nexus.mcsherrylabs.com
|
|
12
|
+
ARG EVOLVER_VERSION=v0.24.5
|
|
13
|
+
FROM ${EVOLVER_REGISTRY}/evolver-node:${EVOLVER_VERSION}
|
|
14
|
+
|
|
15
|
+
# The static, chain-identity configs. node.conf references these by absolute path and
|
|
16
|
+
# node-join.sh execs `-Dconfig.file=/config/node.conf`, so /config is their fixed home.
|
|
17
|
+
# genesis.devnet.conf is byte-identical to the devnet genesis — the chain's identity, never edit.
|
|
18
|
+
#
|
|
19
|
+
# ⚠️ `/config` does NOT exist in the base image, and the image ends with `USER evolver`, so a bare
|
|
20
|
+
# `COPY … /config/x` lets buildkit create `/config` at the build umask (drw-r--r--, root-owned)
|
|
21
|
+
# that `evolver` (uid != root) then cannot traverse. Also, a `RUN` here would EXECUTE as evolver and
|
|
22
|
+
# cannot `mkdir` at `/`. Do the dir creation as root, then drop back to the image's runtime user.
|
|
23
|
+
USER root
|
|
24
|
+
RUN mkdir -p /config && chmod 755 /config
|
|
25
|
+
COPY --chmod=644 config/genesis.devnet.conf /config/genesis.devnet.conf
|
|
26
|
+
COPY --chmod=644 config/node.conf /config/node.conf
|
|
27
|
+
COPY --chmod=644 config/node-join.sh /config/node-join.sh
|
|
28
|
+
USER evolver
|
|
@@ -29,7 +29,16 @@ name: evolver-mcp
|
|
|
29
29
|
services:
|
|
30
30
|
# ── the LOCAL devnet follower ──────────────────────────────────────────────
|
|
31
31
|
node:
|
|
32
|
-
|
|
32
|
+
# Build FROM the pinned evolver-node and bake /config in (see deploy/Dockerfile). No bind
|
|
33
|
+
# mount: the daemon resolves host paths, and `install` may run in a container whose /workspace
|
|
34
|
+
# differs from the host's. `--build` is passed by the install so a fresh machine builds it.
|
|
35
|
+
build:
|
|
36
|
+
context: .
|
|
37
|
+
dockerfile: Dockerfile
|
|
38
|
+
args:
|
|
39
|
+
EVOLVER_REGISTRY: ${EVOLVER_REGISTRY:-nexus.mcsherrylabs.com}
|
|
40
|
+
EVOLVER_VERSION: ${EVOLVER_VERSION:-v0.24.5}
|
|
41
|
+
image: evolver-mcp-node:latest
|
|
33
42
|
restart: unless-stopped
|
|
34
43
|
environment:
|
|
35
44
|
# The node claims its OWN identity (node keys never leave this container) and persists the
|
|
@@ -56,8 +65,8 @@ services:
|
|
|
56
65
|
EVOLVER_NODE_PORT: "7100"
|
|
57
66
|
volumes:
|
|
58
67
|
- node-data:/data
|
|
59
|
-
|
|
60
|
-
#
|
|
68
|
+
# INVOKED VIA /bin/sh (a baked script's exec bit is irrelevant; node-join.sh is COPYed into
|
|
69
|
+
# /config by the Dockerfile, not bind-mounted, so no checkout file-mode concerns).
|
|
61
70
|
entrypoint: ["/bin/sh", "/config/node-join.sh"]
|
|
62
71
|
healthcheck:
|
|
63
72
|
test: ["CMD-SHELL", "curl -sf http://127.0.0.1:8440/api/explorer/blocks?limit=1 >/dev/null || exit 1"]
|
package/dist/cli.js
CHANGED
|
@@ -15,10 +15,15 @@ import { hasBootstrapFlag, runBootstrap } from "./bootstrap.js";
|
|
|
15
15
|
import { runInstall } from "./install.js";
|
|
16
16
|
const PACKAGE_NAME = "@mcsherrylabs/evolver-mcp";
|
|
17
17
|
const BOOTSTRAP_ENTRY_COMMAND = () => `npx -y ${PACKAGE_NAME}`;
|
|
18
|
-
/** True when the first non-flag argv token is the `install` subcommand.
|
|
18
|
+
/** True when the first non-flag argv token is the `install` subcommand.
|
|
19
|
+
*
|
|
20
|
+
* `process.argv` is `[node, <script>, ...userArgs]`, so we slice off the interpreter + script:
|
|
21
|
+
* `argv[0]` is the node binary's absolute path (which does not start with `-`), and would
|
|
22
|
+
* otherwise masquerade as the first "non-flag" token and always lose the `=== "install"` test.
|
|
23
|
+
*/
|
|
19
24
|
function isInstallCommand(argv) {
|
|
20
|
-
const i = argv.findIndex((a) => !a.startsWith("-"));
|
|
21
|
-
return i >= 0 && argv[i] === "install";
|
|
25
|
+
const i = argv.slice(2).findIndex((a) => !a.startsWith("-"));
|
|
26
|
+
return i >= 0 && argv.slice(2)[i] === "install";
|
|
22
27
|
}
|
|
23
28
|
await (async () => {
|
|
24
29
|
if (isInstallCommand(process.argv)) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,0FAA0F;AAC1F,EAAE;AACF,gGAAgG;AAChG,2FAA2F;AAC3F,EAAE;AACF,4FAA4F;AAC5F,+FAA+F;AAC/F,6FAA6F;AAC7F,iGAAiG;AACjG,4FAA4F;AAC5F,yCAAyC;AAEzC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACjD,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAAC,UAAU,YAAY,EAAE,CAAC;AAE/D
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,0FAA0F;AAC1F,EAAE;AACF,gGAAgG;AAChG,2FAA2F;AAC3F,EAAE;AACF,4FAA4F;AAC5F,+FAA+F;AAC/F,6FAA6F;AAC7F,iGAAiG;AACjG,4FAA4F;AAC5F,yCAAyC;AAEzC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACjD,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAAC,UAAU,YAAY,EAAE,CAAC;AAE/D;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,IAAI,EAAE;IAChB,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,yFAAyF;QACzF,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QACxF,IAAI,GAAG,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;YAChD,GAAG,CAAC,yBAAyB,GAAG,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,0FAA0F;QAC1F,8FAA8F;QAC9F,8CAA8C;QAC9C,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QACxF,IAAI,GAAG,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;YAChD,GAAG,CAAC,yBAAyB,GAAG,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,EAAE,CAAC"}
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AA+BA,UAAU,UAAU;IAClB,oGAAoG;IACpG,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kDAAkD;IAClD,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,kGAAkG;IAClG,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,6FAA6F;AAC7F,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,GAClC,OAAO,CAAC,aAAa,CAAC,CAoDxB"}
|
package/dist/install.js
CHANGED
|
@@ -9,6 +9,13 @@
|
|
|
9
9
|
// Reachability (B1): the compose publishes the node's 8440/8450 loopback-only, so THIS host-side
|
|
10
10
|
// process reaches `http://127.0.0.1:8440` / `:8450`. The bootstrap then derives
|
|
11
11
|
// `EVOLVER_CONTENT_URL` from the node's content port (see bootstrap's local-target derivation).
|
|
12
|
+
//
|
|
13
|
+
// PORTABILITY: the node's config is BAKED into its image (deploy/Dockerfile), not bind-mounted.
|
|
14
|
+
// `docker compose` resolves a bind mount's host path in the DAEMON'S filesystem, which runs on the
|
|
15
|
+
// host; `install` may run inside a rig dev container whose `/workspace` is a different directory
|
|
16
|
+
// than the host's. `--build` removes the path entirely, so `install` works from the host or any
|
|
17
|
+
// container. The MCP itself is a stdio server launched by Claude wherever Claude runs; it reaches
|
|
18
|
+
// the node on the shared loopback, so `claude mcp add` works on either side identically.
|
|
12
19
|
import { spawnSync } from "node:child_process";
|
|
13
20
|
import { existsSync } from "node:fs";
|
|
14
21
|
import { dirname, join, resolve } from "node:path";
|
|
@@ -40,7 +47,9 @@ export async function runInstall(argv, env) {
|
|
|
40
47
|
};
|
|
41
48
|
}
|
|
42
49
|
// 1. Start the follower node (claims its own identity on devnet, then syncs from block 0).
|
|
43
|
-
|
|
50
|
+
// `--build` builds the config-bearing image (deploy/Dockerfile) on first use; the config is
|
|
51
|
+
// baked in, so no host bind-mount and no checkout-path dependency.
|
|
52
|
+
const up = spawnSync("docker", ["compose", "-f", composeFile, "up", "-d", "--build", "node"], {
|
|
44
53
|
encoding: "utf8",
|
|
45
54
|
env: { ...process.env, ...env },
|
|
46
55
|
});
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,mGAAmG;AACnG,EAAE;AACF,kGAAkG;AAClG,oGAAoG;AACpG,kGAAkG;AAClG,sFAAsF;AACtF,EAAE;AACF,iGAAiG;AACjG,gFAAgF;AAChF,gGAAgG;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcsherrylabs/evolver-mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.6",
|
|
4
4
|
"description": "MCP server over a configurable Evolver node — read the chain, sign a transfer, administer what you own, write to a channel, submit a signed transaction. Wraps @mcsherrylabs/evolver-client; implements no wire format of its own.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|