Skip to main content
Glama

Follow-Through

The MCP agent that remembers what everyone promised — so nothing quietly dies.

Follow-Through is a TypeScript Model Context Protocol (MCP) server built on NitroStack. It listens to meeting transcripts, extracts every spoken commitment (who promised what, to whom, by when, and with what confidence), persists it durably, and then keeps working autonomously: it polls Slack, email, and Linear for real evidence of completion, sends escalating nudges when deadlines slip, and escalates to a manager's inbox when a commitment goes silent — all without a human having to re-prompt it.

For a demo, a compressed virtual clock (simulate_days_passing) makes a full week of follow-up observable in seconds, and a companion widget renders the live commitment board.


Why this exists

Most action items from meetings never make it into a tracker. They live in a transcript nobody re-reads, get half-remembered, and quietly expire. Follow-Through closes that loop in three moves:

  1. Capture — the moment a promise is spoken, it becomes a durable record with an auto-created Linear ticket.

  2. Verify — instead of nagging blindly, the agent checks Slack and email for evidence that the work actually got done.

  3. Escalate gracefully — if there's no evidence and no response, nudges get more specific, and a human manager is looped in with full context.


Related MCP server: AskHumanToWork MCP Server

Key features

Feature

What it does

Commitment extraction

Parses transcripts into structured commitments via a pluggable LLM (Anthropic, OpenRouter) or a fully offline deterministic parser — same output shape either way.

Confidence triage

Each commitment is graded committed / hedged / aspirational. Aspirational wishes are never auto-chased.

Durable store

Pure-JS JSON-file persistence (atomic writes, serverless-safe) with a virtual clock, so the whole lifecycle can be simulated deterministically.

Evidence-based "done"

Completion is decided by real signal — a Slack message or email from the owner with matching keywords and a completion signal — not by assumption.

Escalation ladder

open → nudged_1 → nudged_2 → escalated with gentle-then-specific reminders, tuned per confidence tier.

Linear integration

Every commitment gets a ticket (LIN-48x); escalated tickets gain a manager watcher and a contextual comment.

Live dashboard widget

A Next.js widget auto-attached to query_commitments renders the commitment board with status, evidence, and nudge history.

Demo controls

simulate_days_passing and reset_demo compress a multi-day chase into seconds for a deterministic demo.

Zero-cost default

Runs fully offline with no API key; free OpenRouter models are optional.


How it works

                 ┌────────────────────────────────────────────────────────┐
   transcript    │                        App                             │
  ─────────────► │  ingestion ──► store ──► evidence ──► nudge ──► linear  │
                 │                     ▲                                 │
                 │                     │  scheduler (poll loop / clock)   │
                 │      widget ◄───────┴── query_commitments              │
                 └────────────────────────────────────────────────────────┘

Modules

Module

Responsibility

ingestion

Extract structured commitments from transcripts (LLM or offline).

store

JSON-file persistence: commitments, evidence/nudge logs, escalation state, virtual clock.

evidence

Search Slack/email for completion signal (real providers, with fixture fallback in demo mode) and score it against the commitment.

nudge

Compose and send reminders across Slack/email with tone control (real delivery, fixture/log in demo mode).

linear

Ticket lifecycle: create, status, escalate (with manager watcher + comment).

scheduler

The autonomous loop. Polls due commitments, checks evidence, advances the state machine.

The decision state machine

For each due, non-aspirational commitment, the scheduler runs every poll:

        due (+ grace)            +3d (committed)           +6d (committed)
 open ───────────────────► nudged_1 ─────────────► nudged_2 ─────────────► escalated
     gentle nudge                specific nudge             manager + watcher

At every step it first checks evidence (Slack/email) and ticket status (Linear Done) — proof beats nagging. Nudges only happen when there is neither evidence nor a completed ticket.

Confidence tiers and cadence

Tier

Example

Grace for nudge 1

nudge 2

escalate

committed

"I will ship the report by Friday"

at due date (0d)

+3d

+6d

hedged

"I'll try to get it done by Friday"

+2d

+5d

+10d

aspirational

"We should probably track error budgets"

never chased

Evidence scoring

scoreEvidence() in src/common/matching.ts combines three signals:

  • Recall — what fraction of the commitment's key terms appear in the message

  • Completion signals — words like sent, published, shipped, delivered, merged

  • Author match — the message came from the commitment owner

A score ≥ 0.6 marks the commitment done. Keyword-only mentions cap at 0.55 — deliberately below the bar, because a false "done" is worse than a false nudge.


