Skip to main content
Glama

Timesheet MCP Server

Simple timesheet automation server using Model Context Protocol (MCP) and NestJS.

Features

  • Fresh Token on Every Tool Call - Automatically refreshes authentication token on each request

  • Smart Authentication Handling - Seamlessly handles token expiration and re-authenticates using MCP client credentials

  • No Token Storage - Config file is deleted on server startup for security; fresh login on every session

  • Stateless Operation - Each tool call is independent and self-authenticating

  • 5 Essential Tools organized by domain:

    • Authentication: whoami - Get current user info, assigned projects, and modules

    • Timesheets: create_new_timesheet_entry, list_user_timesheet_entries

    • Activities: list_all_available_work_activities

    • Daily Updates: create_daily_scrum_standup_update

Quick Setup

1. Install Dependencies

npm install

2. Configure Environment

The server requires credentials to be configured in your MCP client's environment variables (not in a .env file on the server). This ensures credentials are never stored on the server.

TIMESHEET_USERNAME and TIMESHEET_PASSWORD must be configured in your MCP client configuration:

  • For Claude Desktop: Configure in claude_desktop_config.json (see below)

  • For OpenCode: Configure in the MCP environment variables

  • For MCP Inspector: Set as environment variables before running

Optional server-side .env file:

# Backend API (optional - defaults to https://timesheet.pinnacle.in:3000/api) API_BASE_URL=https://timesheet.pinnacle.in:3000/api # Node Environment NODE_ENV=production

Note: SSL certificate verification is automatically disabled in the code for self-signed certificates.

3. Build and Run

npm run build npm run start

Authentication

The server implements stateless, fresh authentication for every tool call:

  1. On Server Startup: Config file is deleted to ensure a clean state

  2. On Every Tool Call:

    • Attempts to use existing cached token (if available)

    • Automatically refreshes token via /auth/refresh endpoint

    • If token is expired or invalid, re-authenticates using TIMESHEET_USERNAME and TIMESHEET_PASSWORD from MCP client environment

    • If login fails, returns a clear error message

  3. No Token Persistence: Tokens are saved to config file temporarily but deleted on next server restart

This approach ensures:

  • ✅ Fresh authentication on every server session

  • ✅ Automatic token refresh without user intervention

  • ✅ Graceful handling of expired credentials

  • ✅ Clear error messages for troubleshooting

  • ✅ No sensitive data stored on disk between sessions

Available Tools

Authentication Tools

whoami

Get current authenticated user information with automatically fetched projects and modules. This tool:

  • Handles authentication automatically (refreshes token or logs in with MCP client credentials)

  • Returns fresh user details, all assigned projects, and modules within those projects

  • Provides clear error messages if credentials are missing or invalid

  • This is the primary starting tool for verifying authentication

Parameters: None

Response:

{ "success": true, "message": "✓ User authenticated successfully!", "data": { "user": { "id": 41, "name": "John Doe", "username": "john.doe@company.com", "email": "john.doe@company.com", "roles": ["RESOURCE"], "managerId": 44 }, "projects": [ { "id": 9, "name": "Project Name", "project_id": 9 } ], "modules": [ { "id": 41, "name": "Pyramid2.0_UI Gateway", "project_id": 9 } ] } }

Timesheet Management Tools

create_new_timesheet_entry

Create a new daily timesheet entry with work details.

Parameters:

  • project_id (number): Which project the work belongs to

  • module_id (number): Which module/component within the project

  • activity_id (number): The type of work (Development, Code Review, Testing, etc.)

  • start_time (string): Start time in HH:MM:SS format

  • end_time (string): End time in HH:MM:SS format

  • duration (number): Duration in minutes

  • description (string, min 10 chars): Detailed work description

  • date (string): Date in YYYY-MM-DD format

Example:

{ "project_id": 9, "module_id": 41, "activity_id": 11, "start_time": "09:00:00", "end_time": "10:00:00", "duration": 60, "description": "Working on user authentication module implementation", "date": "2025-11-04" }

list_user_timesheet_entries

Fetch and display user's timesheet entries with pagination.

Parameters:

  • page (number, optional, default: 1): Page number for pagination

  • limit (number, optional, default: 10, max: 100): Number of entries per page

Example:

{ "page": 1, "limit": 10 }

Activity Management Tools

list_all_available_work_activities

Get all available work activity types/categories that can be used when creating timesheet entries.

Parameters: None

