An HR assistant that uses LLM-powered tool calling to manage employee data in a SQLite database. Users interact via natural language to query, add, update, and delete employee records.
This is a custom Python HR bot with 8 tools. Naming is verb-based and clear (init_db, add_employee, delete_employee, etc.). Descriptions are present but minimal (10-80 chars, well below the 194-char baseline). All tools have JSON Schema with proper types and required fields. However, parameter descriptions are sparse or missing entirely, most params lack explanatory text beyond the name. No output schema documentation. No error handling guidance. No tool annotations (readOnlyHint, destructiveHint). The server is STDIO-only (stdin/stdout via OpenAI client), not HTTP/SSE, which is a hard transport cap at 50. This is a proof-of-concept, not production-grade.
add a new employee
delete employee by id
get a single employee by employee id
Search employees by partial or full name (case-insensitive). Returns list with IDs so you can follow up with get_employee if needed.
initialize sqlite database and create employee table with columns (id, name, role, salary)
list every employee
list employees by role
STDIO-only transport: not remotely accessible. Cannot be used by hosted MCP clients or production agent frameworks. Requires direct Python process invocation.
Parameter descriptions missing or trivial. 'name', 'role', 'salary', 'employee_id', 'limit' lack explanatory text. LLMs cannot infer constraints (e.g., salary range, name length, limit bounds).
No output schema documentation. Tools return lists or dicts but no schema describes fields (e.g., does get_employee return {id, name, role, salary}?). LLMs cannot plan downstream calls.
No tool annotations. destructiveHint missing on delete_employee; readOnlyHint missing on get_* and list_* tools. LLMs cannot distinguish safe from unsafe operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
update an employee; only provided fields will be changed
No error handling guidance. execute_tool_call() returns raw strings ('unknown tool', 'invalid arguments') with no recovery hints. LLMs cannot self-correct or retry intelligently.