Technology stack

  • Runtime: Node.js ≥ 20 (ESM, TypeScript strict mode)

  • Framework: NitroStack (@nitrostack/core) — decorator-based modules, DI, MCP server

  • Persistence: Pure-JS JSON-file store (data/follow-through.json, atomic writes) — zero native dependencies, deploy-safe on any base image

  • Validation: Zod

  • LLM: fetch-based calls (no heavy SDK) — Anthropic Messages API or OpenRouter chat-completions

  • Widgets: Next.js 14 + React 18 (@nitrostack/widgets)


Project structure

src/
  app.module.ts                 # root module — wires all six modules
  common/
    types.ts                    # Commitment, Person, Ticket, evidence/nudge types
    dates.ts                    # date math + virtual-today helpers
    matching.ts                 # evidence scoring + thresholds
  modules/
    ingestion/                  # extract_commitments + sample transcript fixture
    store/                      # JSON-file store + virtual clock + query/upsert/promote
    evidence/                   # search_slack_evidence / search_email_evidence
    nudge/                      # send_nudge
    linear/                     # linear_create_ticket / get_status / update_status / escalate
    scheduler/                  # simulate_days_passing / reset_demo + poll loop
  providers/
    slack.ts                    # real Slack evidence search + DM nudges (Slack Web API)
    email.ts                    # real SMTP send + IMAP evidence search
    linear.ts                   # real Linear GraphQL client
  widgets/app/commitment-dashboard/  # the live dashboard widget (Next.js)
scripts/
  e2e-smoke.mts                 # full-lifecycle regression test (30+ asserts)
  extract-sample.mts            # one-liner demo: sample transcript → extract_commitments
  check-state.mts               # dump live server truth (commitments + ticket statuses)
  providers-check.mts           # which real providers/LLM keys are configured
  live-check.mts                # live create/read/update against real Linear + Slack/email search

Getting started

Prerequisites

  • Node.js ≥ 20 (developed on 24.15.0)

  • npm

Install

npm install
npm run build

The build compiles TypeScript to dist/ and bundles the widget to src/widgets/out/.

Configuration

Copy .env.example to .env. Everything has sane defaults; no key is required.

Variable

Default

Purpose

LLM_PROVIDER

auto

auto | anthropic | openrouter | none

ANTHROPIC_API_KEY

Enables Claude-based extraction (paid)

ANTHROPIC_MODEL

claude-sonnet-4-6

Claude model

OPENROUTER_API_KEY

Enables free-tier OpenRouter extraction

OPENROUTER_MODEL

meta-llama/llama-3.1-8b-instruct:free

Free OpenRouter model

SCHEDULER_INTERVAL_MS

3600000

Real-world poll cadence (production)

DATA_DIR

<cwd>/data

Writable volume for the JSON store (falls back to temp, then in-memory)

SLACK_BOT_TOKEN

Enables real Slack evidence search + DM nudges

SLACK_EVIDENCE_CHANNELS

Comma-separated channels to search for evidence

EMAIL_SMTP_HOST/USER/PASS

Enables real outbound nudges by email

EMAIL_IMAP_HOST/USER/PASS

Enables real IMAP evidence search

LINEAR_API_KEY

Enables real Linear ticket lifecycle

LINEAR_TEAM_ID

Linear team for ticket creation (auto-detected if omitted)

Provider resolution (auto): uses Anthropic if its key is set, else OpenRouter if its key is set, else the offline deterministic extractor. Any LLM failure falls back to the offline extractor — the demo never breaks.

Demo vs. real mode: when none of SLACK_BOT_TOKEN, EMAIL_IMAP_*, or LINEAR_API_KEY are set, the server runs in demo mode and all Slack/email/ Linear traffic is fixture-based. Configure any subset and only those providers go real — the rest keep their fixtures. Run npx tsx scripts/providers-check.mts to see which mode you're in.

No key? No problem. The deterministic extractor produces the same structured output from the same tool schema with zero network and zero cost.


Running

npm run dev

Production

npm run build
npm start

Boots in dual mode — stdio and HTTP at http://localhost:3000/mcp.


Demo walkthrough

The sample transcript (mtg_ops_standup) contains four commitments designed to exercise every path: a completion, a slacker, a hedged promise, and an aspirational wish.

# 0. Clean slate (virtual "today" = real today, e.g. 2026-07-31)
reset_demo

