@manifest-network/manifest-mcp-node 0.3.3 → 0.3.5

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/bootstrap.js CHANGED
@@ -54,7 +54,8 @@ function bootstrap(cfg) {
54
54
  rpcUrl: env.rpcUrl,
55
55
  gasPrice: env.gasPrice,
56
56
  restUrl: env.restUrl,
57
- addressPrefix: env.addressPrefix
57
+ addressPrefix: env.addressPrefix,
58
+ gasMultiplier: env.gasMultiplier
58
59
  });
59
60
  const walletProvider = resolveWallet(env, config, cfg.cliName);
60
61
  if (walletProvider.connect) await walletProvider.connect();
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","names":[],"sources":["../src/bootstrap.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport {\n createValidatedConfig,\n ManifestMCPError,\n MnemonicWalletProvider,\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 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 });\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":";;;;;;;AAcA,IAAM,YAAN,cAAwB,MAAM;CAC5B,cAAc;AACZ,SAAO;AACP,OAAK,OAAO;;;AAIhB,SAAS,KAAK,MAAqB;AACjC,SAAQ,KAAK,KAAK;AAClB,OAAM,IAAI,WAAW;;AAkBvB,SAAS,iBACP,SACA,OACA,YACe;AACf,KAAI,eAAe,SACjB,QAAO,OAAO,eAAe,MAAM,EAAE,gBAAgB,WAAW,CAAC;AAEnE,KAAI,eAAe,SACjB,QAAO,OAAO,eAAe,MAAM,EAAE,gBAAgB,WAAW,CAAC;AAGnE,SAAQ,MACN,wBAAwB,WAAW;IAE5B,QAAQ,0BAA0B,MAAM,iBACxC,QAAQ,oDACR,QAAQ,6DAChB;AACD,MAAK,EAAE;;AAGT,SAAS,cACP,KACA,QACA,SACgB;AAChB,KAAI,WAAW,IAAI,YAAY,EAAE;AAC/B,UAAQ,MAAM,uCAAuC,IAAI,cAAc;AACvE,SAAO,IAAI,sBACT,IAAI,aACJ,IAAI,eACJ,IAAI,YACL;;AAGH,KAAI,IAAI,UAAU;AAChB,UAAQ,MAAM,6CAA6C;AAC3D,SAAO,IAAI,uBAAuB,QAAQ,IAAI,SAAS;;AAGzD,SAAQ,MACN;YACe,QAAQ,+CAA+C,IAAI,YAAY,qDAEvF;AACD,MAAK,EAAE;;;;;;;;AAST,SAAgB,UAAU,KAA4B;CACpD,eAAe,OAAsB;EACnC,MAAM,aAAa,QAAQ,KAAK;AAChC,MAAI,YAAY;AACd,SAAM,iBAAiB,IAAI,SAAS,IAAI,OAAO,WAAW;AAC1D;;EAGF,MAAM,MAAM,YAAY;EAExB,MAAM,SAAS,sBAAsB;GACnC,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,UAAU,IAAI;GACd,SAAS,IAAI;GACb,eAAe,IAAI;GACpB,CAAC;EAEF,MAAM,iBAAiB,cAAc,KAAK,QAAQ,IAAI,QAAQ;AAE9D,MAAI,eAAe,QACjB,OAAM,eAAe,SAAS;EAGhC,MAAM,SAAS,IAAI,aAAa;GAAE;GAAQ;GAAgB,CAAC;EAC3D,MAAM,YAAY,IAAI,sBAAsB;AAC5C,QAAM,OAAO,QAAQ,UAAU;AAE/B,UAAQ,MAAM,gBAAgB,IAAI,MAAM,0BAA0B;;AAGpE,OAAM,CAAC,OAAO,UAAU;AACtB,MAAI,iBAAiB,UAAW;AAChC,MAAI,iBAAiB,iBACnB,SAAQ,MACN,gBAAgB,MAAM,KAAK,KAAK,mBAAmB,MAAM,QAAQ,GAClE;OACI;GACL,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,WAAQ,MAAM,gBAAgB,mBAAmB,IAAI,GAAa;;AAEpE,UAAQ,KAAK,EAAE;GACf"}
1
+ {"version":3,"file":"bootstrap.js","names":[],"sources":["../src/bootstrap.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport {\n createValidatedConfig,\n ManifestMCPError,\n MnemonicWalletProvider,\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 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":";;;;;;;AAcA,IAAM,YAAN,cAAwB,MAAM;CAC5B,cAAc;AACZ,SAAO;AACP,OAAK,OAAO;;;AAIhB,SAAS,KAAK,MAAqB;AACjC,SAAQ,KAAK,KAAK;AAClB,OAAM,IAAI,WAAW;;AAkBvB,SAAS,iBACP,SACA,OACA,YACe;AACf,KAAI,eAAe,SACjB,QAAO,OAAO,eAAe,MAAM,EAAE,gBAAgB,WAAW,CAAC;AAEnE,KAAI,eAAe,SACjB,QAAO,OAAO,eAAe,MAAM,EAAE,gBAAgB,WAAW,CAAC;AAGnE,SAAQ,MACN,wBAAwB,WAAW;IAE5B,QAAQ,0BAA0B,MAAM,iBACxC,QAAQ,oDACR,QAAQ,6DAChB;AACD,MAAK,EAAE;;AAGT,SAAS,cACP,KACA,QACA,SACgB;AAChB,KAAI,WAAW,IAAI,YAAY,EAAE;AAC/B,UAAQ,MAAM,uCAAuC,IAAI,cAAc;AACvE,SAAO,IAAI,sBACT,IAAI,aACJ,IAAI,eACJ,IAAI,YACL;;AAGH,KAAI,IAAI,UAAU;AAChB,UAAQ,MAAM,6CAA6C;AAC3D,SAAO,IAAI,uBAAuB,QAAQ,IAAI,SAAS;;AAGzD,SAAQ,MACN;YACe,QAAQ,+CAA+C,IAAI,YAAY,qDAEvF;AACD,MAAK,EAAE;;;;;;;;AAST,SAAgB,UAAU,KAA4B;CACpD,eAAe,OAAsB;EACnC,MAAM,aAAa,QAAQ,KAAK;AAChC,MAAI,YAAY;AACd,SAAM,iBAAiB,IAAI,SAAS,IAAI,OAAO,WAAW;AAC1D;;EAGF,MAAM,MAAM,YAAY;EAExB,MAAM,SAAS,sBAAsB;GACnC,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,UAAU,IAAI;GACd,SAAS,IAAI;GACb,eAAe,IAAI;GACnB,eAAe,IAAI;GACpB,CAAC;EAEF,MAAM,iBAAiB,cAAc,KAAK,QAAQ,IAAI,QAAQ;AAE9D,MAAI,eAAe,QACjB,OAAM,eAAe,SAAS;EAGhC,MAAM,SAAS,IAAI,aAAa;GAAE;GAAQ;GAAgB,CAAC;EAC3D,MAAM,YAAY,IAAI,sBAAsB;AAC5C,QAAM,OAAO,QAAQ,UAAU;AAE/B,UAAQ,MAAM,gBAAgB,IAAI,MAAM,0BAA0B;;AAGpE,OAAM,CAAC,OAAO,UAAU;AACtB,MAAI,iBAAiB,UAAW;AAChC,MAAI,iBAAiB,iBACnB,SAAQ,MACN,gBAAgB,MAAM,KAAK,KAAK,mBAAmB,MAAM,QAAQ,GAClE;OACI;GACL,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,WAAQ,MAAM,gBAAgB,mBAAmB,IAAI,GAAa;;AAEpE,UAAQ,KAAK,EAAE;GACf"}
package/dist/config.d.ts CHANGED
@@ -5,6 +5,8 @@ interface NodeMCPConfig {
5
5
  readonly gasPrice?: string;
6
6
  readonly restUrl?: string;
7
7
  readonly addressPrefix: string;
8
+ /** Gas simulation multiplier parsed from COSMOS_GAS_MULTIPLIER (minimum: 1). When undefined, a default of 1.5 is applied downstream by createConfig. */
9
+ readonly gasMultiplier?: number;
8
10
  readonly mnemonic?: string;
9
11
  readonly keyfilePath: string;
10
12
  readonly keyPassword?: string;
@@ -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;EAAA,SACA,QAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;AAAA;AAAA,iBA0BK,iBAAA,CAAA,GAAqB,IAAA,CACnC,aAAA;AAAA,iBAcc,UAAA,CAAA,GAAc,aAAA"}
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,CAAA,GAAqB,IAAA,CACnC,aAAA;AAAA,iBAcc,UAAA,CAAA,GAAc,aAAA"}
package/dist/config.js CHANGED
@@ -27,6 +27,12 @@ function loadConfig() {
27
27
  const rpcUrl = process.env.COSMOS_RPC_URL || void 0;
28
28
  const gasPrice = process.env.COSMOS_GAS_PRICE || void 0;
29
29
  const restUrl = process.env.COSMOS_REST_URL || void 0;
30
+ const gasMultiplierRaw = process.env.COSMOS_GAS_MULTIPLIER;
31
+ let gasMultiplier;
32
+ if (gasMultiplierRaw !== void 0 && gasMultiplierRaw !== "") {
33
+ gasMultiplier = Number(gasMultiplierRaw);
34
+ if (!Number.isFinite(gasMultiplier) || gasMultiplier < 1) throw new Error(`COSMOS_GAS_MULTIPLIER must be a finite number >= 1, got "${gasMultiplierRaw}"`);
35
+ }
30
36
  if (!rpcUrl && !restUrl) throw new Error("At least one of COSMOS_RPC_URL or COSMOS_REST_URL must be set. Set COSMOS_RPC_URL for full access (queries + transactions) or COSMOS_REST_URL for query-only mode.");
31
37
  if (rpcUrl && !gasPrice) throw new Error("COSMOS_GAS_PRICE is required when COSMOS_RPC_URL is set (e.g., COSMOS_GAS_PRICE=\"0.025umfx\").");
32
38
  return {
@@ -37,6 +43,7 @@ function loadConfig() {
37
43
  addressPrefix: getEnvOptional("COSMOS_ADDRESS_PREFIX", "manifest"),
38
44
  mnemonic: process.env.COSMOS_MNEMONIC,
39
45
  keyfilePath: resolvePath(getEnvOptional("MANIFEST_KEY_FILE", join(homedir(), ".manifest", "key.json"))),
46
+ gasMultiplier,
40
47
  keyPassword: process.env.MANIFEST_KEY_PASSWORD
41
48
  };
42
49
  }
@@ -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 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\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 keyPassword: process.env.MANIFEST_KEY_PASSWORD,\n };\n}\n"],"mappings":";;;;AAIA,OAAO,QAAQ;AAaf,SAAS,eAAe,KAAqB;CAC3C,MAAM,QAAQ,QAAQ,IAAI;AAC1B,KAAI,CAAC,MACH,OAAM,IAAI,MACR,wBAAwB,IAAI,0DAC7B;AAEH,QAAO;;AAGT,SAAS,eAAe,KAAa,cAA8B;CACjE,MAAM,QAAQ,QAAQ,IAAI;AAC1B,KAAI,UAAU,KAAA,KAAa,UAAU,GAAI,QAAO;AAChD,QAAO;;AAGT,SAAS,YAAY,GAAmB;AACtC,KAAI,EAAE,WAAW,KAAK,CACpB,QAAO,KAAK,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;AAEpC,QAAO;;AAGT,SAAgB,oBAGd;AACA,QAAO;EACL,eAAe,eAAe,yBAAyB,WAAW;EAClE,aAAa,YACX,eACE,qBACA,KAAK,SAAS,EAAE,aAAa,WAAW,CACzC,CACF;EACF;;AAGH,SAAgB,aAA4B;CAC1C,MAAM,SAAS,QAAQ,IAAI,kBAAkB,KAAA;CAC7C,MAAM,WAAW,QAAQ,IAAI,oBAAoB,KAAA;CACjD,MAAM,UAAU,QAAQ,IAAI,mBAAmB,KAAA;AAG/C,KAAI,CAAC,UAAU,CAAC,QACd,OAAM,IAAI,MACR,qKAED;AAGH,KAAI,UAAU,CAAC,SACb,OAAM,IAAI,MACR,kGACD;AAGH,QAAO;EACL,SAAS,eAAe,kBAAkB;EAC1C;EACA;EACA;EACA,eAAe,eAAe,yBAAyB,WAAW;EAClE,UAAU,QAAQ,IAAI;EACtB,aAAa,YACX,eACE,qBACA,KAAK,SAAS,EAAE,aAAa,WAAW,CACzC,CACF;EACD,aAAa,QAAQ,IAAI;EAC1B"}
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,QAAQ;AAef,SAAS,eAAe,KAAqB;CAC3C,MAAM,QAAQ,QAAQ,IAAI;AAC1B,KAAI,CAAC,MACH,OAAM,IAAI,MACR,wBAAwB,IAAI,0DAC7B;AAEH,QAAO;;AAGT,SAAS,eAAe,KAAa,cAA8B;CACjE,MAAM,QAAQ,QAAQ,IAAI;AAC1B,KAAI,UAAU,KAAA,KAAa,UAAU,GAAI,QAAO;AAChD,QAAO;;AAGT,SAAS,YAAY,GAAmB;AACtC,KAAI,EAAE,WAAW,KAAK,CACpB,QAAO,KAAK,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;AAEpC,QAAO;;AAGT,SAAgB,oBAGd;AACA,QAAO;EACL,eAAe,eAAe,yBAAyB,WAAW;EAClE,aAAa,YACX,eACE,qBACA,KAAK,SAAS,EAAE,aAAa,WAAW,CACzC,CACF;EACF;;AAGH,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;AACJ,KAAI,qBAAqB,KAAA,KAAa,qBAAqB,IAAI;AAC7D,kBAAgB,OAAO,iBAAiB;AACxC,MAAI,CAAC,OAAO,SAAS,cAAc,IAAI,gBAAgB,EACrD,OAAM,IAAI,MACR,4DAA4D,iBAAiB,GAC9E;;AAKL,KAAI,CAAC,UAAU,CAAC,QACd,OAAM,IAAI,MACR,qKAED;AAGH,KAAI,UAAU,CAAC,SACb,OAAM,IAAI,MACR,kGACD;AAGH,QAAO;EACL,SAAS,eAAe,kBAAkB;EAC1C;EACA;EACA;EACA,eAAe,eAAe,yBAAyB,WAAW;EAClE,UAAU,QAAQ,IAAI;EACtB,aAAa,YACX,eACE,qBACA,KAAK,SAAS,EAAE,aAAa,WAAW,CACzC,CACF;EACD;EACA,aAAa,QAAQ,IAAI;EAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manifest-network/manifest-mcp-node",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "Node.js MCP servers for Manifest Network with stdio transport and keyfile wallet",
5
5
  "type": "module",
6
6
  "bin": {
@@ -43,10 +43,10 @@
43
43
  "@cosmjs/amino": "0.32.4",
44
44
  "@cosmjs/encoding": "0.32.4",
45
45
  "@cosmjs/proto-signing": "0.32.4",
46
- "@manifest-network/manifest-mcp-core": "^0.3.3",
47
- "@manifest-network/manifest-mcp-chain": "^0.3.3",
48
- "@manifest-network/manifest-mcp-lease": "^0.3.3",
49
- "@manifest-network/manifest-mcp-fred": "^0.3.3",
46
+ "@manifest-network/manifest-mcp-core": "^0.3.5",
47
+ "@manifest-network/manifest-mcp-chain": "^0.3.5",
48
+ "@manifest-network/manifest-mcp-lease": "^0.3.5",
49
+ "@manifest-network/manifest-mcp-fred": "^0.3.5",
50
50
  "@modelcontextprotocol/sdk": "1.27.1",
51
51
  "dotenv": "^17.2.3"
52
52
  },