Skip to main content
Glama
Faneraiy14
by Faneraiy14

workspace-status-mcp

Українською

An MCP server with five tools:

  • sweep_status — a one-call snapshot of every git repository under a given folder: branch, uncommitted changes, unpushed commits, and (optionally) the latest GitHub Actions CI conclusion. Replaces manually looping git status + gh run list over dozens of repos one at a time.

  • check_docs — flags which repos' Architecture/<repo>.txt doc is missing or stale. Doesn't write or regenerate anything itself (understanding a codebase well enough to document it is an LLM/human job, not a script's) — it just says where to look, so docs get updated deliberately instead of silently rotting.

  • write_doc — writes Architecture/<repo>.txt and stamps it with the repo's current commit hash, so check_docs can later measure staleness precisely (commits since write) instead of guessing from file mtime.

  • check_release_drift — for explicit (source repo, release repo) pairs, counts how many commits landed in the source since the release repo's last git tag, and how old the oldest one is. Cutting a release is usually a manual "whenever I remember" step (tag a version, push it, CI builds and publishes) — this answers "has anyone actually done that lately" without checking by hand.

  • check_pr_status — a one-call snapshot of several GitHub PRs at once: state, mergeable, review decision, CI status, and — separately — how many top-level and inline review comments each has, with the latest author/timestamp of each kind. Top-level (issue) comments and inline (review) comments are two genuinely different GitHub API resources; a PR reviewed with inline comments only can look untouched if you check just the review body. Replaces looping gh pr view + two separate gh api .../comments calls per PR.

Why

Working across ~50 repositories in the same workspace, "what actually needs attention right now" was a real recurring question — checked by hand, repo by repo, over and over in the same session. sweep_status answers it in one call and, by default, only returns repos that actually need a look (dirty working tree, unpushed commits, or a CI run that isn't a plain success) — clean repos are silently skipped so the answer stays short.

check_docs exists for the same reason, one level up: a per-project architecture doc is only useful if it's trusted, and it's only trusted if someone actually checks it's current. Comparing "last commit" to "doc's mtime" turns that from a thing you have to remember into a thing you can just ask.

Related MCP server: gitops-drift-agent

Claude Code hook: check-docs-reminder

The tools above only help if something actually calls them. hooks/check-docs-reminder.mjs closes that gap: registered as a SessionStart + Stop hook in ~/.claude/settings.json, it runs checkDocs() itself against whatever repo Claude's current working directory is under (walking up to the nearest git root that's a direct child of the projects folder), and — only when that repo's doc is missing or stale — injects a one-line reminder into Claude's context via hookSpecificOutput.additionalContext. Silent otherwise (clean repos, or a cwd outside the projects folder, produce no output; likewise if the projects folder never had an Architecture/ folder at all — someone who's never opted into this convention doesn't get nagged about every repo being "missing"). SessionStart covers forgetting between sessions; Stop (which fires each time Claude's turn ends) re-checks every turn within the same session too, and self-quiets the moment write_doc actually gets called. Deliberately non-blocking — a stale doc is worth a nudge, not a halted turn.

Not hardcoded to any one person's folder layout, and works the same on Windows as Linux/macOS. Register it with the args array ("exec form" — spawned directly, no shell involved, so there's no bash-vs-PowerShell-vs-cmd syntax difference to worry about):

{
  "hooks": {
    "SessionStart": [{ "hooks": [{ "type": "command", "command": "node",
      "args": ["/path/to/workspace-status-mcp/hooks/check-docs-reminder.mjs", "SessionStart"] }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "node",
      "args": ["/path/to/workspace-status-mcp/hooks/check-docs-reminder.mjs", "Stop"] }] }]
  }
}

Watch points

