The server provides 20 tools with mostly present descriptions and input schemas, but exhibits significant gaps in parameter documentation, output schema definition, and error handling guidance. Tool naming is generally clear and action-oriented (search_, get_, list_, send_, enable_, disable_, etc.), following the verb_noun convention. However, parameter descriptions are often minimal or missing semantic details (e.g., 'Tool parameters as key-value pairs' for call_internal_tool), and output schemas are not formally documented in the source. Many parameters lack type constraints, range documentation, or guidance on valid values. Error handling is minimal, tools do not provide recovery guidance or classify errors as retryable vs. fatal. Only ~50% of parameters have substantive descriptions; the remaining are either absent or generic. This is typical of community-grade servers and falls into the C/D range (fair to poor).
Output schemas are not formally documented. Tools return structured data but no JSON Schema is visible in source, LLMs cannot plan chaining calls or know which fields to extract.
Parameter descriptions lack semantic detail and validation constraints. E.g., 'Tool parameters as key-value pairs' (call_internal_tool) does not explain what keys are valid, what types values should be, or what happens on invalid input. No format specs, ranges, or enum constraints visible.
No error handling guidance. Tools do not provide actionable recovery instructions or classify errors as retryable vs. fatal. LLMs cannot self-correct on failure.
Recommendations
Add formal JSON Schema output schemas to every tool. Document the shape of responses with typed fields, array boundaries, and required vs. optional fields. Example: get_system_summary should declare { type: 'object', properties: { status: {type: 'string'}, uptime_seconds: {type: 'number'}, ... }, required: [...] }.
Expand parameter descriptions to include validation rules, valid value ranges, and examples of correct vs. incorrect input. For call_internal_tool.parameters, specify: 'Valid keys depend on the tool, fetch from list_internal_tools(include_parameters=true) first. All values must be JSON-serializable (string, number, boolean, object, array).'
Implement error handling with recovery guidance. Return structured error objects like { error: 'invalid_plugin_name', message: 'Plugin "foo" not found. Did you mean: foo-beta, foo-legacy?', retryable: false }. Guide LLMs with actionable next steps.
Add a confirmation step for destructive operations. Offer a dry_run parameter (restart_astrbot, uninstall_plugin) or a two-phase pattern: call with dry_run=true first, review output, then confirm with a token or flag.
Refactor call_internal_tool to include a requires_schema parameter that returns the full input schema of the target tool, enabling agents to validate before calling. Alternatively, split into call_internal_tool (generic invoke) + get_internal_tool_schema (per-tool schema discovery).
Add cursor/offset pagination to log and message listing tools. Example: get_compact_logs should return { entries: [...], next_cursor: 'abc123', has_more: true } and accept a cursor parameter.
Destructive operations (restart_astrbot, uninstall_plugin) lack dry-run or confirmation steps. Agents can permanently damage systems without a safety gate.
Tool composition issues: call_internal_tool is too generic and requires agents to know opaque tool names and parameter structures. No discovery mechanism to fetch available tools' signatures before calling. Agents must chain list_internal_tools + call_internal_tool, wasting tokens.
Parameters like plugin_repo (install_plugin) accept both GitHub URLs and 'plugin repo identifiers' but do not specify which format is expected or how resolution works. LLMs will guess incorrectly.
No pagination support visible. get_compact_logs and get_logs_by_id accept max_entries but no offset/cursor mechanism, large log volumes could exhaust context or require multiple sequential calls.
Document parameter relationships. E.g., in send_message, clarify: 'Either message (plain text) OR parts (rich content) must be provided, not both. If both are present, parts takes precedence.'
For plugin_source in install_plugin, replace the enum comment with actual enum constraint: { type: 'string', enum: ['auto', 'pypi', 'github', 'local'], description: 'Plugin source type. auto detects from plugin_repo format.' }.
Add security warnings to tool descriptions. E.g., set_plugin_config: 'Warning: Modifying plugin configs can break AstrBot. Validate config syntax before applying.' This prompts LLMs to verify before executing.
Include IDs and references needed for chaining in all responses. E.g., send_message should return both message_id and session_id, enabling follow-up calls to edit, delete, or reply to the sent message.