etcd cluster_backend plugin for MCPG gateway (dev.mcpg.cluster.etcd)
15 tools with mostly complete schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. Tool names follow verb_noun convention well (acquire_leadership, kv_put, lease_renew). Descriptions range 50 - 250 chars, meeting baseline (194 avg). However, 8 of 15 tools lack explicit output schema documentation, LLMs cannot plan downstream calls without knowing return structure. Parameters have types but many lack constraint details (e.g., kv_list_prefix 'limit' has no min/max). Error handling descriptions are sparse. Security-sensitive tools (kv_delete, lease_release) lack confirmation/dry-run patterns.
Acquire a distributed leadership lease via etcd's native lease_grant + lock + lease_keep_alive primitives. Background renewal task fires every ttl × (1 - renew_pct/100). Fencing token is the etcd lease id (monotonic per cluster)
Acquire a distributed lock via etcd's native lease_grant + lock + lease_keep_alive primitives. Background renewal task fires every ttl × (1 - renew_pct/100). Fencing token is the etcd lease id (monotonic per cluster)
Delete a key from the etcd key-value store
Change the TTL of an existing key in the etcd key-value store. Re-puts the existing value under a fresh lease (or none). Absent keys return false per the contract
Get a value from the etcd key-value store by key
List all keys under a prefix in the etcd key-value store with optional limit
Output schemas not documented for any tool. LLMs cannot infer return structure (fields, types, pagination) and must guess what data is available for downstream calls.
Numeric parameters lack min/max constraints. 'ttl' (milliseconds) and 'limit' have no bounds, LLMs may pass 0, negative, or absurdly large values causing timeouts or errors.
Destructive operations (kv_delete, lease_release) lack confirmation or dry-run patterns. Agents can irreversibly delete keys without safeguards.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | <=2025-11-25 | v2 |
Put a value into the etcd key-value store with optional TTL. A plain put replaces the value and detaches any prior lease, leaving the key permanent
Conditionally put a value into the etcd key-value store only if the key does not exist. Single-winner claim via etcd transaction comparing create_revision == 0 (absent)
Release an active lease via etcd's unlock(lock_key) + lease_revoke(lease_id). Idempotent via an AtomicBool
Renew an active lease via etcd's lease_keep_alive primitive
etcd KV scan on <prefix>peers/. NOTE: this backend does NOT self-register. Nothing in the plugin writes a peers/<node_id> key, so list_peers / watch_peers return whatever an EXTERNAL process populates under that prefix (and empty otherwise)
Reports operator-configured identity
etcd KV put of a timestamped key under <prefix>events/<topic>/<ts>-<rand> with a TTL lease (event_ttl_secs). The value is a tiny versioned envelope wrapping payload + routing key
etcd Watch on the topic prefix. Yields a PublishedMessage per PUT event, decoding the envelope and dropping malformed values. When the subscriber supplies a routing key, applies an exact-match filter. Watch is durable + replayable within etcd's retention window
etcd Watch on the peers/ prefix. PUT events emit Joined (or HealthChanged for re-registers); DELETE events emit Left. Stream stays open until cancelled. As with list_peers, this observes only EXTERNALLY-written peers/ keys — the plugin self-registers nothing
Error handling descriptions missing. Tools do not explain what errors are retryable, user-fixable, or fatal, or how to recover (e.g., 'If lease_renew fails with 'lease not found', call acquire_lock again').
watch_peers and subscribe return streaming results but lack pagination/limit guidance. Descriptions do not clarify how many events are buffered or when the stream closes.