@manifest-network/manifest-mcp-node 0.9.0 → 0.11.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/README.md +8 -3
- package/dist/agent.d.ts +1 -0
- package/dist/agent.js +13 -0
- package/dist/agent.js.map +1 -0
- package/dist/keygen.js.map +1 -1
- package/package.json +11 -9
package/README.md
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
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
|
|
5
|
+
Provides five binaries:
|
|
6
6
|
- **`manifest-mcp-chain`** -- Chain MCP server (6 tools, +1 optional `request_faucet`: queries, transactions, fee estimation, module discovery)
|
|
7
7
|
- **`manifest-mcp-lease`** -- Lease MCP server (8 tools: credit balance, funding, lease queries, custom-domain claim/lookup, SKUs, providers)
|
|
8
8
|
- **`manifest-mcp-fred`** -- Fred MCP server (11 tools, plus 3 resources & 3 prompts: catalog, deployment readiness, manifest preview, deployment, ready polling, status, logs, restart, update, diagnostics, releases)
|
|
9
9
|
- **`manifest-mcp-cosmwasm`** -- CosmWasm MCP server (2 tools: MFX-to-PWR rate query, token conversion)
|
|
10
|
+
- **`manifest-mcp-agent`** -- Agent MCP server (5 orchestrated tools via MCP elicitation: deploy, manage-domain, lookup-domain, troubleshoot, close-lease)
|
|
10
11
|
|
|
11
12
|
## Setup
|
|
12
13
|
|
|
@@ -18,7 +19,7 @@ npm run build
|
|
|
18
19
|
|
|
19
20
|
## Wallet setup
|
|
20
21
|
|
|
21
|
-
All
|
|
22
|
+
All five servers need a wallet to sign transactions. Choose one of the options below.
|
|
22
23
|
|
|
23
24
|
### Option A -- Generate a new keyfile (recommended)
|
|
24
25
|
|
|
@@ -26,7 +27,7 @@ All four servers need a wallet to sign transactions. Choose one of the options b
|
|
|
26
27
|
npx manifest-mcp-chain keygen
|
|
27
28
|
```
|
|
28
29
|
|
|
29
|
-
All CLIs share the same keyfile (`~/.manifest/key.json`), so any of the
|
|
30
|
+
All CLIs share the same keyfile (`~/.manifest/key.json`), so any of the five commands works for `keygen` and `import`. You will be prompted for an encryption password. The keyfile is written with mode `0600`.
|
|
30
31
|
|
|
31
32
|
### Option B -- Import an existing mnemonic
|
|
32
33
|
|
|
@@ -64,6 +65,10 @@ manifest-mcp-fred import Import a mnemonic into an encrypted keyfile
|
|
|
64
65
|
manifest-mcp-cosmwasm Start the cosmwasm MCP server (stdio)
|
|
65
66
|
manifest-mcp-cosmwasm keygen Generate a new encrypted keyfile
|
|
66
67
|
manifest-mcp-cosmwasm import Import a mnemonic into an encrypted keyfile
|
|
68
|
+
|
|
69
|
+
manifest-mcp-agent Start the agent MCP server (stdio)
|
|
70
|
+
manifest-mcp-agent keygen Generate a new encrypted keyfile
|
|
71
|
+
manifest-mcp-agent import Import a mnemonic into an encrypted keyfile
|
|
67
72
|
```
|
|
68
73
|
|
|
69
74
|
## MCP client integration
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { bootstrap } from "./bootstrap.js";
|
|
3
|
+
import { AgentMCPServer } from "@manifest-network/manifest-mcp-agent";
|
|
4
|
+
//#region src/agent.ts
|
|
5
|
+
bootstrap({
|
|
6
|
+
cliName: "manifest-mcp-agent",
|
|
7
|
+
label: "agent",
|
|
8
|
+
createServer: (opts) => new AgentMCPServer(opts).getServer()
|
|
9
|
+
});
|
|
10
|
+
//#endregion
|
|
11
|
+
export {};
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +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,KAAK,CAAC,WAAW;CAC7D,CAAC"}
|
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/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifest-network/manifest-mcp-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Node.js MCP servers for Manifest Network with stdio transport and keyfile wallet",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
+
"manifest-mcp-agent": "dist/agent.js",
|
|
7
8
|
"manifest-mcp-chain": "dist/chain.js",
|
|
8
|
-
"manifest-mcp-
|
|
9
|
+
"manifest-mcp-cosmwasm": "dist/cosmwasm.js",
|
|
9
10
|
"manifest-mcp-fred": "dist/fred.js",
|
|
10
|
-
"manifest-mcp-
|
|
11
|
+
"manifest-mcp-lease": "dist/lease.js"
|
|
11
12
|
},
|
|
12
13
|
"scripts": {
|
|
13
14
|
"build": "tsdown",
|
|
@@ -32,7 +33,7 @@
|
|
|
32
33
|
"homepage": "https://github.com/manifest-network/manifest-mcp-mono#readme",
|
|
33
34
|
"bugs": "https://github.com/manifest-network/manifest-mcp-mono/issues",
|
|
34
35
|
"engines": {
|
|
35
|
-
"node": ">=
|
|
36
|
+
"node": ">=22.19.0"
|
|
36
37
|
},
|
|
37
38
|
"publishConfig": {
|
|
38
39
|
"access": "public"
|
|
@@ -44,11 +45,12 @@
|
|
|
44
45
|
"@cosmjs/amino": "0.32.4",
|
|
45
46
|
"@cosmjs/encoding": "0.32.4",
|
|
46
47
|
"@cosmjs/proto-signing": "0.32.4",
|
|
47
|
-
"@manifest-network/manifest-mcp-
|
|
48
|
-
"@manifest-network/manifest-mcp-
|
|
49
|
-
"@manifest-network/manifest-mcp-
|
|
50
|
-
"@manifest-network/manifest-mcp-
|
|
51
|
-
"@manifest-network/manifest-mcp-
|
|
48
|
+
"@manifest-network/manifest-mcp-agent": "^0.11.0",
|
|
49
|
+
"@manifest-network/manifest-mcp-core": "^0.11.0",
|
|
50
|
+
"@manifest-network/manifest-mcp-chain": "^0.11.0",
|
|
51
|
+
"@manifest-network/manifest-mcp-lease": "^0.11.0",
|
|
52
|
+
"@manifest-network/manifest-mcp-cosmwasm": "^0.11.0",
|
|
53
|
+
"@manifest-network/manifest-mcp-fred": "^0.11.0",
|
|
52
54
|
"@modelcontextprotocol/sdk": "1.27.1",
|
|
53
55
|
"dotenv": "^17.2.3"
|
|
54
56
|
},
|