@aaronbassett/midnight-local-devnet 0.1.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +212 -0
  3. package/dist/cli/commands/accounts.d.ts +3 -0
  4. package/dist/cli/commands/accounts.js +38 -0
  5. package/dist/cli/commands/accounts.js.map +1 -0
  6. package/dist/cli/commands/network.d.ts +3 -0
  7. package/dist/cli/commands/network.js +84 -0
  8. package/dist/cli/commands/network.js.map +1 -0
  9. package/dist/cli/commands/wallet.d.ts +3 -0
  10. package/dist/cli/commands/wallet.js +49 -0
  11. package/dist/cli/commands/wallet.js.map +1 -0
  12. package/dist/cli/interactive.d.ts +2 -0
  13. package/dist/cli/interactive.js +90 -0
  14. package/dist/cli/interactive.js.map +1 -0
  15. package/dist/cli.d.ts +2 -0
  16. package/dist/cli.js +48 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/core/accounts.d.ts +17 -0
  19. package/dist/core/accounts.js +80 -0
  20. package/dist/core/accounts.js.map +1 -0
  21. package/dist/core/config.d.ts +12 -0
  22. package/dist/core/config.js +22 -0
  23. package/dist/core/config.js.map +1 -0
  24. package/dist/core/docker.d.ts +13 -0
  25. package/dist/core/docker.js +101 -0
  26. package/dist/core/docker.js.map +1 -0
  27. package/dist/core/funding.d.ts +15 -0
  28. package/dist/core/funding.js +105 -0
  29. package/dist/core/funding.js.map +1 -0
  30. package/dist/core/health.d.ts +13 -0
  31. package/dist/core/health.js +34 -0
  32. package/dist/core/health.js.map +1 -0
  33. package/dist/core/logger.d.ts +2 -0
  34. package/dist/core/logger.js +16 -0
  35. package/dist/core/logger.js.map +1 -0
  36. package/dist/core/network-manager.d.ts +31 -0
  37. package/dist/core/network-manager.js +101 -0
  38. package/dist/core/network-manager.js.map +1 -0
  39. package/dist/core/types.d.ts +51 -0
  40. package/dist/core/types.js +11 -0
  41. package/dist/core/types.js.map +1 -0
  42. package/dist/core/wallet.d.ts +23 -0
  43. package/dist/core/wallet.js +163 -0
  44. package/dist/core/wallet.js.map +1 -0
  45. package/dist/index.d.ts +2 -0
  46. package/dist/index.js +34 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/mcp/resources/config.d.ts +3 -0
  49. package/dist/mcp/resources/config.js +28 -0
  50. package/dist/mcp/resources/config.js.map +1 -0
  51. package/dist/mcp/server.d.ts +3 -0
  52. package/dist/mcp/server.js +28 -0
  53. package/dist/mcp/server.js.map +1 -0
  54. package/dist/mcp/tools/accounts.d.ts +3 -0
  55. package/dist/mcp/tools/accounts.js +28 -0
  56. package/dist/mcp/tools/accounts.js.map +1 -0
  57. package/dist/mcp/tools/funding.d.ts +3 -0
  58. package/dist/mcp/tools/funding.js +59 -0
  59. package/dist/mcp/tools/funding.js.map +1 -0
  60. package/dist/mcp/tools/health.d.ts +3 -0
  61. package/dist/mcp/tools/health.js +19 -0
  62. package/dist/mcp/tools/health.js.map +1 -0
  63. package/dist/mcp/tools/network.d.ts +3 -0
  64. package/dist/mcp/tools/network.js +64 -0
  65. package/dist/mcp/tools/network.js.map +1 -0
  66. package/dist/mcp/tools/wallet.d.ts +3 -0
  67. package/dist/mcp/tools/wallet.js +19 -0
  68. package/dist/mcp/tools/wallet.js.map +1 -0
  69. package/docker/standalone.env +5 -0
  70. package/docker/standalone.yml +49 -0
  71. package/package.json +64 -0
