{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T17:51:37.749Z","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp","markdownUrl":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp.md","server":{"slug":"app-usehourly-usehourly","name":"UseHourly","registryName":"app.usehourly/usehourly","description":"Freelancer time tracking for AI assistants: log time, timers, timesheets, sign-off links, invoices.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"usehourly-mcp","type":"npm","identifier":"usehourly-mcp","withdrawn":false,"url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp","version":"1.1.0","transport":"stdio","scoredAt":"2026-11-05T03:11:24.049Z"},"score":{"total":80,"tier":"high trust","status":"scored","weekDelta":3,"history":[{"date":"2026-11-05","total":80},{"date":"2026-11-04","total":80},{"date":"2026-11-03","total":79},{"date":"2026-11-02","total":79},{"date":"2026-11-01","total":78},{"date":"2026-10-31","total":78},{"date":"2026-10-30","total":77},{"date":"2026-10-29","total":77},{"date":"2026-10-28","total":76},{"date":"2026-10-27","total":76},{"date":"2026-10-26","total":76},{"date":"2026-10-25","total":75},{"date":"2026-10-24","total":75},{"date":"2026-10-23","total":74},{"date":"2026-10-22","total":74},{"date":"2026-10-21","total":73},{"date":"2026-10-20","total":58},{"date":"2026-10-19","total":71},{"date":"2026-10-18","total":71},{"date":"2026-10-17","total":56}]},"categories":[{"name":"Supply Chain Security","score":100,"verdict":"pass","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","No install/post-install scripts declared.","No production dependencies, so there is no dependency health to assess."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.none","args":{}},{"code":"dephealth.no_dependencies","args":{"deps":"0","unhealthy":"0"}}]},{"name":"Provenance & Transparency","score":48,"verdict":"fail","reasons":["Source repository is publicly reachable at the declared URL.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 15 days ago).","Publishes a security disclosure policy (SECURITY.md)."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"15"}},{"code":"disclosure.present","args":{}}]},{"name":"Schema Quality & AI Usability","score":85,"verdict":"fail","reasons":["100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).","AI-judged instruction clarity (good).","Tool/resource definitions use about 2956 tokens (~86/item across 34 items; 32 tools + 2 resources), lean.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.descriptions","args":{"pct":"100"}},{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_lean","args":{"avg":"86","items":"34","tools":"32","tokens":"2956","resources":"2"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":63,"verdict":"partial","reasons":["Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"19"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description.","Structured output schemas are declared (100% of tools); any adoption earns full credit."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 34 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"3","destructive":"3"}},{"code":"toolsafety.manipulation_clean","args":{"units":"34","judged":"34"}}]},{"name":"Capabilities","score":60,"verdict":"fail","reasons":["Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28."],"codes":[{"code":"protocol.outdated","args":{"latest":"2026-07-28","version":"2025-06-18"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"api-mcp","type":"remote","identifier":"https://usehourly.app/api/mcp","withdrawn":false,"score":38,"current":false,"url":"https://verifymcp.io/servers/app-usehourly-usehourly/api-mcp","markdownUrl":"https://verifymcp.io/servers/app-usehourly-usehourly/api-mcp.md"},{"slug":"usehourly-mcp","type":"npm","identifier":"usehourly-mcp","withdrawn":false,"score":80,"current":true,"url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp","markdownUrl":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp.md"}],"facts":[{"label":"Registry","value":"npm"},{"label":"Package","value":"usehourly-mcp"},{"label":"Version","value":"1.1.0"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"whoami","title":"Who am I","description":"The signed-in account (name, email, currency, business details printed on invoices) and what this token may do (read or write). Call this first to confirm the connection.","inputs":[],"outputs":[{"name":"business","type":"object","required":true,"description":null},{"name":"currency","type":"string","required":true,"description":"ISO 4217 code every amount is in, e.g. USD or EUR"},{"name":"email","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"member_since","type":"string","required":true,"description":"ISO time the account was made"},{"name":"name","type":"string|null","required":true,"description":null},{"name":"token_access","type":"string","required":true,"description":"What this token may do"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":44},{"name":"list_projects","title":"List projects","description":"Every active project with its client and hourly rate. Use the \"label\" (\"Client / Project\") or the id wherever a project is asked for. Set include_archived to also see archived ones.","inputs":[{"name":"include_archived","type":"boolean","required":false,"description":"Also list archived projects"}],"outputs":[{"name":"archived","type":"array","required":false,"description":null},{"name":"projects","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":61},{"name":"list_clients","title":"List clients","description":"Active clients, each with its currency and its active projects. Rates are in the client's currency (its own, else the account's).","inputs":[],"outputs":[{"name":"clients","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":35},{"name":"get_client","title":"Get client billing details","description":"One client's billing details: full legal name and address as printed on invoices.","inputs":[{"name":"client","type":"string","required":true,"description":"Client id or exact client name"}],"outputs":[{"name":"address","type":"string|null","required":true,"description":null},{"name":"currency","type":"string","required":true,"description":"The currency this client's rates and invoices are in"},{"name":"has_logo","type":"boolean","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"legal_name","type":"string|null","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":36},{"name":"list_entries","title":"List time entries","description":"Time entries between two dates (inclusive), newest first, with totals per project and per day. Optionally limited to one project. Use this for 'what did I log last week' and to check a day before adding time.","inputs":[{"name":"from","type":"string","required":true,"description":"First day to include, YYYY-MM-DD"},{"name":"project","type":"string","required":false,"description":"Only this project: id or \"Client / Project\""},{"name":"to","type":"string","required":true,"description":"Last day to include (inclusive), YYYY-MM-DD"}],"outputs":[{"name":"entries","type":"array","required":true,"description":"Newest first, at most 500"},{"name":"from","type":"string","required":true,"description":null},{"name":"summary","type":"object","required":true,"description":null},{"name":"to","type":"string","required":true,"description":null},{"name":"truncated","type":"boolean","required":true,"description":"True when more than 500 entries matched"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":103},{"name":"project_totals","title":"Hours per project","description":"Logged hours per project: all time and within a date range (for example this month).","inputs":[{"name":"from","type":"string","required":true,"description":"First day of the range, YYYY-MM-DD"},{"name":"to","type":"string","required":true,"description":"Last day of the range (inclusive), YYYY-MM-DD"}],"outputs":[{"name":"from","type":"string","required":true,"description":null},{"name":"projects","type":"array","required":true,"description":null},{"name":"to","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":61},{"name":"get_running_timer","title":"Running timer","description":"The timer that is running now, with elapsed minutes, or null when none is running.","inputs":[],"outputs":[{"name":"running","type":null,"required":true,"description":"The running timer, or null"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":27},{"name":"annual_report","title":"Year summary for taxes","description":"One calendar year: hours and earnings by quarter, month, client and project, plus invoices issued and paid (cash and accrual views).","inputs":[{"name":"year","type":"integer","required":true,"description":"Calendar year, e.g. 2026"}],"outputs":[{"name":"clients","type":"array","required":true,"description":null},{"name":"invoices","type":"object","required":true,"description":"Invoices issued in the year (accrual view)"},{"name":"months","type":"array","required":true,"description":null},{"name":"outstanding","type":"object","required":true,"description":"Issued this year and still unpaid at year end"},{"name":"projects","type":"array","required":true,"description":null},{"name":"quarters","type":"array","required":true,"description":null},{"name":"received","type":"object","required":true,"description":"Payments received in the year (cash view)"},{"name":"totals","type":"object","required":true,"description":null},{"name":"year","type":"number","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":52},{"name":"list_invoices","title":"List invoices","description":"Invoice history (newest 200 at most), each with the currency it was issued in. Filter by text, client, paid status or issue-date range. unpaid_totals has one figure per currency; unpaid_total is only set when every match is in one currency.","inputs":[{"name":"client","type":"string","required":false,"description":"Only this client: id or exact name"},{"name":"issued_from","type":"string","required":false,"description":"Only invoices issued on or after this date"},{"name":"issued_to","type":"string","required":false,"description":"Only invoices issued on or before this date"},{"name":"query","type":"string","required":false,"description":"Matches number, client, notes, project names and entry notes"},{"name":"sort","type":"string","required":false,"description":"newest/oldest by issue date, highest/lowest by total"},{"name":"status","type":"string","required":false,"description":"Filter by whether the invoice has been paid"}],"outputs":[{"name":"count","type":"number","required":true,"description":null},{"name":"invoices","type":"array","required":true,"description":null},{"name":"unpaid_total","type":"number|null","required":true,"description":"Still unpaid across the matches, in their currency; null when the matches use more than one currency"},{"name":"unpaid_totals","type":"object","required":true,"description":"Still unpaid per currency code, e.g. { USD: 150 }"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":164},{"name":"get_invoice","title":"Get an invoice","description":"The frozen invoice as issued: seller, client, lines per project and totals. Set include_detail for the per-entry breakdown. Logos are left out.","inputs":[{"name":"include_detail","type":"boolean","required":false,"description":"Include the per-entry breakdown under the lines"},{"name":"invoice","type":"string","required":true,"description":"Invoice id or invoice number, e.g. INV-2026-004"}],"outputs":[{"name":"id","type":"string","required":true,"description":null},{"name":"snapshot","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":76},{"name":"next_invoice_number","title":"Next invoice number","description":"The suggested next invoice number for a year, such as INV-2026-004.","inputs":[{"name":"year","type":"integer","required":true,"description":"Year of the invoice issue date, e.g. 2026"}],"outputs":[{"name":"number","type":"string","required":true,"description":"For example INV-2026-004"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":47},{"name":"get_timesheet","title":"Get a timesheet","description":"The timesheet for a date range as a grid: one row per project, hours per day, totals per project and per day, and the weekdays with nothing logged. Optionally for one client or one project. Use this to 'show me my timesheet for last week' or to check a sheet before sharing it. Days marked non-billable still count here.","inputs":[{"name":"client","type":"string","required":false,"description":"Only this client: id or exact name"},{"name":"from","type":"string","required":true,"description":"First day to include, YYYY-MM-DD"},{"name":"project","type":"string","required":false,"description":"Only this project: id or \"Client / Project\""},{"name":"to","type":"string","required":true,"description":"Last day to include (inclusive), YYYY-MM-DD"}],"outputs":[{"name":"day_totals","type":"object","required":true,"description":"Hours per date across the rows"},{"name":"days","type":"array","required":true,"description":"The dates that have time logged, oldest first"},{"name":"from","type":"string","required":true,"description":null},{"name":"rows","type":"array","required":true,"description":null},{"name":"scope","type":"string","required":true,"description":"The client or project the sheet is for, or All clients"},{"name":"to","type":"string","required":true,"description":null},{"name":"total_hours","type":"number","required":true,"description":null},{"name":"weekdays_without_time","type":"array","required":true,"description":"Monday to Friday dates in the range with nothing logged"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":148},{"name":"parse_duration","title":"Parse a duration","description":"Turn text like \"1h30\", \"1:30\" or \"2.5\" into whole minutes, the way UseHourly reads it.","inputs":[{"name":"text","type":"string","required":true,"description":"The duration text to read, e.g. 1h30"}],"outputs":[{"name":"error","type":"string","required":false,"description":null},{"name":"hours","type":"number","required":false,"description":null},{"name":"minutes","type":"number|null","required":true,"description":"Whole minutes, or null when the text could not be read"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":58},{"name":"log_time","title":"Log time","description":"Add one time entry: a project, a date, how long, and what was done. Give minutes or a duration text. This adds a new entry; it never merges with an existing one. Check list_entries first if the day may already be logged.","inputs":[{"name":"date","type":"string","required":true,"description":"The day the work was done, YYYY-MM-DD"},{"name":"duration","type":"string","required":false,"description":"Duration text such as \"1h30\" (use this or minutes)"},{"name":"minutes","type":"integer","required":false,"description":"Whole minutes worked (use this or duration)"},{"name":"note","type":"string","required":false,"description":"What was done (max 2,000 characters)"},{"name":"project","type":"string","required":true,"description":"Project id, or \"Client / Project\" (just the project name works when it is unique)"}],"outputs":[{"name":"logged","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":156},{"name":"log_time_on_days","title":"Log the same time on several days","description":"Add the same entry (project, minutes, note) on up to 31 dates. Days that already have time for this project are skipped and reported unless skip_existing is false.","inputs":[{"name":"dates","type":"array","required":true,"description":"The days to log, YYYY-MM-DD (1 to 31 dates)"},{"name":"duration","type":"string","required":false,"description":"Duration text per day, such as \"1h30\" (use this or minutes)"},{"name":"minutes","type":"integer","required":false,"description":"Whole minutes per day (use this or duration)"},{"name":"note","type":"string","required":false,"description":"What was done (max 2,000 characters)"},{"name":"project","type":"string","required":true,"description":"Project id, or \"Client / Project\" (just the project name works when it is unique)"},{"name":"skip_existing","type":"boolean","required":false,"description":"Skip days that already have time for this project (default true)"}],"outputs":[{"name":"created","type":"number","required":true,"description":"Days that got an entry"},{"name":"minutes","type":"number","required":true,"description":"Minutes logged on each day"},{"name":"project","type":"string","required":true,"description":"\"Client / Project\""},{"name":"skipped","type":"array","required":true,"description":"Days skipped because they already had time"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":170},{"name":"set_day_totals","title":"Set a project's total for days","description":"Set one project's total minutes for up to 31 days: more than 0 creates or updates that day's single entry, 0 clears it. Days that hold several entries or a running timer are skipped and reported, never merged. A note, when given, is applied to every day written.","inputs":[{"name":"cells","type":"array","required":true,"description":"One item per day to set (1 to 31 days)"},{"name":"note","type":"string","required":false,"description":"Description applied to every day written"},{"name":"project","type":"string","required":true,"description":"Project id, or \"Client / Project\" (just the project name works when it is unique)"}],"outputs":[{"name":"created","type":"number","required":true,"description":null},{"name":"deleted","type":"number","required":true,"description":null},{"name":"project","type":"string","required":true,"description":"\"Client / Project\""},{"name":"skipped","type":"array","required":true,"description":"Days skipped: several entries or a running timer"},{"name":"updated","type":"number","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":127},{"name":"update_entry","title":"Edit an entry","description":"Change an entry's project, date, minutes or note. Only the fields you pass change.","inputs":[{"name":"date","type":"string","required":false,"description":"Move the entry to this day, YYYY-MM-DD"},{"name":"duration","type":"string","required":false,"description":"New duration text such as \"1h30\" (use this or minutes)"},{"name":"id","type":"string","required":true,"description":"The entry id (from list_entries)"},{"name":"minutes","type":"integer","required":false,"description":"New whole minutes (use this or duration)"},{"name":"note","type":"string","required":false,"description":"New description (max 2,000 characters)"},{"name":"project","type":"string","required":false,"description":"Move the entry to this project: id or \"Client / Project\""}],"outputs":[{"name":"updated","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":131},{"name":"merge_entries","title":"Merge entries","description":"Fold several entries (same project, same day) into the first one: minutes are added and notes joined. The others are removed.","inputs":[{"name":"ids","type":"array","required":true,"description":"Ids of the entries to merge; the first one is kept (2 to 20, same project and day)"}],"outputs":[{"name":"id","type":"string","required":true,"description":"The kept entry"},{"name":"merged","type":"number","required":true,"description":"How many entries were folded together"},{"name":"minutes","type":"number","required":true,"description":"Its new total"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":65},{"name":"delete_entry","title":"Delete an entry","description":"Permanently delete one time entry. Confirm with the user before calling this.","inputs":[{"name":"id","type":"string","required":true,"description":"The entry id (from list_entries)"}],"outputs":[{"name":"ok","type":"boolean","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":37},{"name":"start_timer","title":"Start the timer","description":"Start a timer on a project. A timer that is already running is stopped first, so only one runs at a time.","inputs":[{"name":"date","type":"string","required":true,"description":"The day the timer starts on, YYYY-MM-DD"},{"name":"note","type":"string","required":false,"description":"What is being worked on (max 2,000 characters)"},{"name":"project","type":"string","required":true,"description":"Project id, or \"Client / Project\" (just the project name works when it is unique)"}],"outputs":[{"name":"started","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":95},{"name":"stop_timer","title":"Stop the timer","description":"Stop the running timer. Elapsed time is rounded up to the next minute (at least 1).","inputs":[],"outputs":[{"name":"stopped","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":29},{"name":"create_client","title":"Create a client","description":"Add a client. Names are unique per account.","inputs":[{"name":"color","type":"string","required":false,"description":"Hex colour such as #6366f1"},{"name":"name","type":"string","required":true,"description":"The client's name (unique per account, max 80 characters)"}],"outputs":[{"name":"client","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":53},{"name":"update_client","title":"Edit a client","description":"Rename a client or change the legal name and address printed on its invoices. Only the fields you pass change; the logo is kept.","inputs":[{"name":"address","type":"string","required":false,"description":"Empty string clears it"},{"name":"client","type":"string","required":true,"description":"Client id or exact client name"},{"name":"legal_name","type":"string","required":false,"description":"Empty string clears it"},{"name":"name","type":"string","required":false,"description":"New display name"}],"outputs":[{"name":"client","type":"string","required":true,"description":"The client's name now"},{"name":"ok","type":"boolean","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":81},{"name":"archive_client","title":"Archive a client","description":"Hide a client from the lists. Its time and invoices are kept.","inputs":[{"name":"client","type":"string","required":true,"description":"Client id or exact client name"}],"outputs":[{"name":"archived","type":"string","required":true,"description":"The client's name"},{"name":"ok","type":"boolean","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":35},{"name":"create_project","title":"Create a project","description":"Add a project under a client, with an hourly rate in the client's currency (its own, else the account's) and whether it is billable.","inputs":[{"name":"billable","type":"boolean","required":false,"description":"Whether the time goes on invoices (default true)"},{"name":"client","type":"string","required":true,"description":"Client id or exact client name"},{"name":"hourly_rate","type":"number","required":false,"description":"Amount per hour in the client's currency (its own, else the account's), e.g. 85 or 62.5 (default 0)"},{"name":"name","type":"string","required":true,"description":"The project's name (max 80 characters)"}],"outputs":[{"name":"project","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":122},{"name":"update_project","title":"Edit a project","description":"Rename a project, move it to another client, or change its rate or billable flag. Only the fields you pass change.","inputs":[{"name":"billable","type":"boolean","required":false,"description":"Whether the time goes on invoices"},{"name":"client","type":"string","required":false,"description":"Move the project to this client"},{"name":"hourly_rate","type":"number","required":false,"description":"New amount per hour in the client's currency (its own, else the account's), e.g. 85 or 62.5"},{"name":"name","type":"string","required":false,"description":"New project name"},{"name":"project","type":"string","required":true,"description":"Project id, or \"Client / Project\" (just the project name works when it is unique)"}],"outputs":[{"name":"project","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":132},{"name":"archive_project","title":"Archive a project","description":"Hide a project from the lists. Its time and invoices are kept.","inputs":[{"name":"project","type":"string","required":true,"description":"Project id, or \"Client / Project\" (just the project name works when it is unique)"}],"outputs":[{"name":"archived","type":"string","required":true,"description":"\"Client / Project\""},{"name":"ok","type":"boolean","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":48},{"name":"unarchive_project","title":"Restore a project","description":"Bring an archived project (and its client, if archived) back.","inputs":[{"name":"project","type":"string","required":true,"description":"Archived project id or \"Client / Project\""}],"outputs":[{"name":"ok","type":"boolean","required":true,"description":null},{"name":"restored","type":"string","required":true,"description":"\"Client / Project\""}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":38},{"name":"create_invoice","title":"Create an invoice","description":"Issue an invoice for a client from billable time between two dates. Totals are computed on the server from the logged entries (one line per project). The number defaults to the next INV-<year>-NNN. This creates a permanent record; confirm the client, period and dates with the user first.","inputs":[{"name":"client","type":"string","required":true,"description":"Client id or exact client name"},{"name":"compact_notes","type":"boolean","required":false,"description":"Shorten entry descriptions to about 100 characters"},{"name":"due_date","type":null,"required":false,"description":"Payment due date, YYYY-MM-DD, or null for none"},{"name":"from","type":"string","required":true,"description":"First day of the billed period"},{"name":"include_detail","type":"boolean","required":false,"description":"Print each entry under the lines"},{"name":"issue_date","type":"string","required":true,"description":"The invoice date, YYYY-MM-DD"},{"name":"notes","type":"string","required":false,"description":"Notes printed on the invoice (max 1,000 characters)"},{"name":"number","type":"string","required":false,"description":"Invoice number; defaults to the next INV-<year>-NNN"},{"name":"to","type":"string","required":true,"description":"Last day of the billed period"}],"outputs":[{"name":"client","type":"string","required":true,"description":null},{"name":"hours","type":"number","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"lines","type":"array","required":true,"description":"One line per project"},{"name":"number","type":"string","required":true,"description":null},{"name":"period","type":"string","required":true,"description":"\"YYYY-MM-DD to YYYY-MM-DD\""},{"name":"total","type":"number","required":true,"description":"Dollars"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":214},{"name":"mark_invoice_paid","title":"Mark an invoice paid or unpaid","description":"Record the date an invoice was paid (this matters for cash-basis taxes), or pass null to mark it unpaid again.","inputs":[{"name":"invoice","type":"string","required":true,"description":"Invoice id or invoice number, e.g. INV-2026-004"},{"name":"paid_date","type":null,"required":true,"description":"YYYY-MM-DD, or null for unpaid"}],"outputs":[{"name":"ok","type":"boolean","required":true,"description":null},{"name":"paidDate","type":"string|null","required":true,"description":"The paid date, or null when marked unpaid"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":70},{"name":"delete_invoice","title":"Delete an invoice","description":"Permanently delete an invoice record. The time entries stay. Confirm with the user before calling this.","inputs":[{"name":"invoice","type":"string","required":true,"description":"Invoice id or invoice number, e.g. INV-2026-004"}],"outputs":[{"name":"ok","type":"boolean","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":50},{"name":"share_timesheet","title":"Create a timesheet link for a client","description":"Freeze the hours of a date range (optionally one client or project) into a private link a client can open without an account, read, print and approve. The link shows hours and, unless include_notes is false, the work descriptions; never rates or amounts. Anyone with the link can read it until it expires, so confirm the range, the client and whether to include notes with the user before calling. The link is returned only once: pass it on to the user. Not available on demo accounts.","inputs":[{"name":"client","type":"string","required":false,"description":"Only this client: id or exact name"},{"name":"expires_in_days","type":"number","required":false,"description":"How long the link works: 7, 30, 90 days (default 30)"},{"name":"from","type":"string","required":true,"description":"First day to include, YYYY-MM-DD"},{"name":"include_notes","type":"boolean","required":false,"description":"Show the work descriptions to the client (default true)"},{"name":"project","type":"string","required":false,"description":"Only this project: id or \"Client / Project\""},{"name":"title","type":"string","required":false,"description":"A heading for the sheet (default: client and dates)"},{"name":"to","type":"string","required":true,"description":"Last day to include (inclusive), YYYY-MM-DD"}],"outputs":[{"name":"expires_in_days","type":"number","required":true,"description":null},{"name":"from","type":"string","required":true,"description":null},{"name":"includes_notes","type":"boolean","required":true,"description":null},{"name":"note","type":"string","required":true,"description":null},{"name":"to","type":"string","required":true,"description":null},{"name":"url","type":"string","required":true,"description":"The private link to send to the client. Shown only once"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":240}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T03:11:24.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":null,"reasonLabel":null,"discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":0,"partial":false,"deprecated":null,"stale":null,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-17","recent":[{"id":"chg_01a1a489-f07b-7d61-b452-53c7d34b2abd","kind":"score.total_changed","summary":"Trust score (79 → 80)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a1a489-f07b-7d61-b452-53c7d34b2abd"},{"id":"chg_01a19a3d-22b1-728c-9c23-b039617304aa","kind":"score.total_changed","summary":"Trust score (78 → 79)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a19a3d-22b1-728c-9c23-b039617304aa"},{"id":"chg_01a18fef-cfa1-7458-8eba-b7a0eb02ea88","kind":"score.total_changed","summary":"Trust score (77 → 78)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a18fef-cfa1-7458-8eba-b7a0eb02ea88"},{"id":"chg_01a185a6-679f-7638-b901-8a1e906d3bf7","kind":"score.total_changed","summary":"Trust score (76 → 77)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a185a6-679f-7638-b901-8a1e906d3bf7"},{"id":"chg_01a17632-eca5-79c6-bb51-fbfa0b68f88b","kind":"score.total_changed","summary":"Trust score (75 → 76)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-26","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a17632-eca5-79c6-bb51-fbfa0b68f88b"},{"id":"chg_01a16be6-0f16-7aaf-819e-178f9a1da2c2","kind":"score.total_changed","summary":"Trust score (74 → 75)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a16be6-0f16-7aaf-819e-178f9a1da2c2"},{"id":"chg_01a16198-bd92-7285-90c6-98cd685b42da","kind":"score.total_changed","summary":"Trust score (73 → 74)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-22","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a16198-bd92-7285-90c6-98cd685b42da"},{"id":"chg_01a15c72-062f-7e03-8577-588a3fdf584c","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-21","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15c72-062f-7e03-8577-588a3fdf584c"},{"id":"chg_01a15c72-0631-76ea-a788-1538c30f7e48","kind":"score.total_changed","summary":"Trust score (58 → 73)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-10-21","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15c72-0631-76ea-a788-1538c30f7e48"},{"id":"chg_01a15ad5-765c-752a-b8d7-22244e95be3f","kind":"package.version_changed","summary":"Package version (1.0.1 → 1.1.0)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-20","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15ad5-765c-752a-b8d7-22244e95be3f"},{"id":"chg_01a15ad5-765c-711e-9056-f749c9e039c4","kind":"check.reverified","summary":"Stability (unverified → 0.10)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-20","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15ad5-765c-711e-9056-f749c9e039c4"},{"id":"chg_01a15ad5-765c-7a37-a46a-b7d221194d30","kind":"score.total_changed","summary":"Trust score (71 → 58)","materiality":"functional","direction":"regression","scoreDelta":-13,"occurredOn":"2026-10-20","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15ad5-765c-7a37-a46a-b7d221194d30"},{"id":"chg_01a15ad5-765a-76ae-97a1-298449630e50","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-20","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15ad5-765a-76ae-97a1-298449630e50"},{"id":"chg_01a15ad5-765b-7aff-ab48-3e71938a2fbf","kind":"check.measure","summary":"Schema quality (76 → 86)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-20","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a15ad5-765b-7aff-ab48-3e71938a2fbf"},{"id":"chg_01a14cfc-b530-7d34-8dff-0408a8f50133","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-18","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a14cfc-b530-7d34-8dff-0408a8f50133"},{"id":"chg_01a14cfc-b531-7573-a1e9-5b4fd0bfda69","kind":"score.total_changed","summary":"Trust score (56 → 71)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-10-18","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a14cfc-b531-7573-a1e9-5b4fd0bfda69"},{"id":"chg_01a14a57-94e0-7e9d-985a-8bb11681f437","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp#chg-chg_01a14a57-94e0-7e9d-985a-8bb11681f437"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp","markdown":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp.md","changelogJson":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/app-usehourly-usehourly/usehourly-mcp.xml","external":[{"label":"npm package","href":"https://www.npmjs.com/package/usehourly-mcp"},{"label":"Socket report","href":"https://socket.dev/npm/package/usehourly-mcp"},{"label":"Repository","href":"https://github.com/Zontak-LLC/usehourly"},{"label":"Website","href":"https://usehourly.app/"}]}}