@manifest-network/manifest-mcp-node 0.11.0 → 0.12.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/agent.js.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/chain.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/cosmwasm.js.map +1 -1
- package/dist/fred.js.map +1 -1
- package/dist/keyfileWallet.d.ts.map +1 -1
- package/dist/keyfileWallet.js.map +1 -1
- package/dist/keygen.d.ts.map +1 -1
- package/dist/keygen.js.map +1 -1
- package/dist/lease.js.map +1 -1
- package/package.json +10 -10
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","names":[],"sources":["../src/agent.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { AgentMCPServer } from '@manifest-network/manifest-mcp-agent';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-agent',\n label: 'agent',\n createServer: (opts) => new AgentMCPServer(opts).getServer(),\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"agent.js","names":[],"sources":["../src/agent.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { AgentMCPServer } from '@manifest-network/manifest-mcp-agent';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-agent',\n label: 'agent',\n createServer: (opts) => new AgentMCPServer(opts).getServer(),\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS,IAAI,eAAe,IAAI,EAAE,UAAU;AAC7D,CAAC"}
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","names":[],"sources":["../src/bootstrap.ts"],"mappings":";;;;;;AA+BA;UAAiB,eAAA;;WAEN,OAAA;EAKC;EAAA,SAHD,KAAA;EAKH;EAAA,SAHG,YAAA,GAAe,IAAA;IACtB,MAAA,EAAQ,UAAA,QAAkB,qBAAA;IAC1B,cAAA,EAAgB,cAAA;EAAA,MACZ,MAAA;AAAA;;;;;;;iBA0DQ,SAAA,CAAU,
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","names":[],"sources":["../src/bootstrap.ts"],"mappings":";;;;;;AA+BA;UAAiB,eAAA;;WAEN,OAAA;EAKC;EAAA,SAHD,KAAA;EAKH;EAAA,SAHG,YAAA,GAAe,IAAA;IACtB,MAAA,EAAQ,UAAA,QAAkB,qBAAA;IAC1B,cAAA,EAAgB,cAAA;EAAA,MACZ,MAAA;AAAA;;;;;;;iBA0DQ,SAAA,CAAU,GAAoB,EAAf,eAAe"}
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","names":[],"sources":["../src/bootstrap.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport {\n createValidatedConfig,\n logger,\n ManifestMCPError,\n MnemonicWalletProvider,\n parseLogLevel,\n sanitizeForLogging,\n type WalletProvider,\n} from '@manifest-network/manifest-mcp-core';\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config.js';\nimport { KeyfileWalletProvider } from './keyfileWallet.js';\n\n/** Thrown after process.exit() to halt control flow when exit is mocked. */\nclass ExitError extends Error {\n constructor() {\n super();\n this.name = 'ExitError';\n }\n}\n\nfunction exit(code: number): never {\n process.exit(code);\n throw new ExitError();\n}\n\n/**\n * Configuration for bootstrapping a CLI entry point.\n */\nexport interface BootstrapConfig {\n /** CLI binary name shown in usage text (e.g. \"manifest-mcp-chain\") */\n readonly cliName: string;\n /** Human-readable server label for the startup log (e.g. \"chain\") */\n readonly label: string;\n /** Factory that creates the MCP server and returns its underlying Server */\n readonly createServer: (opts: {\n config: ReturnType<typeof createValidatedConfig>;\n walletProvider: WalletProvider;\n }) => Server;\n}\n\nfunction handleSubcommand(\n cliName: string,\n label: string,\n subcommand: string,\n): Promise<void> {\n if (subcommand === 'keygen') {\n return import('./keygen.js').then(({ runKeygen }) => runKeygen());\n }\n if (subcommand === 'import') {\n return import('./keygen.js').then(({ runImport }) => runImport());\n }\n\n console.error(\n `Unknown subcommand: \"${subcommand}\"\\n\\n` +\n 'Usage:\\n' +\n ` ${cliName} Start the ${label} MCP server\\n` +\n ` ${cliName} keygen Generate a new encrypted keyfile\\n` +\n ` ${cliName} import Import a mnemonic into an encrypted keyfile\\n`,\n );\n exit(1);\n}\n\nfunction resolveWallet(\n env: ReturnType<typeof loadConfig>,\n config: ReturnType<typeof createValidatedConfig>,\n cliName: string,\n): WalletProvider {\n if (existsSync(env.keyfilePath)) {\n console.error(`Using encrypted keyfile wallet from ${env.keyfilePath}`);\n return new KeyfileWalletProvider(\n env.keyfilePath,\n env.addressPrefix,\n env.keyPassword,\n );\n }\n\n if (env.mnemonic) {\n console.error('Using mnemonic wallet from COSMOS_MNEMONIC');\n return new MnemonicWalletProvider(config, env.mnemonic);\n }\n\n console.error(\n 'No wallet found. Either:\\n' +\n ` 1. Run \"${cliName} keygen\" to generate an encrypted keyfile at ${env.keyfilePath}\\n` +\n ' 2. Set the COSMOS_MNEMONIC environment variable',\n );\n exit(1);\n}\n\n/**\n * Shared bootstrap for all three CLI entry points (chain, lease, fred).\n *\n * Handles subcommand dispatch, config loading, wallet resolution,\n * transport setup, and top-level error handling.\n */\nexport function bootstrap(cfg: BootstrapConfig): void {\n async function main(): Promise<void> {\n logger.setLevel(parseLogLevel(process.env.LOG_LEVEL));\n\n const subcommand = process.argv[2];\n if (subcommand) {\n await handleSubcommand(cfg.cliName, cfg.label, subcommand);\n return;\n }\n\n const env = loadConfig();\n\n const config = createValidatedConfig({\n chainId: env.chainId,\n rpcUrl: env.rpcUrl,\n gasPrice: env.gasPrice,\n restUrl: env.restUrl,\n addressPrefix: env.addressPrefix,\n gasMultiplier: env.gasMultiplier,\n });\n\n const walletProvider = resolveWallet(env, config, cfg.cliName);\n\n if (walletProvider.connect) {\n await walletProvider.connect();\n }\n\n const server = cfg.createServer({ config, walletProvider });\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(`Manifest MCP ${cfg.label} server running on stdio`);\n }\n\n main().catch((error) => {\n if (error instanceof ExitError) return;\n if (error instanceof ManifestMCPError) {\n console.error(\n `Fatal error [${error.code}]: ${sanitizeForLogging(error.message) as string}`,\n );\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`Fatal error: ${sanitizeForLogging(msg) as string}`);\n }\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;AAgBA,IAAM,YAAN,cAAwB,MAAM;CAC5B,cAAc;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","names":[],"sources":["../src/bootstrap.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport {\n createValidatedConfig,\n logger,\n ManifestMCPError,\n MnemonicWalletProvider,\n parseLogLevel,\n sanitizeForLogging,\n type WalletProvider,\n} from '@manifest-network/manifest-mcp-core';\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadConfig } from './config.js';\nimport { KeyfileWalletProvider } from './keyfileWallet.js';\n\n/** Thrown after process.exit() to halt control flow when exit is mocked. */\nclass ExitError extends Error {\n constructor() {\n super();\n this.name = 'ExitError';\n }\n}\n\nfunction exit(code: number): never {\n process.exit(code);\n throw new ExitError();\n}\n\n/**\n * Configuration for bootstrapping a CLI entry point.\n */\nexport interface BootstrapConfig {\n /** CLI binary name shown in usage text (e.g. \"manifest-mcp-chain\") */\n readonly cliName: string;\n /** Human-readable server label for the startup log (e.g. \"chain\") */\n readonly label: string;\n /** Factory that creates the MCP server and returns its underlying Server */\n readonly createServer: (opts: {\n config: ReturnType<typeof createValidatedConfig>;\n walletProvider: WalletProvider;\n }) => Server;\n}\n\nfunction handleSubcommand(\n cliName: string,\n label: string,\n subcommand: string,\n): Promise<void> {\n if (subcommand === 'keygen') {\n return import('./keygen.js').then(({ runKeygen }) => runKeygen());\n }\n if (subcommand === 'import') {\n return import('./keygen.js').then(({ runImport }) => runImport());\n }\n\n console.error(\n `Unknown subcommand: \"${subcommand}\"\\n\\n` +\n 'Usage:\\n' +\n ` ${cliName} Start the ${label} MCP server\\n` +\n ` ${cliName} keygen Generate a new encrypted keyfile\\n` +\n ` ${cliName} import Import a mnemonic into an encrypted keyfile\\n`,\n );\n exit(1);\n}\n\nfunction resolveWallet(\n env: ReturnType<typeof loadConfig>,\n config: ReturnType<typeof createValidatedConfig>,\n cliName: string,\n): WalletProvider {\n if (existsSync(env.keyfilePath)) {\n console.error(`Using encrypted keyfile wallet from ${env.keyfilePath}`);\n return new KeyfileWalletProvider(\n env.keyfilePath,\n env.addressPrefix,\n env.keyPassword,\n );\n }\n\n if (env.mnemonic) {\n console.error('Using mnemonic wallet from COSMOS_MNEMONIC');\n return new MnemonicWalletProvider(config, env.mnemonic);\n }\n\n console.error(\n 'No wallet found. Either:\\n' +\n ` 1. Run \"${cliName} keygen\" to generate an encrypted keyfile at ${env.keyfilePath}\\n` +\n ' 2. Set the COSMOS_MNEMONIC environment variable',\n );\n exit(1);\n}\n\n/**\n * Shared bootstrap for all three CLI entry points (chain, lease, fred).\n *\n * Handles subcommand dispatch, config loading, wallet resolution,\n * transport setup, and top-level error handling.\n */\nexport function bootstrap(cfg: BootstrapConfig): void {\n async function main(): Promise<void> {\n logger.setLevel(parseLogLevel(process.env.LOG_LEVEL));\n\n const subcommand = process.argv[2];\n if (subcommand) {\n await handleSubcommand(cfg.cliName, cfg.label, subcommand);\n return;\n }\n\n const env = loadConfig();\n\n const config = createValidatedConfig({\n chainId: env.chainId,\n rpcUrl: env.rpcUrl,\n gasPrice: env.gasPrice,\n restUrl: env.restUrl,\n addressPrefix: env.addressPrefix,\n gasMultiplier: env.gasMultiplier,\n });\n\n const walletProvider = resolveWallet(env, config, cfg.cliName);\n\n if (walletProvider.connect) {\n await walletProvider.connect();\n }\n\n const server = cfg.createServer({ config, walletProvider });\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(`Manifest MCP ${cfg.label} server running on stdio`);\n }\n\n main().catch((error) => {\n if (error instanceof ExitError) return;\n if (error instanceof ManifestMCPError) {\n console.error(\n `Fatal error [${error.code}]: ${sanitizeForLogging(error.message) as string}`,\n );\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`Fatal error: ${sanitizeForLogging(msg) as string}`);\n }\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;AAgBA,IAAM,YAAN,cAAwB,MAAM;CAC5B,cAAc;EACZ,MAAM;EACN,KAAK,OAAO;CACd;AACF;AAEA,SAAS,KAAK,MAAqB;CACjC,QAAQ,KAAK,IAAI;CACjB,MAAM,IAAI,UAAU;AACtB;AAiBA,SAAS,iBACP,SACA,OACA,YACe;CACf,IAAI,eAAe,UACjB,OAAO,OAAO,eAAe,MAAM,EAAE,gBAAgB,UAAU,CAAC;CAElE,IAAI,eAAe,UACjB,OAAO,OAAO,eAAe,MAAM,EAAE,gBAAgB,UAAU,CAAC;CAGlE,QAAQ,MACN,wBAAwB,WAAW;IAE5B,QAAQ,0BAA0B,MAAM,iBACxC,QAAQ,oDACR,QAAQ,4DACjB;CACA,KAAK,CAAC;AACR;AAEA,SAAS,cACP,KACA,QACA,SACgB;CAChB,IAAI,WAAW,IAAI,WAAW,GAAG;EAC/B,QAAQ,MAAM,uCAAuC,IAAI,aAAa;EACtE,OAAO,IAAI,sBACT,IAAI,aACJ,IAAI,eACJ,IAAI,WACN;CACF;CAEA,IAAI,IAAI,UAAU;EAChB,QAAQ,MAAM,4CAA4C;EAC1D,OAAO,IAAI,uBAAuB,QAAQ,IAAI,QAAQ;CACxD;CAEA,QAAQ,MACN;YACe,QAAQ,+CAA+C,IAAI,YAAY,oDAExF;CACA,KAAK,CAAC;AACR;;;;;;;AAQA,SAAgB,UAAU,KAA4B;CACpD,eAAe,OAAsB;EACnC,OAAO,SAAS,cAAc,QAAQ,IAAI,SAAS,CAAC;EAEpD,MAAM,aAAa,QAAQ,KAAK;EAChC,IAAI,YAAY;GACd,MAAM,iBAAiB,IAAI,SAAS,IAAI,OAAO,UAAU;GACzD;EACF;EAEA,MAAM,MAAM,WAAW;EAEvB,MAAM,SAAS,sBAAsB;GACnC,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,UAAU,IAAI;GACd,SAAS,IAAI;GACb,eAAe,IAAI;GACnB,eAAe,IAAI;EACrB,CAAC;EAED,MAAM,iBAAiB,cAAc,KAAK,QAAQ,IAAI,OAAO;EAE7D,IAAI,eAAe,SACjB,MAAM,eAAe,QAAQ;EAG/B,MAAM,SAAS,IAAI,aAAa;GAAE;GAAQ;EAAe,CAAC;EAC1D,MAAM,YAAY,IAAI,qBAAqB;EAC3C,MAAM,OAAO,QAAQ,SAAS;EAE9B,QAAQ,MAAM,gBAAgB,IAAI,MAAM,yBAAyB;CACnE;CAEA,KAAK,EAAE,OAAO,UAAU;EACtB,IAAI,iBAAiB,WAAW;EAChC,IAAI,iBAAiB,kBACnB,QAAQ,MACN,gBAAgB,MAAM,KAAK,KAAK,mBAAmB,MAAM,OAAO,GAClE;OACK;GACL,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GACjE,QAAQ,MAAM,gBAAgB,mBAAmB,GAAG,GAAa;EACnE;EACA,QAAQ,KAAK,CAAC;CAChB,CAAC;AACH"}
|
package/dist/chain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain.js","names":[],"sources":["../src/chain.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { ChainMCPServer } from '@manifest-network/manifest-mcp-chain';\nimport { validateEndpointUrl } from '@manifest-network/manifest-mcp-core';\nimport { bootstrap } from './bootstrap.js';\n\nconst rawFaucetUrl = process.env.MANIFEST_FAUCET_URL?.trim() || undefined;\nlet faucetUrl: string | undefined;\nif (rawFaucetUrl) {\n const check = validateEndpointUrl(rawFaucetUrl, 'MANIFEST_FAUCET_URL');\n if (!check.valid) {\n console.error(`Invalid MANIFEST_FAUCET_URL: ${check.reason}`);\n process.exit(1);\n }\n faucetUrl = rawFaucetUrl;\n}\n\nbootstrap({\n cliName: 'manifest-mcp-chain',\n label: 'chain',\n createServer: (opts) =>\n new ChainMCPServer({\n ...opts,\n faucetUrl,\n }).getServer(),\n});\n"],"mappings":";;;;;AAKA,MAAM,eAAe,QAAQ,IAAI,qBAAqB,
|
|
1
|
+
{"version":3,"file":"chain.js","names":[],"sources":["../src/chain.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { ChainMCPServer } from '@manifest-network/manifest-mcp-chain';\nimport { validateEndpointUrl } from '@manifest-network/manifest-mcp-core';\nimport { bootstrap } from './bootstrap.js';\n\nconst rawFaucetUrl = process.env.MANIFEST_FAUCET_URL?.trim() || undefined;\nlet faucetUrl: string | undefined;\nif (rawFaucetUrl) {\n const check = validateEndpointUrl(rawFaucetUrl, 'MANIFEST_FAUCET_URL');\n if (!check.valid) {\n console.error(`Invalid MANIFEST_FAUCET_URL: ${check.reason}`);\n process.exit(1);\n }\n faucetUrl = rawFaucetUrl;\n}\n\nbootstrap({\n cliName: 'manifest-mcp-chain',\n label: 'chain',\n createServer: (opts) =>\n new ChainMCPServer({\n ...opts,\n faucetUrl,\n }).getServer(),\n});\n"],"mappings":";;;;;AAKA,MAAM,eAAe,QAAQ,IAAI,qBAAqB,KAAK,KAAK,KAAA;AAChE,IAAI;AACJ,IAAI,cAAc;CAChB,MAAM,QAAQ,oBAAoB,cAAc,qBAAqB;CACrE,IAAI,CAAC,MAAM,OAAO;EAChB,QAAQ,MAAM,gCAAgC,MAAM,QAAQ;EAC5D,QAAQ,KAAK,CAAC;CAChB;CACA,YAAY;AACd;AAEA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SACb,IAAI,eAAe;EACjB,GAAG;EACH;CACF,CAAC,EAAE,UAAU;AACjB,CAAC"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","names":[],"sources":["../src/config.ts"],"mappings":";UAMiB,aAAA;EAAA,SACN,OAAA;EAAA,SACA,MAAA;EAAA,SACA,QAAA;EAAA,SACA,OAAA;EAAA,SACA,aAAA;EAHA;EAAA,SAKA,aAAA;EAAA,SACA,QAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;AAAA;AAAA,iBA0BK,iBAAA,
|
|
1
|
+
{"version":3,"file":"config.d.ts","names":[],"sources":["../src/config.ts"],"mappings":";UAMiB,aAAA;EAAA,SACN,OAAA;EAAA,SACA,MAAA;EAAA,SACA,QAAA;EAAA,SACA,OAAA;EAAA,SACA,aAAA;EAHA;EAAA,SAKA,aAAA;EAAA,SACA,QAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;AAAA;AAAA,iBA0BK,iBAAA,IAAqB,IAAI,CACvC,aAAA;AAAA,iBAcc,UAAA,IAAc,aAAa"}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nexport interface NodeMCPConfig {\n readonly chainId: string;\n readonly rpcUrl?: string;\n readonly gasPrice?: string;\n readonly restUrl?: string;\n readonly addressPrefix: string;\n /** Gas simulation multiplier parsed from COSMOS_GAS_MULTIPLIER (minimum: 1). When undefined, a default of 1.5 is applied downstream by createConfig. */\n readonly gasMultiplier?: number;\n readonly mnemonic?: string;\n readonly keyfilePath: string;\n readonly keyPassword?: string;\n}\n\nfunction getEnvRequired(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(\n `Environment variable ${key} is not set. Please check your .env file or environment.`,\n );\n }\n return value;\n}\n\nfunction getEnvOptional(key: string, defaultValue: string): string {\n const value = process.env[key];\n if (value === undefined || value === '') return defaultValue;\n return value;\n}\n\nfunction resolvePath(p: string): string {\n if (p.startsWith('~/')) {\n return join(homedir(), p.slice(2));\n }\n return p;\n}\n\nexport function loadKeyfileConfig(): Pick<\n NodeMCPConfig,\n 'addressPrefix' | 'keyfilePath'\n> {\n return {\n addressPrefix: getEnvOptional('COSMOS_ADDRESS_PREFIX', 'manifest'),\n keyfilePath: resolvePath(\n getEnvOptional(\n 'MANIFEST_KEY_FILE',\n join(homedir(), '.manifest', 'key.json'),\n ),\n ),\n };\n}\n\nexport function loadConfig(): NodeMCPConfig {\n const rpcUrl = process.env.COSMOS_RPC_URL || undefined;\n const gasPrice = process.env.COSMOS_GAS_PRICE || undefined;\n const restUrl = process.env.COSMOS_REST_URL || undefined;\n const gasMultiplierRaw = process.env.COSMOS_GAS_MULTIPLIER;\n let gasMultiplier: number | undefined;\n if (gasMultiplierRaw !== undefined && gasMultiplierRaw !== '') {\n gasMultiplier = Number(gasMultiplierRaw);\n if (!Number.isFinite(gasMultiplier) || gasMultiplier < 1) {\n throw new Error(\n `COSMOS_GAS_MULTIPLIER must be a finite number >= 1, got \"${gasMultiplierRaw}\"`,\n );\n }\n }\n\n // At least one endpoint is required\n if (!rpcUrl && !restUrl) {\n throw new Error(\n 'At least one of COSMOS_RPC_URL or COSMOS_REST_URL must be set. ' +\n 'Set COSMOS_RPC_URL for full access (queries + transactions) or COSMOS_REST_URL for query-only mode.',\n );\n }\n\n if (rpcUrl && !gasPrice) {\n throw new Error(\n 'COSMOS_GAS_PRICE is required when COSMOS_RPC_URL is set (e.g., COSMOS_GAS_PRICE=\"0.025umfx\").',\n );\n }\n\n return {\n chainId: getEnvRequired('COSMOS_CHAIN_ID'),\n rpcUrl,\n gasPrice,\n restUrl,\n addressPrefix: getEnvOptional('COSMOS_ADDRESS_PREFIX', 'manifest'),\n mnemonic: process.env.COSMOS_MNEMONIC,\n keyfilePath: resolvePath(\n getEnvOptional(\n 'MANIFEST_KEY_FILE',\n join(homedir(), '.manifest', 'key.json'),\n ),\n ),\n gasMultiplier,\n keyPassword: process.env.MANIFEST_KEY_PASSWORD,\n };\n}\n"],"mappings":";;;;AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\nexport interface NodeMCPConfig {\n readonly chainId: string;\n readonly rpcUrl?: string;\n readonly gasPrice?: string;\n readonly restUrl?: string;\n readonly addressPrefix: string;\n /** Gas simulation multiplier parsed from COSMOS_GAS_MULTIPLIER (minimum: 1). When undefined, a default of 1.5 is applied downstream by createConfig. */\n readonly gasMultiplier?: number;\n readonly mnemonic?: string;\n readonly keyfilePath: string;\n readonly keyPassword?: string;\n}\n\nfunction getEnvRequired(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(\n `Environment variable ${key} is not set. Please check your .env file or environment.`,\n );\n }\n return value;\n}\n\nfunction getEnvOptional(key: string, defaultValue: string): string {\n const value = process.env[key];\n if (value === undefined || value === '') return defaultValue;\n return value;\n}\n\nfunction resolvePath(p: string): string {\n if (p.startsWith('~/')) {\n return join(homedir(), p.slice(2));\n }\n return p;\n}\n\nexport function loadKeyfileConfig(): Pick<\n NodeMCPConfig,\n 'addressPrefix' | 'keyfilePath'\n> {\n return {\n addressPrefix: getEnvOptional('COSMOS_ADDRESS_PREFIX', 'manifest'),\n keyfilePath: resolvePath(\n getEnvOptional(\n 'MANIFEST_KEY_FILE',\n join(homedir(), '.manifest', 'key.json'),\n ),\n ),\n };\n}\n\nexport function loadConfig(): NodeMCPConfig {\n const rpcUrl = process.env.COSMOS_RPC_URL || undefined;\n const gasPrice = process.env.COSMOS_GAS_PRICE || undefined;\n const restUrl = process.env.COSMOS_REST_URL || undefined;\n const gasMultiplierRaw = process.env.COSMOS_GAS_MULTIPLIER;\n let gasMultiplier: number | undefined;\n if (gasMultiplierRaw !== undefined && gasMultiplierRaw !== '') {\n gasMultiplier = Number(gasMultiplierRaw);\n if (!Number.isFinite(gasMultiplier) || gasMultiplier < 1) {\n throw new Error(\n `COSMOS_GAS_MULTIPLIER must be a finite number >= 1, got \"${gasMultiplierRaw}\"`,\n );\n }\n }\n\n // At least one endpoint is required\n if (!rpcUrl && !restUrl) {\n throw new Error(\n 'At least one of COSMOS_RPC_URL or COSMOS_REST_URL must be set. ' +\n 'Set COSMOS_RPC_URL for full access (queries + transactions) or COSMOS_REST_URL for query-only mode.',\n );\n }\n\n if (rpcUrl && !gasPrice) {\n throw new Error(\n 'COSMOS_GAS_PRICE is required when COSMOS_RPC_URL is set (e.g., COSMOS_GAS_PRICE=\"0.025umfx\").',\n );\n }\n\n return {\n chainId: getEnvRequired('COSMOS_CHAIN_ID'),\n rpcUrl,\n gasPrice,\n restUrl,\n addressPrefix: getEnvOptional('COSMOS_ADDRESS_PREFIX', 'manifest'),\n mnemonic: process.env.COSMOS_MNEMONIC,\n keyfilePath: resolvePath(\n getEnvOptional(\n 'MANIFEST_KEY_FILE',\n join(homedir(), '.manifest', 'key.json'),\n ),\n ),\n gasMultiplier,\n keyPassword: process.env.MANIFEST_KEY_PASSWORD,\n };\n}\n"],"mappings":";;;;AAIA,OAAO,OAAO;AAed,SAAS,eAAe,KAAqB;CAC3C,MAAM,QAAQ,QAAQ,IAAI;CAC1B,IAAI,CAAC,OACH,MAAM,IAAI,MACR,wBAAwB,IAAI,yDAC9B;CAEF,OAAO;AACT;AAEA,SAAS,eAAe,KAAa,cAA8B;CACjE,MAAM,QAAQ,QAAQ,IAAI;CAC1B,IAAI,UAAU,KAAA,KAAa,UAAU,IAAI,OAAO;CAChD,OAAO;AACT;AAEA,SAAS,YAAY,GAAmB;CACtC,IAAI,EAAE,WAAW,IAAI,GACnB,OAAO,KAAK,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;CAEnC,OAAO;AACT;AAEA,SAAgB,oBAGd;CACA,OAAO;EACL,eAAe,eAAe,yBAAyB,UAAU;EACjE,aAAa,YACX,eACE,qBACA,KAAK,QAAQ,GAAG,aAAa,UAAU,CACzC,CACF;CACF;AACF;AAEA,SAAgB,aAA4B;CAC1C,MAAM,SAAS,QAAQ,IAAI,kBAAkB,KAAA;CAC7C,MAAM,WAAW,QAAQ,IAAI,oBAAoB,KAAA;CACjD,MAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAA;CAC/C,MAAM,mBAAmB,QAAQ,IAAI;CACrC,IAAI;CACJ,IAAI,qBAAqB,KAAA,KAAa,qBAAqB,IAAI;EAC7D,gBAAgB,OAAO,gBAAgB;EACvC,IAAI,CAAC,OAAO,SAAS,aAAa,KAAK,gBAAgB,GACrD,MAAM,IAAI,MACR,4DAA4D,iBAAiB,EAC/E;CAEJ;CAGA,IAAI,CAAC,UAAU,CAAC,SACd,MAAM,IAAI,MACR,oKAEF;CAGF,IAAI,UAAU,CAAC,UACb,MAAM,IAAI,MACR,iGACF;CAGF,OAAO;EACL,SAAS,eAAe,iBAAiB;EACzC;EACA;EACA;EACA,eAAe,eAAe,yBAAyB,UAAU;EACjE,UAAU,QAAQ,IAAI;EACtB,aAAa,YACX,eACE,qBACA,KAAK,QAAQ,GAAG,aAAa,UAAU,CACzC,CACF;EACA;EACA,aAAa,QAAQ,IAAI;CAC3B;AACF"}
|
package/dist/cosmwasm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmwasm.js","names":[],"sources":["../src/cosmwasm.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { CosmwasmMCPServer } from '@manifest-network/manifest-mcp-cosmwasm';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-cosmwasm',\n label: 'cosmwasm',\n createServer: (opts) => {\n const converterAddress = process.env.MANIFEST_CONVERTER_ADDRESS?.trim();\n if (!converterAddress) {\n throw new Error(\n 'MANIFEST_CONVERTER_ADDRESS environment variable is required. ' +\n 'Set it to the bech32 address of the MFX-to-PWR converter contract.',\n );\n }\n return new CosmwasmMCPServer({ ...opts, converterAddress }).getServer();\n },\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS;EACtB,MAAM,mBAAmB,QAAQ,IAAI,4BAA4B,
|
|
1
|
+
{"version":3,"file":"cosmwasm.js","names":[],"sources":["../src/cosmwasm.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { CosmwasmMCPServer } from '@manifest-network/manifest-mcp-cosmwasm';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-cosmwasm',\n label: 'cosmwasm',\n createServer: (opts) => {\n const converterAddress = process.env.MANIFEST_CONVERTER_ADDRESS?.trim();\n if (!converterAddress) {\n throw new Error(\n 'MANIFEST_CONVERTER_ADDRESS environment variable is required. ' +\n 'Set it to the bech32 address of the MFX-to-PWR converter contract.',\n );\n }\n return new CosmwasmMCPServer({ ...opts, converterAddress }).getServer();\n },\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS;EACtB,MAAM,mBAAmB,QAAQ,IAAI,4BAA4B,KAAK;EACtE,IAAI,CAAC,kBACH,MAAM,IAAI,MACR,iIAEF;EAEF,OAAO,IAAI,kBAAkB;GAAE,GAAG;GAAM;EAAiB,CAAC,EAAE,UAAU;CACxE;AACF,CAAC"}
|
package/dist/fred.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fred.js","names":[],"sources":["../src/fred.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { FredMCPServer } from '@manifest-network/manifest-mcp-fred';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-fred',\n label: 'fred',\n createServer: (opts) => new FredMCPServer(opts).getServer(),\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS,IAAI,cAAc,
|
|
1
|
+
{"version":3,"file":"fred.js","names":[],"sources":["../src/fred.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { FredMCPServer } from '@manifest-network/manifest-mcp-fred';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-fred',\n label: 'fred',\n createServer: (opts) => new FredMCPServer(opts).getServer(),\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS,IAAI,cAAc,IAAI,EAAE,UAAU;AAC5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyfileWallet.d.ts","names":[],"sources":["../src/keyfileWallet.ts"],"mappings":";;;;cAgBa,qBAAA,YAAiC,cAAA;EAAA,QACpC,WAAA;EAAA,QACA,aAAA;EAAA,QACA,QAAA;EAAA,QACA,MAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;EAAA,QAGA,WAAA;cAEI,WAAA,UAAqB,aAAA,UAAuB,QAAA;EAMlD,OAAA,
|
|
1
|
+
{"version":3,"file":"keyfileWallet.d.ts","names":[],"sources":["../src/keyfileWallet.ts"],"mappings":";;;;cAgBa,qBAAA,YAAiC,cAAA;EAAA,QACpC,WAAA;EAAA,QACA,aAAA;EAAA,QACA,QAAA;EAAA,QACA,MAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;EAAA,QAGA,WAAA;cAEI,WAAA,UAAqB,aAAA,UAAuB,QAAA;EAMlD,OAAA,IAAW,OAAA;EAAA,QAcH,SAAA;EA4JR,UAAA,IAAc,OAAA;EAYd,SAAA,IAAa,OAAA,CAAQ,aAAA;EAYrB,UAAA,IAAc,OAAA;EASd,aAAA,CACJ,OAAA,UACA,IAAA,WACC,OAAA,CAAQ,mBAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyfileWallet.js","names":[],"sources":["../src/keyfileWallet.ts"],"sourcesContent":["import { readFileSync, statSync } from 'node:fs';\nimport { Secp256k1HdWallet } from '@cosmjs/amino';\nimport { fromBech32 } from '@cosmjs/encoding';\nimport {\n DirectSecp256k1HdWallet,\n type OfflineSigner,\n} from '@cosmjs/proto-signing';\nimport {\n logger,\n ManifestMCPError,\n ManifestMCPErrorCode,\n type SignArbitraryResult,\n signArbitraryWithAmino,\n type WalletProvider,\n} from '@manifest-network/manifest-mcp-core';\n\nexport class KeyfileWalletProvider implements WalletProvider {\n private keyfilePath: string;\n private addressPrefix: string;\n private password: string | undefined;\n private wallet: DirectSecp256k1HdWallet | null = null;\n private aminoWallet: Secp256k1HdWallet | null = null;\n private address: string | null = null;\n private disconnected = false;\n\n // Promise to prevent concurrent wallet initialization\n private initPromise: Promise<void> | null = null;\n\n constructor(keyfilePath: string, addressPrefix: string, password?: string) {\n this.keyfilePath = keyfilePath;\n this.addressPrefix = addressPrefix;\n this.password = password;\n }\n\n async connect(): Promise<void> {\n if (this.disconnected) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet has been disconnected. Create a new KeyfileWalletProvider instance to reconnect.',\n );\n }\n if (this.wallet) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this.doConnect();\n return this.initPromise;\n }\n\n private async doConnect(): Promise<void> {\n try {\n let raw: string;\n try {\n raw = readFileSync(this.keyfilePath, 'utf-8');\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile not found at ${this.keyfilePath}. Run \"<cli> keygen\" to generate one, or \"<cli> import\" to import an existing mnemonic (where <cli> is manifest-mcp-chain, manifest-mcp-lease, or manifest-mcp-fred). Check MANIFEST_KEY_FILE if the path is wrong.`,\n );\n }\n if (code === 'EACCES') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Permission denied reading keyfile at ${this.keyfilePath}. Check file permissions (expected mode 0600).`,\n );\n }\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to read keyfile at ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Warn if keyfile has overly permissive permissions\n try {\n const mode = statSync(this.keyfilePath).mode & 0o777;\n if (mode & 0o077) {\n logger.warn(\n `Keyfile ${this.keyfilePath} has permissions 0${mode.toString(8)}; recommended 0600. ` +\n `Other users on this system may be able to read your private key. ` +\n `Fix with: chmod 600 ${this.keyfilePath}`,\n );\n }\n } catch (err) {\n logger.debug(\n `Could not check keyfile permissions for ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile at ${this.keyfilePath} contains invalid JSON. The file may be corrupted. Regenerate with \"<cli> keygen\" or import an existing mnemonic with \"<cli> import\" (any manifest-mcp-* CLI).`,\n );\n }\n\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile at ${this.keyfilePath} does not contain a valid JSON object. Expected a CosmJS encrypted wallet or a JSON object with a \"mnemonic\" field.`,\n );\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.type !== undefined) {\n if (!this.password?.trim()) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n 'Keyfile is encrypted but no password provided. Set MANIFEST_KEY_PASSWORD to the password used when the keyfile was created.',\n );\n }\n try {\n this.wallet = await DirectSecp256k1HdWallet.deserialize(\n raw,\n this.password,\n );\n } catch (err: unknown) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to decrypt keyfile at ${this.keyfilePath}. Verify that MANIFEST_KEY_PASSWORD is correct. (${err instanceof Error ? err.message : String(err)})`,\n );\n }\n } else if (obj.mnemonic) {\n if (typeof obj.mnemonic !== 'string') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile at ${this.keyfilePath} has a \"mnemonic\" field that is not a string. Expected a BIP-39 mnemonic phrase.`,\n );\n }\n logger.warn(\n `Keyfile at ${this.keyfilePath} contains an unencrypted mnemonic. ` +\n 'Consider encrypting with \"<cli> import\" (any manifest-mcp-* CLI).',\n );\n try {\n this.wallet = await DirectSecp256k1HdWallet.fromMnemonic(\n obj.mnemonic,\n {\n prefix: this.addressPrefix,\n },\n );\n } catch (err: unknown) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.INVALID_MNEMONIC,\n `Invalid mnemonic in keyfile at ${this.keyfilePath}. The stored mnemonic may be corrupted. (${err instanceof Error ? err.message : String(err)})`,\n );\n }\n } else {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Unrecognized keyfile format in ${this.keyfilePath}. Expected a CosmJS encrypted wallet or a JSON object with a \"mnemonic\" field.`,\n );\n }\n\n try {\n this.aminoWallet = await Secp256k1HdWallet.fromMnemonic(\n this.wallet.mnemonic,\n {\n prefix: this.addressPrefix,\n },\n );\n } catch (err: unknown) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to initialize amino signing wallet from keyfile at ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const accounts = await this.wallet.getAccounts().catch((err: unknown) => {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to derive accounts from keyfile at ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n if (accounts.length === 0) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n 'No accounts derived from keyfile',\n );\n }\n this.address = accounts[0].address;\n const actualPrefix = fromBech32(this.address).prefix;\n if (actualPrefix !== this.addressPrefix) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile address prefix mismatch: keyfile produced \"${actualPrefix}\" but config expects \"${this.addressPrefix}\". Regenerate the keyfile with the correct COSMOS_ADDRESS_PREFIX.`,\n );\n }\n // Clear password from memory only after full initialization succeeds,\n // so that a retry after a partial failure can still use it.\n this.password = undefined;\n this.initPromise = null;\n } catch (error) {\n this.initPromise = null;\n this.wallet = null;\n this.aminoWallet = null;\n this.address = null;\n throw error;\n }\n }\n\n async getAddress(): Promise<string> {\n await this.connect();\n\n if (!this.address) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet failed to initialize',\n );\n }\n return this.address;\n }\n\n async getSigner(): Promise<OfflineSigner> {\n await this.connect();\n\n if (!this.wallet) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet failed to initialize',\n );\n }\n return this.wallet;\n }\n\n async disconnect(): Promise<void> {\n this.wallet = null;\n this.aminoWallet = null;\n this.address = null;\n this.password = undefined;\n this.disconnected = true;\n this.initPromise = null;\n }\n\n async signArbitrary(\n address: string,\n data: string,\n ): Promise<SignArbitraryResult> {\n await this.connect();\n\n if (!this.aminoWallet) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Amino wallet failed to initialize',\n );\n }\n\n if (!this.address) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet address not initialized',\n );\n }\n return signArbitraryWithAmino(\n this.aminoWallet,\n this.address,\n address,\n data,\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keyfileWallet.js","names":[],"sources":["../src/keyfileWallet.ts"],"sourcesContent":["import { readFileSync, statSync } from 'node:fs';\nimport { Secp256k1HdWallet } from '@cosmjs/amino';\nimport { fromBech32 } from '@cosmjs/encoding';\nimport {\n DirectSecp256k1HdWallet,\n type OfflineSigner,\n} from '@cosmjs/proto-signing';\nimport {\n logger,\n ManifestMCPError,\n ManifestMCPErrorCode,\n type SignArbitraryResult,\n signArbitraryWithAmino,\n type WalletProvider,\n} from '@manifest-network/manifest-mcp-core';\n\nexport class KeyfileWalletProvider implements WalletProvider {\n private keyfilePath: string;\n private addressPrefix: string;\n private password: string | undefined;\n private wallet: DirectSecp256k1HdWallet | null = null;\n private aminoWallet: Secp256k1HdWallet | null = null;\n private address: string | null = null;\n private disconnected = false;\n\n // Promise to prevent concurrent wallet initialization\n private initPromise: Promise<void> | null = null;\n\n constructor(keyfilePath: string, addressPrefix: string, password?: string) {\n this.keyfilePath = keyfilePath;\n this.addressPrefix = addressPrefix;\n this.password = password;\n }\n\n async connect(): Promise<void> {\n if (this.disconnected) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet has been disconnected. Create a new KeyfileWalletProvider instance to reconnect.',\n );\n }\n if (this.wallet) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this.doConnect();\n return this.initPromise;\n }\n\n private async doConnect(): Promise<void> {\n try {\n let raw: string;\n try {\n raw = readFileSync(this.keyfilePath, 'utf-8');\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile not found at ${this.keyfilePath}. Run \"<cli> keygen\" to generate one, or \"<cli> import\" to import an existing mnemonic (where <cli> is manifest-mcp-chain, manifest-mcp-lease, or manifest-mcp-fred). Check MANIFEST_KEY_FILE if the path is wrong.`,\n );\n }\n if (code === 'EACCES') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Permission denied reading keyfile at ${this.keyfilePath}. Check file permissions (expected mode 0600).`,\n );\n }\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to read keyfile at ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Warn if keyfile has overly permissive permissions\n try {\n const mode = statSync(this.keyfilePath).mode & 0o777;\n if (mode & 0o077) {\n logger.warn(\n `Keyfile ${this.keyfilePath} has permissions 0${mode.toString(8)}; recommended 0600. ` +\n `Other users on this system may be able to read your private key. ` +\n `Fix with: chmod 600 ${this.keyfilePath}`,\n );\n }\n } catch (err) {\n logger.debug(\n `Could not check keyfile permissions for ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile at ${this.keyfilePath} contains invalid JSON. The file may be corrupted. Regenerate with \"<cli> keygen\" or import an existing mnemonic with \"<cli> import\" (any manifest-mcp-* CLI).`,\n );\n }\n\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile at ${this.keyfilePath} does not contain a valid JSON object. Expected a CosmJS encrypted wallet or a JSON object with a \"mnemonic\" field.`,\n );\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.type !== undefined) {\n if (!this.password?.trim()) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n 'Keyfile is encrypted but no password provided. Set MANIFEST_KEY_PASSWORD to the password used when the keyfile was created.',\n );\n }\n try {\n this.wallet = await DirectSecp256k1HdWallet.deserialize(\n raw,\n this.password,\n );\n } catch (err: unknown) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to decrypt keyfile at ${this.keyfilePath}. Verify that MANIFEST_KEY_PASSWORD is correct. (${err instanceof Error ? err.message : String(err)})`,\n );\n }\n } else if (obj.mnemonic) {\n if (typeof obj.mnemonic !== 'string') {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile at ${this.keyfilePath} has a \"mnemonic\" field that is not a string. Expected a BIP-39 mnemonic phrase.`,\n );\n }\n logger.warn(\n `Keyfile at ${this.keyfilePath} contains an unencrypted mnemonic. ` +\n 'Consider encrypting with \"<cli> import\" (any manifest-mcp-* CLI).',\n );\n try {\n this.wallet = await DirectSecp256k1HdWallet.fromMnemonic(\n obj.mnemonic,\n {\n prefix: this.addressPrefix,\n },\n );\n } catch (err: unknown) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.INVALID_MNEMONIC,\n `Invalid mnemonic in keyfile at ${this.keyfilePath}. The stored mnemonic may be corrupted. (${err instanceof Error ? err.message : String(err)})`,\n );\n }\n } else {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Unrecognized keyfile format in ${this.keyfilePath}. Expected a CosmJS encrypted wallet or a JSON object with a \"mnemonic\" field.`,\n );\n }\n\n try {\n this.aminoWallet = await Secp256k1HdWallet.fromMnemonic(\n this.wallet.mnemonic,\n {\n prefix: this.addressPrefix,\n },\n );\n } catch (err: unknown) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to initialize amino signing wallet from keyfile at ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const accounts = await this.wallet.getAccounts().catch((err: unknown) => {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Failed to derive accounts from keyfile at ${this.keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n });\n if (accounts.length === 0) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n 'No accounts derived from keyfile',\n );\n }\n this.address = accounts[0].address;\n const actualPrefix = fromBech32(this.address).prefix;\n if (actualPrefix !== this.addressPrefix) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_CONNECTION_FAILED,\n `Keyfile address prefix mismatch: keyfile produced \"${actualPrefix}\" but config expects \"${this.addressPrefix}\". Regenerate the keyfile with the correct COSMOS_ADDRESS_PREFIX.`,\n );\n }\n // Clear password from memory only after full initialization succeeds,\n // so that a retry after a partial failure can still use it.\n this.password = undefined;\n this.initPromise = null;\n } catch (error) {\n this.initPromise = null;\n this.wallet = null;\n this.aminoWallet = null;\n this.address = null;\n throw error;\n }\n }\n\n async getAddress(): Promise<string> {\n await this.connect();\n\n if (!this.address) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet failed to initialize',\n );\n }\n return this.address;\n }\n\n async getSigner(): Promise<OfflineSigner> {\n await this.connect();\n\n if (!this.wallet) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet failed to initialize',\n );\n }\n return this.wallet;\n }\n\n async disconnect(): Promise<void> {\n this.wallet = null;\n this.aminoWallet = null;\n this.address = null;\n this.password = undefined;\n this.disconnected = true;\n this.initPromise = null;\n }\n\n async signArbitrary(\n address: string,\n data: string,\n ): Promise<SignArbitraryResult> {\n await this.connect();\n\n if (!this.aminoWallet) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Amino wallet failed to initialize',\n );\n }\n\n if (!this.address) {\n throw new ManifestMCPError(\n ManifestMCPErrorCode.WALLET_NOT_CONNECTED,\n 'Wallet address not initialized',\n );\n }\n return signArbitraryWithAmino(\n this.aminoWallet,\n this.address,\n address,\n data,\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/keygen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keygen.d.ts","names":[],"sources":["../src/keygen.ts"],"mappings":";iBAqHsB,SAAA,
|
|
1
|
+
{"version":3,"file":"keygen.d.ts","names":[],"sources":["../src/keygen.ts"],"mappings":";iBAqHsB,SAAA,IAAa,OAAO;AAAA,iBAiDpB,SAAA,IAAa,OAAO"}
|
package/dist/keygen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keygen.js","names":[],"sources":["../src/keygen.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing';\nimport { loadKeyfileConfig } from './config.js';\n\nfunction prompt(question: string): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new Error(\n 'Interactive terminal required for key management commands. Cannot prompt for input in non-interactive mode.',\n );\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n return new Promise((resolve, reject) => {\n let answered = false;\n rl.question(question, (answer) => {\n answered = true;\n rl.close();\n resolve(answer);\n });\n rl.on('close', () => {\n if (!answered) {\n reject(new Error('Input stream closed before response was received.'));\n }\n });\n });\n}\n\nfunction promptPassword(question: string): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new Error(\n 'Interactive terminal required for key management commands. Cannot prompt for input in non-interactive mode.',\n );\n }\n return new Promise((resolve, reject) => {\n let password = '';\n process.stderr.write(question);\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n const cleanup = (): void => {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', onData);\n process.stdin.removeListener('error', onError);\n process.stderr.write('\\n');\n };\n\n const onError = (err: Error): void => {\n cleanup();\n reject(new Error(`stdin error during password prompt: ${err.message}`));\n };\n\n const onData = (ch: string): void => {\n if (ch === '\\r' || ch === '\\n') {\n cleanup();\n resolve(password);\n } else if (ch === '\\u0004') {\n // Ctrl+D (EOF) — reject instead of resolving with partial input\n cleanup();\n reject(new Error('Input stream closed before password was entered.'));\n } else if (ch === '\\u0003') {\n cleanup();\n process.exit(130);\n } else if (ch === '\\u007f' || ch === '\\b') {\n if (password.length > 0) {\n password = [...password].slice(0, -1).join('');\n }\n } else if (ch >= ' ') {\n password += ch;\n }\n };\n\n process.stdin.on('data', onData);\n process.stdin.on('error', onError);\n });\n}\n\nasync function writeKeyfile(\n wallet: DirectSecp256k1HdWallet,\n keyfilePath: string,\n password: string,\n): Promise<void> {\n let serialized: string;\n try {\n serialized = await wallet.serialize(password);\n } catch (err: unknown) {\n throw new Error(\n `Failed to encrypt wallet: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n try {\n mkdirSync(dirname(keyfilePath), { recursive: true, mode: 0o700 });\n writeFileSync(keyfilePath, serialized, { mode: 0o600 });\n } catch (err: unknown) {\n throw new Error(\n `Failed to write keyfile to ${keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\nasync function confirmOverwrite(keyfilePath: string): Promise<void> {\n if (existsSync(keyfilePath)) {\n const answer = await prompt(\n `Keyfile already exists at ${keyfilePath}. Overwrite? (yes/no): `,\n );\n if (answer.toLowerCase() !== 'yes') {\n console.error('Aborted. Existing keyfile was not modified.');\n process.exit(0);\n }\n }\n}\n\nexport async function runKeygen(): Promise<void> {\n const config = loadKeyfileConfig();\n const prefix = config.addressPrefix;\n const keyfilePath = config.keyfilePath;\n\n await confirmOverwrite(keyfilePath);\n\n const password = await promptPassword(\n 'Enter password for keyfile encryption: ',\n );\n if (!password) {\n console.error('Error: password cannot be empty.');\n process.exit(1);\n }\n if (password.length < 8) {\n console.error('Error: password must be at least 8 characters.');\n process.exit(1);\n }\n const confirmPassword = await promptPassword('Confirm password: ');\n if (password !== confirmPassword) {\n console.error('Error: passwords do not match.');\n process.exit(1);\n }\n\n let wallet: DirectSecp256k1HdWallet;\n try {\n wallet = await DirectSecp256k1HdWallet.generate(24, { prefix });\n } catch (err: unknown) {\n console.error(\n `Failed to generate wallet: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(1);\n }\n\n await writeKeyfile(wallet, keyfilePath, password);\n console.error(`Keyfile written to ${keyfilePath}`);\n\n try {\n const accounts = await wallet.getAccounts();\n if (accounts.length > 0) {\n console.error(`Address: ${accounts[0].address}`);\n }\n } catch (err) {\n console.error(\n `Note: could not derive address for display (${err instanceof Error ? err.message : String(err)}), but the keyfile was written successfully.`,\n );\n }\n}\n\nexport async function runImport(): Promise<void> {\n const config = loadKeyfileConfig();\n const prefix = config.addressPrefix;\n const keyfilePath = config.keyfilePath;\n\n await confirmOverwrite(keyfilePath);\n\n const mnemonic = await promptPassword('Enter mnemonic (hidden): ');\n if (!mnemonic.trim()) {\n console.error('Error: mnemonic cannot be empty.');\n process.exit(1);\n }\n\n const password = await promptPassword(\n 'Enter password for keyfile encryption: ',\n );\n if (!password) {\n console.error('Error: password cannot be empty.');\n process.exit(1);\n }\n if (password.length < 8) {\n console.error('Error: password must be at least 8 characters.');\n process.exit(1);\n }\n const confirmPassword = await promptPassword('Confirm password: ');\n if (password !== confirmPassword) {\n console.error('Error: passwords do not match.');\n process.exit(1);\n }\n\n let wallet: DirectSecp256k1HdWallet;\n try {\n wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic.trim(), {\n prefix,\n });\n } catch (err: unknown) {\n console.error(\n `Invalid mnemonic: ${err instanceof Error ? err.message : String(err)}\\n` +\n 'Please verify your mnemonic phrase has the correct number of words (12, 15, 18, 21, or 24) ' +\n 'and all words are valid BIP-39 words.',\n );\n process.exit(1);\n }\n\n await writeKeyfile(wallet, keyfilePath, password);\n console.error(`Keyfile written to ${keyfilePath}`);\n\n try {\n const accounts = await wallet.getAccounts();\n if (accounts.length > 0) {\n console.error(`Address: ${accounts[0].address}`);\n }\n } catch (err) {\n console.error(\n `Note: could not derive address for display (${err instanceof Error ? err.message : String(err)}), but the keyfile was written successfully.`,\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keygen.js","names":[],"sources":["../src/keygen.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing';\nimport { loadKeyfileConfig } from './config.js';\n\nfunction prompt(question: string): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new Error(\n 'Interactive terminal required for key management commands. Cannot prompt for input in non-interactive mode.',\n );\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n return new Promise((resolve, reject) => {\n let answered = false;\n rl.question(question, (answer) => {\n answered = true;\n rl.close();\n resolve(answer);\n });\n rl.on('close', () => {\n if (!answered) {\n reject(new Error('Input stream closed before response was received.'));\n }\n });\n });\n}\n\nfunction promptPassword(question: string): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new Error(\n 'Interactive terminal required for key management commands. Cannot prompt for input in non-interactive mode.',\n );\n }\n return new Promise((resolve, reject) => {\n let password = '';\n process.stderr.write(question);\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n const cleanup = (): void => {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener('data', onData);\n process.stdin.removeListener('error', onError);\n process.stderr.write('\\n');\n };\n\n const onError = (err: Error): void => {\n cleanup();\n reject(new Error(`stdin error during password prompt: ${err.message}`));\n };\n\n const onData = (ch: string): void => {\n if (ch === '\\r' || ch === '\\n') {\n cleanup();\n resolve(password);\n } else if (ch === '\\u0004') {\n // Ctrl+D (EOF) — reject instead of resolving with partial input\n cleanup();\n reject(new Error('Input stream closed before password was entered.'));\n } else if (ch === '\\u0003') {\n cleanup();\n process.exit(130);\n } else if (ch === '\\u007f' || ch === '\\b') {\n if (password.length > 0) {\n password = [...password].slice(0, -1).join('');\n }\n } else if (ch >= ' ') {\n password += ch;\n }\n };\n\n process.stdin.on('data', onData);\n process.stdin.on('error', onError);\n });\n}\n\nasync function writeKeyfile(\n wallet: DirectSecp256k1HdWallet,\n keyfilePath: string,\n password: string,\n): Promise<void> {\n let serialized: string;\n try {\n serialized = await wallet.serialize(password);\n } catch (err: unknown) {\n throw new Error(\n `Failed to encrypt wallet: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n try {\n mkdirSync(dirname(keyfilePath), { recursive: true, mode: 0o700 });\n writeFileSync(keyfilePath, serialized, { mode: 0o600 });\n } catch (err: unknown) {\n throw new Error(\n `Failed to write keyfile to ${keyfilePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\nasync function confirmOverwrite(keyfilePath: string): Promise<void> {\n if (existsSync(keyfilePath)) {\n const answer = await prompt(\n `Keyfile already exists at ${keyfilePath}. Overwrite? (yes/no): `,\n );\n if (answer.toLowerCase() !== 'yes') {\n console.error('Aborted. Existing keyfile was not modified.');\n process.exit(0);\n }\n }\n}\n\nexport async function runKeygen(): Promise<void> {\n const config = loadKeyfileConfig();\n const prefix = config.addressPrefix;\n const keyfilePath = config.keyfilePath;\n\n await confirmOverwrite(keyfilePath);\n\n const password = await promptPassword(\n 'Enter password for keyfile encryption: ',\n );\n if (!password) {\n console.error('Error: password cannot be empty.');\n process.exit(1);\n }\n if (password.length < 8) {\n console.error('Error: password must be at least 8 characters.');\n process.exit(1);\n }\n const confirmPassword = await promptPassword('Confirm password: ');\n if (password !== confirmPassword) {\n console.error('Error: passwords do not match.');\n process.exit(1);\n }\n\n let wallet: DirectSecp256k1HdWallet;\n try {\n wallet = await DirectSecp256k1HdWallet.generate(24, { prefix });\n } catch (err: unknown) {\n console.error(\n `Failed to generate wallet: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exit(1);\n }\n\n await writeKeyfile(wallet, keyfilePath, password);\n console.error(`Keyfile written to ${keyfilePath}`);\n\n try {\n const accounts = await wallet.getAccounts();\n if (accounts.length > 0) {\n console.error(`Address: ${accounts[0].address}`);\n }\n } catch (err) {\n console.error(\n `Note: could not derive address for display (${err instanceof Error ? err.message : String(err)}), but the keyfile was written successfully.`,\n );\n }\n}\n\nexport async function runImport(): Promise<void> {\n const config = loadKeyfileConfig();\n const prefix = config.addressPrefix;\n const keyfilePath = config.keyfilePath;\n\n await confirmOverwrite(keyfilePath);\n\n const mnemonic = await promptPassword('Enter mnemonic (hidden): ');\n if (!mnemonic.trim()) {\n console.error('Error: mnemonic cannot be empty.');\n process.exit(1);\n }\n\n const password = await promptPassword(\n 'Enter password for keyfile encryption: ',\n );\n if (!password) {\n console.error('Error: password cannot be empty.');\n process.exit(1);\n }\n if (password.length < 8) {\n console.error('Error: password must be at least 8 characters.');\n process.exit(1);\n }\n const confirmPassword = await promptPassword('Confirm password: ');\n if (password !== confirmPassword) {\n console.error('Error: passwords do not match.');\n process.exit(1);\n }\n\n let wallet: DirectSecp256k1HdWallet;\n try {\n wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic.trim(), {\n prefix,\n });\n } catch (err: unknown) {\n console.error(\n `Invalid mnemonic: ${err instanceof Error ? err.message : String(err)}\\n` +\n 'Please verify your mnemonic phrase has the correct number of words (12, 15, 18, 21, or 24) ' +\n 'and all words are valid BIP-39 words.',\n );\n process.exit(1);\n }\n\n await writeKeyfile(wallet, keyfilePath, password);\n console.error(`Keyfile written to ${keyfilePath}`);\n\n try {\n const accounts = await wallet.getAccounts();\n if (accounts.length > 0) {\n console.error(`Address: ${accounts[0].address}`);\n }\n } catch (err) {\n console.error(\n `Note: could not derive address for display (${err instanceof Error ? err.message : String(err)}), but the keyfile was written successfully.`,\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/lease.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lease.js","names":[],"sources":["../src/lease.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { LeaseMCPServer } from '@manifest-network/manifest-mcp-lease';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-lease',\n label: 'lease',\n createServer: (opts) => new LeaseMCPServer(opts).getServer(),\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"lease.js","names":[],"sources":["../src/lease.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { LeaseMCPServer } from '@manifest-network/manifest-mcp-lease';\nimport { bootstrap } from './bootstrap.js';\n\nbootstrap({\n cliName: 'manifest-mcp-lease',\n label: 'lease',\n createServer: (opts) => new LeaseMCPServer(opts).getServer(),\n});\n"],"mappings":";;;;AAIA,UAAU;CACR,SAAS;CACT,OAAO;CACP,eAAe,SAAS,IAAI,eAAe,IAAI,EAAE,UAAU;AAC7D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifest-network/manifest-mcp-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Node.js MCP servers for Manifest Network with stdio transport and keyfile wallet",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -45,18 +45,18 @@
|
|
|
45
45
|
"@cosmjs/amino": "0.32.4",
|
|
46
46
|
"@cosmjs/encoding": "0.32.4",
|
|
47
47
|
"@cosmjs/proto-signing": "0.32.4",
|
|
48
|
-
"@manifest-network/manifest-mcp-agent": "^0.
|
|
49
|
-
"@manifest-network/manifest-mcp-core": "^0.
|
|
50
|
-
"@manifest-network/manifest-mcp-chain": "^0.
|
|
51
|
-
"@manifest-network/manifest-mcp-lease": "^0.
|
|
52
|
-
"@manifest-network/manifest-mcp-cosmwasm": "^0.
|
|
53
|
-
"@manifest-network/manifest-mcp-fred": "^0.
|
|
54
|
-
"@modelcontextprotocol/sdk": "1.
|
|
48
|
+
"@manifest-network/manifest-mcp-agent": "^0.12.0",
|
|
49
|
+
"@manifest-network/manifest-mcp-core": "^0.12.0",
|
|
50
|
+
"@manifest-network/manifest-mcp-chain": "^0.12.0",
|
|
51
|
+
"@manifest-network/manifest-mcp-lease": "^0.12.0",
|
|
52
|
+
"@manifest-network/manifest-mcp-cosmwasm": "^0.12.0",
|
|
53
|
+
"@manifest-network/manifest-mcp-fred": "^0.12.0",
|
|
54
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
55
55
|
"dotenv": "^17.2.3"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@types/node": "22.
|
|
58
|
+
"@types/node": "22.19.19",
|
|
59
59
|
"typescript": "5.9.3",
|
|
60
|
-
"vitest": "4.1.
|
|
60
|
+
"vitest": "4.1.8"
|
|
61
61
|
}
|
|
62
62
|
}
|