# 1. Extract commitments from the sample transcript → 4 commitments + 4 Linear tickets
get_sample_transcript
extract_commitments  { transcript_text, participants, meeting_date }

# 2. Fast-forward 3 days (→ Aug 3, the first due date)
simulate_days_passing  { days: 3 }
#    Priya  → done_evidence      (Slack + email show the report was sent)
#    Marcus → nudge_1            (gentle nudge, no evidence yet)

# 3. Fast-forward 3 days (→ Aug 6)
simulate_days_passing  { days: 3 }
#    Marcus → nudge_2            (more specific nudge)

# 4. Fast-forward 3 days (→ Aug 9)
simulate_days_passing  { days: 3 }
#    Marcus → escalated          (ticket watcher: raj.patel@company.com + context comment)
#    Aisha  → nudge_1            (hedged — grace period meant she wasn't chased early)
#    Tom    → open, untouched    (aspirational — never auto-chased)

# 5. Inspect the final board
query_commitments
# 6. Prove the escalation stuck to the ticket
linear_get_status  { ticket_id: "LIN-482" }   # → Escalated, watchers: [...]

For a browser visual, open the dashboard widget (see below) — it reflects the same board.


Tools

All 14 tools registered on the follow-through MCP server:

Tool

Module

Purpose

get_sample_transcript

ingestion

Ready-to-use demo transcript + roster

extract_commitments

ingestion

Parse transcript → commitments, records, tickets

upsert_commitment

store

Insert/update a commitment record

query_commitments

store

Query the board (status filters; widget-attached)

promote_commitment

store

Raise a commitment's confidence tier

search_slack_evidence

evidence

Search Slack for completion signal (real or fixtures)

search_email_evidence

evidence

Search email for completion signal (real or fixtures)

send_nudge

nudge

Send a reminder (tone, channel, message)

linear_create_ticket

linear

Create a Linear ticket

linear_get_status

linear

Read ticket status, watchers, escalation comment

linear_update_status

linear

Change ticket status

linear_escalate

linear

Escalate a ticket to a manager

simulate_days_passing

scheduler

Advance virtual clock + run one poll

reset_demo

scheduler

Wipe state, reset clock


Widget dashboard

