attendance-mcp
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., "@attendance-mcpWho is repeatedly late across all sites?"
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.
attendance-mcp
An MCP server that lets an AI assistant answer a manager's attendance questions: who is regularly late, who keeps not turning up, and which site has a bad day of the week.
It exposes seven read-only tools, a schema resource and a review prompt over the Model Context Protocol, so any MCP client (Claude Code, Claude Desktop, Cursor and others) can use them. It runs on synthetic data with known patterns planted in it, so every answer can be checked.
Who's regularly late in Manchester, and does any site have a bad day of the week?
Ryan Hughes is the outlier: late on 24 of 40 shifts (60%), 22.8 minutes on average. The next person is at 18.4%. The bad day is Belfast on Mondays: 36.4% late against 3 to 11% on its other days, and it's spread across the site's staff, so it looks structural (start time, rota, transport) rather than one person. Manchester is flat by weekday because its problem is one person.
That answer came from a live Claude Code session calling repeat_late_arrivals and location_trends (figures updated to the current late-rate definition, see below). The full sessions are in docs/.
Why I built it
In a previous role I built an LLM agent with a set of custom tools for exactly this job: finding lateness patterns in clock-in data across several sites, on synthetic data. Those tools lived inside one agent, so only that agent could use them.
MCP turns tools into a separate service with a standard interface: build them once, and any MCP client can connect. This repo is a from-scratch rebuild of that idea as an MCP server, with new code and new synthetic data.
Related MCP server: Secureframe MCP Server
Tools
Tool | Answers |
| What sites are there, how many people, what dates does the data cover? |
| Who was late on a given day or week, worst first? |
| Who is regularly late? Count, rate and average minutes late per person. |
| Who keeps not turning up, or forgets to clock out? |
| List every no-show and missed clock-out. |
| One person's summary and incident list, by ID or part of a name. |
| Late rate per site by weekday or by week. |
Plus:
Resource
attendance://schema: the data model and definitions ("late", "no-show", "late rate"), so the model knows what the numbers mean before it reads them.Prompt
weekly_attendance_review: reviews one week for a site against the previous four and drafts a short summary for the site manager.
Every tool is annotated readOnlyHint: true. Nothing in this server can change a record.
Quick start
Requires Node.js 22.13 or later (it uses the built-in node:sqlite).
git clone https://github.com/AIwithDiego/attendance-mcp && cd attendance-mcp
npm ci && npm run buildClaude Code:
claude mcp add attendance -- node --disable-warning=ExperimentalWarning "$(pwd)/dist/index.js"Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"attendance": {
"command": "node",
"args": ["--disable-warning=ExperimentalWarning", "/absolute/path/to/attendance-mcp/dist/index.js"]
}
}
}MCP Inspector (click through the tools without an AI client): npm run inspect.
Then ask it things like "Is anyone's lateness getting worse?", "Who forgets to clock out in Cork?" or "Run the weekly review for Belfast, week of 14 September."
How it works
flowchart LR
Client["MCP client<br/>Claude Code, Claude Desktop, ..."] -- "JSON-RPC over stdio" --> Server["McpServer<br/>src/server.ts"]
Server --> Check["Shared input checks<br/>real dates, known site,<br/>range inside the data"]
Check --> Queries["Parameterised SQL<br/>src/queries.ts"]
Queries --> DB[("SQLite<br/>synthetic, seeded<br/>src/seed.ts")]src/seed.tsgenerates 4 sites (Dublin, Cork, Manchester, Belfast), 40 staff and 8 weeks of shifts and clock events from a fixed seed, so the data is identical on every run. Four patterns are planted: a chronic late-comer, repeated no-shows, repeated missed clock-outs, and a site that runs late on Mondays.src/queries.tsholds the SQL. Every value from a tool call is a named parameter; nothing a caller sends is concatenated into SQL.src/server.tsregisters the tools, resource and prompt, with zod schemas that bound every input.src/index.tsconnects the server to stdio. stdout is the protocol channel, so logs go to stderr.
Design decisions
Tools are written for a model, not a human. Descriptions say when to use each tool ("use for 'who is regularly late' questions"), because that's what the model reads when it picks one. In the live sessions it picked the right tool first time.
An empty result must mean "nothing happened", never "you asked wrong". A model reports an empty list as fact. An unknown site, a reversed date range or dates outside the data return an error that says what's valid instead.
Ambiguity goes back to the model. If a name matches several people,
employee_attendancereturns the candidates and tells the model to ask which one, instead of guessing.Read-only by design. Attendance data feeds conversations about real people. This server reports; it never edits.
One definition per metric.
late_rate_pctis late shifts divided by attended shifts in every tool, and it's written down in the schema resource.
Testing
Two kinds:
Automated: 26 tests (
npm test) that talk to the server through a real MCP client over an in-memory transport, the same protocol path Claude uses. They check the tools find every planted pattern, cover input validation and SQL injection attempts, and include a regression test for every bug below.Live sessions: I connected the server to Claude Code and ran realistic manager questions and edge cases against it: 19 calls in the first session, 87 across all seven tools in the second. The write-ups, with evidence for each finding, are in
docs/test-session-2026-09-25.mdanddocs/test-session-2026-09-25-run2.md.
CI runs typecheck, tests and build on Node 22 and 24.
What I learned
The two live sessions and the tests written for their fixes found five bugs, four rough edges and one missing tool, all of which the first round of unit tests passed straight over. Each is fixed and has a regression test.
An empty list is an answer, so it has to be a true one. A misspelt site name returned
[], which the model would report as "nobody was late". The same went for reversed dates and dates outside the data. The fix is one shared check in front of every tool, and errors that list the valid options so the model can recover.A date bug hid the exact pattern it should have shown. SQLite's
weekday 1leaves a Monday where it is, so'weekday 1', '-7 days'pushed every Monday into the previous week. The planted pattern was a Monday effect. It showed up only because the weekly totals didn't add up (7 + 43 instead of 50 shifts).A shift can be two things at once. A late shift with no clock-out was labelled only "late", so the incident list disagreed with the summary. Incidents now carry a list of types.
Search strings are input too.
%or_in a name search matched all 40 employees, because they'reLIKEwildcards. They're escaped now, and a blank search is an error.One metric, one meaning. The per-person late rate left no-shows out and the site trend put them in. Both now divide by attended shifts, and the response includes the counts so the maths can be checked.
Writing the test finds the next bug. The regression test for out-of-range dates turned up an error message that named a date the caller never sent.
Data
All names, shifts and clock events are synthetic, generated by src/seed.ts. By default the database lives in memory and is rebuilt on every start. Set ATTENDANCE_DB=/path/to/file.db to keep it on disk.
Times are local to each site; comparisons across sites ignore timezones.
An existing database file is opened read-only and never seeded, so pointing ATTENDANCE_DB at a database can't add tables or rows to it. Only a path that doesn't exist yet gets created and seeded.
Using it on real data
This is a demo on synthetic data. Pointed at real clock-in records it becomes a tool for monitoring and evaluating workers, which the EU AI Act lists as high-risk (Annex III, point 4(b)) and which under GDPR needs a data protection impact assessment first. The design choices above (read-only, fixed definitions, no guessing at reasons for lateness) are a starting point for that, not a substitute.
License
MIT
Available Tools
7 toolsemployee_attendanceEmployee attendanceARead-onlyIdempotent
Attendance summary and incident list (late, no-show, missed clock-out) for one employee. Accepts an employee ID or part of a name; if several people match, returns up to 20 candidates instead.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive (YYYY-MM-DD). Defaults to the end of the data. | |
| from | No | Start date, inclusive (YYYY-MM-DD). Defaults to the start of the data. | |
| employee | Yes | Employee ID or part of their name. | |
| grace_minutes | No | Minutes after the scheduled start before a clock-in counts as late. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint true, so safety is covered. The description adds valuable behavioral context: the fallback behavior when multiple employees match ('returns up to 20 candidates instead'). This is beyond the annotations and helps the agent understand an important edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The purpose is front-loaded, and the critical fallback behavior is stated concisely. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with annotations covering safety, the description is fairly complete. It covers the core output (summary and incidents) and the ambiguous-name fallback. It does not describe the exact return format or pagination, but since there is no output schema, a bit more detail might be expected. However, given the tool's simplicity, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description adds minimal semantic value beyond the schema: it reiterates the employee parameter ('Employee ID or part of a name') but does not explain grace_minutes or the date filters. Baseline of 3 is appropriate when the schema fully covers parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Attendance summary and incident list') and a clear resource ('for one employee'), and lists the incident types (late, no-show, missed clock-out). It distinguishes itself from siblings by the 'one employee' scope, which is not ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for a single employee's attendance but does not explicitly mention alternatives or when not to use this tool. It does not reference sibling tools like find_late_arrivals or missing_clock_events, leaving the agent to infer the scope from 'one employee'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_late_arrivalsFind late arrivalsARead-onlyIdempotent
List individual late clock-ins, worst first. Use for 'who was late on X' questions.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive (YYYY-MM-DD). Defaults to the end of the data. | |
| from | No | Start date, inclusive (YYYY-MM-DD). Defaults to the start of the data. | |
| limit | No | ||
| location | No | Site name, e.g. 'Dublin'. Omit for all sites. | |
| min_minutes_late | No | Only include clock-ins at least this late. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavior beyond annotations: the individual (non-aggregated) grain and 'worst first' ordering, and implies only late entries are returned. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The primary behavior is front-loaded, and the usage cue is immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with strong annotations and a fairly complete schema, the description covers purpose and usage. It leaves 'worst first' imprecise (likely by minutes late), and does not explicitly route away from siblings, but these are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80% (4 of 5 parameters documented) with defaults and formats included. The description does not add parameter-specific semantics, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List individual late clock-ins') and adds an ordering qualifier ('worst first'). It implies differentiation from aggregated siblings like repeat_late_arrivals via 'individual', but does not explicitly name any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for "who was late on X" questions' gives a clear, concrete usage context. It does not specify exclusions or alternatives, but the cue is sufficient for basic routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsList locationsARead-onlyIdempotent
List every site with its country, timezone and headcount. Also returns the date range the data covers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by stating the returned fields including the date range, which goes beyond the annotations. There is no contradiction or missing behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise, front-loaded sentences deliver all necessary information without waste. The first sentence states the core purpose and fields; the second adds a useful output detail (date range). No filler or redundant language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description provides the essential information: the full set of data returned (every site, country, timezone, headcount, date range). This is sufficient for an agent to call and interpret the result without further clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema coverage is effectively 100% and the baseline is 4. The description correctly focuses on the output, adding no parameter details because none are needed. It fully leverages the no-parameter structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('every site') with additional detail on the fields returned (country, timezone, headcount, date range). This clearly distinguishes it from siblings like location_trends or employee_attendance, which suggest different data views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a clear use case—obtain a complete list of sites with their metadata—but it does not explicitly mention when to choose this tool over alternatives, provide exclusions, or reference sibling tools. The guidance is adequate but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location_trendsLocation trendsARead-onlyIdempotent
Late rate and no-shows per site, grouped by weekday or by week. Use to spot site-level patterns such as a bad day of the week. Weekly rows carry partial_week=true when the date range cuts into that week.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive (YYYY-MM-DD). Defaults to the end of the data. | |
| from | No | Start date, inclusive (YYYY-MM-DD). Defaults to the start of the data. | |
| group_by | No | weekday | |
| location | No | Site name, e.g. 'Dublin'. Omit for all sites. | |
| grace_minutes | No | Minutes after the scheduled start before a clock-in counts as late. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive behavior; the description adds meaningful runtime behavior by disclosing that weekly rows carry partial_week=true when the date range cuts into a week. It does not fully describe output shape, but this is a strong addition beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The core purpose is front-loaded, the use case follows, and the partial_week edge case earns its place as the final sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description conveys the return concept (late rate/no-shows per site by grouping) and a key edge-case flag. It is sufficient for an agent to invoke correctly, though it leaves minor output formatting details unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, and the schema already explains to/from/location/grace_minutes with defaults and constraints. The description adds only light context for group_by via 'grouped by weekday or by week', which is consistent with the schema enum, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, scoped statement — 'Late rate and no-shows per site, grouped by weekday or by week' — naming the resource and aggregation. The phrase 'site-level patterns' clearly separates it from event-level siblings like find_late_arrivals and employee_attendance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to spot site-level patterns such as a bad day of the week' gives an explicit use case. It does not mention when not to use it or name alternatives, so it falls short of a 5 but is clearly contextualized.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
missing_clock_eventsMissing clock eventsARead-onlyIdempotent
List no-shows (scheduled shift, no clock-in) and missed clock-outs (clocked in, never clocked out).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive (YYYY-MM-DD). Defaults to the end of the data. | |
| from | No | Start date, inclusive (YYYY-MM-DD). Defaults to the start of the data. | |
| type | No | all | |
| limit | No | ||
| location | No | Site name, e.g. 'Dublin'. Omit for all sites. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, so the description does not need to repeat that. It adds behavioral context by defining what counts as a no-show ('scheduled shift, no clock-in') and a missed clock-out ('clocked in, never clocked out'), which is not in the schema or annotations. It does not mention pagination or output shape, but the core detection behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with parenthetical definitions, and every word earns its place. It is front-loaded with the verb and object, making the purpose immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so an agent still does not know the exact shape of returned records. The description also gives no guidance on choosing between this tool and repeat_missing_clock_events. However, annotations cover safety, and the parameter schema handles defaults and bounds, making it adequate for simple invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents from, to, and location, while the description supplies meaning for the type enum values (no_show, missed_clock_out) by defining them in plain language. It does not discuss the limit parameter or type=all behavior, though those are partly self-evident from schema constraints and defaults. Overall, it adds some semantic value beyond the 60% schema coverage but does not fully compensate for the undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb, 'List', and identifies the exact resource: no-shows and missed clock-outs, with parenthetical definitions for each. It is clearly not tautological and it clarifies the core subject matter. It does not explicitly differentiate from siblings such as repeat_missing_clock_events, so it falls just short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No sentence explains when to prefer this tool over repeat_missing_clock_events, find_late_arrivals, or employee_attendance. The intended use is implied by the title and description, but no exclusions or alternatives are named. An agent has to infer context from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repeat_late_arrivalsRepeat late arrivalsARead-onlyIdempotent
Rank employees who were late repeatedly, with late count, late rate and average minutes late. Use for 'who is regularly late' questions.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive (YYYY-MM-DD). Defaults to the end of the data. | |
| from | No | Start date, inclusive (YYYY-MM-DD). Defaults to the start of the data. | |
| limit | No | ||
| location | No | Site name, e.g. 'Dublin'. Omit for all sites. | |
| grace_minutes | No | Minutes after the scheduled start before a clock-in counts as late. | |
| min_times_late | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the tool ranks employees and returns metrics, which is some behavioral context. However, it does not disclose output format, sorting order, or any side effects (though none expected). Given the annotations, the description adds modest value but not rich detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and output metrics, followed by a concise usage hint. No wasted words; it is efficient and well-structured for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 6 parameters, no output schema, and moderate complexity. The description covers the purpose and output metrics but omits details about the 'min_times_late' threshold (which defines 'repeatedly') and the 'limit' parameter. It also does not describe the response format. These gaps mean an agent may not fully understand how to configure the call or interpret results without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (4 of 6 parameters have descriptions). The descriptions for 'to', 'from', 'location', and 'grace_minutes' are provided in the schema, but 'limit' and 'min_times_late' lack descriptions. The tool description does not clarify these parameters, nor does it explain how 'min_times_late' relates to 'repeatedly'. The description adds no parameter semantics beyond the schema, so it fails to compensate for the undocumented fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool ranks employees who were late repeatedly, and specifies the metrics (late count, late rate, average minutes late). It also includes a usage phrase ('who is regularly late') that helps distinguish it from siblings like find_late_arrivals. This is a specific verb+resource+output combination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes an explicit usage context: "Use for 'who is regularly late' questions." This gives clear when-to-use guidance. However, it does not mention alternatives or exclusions, even though siblings like repeat_missing_clock_events exist. The guidance is sufficient for the primary scenario but lacks explicit comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repeat_missing_clock_eventsRepeat no-shows and missed clock-outsARead-onlyIdempotent
Rank employees by no-shows and missed clock-outs, with counts and rates. Use for 'who keeps not turning up' or 'who forgets to clock out' questions.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive (YYYY-MM-DD). Defaults to the end of the data. | |
| from | No | Start date, inclusive (YYYY-MM-DD). Defaults to the start of the data. | |
| limit | No | ||
| location | No | Site name, e.g. 'Dublin'. Omit for all sites. | |
| min_times | No | Include people with at least this many no-shows or at least this many missed clock-outs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds behavioral context by indicating that the tool aggregates and ranks employees rather than returning raw event records, and that output includes counts and rates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise, front-loaded sentences. The first states the core behavior, and the second provides practical usage examples. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and five optional parameters, the description communicates the result shape reasonably well through 'counts and rates' and 'Rank employees.' It could more explicitly contrast with missing_clock_events or define the repeat threshold, but the name, title, and min_times parameter cover most of that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, with from, to, location, and min_times already described. The description adds general framing about ranking and rates but does not add meaningful parameter-level detail beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: 'Rank employees by no-shows and missed clock-outs, with counts and rates.' This clearly conveys what the tool does and distinguishes it from the sibling missing_clock_events through the 'repeat' framing and ranking behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides usage context with natural-language question examples: 'who keeps not turning up' and 'who forgets to clock out.' It does not list exclusions or alternative tools, but the guidance is clear enough for selection in most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
employee_attendance - First observed
find_late_arrivals - First observed
list_locations - First observed
location_trends - First observed
missing_clock_events - First observed
repeat_late_arrivals - First observed
repeat_missing_clock_events
TDQS
Scored across 7 tools
Tools are mostly distinct: individual late events, repeat-late rankings, missing-event lists, and repeat-missing rankings are clearly separated by purpose. The only minor overlap is employee_attendance, which could conceptually include late and missing incidents, but its employee-specific scope keeps it distinguishable.
There is a recognizable pattern among paired tools (repeat_late_arrivals / repeat_missing_clock_events), but naming style is mixed: list_locations and find_late_arrivals use verbs, while employee_attendance and location_trends are plain noun phrases. The inconsistency is not chaotic, but it is noticeable.
Seven tools is a well-scoped size for an attendance analytics server. Each tool covers a distinct query type without unnecessary redundancy or bloat.
The toolset covers the main attendance questions: site overview, individual late incidents, repeat-late rankings, per-employee summaries, location trends, missing clock events, and repeat missing-event rankings. For a read-only attendance analysis server, this feels complete with no critical dead ends.
Maintenance
Related MCP Connectors
Employee surveys, performance reviews, recognition, and team pulse for AI assistants.
Connect AI assistants to Google Sheets through controlled tools for reading and updating rows.
Field workforce scheduling for AI agents. GPS punches, forms, timesheets. No dashboard.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables Claude, Cursor, and other MCP clients to query PeopleForce HRIS data (employees, time-off, recruitment) via 27 read-only tools.284MIT
- AlicenseNot gradedqualityFmaintenanceProvides AI assistants with read-only access to Secureframe's compliance data, enabling querying of security controls, tests, users, vendors, and more across frameworks like SOC 2 and ISO 27001.8MIT
- FlicenseNot gradedqualityBmaintenanceExposes read-only PostgreSQL-backed HR data through seven structured tools, including employee directory lookups, late arrival and absence reporting, and delay summarization, all validated with Zod and returning queryable structured content.1-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query live Toast POS data and generate sales, labor, and cash reports while answering restaurant operations questions, all in a read-only manner.14 npmMIT