A decentralized node infrastructure for running AI models and services with Qdrant vector database integration, Ethereum wallet management, and configuration-driven deployment
This MCP server exhibits severe structural and definition quality issues. While 9 tools are claimed, only 5-6 are substantively defined with partial schemas (tools 1-5). Tools 6-9 (gaianet start/stop, Qdrant operations) have no visible schema definitions in the provided source code, they appear to be inferred from shell script naming rather than explicit MCP registration. No input schemas are visible for tools 6-9 in the Rust source. The tools that do have schemas (updateNode, generateKey, encryptKeystore, decryptKeystore) present custom type definitions (H160, U256) rather than standard JSON Schema, making them unsuitable for LLM consumption. Descriptions exist but are surface-level and lack WHEN/WHY context. No output schemas are documented. This server is a thin wrapper around shell scripts and Ethereum operations, not a production-grade MCP server. Most tools lack actionable error handling and parameter constraint documentation.
Creates or recovers a Qdrant vector collection from a snapshot URL
Decrypts a private key from an ETH keystore file using password
Deletes a Qdrant vector collection
Encrypts a private key and stores it in an ETH keystore file with password protection
Initializes a GaiaNet node with configuration from a remote URL or local file
Starts the GaiaNet node services including WasmEdge, Qdrant, and frpc
Stops the GaiaNet node services
Generates a new private key and Ethereum wallet using BIP39 mnemonic derivation
Tools 6-9 (gaianet start/stop/init, createQdrantCollection, deleteQdrantCollection) have NO visible input schemas in provided source code. They are inferred from shell script names rather than explicitly registered via Rust MCP bindings.
Input schemas use Rust type annotations (H160, U256, String) instead of JSON Schema. H160 and U256 are ethers-rs types with no standard JSON Schema mapping. LLMs cannot validate or understand these types. Schema must use standard JSON Schema primitives (string, number, object, etc.) with descriptions.
No output schemas are documented for any tool. LLMs cannot plan downstream calls or extract structured data without knowing what fields to expect. Every tool must declare its return type.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 39 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 28 | - | v1 |
Updates a node's information on the blockchain, including address, description, public URL, and status
Passwords and private keys are passed as string parameters (encryptKeystore, decryptKeystore, gaianet init --config). Secrets must never appear in tool parameters. Use server-side secret injection via environment variables or vault. All parameters are logged, secrets leak into traces.
Tool names 'gaianet init', 'gaianet start', 'gaianet stop' do not follow verb_noun convention. Use verb-first names like 'init_gaianet_node', 'start_gaianet_services', 'stop_gaianet_services' for clarity.
Destructive tools (deleteQdrantCollection, updateNode with status=false) have no confirmation/dry-run mechanism. An agent can permanently delete data without safeguards. Implement approval patterns or confirmation requests before destructive actions.
Parameter descriptions lack constraint details. 'publicUrl' has no format guidance (must be HTTPS? domain-only? full URL?). 'password' has no length/complexity rules. Descriptions must include ranges, formats, and valid patterns inline.
No error handling guidance. Source code shows panics (panic!("Can not decrypt key."), panic!("Status must be 0 or 1")) but no structured error responses. Tools must return actionable errors like 'Invalid status: got "2", must be 0 or 1'.
Parameter 'status' in updateNode uses boolean but description says '0 or 1', yet the enum should be explicit. Source code shows string comparisons ('status == "0"'). Inconsistent type handling invites LLM confusion.
generateKey has empty input schema ({}). Tool does not accept any parameters, but description says it 'generates a new private key', no context for customization (mnemonic length, derivation path, etc.). Either accept parameters or clarify why none are needed.