query_commitments is auto-attached to a Next.js widget (ui://widget/next-commitment-dashboard.html). Inside an MCP host it renders a theme-aware board: owner, commitment, due date, confidence, status badge, evidence trail, and nudge count.

Standalone (no host injecting data) the page shows only a loading shell — the data is injected by the host when the tool runs.


Testing

npm run build
npx tsx scripts/e2e-smoke.mts

Drives the real server over the MCP stdio protocol and asserts 30+ invariants: extraction shape, confidence tiers, due-date resolution, nudge timing, hedged grace, aspirational immunity, evidence thresholds, escalation watcher, and manual nudges. Ends with ALL CHECKS PASSED.

Verify what the agent reports (before the demo, and anytime a tool call fails)

If a client like Claude.ai ever reports a connector error mid-demo, never assume the answer that followed came from the server — re-run the tools live and compare:

npm run build
npx tsx scripts/check-state.mts

This dumps the server's actual current commitments and Linear ticket statuses (each ticket includes as_of, the server-side date the status was read at), so anything the agent quoted can be checked against ground truth. Real tool responses always carry server data (updated_at, as_of, ticket ids); anything that doesn't match a fresh run is client-side reconstruction, not a result.

Demo etiquette: if a tool call visibly fails, say "let me retry that" and call it again instead of continuing — a visibly retried tool beats a confidently wrong number. Connector errors ("Connector search is off", "Unable to reach …") are almost always Claude.ai's connector settings: open Settings → Connectors, confirm the FollowThrough connector is enabled/approved, and re-approve it for the current conversation (approval is per-chat, so a new chat needs it again).

Simulation semantics

simulate_days_passing takes a single days number and advances the virtual clock by exactly that many days in one call (then runs one scheduler poll). So { days: 9 } jumps straight to due+9 in a single step — it is not three 3-day calls. The demo shows a cleaner narrative with separate calls (3 → 3 → 3), which also makes each nudge/escalation stage observable as it happens, but the tool never requires them.


Connect a client

Point any MCP client (Claude Desktop, Cursor, etc.) at the built server:

{
  "mcpServers": {
    "follow-through": {
      "command": "node",
      "args": ["<path-to>/dist/index.js"],
      "cwd": "<path-to>"
    }
  }
}

Or hit the HTTP endpoint in dual/production mode: http://localhost:3000/mcp. The CLI can also wire up Cursor automatically: npx nitrostack-cli cursor.


Production considerations

  • Real integrations, optional. Slack (src/providers/slack.ts), email (src/providers/email.ts), and Linear (src/providers/linear.ts) are plain env-driven clients. Without keys they fall back to the deterministic fixtures, so the demo and the production path are the same code.

    • Slack requires a bot token with channels:read, groups:read, channels:history, groups:history, im:history, users:read, users:read.email, chat:write. The *:read scopes resolve channel names in SLACK_EVIDENCE_CHANNELS to ids (names or ids both accepted); the bot must be added to every channel it searches. Nudges DM the commitment owner.

    • Email uses SMTP (EMAIL_SMTP_*) for outbound nudges and IMAP (EMAIL_IMAP_*) to search mail for evidence, parsed with mailparser.

    • Linear uses the GraphQL API (LINEAR_API_KEY); escalations add the manager as a ticket subscriber plus a contextual comment.

  • Real cadence. Set SCHEDULER_INTERVAL_MS to the desired poll rate and remove simulate_days_passing / reset_demo from the tool surface if you don't want them exposed.

  • LLM cost. Extraction is the only LLM call. It runs once per transcript; the polling/nudge/escalation machinery is pure code. Use OpenRouter :free models or the offline extractor to keep cost at $0.

  • Transport. Production boots in dual mode (stdio + HTTP). OAuth logs at startup are framework noise unless you configure an authorization server.


Troubleshooting

Symptom

Fix

EADDRINUSE :3000 on start

A stale server is still running — kill it (netstat/Stop-Process) and retry.

Widget missing on startup

Run npm run build once so query_commitments can register its bundled component.

Demo stuck on old dates

reset_demo, or delete data/follow-through.json (regenerated on boot).

EACCES / read-only fs on NitroCloud

Expected on serverless hosts — the store auto-falls back to the OS temp dir, then in-memory only (look for [StoreService] notes in logs). Set DATA_DIR if your platform offers a writable volume.

Slack logs missing_scope

The bot token lacks channels:read / groups:read, so channel names in SLACK_EVIDENCE_CHANNELS can't be resolved to ids. Add those scopes in the Slack app (OAuth & Permissions), reinstall the app to regenerate the token, and add the bot to each channel it should search.

Linear logs Unknown argument ...

The LINEAR_API_KEY is older than the app code — regenerate it so the app's Issue/users(filter:) GraphQL calls are accepted.

llm_provider: "offline"

The LLM call failed or no key is set — check .env and that the provider is reachable.

:3001 serves a 404 at /

The dashboard lives at /commitment-dashboard; a stale src/widgets/.next can stall it — delete it and restart.


License

MIT — see the repository root. Built for demonstration on the NitroStack MCP framework.

Available Tools

14 tools
extract_commitmentsA

Parses a meeting transcript and returns structured commitment objects: who promised what, to whom, by when, and with what confidence. For every commitment found it immediately creates a durable store record AND a Linear ticket — catching the 90% of commitments that would never become a manual ticket. Deduplicates against commitments already in the store.

ParametersJSON Schema
NameRequiredDescriptionDefault
meeting_dateYesMeeting date as YYYY-MM-DD — used to resolve relative deadlines like "by Friday"
participantsNoOptional roster to resolve owners against
transcript_idYesStable id for this meeting
transcript_textYesFull meeting transcript, one "Speaker: statement" per line

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of disclosing side effects. It explicitly states that it immediately creates a durable store record AND a Linear ticket, and that it deduplicates against existing commitments. This is key behavioral information, though it could add details on idempotency or failure handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core purpose, then side effects, then dedup. No wasted words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema and no annotations, the description explains what the tool returns, its side effects, and its dedup behavior. It does not cover potential edge cases or the exact output format, but for a tool with 4 parameters and clear side effects, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add significant parameter-specific details beyond what the schema already provides, but it does frame the overall purpose (transcript parsing) which indirectly applies to parameters like transcript_text and meeting_date.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool parses a meeting transcript and returns structured commitment objects, with a specific verb and resource. It also distinguishes itself from siblings like upsert_commitment and query_commitments by emphasizing the extraction and automatic ticket creation behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for meeting transcripts and mentions catching commitments that would otherwise be missed, providing clear context. It does not explicitly name alternative tools or exclusions, but the context is sufficient for an agent to infer when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sample_transcriptA

Returns a ready-to-use sample meeting transcript (with participants and meeting date) designed to exercise all three confidence levels — paste its transcript_text into extract_commitments to run the demo flow.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the output content (transcript with participants/date), the presence of a transcript_text field, and the intended behavior ('designed to exercise all three confidence levels'). Could mention that it's a static sample or has no side effects, but adequate for a 0-param getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence front-loads the core purpose and immediately follows with usage guidance. Every clause provides value, no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, parameterless tool with no output schema, the description fully covers the return value's key fields and the intended use case. It tells the agent exactly what to expect and how to chain it with extract_commitments, making the tool self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds meaning by explaining the return value's structure, and no parameter documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool 'returns a ready-to-use sample meeting transcript' with specific content details ('participants and meeting date'). Distinct from sibling tools focused on commitments/status, and specific about its role in the demo flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs usage: 'paste its transcript_text into extract_commitments to run the demo flow.' Names the sibling tool and the exact integration step, making when and how to use it unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

linear_create_ticketA

Creates a Linear ticket for a newly extracted commitment so it's never lost — even commitments nobody manually ticketed. Keys stay server-side in the Linear service; this tool never exposes them to the model.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
labelsNo
due_dateNoYYYY-MM-DD
descriptionNoQuote the original spoken commitment here
assignee_emailNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It adds a meaningful security-related behavior: 'Keys stay server-side in the Linear service; this tool never exposes them to the model.' However, it does not disclose other behavioral aspects such as idempotency, potential duplicate tickets, or side effects, so it is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the action and purpose, the second adds a crucial security detail. Both sentences earn their place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple create tool with no output schema, the description is largely complete: it explains why the tool exists (preventing commitment loss) and the security model. However, it omits information about the return value or any failure modes, which would be useful but not essential given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not discuss any of the five parameters. Schema description coverage is only 40%, leaving labels, title, and assignee_email without meaningful descriptions in either the schema or the tool description. The description fails to compensate for this gap, providing no value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Creates a Linear ticket' and the specific resource (Linear ticket), with the context of 'newly extracted commitment' that distinguishes it from sibling tools like linear_update_status. It also conveys the purpose 'so it's never lost', making the tool's intended role immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: for newly extracted commitments that might otherwise be missed ('even commitments nobody manually ticketed'). It provides clear context but does not explicitly state when not to use it or name alternative tools, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

linear_escalateB

Adds a manager as a watcher on the ticket with a supportive, context-rich comment explaining what was promised, what has been tried, and why it is being surfaced now.

ParametersJSON Schema
NameRequiredDescriptionDefault
ticket_idYes
manager_emailYes
context_commentYesFull history: what was promised, nudges sent, evidence checked

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses the primary side effects (adding a watcher, posting a comment with specified content) but omits other potential behavioral details like status changes, notification side effects, permission requirements, or reversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly written sentence that is front-loaded with the primary verb and action. It avoids redundancy and gets to the point immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description is too brief to cover important context such as return values, error conditions, side effects beyond the comment, or why this tool should be preferred over sibling tools. It reads like a minimal action summary rather than a complete tool guide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, with only context_comment described in the schema. The description adds meaning for context_comment (mentioning what was promised, tried, and why surfaced) and loosely clarifies manager_email, but ticket_id and email format remain under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action: 'Adds a manager as a watcher' on a ticket and adds a context-rich comment. This distinguishes it from sibling tools like linear_update_status or linear_create_ticket.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to use this tool versus alternatives such as send_nudge or linear_update_status. The description explains the action but not the appropriate escalation context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

linear_get_statusA

Reads the current status of a Linear ticket — used by the scheduler to verify work marked Done in Linear, not just in Slack/email.

ParametersJSON Schema
NameRequiredDescriptionDefault
ticket_idYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It identifies the tool as a read operation, implying non-mutating behavior, but adds no other context like error handling, auth, or output format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise sentence, front-loaded with the action, no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with one parameter and no output schema, the description covers the purpose, the object, and a use case. It lacks some edge-case details but is largely adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter with zero description coverage. The description refers to a 'Linear ticket' but does not explain ticket_id format or add any detail beyond the schema. It provides minimal compensation for the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the current status of a Linear ticket, using a specific verb and resource. It distinguishes from sibling update/escalate tools by implying a read-only operation, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a concrete use case ('used by the scheduler to verify work marked Done in Linear') and contrasts with Slack/email verification. However, it does not explicitly state when not to use this tool or name alternative Linear tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

linear_update_statusB

Updates the status of a Linear ticket. Lets the scheduler pick up a ticket manually marked Done.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
ticket_idYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavior. It only says 'Updates the status' and vaguely references the scheduler, but does not explain side effects, validation rules, permissions, or what happens after the update. This is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using two short sentences with no redundant content. It front-loads the core purpose. The second sentence adds useful context, though it could be phrased more clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update tool with only two parameters, the description gives enough to understand the basic operation. However, the lack of output schema and annotations, combined with vague scheduler behavior, leaves gaps around return values and side effects. The description is adequate but not thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has two parameters with 0% description coverage, and the description does not mention them at all. While the status enum is self-explanatory, ticket_id's meaning and format are not clarified, leaving the description to compensate for the schema gap but failing to do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Updates the status of a Linear ticket') and adds context about the scheduler picking up manually Done tickets. It is specific about the resource and verb, though it does not explicitly distinguish it from sibling linear_escalate, which might also change status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence implies a specific use case (letting the scheduler pick up a manually Done ticket), providing some contextual guidance. However, it does not explicitly state when to avoid this tool or name alternatives like linear_escalate, leaving the usage boundaries somewhat implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promote_commitmentA