Response:

{ "success": true, "message": "✓ Available work activities fetched successfully!", "data": [ { "id": 1, "name": "Development", "description": "Development work" }, { "id": 11, "name": "Code Review", "description": "Code review activities" } ] }

Daily Updates Tools

create_daily_scrum_standup_update

Create a daily scrum standup update to report progress and blockers.

Parameters:

  • date (string): Date in yyyy-MM-dd format

  • yesterdays_progress (string): Summary of work completed yesterday

  • todays_priorities (string): Main priorities and goals for today

  • task_blockers (string): Any blockers or impediments (or "None" if no blockers)

Example:

{ "date": "2025-11-04", "yesterdays_progress": "Completed user authentication module with tests", "todays_priorities": "Implement profile page and integrate with API", "task_blockers": "Waiting for backend API documentation" }

MCP Client Configuration

For Claude Desktop

Create/edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or appropriate config file for your OS:

{ "mcpServers": { "timesheet-mcp": { "command": "node", "args": ["/path/to/timesheet-mcp/dist/main.js"], "env": { "NODE_ENV": "production", "API_BASE_URL": "https://timesheet.pinnacle.in:3000/api", "TIMESHEET_USERNAME": "your.email@company.com", "TIMESHEET_PASSWORD": "your-password" } } } }

Windows Claude Desktop Path: %APPDATA%\Claude\claude_desktop_config.json Linux Claude Desktop Path: ~/.config/claude/claude_desktop_config.json

For OpenCode

Edit your OpenCode config file and add the MCP server configuration:

{ "$schema": "https://opencode.ai/config.json", "mcp": { "timesheet-mcp": { "type": "local", "command": ["node", "/path/to/timesheet-mcp/dist/main.js"], "enabled": true, "environment": { "NODE_ENV": "production", "API_BASE_URL": "https://timesheet.pinnacle.in:3000/api", "TIMESHEET_USERNAME": "your.email@company.com", "TIMESHEET_PASSWORD": "your-password" } } } }

Note: The "type": "local" field is required for OpenCode to recognize the MCP server.

For MCP Inspector

npm run inspector

Architecture

src/ ├── common/ # Shared utilities and DTOs │ └── utils/ │ └── response.util.ts # MCP response formatting utility ├── auth/ # Authentication module │ ├── auth.module.ts │ ├── auth.service.ts │ ├── auth.tools.ts # whoami tool │ ├── auto-login.service.ts │ └── dto/ │ └── login.dto.ts ├── projects/ # Project management module │ ├── projects.module.ts │ ├── projects.service.ts │ └── projects.tools.ts # Project-related tools ├── timesheets/ # Timesheet module │ ├── timesheets.module.ts │ ├── timesheets.service.ts │ ├── timesheets.tools.ts # Timesheet creation and listing tools │ └── dto/ │ └── create-timesheet.dto.ts ├── activities/ # Activity management module │ ├── activities.module.ts │ ├── activities.service.ts │ └── activities.tools.ts # Activity listing tool ├── daily-updates/ # Daily scrum module │ ├── daily-updates.module.ts │ ├── daily-updates.service.ts │ ├── daily-updates.tools.ts # Daily scrum tool │ └── dto/ │ └── create-daily-scrum.dto.ts ├── config/ # Configuration management ├── shared/ # HTTP client & shared utilities ├── main.ts # Application entry point └── app.module.ts # Main application module

Design Principles

  • Modular Architecture: Each domain (auth, projects, timesheets, etc.) is a separate module

  • Separation of Concerns: Services handle business logic, tools handle MCP interface

  • Descriptive Tool Names: Tool names clearly indicate what they do for LLM decision making

  • Response Utility: Centralized MCP response formatting for consistency

  • DTOs: Type-safe data transfer between layers

Philosophy

This MCP server provides simple API wrappers - no AI, no smart parsing, no complex workflows.

The LLM (Claude, GPT, etc.) handles all natural language processing and intelligence. The server just provides CRUD operations for the timesheet API.

API Endpoints Used

  • POST /api/auth/login - User authentication

  • GET /api/projects/user/{userId} - Get user projects

  • GET /api/modules/by-project?projectId={id} - Get project modules

  • GET /api/activities - Get all activities

  • POST /api/timesheets/create - Create timesheet entry

  • GET /api/timesheets/list/{userId} - Get user timesheets

License

MIT

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/arshad-khan1/Timesheet-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server