tallied
Server Details
Log hours and invoice clients from your AI chat. Time tracking and invoicing for freelancers.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- connerj70/time-tracking
- GitHub Stars
- 0
- Server Listing
- Tallied
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 17 tools
Each tool targets a distinct action in a clear domain: invoice preview vs. create vs. send vs. void are separated, and time logging vs. proposing vs. reporting are clearly distinguished. Cross-tool usage is carefully disambiguated in the descriptions, so an agent can reliably pick the right call.
All tools use a consistent domain-prefixed verb_noun convention (invoice.create_draft, time.list_entries, workspace.list_projects). Minor pairings like log_entries_batch vs log_entry are still predictable from the pattern.
At 17 tools this is slightly above the ideal 3–15 range, but the count is justified because the server covers three related workflows: time tracking, invoicing, and workspace setup. Every tool maps to a distinct operation, so the size feels intentional rather than padded.
The time and invoice lifecycles are well covered: log/update/delete/list/report, and create/preview/send/pay/void. Notable gaps are invoice editing after drafting and client/project update or delete operations, though neither is a critical blocker for the core workflow.
Available Tools
17 toolsinvoice.create_draftCreate a draft invoiceAInspect
Use this when the user asks to invoice a client, bill for a period, or turn unbilled hours into an invoice. Creates a draft only; nothing is sent and the client cannot see it yet. Includes all unbilled billable entries for the client through through_date and marks them as invoiced. Show the draft to the user, then use invoice.send when they ask to send it.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| client | Yes | ||
| due_in_days | No | Default: client net terms (30) | |
| through_date | No | Default: today | |
| group_lines_by | No | Default "project" | |
| tax_rate_percent | No |
invoice.getGet invoice detailsARead-onlyIdempotentInspect
Use this when the user asks about a specific invoice's lines, total, due date, payment link, or payment status. Accepts an invoice id or number (e.g. "INV-0007"). Renders an invoice preview.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | Invoice id or number |
invoice.listList invoicesARead-onlyIdempotentInspect
Use this when the user asks about invoices: outstanding, overdue, paid, drafts, sent this month, which clients owe money, or a specific client's invoices. Returns invoice summaries with status and totals. Use invoice.get for line items.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| client | No | ||
| status | No | Default "all". "outstanding" = sent or viewed; "overdue" = outstanding and past due. | |
| end_date | No | Issue date to | |
| start_date | No | Issue date from |
invoice.preview_draftPreview what an invoice would containARead-onlyIdempotentInspect
Use this when the user asks what they could invoice a client for, or wants to see unbilled work before creating an invoice. Creates nothing. Returns the lines, hours, and total an invoice.create_draft call with the same arguments would produce.
| Name | Required | Description | Default |
|---|---|---|---|
| client | Yes | Client name or id | |
| through_date | No | Include unbilled entries up to and including this date. Default: today. | |
| group_lines_by | No | Default "project" | |
| tax_rate_percent | No |
invoice.record_paymentRecord a manual paymentAIdempotentInspect
Use this when the user says a client paid by check, bank transfer, cash, or otherwise outside the Stripe payment link. Marks the invoice paid. Stripe payments are recorded automatically; do not use this for them.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| method | No | e.g. "bank transfer", "check #1042" | |
| paid_on | No | Default: today | |
| invoice_id | Yes | Invoice id or number |
invoice.sendSend an invoice to the clientAInspect
Use this only after the user has reviewed the draft and asks to send it. Emails the invoice with a Stripe payment link to the client's billing email (or to_email) and changes the status to sent. Do not call to re-send unless the user asks. This sends a real email to a real person.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Optional cover note in the user's voice | |
| to_email | No | Override or supply the recipient when the client has no billing email | |
| invoice_id | Yes | Invoice id or number |
invoice.voidVoid an invoiceADestructiveInspect
Use this only when the user explicitly asks to void or cancel an invoice. Requires confirm: true; without it returns the invoice for a final check. Voiding releases its time entries so they can be invoiced again. Paid invoices cannot be voided.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| confirm | No | ||
| invoice_id | Yes |
time.delete_entryDelete a time entryADestructiveInspect
Use this only when the user explicitly asks to remove an entry. Requires confirm: true; when omitted it returns the entry for a final check without deleting. Entries on sent invoices cannot be deleted. To fix a mistake, prefer time.update_entry.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to actually delete | |
| entry_id | Yes |
time.list_entriesList time entriesARead-onlyIdempotentInspect
Use this when the user asks what they worked on, what they logged, or wants entries for a day, week, project, or client. Returns individual entries with resolved project/client names and per-entry rates. For totals and breakdowns use time.report instead. Do not use for calendar events, tasks, or reminders. Defaults to the current week in the workspace timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 100 | |
| client | No | Client name or id | |
| cursor | No | page.next_cursor from a previous call | |
| project | No | Project name or id | |
| end_date | No | YYYY-MM-DD, inclusive. Default: today. | |
| start_date | No | YYYY-MM-DD, inclusive. Default: Monday of the current week. | |
| billable_only | No | ||
| unbilled_only | No | Only billable entries not yet on an invoice |
time.log_entries_batchLog several time entriesAIdempotentInspect
Use this when logging multiple entries at once: an end-of-day recap, a pasted list, or after time.propose_entries has been confirmed. Each entry is validated independently; partial success is reported per row with the same statuses as time.log_entry. Do not call before the user has confirmed proposed entries.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes |
time.log_entryLog a time entryAIdempotentInspect
Use this when the user states work they did with a duration or a start and end time, for today or a past date. Do not use for future plans, reminders, timers, or calendar scheduling. If the project is ambiguous this returns candidates instead of logging; ask the user and retry. Never auto-creates a project. Echoes the parsed duration and resolved date so you can confirm.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ISO datetime or HH:MM. Optional. | |
| date | No | YYYY-MM-DD. Defaults to today in the workspace timezone. Do not guess today; omit it. | |
| rate | No | Per-entry hourly rate override in workspace currency. Rare; omit normally. | |
| tags | No | ||
| start | No | ISO datetime or HH:MM (workspace timezone assumed if no offset). Optional. | |
| project | No | Project name, alias, or id. Fuzzy-matched server-side; returns candidates when ambiguous. Never auto-creates. | |
| billable | No | Defaults to the project's billable_default. | |
| duration | No | Lenient: "2h30m", "2.5", "150", "1:45", "90 min". Omit when start and end are given. | |
| description | No | What was done, in the user's words. Keep it short; this appears on invoices. | |
| idempotency_key | No | Optional. Retrying with the same key never double-logs. |
time.propose_entriesPropose time entries from activityARead-onlyIdempotentInspect
Use this when the user wants to reconstruct or catch up a day or week from calendar events, commits, pull requests, tickets, or notes you have already gathered from other tools or the user. Pass the raw activity; this returns proposed entries mapped to the user's projects with confidence scores, plus unmatched items, detected gaps, and overlaps. It saves nothing. Present the proposal, confirm with the user, then call time.log_entries_batch with the confirmed entry objects. Do not use for logging a single known entry (use time.log_entry).
| Name | Required | Description | Default |
|---|---|---|---|
| activity | Yes | ||
| date_range | No | Defaults to the span of the activity | |
| default_duration_min | No | For items without a duration. Default varies by source (calendar 60, git 30, tickets 45). | |
| target_hours_per_day | No | For gap detection. Default 8. | |
| already_logged_handling | No | Default "flag": include items that look already logged but mark them. |
time.reportHours and billing summaryARead-onlyIdempotentInspect
Use this when the user asks how many hours they worked, billable vs. non-billable, hours by day, project, or client, or how much is unbilled. Returns aggregates, not individual entries (use time.list_entries for those). Defaults to the current week in the workspace timezone. With group_by "day" this renders a week grid.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | ||
| project | No | ||
| end_date | No | ||
| group_by | No | Default "none". Use "day" for weekly views. | |
| start_date | No |
time.update_entryEdit a time entryADestructiveInspect
Use this when the user corrects a duration, description, project, date, times, tags, or billable flag on an existing entry. Requires the entry id (from time.list_entries or a previous log result). Cannot edit entries already on a sent invoice; returns an error explaining why. Returns the previous and updated entry.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| date | No | ||
| rate | No | ||
| tags | No | ||
| start | No | ||
| project | No | ||
| billable | No | ||
| duration | No | ||
| entry_id | Yes | ||
| description | No |
workspace.create_clientCreate a clientAInspect
Use this when the user names a client that does not exist and confirms it should be created, or asks to add a client with a rate or billing email. Do not create clients speculatively while logging time; ask first. Free plan allows one client; the error includes upgrade_url when the limit is hit.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| rate | No | Default hourly rate for this client, in workspace currency | |
| address | No | ||
| billing_email | No | ||
| net_terms_days | No | Default 30 |
workspace.create_projectCreate a projectAInspect
Use this when the user names a project that does not exist and confirms it should be created, or asks to add one with a rate. Aliases help future fuzzy matching ("acme site", "landing page"). Do not create projects speculatively; ask first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| rate | No | Hourly rate override; otherwise the client or workspace rate applies | |
| client | No | Client name or id. Required for invoicing. | |
| aliases | No | ||
| billable_default | No | Default true |
workspace.list_projectsList clients, projects, and ratesARead-onlyIdempotentInspect
Use this when the user asks what projects or clients exist, what a rate is, or when you need to resolve an ambiguous project name before logging time. Returns clients with their projects, aliases, and effective rates. Cheap to call. Prefer reading the workspace://context resource once if the host supports resources.
| Name | Required | Description | Default |
|---|---|---|---|
| include_archived | No |
Related MCP Connectors
Freelancer time tracking for AI assistants: log time, timers, timesheets, sign-off links, invoices.
Time tracking and invoicing for AI agents and their humans: track, log and bill work by agent.
Time tracking you talk to: log, check and fix your work hours from your AI assistant.
Tasks, timers and earnings for freelancers and agencies: your AI agent works where you get paid.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to manage time tracking directly, including starting and stopping timers, handling workspaces, projects, and tags, and generating PDF/CSV reports and invoices.233 npmMIT
- AlicenseBqualityCmaintenanceEnables Czech freelancers to issue legally complete invoices and credit notes, record expenses and payments, generate VAT and income-tax filings, and manage bookkeeping from an AI chat or a local dashboard.25MIT
- FlicenseNot gradedqualityBmaintenanceEnables tracking worked hours by client, project, and task, with monthly/daily reports and natural language interaction through Claude.-
- AlicenseAqualityBmaintenanceUseHourly is a free, open-source timesheet for freelancers. Log your day in seconds, then turn the hours into a PDF invoice. Its remote MCP server gives any AI assistant 30 tools to log and edit time, run timers, manage clients and projects, create invoices and read annual reports. It uses Streamable HTTP with bearer tokens that can be read-only or read-write, set to expire, and are revoked on a p30MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.