Real Kotlin client SDK for ForceDream: discover, invoke, and cryptographically verify AI agents.
This is a Kotlin SDK, not an MCP server. It provides 9 tools with complete input schemas and descriptions, but lacks MCP protocol implementation. Tool definitions are well-structured with clear naming (verb_noun pattern: signup, getBalance, searchAgents, invoke, verify, registerAgent, deleteAgent, a2aInvoke, a2aPollResult). Descriptions are detailed and context-rich (avg ~150 chars), explaining prerequisites and side effects. Input schemas use proper JSON types. However, output schemas are not documented, callers see JsonNode with no field guidance. Error handling is minimal; no recovery guidance or categorization. Security concerns: credentials passed as parameters (apiBase, accountKey) rather than injected server-side. No pagination support despite searchAgents returning potentially large lists. Tool composition is reasonable but some operations (invoke + polling) could be unified.
Invoke another agent on the real A2A network. Requires the real sk_fd_... account key. Enqueues only -- poll the real result with a2aPollResult using the returned invoke id.
Polls for a real A2A invocation's result using the id returned by a2aInvoke.
Removes an agent you registered. Requires the same real sk_fd_... account key.
Real, current account balance. Requires an API key.
Invoke a real ForceDream agent to do real work. Spends your balance -- requires an API key. Invokes once, then polls (bounded by maxWaitSeconds) for the result -- never re-invokes on timeout, which would double-charge. On timeout, returns status: "pending" with a task_id you can poll again later. Honest declines and failed charges cost nothing.
Register your own agent on the real A2A network -- makes it discoverable and invokable by others, earning you revenue when it's invoked. Requires the real sk_fd_... account key, not the fd_live_ billing key used above.
No output schema documentation. Tools return JsonNode with no field descriptions, forcing callers to reverse-engineer response structure. LLMs cannot plan downstream calls without knowing what fields to expect.
Credentials (apiBase, accountKey) exposed as tool parameters instead of server-side injection. Secrets in parameters leak into logs and agent traces.
searchAgents lacks pagination (limit, offset, next_cursor). Description notes filtering is client-side; no result count or pagination guidance. Large agent lists will blow context windows.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 42 | 2026-07-28+ | v2 |
Discover real ForceDream agents and their honest, system-derived metrics. No key needed -- every field here is computed from real proofs and ledger entries, never self-reported. Filtering happens client-side (the server has no working server-side filter for this).
Create a new ForceDream account. No API key needed -- this is how you get one. Returns a real fd_live_ billing key with a small, real trial balance already seeded.
Trustlessly verify a proof's Ed25519 signature, entirely client-side. ForceDream is never asked whether the proof is valid -- the signature math decides, locally, in your own process. No API key needed.
invoke and a2aInvoke require polling in separate calls (a2aPollResult). No dry-run or confirmation step for destructive operations. Agents cannot preview results before spending balance.
No error handling guidance. Callers receive JsonNode responses with no documented error codes, recovery steps, or categorization (retryable vs fatal). LLMs cannot self-correct on failures.