@@ -0,0 +1,11 @@
1
+ export class DevnetError extends Error {
2
+ code;
3
+ suggestion;
4
+ constructor(message, code, suggestion) {
5
+ super(message);
6
+ this.code = code;
7
+ this.suggestion = suggestion;
8
+ this.name = 'DevnetError';
9
+ }
10
+ }
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAuDA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGlB;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import * as ledger from '@midnight-ntwrk/ledger-v7';
2
+ import { WalletFacade } from '@midnight-ntwrk/wallet-sdk-facade';
3
+ import { type UnshieldedKeystore } from '@midnight-ntwrk/wallet-sdk-unshielded-wallet';
4
+ import { Buffer } from 'buffer';
5
+ import type { NetworkConfig, WalletBalances } from './types.js';
6
+ import type { Logger } from 'pino';
7
+ export interface WalletContext {
8
+ wallet: WalletFacade;
9
+ shieldedSecretKeys: ledger.ZswapSecretKeys;
10
+ dustSecretKey: ledger.DustSecretKey;
11
+ unshieldedKeystore: UnshieldedKeystore;
12
+ }
13
+ export declare function setLogger(l: Logger): void;
14
+ export declare function generateNewMnemonic(): string;
15
+ export declare function mnemonicToSeed(mnemonic: string): Buffer;
16
+ export declare function initWalletFromSeed(seed: Buffer, config: NetworkConfig): Promise<WalletContext>;
17
+ export declare function initWalletFromMnemonic(mnemonic: string, config: NetworkConfig): Promise<WalletContext>;
18
+ export declare function initMasterWallet(config: NetworkConfig): Promise<WalletContext>;
19
+ export declare function waitForSync(wallet: WalletFacade): Promise<unknown>;
20
+ export declare function waitForFunds(wallet: WalletFacade, timeoutMs?: number): Promise<bigint>;
21
+ export declare function getWalletBalances(ctx: WalletContext): Promise<WalletBalances>;
22
+ export declare function registerNightForDust(ctx: WalletContext): Promise<boolean>;
23
+ export declare function closeWallet(ctx: WalletContext): Promise<void>;
@@ -0,0 +1,163 @@
1
+ import * as ledger from '@midnight-ntwrk/ledger-v7';
2
+ import { HDWallet, Roles } from '@midnight-ntwrk/wallet-sdk-hd';
3
+ import { WalletFacade } from '@midnight-ntwrk/wallet-sdk-facade';
4
+ import { ShieldedWallet } from '@midnight-ntwrk/wallet-sdk-shielded';
5
+ import { DustWallet } from '@midnight-ntwrk/wallet-sdk-dust-wallet';
6
+ import { createKeystore, InMemoryTransactionHistoryStorage, PublicKey as UnshieldedPublicKey, UnshieldedWallet, } from '@midnight-ntwrk/wallet-sdk-unshielded-wallet';
7
+ import { setNetworkId } from '@midnight-ntwrk/midnight-js-network-id';
8
+ import { generateMnemonic, mnemonicToSeedSync } from '@scure/bip39';
9
+ import { wordlist as english } from '@scure/bip39/wordlists/english.js';
10
+ import * as Rx from 'rxjs';
11
+ import { WebSocket } from 'ws';
12
+ import { Buffer } from 'buffer';
13
+ import { DevnetError } from './types.js';
14
+ import { GENESIS_SEED } from './config.js';
15
+ // Required for wallet SDK WebSocket support (Apollo uses globalThis.WebSocket)
16
+ // @ts-expect-error: Needed to enable WebSocket usage through apollo
17
+ globalThis.WebSocket = WebSocket;
18
+ let logger = null;
19
+ export function setLogger(l) {
20
+ logger = l;
21
+ }
22
+ // ── Mnemonic / seed helpers ────────────────────────────────────────────────
23
+ export function generateNewMnemonic() {
24
+ return generateMnemonic(english, 256);
25
+ }
26
+ export function mnemonicToSeed(mnemonic) {
27
+ return Buffer.from(mnemonicToSeedSync(mnemonic));
28
+ }
29
+ // ── Wallet initialization ──────────────────────────────────────────────────
30
+ export async function initWalletFromSeed(seed, config) {
31
+ setNetworkId(config.networkId);
32
+ // 1. HD key derivation (discriminated union — MUST check .type)
33
+ const hdResult = HDWallet.fromSeed(seed);
34
+ if (hdResult.type !== 'seedOk') {
35
+ throw new DevnetError('Failed to initialize HDWallet from seed', 'HD_WALLET_ERROR');
36
+ }
37
+ const derivationResult = hdResult.hdWallet
38
+ .selectAccount(0)
39
+ .selectRoles([Roles.Zswap, Roles.NightExternal, Roles.Dust])
40
+ .deriveKeysAt(0);
41
+ if (derivationResult.type !== 'keysDerived') {
42
+ throw new DevnetError('Failed to derive wallet keys', 'KEY_DERIVATION_ERROR');
43
+ }
44
+ // Zeroize HD wallet memory after derivation
45
+ hdResult.hdWallet.clear();
46
+ // 2. Build secret keys / keystore from derived seeds
47
+ const shieldedSecretKeys = ledger.ZswapSecretKeys.fromSeed(derivationResult.keys[Roles.Zswap]);
48
+ const dustSecretKey = ledger.DustSecretKey.fromSeed(derivationResult.keys[Roles.Dust]);
49
+ const unshieldedKeystore = createKeystore(derivationResult.keys[Roles.NightExternal], config.networkId);
50
+ // 3. Per-wallet configs
51
+ const relayURL = new URL(config.node.replace(/^http/, 'ws'));
52
+ // Shielded wallet config: networkId + sync + proving + submission
53
+ const shieldedConfig = {
54
+ networkId: config.networkId,
55
+ indexerClientConnection: {
56
+ indexerHttpUrl: config.indexer,
57
+ indexerWsUrl: config.indexerWS,
58
+ },
59
+ provingServerUrl: new URL(config.proofServer),
60
+ relayURL,
61
+ };
62
+ // Unshielded wallet config: networkId + sync + transacting + txHistoryStorage
63
+ const unshieldedConfig = {
64
+ networkId: config.networkId,
65
+ indexerClientConnection: {
66
+ indexerHttpUrl: config.indexer,
67
+ indexerWsUrl: config.indexerWS,
68
+ },
69
+ txHistoryStorage: new InMemoryTransactionHistoryStorage(),
70
+ };
71
+ // Dust wallet config: networkId + costParameters + sync + proving + submission
72
+ const dustConfig = {
73
+ networkId: config.networkId,
74
+ costParameters: {
75
+ additionalFeeOverhead: 300000000000000n,
76
+ feeBlocksMargin: 5,
77
+ },
78
+ indexerClientConnection: {
79
+ indexerHttpUrl: config.indexer,
80
+ indexerWsUrl: config.indexerWS,
81
+ },
82
+ provingServerUrl: new URL(config.proofServer),
83
+ relayURL,
84
+ };
85
+ // 4. Sub-wallet construction (factory functions, NOT constructors)
86
+ const shieldedWallet = ShieldedWallet(shieldedConfig).startWithSecretKeys(shieldedSecretKeys);
87
+ const unshieldedWallet = UnshieldedWallet(unshieldedConfig).startWithPublicKey(UnshieldedPublicKey.fromKeyStore(unshieldedKeystore));
88
+ const dustWallet = DustWallet(dustConfig).startWithSecretKey(dustSecretKey, ledger.LedgerParameters.initialParameters().dust);
89
+ // 5. WalletFacade: 3 sub-wallets
90
+ const wallet = new WalletFacade(shieldedWallet, unshieldedWallet, dustWallet);
91
+ await wallet.start(shieldedSecretKeys, dustSecretKey);
92
+ logger?.info('Waiting for wallet to sync...');
93
+ await waitForSync(wallet);
94
+ logger?.info('Wallet synced');
95
+ return { wallet, shieldedSecretKeys, dustSecretKey, unshieldedKeystore };
96
+ }
97
+ export async function initWalletFromMnemonic(mnemonic, config) {
98
+ const seed = mnemonicToSeed(mnemonic);
99
+ return initWalletFromSeed(seed, config);
100
+ }
101
+ export async function initMasterWallet(config) {
102
+ logger?.info('Initializing master wallet from genesis seed...');
103
+ const seed = Buffer.from(GENESIS_SEED, 'hex');
104
+ return initWalletFromSeed(seed, config);
105
+ }
106
+ // ── State observation ──────────────────────────────────────────────────────
107
+ export function waitForSync(wallet) {
108
+ return Rx.firstValueFrom(wallet.state().pipe(Rx.throttleTime(5_000), Rx.tap((state) => {
109
+ logger?.info(`Waiting for wallet sync. Synced: ${state.isSynced}`);
110
+ }), Rx.filter((state) => state.isSynced)));
111
+ }
112
+ export function waitForFunds(wallet, timeoutMs = 60_000) {
113
+ return Rx.firstValueFrom(wallet.state().pipe(Rx.throttleTime(10_000), Rx.tap((state) => {
114
+ const unshielded = state.unshielded?.balances[ledger.nativeToken().raw] ?? 0n;
115
+ const shielded = state.shielded?.balances[ledger.nativeToken().raw] ?? 0n;
116
+ logger?.info(`Waiting for funds. Synced: ${state.isSynced}, Unshielded: ${unshielded}, Shielded: ${shielded}`);
117
+ }), Rx.filter((state) => state.isSynced), Rx.map((s) => (s.unshielded?.balances[ledger.nativeToken().raw] ?? 0n) +
118
+ (s.shielded?.balances[ledger.nativeToken().raw] ?? 0n)), Rx.filter((balance) => balance > 0n), Rx.timeout(timeoutMs)));
119
+ }
120
+ export async function getWalletBalances(ctx) {
121
+ const state = await Rx.firstValueFrom(ctx.wallet.state());
122
+ const nativeToken = ledger.nativeToken().raw;
123
+ const unshielded = state.unshielded?.balances[nativeToken] ?? 0n;
124
+ const shielded = state.shielded?.balances[nativeToken] ?? 0n;
125
+ const dust = state.dust?.walletBalance(new Date()) ?? 0n;
126
+ return {
127
+ unshielded,
128
+ shielded,
129
+ dust,
130
+ total: unshielded + shielded,
131
+ };
132
+ }
133
+ // ── DUST registration ──────────────────────────────────────────────────────
134
+ export async function registerNightForDust(ctx) {
135
+ logger?.info('Registering NIGHT UTXOs for DUST generation...');
136
+ try {
137
+ const state = await Rx.firstValueFrom(ctx.wallet.state());
138
+ const unregistered = state.unshielded?.availableCoins?.filter((coin) => !coin.meta?.registeredForDustGeneration);
139
+ if (!unregistered || unregistered.length === 0) {
140
+ logger?.info('No unregistered UTXOs found (may already be registered)');
141
+ return true;
142
+ }
143
+ const recipe = await ctx.wallet.registerNightUtxosForDustGeneration(unregistered, UnshieldedPublicKey.fromKeyStore(ctx.unshieldedKeystore).publicKey, (payload) => ctx.unshieldedKeystore.signData(payload));
144
+ const finalized = await ctx.wallet.finalizeRecipe(recipe);
145
+ await ctx.wallet.submitTransaction(finalized);
146
+ logger?.info('DUST registration transaction submitted');
147
+ return true;
148
+ }
149
+ catch (err) {
150
+ logger?.error({ err }, 'DUST registration failed');
151
+ return false;
152
+ }
153
+ }
154
+ // ── Cleanup ────────────────────────────────────────────────────────────────
155
+ export async function closeWallet(ctx) {
156
+ try {
157
+ await ctx.wallet.stop();
158
+ }
159
+ catch {
160
+ // Ignore stop errors
161
+ }
162
+ }
163
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/core/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ // src/index.ts
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { createServer } from './mcp/server.js';
5
+ import { NetworkManager } from './core/network-manager.js';
6
+ import { createLogger } from './core/logger.js';
7
+ import { setLogger as setWalletLogger } from './core/wallet.js';
8
+ import { setLogger as setFundingLogger } from './core/funding.js';
9
+ import { setLogger as setAccountsLogger } from './core/accounts.js';
10
+ async function main() {
11
+ const manager = new NetworkManager();
12
+ const logger = createLogger();
13
+ setWalletLogger(logger);
14
+ setFundingLogger(logger);
15
+ setAccountsLogger(logger);
16
+ manager.setLogger(logger);
17
+ // Detect if network is already running (recovers state after restart)
18
+ await manager.detectRunningNetwork();
19
+ const server = createServer(manager);
20
+ const transport = new StdioServerTransport();
21
+ await server.connect(transport);
22
+ // Graceful shutdown: close wallet but leave Docker containers running
23
+ const shutdown = async () => {
24
+ await manager.shutdown();
25
+ process.exit(0);
26
+ };
27
+ process.on('SIGINT', shutdown);
28
+ process.on('SIGTERM', shutdown);
29
+ }
30
+ main().catch((err) => {
31
+ console.error('Fatal error:', err);
32
+ process.exit(1);
33
+ });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,eAAe;AACf,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE1B,sEAAsE;IACtE,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,sEAAsE;IACtE,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../../core/network-manager.js';
3
+ export declare function registerResources(server: McpServer, manager: NetworkManager): void;
@@ -0,0 +1,28 @@
1
+ import { DOCKER_IMAGES } from '../../core/config.js';
2
+ export function registerResources(server, manager) {
3
+ server.resource('devnet-config', 'devnet://config', { description: 'Current network configuration including endpoints and image versions.', mimeType: 'application/json' }, async (uri) => ({
4
+ contents: [{
5
+ uri: uri.href,
6
+ text: JSON.stringify({ ...manager.config, images: DOCKER_IMAGES }, null, 2),
7
+ }],
8
+ }));
9
+ server.resource('devnet-status', 'devnet://status', { description: 'Live network status including services and health.', mimeType: 'application/json' }, async (uri) => {
10
+ const status = manager.getStatus();
11
+ let services = [];
12
+ if (status !== 'stopped') {
13
+ try {
14
+ services = await manager.getServices();
15
+ }
16
+ catch {
17
+ // Network might be partially up
18
+ }
19
+ }
20
+ return {
21
+ contents: [{
22
+ uri: uri.href,
23
+ text: JSON.stringify({ status, services }, null, 2),
24
+ }],
25
+ };
26
+ });
27
+ }
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/mcp/resources/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,OAAuB;IAC1E,MAAM,CAAC,QAAQ,CACb,eAAe,EACf,iBAAiB,EACjB,EAAE,WAAW,EAAE,uEAAuE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACtH,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE,CAAC;gBACT,GAAG,EAAE,GAAG,CAAC,IAAI;gBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAC5E,CAAC;KACH,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,eAAe,EACf,iBAAiB,EACjB,EAAE,WAAW,EAAE,oDAAoD,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACnG,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,IAAI,QAAQ,GAAc,EAAE,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpD,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../core/network-manager.js';
3
+ export declare function createServer(manager: NetworkManager): McpServer;
@@ -0,0 +1,28 @@
1
+ // src/mcp/server.ts
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { registerNetworkTools } from './tools/network.js';
4
+ import { registerHealthTools } from './tools/health.js';
5
+ import { registerWalletTools } from './tools/wallet.js';
6
+ import { registerFundingTools } from './tools/funding.js';
7
+ import { registerAccountTools } from './tools/accounts.js';
8
+ import { registerResources } from './resources/config.js';
9
+ export function createServer(manager) {
10
+ const server = new McpServer({
11
+ name: 'midnight-local-devnet',
12
+ version: '0.1.0',
13
+ }, {
14
+ capabilities: {
15
+ logging: {},
16
+ resources: {},
17
+ tools: {},
18
+ },
19
+ });
20
+ registerNetworkTools(server, manager);
21
+ registerHealthTools(server, manager);
22
+ registerWalletTools(server, manager);
23
+ registerFundingTools(server, manager);
24
+ registerAccountTools(server, manager);
25
+ registerResources(server, manager);
26
+ return server;
27
+ }
28
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../../core/network-manager.js';
3
+ export declare function registerAccountTools(server: McpServer, manager: NetworkManager): void;
@@ -0,0 +1,28 @@
1
+ // src/mcp/tools/accounts.ts
2
+ import { z } from 'zod';
3
+ import { generateAccounts, generateAndFundAccounts, writeAccountsFile } from '../../core/accounts.js';
4
+ export function registerAccountTools(server, manager) {
5
+ server.tool('generate-test-account', 'Generate random test accounts with BIP39 mnemonics or private keys. Optionally fund and register DUST.', {
6
+ format: z.enum(['mnemonic', 'privateKey']).describe('Credential format'),
7
+ count: z.number().optional().describe('Number of accounts (default: 1)'),
8
+ fund: z.boolean().optional().describe('Fund accounts from master wallet'),
9
+ registerDust: z.boolean().optional().describe('Register DUST for funded accounts'),
10
+ outputFile: z.string().optional().describe('Write accounts to file'),
11
+ }, async ({ format, count, fund, registerDust: regDust, outputFile }) => {
12
+ let accounts;
13
+ if (fund) {
14
+ const wallet = await manager.ensureWallet();
15
+ accounts = await generateAndFundAccounts(wallet, manager.config, { format, count, fund: true, registerDust: regDust });
16
+ }
17
+ else {
18
+ accounts = await generateAccounts({ format, count });
19
+ }
20
+ if (outputFile) {
21
+ await writeAccountsFile(outputFile, accounts);
22
+ }
23
+ return {
24
+ content: [{ type: 'text', text: JSON.stringify(accounts, null, 2) }],
25
+ };
26
+ });
27
+ }
28
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/mcp/tools/accounts.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEtG,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,OAAuB;IAC7E,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,wGAAwG,EACxG;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACxE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACzE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAClF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACrE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QACnE,IAAI,QAAQ,CAAC;QAEb,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5C,QAAQ,GAAG,MAAM,uBAAuB,CACtC,MAAM,EACN,OAAO,CAAC,MAAM,EACd,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CACrD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../../core/network-manager.js';
3
+ export declare function registerFundingTools(server: McpServer, manager: NetworkManager): void;
@@ -0,0 +1,59 @@
1
+ // src/mcp/tools/funding.ts
2
+ import { z } from 'zod';
3
+ import { fundAccount, fundAccountFromMnemonic, fundAccountsFromFile } from '../../core/funding.js';
4
+ export function registerFundingTools(server, manager) {
5
+ server.tool('fund-account', 'Transfer NIGHT tokens from master wallet to a Bech32 address. Default: 50,000 NIGHT.', {
6
+ address: z.string().describe('Bech32 address to fund'),
7
+ amount: z.string().optional().describe('Amount in smallest unit (default: 50,000 NIGHT)'),
8
+ }, async ({ address, amount }) => {
9
+ const wallet = await manager.ensureWallet();
10
+ const result = await fundAccount(wallet, address, amount ? BigInt(amount) : undefined);
11
+ return {
12
+ content: [{
13
+ type: 'text',
14
+ text: JSON.stringify({
15
+ address: result.address,
16
+ amount: result.amount.toString(),
17
+ txHash: result.txHash,
18
+ hasDust: result.hasDust,
19
+ }, null, 2),
20
+ }],
21
+ };
22
+ });
23
+ server.tool('fund-account-from-mnemonic', 'Derive wallet from mnemonic, transfer NIGHT, and register DUST. Full account setup.', {
24
+ name: z.string().describe('Display name for the account'),
25
+ mnemonic: z.string().describe('BIP39 mnemonic phrase (24 words)'),
26
+ }, async ({ name, mnemonic }) => {
27
+ const wallet = await manager.ensureWallet();
28
+ const result = await fundAccountFromMnemonic(wallet, name, mnemonic, manager.config);
29
+ return {
30
+ content: [{
31
+ type: 'text',
32
+ text: JSON.stringify({
33
+ name: result.name,
34
+ address: result.address,
35
+ amount: result.amount.toString(),
36
+ txHash: result.txHash,
37
+ hasDust: result.hasDust,
38
+ }, null, 2),
39
+ }],
40
+ };
41
+ });
42
+ server.tool('fund-accounts-from-file', 'Batch fund accounts from an accounts.json file. Each gets 50,000 NIGHT + DUST.', { filePath: z.string().describe('Path to accounts.json file') }, async ({ filePath }) => {
43
+ const wallet = await manager.ensureWallet();
44
+ const results = await fundAccountsFromFile(wallet, filePath, manager.config);
45
+ return {
46
+ content: [{
47
+ type: 'text',
48
+ text: JSON.stringify(results.map((r) => ({
49
+ name: r.name,
50
+ address: r.address,
51
+ amount: r.amount.toString(),
52
+ txHash: r.txHash,
53
+ hasDust: r.hasDust,
54
+ })), null, 2),
55
+ }],
56
+ };
57
+ });
58
+ }
59
+ //# sourceMappingURL=funding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funding.js","sourceRoot":"","sources":["../../../src/mcp/tools/funding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../../core/network-manager.js';
3
+ export declare function registerHealthTools(server: McpServer, manager: NetworkManager): void;
@@ -0,0 +1,19 @@
1
+ import { checkAllHealth } from '../../core/health.js';
2
+ import { DOCKER_IMAGES } from '../../core/config.js';
3
+ export function registerHealthTools(server, manager) {
4
+ server.tool('health-check', 'Check health of all network services by hitting their endpoints.', {}, async () => {
5
+ const health = await checkAllHealth(manager.config);
6
+ return {
7
+ content: [{ type: 'text', text: JSON.stringify(health, null, 2) }],
8
+ };
9
+ });
10
+ server.tool('get-network-config', 'Get all endpoint URLs, network ID, and Docker image versions for connecting a DApp.', {}, async () => {
11
+ return {
12
+ content: [{
13
+ type: 'text',
14
+ text: JSON.stringify({ ...manager.config, images: DOCKER_IMAGES }, null, 2),
15
+ }],
16
+ };
17
+ });
18
+ }
19
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/mcp/tools/health.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,OAAuB;IAC5E,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kEAAkE,EAClE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,qFAAqF,EACrF,EAAE,EACF,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5E,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../../core/network-manager.js';
3
+ export declare function registerNetworkTools(server: McpServer, manager: NetworkManager): void;
@@ -0,0 +1,64 @@
1
+ // src/mcp/tools/network.ts
2
+ import { z } from 'zod';
3
+ export function registerNetworkTools(server, manager) {
4
+ server.tool('start-network', 'Start the local Midnight development network (node, indexer, proof-server). Initializes the genesis master wallet and registers DUST.', { pull: z.boolean().optional().describe('Pull latest Docker images before starting') }, async ({ pull }) => {
5
+ const result = await manager.start({ pull: pull ?? false });
6
+ if (result === 'already-running') {
7
+ return { content: [{ type: 'text', text: 'Network is already running.' }] };
8
+ }
9
+ const services = await manager.getServices();
10
+ return {
11
+ content: [{
12
+ type: 'text',
13
+ text: JSON.stringify({
14
+ status: 'running',
15
+ services: services.map((s) => ({ name: s.name, url: s.url, port: s.port })),
16
+ config: manager.config,
17
+ }, null, 2),
18
+ }],
19
+ };
20
+ });
21
+ server.tool('stop-network', 'Stop the local Midnight development network and close all wallets.', { removeVolumes: z.boolean().optional().describe('Remove volumes (clean slate)') }, async ({ removeVolumes }) => {
22
+ await manager.stop({ removeVolumes: removeVolumes ?? false });
23
+ return { content: [{ type: 'text', text: 'Network stopped.' }] };
24
+ });
25
+ server.tool('restart-network', 'Restart the network. With removeVolumes, performs a clean-slate restart.', {
26
+ pull: z.boolean().optional().describe('Pull latest Docker images'),
27
+ removeVolumes: z.boolean().optional().describe('Remove volumes for clean restart'),
28
+ }, async ({ pull, removeVolumes }) => {
29
+ await manager.restart({
30
+ pull: pull ?? false,
31
+ removeVolumes: removeVolumes ?? false,
32
+ });
33
+ const services = await manager.getServices();
34
+ return {
35
+ content: [{
36
+ type: 'text',
37
+ text: JSON.stringify({
38
+ status: 'running',
39
+ services: services.map((s) => ({ name: s.name, url: s.url, port: s.port })),
40
+ }, null, 2),
41
+ }],
42
+ };
43
+ });
44
+ server.tool('network-status', 'Get current network status including per-service container status.', {}, async () => {
45
+ const status = manager.getStatus();
46
+ if (status === 'stopped') {
47
+ return {
48
+ content: [{ type: 'text', text: JSON.stringify({ status: 'stopped', services: [] }) }],
49
+ };
50
+ }
51
+ const services = await manager.getServices();
52
+ return {
53
+ content: [{ type: 'text', text: JSON.stringify({ status, services }, null, 2) }],
54
+ };
55
+ });
56
+ server.tool('network-logs', 'Get recent logs from network services.', {
57
+ service: z.enum(['node', 'indexer', 'proof-server']).optional().describe('Specific service'),
58
+ lines: z.number().optional().describe('Number of log lines (default: 50)'),
59
+ }, async ({ service, lines }) => {
60
+ const logs = await manager.getLogs({ service, lines });
61
+ return { content: [{ type: 'text', text: logs }] };
62
+ });
63
+ }
64
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/mcp/tools/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NetworkManager } from '../../core/network-manager.js';
3
+ export declare function registerWalletTools(server: McpServer, manager: NetworkManager): void;
@@ -0,0 +1,19 @@
1
+ import { getWalletBalances } from '../../core/wallet.js';
2
+ export function registerWalletTools(server, manager) {
3
+ server.tool('get-wallet-balances', 'Get current NIGHT and DUST balances of the genesis master wallet.', {}, async () => {
4
+ const wallet = await manager.ensureWallet();
5
+ const balances = await getWalletBalances(wallet);
6
+ return {
7
+ content: [{
8
+ type: 'text',
9
+ text: JSON.stringify({
10
+ unshielded: balances.unshielded.toString(),
11
+ shielded: balances.shielded.toString(),
12
+ dust: balances.dust.toString(),
13
+ total: balances.total.toString(),
14
+ }, null, 2),
15
+ }],
16
+ };
17
+ });
18
+ }
19
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../src/mcp/tools/wallet.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,OAAuB;IAC5E,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,mEAAmE,EACnE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE;wBAC1C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;wBACtC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;wBAC9B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;qBACjC,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ APP__INFRA__NODE__URL=ws://node:9944
2
+ APP__INFRA__STORAGE__PASSWORD=indexer
3
+ APP__INFRA__PUB_SUB__PASSWORD=indexer
4
+ APP__INFRA__LEDGER_STATE_STORAGE__PASSWORD=indexer
5
+ APP__INFRA__SECRET=303132333435363738393031323334353637383930313233343536373839303132