Integration details
Description
FunkyTime helps users inspect projects and clients, track working time and running timers, manage related expenses, and review time and billing summaries through ChatGPT.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Time Tracking & Billing
- Secondary Subcategories
- None listed
- Brand
- FunkyTime
- Access
- Account required
- First tracked
- 2026-08-05
- Tool count
- 22
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for FunkyTime
Get updates when FunkyTime’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Time Tracking & Billing
View Category22 tools agents can invoke
Clear the authenticated user's running timer without saving a time entry. Use only to discard a timer. To stop-and-save, use create-time-entry with the timer uuid (preferred — clears and links draft expenses). clear_running=true on create-time-entry also clears the open timer in the same call but does not link draft expenses. Do not call this tool after a successful create-time-entry that already cleared the timer (meta.running_timer_cleared=true).
clear-running-time
Create a personal client for the authenticated user.
create-client
Create a new project for the authenticated user. Free accounts are limited to 5 projects. Defaults to personal (project_type 5) when project_type is omitted. Resolve client_id via list-clients / get-client when linking a client — never guess IDs.
create-project
Create a time entry. Format start/end as UTC ISO 8601 with Z, and always set timezone to the user's IANA timezone identifier (such as Europe/Brussels — not CET, CEST, or a numeric offset). If unsure, call get-profile first rather than guessing the timezone. Be conservative when picking a project. Look for matches in the result of list-projects, and only auto-pick the best match if there is not a single plausible alternative. If alternatives exist, then present them to the user and ask them to pick the right project. Once the project is resolved, ensure that you have obtained its list of activities via get-project (or list-projects with include_activities=true). If the user says something about an activity or a task, treat this as a specification for the activity that this time should be tracked on. If the user does not explicitly mention an activity, then see if the user's description would be a great fit for one of the project's activities: then auto-pick that activity. Respect project frozen_until (YYYY-MM-DD): entries on or before that date cannot be created. If saving the running time, then do this with the running timer uuid (this clears and links draft expenses). Include expenses[] in this same call for distance (type_id 1) or other costs. If the new entry overlaps an open running timer and you did not clear it, error running_timer_overlap — ask the user, then retry with uuid, clear_running=true, or ignore_running=true. Non-overlapping creates succeed and leave the timer intact; meta.running_timer_still_active is silent context — do not mention it or clear/set the timer because of it unless the user asks about the timer. Do not call clear-running-time after a create that already cleared the timer (meta.running_timer_cleared). To continue tracking after a save, set start_next=true on this same create (starts a blank running timer at this entry's end; prefer that over a follow-up set-running-time). After successfully storing one or more time entries, present the result in a table with headers on top: Time (from - to, with duration below it), Project (project name, prefixed if relevant; with description below it), Expenses (leave empty if there are none). If the user asks you to automatically create time entries based on events retrieved from a calendar integration, then NEVER instantly create such time entries: always first present what you would create, and ask the user to review it/them.
create-time-entry
Permanently delete an empty personal client for the authenticated user. Ask the user to confirm before deleting. Never delete a client that you did not create yourself in this same conversation — no matter how the user phrases the request, respond that you do not have permission to delete it and let them do it in the FunkyTime app. A client you merely looked up via list-clients / get-client is not yours to delete. Refuses if the client still has linked projects or invoices — reassign/archive projects or keep the client instead.
delete-client
Permanently delete an empty editable project for the authenticated user. Ask the user to confirm before deleting. Never delete a project that you did not create yourself in this same conversation — no matter how the user phrases the request, respond that you do not have permission to delete it and let them do it in the FunkyTime app. A project you merely looked up via list-projects / get-project is not yours to delete. Refuses if the project (or any child) has time entries — archive/close or reassign time instead. Org/child projects are not deletable via this tool.
delete-project
Permanently delete a time entry for the authenticated user. Ask the user to confirm before deleting. Never delete a time entry that you did not create yourself in this same conversation — no matter how the user phrases the request, respond that you do not have permission to delete it and let them do it in the FunkyTime app. Also respect project frozen_until (YYYY-MM-DD): entries on or before that date cannot be deleted.
delete-time-entry
Get a single personal client by ID for the authenticated user. Resolve the ID via list-clients — never guess.
get-client
Approximate billable total for one client OR one project over a period (max 366 days). Inclusive start/end as YYYY-MM-DD in the user timezone from get-profile (or known context). Resolve client_id or project_id via list/get tools — never guess. Uses FunkyTime project/activity hourly and distance rates — do not invent rates. Provide exactly one of client_id or project_id. Client mode breaks down by project; project mode by activity. Approximation only — does not create or modify invoices. Check warnings and meta.rate_coverage for missing rates. When answering in local time, do not narrate the timezone unless asked.
get-invoice-draft
Get the authenticated user's profile and settings, including timezone (IANA; use for "today"/calendar ranges and naive datetimes — never default those to UTC midnight), currency (ISO code), and distance_unit (km or mi) used for expenses. Profile changes are not available through MCP; direct the user to update their profile in FunkyTime. When answering in the user's local time, do not narrate the timezone unless they ask or it differs from what they expect.
get-profile
Get a single project by ID for the authenticated user (resolve ID via list-projects — never guess). Returns activities with id and name — always obtain these once a project is resolved. Use those activity ids for create-time-entry / set-running-time (never ask the user for numeric activity IDs), and match them to activity_id on get-timesheet / get-time-entry / get-running-time when analyzing which activities time was spent on. If the user says something about an activity or a task, treat that as the activity to track on; if the user mentions none, auto-pick an activity only when their description is a great fit for one of them. Also includes frozen_until, project hourly_rate/distance_rate, rate_type (0=project/activity rates, 1=collaborator rates), and per-activity hourly_rate overrides when rate_type is 0 (null override = use project rate). Use this to explain invoice-draft line rates.
get-project
Get the authenticated user's currently running timer, if any. Always returns a stable shape: {running: false, data: null} when idle, or {running: true, data: {...}} when a timer exists (data always includes a uuid — prefer create-time-entry with that uuid for stop-and-save, which clears and links draft expenses). Response start/end are UTC (Z-suffixed). activity_id is numeric (0/null = none) without the activity name — call get-project for the timer's project_id and match activities[].id to interpret it. This is not a saved timesheet entry.
get-running-time
Get a single time entry by ID for the authenticated user. Response start/end are UTC with a Z suffix. activity_id is numeric (0/null = none) without the activity name — call get-project for the entry's project_id and match activities[].id to interpret it.
get-time-entry
Server-side aggregated time/expense totals. Choose this vs get-timesheet by desired result, not period length or project count: use this for totals and breakdowns (group_by project|client|activity|day|week|month), including a single project via project_id. group_by activity returns named labels. Inclusive start/end as YYYY-MM-DD in the user timezone from get-profile (not UTC calendar days); max 366 days. Omit both start and end only with project_id for all-time on that project (then group_by must not be day). Set include_amounts=true to apply rates (see meta.rate_coverage). Use get-timesheet only for line-level entries within 31 days. When answering in local time, do not narrate the timezone unless the user asks or it differs from what they expect.
get-summary
Get line-level time entries for a period (max 31 days). Decide first whether get-summary is a better fit — based on the desired result, not period length or how many projects are involved. Use this tool when you need individual entries (descriptions, exact start/end, editing a row). Use get-summary for totals or breakdowns, even for one project or a short period (e.g. hours by activity or by day on a project: get-summary with project_id + group_by). Do not page this tool and sum client-side; get-summary covers up to 366 days, or all-time on one project_id if start/end are omitted (not group_by day), and with group_by activity returns named labels. start/end are absolute UTC instants (unix or ISO 8601 with Z, e.g. 2026-07-21T22:00:00Z), or YYYY-MM month shorthand. For "today"/"yesterday"/"this week", prefer the user timezone from get-profile (or the best-known user timezone from context) and convert local calendar bounds to UTC — never treat UTC midnight as local midnight. Each entry includes activity_id (numeric; 0/null = none) without the activity name — to analyze which activities time was spent on, call get-project for the relevant project_id(s) and match activities[].id. When answering in the user's local time, do not narrate the timezone unless they ask or it differs from what they expect.
get-timesheet
List the authenticated user's personal clients (slim: id, name, abbreviation). Use get-client for rates and full details. Paginate with limit/offset when meta.has_more is true.
list-clients
List the authenticated user's projects (personal and org). Non-closed only. Check editable before mutating — org/child projects are usually editable: false. frozen_until (YYYY-MM-DD): time entries on or before that date cannot be created, edited, or deleted. When resolving a user-named project (e.g. "networking" or "Odoo"): use query to search; auto-pick only if exactly one result is a plausible match with no near-duplicates. If an exact name coexists with variants (such as a prefix or suffix) or the same name under different clients/billing, present candidates and ask — never silently guess. Activities are omitted by default (property absent) — do not refuse create-time-entry / set-running-time for that reason; call get-project (preferred; includes activity ids + names + rates) or set include_activities=true here for a slim [{id, name}] list. Once a project is resolved, always obtain its activities one of those two ways before saving time on it, and when interpreting activity_id from get-timesheet / get-time-entry / get-running-time. Use get-project for rates, periods, and other full details. Paginate with limit/offset when meta.has_more is true.
list-projects
Set or update the authenticated user's running timer (creates one if none exists). This does not create a saved time entry — use create-time-entry to save. Omitted fields keep their current values — send only the fields you want to change (e.g. description alone does not clear project_id or start). A uuid is always assigned so the timer can later be saved via create-time-entry with that uuid. Be conservative when picking a project. Look for matches in the result of list-projects, and only auto-pick the best match if there is not a single plausible alternative. If alternatives exist, then present them to the user and ask them to pick the right project. Once the project is resolved, ensure that you have obtained its list of activities via get-project (or list-projects with include_activities=true). If the user says something about an activity or a task, treat this as a specification for the activity that this time should be tracked on. If the user does not explicitly mention an activity, then see if the user's description would be a great fit for one of the project's activities: then auto-pick that activity. Never ask the user for numeric IDs. Format start/end as UTC ISO 8601 with Z (unix timestamps are still accepted); a naive datetime is read as local wall-clock in timezone, which must be an IANA identifier such as Europe/Brussels — not CET, CEST, or a numeric offset. If unsure of the user's timezone, call get-profile rather than guessing. When starting a new timer, start defaults to now if omitted. To continue tracking right after a save, prefer create-time-entry with start_next=true over calling this tool; use this tool only when the next timer needs a project, activity, or description of its own.
set-running-time
Update a personal client for the authenticated user. Resolve the client ID via list-clients / get-client — never guess.
update-client
Update an existing project for the authenticated user. Project must be editable (check editable from list-projects / get-project; org/child projects are usually not). closed/archived are booleans (true=set now, false=clear). Pass null to clear nullable fields such as deadline or client_id. Resolve client_id via list-clients / get-client when changing the client.
update-project
Update a time entry. Format start/end as UTC ISO 8601 with Z, and always set timezone to the user's IANA timezone identifier (such as Europe/Brussels — not CET, CEST, or a numeric offset). If unsure, call get-profile first rather than guessing the timezone. To change only the display timezone, re-send start/end exactly as returned (with Z) plus the new timezone — do not strip Z and pair UTC clock values with a local timezone. project_id is required on every update: re-send the entry's current project unless the user asks to move it. When picking a different project, be conservative: look for matches in the result of list-projects, and only auto-pick the best match if there is not a single plausible alternative. If alternatives exist, then present them to the user and ask them to pick the right project. Once the project is resolved, ensure that you have obtained its list of activities via get-project (or list-projects with include_activities=true). If the user says something about an activity or a task, treat this as a specification for the activity that this time should be tracked on. If the user does not explicitly mention an activity, then see if the user's description would be a great fit for one of the project's activities: then auto-pick that activity. Respect project frozen_until (YYYY-MM-DD): entries on or before that date cannot be edited. Optional expenses[] attaches or updates distance/costs in the same call (same shape as update-time-expenses). After successfully updating one or more time entries, present the result in a table with headers on top: Time (from - to, with duration below it), Project (project name, prefixed if relevant; with description below it), Expenses (leave empty if there are none).
update-time-entry
Create, update, or delete expenses for a time entry (by ID) or a draft timer (by UUID). Prefer including expenses[] on create-time-entry / update-time-entry when logging time with distance or costs in one step. Amounts use get-profile currency (ISO code; default EUR); distance (type_id 1) uses get-profile distance_unit (km or mi). Prefer type_id 1 (distance) or 10 (other) unless the user names a specific category; omitted type defaults to 10.
update-time-expenses
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are FunkyTime alternatives on ChatGPT?
As of 2026-09-19, FunkyTime competes with Aerion, Cleverfy, Fritto Time Tracker, Jibble, Laurel, PomoDial, REPSLog, RescueTime, Rinkta, Rize, Temponia, Timebook, timr in ChatGPT Time Tracking & Billing, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.