@kasarlabs/mist-cash-mcp 0.1.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Kasar Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Mist Cash MCP Server
2
+
3
+ MCP server for interacting with the Mist Cash protocol on Starknet.
4
+
5
+ ## Overview
6
+
7
+ This MCP server provides tools to interact with the Mist Cash protocol, enabling privacy-preserving transactions on Starknet.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @kasarlabs/mist-cash-mcp
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ### Configuration
18
+
19
+ Create a `.env` file with the following variables:
20
+
21
+ ```env
22
+ STARKNET_RPC_URL=your_rpc_url
23
+ ACCOUNT_ADDRESS=your_account_address
24
+ PRIVATE_KEY=your_private_key
25
+ # Add other Mist Cash specific configuration
26
+ ```
27
+
28
+ ### Running the Server
29
+
30
+ ```bash
31
+ npm run build
32
+ npm start
33
+ ```
34
+
35
+ ## Available Tools
36
+
37
+ ### `mist_cash_example`
38
+
39
+ Example tool for Mist Cash protocol interaction.
40
+
41
+ **Parameters:**
42
+
43
+ - Add your parameters here
44
+
45
+ **Returns:**
46
+
47
+ - Add return value description
48
+
49
+ ## Development
50
+
51
+ ### Build
52
+
53
+ ```bash
54
+ npm run build
55
+ ```
56
+
57
+ ### Clean
58
+
59
+ ```bash
60
+ npm run clean
61
+ ```
62
+
63
+ ### Clean All (including node_modules)
64
+
65
+ ```bash
66
+ npm run clean:all
67
+ ```
68
+
69
+ ## Implementation Guide
70
+
71
+ 1. Define your schemas in `src/schemas/index.ts`
72
+ 2. Implement your tools in `src/tools/`
73
+ 3. Register your tools in `src/index.ts`
74
+ 4. Add any interfaces in `src/interfaces/`
75
+ 5. Add helper functions in `src/lib/`
76
+
77
+ ## License
78
+
79
+ MIT
80
+
81
+ ## Contributing
82
+
83
+ Contributions are welcome! Please feel free to submit a Pull Request.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import('../build/index.js').catch(console.error);
@@ -0,0 +1,17 @@
1
+ import { Account, RpcProvider } from 'starknet';
2
+ import type { MistCashTokenSymbol } from '../schemas/index.js';
3
+ export interface TestContext {
4
+ onchainWrite: {
5
+ account: Account;
6
+ provider: RpcProvider;
7
+ };
8
+ onchainRead: {
9
+ provider: RpcProvider;
10
+ };
11
+ testAccount: Account;
12
+ testTokenSymbol: MistCashTokenSymbol;
13
+ testAmount: string;
14
+ testRecipientAddress: string;
15
+ }
16
+ export declare function setupTestContext(): TestContext | null;
17
+ export declare function skipIfNoCredentials(): boolean;
@@ -0,0 +1,44 @@
1
+ import { Account, RpcProvider } from 'starknet';
2
+ import * as dotenv from 'dotenv';
3
+ dotenv.config();
4
+ export function setupTestContext() {
5
+ const privateKey = process.env.STARKNET_PRIVATE_KEY;
6
+ const accountAddress = process.env.STARKNET_ACCOUNT_ADDRESS;
7
+ const rpcUrl = process.env.STARKNET_RPC_URL;
8
+ const testTokenSymbol = (process.env.TEST_TOKEN_SYMBOL ||
9
+ 'ETH');
10
+ const testAmount = process.env.TEST_AMOUNT || '0.0001';
11
+ const testRecipientAddress = process.env.TEST_RECIPIENT_ADDRESS;
12
+ if (!privateKey || !accountAddress || !rpcUrl || !testRecipientAddress) {
13
+ console.warn('Skipping integration tests: STARKNET_PRIVATE_KEY and STARKNET_ACCOUNT_ADDRESS and STARKNET_RPC_URL and TEST_RECIPIENT_ADDRESS must be set');
14
+ return null;
15
+ }
16
+ const provider = new RpcProvider({ nodeUrl: rpcUrl });
17
+ const testAccount = new Account({
18
+ provider: provider,
19
+ address: accountAddress,
20
+ signer: privateKey,
21
+ });
22
+ return {
23
+ onchainWrite: {
24
+ account: testAccount,
25
+ provider,
26
+ },
27
+ onchainRead: {
28
+ provider,
29
+ },
30
+ testAccount,
31
+ testTokenSymbol,
32
+ testAmount,
33
+ testRecipientAddress,
34
+ };
35
+ }
36
+ export function skipIfNoCredentials() {
37
+ if (!process.env.STARKNET_PRIVATE_KEY ||
38
+ !process.env.STARKNET_ACCOUNT_ADDRESS) {
39
+ console.log('⚠️ Skipping test - STARKNET_PRIVATE_KEY and STARKNET_ACCOUNT_ADDRESS not set');
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC,MAAM,CAAC,MAAM,EAAE,CAAC;AAkBhB,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACpD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC5C,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACpD,KAAK,CAAwB,CAAC;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,QAAQ,CAAC;IACvD,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAChE,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACvE,OAAO,CAAC,IAAI,CACV,2IAA2I,CAC5I,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAGtD,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC;QAC9B,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE;YACZ,OAAO,EAAE,WAAW;YACpB,QAAQ;SACT;QACD,WAAW,EAAE;YACX,QAAQ;SACT;QACD,WAAW;QACX,eAAe;QACf,UAAU;QACV,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB;QACjC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EACrC,CAAC;QACD,OAAO,CAAC,GAAG,CACT,+EAA+E,CAChF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare const RegisterToolInServer: () => Promise<void>;
package/build/index.js ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { registerToolsWithServer, getOnchainWrite, getOnchainRead, } from '@kasarlabs/ask-starknet-core';
5
+ import dotenv from 'dotenv';
6
+ import { depositToChamberSchema, getChamberInfoSchema, withdrawFromChamberSchema, } from './schemas/index.js';
7
+ import { depositToChamber } from './tools/deposit.js';
8
+ import { getChamberInfo } from './tools/getChamberInfo.js';
9
+ import { withdrawFromChamber } from './tools/withdraw.js';
10
+ dotenv.config();
11
+ const server = new McpServer({
12
+ name: 'starknet-mist-cash-mcp',
13
+ version: '0.1.0',
14
+ });
15
+ const registerTools = (MistCashToolRegistry) => {
16
+ MistCashToolRegistry.push({
17
+ name: 'mist_cash_deposit',
18
+ description: 'Deposit tokens into a Mist Cash chamber for private transactions. Generates a claiming key that can be used to withdraw the funds later.',
19
+ schema: depositToChamberSchema,
20
+ execute: async (params) => {
21
+ const onchainWrite = getOnchainWrite();
22
+ return await depositToChamber(onchainWrite, params);
23
+ },
24
+ });
25
+ MistCashToolRegistry.push({
26
+ name: 'mist_cash_get_chamber_info',
27
+ description: 'Get information about a chamber (deposited funds) using a claiming key and recipient address. Shows token, amount, and whether the transaction still exists in the merkle tree.',
28
+ schema: getChamberInfoSchema,
29
+ execute: async (params) => {
30
+ const onchainRead = getOnchainRead();
31
+ return await getChamberInfo(onchainRead, params);
32
+ },
33
+ });
34
+ MistCashToolRegistry.push({
35
+ name: 'mist_cash_withdraw',
36
+ description: 'Withdraw tokens from a Mist Cash chamber using the claiming key. The tokens will be sent to the recipient address specified during deposit.',
37
+ schema: withdrawFromChamberSchema,
38
+ execute: async (params) => {
39
+ const onchainWrite = getOnchainWrite();
40
+ return await withdrawFromChamber(onchainWrite, params);
41
+ },
42
+ });
43
+ };
44
+ export const RegisterToolInServer = async () => {
45
+ const tools = [];
46
+ registerTools(tools);
47
+ await registerToolsWithServer(server, tools);
48
+ };
49
+ async function main() {
50
+ const transport = new StdioServerTransport();
51
+ await RegisterToolInServer();
52
+ await server.connect(transport);
53
+ console.error('Starknet Mist Cash MCP Server running on stdio');
54
+ }
55
+ main().catch((error) => {
56
+ console.error('Fatal error in main():', error);
57
+ process.exit(1);
58
+ });
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAEL,uBAAuB,EACvB,eAAe,EACf,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,wBAAwB;IAC9B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,oBAA+B,EAAE,EAAE;IAExD,oBAAoB,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,0IAA0I;QAC5I,MAAM,EAAE,sBAAsB;QAC9B,OAAO,EAAE,KAAK,EAAE,MAAW,EAAE,EAAE;YAC7B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,OAAO,MAAM,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;KACF,CAAC,CAAC;IAGH,oBAAoB,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,4BAA4B;QAClC,WAAW,EACT,iLAAiL;QACnL,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,KAAK,EAAE,MAAW,EAAE,EAAE;YAC7B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,OAAO,MAAM,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;KACF,CAAC,CAAC;IAGH,oBAAoB,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,6IAA6I;QAC/I,MAAM,EAAE,yBAAyB;QACjC,OAAO,EAAE,KAAK,EAAE,MAAW,EAAE,EAAE;YAC7B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;YACvC,OAAO,MAAM,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAI,EAAE;IAC7C,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,oBAAoB,EAAE,CAAC;IAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;AAClE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ export declare const mistCashSupportedSymbols: z.ZodEnum<["ETH", "STRK", "USDC", "USDT", "WBTC", "SWSS"]>;
3
+ export type MistCashTokenSymbol = z.infer<typeof mistCashSupportedSymbols>;
4
+ export declare const depositToChamberSchema: z.ZodObject<{
5
+ symbol: z.ZodEnum<["ETH", "STRK", "USDC", "USDT", "WBTC", "SWSS"]>;
6
+ amount: z.ZodString;
7
+ claimingKey: z.ZodOptional<z.ZodString>;
8
+ recipientAddress: z.ZodString;
9
+ }, "strip", z.ZodTypeAny, {
10
+ symbol: "ETH" | "STRK" | "USDC" | "USDT" | "WBTC" | "SWSS";
11
+ amount: string;
12
+ recipientAddress: string;
13
+ claimingKey?: string | undefined;
14
+ }, {
15
+ symbol: "ETH" | "STRK" | "USDC" | "USDT" | "WBTC" | "SWSS";
16
+ amount: string;
17
+ recipientAddress: string;
18
+ claimingKey?: string | undefined;
19
+ }>;
20
+ export type DepositToChamberParams = z.infer<typeof depositToChamberSchema>;
21
+ export declare const getChamberInfoSchema: z.ZodObject<{
22
+ claimingKey: z.ZodString;
23
+ recipientAddress: z.ZodString;
24
+ }, "strip", z.ZodTypeAny, {
25
+ claimingKey: string;
26
+ recipientAddress: string;
27
+ }, {
28
+ claimingKey: string;
29
+ recipientAddress: string;
30
+ }>;
31
+ export type GetChamberInfoParams = z.infer<typeof getChamberInfoSchema>;
32
+ export declare const withdrawFromChamberSchema: z.ZodObject<{
33
+ claimingKey: z.ZodString;
34
+ recipientAddress: z.ZodString;
35
+ symbol: z.ZodEnum<["ETH", "STRK", "USDC", "USDT", "WBTC", "SWSS"]>;
36
+ amount: z.ZodString;
37
+ }, "strip", z.ZodTypeAny, {
38
+ symbol: "ETH" | "STRK" | "USDC" | "USDT" | "WBTC" | "SWSS";
39
+ amount: string;
40
+ claimingKey: string;
41
+ recipientAddress: string;
42
+ }, {
43
+ symbol: "ETH" | "STRK" | "USDC" | "USDT" | "WBTC" | "SWSS";
44
+ amount: string;
45
+ claimingKey: string;
46
+ recipientAddress: string;
47
+ }>;
48
+ export type WithdrawFromChamberParams = z.infer<typeof withdrawFromChamberSchema>;
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ export const mistCashSupportedSymbols = z.enum([
3
+ 'ETH',
4
+ 'STRK',
5
+ 'USDC',
6
+ 'USDT',
7
+ 'WBTC',
8
+ 'SWSS',
9
+ ]);
10
+ export const depositToChamberSchema = z.object({
11
+ symbol: mistCashSupportedSymbols.describe('The token symbol to deposit (e.g., ETH, USDC, STRK)'),
12
+ amount: z
13
+ .string()
14
+ .describe('The amount to deposit in standard units (e.g., "1" for 1 USDC, "0.5" for 0.5 ETH)'),
15
+ claimingKey: z
16
+ .string()
17
+ .optional()
18
+ .describe('Optional claiming key. If not provided, a random one will be generated'),
19
+ recipientAddress: z
20
+ .string()
21
+ .describe('The address that will be able to withdraw the funds'),
22
+ });
23
+ export const getChamberInfoSchema = z.object({
24
+ claimingKey: z.string().describe('The claiming key used during deposit'),
25
+ recipientAddress: z
26
+ .string()
27
+ .describe('The recipient address that can withdraw'),
28
+ });
29
+ export const withdrawFromChamberSchema = z.object({
30
+ claimingKey: z.string().describe('The claiming key used during deposit'),
31
+ recipientAddress: z
32
+ .string()
33
+ .describe('The recipient address that will receive the funds'),
34
+ symbol: mistCashSupportedSymbols.describe('The token symbol to withdraw (e.g., ETH, USDC, STRK)'),
35
+ amount: z
36
+ .string()
37
+ .describe('The amount to withdraw in standard units (e.g., "1" for 1 USDC, "0.5" for 0.5 ETH)'),
38
+ });
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC7C,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CACvC,qDAAqD,CACtD;IACD,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CACP,mFAAmF,CACpF;IACH,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,wEAAwE,CACzE;IACH,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,CAAC,qDAAqD,CAAC;CACnE,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACxE,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,CAAC,yCAAyC,CAAC;CACvD,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACxE,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,CAAC,mDAAmD,CAAC;IAChE,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CACvC,sDAAsD,CACvD;IACD,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CACP,oFAAoF,CACrF;CACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DepositToChamberParams } from '../schemas/index.js';
2
+ import { onchainWrite, toolResult } from '@kasarlabs/ask-starknet-core';
3
+ export declare function depositToChamber(onchainWrite: onchainWrite, params: DepositToChamberParams): Promise<toolResult>;
@@ -0,0 +1,93 @@
1
+ import { getChamber } from '@mistcash/sdk';
2
+ import { txSecret } from '@mistcash/crypto';
3
+ import { Contract } from 'starknet';
4
+ import { starknetTokenAddresses, getStarknetTokenAbi, } from '@kasarlabs/ask-starknet-core';
5
+ import { randomBytes } from 'crypto';
6
+ function generateUint256ClaimingKey() {
7
+ const randomKey = randomBytes(32);
8
+ return '0x' + randomKey.toString('hex');
9
+ }
10
+ function normalizeClaimingKey(key) {
11
+ if (key.startsWith('0x') && key.length > 66) {
12
+ console.error(`Warning: Claiming key too long (${key.length} chars), truncating to 64 hex digits`);
13
+ return '0x' + key.slice(2, 66);
14
+ }
15
+ return key;
16
+ }
17
+ export async function depositToChamber(onchainWrite, params) {
18
+ try {
19
+ const { symbol, amount, recipientAddress } = params;
20
+ let { claimingKey } = params;
21
+ const tokenAddress = starknetTokenAddresses[symbol];
22
+ if (!tokenAddress) {
23
+ throw new Error(`Token address not found for symbol: ${symbol}. Supported tokens: ETH, STRK, USDC, USDT, WBTC, SWSS`);
24
+ }
25
+ console.error(`Using token ${symbol} at address: ${tokenAddress}`);
26
+ if (!claimingKey) {
27
+ claimingKey = generateUint256ClaimingKey();
28
+ console.error(`Generated UINT256-compliant claiming key: ${claimingKey}`);
29
+ }
30
+ else {
31
+ claimingKey = normalizeClaimingKey(claimingKey);
32
+ }
33
+ const { account } = onchainWrite;
34
+ const chamberContract = getChamber(account);
35
+ const tokenAbi = getStarknetTokenAbi(symbol);
36
+ const tokenContract = new Contract({
37
+ abi: tokenAbi,
38
+ address: tokenAddress,
39
+ providerOrAccount: account,
40
+ });
41
+ let decimals;
42
+ try {
43
+ const decimalsResult = await tokenContract.decimals();
44
+ decimals = Number(decimalsResult);
45
+ console.error(`Fetched decimals for token: ${decimals}`);
46
+ }
47
+ catch (e) {
48
+ throw new Error(`Failed to fetch decimals from token contract at ${tokenAddress}. ` +
49
+ `The token contract must implement the decimals() function. Error: ${e instanceof Error ? e.message : String(e)}`);
50
+ }
51
+ const amountInWei = BigInt(Math.floor(parseFloat(amount) * Math.pow(10, decimals)));
52
+ console.error(`Converting ${amount} tokens to ${amountInWei.toString()} wei (${decimals} decimals)`);
53
+ const secret = await txSecret(claimingKey, recipientAddress);
54
+ console.error(`Transaction secret calculated: ${secret.toString()}`);
55
+ console.error(`Approving ${amountInWei.toString()} wei for chamber contract...`);
56
+ const chamberAddress = chamberContract.address;
57
+ const approveTx = await tokenContract.approve(chamberAddress, amountInWei);
58
+ await account.waitForTransaction(approveTx.transaction_hash);
59
+ console.error(`Approval transaction confirmed: ${approveTx.transaction_hash}`);
60
+ console.error(`Depositing ${amountInWei.toString()} wei into chamber...`);
61
+ const depositTx = await chamberContract.deposit(secret, {
62
+ amount: amountInWei,
63
+ addr: tokenAddress,
64
+ });
65
+ await account.waitForTransaction(depositTx.transaction_hash);
66
+ console.error(`Deposit transaction confirmed: ${depositTx.transaction_hash}`);
67
+ return {
68
+ status: 'success',
69
+ data: [
70
+ JSON.stringify({
71
+ success: true,
72
+ message: 'Successfully deposited into chamber',
73
+ data: {
74
+ claimingKey,
75
+ recipientAddress,
76
+ symbol,
77
+ tokenAddress,
78
+ amount: amount,
79
+ amountInWei: amountInWei.toString(),
80
+ decimals: decimals,
81
+ transactionHash: depositTx.transaction_hash,
82
+ secret: secret.toString(),
83
+ },
84
+ }, null, 2),
85
+ ],
86
+ };
87
+ }
88
+ catch (error) {
89
+ console.error('Error in depositToChamber:', error);
90
+ throw new Error(`Deposit to chamber failed: ${error.message}`);
91
+ }
92
+ }
93
+ //# sourceMappingURL=deposit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deposit.js","sourceRoot":"","sources":["../../src/tools/deposit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { GetChamberInfoParams } from '../schemas/index.js';
2
+ import { onchainRead, toolResult } from '@kasarlabs/ask-starknet-core';
3
+ export declare function getChamberInfo(onchainRead: onchainRead, params: GetChamberInfoParams): Promise<toolResult>;
@@ -0,0 +1,84 @@
1
+ import { getChamber, fetchTxAssets, checkTxExists, fmtAmount, } from '@mistcash/sdk';
2
+ import { Contract } from 'starknet';
3
+ import { ERC20_ABI } from '@mistcash/config';
4
+ export async function getChamberInfo(onchainRead, params) {
5
+ try {
6
+ let { claimingKey, recipientAddress } = params;
7
+ if (claimingKey.startsWith('0x') && claimingKey.length > 66) {
8
+ console.error(`Warning: Claiming key too long (${claimingKey.length} chars), truncating to 64 hex digits`);
9
+ claimingKey = '0x' + claimingKey.slice(2, 66);
10
+ }
11
+ const { provider } = onchainRead;
12
+ const chamberContract = getChamber(provider);
13
+ console.error(`Fetching chamber info for claiming key: ${claimingKey.substring(0, 10)}...`);
14
+ const asset = await fetchTxAssets(chamberContract, claimingKey, recipientAddress);
15
+ if (!asset || !asset.addr || asset.amount === 0n) {
16
+ return {
17
+ status: 'success',
18
+ data: [
19
+ JSON.stringify({
20
+ success: false,
21
+ message: 'No chamber found for the provided claiming key and recipient',
22
+ data: {
23
+ claimingKey,
24
+ recipientAddress,
25
+ found: false,
26
+ },
27
+ }, null, 2),
28
+ ],
29
+ };
30
+ }
31
+ const tokenContract = new Contract({
32
+ abi: ERC20_ABI,
33
+ address: asset.addr,
34
+ providerOrAccount: provider,
35
+ });
36
+ let tokenName = 'Unknown';
37
+ let tokenSymbol = 'UNKNOWN';
38
+ let decimals = 18;
39
+ try {
40
+ const [name, symbol, dec] = await Promise.all([
41
+ tokenContract.name().catch(() => 'Unknown'),
42
+ tokenContract.symbol().catch(() => 'UNKNOWN'),
43
+ tokenContract.decimals().catch(() => 18),
44
+ ]);
45
+ tokenName = name;
46
+ tokenSymbol = symbol;
47
+ decimals = typeof dec === 'bigint' ? Number(dec) : Number(dec);
48
+ }
49
+ catch (e) {
50
+ console.error('Could not fetch token details');
51
+ }
52
+ const txExists = await checkTxExists(chamberContract, claimingKey, recipientAddress, asset.addr, asset.amount.toString());
53
+ const formattedAmount = fmtAmount(asset.amount, decimals);
54
+ return {
55
+ status: 'success',
56
+ data: [
57
+ JSON.stringify({
58
+ success: true,
59
+ message: 'Chamber info retrieved successfully',
60
+ data: {
61
+ found: true,
62
+ exists: txExists,
63
+ claimingKey,
64
+ recipientAddress,
65
+ tokenAddress: asset.addr,
66
+ tokenName,
67
+ tokenSymbol,
68
+ amount: asset.amount.toString(),
69
+ formattedAmount,
70
+ decimals,
71
+ warning: txExists
72
+ ? 'Transaction exists in merkle tree (can be withdrawn)'
73
+ : 'Transaction NOT found in merkle tree (may have been withdrawn already)',
74
+ },
75
+ }, null, 2),
76
+ ],
77
+ };
78
+ }
79
+ catch (error) {
80
+ console.error('Error in getChamberInfo:', error);
81
+ throw new Error(`Get chamber info failed: ${error.message}`);
82
+ }
83
+ }
84
+ //# sourceMappingURL=getChamberInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getChamberInfo.js","sourceRoot":"","sources":["../../src/tools/getChamberInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { WithdrawFromChamberParams } from '../schemas/index.js';
2
+ import { onchainWrite, toolResult } from '@kasarlabs/ask-starknet-core';
3
+ export declare function withdrawFromChamber(onchainWrite: onchainWrite, params: WithdrawFromChamberParams): Promise<toolResult>;
@@ -0,0 +1,94 @@
1
+ import { getChamber, getTxIndexInTree, fmtAmount } from '@mistcash/sdk';
2
+ import { calculateMerkleRootAndProof, txHash, } from '@mistcash/crypto';
3
+ import { Contract } from 'starknet';
4
+ import { ERC20_ABI } from '@mistcash/config';
5
+ import { starknetTokenAddresses, } from '@kasarlabs/ask-starknet-core';
6
+ export async function withdrawFromChamber(onchainWrite, params) {
7
+ try {
8
+ const { claimingKey, recipientAddress, symbol, amount } = params;
9
+ const tokenAddress = starknetTokenAddresses[symbol];
10
+ if (!tokenAddress) {
11
+ throw new Error(`Token symbol ${symbol} is not supported`);
12
+ }
13
+ console.error(`Using token ${symbol} at address: ${tokenAddress}`);
14
+ const { account } = onchainWrite;
15
+ const chamberContract = getChamber(account);
16
+ const tokenContract = new Contract({
17
+ abi: ERC20_ABI,
18
+ address: tokenAddress,
19
+ providerOrAccount: account,
20
+ });
21
+ let decimals;
22
+ try {
23
+ const decimalsResult = await tokenContract.decimals();
24
+ decimals = Number(decimalsResult);
25
+ console.error(`Fetched decimals for token: ${decimals}`);
26
+ }
27
+ catch (e) {
28
+ throw new Error(`Failed to fetch decimals from token contract at ${tokenAddress}. ` +
29
+ `The token contract must implement the decimals() function. Error: ${e instanceof Error ? e.message : String(e)}`);
30
+ }
31
+ const amountInWei = BigInt(Math.floor(parseFloat(amount) * Math.pow(10, decimals)));
32
+ console.error(`Converting ${amount} tokens to ${amountInWei.toString()} wei (${decimals} decimals)`);
33
+ console.error('Fetching transaction tree and merkle root...');
34
+ const tx_hash = await txHash(claimingKey, recipientAddress, tokenAddress, amountInWei.toString());
35
+ console.error('Transaction Hash:', tx_hash.toString());
36
+ const allTransactions = (await chamberContract.tx_array());
37
+ const txIndex = await getTxIndexInTree(allTransactions, claimingKey, recipientAddress, tokenAddress, amountInWei.toString());
38
+ if (txIndex === -1) {
39
+ throw new Error('Transaction not found in merkle tree');
40
+ }
41
+ console.error('Transaction Index in Tree:', txIndex);
42
+ console.error('Total transactions in chamber:', allTransactions.length);
43
+ const merkleProofWRoot = calculateMerkleRootAndProof(allTransactions, txIndex);
44
+ console.error('Calculating Merkle Proof...');
45
+ const merkleProof = merkleProofWRoot
46
+ .slice(0, merkleProofWRoot.length - 1)
47
+ .map((bi) => {
48
+ if (bi) {
49
+ return bi.toString();
50
+ }
51
+ return '0';
52
+ });
53
+ const formattedMerkleProof = [
54
+ ...merkleProof,
55
+ ...new Array(20 - merkleProof.length).fill('0'),
56
+ ];
57
+ if (!formattedMerkleProof || formattedMerkleProof.length === 0) {
58
+ throw new Error('Merkle proof could not be generated');
59
+ }
60
+ console.error('Merkle Proof:', formattedMerkleProof);
61
+ const formattedAmount = fmtAmount(amountInWei, decimals);
62
+ const withdrawTx = await chamberContract.withdraw_no_zk(BigInt(claimingKey), params.recipientAddress, {
63
+ amount: amountInWei,
64
+ addr: tokenAddress,
65
+ }, formattedMerkleProof);
66
+ await account.waitForTransaction(withdrawTx.transaction_hash);
67
+ console.error(`Withdraw transaction confirmed: ${withdrawTx.transaction_hash}`);
68
+ return {
69
+ status: 'success',
70
+ data: [
71
+ JSON.stringify({
72
+ success: true,
73
+ message: 'Successfully withdrawn from chamber',
74
+ data: {
75
+ recipientAddress,
76
+ symbol,
77
+ tokenAddress,
78
+ amount: amount,
79
+ amountInWei: amountInWei.toString(),
80
+ formattedAmount,
81
+ decimals: decimals,
82
+ transactionHash: withdrawTx.transaction_hash,
83
+ merkleProofLength: merkleProof.length,
84
+ },
85
+ }, null, 2),
86
+ ],
87
+ };
88
+ }
89
+ catch (error) {
90
+ console.error('Error in withdrawFromChamber:', error);
91
+ throw new Error(`Withdraw from chamber failed: ${error.message}`);
92
+ }
93
+ }
94
+ //# sourceMappingURL=withdraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.js","sourceRoot":"","sources":["../../src/tools/withdraw.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@kasarlabs/mist-cash-mcp",
3
+ "version": "0.1.1",
4
+ "main": "index.js",
5
+ "type": "module",
6
+ "bin": {
7
+ "mist-cash-mcp": "./bin/mist-cash-mcp.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc && chmod 755 build/index.js",
11
+ "clean": "rm -rf build",
12
+ "clean:all": "rm -rf build node_modules",
13
+ "start": "node build/index.js",
14
+ "test": "jest",
15
+ "test:watch": "jest --watch",
16
+ "test:coverage": "jest --coverage"
17
+ },
18
+ "files": [
19
+ "build"
20
+ ],
21
+ "dependencies": {
22
+ "@jest/globals": "^30.2.0",
23
+ "@kasarlabs/ask-starknet-core": "0.1.4",
24
+ "@langchain/core": "^0.3.42",
25
+ "@mistcash/config": "^0.2.2",
26
+ "@mistcash/crypto": "^0.2.2",
27
+ "@mistcash/sdk": "^0.2.2",
28
+ "@modelcontextprotocol/sdk": "^1.11.2",
29
+ "dotenv": "^16.4.7",
30
+ "starknet": "~8.9.0",
31
+ "winston": "^3.17.0",
32
+ "zod": "^3.24.2"
33
+ },
34
+ "devDependencies": {
35
+ "@types/jest": "^29.5.12",
36
+ "@types/node": "^22.13.10",
37
+ "jest": "^29.7.0",
38
+ "ts-jest": "^29.1.2",
39
+ "typescript": "^5.8.2"
40
+ },
41
+ "keywords": [
42
+ "mcp",
43
+ "starknet",
44
+ "mist-cash"
45
+ ],
46
+ "author": "kasarlabs",
47
+ "license": "MIT",
48
+ "description": "MCP server for interacting with the Mist Cash protocol on Starknet",
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "gitHead": "0799e2b085e950e5d102822d71a6b122290e8c38"
53
+ }