Koskamo

ShiftSum Time Card MCP

A time card calculator for hours worked, lunch breaks, overtime, and gross pay, with CSV and PDF timesheets. It handles multiple in and out punches per day, overnight shifts, and various overtime rules.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

ShiftSum Time Card MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://time-card.zovo.one/mcp
Vendor documentation

What you can do with it

  • Calculate hours worked from clock-in and clock-out times
  • Compute overtime pay based on US federal or California rules
  • Generate printable PDF timesheets with signature lines
  • Export time data to CSV format

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
time-card 1.0.0
MCP protocol
2025-06-18
Tools
1 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

ShiftSum Time Card is a time card calculator: it totals hours worked from clock-in/clock-out punches (multiple in and out per day, overnight shifts, unpaid lunch breaks), splits regular, overtime, and double time per workweek, computes gross pay to the cent, and exports a CSV and a printable PDF timesheet. Call calculate_hours once with every day of the period; re-call it with the full list when the user edits a day.

Tools

1 advertised

calculate_hours — Calculate hours worked
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants a time card calculator or hours worked calculator: totaling clock-in/clock-out times for a day, week, or biweekly period, with lunch breaks, multiple in and out punches per day, overnight shifts, 12-hour or 24-hour (military) time, punch rounding (nearest 5/6/15 minutes or the 7-minute rule), overtime and double time per workweek (US federal 40 h, California daily rules, or custom), and gross pay from an hourly rate. Pass times as the user wrote them; times without am/pm ("9 to 5") are resolved and the reading is returned in assumptions for the user to confirm. Returns per-day hours in H:MM and decimal, regular/overtime/double-time split, totals, exact gross pay, warnings (overlapping punches, missing clock-out, shifts over 16 h), and CSV and printable PDF timesheet links. Does not compute taxes or take-home pay, give legal advice about breaks or overtime, track time live, or set reminders. Do not use for simple unit conversions without clock times.

