woffu-mcp
This server lets an AI assistant manage a Woffu time-tracking account: clock in/out, check status, review hours, and fill/confirm workday diaries.
Clock in/out:
woffu_clock_inandwoffu_clock_outstart/end the workday with no parameters.Today's status:
woffu_statusreturns current clock state, hours worked, schedule, and breaks.Summaries:
woffu_month_summaryandwoffu_week_summaryprovide worked-hours overviews with daily breakdowns.Day detail:
woffu_day_detailshows all clock events for a specific day.Pending days:
woffu_pending_dayslists workdays without logged hours for a month.Schedule:
woffu_schedulereturns the user's assigned work schedule.Complete past days:
woffu_complete_dayfills missing time entries (up to 2 slots) for past dates, with optional confirmation and force flags.Confirm/unconfirm days:
woffu_confirm_dayaccepts one or more diaries (with force option);woffu_unconfirm_dayreverts acceptance to unlock editing.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@woffu-mcp clock me in"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Woffu Server
A Model Context Protocol (MCP) server for Woffu time tracking integration. This server allows AI assistants like Claude to interact with your Woffu account for clock-in/out operations and time tracking management.
Features
Clock In/Out: Start and end your workday with simple commands
Today's Status: Check your current work status, hours worked, and schedule
Week/Month Summary: Get a comprehensive overview of your worked hours
Complete Past Days: Fill in missing time entries for past dates
Pending Days: View days without logged hours
Confirm Days: Confirm (accept) workday diaries
Related MCP server: WorkTracker MCP Server
Installation
Using npx from GitHub (recommended)
npx github:iflorit/mcp-woffu-serverInstalling globally from GitHub
npm install -g github:iflorit/mcp-woffu-server
mcp-woffu-serverFrom source
git clone https://github.com/iflorit/mcp-woffu-server.git
cd mcp-woffu-server
npm install
npm run buildConfiguration
The server requires the following environment variables:
Variable | Description | Required |
| JWT Bearer token for Woffu API | Yes |
| Your Woffu user ID | Yes |
| Woffu instance URL (e.g., | No (defaults to |
How to get your Woffu JWT Token
Log in to your Woffu web portal (e.g.,
https://mycompany.woffu.com)Open browser Developer Tools (F12)
Go to the Application tab (Chrome) or Storage tab (Firefox)
In the left panel, expand Cookies
Click on your Woffu domain (e.g.,
https://mycompany.woffu.com)Find the cookie named
woffu.tokenCopy the value - this is your
WOFFU_TOKEN
Alternative via Console:
document.cookie.split(';').find(c => c.trim().startsWith('woffu.token=')).split('=')[1]Note: JWT tokens expire periodically. You may need to refresh the token when it expires.
How to find your User ID
The User ID is embedded in the JWT token. You can decode it at jwt.io and look for the UserId field in the payload.
Alternatively:
In the browser Developer Tools, go to Network tab
Perform any action in Woffu
Look at any API request URL - it often contains your user ID (e.g.,
/api/users/1234567/...)
Usage
With Claude Desktop
Add the following to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"woffu": {
"command": "npx",
"args": ["-y", "github:iflorit/mcp-woffu-server"],
"env": {
"WOFFU_TOKEN": "your-jwt-token-here",
"WOFFU_USER_ID": "your-user-id",
"WOFFU_BASE_URL": "https://mycompany.woffu.com"
}
}
}
}With Claude Code
claude mcp add woffu --env WOFFU_TOKEN=your-token --env WOFFU_USER_ID=your-id --env WOFFU_BASE_URL=https://mycompany.woffu.com -- npx -y github:iflorit/mcp-woffu-serverOr add to your .claude.json:
{
"mcpServers": {
"woffu": {
"command": "npx",
"args": ["-y", "github:iflorit/mcp-woffu-server"],
"env": {
"WOFFU_TOKEN": "your-jwt-token-here",
"WOFFU_USER_ID": "your-user-id",
"WOFFU_BASE_URL": "https://mycompany.woffu.com"
}
}
}
}Running the Server Directly
# With environment variables
export WOFFU_TOKEN="your-token"
export WOFFU_USER_ID="your-user-id"
export WOFFU_BASE_URL="https://mycompany.woffu.com"
# Run the server
npx github:iflorit/mcp-woffu-serverAvailable Tools
woffu_clock_in
Clock in to start your workday.
Parameters: None
Example response:
{
"status": "success",
"action": "clock_in",
"timestamp": "2024-01-15T09:00:00",
"signEventId": "12345"
}woffu_clock_out
Clock out to end your workday.
Parameters: None
Example response:
{
"status": "success",
"action": "clock_out",
"timestamp": "2024-01-15T18:00:00",
"signEventId": "12346"
}woffu_status
Get today's work status including schedule and hours worked.
Parameters: None
Returns: Detailed workday information including:
Current clock status
Hours worked today
Expected hours
Break times
woffu_month_summary
Get a summary of worked hours for a specific month.
Parameters:
year(optional): Year (defaults to current year)month(optional): Month 1-12 (defaults to current month)
Returns: Monthly presence summary with daily breakdowns.
woffu_week_summary
Get a weekly summary of worked hours.
Parameters:
date(optional): Any date within the desired week in YYYY-MM-DD format
Returns: Weekly presence summary with daily breakdowns.
woffu_day_detail
Get detailed information for a specific day.
Parameters:
date(optional): Date in YYYY-MM-DD format (defaults to today)
Returns: Detailed day information including all clock events.
woffu_pending_days
Get days without completed hours.
Parameters:
year(optional): Year (defaults to current year)month(optional): Month 1-12 (defaults to current month)
Returns: List of workdays where no hours have been logged.
woffu_schedule
Get the user's assigned work schedule.
Parameters: None
Returns: Schedule information including work hours and office details.
woffu_complete_day
Edit time entries for a past day (at most 2 slots).
Woffu's slot endpoint can only edit signs that already exist: on a day with no clock in/out it answers 204 but persists nothing. The tool refuses to write at all unless the requested slots cover the day's scheduled hours (e.g. 8h) in at most 2 slots and the day already has persisted signs to edit. It then re-reads the persisted signs after writing and returns an error unless they cover the day's scheduled hours in at most 2 slots (verified carries the detail). Days with no signs must get their clock in/out created first (web or woffu_clock_in/woffu_clock_out).
When slots is omitted the tool targets a single block: the schedule's start time plus its working time (e.g. 08:00-16:00 for an 8h day, 09:00-15:00 for a 6h Friday). Surplus signs cannot be deleted through the API, so they are collapsed onto the block end as zero-length pairs; those pairs count neither as hours nor as slots. Woffu rejects (400 _SignAddError) sign times in the future, so today can only be filled once the block has ended.
Parameters:
date: Date in YYYY-MM-DD formatslots: List of up to 2 time slots within_timeandout_time(HH:MM format)confirm(optional, defaultfalse): confirm (accept) the day right after filling it. Only happens when the verification above passes.force(optional, defaultfalse): fill even if the day is a weekend, holiday, calendar event, or has absences/vacations (refused otherwise)
Example:
{
"date": "2024-01-10",
"slots": [
{"in_time": "09:00", "out_time": "14:00"},
{"in_time": "15:00", "out_time": "18:00"}
]
}woffu_confirm_day
Confirm (accept) one or more workday diaries, marking the day's records as reviewed by the employee. Already-confirmed days are skipped.
Refuses days whose persisted signs don't cover the scheduled hours (e.g. 8h) or aren't compacted into at most 2 slots, unless force: true. The response lists the reasons per date under not_ready.
Parameters:
dates: List of dates in YYYY-MM-DD formatforce(optional, defaultfalse): confirm even if the day is incomplete
Example:
{
"dates": ["2024-01-10", "2024-01-11"]
}woffu_unconfirm_day
Unconfirm (revert acceptance of) one or more workday diaries, unlocking them for editing again. Confirmed days are locked: woffu_complete_day refuses them until unconfirmed.
Parameters:
dates: List of dates in YYYY-MM-DD format
Example Conversations with Claude
"Clock me in to Woffu"
"What's my work status for today?"
"Show me my hours for November 2024"
"I forgot to clock in yesterday. Can you fill in 9:00-14:00 and 15:00-18:00 for 2024-01-14?"
"Show me my pending days this month"
Development
Setup
git clone https://github.com/iflorit/mcp-woffu-server.git
cd mcp-woffu-server
npm installBuilding
npm run buildRunning in development
npm run devTests
npm test # TypeScript guard tests + Python example testsUnattended agent example
examples/pi-agent/ is a cron-driven Python script
(no LLM, no dependencies) that keeps every workday signed as one block of the
scheduled hours and confirms it only when the hours match. It encodes the
API constraints documented above and ships with its own unit tests.
Security Notes
Never commit your JWT token to version control
Use environment variables or secure secret management
JWT tokens expire - refresh the token from the
woffu.tokencookie when neededThe server only accepts local connections by default
License
MIT License - see LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Acknowledgments
Built with the Model Context Protocol SDK
Integrates with Woffu time tracking
Available Tools
9 toolswoffu_clock_inA
Clock in (fichar entrada) to Woffu. Use when user wants to start workday.
Inputs: no named parameters.
woffu_clock_outA
Clock out (fichar salida) from Woffu. Use when user wants to end workday.
Inputs: no named parameters.
woffu_complete_dayA
Fill time entries for a past day. Cannot be used for today until after 17:00.
Inputs: date (required), slots (required).
woffu_day_detailA
Get detailed info for a specific day including all clock events.
Inputs: date.
woffu_month_summaryA
Get monthly summary of worked hours with daily breakdowns.
Inputs: year, month.
woffu_pending_daysA
Get workdays without logged hours (pending days).
Inputs: year, month.
woffu_scheduleB
Get the user's assigned work schedule.
Inputs: no named parameters.
woffu_statusA
Get today's work status: hours worked, schedule, clock state.
Inputs: no named parameters.
woffu_week_summaryA
Get weekly summary of worked hours.
Inputs: date.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Each tool targets a distinct aspect of time tracking: clock in/out, filling past days, viewing day/month/week details, summary, pending days, schedule, and status. No overlap in functionality.
All tools follow the pattern 'woffu_verb_noun' or 'woffu_noun' consistently, making it easy to predict tool purposes from names.
9 tools cover the core attendance tracking operations without being too many or too few. Each tool serves a clear need.
Covers clock in/out, filling past entries, summaries, schedule, and status. Minor gap: no direct edit or delete for clock events, but complete_day may handle corrections.
Maintenance
Related MCP Connectors
Manage multi-site crews, rosters, check-ins and timesheets in ZimQi from any MCP client.
Bizneo MCP server for ChatGPT, Claude and any AI agent: list absence requests, get absence balance, request absence, approve absence request, reject absence request, request remote work, approve remote work request and get my timetable in your own Bizneo account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Bizneo yourself; Cotlet does not store your password and you need no Bizneo API key. About the official Bizneo API: Yes, Bizneo has a documented REST API, HCM API v1 (checked 22 Oct 2026). It needs a token created in the app, and Bizneo says its API is available as an add-on. Setup and FAQ: https://cotlet.dev/integrations/bizneo-api-mcp-server
Manage Timequip projects, tasks, comments, members, and dashboards through MCP.
Connecteam MCP server for ChatGPT, Claude and any AI agent: list timesheets, approve timesheet, copy previous week, publish shifts, list time off requests, approve time off request, create task and send message in your own Connecteam account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Connecteam yourself; Cotlet does not store your password and you need no Connecteam API key. About the official Connecteam API: Connecteam has a REST API with read and write endpoints, but only on the Expert plan or higher, and its official MCP server only looks up API endpoints and cannot act on your account (checked 20 Oct 2026). Basic and Advanced plans get no API. Setup and FAQ: https://cotlet.dev/integrations/connecteam-api-mcp-server
Related MCP Servers
AlicenseBqualityBmaintenanceEnables natural language control of the Timesheet API for timer management, task tracking, and project management through MCP tools.50351 npm1MIT- AlicenseNot gradedqualityCmaintenanceEnables natural language time tracking and booking for WorkTracker via MCP tools, allowing users to assign time, list projects, and manage daily schedules through conversational commands.MIT
- AlicenseAqualityDmaintenanceEnables employee time tracking with clock-in/out, workday checking, and time log retrieval via MCP tools.41MIT
- AlicenseAqualityDmaintenanceAn MCP server to manage time tracking and time off on Woffu, allowing users to clock in days, view balances, request leave, and check team availability.912 npmMIT