@manifest-network/manifest-mcp-node 0.3.4 → 0.4.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/README.md CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  Node.js CLI entry points for the Manifest MCP servers with stdio transport and encrypted keyfile wallet.
4
4
 
5
- Provides three binaries:
5
+ Provides four binaries:
6
6
  - **`manifest-mcp-chain`** -- Chain MCP server (5 tools: queries, transactions, module discovery)
7
7
  - **`manifest-mcp-lease`** -- Lease MCP server (6 tools: credit balance, funding, lease queries, SKUs, providers)
8
8
  - **`manifest-mcp-fred`** -- Fred MCP server (8 tools: catalog, deployment, status, logs, restart, update, diagnostics, releases)
9
+ - **`manifest-mcp-cosmwasm`** -- CosmWasm MCP server (2 tools: MFX-to-PWR rate query, token conversion)
9
10
 
10
11
  ## Setup
11
12
 
@@ -17,7 +18,7 @@ npm run build
17
18
 
18
19
  ## Wallet setup
19
20
 
20
- All three servers need a wallet to sign transactions. Choose one of the options below.
21
+ All four servers need a wallet to sign transactions. Choose one of the options below.
21
22
 
22
23
  ### Option A -- Generate a new keyfile (recommended)
23
24
 
@@ -25,7 +26,7 @@ All three servers need a wallet to sign transactions. Choose one of the options
25
26
  npx manifest-mcp-chain keygen
26
27
  ```
27
28
 
28
- All CLIs share the same keyfile (`~/.manifest/key.json`), so any of the three commands works for `keygen` and `import`. You will be prompted for an encryption password. The keyfile is written with mode `0600`.
29
+ All CLIs share the same keyfile (`~/.manifest/key.json`), so any of the four commands works for `keygen` and `import`. You will be prompted for an encryption password. The keyfile is written with mode `0600`.
29
30
 
30
31
  ### Option B -- Import an existing mnemonic
31
32
 
@@ -59,6 +60,10 @@ manifest-mcp-lease import Import a mnemonic into an encrypted keyfile
59
60
  manifest-mcp-fred Start the fred MCP server (stdio)
60
61
  manifest-mcp-fred keygen Generate a new encrypted keyfile
61
62
  manifest-mcp-fred import Import a mnemonic into an encrypted keyfile
63
+
64
+ manifest-mcp-cosmwasm Start the cosmwasm MCP server (stdio)
65
+ manifest-mcp-cosmwasm keygen Generate a new encrypted keyfile
66
+ manifest-mcp-cosmwasm import Import a mnemonic into an encrypted keyfile
62
67
  ```
63
68
 
64
69
  ## MCP client integration
@@ -101,6 +106,17 @@ Replace the placeholder values below with your actual chain ID, RPC/REST endpoin
101
106
  "COSMOS_GAS_PRICE": "0.01umfx",
102
107
  "MANIFEST_KEY_PASSWORD": "your-keyfile-password"
103
108
  }
109
+ },
110
+ "manifest-cosmwasm": {
111
+ "command": "npx",
112
+ "args": ["manifest-mcp-cosmwasm"],
113
+ "env": {
114
+ "COSMOS_CHAIN_ID": "your-chain-id",
115
+ "COSMOS_RPC_URL": "https://your-rpc-endpoint/",
116
+ "COSMOS_GAS_PRICE": "0.01umfx",
117
+ "MANIFEST_KEY_PASSWORD": "your-keyfile-password",
118
+ "MANIFEST_CONVERTER_ADDRESS": "manifest1..."
119
+ }
104
120
  }
105
121
  }
106
122
  }
@@ -138,10 +154,13 @@ A wallet is still required at startup even in query-only mode. Transaction tools
138
154
  | `COSMOS_RPC_URL` | One of `COSMOS_RPC_URL` or `COSMOS_REST_URL` required | -- | RPC endpoint URL (HTTPS required; HTTP allowed for localhost) |
139
155
  | `COSMOS_GAS_PRICE` | Required when `COSMOS_RPC_URL` is set | -- | Gas price with denom (e.g. `0.01umfx`) |
140
156
  | `COSMOS_REST_URL` | One of `COSMOS_RPC_URL` or `COSMOS_REST_URL` required | -- | LCD/REST endpoint URL for query-only mode |
157
+ | `COSMOS_GAS_MULTIPLIER` | No | `1.5` | Gas simulation multiplier (must be >= 1) |
141
158
  | `COSMOS_ADDRESS_PREFIX` | No | `manifest` | Bech32 address prefix |
142
159
  | `MANIFEST_KEY_FILE` | No | `~/.manifest/key.json` | Path to the encrypted keyfile |