Not every repo necessarily lives under one root — one might get moved out of ~/Projects onto the Desktop, say, with its doc sitting right next to it there instead of in the central Architecture/ folder. The hook resolves "watch points" (projectsRoot + optional docsRoot pairs) in this order, using the first point whose projectsRoot contains the repo you're currently in:

  1. CLI args (args[2]/args[3] after the event name) — a one-off single-point override.

  2. The watch-points config file~/.claude/workspace-status-points.json by default (override the path with WATCH_POINTS_FILE). This is the normal way to manage this day to day:

    {
      "points": [
        { "projectsRoot": "/home/sviat/Projects" },
        { "projectsRoot": "/home/sviat/Desktop", "docsRoot": "/home/sviat/Desktop" }
      ]
    }

    Add a point, remove one (or all of them), or redirect an existing one just by editing this file — no code change, no re-registering the hook. A missing file, or an empty/absent points array, falls through to the next source below.

  3. PROJECTS_ROOT/DOCS_ROOT environment variables — single-point fallback for anyone registering the hook through a shell command instead of the args exec form.

  4. Default: a single point at <home>/Projects.

check_docs/sweep_status accept the same idea directly as points/roots arguments (see below) if you want to query multiple locations from a conversation without touching the config file.

Install

npm install

Requires the GitHub CLI (gh), authenticated, if you want CI status (check_ci: true, the default). Without it CI results just come back as null per repo.

Cross-platform — all five tools and the hook are plain Node.js (path.join, os.homedir(), no hardcoded /) shelling out to git/gh, both of which run natively on Windows too. No platform-specific code path.

Updating

There's no separate build or publish step — claude mcp add points straight at this checkout's src/server.js, so updating is just:

git pull && npm install

Take effect on the next new Claude Code session (each session spawns its own MCP server process, so an already-running session keeps using the code it started with).

Tool: sweep_status

Argument

Type

Default

Meaning

root

string

— (required unless roots)

Folder to scan, one level deep (e.g. /home/user/Projects)

roots

string[]

Several roots in one call instead of one root — results are merged (e.g. repos split between ~/Projects and elsewhere)

repos

string[]

all subfolders

Limit to specific repo names instead of scanning everything (matched across all roots)

check_ci

boolean

true

Also query GitHub Actions for each repo's latest run

only_attention

boolean

true

Only return repos that need a look; false returns everything

Each repo entry: name, path, branch, uncommittedFiles (count), ahead/behind (vs upstream, null if no upstream configured), hasUpstream, and ci ({status, conclusion, workflow, url} or null).

Tool: check_docs

Argument

Type

Default

Meaning

projectsRoot

string

— (required unless points)

Folder with the repos

docsRoot

string

<projectsRoot>/Architecture

Folder with the <repo>.txt docs

points

{projectsRoot, docsRoot?}[]

Several independent projectsRoot+docsRoot pairs in one call instead of one projectsRoot/docsRoot (e.g. a repo moved out of ~/Projects, doc sitting right next to it wherever it went)

repos

string[]

all subfolders

Limit to specific repo names (applied within each point independently)

only_attention

boolean

true

Only return missing/stale; false returns everything including current

Each repo entry: name, projectsRoot (which point it came from), docPath, status (missing / stale / current / no-commits), trackingMethod (commit if the doc was written via write_doc, mtime otherwise — see below), lastCommitAt, and either commitsSinceWrite/writtenAtCommit/writtenAt (commit tracking) or docUpdatedAt/staleBySeconds (mtime tracking, only on stale).

Tool: write_doc

Argument

Type

Default

Meaning

projectsRoot

string

— (required)

Folder with the repos

repo

string

— (required)

Repo folder name (e.g. "anylint")

content

string

— (required)

Full text to write to <repo>.txt

docsRoot

string

<projectsRoot>/Architecture

Folder with the <repo>.txt docs

Writes <repo>.txt and, next to it, .meta/<repo>.json with the repo's HEAD commit hash at write time. check_docs then reports the exact number of commits since the doc was written (git rev-list --count) instead of the coarser mtime-vs-last-commit-time comparison — the same pattern check_release_drift already uses for source→release drift. Docs written directly (e.g. via a plain file write, not this tool) keep using mtime tracking — there's no meta file to compare against.

