This server presents a mixed picture. While it has 15 tools with declared schemas and descriptions, the quality is inconsistent. All tools have names following verb_noun convention (get_, create_, update_, submit_), which is good. However, parameter descriptions are sparse or generic, and several tools lack clarity around multi-step workflows and error recovery. The schemas are visible in the Zod definitions, but output schemas are not documented anywhere, the ToolResponse interface is generic with 'data?: T' and '[key: string]: any', which defeats structured output expectations. Most critically, parameter descriptions are often one-liner and lack actionable constraints or context. Error handling exists but provides minimal guidance. The mock server suggests basic testing was done, but the actual tool implementations are not shown, making it impossible to verify error messages or output field naming. Given the rubric baseline that most servers score 40-60 and that this server has fundamental gaps in schema documentation and parameter descriptions, a score in the low-to-mid 50s is justified.
Approve a submitted timesheet
Create a new contact in Unanet
Create a new opportunity in Unanet
Generate an invoice for a project
Get billing status and information for a project
Get detailed information about a company
Generate and retrieve financial reports from Unanet
Output schemas not documented. Tools return a generic ToolResponse<T> interface with 'data?: T' and open-ended properties '[key: string]: any'. LLMs cannot plan downstream calls or extract specific fields without knowing what the response contains. No example output structures provided.
Parameter descriptions are minimal and lack actionable constraints. Example: 'limit' parameters say 'Maximum number of projects to return' but don't specify the range (1-100? 1-1000?). 'date' fields mention 'YYYY-MM-DD format' but don't validate or explain what happens with invalid dates. LLMs need explicit bounds and behavior.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Get detailed information about a specific project
Get the current status and dashboard data for a project
Get a list of all projects from Unanet
Retrieve timesheets for a date range
Submit an expense report to Unanet
Submit time entries to Unanet
Update lead information in Unanet
Update the budget for a specific project
No error handling guidance. Tools lack descriptions of how failures are communicated (e.g., what happens if projectId does not exist? What if a timesheet is already submitted?). Error responses should guide the LLM on retry strategy and recovery options.
Destructive operations lack confirmation or dry-run capability. Tools like unanet_update_project_budget, unanet_approve_timesheet, and unanet_generate_invoice modify state or trigger workflows with no confirmation step. Agents can inadvertently approve timesheets or generate invoices by mistake.
No pagination metadata. Tools returning lists (unanet_get_projects, unanet_get_timesheets) set a default limit of 50 but don't document whether there are more results available, how to fetch the next page, or total count. Without pagination awareness, agents risk missing data or making duplicate API calls.
Tool compositions not designed for common workflows. To submit a timesheet, the agent likely needs to first retrieve project/task IDs, then construct entries. The unanet_submit_timesheet tool requires an array of entries with projectId and taskId, but there's no discovery tool to list available projects and tasks for a given user. This forces multi-step discovery before submission.
Inconsistent parameter naming and type suffixes. Some parameters are named 'projectId' (projectId in project tools), others 'leadId' (unanet_update_lead). The pattern is inconsistent, sometimes tool name + 'Id' (timesheetId), sometimes just 'Id' context-dependent. Suffix parameter names with type (e.g., project_id, lead_id, timesheet_id) to avoid LLM confusion.
No documentation of enum values and their meanings. Tools use enums for status fields (Active/Inactive/Completed/All, Draft/Submitted/Approved/Rejected/All, etc.), but descriptions don't explain what each status means or when an LLM should use it. E.g., does 'Completed' project mean finished work or archived?
Auth credentials passed as environment variables with no encryption or validation. Package.json and mock-server show test credentials in plain text (test-user, test-pass, test-api-key). While acceptable for development, production deployments should use a secrets vault and validate auth on server initialization.
No audit logging. Tool definitions reference 'handler: (args, auth) => Promise<ToolResponse>' but the actual implementations are not shown. There's no evidence of who called what tool, when, or what the result was. Production systems need audit trails for compliance.