143
160
  | `MANIFEST_KEY_PASSWORD` | No | -- | Password to decrypt the keyfile |
144
161
  | `COSMOS_MNEMONIC` | No | -- | BIP-39 mnemonic (fallback when no keyfile exists) |
162
+ | `MANIFEST_FAUCET_URL` | No | -- | Faucet URL (enables `request_faucet` tool on chain server) |
163
+ | `MANIFEST_CONVERTER_ADDRESS` | Required for cosmwasm server | -- | CosmWasm converter contract address |
145
164
  | `LOG_LEVEL` | No | `warn` | Log level: `debug`, `info`, `warn`, `error`, or `silent` |
146
165
 
147
166
  Set `COSMOS_RPC_URL` + `COSMOS_GAS_PRICE` for full access (queries + transactions). Set `COSMOS_REST_URL` alone for query-only mode (LCD/REST). When both are set, `COSMOS_REST_URL` is preferred for queries.
@@ -182,6 +201,13 @@ Set `COSMOS_RPC_URL` + `COSMOS_GAS_PRICE` for full access (queries + transaction
182
201
  | `app_diagnostics` | Get provision diagnostics for a deployed app |
183
202
  | `app_releases` | Get release/version history for a deployed app |
184
203
 
204
+ ## CosmWasm server tools (2)
205
+
206
+ | Tool | Description |
207
+ |------|-------------|
208
+ | `get_mfx_to_pwr_rate` | Get the current MFX-to-PWR conversion rate and preview amounts |
209
+ | `convert_mfx_to_pwr` | Convert MFX tokens to PWR via the on-chain converter contract |
210
+
185
211
  ## License
186
212
 
187
213
  MIT
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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { bootstrap } from "./bootstrap.js";
3
+ import { CosmwasmMCPServer } from "@manifest-network/manifest-mcp-cosmwasm";
4
+ //#region src/cosmwasm.ts
5
+ bootstrap({
6
+ cliName: "manifest-mcp-cosmwasm",
7
+ label: "cosmwasm",
8
+ createServer: (opts) => {
9
+ const converterAddress = process.env.MANIFEST_CONVERTER_ADDRESS?.trim();
10
+ if (!converterAddress) throw new Error("MANIFEST_CONVERTER_ADDRESS environment variable is required. Set it to the bech32 address of the MFX-to-PWR converter contract.");
11
+ return new CosmwasmMCPServer({
12
+ ...opts,
13
+ converterAddress
14
+ }).getServer();
15
+ }
16
+ });
17
+ //#endregion
18
+ export {};
19
+
20
+ //# sourceMappingURL=cosmwasm.js.map
@@ -0,0 +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,MAAM;AACvE,MAAI,CAAC,iBACH,OAAM,IAAI,MACR,kIAED;AAEH,SAAO,IAAI,kBAAkB;GAAE,GAAG;GAAM;GAAkB,CAAC,CAAC,WAAW;;CAE1E,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@manifest-network/manifest-mcp-node",
3
- "version": "0.3.4",
3
+ "version": "0.4.5",
4
4
  "description": "Node.js MCP servers for Manifest Network with stdio transport and keyfile wallet",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "manifest-mcp-chain": "dist/chain.js",
8
8
  "manifest-mcp-lease": "dist/lease.js",
9
- "manifest-mcp-fred": "dist/fred.js"
9
+ "manifest-mcp-fred": "dist/fred.js",
10
+ "manifest-mcp-cosmwasm": "dist/cosmwasm.js"
10
11
  },
11
12
  "scripts": {
12
13
  "build": "tsdown",
@@ -43,10 +44,11 @@
43
44
  "@cosmjs/amino": "0.32.4",
44
45
  "@cosmjs/encoding": "0.32.4",
45
46
  "@cosmjs/proto-signing": "0.32.4",
46
- "@manifest-network/manifest-mcp-core": "^0.3.4",
47
- "@manifest-network/manifest-mcp-chain": "^0.3.4",
48
- "@manifest-network/manifest-mcp-lease": "^0.3.4",
49
- "@manifest-network/manifest-mcp-fred": "^0.3.4",
47
+ "@manifest-network/manifest-mcp-core": "^0.4.4",
48
+ "@manifest-network/manifest-mcp-chain": "^0.4.4",
49
+ "@manifest-network/manifest-mcp-lease": "^0.4.4",
50
+ "@manifest-network/manifest-mcp-cosmwasm": "^0.4.4",
51
+ "@manifest-network/manifest-mcp-fred": "^0.4.4",
50
52
  "@modelcontextprotocol/sdk": "1.27.1",
51
53
  "dotenv": "^17.2.3"
52
54
  },