Tool: check_release_drift

Argument

Type

Default

Meaning

projectsRoot

string

— (required)

Folder with the repos

pairs

{source, release}[]

— (required)

Explicit list of source→release folder-name pairs

only_attention

boolean

true

Only return drifted; false returns everything including current/no-tags

Each pair entry: source, release, status (drifted / current / no-tags), and on drifted: latestTag, tagCreatedAt, commitsSinceTag, oldestUnreleasedCommitAt, oldestUnreleasedAgeDays.

Tool: check_pr_status

Argument

Type

Default

Meaning

prs

{repo, number}[]

— (required)

PRs to check, repo as "owner/name"

only_attention

boolean

true

Only return PRs that are DIRTY (merge conflict), CHANGES_REQUESTED, or have a failing CI check; false returns everything

Each entry: title, url, state, mergedAt, mergeable, mergeStateStatus, reviewDecision, ciStatus (success / failure / pending / none), comments ({total, last: {author, at} | null} — top-level issue comments), reviewComments (same shape, inline review comments), needsAttention. A PR that fails to fetch (bad repo/number) gets {repo, number, error} instead of throwing and losing the rest of the batch.

classifyPr() in src/pr-status.js is the pure decision logic (given already-fetched raw data, no network) — unit-tested with fixtures separately from the real gh calls, which are verified against actual merged PRs instead.

