commit-check-mcp
OfficialThis server exposes commit-check Git validation tools via the Model Context Protocol (MCP), enabling MCP clients to validate various aspects of a Git repository.
Core capabilities:
server_health— Check server health and retrieve version information for the server and its dependencies.validate_commit_message— Validate a commit message against configured rules (e.g., conventional commits format).validate_branch_name— Validate a branch name against naming convention rules.validate_author_info— Validate a commit author's name and/or email against configured rules.validate_push_safety— Determine if a push operation is a force push.validate_commit_context— Run combined validations (message, branch, and author) in a single call.validate_repository_state— Validate the full state of a repository (latest commit, current branch, author info, and optionally push safety) in one call.describe_validation_rules— Inspect the effective, fully-merged validation rules (defaults + repo config + overrides) that will be applied during checks.
Common options available on most tools:
repo_path: Target a specific local git repository.config_path: Point to an explicit TOML config file.config: Pass inline ad-hoc config overrides on top of defaults and repo config.
Allows Codeium's Windsurf IDE to validate commit messages, branch names, author info, push safety, and repository state using commit-check.
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., "@commit-check-mcpvalidate commit message 'fix: typo' in current repository"
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.
commit-check-mcp
Model Context Protocol (MCP) server for commit-check.
commit-check-mcp exposes commit-check as local MCP tools so an MCP client can validate commit messages, branch names, author info, push safety, and repository state.
Features
This MCP server exposes commit-check validations as MCP tools:
server_health— returns server/sdk versionsvalidate_commit_message— validates a commit messagevalidate_branch_name— validates a branch name or the current repo branchvalidate_push_safety— validates that a push is not a force push (force pushes are always rejected by this tool)validate_author_info— validates author name/email or the repo's git author configvalidate_commit_context— runs combined checks in one callvalidate_repository_state— validates latest commit, current branch, author state, and optional push safety for a repodescribe_validation_rules— returns the effective config and enabled rules after merging defaults and repo config
All validation tools return the same structured commit-check result shape:
{
"status": "pass|fail|skip",
"warnings": 0,
"checks": [
{
"rule_id": "CC001",
"check": "message",
"status": "pass|fail|warn|skip",
"value": "...",
"error": "...",
"suggest": "...",
"fix": "...",
"docs_url": "https://commit-check.com/rules/#cc001"
}
]
}rule_id is the stable id of the rule that produced the check and docs_url
links to its documentation.
Only fail is a rejection. A check reports skip when it did not run — the
author matched ignore_authors, or there was nothing to check — and the
top-level status is skip only when every check skipped, so a run that
validated nothing is never reported as a pass. A check reports warn when the
config lists it under warn: the finding is complete, but it does not fail
the run, the top-level status stays pass, and warnings counts them.
suggest is the advice a person reads. fix is the corrected value itself,
present only when the correction is unambiguous — Fix: add x comes back with
"fix": "fix: add x" — and an empty string otherwise, so an agent can apply
a non-empty fix as it stands and fall back to suggest when it is empty.
A call that cannot run at all — an empty message, a repo_path that does not
exist, a repo_path that is not a git repository when the tool has to read git
state (see the repo_path note under Tool Usage), a malformed or rejected
commit-check config, a push_refs SHA that is not a commit in repo_path even
after the force-push check tried to fetch it — is returned as an MCP tool error
(is_error) whose text names the problem, for example
repo_path is not a git repository: /path/to/dir,
invalid commit-check config: ... or
push_refs: <sha> is not a commit in the repository; fetch it first, the force-push check cannot be judged,
rather than as a pass/fail result. In particular a push whose SHAs cannot
be judged is never reported as a pass.
Related MCP server: mcp-commits
Installation
pip install commit-check-mcpThis installs the commit-check-mcp CLI entrypoint.
For local development from this repository:
pip install -e .Use With An MCP Client
This server runs over stdio, so it is meant to be launched by an MCP client rather than used as a long-running HTTP service.
With uvx (recommended — no install needed):
# Run once, no pip install required
uvx commit-check-mcpTip: If
uvis not installed, get it viacurl -LsSf https://astral.sh/uv/install.sh | sh.
Configure your client
Every client below launches the same command; only the config file and, for a few clients, the wrapper key differ. This is the object to register:
{
"mcpServers": {
"commit-check": {
"command": "uvx",
"args": ["commit-check-mcp"]
}
}
}Client | Where it goes | Notes |
Claude Code |
| Add |
Claude Desktop | macOS | Block above as-is; restart Claude Desktop. |
Cursor | project | Block above as-is (or Settings → Cursor Settings → MCP → Add new MCP server with command |
VS Code (Copilot agent mode) |
| Different key: |
Cline | MCP Servers panel → Configure → | Block above as-is. |
Roo Code | project | Block above as-is; optional |
Windsurf |
| Block above as-is. |
Continue |
| YAML list under |
Zed |
| Different key: |
Anything else | your client's MCP config | If the client cannot run |
Continue's config.yaml entry in full (name, version and schema are required by Continue; drop them if you are adding only the mcpServers fragment to an existing file, or save this as a standalone file in .continue/mcpServers/):
name: commit-check
version: 0.0.1
schema: v1
mcpServers:
- name: commit-check
command: uvx
args: ["commit-check-mcp"]Run Manually
# If installed via pip
commit-check-mcp
# Or via uvx (no install needed)
uvx commit-check-mcpThe server uses stdio transport, which is the recommended MCP default for local tool integrations.
Tool Usage
After the client starts the server, it will expose these tools:
server_health: returns server, SDK, and dependency versionsvalidate_commit_message(message, config?, repo_path?, config_path?)validate_branch_name(branch?, config?, repo_path?, config_path?)validate_push_safety(push_refs?, config?, repo_path?, config_path?)validate_author_info(author_name?, author_email?, config?, repo_path?, config_path?)validate_commit_context(message?, branch?, author_name?, author_email?, config?, repo_path?, config_path?)validate_repository_state(repo_path?, config?, config_path?, include_message?, include_branch?, include_author?, include_push?)describe_validation_rules(config?, repo_path?, config_path?)
Every parameter carries a description in the tool's JSON input schema, so an
MCP client (and the model behind it) can see what each one expects without
reading this file: for example push_refs documents the git pre-push line
format <local_ref> <local_sha> <remote_ref> <remote_sha>. Each tool also has
a display title and MCP tool annotations: destructiveHint: false and
idempotentHint: true everywhere, readOnlyHint: true on the six tools that
only read, and readOnlyHint: false with openWorldHint: true on
validate_push_safety and validate_repository_state, because the force-push
check may run git fetch to resolve a SHA, which updates FETCH_HEAD and
remote-tracking refs (the working tree and commits are never touched). Clients
that gate tool calls on those hints can auto-approve the read-only six. The
server's instructions describe the intended
loop: validate first, read status (only fail rejects, skip is not
approval), apply a non-empty fix verbatim or follow suggest, then validate
again.
The common optional arguments are:
repo_path: repository directory to validate against; it must be a git repository when the tool reads git state (branch, author, or push refs omitted,validate_repository_state, orpush_refsgiven, whose SHAs must resolve there), and may be a plain directory holding a config file when every other value is suppliedconfig_path: explicit TOML config file, used instead of the repository's owncchk.toml/commit-check.toml; relative paths resolve fromrepo_pathconfig: ad-hoc config overrides merged on top of defaults and repo config
Common Examples
Validate a commit message using repo-local rules:
{
"message": "feat(api): add MCP validation tool",
"repo_path": "/path/to/repo"
}Validate the current repository branch using an explicit config file:
{
"repo_path": "/path/to/repo",
"config_path": ".github/commit-check.toml"
}Validate the full repository state:
{
"repo_path": "/path/to/repo",
"include_message": true,
"include_branch": true,
"include_author": true
}Validate push safety from git pre-push hook ref metadata (push_refs must be non-empty when given; omit it to check the current branch against its upstream):
{
"repo_path": "/path/to/repo",
"push_refs": "refs/heads/main abc123 refs/heads/main def456"
}Inspect the final merged rules that will be applied:
{
"repo_path": "/path/to/repo",
"config": {
"commit": {
"require_body": true
}
}
}Repository-Aware Validation
commit-check is most useful when it runs against a real git repository and its cchk.toml or commit-check.toml file. This MCP server now supports that directly:
repo_path— run git-based validations against a specific repositoryconfig_path— point to an explicit TOML config file; relative paths are resolved fromrepo_pathconfig— apply ad-hoc overrides on top of defaults and repo config
Typical patterns:
Validate an explicit message with a repository's rules
Validate the current repository state — the latest commit's message and author, and the current branch — without passing message/branch/author values manually
Validate push safety using pre-push ref metadata, or check the current branch against its upstream
Inspect which rules are actually enabled after config merging
Example payload for a repository-wide validation:
{
"repo_path": "/path/to/repo",
"include_message": true,
"include_branch": true,
"include_author": true,
"include_push": true
}Config precedence is:
commit-checkbuilt-in defaultsrepository config loaded from
repo_path, or the file named byconfig_pathwhen it is provided (it replaces the repository's own config file)inline
configoverrides passed to the tool
Published On
Directory | Link |
Official MCP Registry | |
Glama.ai | |
PyPI |
mcp-name: io.github.commit-check/commit-check-mcp
Available Tools
8 toolsdescribe_validation_rulesDescribe validation rulesARead-onlyIdempotent
Return the commit-check rules that are in effect after merging the built-in defaults, the repository's config file (or config_path) and the inline config overrides. Read-only, no side effects.
Returns {commit_check_version, config (the merged config), supported_checks (every check name commit-check knows), enabled_rules[]} where each enabled rule carries its check name, config and pattern details.
Use this before writing a commit message or branch name to learn the expected format instead of guessing, and to debug why a validation failed or was skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| repo_path | No | Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description's 'Read-only, no side effects' is redundant but harmless. The description adds meaningful behavioral context beyond annotations: it explains the merge order of defaults, config file, and inline overrides, and describes the return structure (commit_check_version, merged config, supported_checks, enabled_rules). This is useful context that annotations do not provide.
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 sentences long, with the purpose front-loaded in the first sentence, the return structure in the second, and usage guidance in the third. It is concise and every sentence adds value. It could be slightly tighter by merging the first two, but it is well-structured and not verbose.
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?
Given the tool's moderate complexity (3 optional parameters, an output schema, and several siblings), the description is complete. It explains what the tool returns, when to use it, and the merging semantics. The output schema covers return details, so the description doesn't need to repeat them exhaustively. It covers the key contextual points an agent needs to invoke it correctly.
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 each parameter is already well-documented in the input schema. The description does not add syntax or format details for the parameters, but it does reference config_path and 'inline config overrides' in the context of merging, which reinforces their role. This meets the baseline of 3 for high schema coverage; no additional compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and a precise resource ('commit-check rules that are in effect after merging...'). It clearly distinguishes this describe tool from the sibling validate_* tools, which perform validation actions rather than describing rules. The merging behavior is explicitly articulated, leaving no ambiguity about what is returned.
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 final sentence gives explicit when-to-use guidance: 'Use this before writing a commit message or branch name to learn the expected format instead of guessing, and to debug why a validation failed or was skipped.' This tells the agent exactly the scenario for this tool versus the validation siblings, and even mentions the alternative of guessing. It effectively routes the agent to the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_healthServer healthARead-onlyIdempotent
Return server and dependency versions. Read-only, no side effects.
Returns {server, server_version, commit_check_version, mcp_sdk_version}. Useful as a first call to verify the server is running and to check version compatibility.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces this with 'Read-only, no side effects' and adds the return shape, which is useful. It doesn't contradict annotations and provides the exact returned fields, going beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first states the core action, the second describes the return and the primary use case. No filler, perfectly front-loaded.
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 zero-parameter health-check tool with a comprehensive annotation set and an output schema, the description fully covers what an agent needs: what it returns, when to call it, and that it's safe. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain parameter semantics. The baseline of 4 is appropriate because there is nothing to clarify; the schema is empty and the description correctly focuses on output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Return server and dependency versions.' It specifies a concrete verb and resource, and the 'Useful as a first call to verify the server is running' clarifies its purpose. The sibling tools are all validation-focused, so this stands apart as a health check.
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 explicit use context: 'Useful as a first call to verify the server is running and to check version compatibility.' It doesn't explicitly say when not to use it or name alternatives, but given the sibling set is entirely validation tools, the intended use is clear. A slight gap is the lack of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_author_infoValidate author infoARead-onlyIdempotent
Validate a commit author's name and/or email against the configured rules (e.g. allowed email domains, name patterns). Read-only.
Returns {status, warnings, checks[]}. status is 'pass', 'fail' or 'skip': only 'fail' is a rejection; 'skip' means every check skipped, so nothing was validated and the result is not approval. warnings is the number of checks with status 'warn'. Each check has: rule_id (stable rule id, e.g. 'CC001'); check (rule name, e.g. 'message'); status 'pass' | 'fail' | 'warn' | 'skip' ('warn' = the config lists the check under warn, so the finding is reported without failing the run; 'skip' = the rule did not run, e.g. the author is in ignore_authors or there was nothing to check); value (what was checked); error (why it failed); suggest (advice for a person); fix (the corrected value when the correction is unambiguous, else ''); docs_url (documentation for the rule). On 'fail', apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again.
Use this to check author metadata before committing. Only the values you pass are checked; if neither is given, both are read from repo_path's git config (falling back to the latest commit) and repo_path must be a git repository. For combined validation use validate_commit_context.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| repo_path | No | Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory. | |
| author_name | No | Author name to validate, e.g. 'Alice Example'. Omit to read it from repo_path (git config user.name, falling back to the latest commit's author). Must be non-empty when provided. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. | |
| author_email | No | Author email to validate, e.g. 'alice@example.com'. Omit to read it from repo_path (git config user.email, falling back to the latest commit's author). Must be non-empty when provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description's 'Read-only' matches those. Beyond that, it discloses substantial behavioral detail: the full {status, warnings, checks[]} return contract, precise semantics of 'fail' (the only rejection) vs 'skip' (not approval), per-check field meanings, and the exact remediation protocol ('On fail, apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again'). This goes well beyond what annotations provide.
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 long, but every block earns its place: core purpose first, then the return contract, then usage/omission behavior, then the sibling pointer. The status/check-field detail is dense but essential for correct result interpretation. It could trim some redundancy (e.g. the 'skip' semantics are restated in both the status line and the check field description), but it remains front-loaded and logically ordered.
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?
Despite an output schema existing, the description explains the return contract anyway, which adds agent value by interpreting status meanings and the warn/skip/ignore semantics. For a zero-required-param tool with 5 optional params and complex fallback behavior, the description covers purpose, return format, remediation, parameter omission, repo requirements, and routing. Nothing an agent needs to call it correctly is missing.
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 coverage is 100%, so the baseline is 3. The description adds real interaction semantics beyond the schema: it explains that only passed values are checked, that omitting both author_name and author_email causes reads from repo_path's git config with fallback to the latest commit, and that repo_path must be a git repository. This cross-parameter behavior is exactly what an agent needs and is not in the individual parameter 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 opens with a specific verb+resource pair ('Validate a commit author's name and/or email against the configured rules'), names concrete rule types (allowed email domains, name patterns), and explicitly differentiates from validate_commit_context ('For combined validation use validate_commit_context'). An agent can immediately tell this tool apart from its seven siblings without opening schemas.
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?
It states when to use the tool ('Use this to check author metadata before committing'), clarifies the crucial parameter-omission behavior (values read from repo_path's git config, falling back to the latest commit), and names the one alternative for combined validation. It could more explicitly enumerate exclusions for the other siblings (validate_commit_message, validate_branch_name), but the names plus the combined-validation pointer give adequate routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_branch_nameValidate branch nameARead-onlyIdempotent
Validate a branch name against the configured naming convention (e.g. feature/, bugfix/) and, when configured, that the branch is based on the required merge base. Read-only.
Returns {status, warnings, checks[]}. status is 'pass', 'fail' or 'skip': only 'fail' is a rejection; 'skip' means every check skipped, so nothing was validated and the result is not approval. warnings is the number of checks with status 'warn'. Each check has: rule_id (stable rule id, e.g. 'CC001'); check (rule name, e.g. 'message'); status 'pass' | 'fail' | 'warn' | 'skip' ('warn' = the config lists the check under warn, so the finding is reported without failing the run; 'skip' = the rule did not run, e.g. the author is in ignore_authors or there was nothing to check); value (what was checked); error (why it failed); suggest (advice for a person); fix (the corrected value when the correction is unambiguous, else ''); docs_url (documentation for the rule). On 'fail', apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again.
Use this before creating or pushing a branch. Omit branch to check the branch currently checked out in repo_path. For combined message+branch+author validation use validate_commit_context.
| Name | Required | Description | Default |
|---|---|---|---|
| branch | No | Branch name to validate, e.g. 'feature/login'. Omit to validate the branch currently checked out in repo_path, which must then be a git repository. Must be non-empty when provided. | |
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| repo_path | No | Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the exact return semantics (pass/fail/skip), explains that 'skip' is not approval, and details the required action on failure (apply fix verbatim or rewrite per suggest and revalidate). This goes well beyond the annotations to fully inform the agent of behavior.
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 somewhat lengthy and repeats the status/check field definitions, but it is well organized into purpose, return format, and usage guidance. Every section carries necessary information, so the length is justified, though it could be tightened without losing clarity.
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?
It provides a complete picture: what the tool does, how the result is structured, how to interpret statuses and check fields, and what action to take upon failure. It also tells the agent when to use it and when to use the alternative, leaving no critical gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides detailed descriptions for all four parameters, covering the branch omission behavior and config merging. The description adds useful context about the naming convention and merge-base check, but does not substantially extend the schema. Given the high schema coverage, this is above the baseline but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: validate a branch name against a configured naming convention and optionally a merge-base requirement. It also explicitly differentiates from the sibling validate_commit_context, which handles combined message+branch+author validation, so an agent can immediately understand the tool's scope.
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?
It gives explicit timing guidance: 'Use this before creating or pushing a branch.' It also clarifies when to omit the branch parameter (current checked-out branch) and points to validate_commit_context for combined validation, making the choice between tools unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_commit_contextValidate commit contextARead-onlyIdempotent
Run the commit message, branch name and author checks together in one call, for whichever of message, branch, author_name and author_email you pass. Read-only.
Returns {status, warnings, checks[]}. status is 'pass', 'fail' or 'skip': only 'fail' is a rejection; 'skip' means every check skipped, so nothing was validated and the result is not approval. warnings is the number of checks with status 'warn'. Each check has: rule_id (stable rule id, e.g. 'CC001'); check (rule name, e.g. 'message'); status 'pass' | 'fail' | 'warn' | 'skip' ('warn' = the config lists the check under warn, so the finding is reported without failing the run; 'skip' = the rule did not run, e.g. the author is in ignore_authors or there was nothing to check); value (what was checked); error (why it failed); suggest (advice for a person); fix (the corrected value when the correction is unambiguous, else ''); docs_url (documentation for the rule). On 'fail', apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again.
Use this to validate several aspects of a commit you are about to make with a single call. At least one of message, branch, author_name or author_email is required; omitted aspects are not checked. For one aspect use validate_commit_message, validate_branch_name or validate_author_info; for the commit already at HEAD use validate_repository_state.
| Name | Required | Description | Default |
|---|---|---|---|
| branch | No | Branch name to validate, e.g. 'feature/login'. Omit to validate the branch currently checked out in repo_path, which must then be a git repository. Must be non-empty when provided. | |
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| message | No | Commit message text to validate: subject line, optional blank line, body. Omit to skip the message checks. Must be non-empty when provided. | |
| repo_path | No | Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory. | |
| author_name | No | Author name to validate, e.g. 'Alice Example'. Omit to read it from repo_path (git config user.name, falling back to the latest commit's author). Must be non-empty when provided. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. | |
| author_email | No | Author email to validate, e.g. 'alice@example.com'. Omit to read it from repo_path (git config user.email, falling back to the latest commit's author). Must be non-empty when provided. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the return structure, the meaning of statuses (pass/fail/warn/skip), and the required action on 'fail' (apply fix verbatim or rewrite based on suggest). It also mentions config merging and read-only behavior, adding depth beyond the readOnlyHint annotation. No contradictions.
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 detailed but tightly organized; it front-loads the core purpose, then explains the output structure, then provides usage guidance and sibling alternatives. Every sentence adds essential 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?
The tool is complex (multiple parameter combinations, output schema, config handling, and follow-up instructions), and the description covers all necessary aspects: what it validates, how to use it, what the output means, and what to do next. It is self-sufficient for an agent to invoke correctly.
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?
Each of the 7 parameters is described with examples, defaults, and fallback behavior (e.g., author_name falls back to git config or latest commit). The schema coverage is 100%, and the description clarifies how omitting parameters affects validation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it runs commit message, branch name, and author checks together in a single call, distinguishing it from single-aspect siblings and the repository-state validator. The scope is precise and action-oriented.
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?
Explicitly indicates when to use this tool (multiple aspects) and when to use alternatives (validate_commit_message, validate_branch_name, validate_author_info, validate_repository_state). Also states that at least one parameter is required and omitted aspects are not checked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_commit_messageValidate commit messageARead-onlyIdempotent
Validate a commit message against commit-check rules (Conventional Commits type and format, subject length and case, body, sign-off, WIP/fixup markers, AI attribution: whatever the effective config enables). Read-only; touches no git state.
Returns {status, warnings, checks[]}. status is 'pass', 'fail' or 'skip': only 'fail' is a rejection; 'skip' means every check skipped, so nothing was validated and the result is not approval. warnings is the number of checks with status 'warn'. Each check has: rule_id (stable rule id, e.g. 'CC001'); check (rule name, e.g. 'message'); status 'pass' | 'fail' | 'warn' | 'skip' ('warn' = the config lists the check under warn, so the finding is reported without failing the run; 'skip' = the rule did not run, e.g. the author is in ignore_authors or there was nothing to check); value (what was checked); error (why it failed); suggest (advice for a person); fix (the corrected value when the correction is unambiguous, else ''); docs_url (documentation for the rule). On 'fail', apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again.
Use this when you have one commit message string to check before committing. To check message, branch and author in one call use validate_commit_context; to check the latest commit already in a repository use validate_repository_state.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| message | Yes | Full commit message text to validate: subject line, optional blank line, body (and trailers such as Signed-off-by). Must be non-empty. | |
| repo_path | No | Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry readOnlyHint/idempotentHint/destructiveHint, and the description reinforces them ('Read-only; touches no git state'). It goes far beyond annotations by explaining the full return semantics: status values with the critical 'skip ≠ approval' distinction, warn-vs-skip meanings, every check field, and the actionable workflow (apply fix verbatim, else follow suggest, then re-validate). Rich and non-redundant.
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?
Well-structured and front-loaded with purpose, then rules list, then result semantics, then routing. The return-format explanation is long and somewhat redundant given an output schema exists, though the semantic interpretation (skip is not approval, warn vs skip) adds value the schema structure alone may not convey. Each section earns its place but the whole is dense.
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?
Complete for a validation tool with 4 params and an output schema. It explains when to call it, what it returns, how to interpret results, and how to act on failures. An output schema covers the return structure, so the description's job is routing + semantics, both fully handled. Nothing an agent needs to call it correctly is missing.
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 baseline is 3. The description relates the config parameter to effective behavior ('whatever the effective config enables') but adds little parameter-specific syntax beyond the schema. The schema already documents config overrides, repo_path and config_path lookup, so the description rightly leaves this to 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?
States a specific verb+resource ('Validate a commit message against commit-check rules') and enumerates the rule families checked (Conventional Commits type/format, subject length/case, body, sign-off, WIP/fixup, AI attribution). It distinguishes itself from siblings by explicitly scoping to a single message string, which separates it from validate_commit_context and validate_repository_state.
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?
Gives an explicit when-to-use directive ('Use this when you have one commit message string to check before committing') and names the two alternatives with their exact conditions: validate_commit_context for message+branch+author in one call, validate_repository_state for a latest commit already in a repo. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_push_safetyValidate push safetyAIdempotent
Check that a pending push is not a force push (rule CC301, no_force_push): fails when a
remote_sha is not an ancestor of its local_sha, i.e. the push would rewrite remote history.
Leaves your working tree and commits untouched, but may run git fetch <remote> <ref> to
resolve SHAs, which updates FETCH_HEAD and remote-tracking refs. A SHA that cannot be resolved
even then is a tool error, never a pass. Force pushes are always rejected by this tool;
push.allow_force_push in config cannot re-enable them here.
Returns {status, warnings, checks[]}. status is 'pass', 'fail' or 'skip': only 'fail' is a rejection; 'skip' means every check skipped, so nothing was validated and the result is not approval. warnings is the number of checks with status 'warn'. Each check has: rule_id (stable rule id, e.g. 'CC001'); check (rule name, e.g. 'message'); status 'pass' | 'fail' | 'warn' | 'skip' ('warn' = the config lists the check under warn, so the finding is reported without failing the run; 'skip' = the rule did not run, e.g. the author is in ignore_authors or there was nothing to check); value (what was checked); error (why it failed); suggest (advice for a person); fix (the corrected value when the correction is unambiguous, else ''); docs_url (documentation for the rule). On 'fail', apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again.
Call this before git push. Only the no_force_push rule runs. When it fails there is no
automatic fix (fix is ''): follow suggest, i.e. push without --force/--force-with-lease or
rebase onto the remote first, then validate again.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| push_refs | No | Refs about to be pushed, in git pre-push hook stdin format, one ref per line: '<local_ref> <local_sha> <remote_ref> <remote_sha>', e.g. 'refs/heads/main 1a2b3c... refs/heads/main 9f8e7d...'. A remote_sha of 40 zeros means a new branch (never a force push). Every other SHA must resolve to a commit in repo_path (the check runs git merge-base and may fetch the remote ref first); a SHA that still cannot be resolved is a tool error, not a pass, so fetch it first. Omit to check the current branch of repo_path against its upstream instead. Must be non-empty when provided. | |
| repo_path | No | Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a side effect not captured by annotations: 'may run `git fetch <remote> <ref>` to resolve SHAs, which updates FETCH_HEAD and remote-tracking refs.' It also states that force pushes are always rejected regardless of config, and that a SHA that cannot be resolved is a tool error, never a pass. These details go well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true) and give the agent accurate expectations of side effects and failure semantics.
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 long but every sentence adds necessary information. It is front-loaded with the core purpose, then covers side effects, return schema, and usage notes in a logical order. It avoids fluff and repetition, making the length justified by the complexity of the tool (non-trivial statuses, warn/skip semantics, and fix handling).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description goes beyond it to explain the meaning of status values ('only fail is a rejection', 'skip means nothing was validated'), warn vs skip semantics, and the fix/suggest handling. It also covers edge cases (unresolvable SHAs, force push always rejected, config cannot re-enable). Together with the schema, an agent has everything needed to call the tool correctly and interpret results.
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 with detailed explanations for every parameter (config, push_refs, repo_path, config_path), including formats, defaults, and behaviors. The tool description itself does not add parameter-specific meaning beyond referencing the rule logic; it focuses on behavior and return format. Since the schema already carries the parameter documentation, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Check that a pending push is not a force push' with the exact rule ID (CC301, no_force_push). It clearly distinguishes this tool from the sibling validators (validate_commit_message, validate_branch_name, etc.) by focusing exclusively on push safety, and even notes 'Only the no_force_push rule runs.' This leaves no ambiguity about what the tool does.
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 instructs 'Call this before `git push`.' It also clarifies when the tool is not a pass: 'skip' means nothing was validated and the result is not approval. It explains the failure path (no automatic fix, follow suggest) and the requirement to fetch unresolvable SHAs first. This provides clear when-to-use and edge-case handling beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_repository_stateValidate repository stateAIdempotent
Validate what is already in a local git repository: the latest commit's message and author,
the checked-out branch name and, optionally, whether pushing that branch to its upstream would
be a force push. Leaves the working tree and commits untouched; the push check may run
git fetch, which updates FETCH_HEAD and remote-tracking refs.
Returns {status, warnings, checks[]}. status is 'pass', 'fail' or 'skip': only 'fail' is a rejection; 'skip' means every check skipped, so nothing was validated and the result is not approval. warnings is the number of checks with status 'warn'. Each check has: rule_id (stable rule id, e.g. 'CC001'); check (rule name, e.g. 'message'); status 'pass' | 'fail' | 'warn' | 'skip' ('warn' = the config lists the check under warn, so the finding is reported without failing the run; 'skip' = the rule did not run, e.g. the author is in ignore_authors or there was nothing to check); value (what was checked); error (why it failed); suggest (advice for a person); fix (the corrected value when the correction is unambiguous, else ''); docs_url (documentation for the rule). On 'fail', apply a non-empty fix verbatim; when fix is '', rewrite following suggest; then validate again.
Use this to check a repository's current state in one call, e.g. after committing and before pushing, or in a hook. The include_* flags select the checks; at least one must be true. To validate values that are not yet committed use validate_commit_context or the single-aspect tools.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {"warn": ["message"]} or {"commit": {"require_body": true}}. | |
| repo_path | No | Path to the git repository to inspect; its cchk.toml or commit-check.toml is loaded and a relative config_path is resolved from it. Omit to use the server's working directory, which must then be a git repository. | |
| config_path | No | Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path. | |
| include_push | No | Also check that pushing the current branch to its upstream would not be a force push; may run git fetch (updating FETCH_HEAD), and passes when the branch has no upstream. Default false. | |
| include_author | No | Validate the author name and email of the latest commit (falling back to git config user.name/user.email). Default true. | |
| include_branch | No | Validate the name of the currently checked-out branch. Default true. | |
| include_message | No | Validate the message of the latest commit (HEAD). Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the tool is not purely read-only. The description clarifies the exact side effect: the push check 'may run git fetch, which updates FETCH_HEAD and remote-tracking refs', while 'leaves the working tree and commits untouched'. It also explains the nuanced status semantics ('skip' is not approval) that annotations cannot convey.
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 organized into three logical paragraphs (scope/side effects, return format, usage guidance), and every sentence contributes substantive information. It is somewhat long but not bloated, and the key operational facts (side effects, skip semantics, alternative tools) are front-loaded.
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?
Even though an output schema exists, the description adds critical operational context: the meaning of 'fail' vs 'skip', the advice to 'apply a non-empty fix verbatim', the note about FETCH_HEAD side effects, and the requirement that at least one include_* flag be true. Together these make the tool safely callable without ambiguity.
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 seven parameters. The tool description adds no parameter-specific meaning beyond what the schema provides, only a high-level note that include_* flags select checks. Per the rubric, baseline 3 applies when the schema carries the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('validate') with a clear resource ('local git repository') and enumerates the exact aspects validated (latest commit message/author, checked-out branch, optional push safety). It explicitly differentiates itself from single-aspect siblings by noting it checks 'current state in one call' and later tells the agent to use validate_commit_context or single-aspect tools for uncommitted values.
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?
Provides explicit when-to-use guidance: 'after committing and before pushing, or in a hook', and names the alternatives when not to use it ('To validate values that are not yet committed use validate_commit_context or the single-aspect tools'). It also states the constraint that at least one include_* flag must be true, which is not in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.10- Changed
describe_validation_rules3 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory."
- Changed
validate_author_info5 fields changed- added
Input schema / properties / author_email / descriptionAdded value: +"Author email to validate, e.g. 'alice@example.com'. Omit to read it from repo_path (git config user.email, falling back to the latest commit's author). Must be non-empty when provided." - added
Input schema / properties / author_name / descriptionAdded value: +"Author name to validate, e.g. 'Alice Example'. Omit to read it from repo_path (git config user.name, falling back to the latest commit's author). Must be non-empty when provided." - added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory."
- Changed
validate_branch_name4 fields changed- added
Input schema / properties / branch / descriptionAdded value: +"Branch name to validate, e.g. 'feature/login'. Omit to validate the branch currently checked out in repo_path, which must then be a git repository. Must be non-empty when provided." - added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory."
- Changed
validate_commit_context7 fields changed- added
Input schema / properties / author_email / descriptionAdded value: +"Author email to validate, e.g. 'alice@example.com'. Omit to read it from repo_path (git config user.email, falling back to the latest commit's author). Must be non-empty when provided." - added
Input schema / properties / author_name / descriptionAdded value: +"Author name to validate, e.g. 'Alice Example'. Omit to read it from repo_path (git config user.name, falling back to the latest commit's author). Must be non-empty when provided." - added
Input schema / properties / branch / descriptionAdded value: +"Branch name to validate, e.g. 'feature/login'. Omit to validate the branch currently checked out in repo_path, which must then be a git repository. Must be non-empty when provided." - added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / message / descriptionAdded value: +"Commit message text to validate: subject line, optional blank line, body. Omit to skip the message checks. Must be non-empty when provided." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory."
- Changed
validate_commit_message4 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / message / descriptionAdded value: +"Full commit message text to validate: subject line, optional blank line, body (and trailers such as Signed-off-by). Must be non-empty." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory."
- Changed
validate_push_safety4 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / push_refs / descriptionAdded value: +"Refs about to be pushed, in git pre-push hook stdin format, one ref per line: '<local_ref> <local_sha> <remote_ref> <remote_sha>', e.g. 'refs/heads/main 1a2b3c... refs/heads/main 9f8e7d...'. A remote_sha of 40 zeros means a new branch (never a force push). Every other SHA must resolve to a commit in repo_path (the check runs git merge-base and may fetch the remote ref first); a SHA that still cannot be resolved is a tool error, not a pass, so fetch it first. Omit to check the current branch of repo_path against its upstream instead. Must be non-empty when provided." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to validate against. Its cchk.toml or commit-check.toml (also looked up under .github/) is loaded, and a relative config_path is resolved from it. Omit to use the server's working directory."
- Changed
validate_repository_state7 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Inline commit-check config overrides as a JSON object, merged on top of the built-in defaults and any config file, e.g. {\"warn\": [\"message\"]} or {\"commit\": {\"require_body\": true}}." - added
Input schema / properties / config_path / descriptionAdded value: +"Path to a commit-check TOML config file, used instead of the repository's own cchk.toml/commit-check.toml; a relative path is resolved from repo_path." - added
Input schema / properties / include_author / descriptionAdded value: +"Validate the author name and email of the latest commit (falling back to git config user.name/user.email). Default true." - added
Input schema / properties / include_branch / descriptionAdded value: +"Validate the name of the currently checked-out branch. Default true." - added
Input schema / properties / include_message / descriptionAdded value: +"Validate the message of the latest commit (HEAD). Default true." - added
Input schema / properties / include_push / descriptionAdded value: +"Also check that pushing the current branch to its upstream would not be a force push; may run git fetch (updating FETCH_HEAD), and passes when the branch has no upstream. Default false." - added
Input schema / properties / repo_path / descriptionAdded value: +"Path to the git repository to inspect; its cchk.toml or commit-check.toml is loaded and a relative config_path is resolved from it. Omit to use the server's working directory, which must then be a git repository."
8 tool updates
v0.1.0- First observed
describe_validation_rules - First observed
server_health - First observed
validate_author_info - First observed
validate_branch_name - First observed
validate_commit_context - First observed
validate_commit_message - First observed
validate_push_safety - First observed
validate_repository_state
TDQS
Scored across 8 tools
Each tool targets a distinct validation target (message, branch, author, push) and the descriptions explicitly cross-reference each other with 'use this when...' guidance. There is genuine conceptual overlap among validate_commit_message, validate_commit_context, and validate_repository_state, but the descriptions clearly separate pre-commit values vs already-committed state, keeping misselection risk low.
Six of eight tools share the predictable validate_* prefix in snake_case, forming a strong family pattern. server_health and describe_validation_rules break the pattern but represent distinct operation types (health and introspection), which is a minor and justifiable deviation.
Eight tools for a commit-validation server is within the well-scoped range. The single-aspect validators (message, branch, author) are partially subsumed by validate_commit_context, creating slight redundancy, but each earns its place for targeted single-aspect checks, so the count is reasonable.
The surface covers the full validation workflow: rule discovery (describe_validation_rules), pre-commit validation (message, branch, author, combined), post-commit state checks, and push safety. Minor gaps exist such as no multi-commit or range validation and no fix-application tool, but no critical dead ends for the stated purpose.
Maintenance
Related MCP Connectors
Free MCP tools: the only MCP linter, health checks, cost estimation, and trust evaluation.
The MCP server that vets MCP servers: identity, risk grade and per-tool risk before you install.
Pre-flight MCP security. Blocks compromised deps + tool drift. HMAC-signed. Dredd judges.
Check if your MCP server is ready to publish on the MCP Registry, Smithery, or npm.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables automated code review and GitHub PR commenting through MCP integration.18 npm9MIT
- FlicenseNot gradedqualityDmaintenanceMCP server providing commit rules with SemVer and conventional commits format for development teams.-
- FlicenseNot gradedqualityDmaintenanceEnables dependency, security, and coding convention checks for Python and Java projects via MCP tools. Supports local paths or Git URLs.-
- AlicenseNot gradedqualityDmaintenanceProduction-ready MCP server for enforcing git/PR/Jira workflows with atomic, composable tools. Enables automated branch creation, conventional commits, PR generation, and Jira ticket operations with safety guardrails.MIT