The bone cracks. The model reads. Audited divination skills for AI agents — tarot, I Ching, Xiao Liu Ren, Bazi.
oraclebone demonstrates strong schema and naming discipline across 9 tools (5 canonical + 4 legacy aliases). All tools are read-only divination operations with complete input schemas, proper enums, and detailed descriptions. However, descriptions could be more concise and LLM-optimized (many exceed 200 chars), and output schemas are externalized as JSON files (not visible in source for validation). Parameter descriptions are comprehensive but verbose. The server shows maturity in constraint definition (enums, ranges) and clear parameter relationships, but lacks explicit error handling guidance and recovery patterns. Naming follows verb_noun convention well (draw, cast, template). Tool composition is clean, each tool does one thing. No security concerns (all read-only, no secrets in params). The per-tool average is 72, placing this in the 'good' category with room for description refinement.
Cast a Bazi (八字 / Four Pillars) chart from a Gregorian birth datetime. The host MUST NOT invent pillars, stems, branches, or wuxing. Requires the optional lunar-python dependency.
Cast a Bazi (八字 / Four Pillars) chart from a Gregorian birth datetime. The host MUST NOT invent pillars, stems, branches, or wuxing. Requires the optional lunar-python dependency.
Cast an I Ching hexagram. The host MUST NOT invent the cast. Use method=coins, yarrow, or manual (with manual_lines).
Cast an I Ching hexagram. The host MUST NOT invent the cast. Use method=coins, yarrow, or manual (with manual_lines).
Return the interpretation template (shared + per-skill) that the host should follow before writing an interpretation.
Draw tarot cards with audited Fisher-Yates shuffle. The host MUST NOT invent the draw. Omit `seed` for real readings; seeded mode is for tests and reproducible demos only.
Tool descriptions are verbose (many 150-200+ chars) and contain repetitive 'The host MUST NOT invent' boilerplate. Descriptions should be 50-200 chars and optimize for LLM selection clarity.
Legacy dotted tool names (tarot.draw, iching.cast, etc.) violate the MCP 2025-06-18 tool name spec (must match ^[a-zA-Z0-9_-]{1,64}$). While code correctly aliases them to underscore names for new clients, the aliases themselves should be deprecated in the tool list, not registered as separate tools.
Output schemas are loaded from external JSON files (e.g., tarot-draw.schema.json) but not visible in source code. Cannot verify schema completeness, field descriptions, or alignment with tool return types. Recommend embedding schemas inline in mcp_server.py or providing a schema inspection endpoint.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2025-06-18+ | v2 |
Draw tarot cards with audited Fisher-Yates shuffle. The host MUST NOT invent the draw. Omit `seed` for real readings; seeded mode is for tests and reproducible demos only.
Cast Xiao Liu Ren (小六壬). The host MUST NOT invent the cast. method=numbers needs month/day/hour, method=time and method=lunar_time take an ISO datetime (lunar_time requires the optional lunar-python dependency).
Cast Xiao Liu Ren (小六壬). The host MUST NOT invent the cast. method=numbers needs month/day/hour, method=time and method=lunar_time take an ISO datetime (lunar_time requires the optional lunar-python dependency).
No explicit error handling guidance in tool descriptions. For example, xiaoliuren_cast requires month/day/hour for method='numbers' but the description does not explain what happens if a required parameter is missing or out of range. Code does validate (raises ValueError), but the description should guide LLM recovery.
bazi_cast requires optional lunar-python dependency but does not document this as a tool-level constraint or return an error if the dependency is missing. LLMs cannot predict runtime failures.
interpretation_template uses an enum 'skill' parameter with six valid values but the description does not list them or explain what each template contains. LLMs must infer structure from the enum alone.