Promotes a logged aspirational commitment ("we should probably...") so the scheduler starts actively chasing it. This is the human override that moves an idea into the follow-up loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
commitment_idYes
confidence_levelYesNew confidence to chase the item with

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the key behavioral consequence ('moves an idea into the follow-up loop', 'scheduler starts actively chasing it'), but does not mention reversibility, side effects, or what happens if the commitment is already promoted. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the verb 'Promotes'. Every sentence adds value—the first defines the action and result, the second clarifies the human-override nature. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with 2 parameters and an enum, the description covers the main behavioral outcome and the purpose. It does not explain return values or edge cases, but the simplicity and the fact that it's a mutation tool make this mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%; commitment_id has no schema description. The tool description does not mention any parameters by name or explain how they map to the action, leaving the meaning of commitment_id implicit. It adds little beyond what the schema already provides for confidence_level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Promotes a logged aspirational commitment' with a specific resource ('aspirational commitment') and a clear outcome ('scheduler starts actively chasing it'). It distinguishes itself from siblings like query_commitments or extract_commitments by focusing on the promotion action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: 'This is the human override' indicates when to use the tool (human intervention) versus automatic processing. It does not explicitly name alternatives or exclusions, but the context is sufficient for basic usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_commitmentsA

Returns commitments matching a filter — used by the scheduler to find items due for a poll or nudge check. With no filters, returns every commitment.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOnly return commitments in these states
due_beforeNoYYYY-MM-DD — only commitments due on or before this date
owner_emailNoOnly commitments owned by this person

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It clearly indicates a read-only operation ('Returns') and warns that omitting filters returns every commitment, which is a significant behavioral caveat. However, it does not describe the return format, pagination, or permissions, leaving some behavioral aspects undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences that lead with the verb and core behavior, followed by a useful edge-case note ('no filters returns every commitment'). There is no wasted wording or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple filtered query with optional parameters; the schema covers parameter meanings, and the description explains the purpose and no-filter behavior. However, since there is no output schema, a brief mention of return shape or ordering would improve completeness, though the current description is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all three parameters with descriptions, achieving 100% schema description coverage. The tool description adds no additional parameter semantics beyond what the schema provides, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Returns' with the resource 'commitments matching a filter', making the tool's function immediately clear. It also distinguishes this query tool from sibling mutation tools like upsert_commitment and send_nudge by focusing on retrieval and filtering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states it is used by the scheduler to find items due for poll or nudge checks, providing a concrete when-to-use context. It also notes that with no filters it returns every commitment, which is an implicit warning about broad results. It does not explicitly mention alternative tools, but the use case is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_demoA

