A local MCP server for freelance time tracking, driven by AI agents
Stint demonstrates solid tool design with 21 well-named, verb-prefixed tools covering a coherent time-tracking domain. All tools have descriptions (avg ~100 chars) and explicit Zod schemas with typed parameters. However, several tools lack parameter descriptions (e.g., update_entry's 'date', 'hours', 'description' fields have no .describe() calls), and output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; tools return JSON but provide no recovery guidance. Composition is strong: tools chain logically (start_entry → stop_entry, query_entries → link_ticket). No security issues detected (no secrets in params). Naming follows verb_noun convention consistently.
Add a context pattern for client auto-detection.
Auto-detect which client based on context signals (directory, git remote, ticket, project name).
Update ticket metadata fields (summary, labels, PO). For agent use after JIRA lookup.
Generate a time report for a client/month in CSV or text format. Includes hours by ticket, budget labels, costs, and data quality warnings.
Returns the currently running time entry (if any).
Surface gaps, missing data, and unlinked entries for a month. Checks required_fields per client.
Aggregated monthly view: hours by ticket, by label, totals vs expected.
Output schemas not documented. Tools return JSON but LLMs cannot predict field names, types, or structure. Agents must guess what fields to extract for downstream calls.
update_entry has 5 optional parameters (date, hours, description, ticket_id, client_id) with NO descriptions in Zod schema. LLMs cannot infer what each field controls.
No error handling guidance. Tools return JSON.stringify(result) but provide no recovery hints if a call fails. LLMs cannot self-correct or retry intelligently.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
All entries for today across all clients, with totals.
Associate a time entry with a ticket. Creates stub ticket if it doesn't exist.
Retroactive/manual time logging for work not tracked with start/stop.
Create or update a client (upsert). Config includes hourly rate, expected hours/day, working days, required fields for tickets, label taxonomy, and invoice contact.
Create or update ticket metadata (upsert).
Record a non-working day (holiday, sick, day off). Gap detection will skip these.
Flexible search across time entries with filters.
Remove a context pattern.
Full-text search over time entry descriptions and ticket summaries. Use this to find past work matching specific words or phrases. Returns ranked results with highlighted snippets. Query is treated as a literal phrase — no FTS5 operators.
Begin tracking time. Auto-stops any active entry for the same client.
Stop the currently active entry. Calculates hours from timestamps.
Fuzzy-match a description against known tickets for a client.
Edit any field on an existing time entry.
Soft-delete an entry (sets status to void).
manage_ticket and manage_client accept many optional fields (name, hourly_rate, currency, etc.) but lack descriptions for most. LLMs cannot determine which fields to populate.
query_entries and get_incomplete accept optional date_from/date_to but do not specify ISO 8601 format or validation rules. LLMs may pass invalid date strings.