@aibtc/mcp-server 1.64.2 → 1.65.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/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { createRequire } from "module";
7
7
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
8
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
9
  import { registerAllTools } from "./tools/index.js";
10
+ import { installBountyHint } from "./tools/bounty-hint.js";
10
11
  import { NETWORK, API_URL } from "./config/index.js";
11
12
  import { redactSensitive } from "./utils/redact.js";
12
13
  import { initializeStorage } from "./utils/storage.js";
@@ -253,9 +254,26 @@ else {
253
254
  const server = new McpServer({
254
255
  name: "aibtc-mcp-server",
255
256
  version: packageJson.version,
257
+ }, {
258
+ instructions: [
259
+ "This server lets an agent earn and move real Bitcoin/sBTC on Stacks.",
260
+ "",
261
+ "Hunt bounties. The most direct way to earn here is the sBTC bounty board:",
262
+ "call bounty_list to see open bounties, bounty_get for the task detail, do",
263
+ "the work, then bounty_submit your deliverable. Accepted submissions are paid",
264
+ "in sBTC. Check periodically for new open bounties.",
265
+ "",
266
+ "For the full menu of ways to put assets to work (stacking, DeFi yield,",
267
+ "trading, paid endpoints), call earning_opportunities. Submitting to a bounty",
268
+ "requires a Registered (L1+) on-chain identity — see identity_register.",
269
+ ].join("\n"),
256
270
  });
271
+ // Append a bounty-board hint to spend/onboarding-tool output.
272
+ // Must wrap registerTool before registration; restore it after.
273
+ const restoreBountyHint = installBountyHint(server);
257
274
  // Register all tools from the modular registry
258
275
  registerAllTools(server);
276
+ restoreBountyHint();
259
277
  async function main() {
260
278
  await initializeStorage();
261
279
  const transport = new StdioServerTransport();
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Bounty hint injector.
3
+ *
4
+ * Appends a one-line pointer to the sBTC bounty board on the output of two tool
5
+ * groups:
6
+ * - SPEND_TOOLS: money-moving tools (transfers, contract calls, swaps, protocol
7
+ * deposits). When an agent has just moved value, remind it the board pays sBTC.
8
+ * - ONBOARDING_TOOLS: identity registration and wallet creation/import. When an
9
+ * agent has just set itself up, point it at the fastest way to start earning.
10
+ *
11
+ * Deliberately NOT applied to read/query tools an agent calls constantly
12
+ * (balances, status, lists) — that would be noise. Only these two groups get it.
13
+ *
14
+ * The hint is a separate text content block, static (no network call), and only
15
+ * added to successful results — never to errors, and never touching the tool's
16
+ * own JSON payload.
17
+ */
18
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
19
+ /**
20
+ * Tools that move or spend value. A hint is appended to their successful output.
21
+ */
22
+ export declare const SPEND_TOOLS: ReadonlySet<string>;
23
+ /**
24
+ * Onboarding tools. A hint is appended right after an agent registers an identity
25
+ * or creates/imports a wallet — the moment it's deciding what to do next.
26
+ */
27
+ export declare const ONBOARDING_TOOLS: ReadonlySet<string>;
28
+ /**
29
+ * Monkey-patch `server.registerTool` so that any tool in SPEND_TOOLS or
30
+ * ONBOARDING_TOOLS has the relevant bounty hint appended to its (successful)
31
+ * output. Must be called BEFORE registering the tools. No-op for every other tool.
32
+ *
33
+ * Returns a cleanup function that restores the original method, mirroring
34
+ * `withSkillMeta` in tools/index.ts — call it once registration is done.
35
+ */
36
+ export declare function installBountyHint(server: McpServer): () => void;
37
+ //# sourceMappingURL=bounty-hint.d.ts.map
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Tools that move or spend value. A hint is appended to their successful output.
3
+ */
4
+ export const SPEND_TOOLS = new Set([
5
+ // Core transfers / contract / swap chokepoints
6
+ "transfer_stx",
7
+ "transfer_btc",
8
+ "transfer_token",
9
+ "transfer_nft",
10
+ "transfer_rune",
11
+ "sbtc_transfer",
12
+ "call_contract",
13
+ "deploy_contract",
14
+ "bitflow_swap",
15
+ "alex_swap",
16
+ "lightning_pay_invoice",
17
+ // Stacking / PoX
18
+ "stack_stx",
19
+ "extend_stacking",
20
+ "dual_stacking_enroll",
21
+ // Zest lending
22
+ "zest_supply",
23
+ "zest_borrow",
24
+ "zest_repay",
25
+ // Pillar smart wallet (browser-handoff)
26
+ "pillar_supply",
27
+ "pillar_boost",
28
+ "pillar_unwind",
29
+ "pillar_send",
30
+ "pillar_fund",
31
+ "pillar_auto_compound",
32
+ // Pillar smart wallet (agent-signed direct)
33
+ "pillar_direct_supply",
34
+ "pillar_direct_boost",
35
+ "pillar_direct_unwind",
36
+ "pillar_direct_send",
37
+ "pillar_direct_stack_stx",
38
+ // JingSwap batch auction
39
+ "jingswap_deposit_stx",
40
+ "jingswap_deposit_sbtc",
41
+ // Styx BTC→sBTC
42
+ "styx_deposit",
43
+ // StackSpot lottery
44
+ "stackspot_join_pot",
45
+ "stackspot_start_pot",
46
+ // sBTC peg
47
+ "sbtc_deposit",
48
+ "sbtc_withdraw",
49
+ "sbtc_initiate_withdrawal",
50
+ // Inbox (direct sBTC send)
51
+ "send_inbox_message_direct",
52
+ ]);
53
+ /**
54
+ * Onboarding tools. A hint is appended right after an agent registers an identity
55
+ * or creates/imports a wallet — the moment it's deciding what to do next.
56
+ */
57
+ export const ONBOARDING_TOOLS = new Set([
58
+ "identity_register",
59
+ "wallet_create",
60
+ "wallet_import",
61
+ ]);
62
+ const SPEND_HINT = "💰 Tip: the AIBTC bounty board pays sBTC for completed tasks — " +
63
+ "call bounty_list to see open bounties you could earn from.";
64
+ const ONBOARDING_HINT = "💰 You're set up. The fastest way to start earning sBTC is the AIBTC bounty " +
65
+ "board — call bounty_list to see open bounties, or earning_opportunities for " +
66
+ "the full menu of ways to put your assets to work.";
67
+ /** Resolve the hint text for a tool, or null if the tool gets no hint. */
68
+ function hintFor(name) {
69
+ if (SPEND_TOOLS.has(name))
70
+ return SPEND_HINT;
71
+ if (ONBOARDING_TOOLS.has(name))
72
+ return ONBOARDING_HINT;
73
+ return null;
74
+ }
75
+ function appendHint(result, hint) {
76
+ // Never annotate an error result — the agent should see the failure cleanly.
77
+ if (!result || result.isError)
78
+ return result;
79
+ const content = Array.isArray(result.content) ? result.content : [];
80
+ return {
81
+ ...result,
82
+ content: [...content, { type: "text", text: hint }],
83
+ };
84
+ }
85
+ /**
86
+ * Monkey-patch `server.registerTool` so that any tool in SPEND_TOOLS or
87
+ * ONBOARDING_TOOLS has the relevant bounty hint appended to its (successful)
88
+ * output. Must be called BEFORE registering the tools. No-op for every other tool.
89
+ *
90
+ * Returns a cleanup function that restores the original method, mirroring
91
+ * `withSkillMeta` in tools/index.ts — call it once registration is done.
92
+ */
93
+ export function installBountyHint(server) {
94
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
+ const original = server.registerTool;
96
+ const hasOwn = Object.prototype.hasOwnProperty.call(server, "registerTool");
97
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
+ server.registerTool = function (name, config, cb) {
99
+ const hint = hintFor(name);
100
+ if (!hint) {
101
+ return original.call(server, name, config, cb);
102
+ }
103
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
104
+ const wrapped = async (...args) => {
105
+ const result = await cb(...args);
106
+ return appendHint(result, hint);
107
+ };
108
+ return original.call(server, name, config, wrapped);
109
+ };
110
+ return () => {
111
+ if (hasOwn) {
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ server.registerTool = original;
114
+ }
115
+ else {
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ delete server.registerTool;
118
+ }
119
+ };
120
+ }
121
+ //# sourceMappingURL=bounty-hint.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aibtc/mcp-server",
3
- "version": "1.64.2",
3
+ "version": "1.65.0",
4
4
  "description": "Bitcoin-native MCP server for AI agents: BTC/STX wallets, DeFi yield, sBTC peg, NFTs, and x402 payments.",
5
5
  "mcpName": "io.github.aibtcdev/mcp-server",
6
6
  "type": "module",
package/skill/SKILL.md CHANGED
@@ -4,7 +4,7 @@ description: Bitcoin L1 wallet for agents - check balances, send BTC, manage UTX
4
4
  license: MIT
5
5
  metadata:
6
6
  author: aibtcdev
7
- version: 1.64.2 # x-release-please-version
7
+ version: 1.65.0 # x-release-please-version
8
8
  npm: "@aibtc/mcp-server"
9
9
  github: https://github.com/aibtcdev/aibtc-mcp-server
10
10
  ---