Wipes the commitment store, ticket store, and resets the virtual clock to today. Use this to restart the demo scenario cleanly.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of indicating destructive behavior. The verb 'wipes' clearly conveys that data is erased, and 'resets the virtual clock' is explicit about the clock behavior. It could go further by stating irreversibility, but the language is sufficient for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the action and then providing usage context. Every word earns its place; there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema), the description is complete. It covers what the tool does, what stores are affected, and when to use it. It also differentiates from sibling 'simulate_days_passing' by specifying it resets to today.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100% (trivially). The description adds no parameter information, but none is needed since the tool takes no inputs. The baseline of 4 is appropriate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('wipes', 'resets') and identifies the exact resources affected (commitment store, ticket store, virtual clock), making it distinct from siblings like 'simulate_days_passing' (which advances the clock) and 'upsert_commitment' (which modifies individual records).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'Use this to restart the demo scenario cleanly.' It does not explicitly exclude other tools, but the context is clear enough that an agent would know this is for resetting demo state rather than for ongoing operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_email_evidenceA

Searches a mocked inbox/sent-items store for emails relevant to a commitment — e.g. mail sent to an external beneficiary that proves the work shipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceYesYYYY-MM-DD — only emails on or after this date
query_termsYes
to_domain_hintNoe.g. acmelogistics.com

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It only says 'searches' (implied read-only) and 'mocked' (test environment), but does not disclose return format, ordering, pagination, side effects, or any safety details. This is a significant gap for a tool operating on a store.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no fluff, front-loaded with the action and then a helpful example that justifies the tool's existence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, but with no output schema, the description should at least hint at what is returned. It does not mention return values, result caps, or any limitations. Example usage helps, but completeness is only adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67% (2 of 3 params described). The description adds domain context (external beneficiary, shipped work) that clarifies query terms, but does not fully explain how params interact or what to_domain_hint does beyond the schema example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches a mocked inbox/sent-items store for emails relevant to a commitment, with a concrete example. It distinguishes from sibling tools like search_slack_evidence by focusing on email evidence, though it does not explicitly name the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example (mail sent to an external beneficiary) provides clear context for when to use the tool. It does not explicitly exclude other tools or list alternatives, but the use case is well-illustrated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_slack_evidenceA