calculate_hours input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "entries"
  ],
  "properties": {
    "entries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "day",
          "punches"
        ],
        "properties": {
          "day": {
            "type": "string",
            "maxLength": 40,
            "description": "Day label: an ISO date \"2026-09-28\", a weekday \"Mon\", or both \"Mon 2026-09-28\". Dates give exact workweeks for biweekly periods."
          },
          "week": {
            "type": "integer",
            "maximum": 10,
            "minimum": 1,
            "description": "Optional workweek number (1, 2) when days have no dates and the grouping is not obvious, e.g. 2 for the second week of a biweekly period."
          },
          "punches": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "start"
              ],
              "properties": {
                "end": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 20
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Clock-out time in the same formats, e.g. \"17:30\" or \"5:30 pm\". An end earlier than the start means the shift crossed midnight (22:00 to 06:30). Leave out if the person has not clocked out yet."
                },
                "start": {
                  "type": "string",
                  "maxLength": 20,
                  "description": "Clock-in time, 24-hour or 12-hour with am/pm, e.g. \"8:45\", \"17:30\", \"0730\", \"9:15 am\"."
                }
              }
            },
            "maxItems": 8,
            "description": "In/out pairs for this day, in order. Use several pairs for split shifts or a clocked-out lunch, e.g. [{\"start\":\"8:00\",\"end\":\"12:00\"},{\"start\":\"12:30\",\"end\":\"17:00\"}]. Empty list = day off."
          },
          "unpaid_break_minutes": {
            "type": "integer",
            "maximum": 720,
            "minimum": 0,
            "description": "Unpaid break or lunch minutes to subtract from this day, e.g. 30. Do not also add it as a separate punch gap."
          }
        }
      },
      "maxItems": 62,
      "minItems": 1,
      "description": "One item per worked day (up to 62, e.g. a biweekly or monthly time card). Example: [{\"day\":\"Mon\",\"punches\":[{\"start\":\"8:45\",\"end\":\"17:30\"}],\"unpaid_break_minutes\":30}]."
    },
    "currency": {
      "type": "string",
      "maxLength": 3,
      "description": "ISO currency code for pay amounts, default USD, e.g. EUR or GBP."
    },
    "rounding": {
      "enum": [
        "none",
        "nearest_5",
        "nearest_6",
        "nearest_15",
        "seven_minute_rule"
      ],
      "type": "string",
      "description": "Punch rounding applied to each clock-in and clock-out: none (default), nearest_5, nearest_6 (tenth of an hour), nearest_15, or seven_minute_rule (8:07 -> 8:00, 8:08 -> 8:15)."
    },
    "pay_period": {
      "type": "string",
      "maxLength": 60,
      "description": "Optional pay period label printed on the timesheet, e.g. \"Sep 28 - Oct 11, 2026\" or \"Week 40\"."
    },
    "hourly_rate": {
      "type": "number",
      "maximum": 1000000,
      "minimum": 0,
      "description": "Optional regular hourly pay rate in the chosen currency for gross pay, e.g. 18.50 (USD) or 1100 (JPY). Leave out for hours only."
    },
    "week_start_day": {
      "enum": [
        "sun",
        "mon",
        "tue",
        "wed",
        "thu",
        "fri",
        "sat"
      ],
      "type": "string",
      "description": "First day of the workweek for dated entries, e.g. \"sun\". Default: the weekday of the earliest date."
    },
    "overtime_preset": {
      "enum": [
        "us_federal",
        "california",
        "none"
      ],
      "type": "string",
      "description": "Overtime rule set. us_federal (default): over 40 h per workweek at 1.5x. california: over 8 h/day and 40 h/week at 1.5x, over 12 h/day at 2x, plus the 7th-consecutive-day rule. none: no overtime split."
    },
    "seventh_day_rule": {
      "type": "boolean",
      "description": "California 7th-consecutive-day rule: on the 7th straight workday of a workweek the first 8 h are overtime and the rest double time. Default on for california, off otherwise."
    },
    "overtime_multiplier": {
      "type": "number",
      "maximum": 5,
      "minimum": 1,
      "description": "Overtime pay multiplier, default 1.5."
    },
    "double_time_multiplier": {
      "type": "number",
      "maximum": 5,
      "minimum": 1,
      "description": "Double-time pay multiplier, default 2."
    },
    "daily_overtime_after_hours": {
      "type": "number",
      "maximum": 24,
      "minimum": 0,
      "description": "Override the daily overtime threshold in hours, e.g. 8 (Alaska, Nevada) or 12 (Colorado). 0 turns daily overtime off."
    },
    "weekly_overtime_after_hours": {
      "type": "number",
      "maximum": 168,
      "minimum": 0,
      "description": "Override the weekly overtime threshold in hours, e.g. 40 or 37.5. 0 turns weekly overtime off."
    },
    "daily_double_time_after_hours": {
      "type": "number",
      "maximum": 24,
      "minimum": 0,
      "description": "Override the daily double-time threshold in hours, e.g. 12. 0 turns double time off."
    }
  }
}
calculate_hours output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "pay_period",
    "days",
    "weeks",
    "totals",
    "pay",
    "settings",
    "assumptions",
    "warnings",
    "note",
    "downloads"
  ],
  "properties": {
    "pay": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "hourly_rate",
            "currency",
            "regular_pay",
            "overtime_pay",
            "double_time_pay",
            "gross_pay",
            "formatted"
          ],
          "properties": {
            "currency": {
              "type": "string"
            },
            "formatted": {
              "type": "object",
              "required": [
                "hourly_rate",
                "regular_pay",
                "overtime_pay",
                "double_time_pay",
                "gross_pay"
              ],
              "properties": {
                "gross_pay": {
                  "type": "string"
                },
                "hourly_rate": {
                  "type": "string"
                },
                "regular_pay": {
                  "type": "string"
                },
                "overtime_pay": {
                  "type": "string"
                },
                "double_time_pay": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            },
            "gross_pay": {
              "type": "number"
            },
            "hourly_rate": {
              "type": "number"
            },
            "regular_pay": {
              "type": "number"
            },
            "overtime_pay": {
              "type": "number"
            },
            "double_time_pay": {
              "type": "number"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "days": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "label",
          "display",
          "date",
          "week",
          "punches",
          "break_minutes",
          "minutes",
          "hhmm",
          "decimal",
          "regular",
          "overtime",
          "double_time",
          "seventh_day",
          "flags"
        ],
        "properties": {
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "hhmm": {
            "type": "string"
          },
          "week": {
            "type": "number"
          },
          "flags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "label": {
            "type": "string"
          },
          "decimal": {
            "type": "number"
          },
          "display": {
            "type": "string"
          },
          "minutes": {
            "type": "number"
          },
          "punches": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "in",
                "out",
                "in_rounded",
                "out_rounded",
                "next_day",
                "hhmm"
              ],
              "properties": {
                "in": {
                  "type": "string"
                },
                "out": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "hhmm": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "next_day": {
                  "type": "boolean"
                },
                "in_rounded": {
                  "type": "string"
                },
                "out_rounded": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "additionalProperties": false
            }
          },
          "regular": {
            "type": "number"
          },
          "overtime": {
            "type": "number"
          },
          "double_time": {
            "type": "number"
          },
          "seventh_day": {
            "type": "boolean"
          },
          "break_minutes": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "note": {
      "type": "string"
    },
    "weeks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "week",
          "label",
          "minutes",
          "hhmm",
          "decimal",
          "regular",
          "overtime",
          "double_time"
        ],
        "properties": {
          "hhmm": {
            "type": "string"
          },
          "week": {
            "type": "number"
          },
          "label": {
            "type": "string"
          },
          "decimal": {
            "type": "number"
          },
          "minutes": {
            "type": "number"
          },
          "regular": {
            "type": "number"
          },
          "overtime": {
            "type": "number"
          },
          "double_time": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "totals": {
      "type": "object",
      "required": [
        "minutes",
        "hhmm",
        "decimal",
        "regular",
        "overtime",
        "double_time",
        "regular_hhmm",
        "overtime_hhmm",
        "double_time_hhmm",
        "days_worked"
      ],
      "properties": {
        "hhmm": {
          "type": "string"
        },
        "decimal": {
          "type": "number"
        },
        "minutes": {
          "type": "number"
        },
        "regular": {
          "type": "number"
        },
        "overtime": {
          "type": "number"
        },
        "days_worked": {
          "type": "number"
        },
        "double_time": {
          "type": "number"
        },
        "regular_hhmm": {
          "type": "string"
        },
        "overtime_hhmm": {
          "type": "string"
        },
        "double_time_hhmm": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "settings": {
      "type": "object",
      "required": [
        "overtime_preset",
        "rules",
        "weekly_overtime_after_hours",
        "daily_overtime_after_hours",
        "daily_double_time_after_hours",
        "overtime_multiplier",
        "double_time_multiplier",
        "seventh_day_rule",
        "rounding",
        "rounding_label",
        "time_format",
        "hourly_rate",
        "currency",
        "week_start_day"
      ],
      "properties": {
        "rules": {
          "type": "string"
        },
        "currency": {
          "type": "string"
        },
        "rounding": {
          "type": "string"
        },
        "hourly_rate": {
          "type": [
            "number",
            "null"
          ]
        },
        "time_format": {
          "type": "string"
        },
        "rounding_label": {
          "type": "string"
        },
        "week_start_day": {
          "type": [
            "string",
            "null"
          ]
        },
        "overtime_preset": {
          "type": "string"
        },
        "seventh_day_rule": {
          "type": "boolean"
        },
        "overtime_multiplier": {
          "type": "number"
        },
        "double_time_multiplier": {
          "type": "number"
        },
        "daily_overtime_after_hours": {
          "type": "number"
        },
        "weekly_overtime_after_hours": {
          "type": "number"
        },
        "daily_double_time_after_hours": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "type": "object",
      "required": [
        "csv",
        "pdf"
      ],
      "properties": {
        "csv": {
          "type": "string"
        },
        "pdf": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "pay_period": {
      "type": [
        "string",
        "null"
      ]
    },
    "assumptions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Readings of ambiguous clock times (no am/pm) that the user should confirm; empty when none."
    }
  },
  "additionalProperties": false
}
calculate_hours annotations
{
  "title": "Calculate hours worked",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

time-card-widget — ShiftSum Time Card view

Advertised by the server during the last successful anonymous check.

Interactive view for ShiftSum Time Card.

time-card-widget URI
ui://widget/time-card-v3-1.0.0-1c3527db5f8ff86d3aa7a0f46887a5bb5b295301f57e9dab7df51a9e22335a81.html

MIME type: text/html;profile=mcp-app

time-card-widget-legacy — ShiftSum Time Card view (previous versions)

Advertised by the server during the last successful anonymous check.

time-card-widget-legacy URI template
ui://widget/time-card-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1301 ms
95th percentile latency
1301 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1301 ms · metadata changed · 1 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http shiftsum-time-card-mcp https://time-card.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add shiftsum-time-card-mcp --url https://time-card.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable shiftsum-time-card-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "shiftsum-time-card-mcp": {
      "url": "https://time-card.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "shiftsum-time-card-mcp": {
      "type": "streamableHttp",
      "url": "https://time-card.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start shiftsum-time-card-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "shiftsum-time-card-mcp": {
      "type": "http",
      "url": "https://time-card.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http shiftsum-time-card-mcp https://time-card.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "shiftsum-time-card-mcp": {
      "url": "https://time-card.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "shiftsum-time-card-mcp": {
      "serverUrl": "https://time-card.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like ShiftSum Time Card MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.