MCP server
The Timesheet MCP server lets you control your time tracking with natural language from AI assistants and editors. Start and stop timers, log past work, pull reports and exports, request time off, and manage projects by chatting in ChatGPT, Claude, Claude Code, Cursor, VS Code, and other tools that support the Model Context Protocol.
The MCP server requires a Pro plan or above, which includes API access. See the Plans page for the full comparison.
What is MCP
The Model Context Protocol (MCP) is an open standard that lets AI assistants connect to outside tools. The Timesheet MCP server exposes your account to the assistant, so when you say "start the timer for my website project", the assistant calls Timesheet to start it and confirms the result.
The server supports the current version of the protocol (2026-07-28) and the earlier ones, so it works with new and older clients alike.
Two ways to connect
| Hosted server | Local server | |
|---|---|---|
| Address | https://mcp.timesheet.io | Runs on your computer with npx @timesheet/mcp |
| Sign-in | Your Timesheet account (OAuth 2.1), or an API key | An API key |
| Use it with | Claude, ChatGPT, and clients that connect to a URL, such as Claude Code, Cursor, and VS Code | Claude Desktop, Claude Code, Cursor, VS Code, and other MCP clients |
| Requirements | None beyond your Pro plan | Node.js 20 or higher |
Both give the assistant the same tools. The same API key works for the hosted server, the local server, and the Timesheet API.
Connect ChatGPT
ChatGPT connects to the hosted server, so you do not need an API key or Node.js.
- In ChatGPT, turn on Developer mode. It is in the ChatGPT settings, and OpenAI moves it from time to time. See OpenAI's guide for its current location.
- Add a new connection and enter
https://mcp.timesheet.ioas the server URL. - When ChatGPT asks, sign in with your Timesheet account and allow access.
- Start a new chat and ask "What's my timer status?" to confirm the connection.
Whether you can turn on developer mode depends on your ChatGPT plan and workspace settings.
Connect Claude
Claude signs in with your Timesheet account, so you do not need an API key or Node.js.
Claude on the web and in the desktop app
- In Claude, open Customize > Connectors and select Add custom connector.
- Enter
https://mcp.timesheet.ioas the server URL and select Add. - Select Connect, sign in with your Timesheet account, and select Allow access.
- Start a new chat and ask "What's my timer status?" to confirm the connection.
On a Team or Enterprise plan, an owner first adds the connector under Organization settings > Connectors. Members then connect with their own Timesheet account.
Claude Code
-
Add the server:
claude mcp add --transport http --scope user timesheet https://mcp.timesheet.io -
In Claude Code, run
/mcp, select timesheet, and sign in with your Timesheet account.
--scope user makes the server available in all your projects. To connect with an API key instead, see Use the hosted server with an API key.
Get an API key
Claude and ChatGPT sign in with your Timesheet account. Other clients, and the local server, connect with an API key. One key works for the MCP server and the Timesheet API.
- Open the web app and go to Integrations > API Keys (see API keys).
- Select New API Key, give it a name, and choose when it expires.
- Copy the key and store it somewhere safe.
Your API key grants full access to your account. Never share it or commit it to version control. If it is ever exposed, delete it and create a new one.
Use the hosted server with an API key
Clients that connect to a URL can use the hosted server with your API key, so you do not need Node.js. The client sends the key in the Authorization header.
Claude Code
claude mcp add --transport http --scope user timesheet https://mcp.timesheet.io --header "Authorization: Bearer your-api-token-here"
Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"timesheet": {
"url": "https://mcp.timesheet.io",
"headers": {
"Authorization": "Bearer your-api-token-here"
}
}
}
}
VS Code
Add to your user mcp.json (MCP: Open User Configuration) or to .vscode/mcp.json:
{
"inputs": [
{
"type": "promptString",
"id": "timesheet-api-token",
"description": "Timesheet API key",
"password": true
}
],
"servers": {
"timesheet": {
"type": "http",
"url": "https://mcp.timesheet.io",
"headers": {
"Authorization": "Bearer ${input:timesheet-api-token}"
}
}
}
}
Install the local server
Add the Timesheet server to your client's MCP configuration, using the API key you just created. Restart the client after you change the configuration.
Claude Code
Run this command in your terminal:
claude mcp add timesheet --scope user -e TIMESHEET_API_TOKEN=your-api-token-here -- npx -y @timesheet/mcp
--scope user makes the server available in all your projects. Run claude mcp list to check that it is connected.
Claude Desktop
Edit the configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"timesheet": {
"command": "npx",
"args": ["-y", "@timesheet/mcp"],
"env": {
"TIMESHEET_API_TOKEN": "your-api-token-here"
}
}
}
}
Restart Claude Desktop, then ask "What's my timer status?" to confirm the connection.
Cursor
Add the server to ~/.cursor/mcp.json to use it in all projects, or to .cursor/mcp.json in a project to use it there only:
{
"mcpServers": {
"timesheet": {
"command": "npx",
"args": ["-y", "@timesheet/mcp"],
"env": {
"TIMESHEET_API_TOKEN": "your-api-token-here"
}
}
}
}
VS Code
Run MCP: Open User Configuration from the Command Palette to use the server in all workspaces, or create .vscode/mcp.json in a project. Add:
{
"inputs": [
{
"type": "promptString",
"id": "timesheet-api-token",
"description": "Timesheet API key",
"password": true
}
],
"servers": {
"timesheet": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@timesheet/mcp"],
"env": {
"TIMESHEET_API_TOKEN": "${input:timesheet-api-token}"
}
}
}
}
VS Code asks for your API key the first time the server starts and stores it securely, so the key is not saved in the file.
Other clients
Most MCP clients need the same three values:
- Command:
npx - Arguments:
-y @timesheet/mcp - Environment variable:
TIMESHEET_API_TOKENset to your API key
Global install (optional)
For faster startup, install the package once and point the command at it:
npm install -g @timesheet/mcp
{
"mcpServers": {
"timesheet": {
"command": "timesheet-mcp",
"env": {
"TIMESHEET_API_TOKEN": "your-api-token-here"
}
}
}
}
Example prompts
Once connected, talk to your assistant in plain language. The exact wording does not matter, the assistant interprets your intent.
- Timer: "Start the timer for the website project", "Pause my timer, I'm taking lunch", "Stop the timer", "What's my timer status?"
- Tasks: "Add a note: fixed the login bug", "Add a $45 expense for lunch with the client", "Mark the current task as billable".
- Projects: "Show my active projects", "Create a project called Website Redesign", "Archive the old website project".
- History: "What did I work on yesterday?", "Show this week's time entries", "Log 2 hours on the API project for Monday".
- Reports: "How many billable hours did I track in September?", "Export last month as an Excel file", "Email the September timesheet for Acme as a PDF to billing@acme.com".
- Time off and team: "Book me off next Friday", "Show my pending absence requests", "Who on my team is tracking right now?"
Interactive cards
In clients that support MCP Apps, such as ChatGPT and Claude, some results appear as interactive cards instead of plain text:
- Timer: the running timer with a live clock and buttons to pause, resume, or stop it.
- Time entries: the entry you added or changed, with project, time range, and duration.
- Statistics: your total and billable hours with a bar per project. Select Expand to see the charts.
- Exports: a confirmation when a report was sent, or a Download button when an export is ready.
- Absences: the request and its status. You can cancel a pending request directly in the card with Cancel request.
Clients without MCP Apps support, such as Claude Code, show the same information as text.
Available tools
The server provides more than 100 tools. The assistant picks the right ones for your request, so you do not need to name them.
Timer
| Tool | Description |
|---|---|
timer_start | Start a timer for a project, with an optional backdated start time |
timer_stop | Stop the running timer and complete the task |
timer_pause | Pause the timer for a break |
timer_resume | Resume the timer after a break |
timer_status | Check the current timer state |
timer_update | Update the running timer (description, location, billable status, tags) |
Task enhancements
| Tool | Description |
|---|---|
task_add_note | Add a note to the running task |
task_add_expense | Record an expense on the running task |
task_add_pause | Add a manual break to the running task |
Projects
| Tool | Description |
|---|---|
project_list | List projects, with optional filters (status, team, search) |
project_create | Create a project |
project_update | Update a project or archive it |
project_delete | Permanently delete a project |
project_get | Get details for a project |
Tasks
| Tool | Description |
|---|---|
task_list | List time entries, with date and project filters |
task_create | Create a manual time entry for past work |
task_update | Change a task's details, times, or billing status |
task_delete | Delete a time entry |
task_get | Get details for a task |
Reports and exports
| Tool | Description |
|---|---|
statistics_get | Totals, project breakdowns, and daily hours for a date range of up to one year |
export_generate | Export time entries as Excel, CSV, or PDF and get a download link |
export_send | Generate an export and send it to an email address |
export_report_types, export_fields | List the available report types and columns |
export_from_template, export_template_list, export_template_get, export_template_create, export_template_update, export_template_delete | Save export settings as templates and reuse them |
report_task_pdf, report_expense_pdf, report_note_pdf | PDF for a single task, expense, or note (the matching _get tools return the data) |
report_document_get, report_document_pdf, report_document_xml | Invoice or document data, PDF, or e-invoice XML (ZUGFeRD, XRechnung, ebInterface) |
Absences and contracts
| Tool | Description |
|---|---|
absence_list, absence_get | List absences, with filters for person, type, status, and dates |
absence_create, absence_update, absence_cancel, absence_delete | Request, change, cancel, or delete an absence |
absence_approve, absence_reject | Approve or reject a pending absence |
absence_type_list, absence_type_get, absence_type_create, absence_type_update, absence_type_delete | Manage absence types, such as vacation or sick leave |
contract_list, contract_get, contract_create, contract_update, contract_delete | Manage employment contracts |
contract_activate, contract_suspend, contract_reactivate, contract_terminate | Change a contract's status |
Todos, notes, expenses, and breaks
| Tool | Description |
|---|---|
todo_list, todo_get, todo_create, todo_update, todo_close, todo_reopen, todo_delete | Manage todos, and close or reopen them |
note_list, note_get, note_create, note_update, note_delete, note_file_url | Manage notes and download their attachments |
expense_list, expense_get, expense_create, expense_update, expense_delete, expense_refund, expense_file_url | Manage expenses, mark them as refunded, and download receipts |
pause_list, pause_get, pause_create, pause_update, pause_delete | Manage breaks on tasks |
Teams and organizations
| Tool | Description |
|---|---|
team_list | List teams |
team_member_list, team_member_get, team_member_add, team_member_update, team_member_remove | Manage team members and invitations |
team_member_status | See which team members are tracking time right now |
project_member_list, project_member_get, project_member_add, project_member_update, project_member_remove | Manage project members |
organization_list, organization_get, organization_create, organization_update, organization_delete | Manage organizations |
organization_member_list, organization_member_get, organization_member_add, organization_member_update, organization_member_remove | Manage organization members and invitations |
Tags, rates, and your account
| Tool | Description |
|---|---|
tag_list, tag_get, tag_create, tag_update, tag_delete | Manage tags |
rate_list, rate_get, rate_create, rate_update, rate_delete | Manage rates |
profile_get, profile_update | View and update your profile |
settings_get, settings_update | View and update your settings |
auth_configure | Configure API authentication instead of the environment variable (local server only) |
Troubleshooting
Nothing responds, or you get an authentication error. Check that TIMESHEET_API_TOKEN is set correctly, with no extra spaces or quotes, and that the key still exists in Integrations > API Keys. Create a new key if needed, then restart the client.
The command is not found. Confirm Node.js 20 or higher is installed (node --version). If npx cannot find the package, install it globally with npm install -g @timesheet/mcp and use timesheet-mcp as the command.
ChatGPT cannot add the connection. Check that developer mode is on and that the URL is exactly https://mcp.timesheet.io. Your Timesheet account needs a Pro plan for the tools to work.
A timer will not start. Make sure the project name matches an existing project, and that you have access to it. Ask "What's my timer status?" to test the connection on its own.
Security
The local server runs on your computer with your personal API key and talks directly to the Timesheet API, so the app does not need to be open. The hosted server does the same with your API key or your Timesheet sign-in.
In both cases the assistant acts with your account's permissions: it sees and changes only what you can see and change in the web app. It cannot change your subscription or billing. Many clients ask you to confirm each tool call, so check what the assistant is about to do, especially before it deletes something.
To revoke an API key, delete it in Integrations > API Keys. This disconnects every client and integration that uses the key, local or hosted. Then remove the server from your client's configuration. To disconnect ChatGPT, remove the connection in your ChatGPT settings.
See also
- mcp.timesheet.io: setup overview with an interactive demo.
- Integrations: API keys, webhooks, and the Integration Marketplace.
- npm: @timesheet/mcp and issues on GitHub.
- Model Context Protocol: the open standard behind this integration.