Searches Slack for messages that could constitute evidence a commitment was fulfilled. Returns raw candidate messages; the verification agent scores them semantically rather than trusting keyword hits.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceYesYYYY-MM-DD — only messages on or after this date
query_termsYesKeywords or phrases from the commitment to match
channel_hintNoe.g. vendor-acme
participant_slack_idNoRestrict to one author

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It accurately notes that results are raw candidate messages and that semantic scoring is the verification agent's responsibility—not the tool's. This is honest about the tool's limitations and the need for downstream processing, though it omits details like rate limits or result limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the primary action and purpose, and includes only essential context about return behavior. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward search tool with four well-documented parameters and no output schema, the description provides sufficient context: it clarifies the purpose, the nature of results (raw candidates), and how results should be consumed. It could mention result limits or sorting, but that is minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage, with each parameter having a description. The tool description adds no additional parameter-level detail beyond the schema, so the baseline of 3 is appropriate. It does not explain parameter interactions or provide examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: searching Slack for messages that could constitute evidence a commitment was fulfilled. It specifies the resource (Slack messages), the purpose (evidence of fulfilled commitments), and distinguishes it from the sibling search_email_evidence by scope and result handling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: use this tool when you need to find Slack messages as evidence of commitment fulfillment. It does not explicitly name alternatives or exclusions, but the sibling list includes search_email_evidence, and the Slack-specific scope makes the intended context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_nudgeA

Sends a contextual reminder to the commitment owner via Slack or email, referencing the original commitment language and deadline. Tone calibration: gentle first, specific second, urgent only on hard blockers.

ParametersJSON Schema
NameRequiredDescriptionDefault
toneYes
channelYes
recipientYesSlack ID or email of the owner
message_bodyYesMessage text; must quote the original commitment phrase
commitment_idYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that the reminder references 'original commitment language and deadline', implying the tool fetches commitment data. But it does not mention delivery guarantees, authentication needs, or potential side effects like notifications, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. First sentence establishes purpose; second provides tone calibration. Information is front-loaded, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 5 parameters and no output schema or annotations, so the description needs to cover more ground. It adequately covers purpose and tone, but misses explicit alternatives, delivery behavior, and output/confirmation details. Given moderate complexity, it's minimally viable but not rich.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, but the description compensates by clarifying the tone parameter's intended progression ('gentle first, specific second, urgent only on hard blockers'). It also explains that the reminder references original commitment language and deadline, giving meaning to commitment_id and message_body. However, it doesn't explicitly detail all parameters, so compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Sends a contextual reminder to the commitment owner via Slack or email', identifying the specific action, target, and channels. It also distinguishes itself from siblings like linear_update_status by focusing on nudging rather than status updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tone calibration guidance ('gentle first, specific second, urgent only on hard blockers') provides clear context for when to use each tone. However, it lacks explicit comparison to alternative tools or conditions, so it doesn't fully meet the 'when-not-to-use' criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simulate_days_passingA

