workspace-status-mcp
This server provides MCP tools to monitor and maintain a multi-repo workspace by checking git statuses, documentation freshness, release drift, and GitHub PRs.
sweep_status— scan one or more project roots and get a one-call snapshot of every git repo: branch, uncommitted changes, unpushed commits, and optional GitHub Actions CI status; can filter to only repos needing attention.check_docs— detect missing or staleArchitecture/<repo>.txtdocs, using either exact commit-based tracking or mtime fallback, and support multiple independent project/docs root pairs.write_doc— write an architecture doc plus a metadata file with the repo's current commit hash so later staleness checks are precise.check_release_drift— for explicit source→release repo pairs, count commits in the source since the release repo's latest tag and report how old the oldest unreleased commit is.check_pr_status— check multiple GitHub PRs at once: state, mergeability, review decision, CI status, and counts of top-level vs inline review comments with latest author/timestamp.
Provides visibility into local Git repositories, reporting branch, uncommitted changes, unpushed commits, and commit drift between source and release repos.
Queries the latest GitHub Actions CI run status and conclusion for repositories, making it easy to spot failing or non-success CI runs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@workspace-status-mcpSweep all repos in ~/Projects for git and CI status"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 loopinggit status+gh run listover dozens of repos one at a time.check_docs— flags which repos'Architecture/<repo>.txtdoc 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— writesArchitecture/<repo>.txtand stamps it with the repo's current commit hash, socheck_docscan 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 loopinggh pr view+ two separategh api .../commentscalls 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:
CLI args (
args[2]/args[3]after the event name) — a one-off single-point override.The watch-points config file —
~/.claude/workspace-status-points.jsonby default (override the path withWATCH_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
pointsarray, falls through to the next source below.PROJECTS_ROOT/DOCS_ROOTenvironment variables — single-point fallback for anyone registering the hook through a shell command instead of theargsexec form.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 installRequires 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 installTake 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 |
| string | — (required unless | Folder to scan, one level deep (e.g. |
| string[] | — | Several roots in one call instead of one |
| string[] | all subfolders | Limit to specific repo names instead of scanning everything (matched across all roots) |
| boolean |
| Also query GitHub Actions for each repo's latest run |
| boolean |
| Only return repos that need a look; |
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 |
| string | — (required unless | Folder with the repos |
| string |
| Folder with the |
|
| — | Several independent projectsRoot+docsRoot pairs in one call instead of one |
| string[] | all subfolders | Limit to specific repo names (applied within each point independently) |
| boolean |
| Only return missing/stale; |
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 |
| string | — (required) | Folder with the repos |
| string | — (required) | Repo folder name (e.g. |
| string | — (required) | Full text to write to |
| string |
| Folder with the |
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 |
| string | — (required) | Folder with the repos |
|
| — (required) | Explicit list of source→release folder-name pairs |
| boolean |
| Only return |
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 |
|
| — (required) | PRs to check, |
| boolean |
| Only return PRs that are |
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.gitfolders one level under a root (exported asfindGitRepos, reused bydocs.js), then for each one runsgit branch/git status/git rev-listand (optionally)gh run listin parallel, batched at 8 repos at a time to avoid hammering the GitHub API.sweepStatus()'sroots(plural) runsfindGitReposper root and merges the results before filtering byrepos/only_attention— so a repo name filter matches regardless of which root it actually lives under.src/docs.js—checkDocs(): prefers commit-based tracking (.meta/<repo>.json, written bywrite_doc) when available; falls back to comparinggit log -1 --format=%ctagainst the doc file's mtime for docs written directly. A repo with no commits yet reportsno-commitsrather than being silently lumped intomissingorcurrent.points(plural) checks each independent projectsRoot+docsRoot pair in turn and tags every result with which one it came from.src/write-doc.js—writeDoc(): writes<repo>.txtplus.meta/<repo>.json({commitHash, writtenAt},HEADat write time). Doesn't generate the text itself — understanding a codebase well enough to document it stays an LLM/human job.src/pr-status.js—checkPrStatus(): fetchesgh pr viewplus both comment endpoints (issues/{n}/commentsfor top-level,pulls/{n}/commentsfor 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 (decidesneedsAttention, picks the latest comment of each kind) — no network, so it's tested with fixtures independently of the realghcalls.src/server.js— registers all five tools with the MCP SDK over the stdio transport.test/smoke.mjs—sweep_statusagainst 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~/Projectsused to serve this, until it got renamed away mid-session and silently broke the test — not something to depend on again), plus aroots(plural) case against a real root and a throwaway empty one.test/pr-status.mjs—classifyPr()against fixture data (clean/DIRTY/ CHANGES_REQUESTED/CI-failure/CI-pending, comments counted separately per kind, a merged PR never flagged regardless of leftoverDIRTYstate), pluscheckPrStatus()against real, permanently-merged PRs in two different repos (mergedAt/statewon'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.mjs—check_docsagainst temporary, throwaway git repos with controlled commit/file timestamps (real~/Projectsdrifts over time, which would make a fixed test flaky), including both tracking methods and apoints(plural) case.test/write-doc.mjs—writeDoc()against a temporary git repo: correctHEADcaptured,.meta/created on demand, empty content rejected.test/hook.mjs—hooks/check-docs-reminder.mjsas a real subprocess (it's a CLI entry point, not a library function): silent outside any watch point, silent with noArchitecture/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/absentpointsarray in that file falling through to the next source.src/release-drift.js—checkReleaseDrift(): finds the release repo's most recent tag viagit for-each-ref --sort=-creatordate(sorted by actual tag time, not the semver-string sort-v:refnamewould give —v1.10would otherwise sort beforev1.9), then countsgit 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 explicitGIT_AUTHOR_DATE/GIT_COMMITTER_DATEper commit (not relying on real wall-clock gaps between commits made milliseconds apart in a test run, whichgit 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 toolscheck_docsДетектор застарілої/відсутньої архітектурної документаціїA
Перевіряє актуальність ~/Projects/Architecture/.txt кожного git-репозиторія: "missing" (документації нема взагалі), "stale" (репо мав нові зміни після документа), "current" (актуально), "no-commits" (репо ще без жодного коміту). Для документів, записаних через write_doc, рахує ТОЧНУ кількість комітів з моменту запису (trackingMethod: "commit"); для решти - грубший запасний варіант за mtime файлу (trackingMethod: "mtime"). НЕ генерує/переписує документацію сам - лише каже, куди дивитись, щоб AI-асистент (чи людина) писав/оновлював цілеспрямовано, а не перечитував усе підряд щосесії. Документація розкидана між кількома незалежними парами корінь+Architecture-тека (напр. репо, винесене з ~/Projects, з документом прямо поруч на новому місці)? Передай points замість projectsRoot/docsRoot.
| Name | Required | Description | Default |
|---|---|---|---|
| repos | No | Обмежитись конкретними назвами тек замість повного сканування (застосовується в межах кожної точки окремо) | |
| points | No | Кілька незалежних пар корінь+документація за один виклик замість одної projectsRoot/docsRoot | |
| docsRoot | No | Тека з .txt-документацією для projectsRoot (типово "<projectsRoot>/Architecture") | |
| projectsRoot | No | Абсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects"). Не потрібен, якщо задано points | |
| only_attention | No | Показати лише missing/stale (типово true; false - повний список, включно з current) |
TDQS
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.
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.
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.
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.
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.
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"}).
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | Yes | Явний список пар для перевірки | |
| projectsRoot | Yes | Абсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects") | |
| only_attention | No | Показати лише пари з реальним дрейфом (типово true; false - усе, включно з current) |
TDQS
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.
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.
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.
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.
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.
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 - скановуються всі разом, одним викликом.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | Абсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects"). Не потрібен, якщо задано roots | |
| repos | No | Обмежитись конкретними назвами тек замість повного сканування (шукає серед репо з усіх коренів) | |
| roots | No | Кілька коренів за один виклик замість одного root - результати об'єднуються | |
| check_ci | No | Опитувати GitHub Actions для кожного репо (типово true; false - швидший, чисто локальний знімок без мережі) | |
| only_attention | No | Показати лише репо, що потребують уваги (типово true; false - повний список, включно з чистими) |
TDQS
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.
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.
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.
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.
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.
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/людини).
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | Назва теки репозиторія (напр. "anylint") | |
| content | Yes | Повний текст документації для запису в <repo>.txt | |
| docsRoot | No | Тека з .txt-документацією (типово "<projectsRoot>/Architecture") | |
| projectsRoot | Yes | Абсолютний шлях до теки з репозиторіями (напр. "/home/sviat/Projects") |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v0.5.0- First observed
check_docs - First observed
check_release_drift - First observed
sweep_status - First observed
write_doc
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
Living docs and MCP context for GitHub repos — conventions, gaps, and source-cited pages on merge.
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
Turn a GitHub repo or docs site into agent-ready context: pack it or search it, over MCP.
Revternal MCP — wraps the Revternal Developer Intelligence API
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides MCP tools to scan and navigate markdown repositories, offering graph-based overview, document reading, context retrieval, and orphan detection.MIT
- FlicenseNot gradedqualityCmaintenanceEnables detection and remediation of Kubernetes GitOps drift via MCP tools, supporting drift detection, policy evaluation, patch application, PR generation, and audit trail retrieval.-
- AlicenseNot gradedqualityCmaintenanceProvides MCP tools for fetching GitHub PR diffs, searching codebases, running unit tests, and linting code, enabling automated code review and CI/CD workflows.MIT
- FlicenseNot gradedqualityCmaintenanceProvides local MCP tools for searching, filtering, adding, updating, and analyzing a catalog of study projects, with statistics and GitHub publication readiness checks, all backed by SQLite.-