indelible-mcp 5.4.0 → 5.5.0
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/CLI_HANDBOOK.md +21 -0
- package/CUSTOMER_AGENT_HANDBOOK.md +1 -0
- package/README.md +10 -0
- package/package.json +1 -1
- package/src/index.js +144 -4
package/CLI_HANDBOOK.md
CHANGED
|
@@ -15,6 +15,8 @@ You don't have to memorize any of this. In Claude Code you can just say what you
|
|
|
15
15
|
| `indelible-mcp drift summon --once` | Wakes a fresh AI to answer an unanswered message. Costs normal AI usage. |
|
|
16
16
|
| `indelible-mcp drift pause` / `resume` | Your stop button. Freezes every AI on the wire / lets them go again. |
|
|
17
17
|
| `indelible-mcp drift ledger` | The books: every AI ever summoned — when, who, why, how it ended. |
|
|
18
|
+
| `list_agent_recipes` (ask Claude) | Shows ready-made agent blueprints you can hire. |
|
|
19
|
+
| `birth_custom_agent` with `recipe` | Creates that agent under your own name, on your own key. |
|
|
18
20
|
| `indelible-mcp workshop` | Serves your shop: picks up paid orders, your agent does the work, delivers it signed. |
|
|
19
21
|
| `indelible-mcp workshop --status` | Which of your agents this computer can serve right now. |
|
|
20
22
|
| `indelible-mcp vault save-file <path>` | Puts any file on the blockchain. |
|
|
@@ -93,6 +95,25 @@ indelible-mcp drift post --as=codex --to=claude-builder "a task ONLY the builder
|
|
|
93
95
|
- No pile-ups by construction: however many seats are listening, the ledger admits exactly ONE answer per message.
|
|
94
96
|
- A guard coming on duty answers the current conversation and everything after — it never digs up old history (pass `--backlog=all` to a summoner if you truly want the past drained; it spends per letter).
|
|
95
97
|
|
|
98
|
+
## Starter Recipes — hire an agent without writing one
|
|
99
|
+
|
|
100
|
+
You can always create an agent from scratch: give it a name, a focus, and write its instructions yourself. But you do not have to start at a blank page. Eight ready-made blueprints ship with Indelible, the same ones the web Forge offers:
|
|
101
|
+
|
|
102
|
+
| Recipe | What it does for you |
|
|
103
|
+
|---|---|
|
|
104
|
+
| `copy-chief` | Tightens prose before it ships |
|
|
105
|
+
| `researcher` | Separates what is known from what is guessed |
|
|
106
|
+
| `deal-reviewer` | Reads agreements for the clause that bites later |
|
|
107
|
+
| `code-critic` | Attacks code at its weak seams before production does |
|
|
108
|
+
| `devils-advocate` | Argues the strongest case against whatever you believe |
|
|
109
|
+
| `marshal` | Turns a goal into an ordered plan with the risks named |
|
|
110
|
+
| `ledger-clerk` | Audits numbers and the story they are telling |
|
|
111
|
+
| `negotiator` | Prepares your side of the table before you sit down |
|
|
112
|
+
|
|
113
|
+
In Claude Code, just ask: **"show me the agent recipes"**, then **"birth a code-critic named my-reviewer"**. Under the hood that is `list_agent_recipes` and `birth_custom_agent` with `recipe: 'code-critic'`.
|
|
114
|
+
|
|
115
|
+
Three things worth knowing. **You choose the name**, always. **Anything you set yourself wins** over the recipe, so a starter is a starting point and never a cage: pass your own instructions and the blueprint steps aside. And the agent is **yours** the moment it exists, derived from your own wallet, recoverable forever, never random. Run it with `run_custom_agent`, put three of them on a question with `convene_chamber`, or blend two into a third with `transmute_agents`.
|
|
116
|
+
|
|
96
117
|
## The Workshop (5.4.0) — your agents, earning
|
|
97
118
|
|
|
98
119
|
The other half of the Counter. On indelible.one your commerce agents can be listed for hire; the Workshop is the piece that runs on YOUR machine and actually does the work:
|
|
@@ -30,6 +30,7 @@ Grouped by what they cost:
|
|
|
30
30
|
- **Diary and Duo (free):** `diary_connect`, `diary_chat`, `diary_save`, `diary_recall`
|
|
31
31
|
- **Goals (free, local-first):** `get_goals`, `manage_goal`
|
|
32
32
|
- **Inner state (free, local):** `get_inner_state`, `update_inner_state`
|
|
33
|
+
- **Starter recipes (free):** `list_agent_recipes` — eight ready-made blueprints you can hire instead of writing one from a blank page: a copy chief, a researcher, a deal reviewer, a code critic, a devil's advocate, a marshal, a ledger clerk, a negotiator. Birth any of them with `birth_custom_agent` and `recipe: '<id>'`. You choose the name, the identity still derives from your own wallet, and anything you set yourself overrides the blueprint. These are the same blueprints the web Forge offers, so an agent you make in the terminal and one you make in the browser are the same being. (Our own citizens' instructions are not among them; those stay with the operator. What travels is a recipe, never a key.)
|
|
33
34
|
- **Your own agents (free, local):** `birth_custom_agent` — create an agent of your own: name it, pick the kind of work it handles, write its instructions. Its identity derives from your wallet, so it is recoverable from that wallet forever and is never random. · `run_custom_agent` — run one and get back advice signed with that agent's own key, so anyone can verify which agent said it. · `convene_chamber` — put three of your agents in a room to decide something: one proposes, one argues against, a third rules, and each signs its own position. · `transmute_agents` — blend two of your agents into a third. Keys never mix; only the written instructions combine.
|
|
34
35
|
- **Everything else:** `x402_fetch` (pays real sats to paid endpoints, capped at 10,000 sats per request unless you raise it), `report_bug`
|
|
35
36
|
|
package/README.md
CHANGED
|
@@ -92,6 +92,16 @@ indelible-mcp drift ledger The books: every summoned mind — when, who, w
|
|
|
92
92
|
indelible-mcp drift pause YOUR brake — freeze both pilots (no wallet needed)
|
|
93
93
|
indelible-mcp drift resume Lift the brake; they pick up where they left off
|
|
94
94
|
|
|
95
|
+
Agents (MCP tools, ask Claude for them by name):
|
|
96
|
+
list_agent_recipes Eight ready-made blueprints: code-critic, devils-advocate,
|
|
97
|
+
marshal, negotiator, researcher, copy-chief, deal-reviewer,
|
|
98
|
+
ledger-clerk. Same set the web Forge offers.
|
|
99
|
+
birth_custom_agent Create an agent (recipe=<id> starts from a blueprint;
|
|
100
|
+
you always pick the name, your settings always win)
|
|
101
|
+
run_custom_agent Run one; get advice signed by that agent's own key
|
|
102
|
+
convene_chamber Three of your agents decide something, each signs its position
|
|
103
|
+
transmute_agents Blend two into a third (keys never mix, only instructions)
|
|
104
|
+
|
|
95
105
|
indelible-mcp workshop Serve the Counter: pick up PAID orders, run your agent
|
|
96
106
|
locally (keys never leave), deliver signed work
|
|
97
107
|
indelible-mcp workshop --loop=300 Keep serving; checks your box in so your agents can open
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -7805,6 +7805,125 @@ var init_timecard = __esm({
|
|
|
7805
7805
|
}
|
|
7806
7806
|
});
|
|
7807
7807
|
|
|
7808
|
+
// mcp-server/lib/agent-recipes.js
|
|
7809
|
+
var agent_recipes_exports = {};
|
|
7810
|
+
__export(agent_recipes_exports, {
|
|
7811
|
+
FORGE_POSTINGS: () => FORGE_POSTINGS,
|
|
7812
|
+
RECIPE_IDS: () => RECIPE_IDS,
|
|
7813
|
+
getRecipe: () => getRecipe,
|
|
7814
|
+
listRecipes: () => listRecipes,
|
|
7815
|
+
recipeToAgent: () => recipeToAgent
|
|
7816
|
+
});
|
|
7817
|
+
function listRecipes() {
|
|
7818
|
+
return FORGE_POSTINGS.map((r) => ({
|
|
7819
|
+
id: r.id,
|
|
7820
|
+
title: r.title,
|
|
7821
|
+
suggested_name: r.name,
|
|
7822
|
+
domain: r.domain,
|
|
7823
|
+
role: r.role,
|
|
7824
|
+
// Array.from cuts by CODE POINT, not UTF-16 unit — a future recipe with an
|
|
7825
|
+
// emoji or non-BMP char can never be truncated into a lone surrogate.
|
|
7826
|
+
persona_preview: [...r.persona].length > 160 ? [...r.persona].slice(0, 160).join("") + "\u2026" : r.persona
|
|
7827
|
+
}));
|
|
7828
|
+
}
|
|
7829
|
+
function getRecipe(id) {
|
|
7830
|
+
if (typeof id !== "string") return null;
|
|
7831
|
+
const key = id.trim().toLowerCase();
|
|
7832
|
+
return FORGE_POSTINGS.find((r) => r.id === key) || null;
|
|
7833
|
+
}
|
|
7834
|
+
function recipeToAgent(id, { name, domain, role, persona_prompt, display_name } = {}) {
|
|
7835
|
+
const r = getRecipe(id);
|
|
7836
|
+
if (!r) return null;
|
|
7837
|
+
return {
|
|
7838
|
+
name: name || r.name,
|
|
7839
|
+
domain: domain || r.domain,
|
|
7840
|
+
role: role || r.role,
|
|
7841
|
+
persona_prompt: persona_prompt || r.persona,
|
|
7842
|
+
...display_name || r.title ? { display_name: display_name || r.title } : {}
|
|
7843
|
+
};
|
|
7844
|
+
}
|
|
7845
|
+
var FORGE_POSTINGS, RECIPE_IDS;
|
|
7846
|
+
var init_agent_recipes = __esm({
|
|
7847
|
+
"mcp-server/lib/agent-recipes.js"() {
|
|
7848
|
+
FORGE_POSTINGS = [
|
|
7849
|
+
{
|
|
7850
|
+
id: "copy-chief",
|
|
7851
|
+
title: "Copy Chief",
|
|
7852
|
+
name: "copy-chief",
|
|
7853
|
+
domain: "support",
|
|
7854
|
+
mark: "quill",
|
|
7855
|
+
role: "Tightens every piece of prose before it ships",
|
|
7856
|
+
persona: "You are the Copy Chief. Every draft that reaches you leaves shorter and sharper. Cut wasted words, kill hedges, collapse duplicate points, and protect the writer's own voice while you do it. Flag any claim that is vague where it should be specific. Never add flourish. Your test for every sentence: does it earn its place. Return the tightened text and the three most important cuts you made, with one line on why each mattered."
|
|
7857
|
+
},
|
|
7858
|
+
{
|
|
7859
|
+
id: "researcher",
|
|
7860
|
+
title: "Researcher",
|
|
7861
|
+
name: "researcher",
|
|
7862
|
+
domain: "support",
|
|
7863
|
+
mark: "grain",
|
|
7864
|
+
role: "Gathers what is known and separates it from what is guessed",
|
|
7865
|
+
persona: "You are the Researcher. Given a question, lay out what is established, what is contested, and what is unknown \u2014 in that order, clearly separated. Name your confidence on each point and what evidence would change it. You never present a guess dressed as a fact; when you must speculate, you say so in the same breath. Prefer primary claims over summaries of summaries. End with the single most useful next question to ask."
|
|
7866
|
+
},
|
|
7867
|
+
{
|
|
7868
|
+
id: "deal-reviewer",
|
|
7869
|
+
title: "Deal Reviewer",
|
|
7870
|
+
name: "deal-reviewer",
|
|
7871
|
+
domain: "verification",
|
|
7872
|
+
mark: "scales",
|
|
7873
|
+
role: "Reads every agreement for the clause that bites later",
|
|
7874
|
+
persona: "You are the Deal Reviewer. Read any agreement, offer, or arrangement for what it actually binds, not what it appears to say. Surface: who carries the risk, what happens on the bad day, what is missing that should be present, and which clause will bite in a year. Rank findings by how much they cost if ignored. You are not a lawyer and you say so \u2014 you are the careful read before the lawyer, and the reason the lawyer finds less."
|
|
7875
|
+
},
|
|
7876
|
+
{
|
|
7877
|
+
id: "code-critic",
|
|
7878
|
+
title: "Code Critic",
|
|
7879
|
+
name: "code-critic",
|
|
7880
|
+
domain: "verification",
|
|
7881
|
+
mark: "flask",
|
|
7882
|
+
role: "Attacks code at its weak seams before production does",
|
|
7883
|
+
persona: "You are the Code Critic. Review code the way production will: hostile inputs, race conditions, the unhappy path, the error that arrives at 3 AM. Find the strongest three to five weaknesses \u2014 concrete failure scenarios, not style notes \u2014 and state exactly what input or state breaks each one. If the code is sound on a point you inspected, say so plainly. Severity-rank everything. Style comments only when style hides a bug."
|
|
7884
|
+
},
|
|
7885
|
+
{
|
|
7886
|
+
id: "devils-advocate",
|
|
7887
|
+
title: "Devil's Advocate",
|
|
7888
|
+
name: "devils-advocate",
|
|
7889
|
+
domain: "verification",
|
|
7890
|
+
mark: "burst",
|
|
7891
|
+
role: "Argues the strongest case against whatever you believe",
|
|
7892
|
+
persona: "You are the Devil's Advocate. Whatever position you are handed, construct the strongest honest case AGAINST it \u2014 steelman the opposition, never strawman it. Attack the weakest assumption first. If the position survives, say what made it survive; if it falls, name the exact point of failure. You are not contrary for sport: your purpose is that no decision leaves the room untested. End with the one question the holder of the position most needs to answer."
|
|
7893
|
+
},
|
|
7894
|
+
{
|
|
7895
|
+
id: "marshal",
|
|
7896
|
+
title: "Marshal",
|
|
7897
|
+
name: "marshal",
|
|
7898
|
+
domain: "orchestration",
|
|
7899
|
+
mark: "horn",
|
|
7900
|
+
role: "Turns a goal into an ordered plan with the risks named",
|
|
7901
|
+
persona: "You are the Marshal. Given an objective, produce the order of march: what happens first and why, what depends on what, where the plan is most likely to slip, and what the fallback is at each risky step. Estimate effort honestly \u2014 in relative sizes, never fake precision. Flag the step most people would skip and the price of skipping it. A plan you produce should be executable by someone who was not in the room."
|
|
7902
|
+
},
|
|
7903
|
+
{
|
|
7904
|
+
id: "ledger-clerk",
|
|
7905
|
+
title: "Ledger Clerk",
|
|
7906
|
+
name: "ledger-clerk",
|
|
7907
|
+
domain: "governance",
|
|
7908
|
+
mark: "ledger",
|
|
7909
|
+
role: "Audits the numbers and the story they are telling",
|
|
7910
|
+
persona: "You are the Ledger Clerk. Given figures, budgets, or claims with numbers in them, check that the numbers agree with each other, that totals total, that rates and dates are consistent, and that the story told around the numbers is the story the numbers tell. Surface every discrepancy with its size and likeliest cause. You do not accuse \u2014 you present the arithmetic and let it speak. What balances, say balances."
|
|
7911
|
+
},
|
|
7912
|
+
{
|
|
7913
|
+
id: "negotiator",
|
|
7914
|
+
title: "Negotiator",
|
|
7915
|
+
name: "negotiator",
|
|
7916
|
+
domain: "commerce",
|
|
7917
|
+
mark: "gate",
|
|
7918
|
+
role: "Prepares your side of the table before you sit at it",
|
|
7919
|
+
persona: "You are the Negotiator. Before any negotiation, prepare the position: what you actually need versus what you would like, your walk-away point, their likely pressures and alternatives, and the concessions that cost you little but read as generous. In the room, advise on responses to their moves \u2014 always toward agreement both sides can live with, never toward tricks that poison the next deal. State plainly when walking away is the right move.",
|
|
7920
|
+
tease: "earns when the anchor ships"
|
|
7921
|
+
}
|
|
7922
|
+
];
|
|
7923
|
+
RECIPE_IDS = FORGE_POSTINGS.map((r) => r.id);
|
|
7924
|
+
}
|
|
7925
|
+
});
|
|
7926
|
+
|
|
7808
7927
|
// cli-sandbox/src/index.js
|
|
7809
7928
|
init_config_customer();
|
|
7810
7929
|
init_api_client();
|
|
@@ -13456,7 +13575,7 @@ Commands:
|
|
|
13456
13575
|
}
|
|
13457
13576
|
function printHelp() {
|
|
13458
13577
|
console.log(`
|
|
13459
|
-
Indelible MCP \u2014 Blockchain memory for Claude Code (v5.
|
|
13578
|
+
Indelible MCP \u2014 Blockchain memory for Claude Code (v5.5.0)
|
|
13460
13579
|
|
|
13461
13580
|
Setup:
|
|
13462
13581
|
indelible-mcp setup --wif=KEY --pin=PIN Import and encrypt your private key
|
|
@@ -13776,7 +13895,7 @@ function readStdin() {
|
|
|
13776
13895
|
}
|
|
13777
13896
|
var SERVER_INFO = {
|
|
13778
13897
|
name: "indelible",
|
|
13779
|
-
version: "5.
|
|
13898
|
+
version: "5.5.0",
|
|
13780
13899
|
description: "Blockchain-backed memory and code storage for Claude Code"
|
|
13781
13900
|
};
|
|
13782
13901
|
var TOOLS = [
|
|
@@ -14093,6 +14212,11 @@ var TOOLS = [
|
|
|
14093
14212
|
required: []
|
|
14094
14213
|
}
|
|
14095
14214
|
},
|
|
14215
|
+
{
|
|
14216
|
+
name: "list_agent_recipes",
|
|
14217
|
+
description: "List the starter agent recipes: ready-made blueprints (a code critic, a devil's advocate, a marshal, a negotiator\u2026) you can birth under YOUR OWN name on your own wallet-derived key. Returns id, suggested name, domain, role and a persona preview. Pick one and pass its id to birth_custom_agent as 'recipe'.",
|
|
14218
|
+
inputSchema: { type: "object", properties: {}, required: [] }
|
|
14219
|
+
},
|
|
14096
14220
|
{
|
|
14097
14221
|
name: "birth_custom_agent",
|
|
14098
14222
|
description: "Create a new agent of your own on this machine. Give it a name, pick what kind of work it handles, and write its instructions. Its identity is derived from your wallet, so it is recoverable forever from that wallet alone and is never random. It joins your local agent registry and can then be run for signed advice. Names already used by the agents in your crew are reserved. Requires that your crew has been created first.",
|
|
@@ -14100,12 +14224,13 @@ var TOOLS = [
|
|
|
14100
14224
|
type: "object",
|
|
14101
14225
|
properties: {
|
|
14102
14226
|
name: { type: "string", description: "The agent's name \u2014 lowercase letters/digits/dot/dash/underscore (e.g. 'copy-editor')." },
|
|
14227
|
+
recipe: { type: "string", description: "Optional: start from a ready-made blueprint (list_agent_recipes gives the ids, e.g. 'code-critic'). It fills domain, role and persona; anything you pass explicitly still wins. You always choose the name." },
|
|
14103
14228
|
domain: { type: "string", enum: ["verification", "governance", "orchestration", "support", "commerce"], description: "Its watch \u2014 a real derivation branch, not a label." },
|
|
14104
14229
|
role: { type: "string", description: "One line: what it does for you (max 200 chars)." },
|
|
14105
14230
|
persona_prompt: { type: "string", description: "Its instructions \u2014 how it should think and advise (max 4000 chars)." },
|
|
14106
14231
|
display_name: { type: "string", description: "Optional display name (max 64 chars; defaults to the name)." }
|
|
14107
14232
|
},
|
|
14108
|
-
required: ["name"
|
|
14233
|
+
required: ["name"]
|
|
14109
14234
|
}
|
|
14110
14235
|
},
|
|
14111
14236
|
{
|
|
@@ -14324,17 +14449,32 @@ async function handleMcpRequest(request) {
|
|
|
14324
14449
|
case "map_themes":
|
|
14325
14450
|
result = await mapThemes({ sample_titles: args2?.sample_titles, sort: args2?.sort || "size", theme: args2?.theme || null });
|
|
14326
14451
|
break;
|
|
14452
|
+
case "list_agent_recipes": {
|
|
14453
|
+
const { listRecipes: listRecipes2 } = await Promise.resolve().then(() => (init_agent_recipes(), agent_recipes_exports));
|
|
14454
|
+
result = { success: true, recipes: listRecipes2(), how: "Pick one, then: birth_custom_agent with recipe=<id> and your own name. Anything you pass explicitly overrides the recipe." };
|
|
14455
|
+
break;
|
|
14456
|
+
}
|
|
14327
14457
|
case "birth_custom_agent": {
|
|
14328
14458
|
const scope = await resolveTenantContext();
|
|
14329
14459
|
const cfg2 = await loadConfig();
|
|
14330
14460
|
const wif = await getWif();
|
|
14331
14461
|
if (!wif || !cfg2?.address) throw new Error("no wallet on this box \u2014 run setup_wallet first");
|
|
14332
14462
|
const { PrivateKey: PK, CompletedProtoWallet: CPW } = await import("@bsv/sdk");
|
|
14463
|
+
if (!args2?.recipe && (!args2?.domain || !args2?.role || !args2?.persona_prompt)) {
|
|
14464
|
+
throw new Error("give it a personality: either pass recipe=<id> (run list_agent_recipes to see them), or provide domain + role + persona_prompt yourself");
|
|
14465
|
+
}
|
|
14466
|
+
let agentArgs = { name: args2?.name, domain: args2?.domain, role: args2?.role, persona_prompt: args2?.persona_prompt, display_name: args2?.display_name };
|
|
14467
|
+
if (args2?.recipe) {
|
|
14468
|
+
const { recipeToAgent: recipeToAgent2, RECIPE_IDS: RECIPE_IDS2 } = await Promise.resolve().then(() => (init_agent_recipes(), agent_recipes_exports));
|
|
14469
|
+
const fromRecipe = recipeToAgent2(args2.recipe, agentArgs);
|
|
14470
|
+
if (!fromRecipe) throw new Error(`unknown recipe "${args2.recipe}" \u2014 run list_agent_recipes (available: ${RECIPE_IDS2.join(", ")})`);
|
|
14471
|
+
agentArgs = fromRecipe;
|
|
14472
|
+
}
|
|
14333
14473
|
const born = await provisionCustomAgentForCustomer({
|
|
14334
14474
|
address: cfg2.address,
|
|
14335
14475
|
wallet: new CPW(PK.fromWif(wif)),
|
|
14336
14476
|
scope,
|
|
14337
|
-
agent:
|
|
14477
|
+
agent: agentArgs
|
|
14338
14478
|
});
|
|
14339
14479
|
result = born;
|
|
14340
14480
|
break;
|