Advances the internal clock by N days and runs one scheduler poll. This is the demo control that makes a week of chasing observable in seconds. In production the scheduler polls itself on a real interval (SCHEDULER_INTERVAL_MS) — this tool exists so the full open → nudge → escalate lifecycle can be shown live.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysYesNumber of days to fast-forward

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the core behavior (advancing the clock, triggering one scheduler poll) and explains the demo purpose, which implies potential cascading effects like nudges or escalations. It could add more detail about exact side effects or return values, but it provides a solid behavioral model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the action, the second provides context and rationale. Every sentence earns its place, with no filler or repetition. The key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter demo tool with no output schema, the description covers the mechanism (clock advance, scheduler poll), the purpose (demo lifecycle), and the contrast with production. It does not explicitly state what the agent sees after calling it, but the context of 'making the lifecycle observable' implies a sufficient outcome. Overall, it is complete for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of the parameter with a clear description ('Number of days to fast-forward'), so the baseline is 3. The tool description reiterates 'N days' but adds no new semantic detail (e.g., allowed range, units, or consequences of large values) beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Advances the internal clock by N days and runs one scheduler poll') and identifies it as a demo control, distinguishing it from production scheduler behavior and sibling tools like reset_demo and send_nudge. This specificity makes its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames the tool as a demo control for making a week of chasing observable, and contrasts with production where the scheduler polls on a real interval. This tells the agent when to use it (live demos) and implicitly not to rely on it in production. It doesn't name alternative sibling tools, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upsert_commitmentB

Creates or updates a commitment record in the durable store. The store is the source of truth for every commitment lifecycle state.

ParametersJSON Schema
NameRequiredDescriptionDefault
commitmentYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that the store is durable and the source of truth for lifecycle state, but it fails to explain key behaviors such as whether updates are partial or full replacements, how existing records are matched (e.g., by commitment_id), idempotency, or potential side effects like overwriting fields. This is a significant gap for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise—two short sentences—and immediately front-loads the core action and resource. No filler or redundancy. Every word contributes purpose or context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complex nested schema, no annotations, and no output schema, the description is insufficiently complete. It communicates the basic upsert semantics but leaves out essential operational details: what fields are required to create a valid commitment, how updates are applied, how the tool identifies an existing record, and what the response contains. An agent would struggle to correctly invoke this tool for real tasks.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only one parameter 'commitment' with rich nested structure but zero property descriptions. The description adds no meaning beyond the schema, merely calling it a 'commitment record'. It does not explain any of the nested fields, required subfields, or the significance of fields like status, confidence_level, or nudge_log. With 0% schema description coverage, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb 'Creates or updates' and a specific resource 'commitment record in the durable store'. It distinguishes itself from sibling tools like query_commitments (read) and extract_commitments (extraction), and the 'source of truth' phrase reinforces its authoritative write role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for creating or updating commitments, but it does not explicitly state when to use this tool versus alternatives like promote_commitment or send_nudge, nor does it mention when not to use it. The 'source of truth' statement provides some context but no direct exclusions or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct action or resource: extraction, store CRUD, query, nudge, escalation, evidence search, and demo controls are clearly separated. Even the Linear tools are distinct (create, read, update, escalate) with no overlapping purposes.

Naming Consistency5/5

All tool names follow a consistent verb-first snake_case pattern (e.g., extract_commitments, query_commitments, linear_update_status). The linear_ prefix is used uniformly for Linear-related tools, and the rest follow standard verb_noun naming with no style mixing.

Tool Count5/5

With 14 tools, the set is well-scoped for the commitment lifecycle domain—covering extraction, tracking, nudging, escalation, evidence gathering, and demo resets. Each tool serves a necessary role, and the count sits comfortably within the ideal range.

Completeness5/5

The tool surface covers the full workflow from commitment extraction to follow-up, escalation, evidence verification, and closure via Linear status updates. Demo utilities are intentionally separated, and there are no obvious dead ends for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A persistent state machine and notification system for AI agents to manage complex, multi-step workflows via the Model Context Protocol, preventing context drift by maintaining structured checklists and sending desktop alerts.
    14
    16
    2
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Provides AI agents with a lightweight task-management and self-verification layer to define goals, track checkpoints, detect scope drift, and verify completion against explicit done criteria.
    12
    MIT

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/ionfwsrijan/FollowThrough'

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