Tool Registration, Request/Response Contracts & Error Normalization
{
"status": "healthy" | "degraded" | "unavailable",
"data": T | null,
"error": {
"code": string, // e.g. "OLLAMA_UNREACHABLE"
"message": string, // human-readable
"recoverable": bool, // can the agent retry?
"suggestion": string // e.g. "Run obsidian-rag index first"
} | null,
"meta": {
"query_time_ms": number,
"chunks_scanned": number,
"index_version": string,
"vault_mtime": string // ISO 8601
}
}
| Failure | Status | Code | Recoverable |
|---|---|---|---|
| Ollama down | degraded | OLLAMA_UNREACHABLE | yes — retry after start |
| Empty vault / no index | unavailable | INDEX_NOT_FOUND | yes — run index first |
| LanceDB corrupted | unavailable | INDEX_CORRUPTED | yes — run reindex |
| Path traversal attempt | unavailable | SECURITY_VIOLATION | no |
| Sensitive content blocked | degraded | SENSITIVE_FILTERED | yes — with confirmation |
| Indexer CLI crash | unavailable | INDEXER_FAILED | yes — retry once |