A Model Context Protocol (MCP) server for interacting with the Noko time tracking API.
This MCP server allows Claude and other AI assistants to:
- List time entries with filtering options
- Create new time entries
- List projects
- List users
Add the following to your claude_desktop_config.json (located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"nokotime": {
"command": "npx",
"args": ["-y", "github:Lullabot/mcp-nokotime"],
"env": {
"NOKO_API_TOKEN": "your_noko_api_token"
}
}
}
}Replace your_noko_api_token with your Noko API token (found at nokotime.com → Profile → API token). Restart Claude Desktop after saving.
git clone https://github.com/Lullabot/mcp-nokotime.git
cd mcp-nokotime
npm install
npm run buildCreate a .env file with your token for running directly:
NOKO_API_TOKEN=your_noko_api_token
The server includes built-in safety features like requiring confirmation for destructive operations (edit/delete), so you don't need to worry about accidental modifications to your time entries.
npm startnpm run devThe server provides the following tools to AI assistants:
-
noko_list_entries- List time entries with optional filters and pagination- Optional parameters:
user_ids- Comma-separated list of user IDs to filter by (e.g., '1,2,3')project_ids- Comma-separated list of project IDs to filter by (e.g., '4,5,6')description- Filter entries containing this text in their descriptiontag_ids- Comma-separated list of tag IDs to filter by (e.g., '7,8,9')tag_filter_type- How to filter by tags: 'and' (default) or 'combination of'invoice_ids- Comma-separated list of invoice IDs to filter byimport_ids- Comma-separated list of import IDs to filter byfrom- Only include entries from or after this date (YYYY-MM-DD)to- Only include entries on or before this date (YYYY-MM-DD)invoiced- Filter by invoice status: true for invoiced entries, false for uninvoiced entriesinvoiced_at_from/invoiced_at_to- Filter by invoice date range (YYYY-MM-DD)updated_from/updated_to- Filter by update timestamp range (YYYY-MM-DDTHH:MM:SSZ)billable- Filter by billable status: true for billable entries, false for unbillable entriesapproved_at_from/approved_at_to- Filter by approval date range (YYYY-MM-DD)approved_by_ids- Comma-separated list of user IDs who approved entriesper_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Returns:
- Array of entry objects when no pagination is needed
- Object with
data(array of entries) andpaginationproperties when pagination is present - Pagination includes links to
first,last,next, andprevpages when available
- Optional parameters:
-
noko_create_entry- Create a new time entry- Required parameters:
date,minutes,description - Optional parameters:
project_id,user_id,billable,tags,invoice_id
- Required parameters:
-
noko_edit_entry- Edit an existing time entry- Required parameters:
id- ID of the entry to editconfirm- Must be set to true to confirm the edit operation
- Optional parameters:
date- Date of the entry in YYYY-MM-DD formatminutes- Duration of the entry in minutesdescription- Description of the work performedproject_id- ID of the project this entry belongs touser_id- ID of the user this entry belongs tobillable- Whether this entry is billabletags- Array of tags to associate with this entryinvoice_id- ID of an invoice to associate with this entry
- Required parameters:
-
noko_delete_entry- Delete a time entry permanently- Required parameters:
id- ID of the entry to deleteconfirm- Must be set to true to confirm the delete operation
- Note: Entries cannot be deleted if they have been invoiced, are associated with an archived project, or are approved and locked
- Required parameters:
-
noko_list_projects- List all available projects with optional filtering and pagination- Optional parameters:
name- Filter projects by name (partial matching)project_group_ids- Comma-separated list of project group IDs to filter by (e.g., '1,2,3')billing_increment- Filter by billing increment in minutes: "1", "5", "6", "10", "15", "20", "30", "60" (default: "15")enabled- Filter by project status: true for enabled projects, false for archived projectsbillable- Filter by billing status: true for billable projects, false for unbillable projectsper_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Returns:
- Array of project objects when no pagination is needed
- Object with
data(array of projects) andpaginationproperties when pagination is present - Pagination includes links to
first,last,next, andprevpages when available
- Optional parameters:
-
noko_list_users- List all users with optional filtering and pagination- Optional parameters:
name- Filter users by name (partial matching)email- Filter users by email (partial matching)state- Filter by account state: "disabled", "pending", "active", "suspended", or "all" (default: all)role- Filter by role: "supervisor", "leader", "coworker", or "contractor"per_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Returns:
- Array of user objects when no pagination is needed
- Object with
data(array of users) andpaginationproperties when pagination is present - Pagination includes links to
first,last,next, andprevpages when available
- Optional parameters:
The server also provides convenience tools for frequently used date ranges:
-
noko_get_project_entries_past_week- Get time entries for a project from the past 7 days- Required parameters:
project_id- ID of the project
- Optional parameters:
per_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Required parameters:
-
noko_get_project_entries_past_month- Get time entries for a project from the past 30 days- Required parameters:
project_id- ID of the project
- Optional parameters:
per_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Required parameters:
-
noko_get_project_entries_current_week- Get time entries for a project from the current week (Monday to Sunday)- Required parameters:
project_id- ID of the project
- Optional parameters:
per_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Required parameters:
-
noko_get_project_entries_date_range- Get time entries for a project with flexible date range presets- Required parameters:
project_id- ID of the projectperiod- Date range preset: 'past_week', 'past_month', 'current_week', 'current_month'
- Optional parameters:
per_page- Number of results per page (1-1000, default: 30)page- Page number (starts at 1)
- Required parameters:
The noko_list_entries tool now supports a date_preset parameter for quick date range selection:
date_preset- Choose from: 'past_week', 'past_month', 'current_week', 'current_month'- When provided, this automatically sets the
fromandtoparameters - Example:
noko_list_entries({ project_ids: [123], date_preset: 'past_week' })
The server provides MCP resources for easy data access:
noko://users- List of all usersnoko://user/{id}- Individual user detailsnoko://projects- List of all projectsnoko://project/{id}- Individual project detailsnoko://project/{projectId}/entries- All entries for a specific projectnoko://entries- All entries (requires additional filters)noko://entry/{id}- Individual entry details
noko://project/{projectId}/entries/week- Past 7 days entries for a projectnoko://project/{projectId}/entries/month- Past 30 days entries for a projectnoko://project/{projectId}/entries/current-week- Current week entries for a projectnoko://project/{projectId}/entries/current-month- Current month entries for a project
These resources automatically calculate date ranges and provide quick access to commonly requested time entry data.
Tools that perform destructive operations (like noko_edit_entry and noko_delete_entry) include a required confirm parameter which must be explicitly set to true before the operation will proceed.
When using an AI assistant like Claude with these tools:
- When you request a destructive action, the assistant will recognize that confirmation is required
- The assistant will ask you to confirm before proceeding with the operation
- Only after receiving your confirmation will the assistant set
confirm: trueand execute the operation
This provides an additional safety layer to prevent accidental modifications or deletions of your time entries.
Example interaction:
User: Delete time entry 12345
Assistant: I can help you delete entry #12345. This action is permanent and cannot be undone. Would you like to proceed?
User: Yes, please delete it
Assistant: [Executes deletion with confirm=true] Entry #12345 has been successfully deleted.
MIT