Architecture

  • src/sweep.js — all the logic: finds .git folders one level under a root (exported as findGitRepos, reused by docs.js), then for each one runs git branch/git status/git rev-list and (optionally) gh run list in parallel, batched at 8 repos at a time to avoid hammering the GitHub API. sweepStatus()'s roots (plural) runs findGitRepos per root and merges the results before filtering by repos/only_attention — so a repo name filter matches regardless of which root it actually lives under.

  • src/docs.jscheckDocs(): prefers commit-based tracking (.meta/<repo>.json, written by write_doc) when available; falls back to comparing git log -1 --format=%ct against the doc file's mtime for docs written directly. A repo with no commits yet reports no-commits rather than being silently lumped into missing or current. points (plural) checks each independent projectsRoot+docsRoot pair in turn and tags every result with which one it came from.

  • src/write-doc.jswriteDoc(): writes <repo>.txt plus .meta/<repo>.json ({commitHash, writtenAt}, HEAD at write time). Doesn't generate the text itself — understanding a codebase well enough to document it stays an LLM/human job.

  • src/pr-status.jscheckPrStatus(): fetches gh pr view plus both comment endpoints (issues/{n}/comments for top-level, pulls/{n}/comments for inline review comments — deliberately separate, since a PR reviewed only with inline comments looks untouched if you check just the review body) per PR, batched at 6 at a time. classifyPr() is the pure part (decides needsAttention, picks the latest comment of each kind) — no network, so it's tested with fixtures independently of the real gh calls.

  • src/server.js — registers all five tools with the MCP SDK over the stdio transport.

  • test/smoke.mjssweep_status against real local repos for the clean/dirty cases (no synthetic fixtures needed — the workspace itself already has both to test against), a throwaway local git repo for the no-upstream case (an incidental empty folder under ~/Projects used to serve this, until it got renamed away mid-session and silently broke the test — not something to depend on again), plus a roots (plural) case against a real root and a throwaway empty one.

  • test/pr-status.mjsclassifyPr() against fixture data (clean/DIRTY/ CHANGES_REQUESTED/CI-failure/CI-pending, comments counted separately per kind, a merged PR never flagged regardless of leftover DIRTY state), plus checkPrStatus() against real, permanently-merged PRs in two different repos (mergedAt/state won't change), a multi-PR batch call, and a nonexistent PR number returning {error} in its own entry instead of failing the whole batch.

  • test/docs.mjscheck_docs against temporary, throwaway git repos with controlled commit/file timestamps (real ~/Projects drifts over time, which would make a fixed test flaky), including both tracking methods and a points (plural) case.

  • test/write-doc.mjswriteDoc() against a temporary git repo: correct HEAD captured, .meta/ created on demand, empty content rejected.

  • test/hook.mjshooks/check-docs-reminder.mjs as a real subprocess (it's a CLI entry point, not a library function): silent outside any watch point, silent with no Architecture/ folder at all, reminds and resolves the right repo from a nested subdirectory, the watch-points config file driving two independent points at once, and an empty/absent points array in that file falling through to the next source.

  • src/release-drift.jscheckReleaseDrift(): finds the release repo's most recent tag via git for-each-ref --sort=-creatordate (sorted by actual tag time, not the semver-string sort -v:refname would give — v1.10 would otherwise sort before v1.9), then counts git log --since=@<tagTimestamp> in the source repo. The source↔release relationship isn't guessable from folder structure (no general rule "folder X releases folder Y"), so the caller passes pairs explicitly.

  • test/release-drift.mjs — temporary repos with explicit GIT_AUTHOR_DATE/GIT_COMMITTER_DATE per commit (not relying on real wall-clock gaps between commits made milliseconds apart in a test run, which git log --since's second-level granularity could otherwise make flaky), plus one live check against the real NyxilumLang→NyxilumNode pair that only asserts it doesn't throw.

License

MIT — Faneraiy14.

Available Tools

4 tools
check_docsДетектор застарілої/відсутньої архітектурної документаціїA

Перевіряє актуальність ~/Projects/Architecture/.txt кожного git-репозиторія: "missing" (документації нема взагалі), "stale" (репо мав нові зміни після документа), "current" (актуально), "no-commits" (репо ще без жодного коміту). Для документів, записаних через write_doc, рахує ТОЧНУ кількість комітів з моменту запису (trackingMethod: "commit"); для решти - грубший запасний варіант за mtime файлу (trackingMethod: "mtime"). НЕ генерує/переписує документацію сам - лише каже, куди дивитись, щоб AI-асистент (чи людина) писав/оновлював цілеспрямовано, а не перечитував усе підряд щосесії. Документація розкидана між кількома незалежними парами корінь+Architecture-тека (напр. репо, винесене з ~/Projects, з документом прямо поруч на новому місці)? Передай points замість projectsRoot/docsRoot.

ParametersJSON Schema
NameRequiredDescriptionDefault
reposNoОбмежитись конкретними назвами тек замість повного сканування (застосовується в межах кожної точки окремо)
pointsNoКілька незалежних пар корінь+документація за один виклик замість одної projectsRoot/docsRoot
docsRootNoТека з .txt-документацією для projectsRoot (типово "<projectsRoot>/Architecture")
projectsRootNoАбсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects"). Не потрібен, якщо задано points
only_attentionNoПоказати лише missing/stale (типово true; false - повний список, включно з current)

TDQS

A4.3/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 full burden. It discloses that the tool is non-destructive (never generates/rewrites docs), defines all four statuses, and reveals the two tracking methods (exact commit-count for write_doc-created docs vs coarse mtime fallback), which materially affects how an agent interprets results. Lacks a concrete return-format statement but is otherwise strong.

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?

Every clause earns its place—core behavior and statuses are front-loaded, then tracking methods, non-goal, and the points edge-case follow in rough priority order. Slightly dinged because it is one dense run-on paragraph where the important non-goal line and the points branching guidance are buried mid-text rather than structured.

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?

No output schema exists, but the description compensates well by naming all four status categories, explaining both invocation modes (single root pair vs points), and covering the tracking-method distinction. The remaining gap is the absence of a concrete example or stated return format, which is minor for a status-check tool with fully self-documenting parameters.

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 description coverage is 100%, so the baseline is 3. The description adds real value beyond the schema by explaining when to pass points instead of projectsRoot/docsRoot (scattered independent root/doc pairs, e.g., a repo moved out of ~/Projects) and by clarifying trackingMethod semantics tied to how documents are processed.

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?

Uses a specific verb ('Перевіряє актуальність') with a specifiic resource (архітектurнa documentatіon per git repo) and enumerates the four outcome catеgorіes (missing/stаle/current/no-commits). The non-goal statement 'НЕ генерує/переписує документацію сам' explicitly disambiguates іt from the sibling write_doc.

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?

States the intended usage context clearly: it tells the agent where to look so the assistant writes/updates purposefully instead of re-reading everything each session. The explicit non-goal ('НЕ генерує/переписує документацію сам') implicitly routes writing to write_doc, but no explicit when-not-to-use guidance is given for sweep_status or check_release_drift.

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

check_release_driftДетектор "реліз відстав від джерела"A

Для явних пар (репо з вихідним кодом, репо, що з нього тегує релізи) рахує, скільки комітів з'явилось у джерелі відколи реліз востаннє тегувався, і наскільки давно найстарший із них. Зв'язок джерело->реліз не вгадується автоматично зі структури тек - передавай пари явно (напр. {source:"NyxilumLang", release:"NyxilumNode"}).

ParametersJSON Schema
NameRequiredDescriptionDefault
pairsYesЯвний список пар для перевірки
projectsRootYesАбсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects")
only_attentionNoПоказати лише пари з реальним дрейфом (типово true; false - усе, включно з current)

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It does disclose an important behavior: the tool does not guess source→release mappings and requires explicit pairs. However, it does not explicitly state that the tool is read-only, what happens for invalid pairs, or whether it depends on local git state, leaving some behavioral 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?

The description is two sentences with no filler. It front-loads the core computation, then provides the critical caveat and an example. Every sentence contributes useful 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 tool with no output schema and no annotations, the description covers the essential inputs, the core computation, and a key limitation. It could be more complete by describing the output format or edge cases, but the description is strong enough for correct selection and invocation.

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 description coverage is 100%, so the schema already documents all parameters. The description adds value beyond the schema by clarifying the pair semantics and providing a concrete example of the expected pair structure, which helps the agent construct valid input.

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 states a specific operation: counting commits in a source repo since the last release tag and measuring the age of the oldest such commit. This clearly identifies the tool's function and distinguishes it from the sibling tools, which concern sweep status, docs, and doc writing.

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 gives clear usage context: the tool works on explicit source→release pairs and explicitly warns that the relationship is not auto-detected from folder structure. It does not explicitly discuss alternatives or when not to use the tool, but the provided context is sufficient for an agent to invoke it correctly.

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

sweep_statusЗнімок стану всіх git-репозиторіїв у теціA

Сканує всі git-репозиторії під заданим коренем (типово ~/Projects) і одним викликом повертає, які з них "потребують уваги": незакомічені зміни, неопубліковані коміти, або невдалий/ще не завершений останній CI-запуск. Заміняє ручний цикл git status + gh run list по кожному репо окремо. Репо розкидані між кількома коренями (напр. частина в ~/Projects, частина деінде)? Передай roots замість root - скановуються всі разом, одним викликом.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoАбсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects"). Не потрібен, якщо задано roots
reposNoОбмежитись конкретними назвами тек замість повного сканування (шукає серед репо з усіх коренів)
rootsNoКілька коренів за один виклик замість одного root - результати об'єднуються
check_ciNoОпитувати GitHub Actions для кожного репо (типово true; false - швидший, чисто локальний знімок без мережі)
only_attentionNoПоказати лише репо, що потребують уваги (типово true; false - повний список, включно з чистими)

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 transparency burden. It explains that the tool scans, checks CI status, and returns attention-requiring repos, implying read-only network polling. However, it does not disclose authentication needs, rate limits, error behavior, or explicitly confirm that it makes no mutations.

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?

Three concise, purposeful sentences. The main function is front-loaded, the manual-workflow replacement is stated, and the multi-root usage tip is separated clearly. No redundant or filler content.

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 tool with no output schema and no annotations, the description covers the core behavior, what counts as attention-worthy, the default root, and the multi-root option. It does not specify the exact return shape or network/auth caveats, but it gives an agent enough to decide when and how to invoke the tool.

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% description coverage for all 5 parameters, so the baseline is 3. The description adds a useful default (~/Projects) and emphasizes roots-vs-root use, but much of that is already reflected in the schema descriptions.

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 states a precise verb and resource: it scans all git repositories under a root and returns which ones need attention (uncommitted changes, unpublished commits, failed/unfinished CI). This clearly differentiates it from the sibling tools like check_docs or write_doc through its batch git-status purpose.

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 replacing a manual loop of git status + gh run list, which gives clear usage context. It also gives conditional guidance for the root vs roots parameters. It does not explicitly mention when not to use the tool, but the context is clear enough for selection.

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

write_docЗаписати архітектурну документацію репо з прив'язкою до комітуA

Записує ~/Projects/Architecture/.txt і поруч фіксує commit-хеш репозиторія на момент запису. Після цього check_docs може рахувати РЕАЛЬНУ кількість комітів з моменту запису (git rev-list --count) замість грубого порівняння за mtime файлу. Текст документації інструмент не генерує - лише зберігає вже готовий текст (розуміння коду для документування лишається завданням AI/людини).

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesНазва теки репозиторія (напр. "anylint")
contentYesПовний текст документації для запису в <repo>.txt
docsRootNoТека з .txt-документацією (типово "<projectsRoot>/Architecture")
projectsRootYesАбсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects")

TDQS

A4.2/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 transparency burden. It discloses the file write, the commit-hash capture, the downstream benefit for check_docs, and the limitation that documentation text is not generated. It does not detail overwrite behavior or failure conditions, but these are minor for this kind of persistence tool.

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 focused sentences: what it writes, why the commit-hash matters, and what it does not do. The operational facts are front-loaded and every sentence carries distinct information without 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 write tool with a fully documented schema, the description gives enough context for correct invocation: output path pattern, content expectation, commit-hash recording, and the relationship to check_docs. It does not specify return values or explicit prerequisites, but no output schema exists and the provided context is otherwise 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 100%, so all four parameters are already documented and the baseline is 3. The description adds a little contextual meaning, such as repo being used in the output filename and content being pre-existing text, but it does not materially change the parameter semantics 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 names a concrete action — writes documentation to ~/Projects/Architecture/<repo>.txt — and uniquely adds the commit-hash side effect. It also clearly states what the tool does not do (does not generate documentation text), which distinguishes it from siblings like check_docs and check_release_drift.

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 makes the intended sequence clear: write with this tool first, then check_docs can use the recorded commit hash for accurate counting. It also explicitly says the tool only saves already-prepared text, so an agent knows not to invoke it for generation. It stops short of naming explicit alternatives or when-not-to-use conditions, but the context is sufficient.

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.

  1. 4 tool updatesv0.5.0
    • First observedcheck_docs
    • First observedcheck_release_drift
    • First observedsweep_status
    • First observedwrite_doc

TDQS

A4.4/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct concern: sweep_status covers git/CI status, check_docs covers architecture-doc freshness, check_release_drift covers release lag, and write_doc supports doc tracking. Any conceptual overlap, such as staleness, is clearly separated by the resource being checked.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: sweep_status, check_docs, check_release_drift, write_doc. The check_ prefix is used uniformly for health/diagnostic operations.

Tool Count5/5

Four tools is well-scoped for a workspace-status server: one general status sweep, two specialized checks, and one supporting write operation. No tool is redundant or extraneous.

Completeness5/5

The set covers the full workflow for its domain: identifying repo status, checking and writing architecture docs, and measuring release drift. The release-drift pair requirement is an explicit design boundary rather than a missing operation.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers