Martin Loop
NPM · @MARTINLOOP/MCP · SCANNED SEP 20
One system around coding agents to run, verify, recover, and hand off software work.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 45 of 137 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Keesan12/martin-loop). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability86
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Tool/resource definitions use about 4626 tokens (~100/item across 46 items; 24 tools + 22 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 81% of tool parameters carry a description.Partial
- Structured output schemas are declared (96% of tools); any adoption earns full credit.Pass
Tool Safety88
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 1 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "martin_eval" implies "eval" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Partial
- An AI judge read all 25 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the Martin Loop MCP server?
Martin Loop runs locally as an npm package, launched with npx -y @martinloop/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @martinloop/mcp
claude mcp add keesan12-martin-loop -- npx -y @martinloop/mcp
{
"mcpServers": {
"keesan12-martin-loop": {
"command": "npx",
"args": [
"-y",
"@martinloop/mcp"
]
}
}
} {
"servers": {
"keesan12-martin-loop": {
"command": "npx",
"args": [
"-y",
"@martinloop/mcp"
]
}
}
} codex mcp add keesan12-martin-loop -- npx -y @martinloop/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"keesan12-martin-loop": {
"type": "local",
"command": [
"npx",
"-y",
"@martinloop/mcp"
],
"enabled": true
}
}
} openclaw mcp add keesan12-martin-loop --command npx --arg -y --arg @martinloop/mcp
mcp_servers:
keesan12-martin-loop:
command: "npx"
args: ["-y", "@martinloop/mcp"] {
"McpServers": {
"keesan12-martin-loop": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@martinloop/mcp"
]
}
}
} assistant mcp add keesan12-martin-loop -t stdio -c npx -a -y @martinloop/mcp
{
"mcpServers": {
"keesan12-martin-loop": {
"command": "npx",
"args": [
"-y",
"@martinloop/mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 −2
- Stability: pass → 0.90 functional
- 17 Sept 26 +1
- Stability: 0.97 → pass security
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 −2
- Stability: pass → 0.87 functional
- 12 Sept 26 +1
- Stability: 0.97 → pass security
- 11 Sept 26 −1
- Stability: pass → 0.97 functional
- 10 Sept 26 +1
- Stability: 0.97 → pass security
- 9 Sept 26 0
- Schema quality: good → excellent functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed npm/@martinloop/mcp@0.6.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Keesan12/martin-loop |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Keesan12/martin-loop/.github/workflows/publish-mcp.yml@refs/heads/main |
| Rekor log index | 2753741228 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:ba6e6f8613aac6dfa9ee89aa33957730efa552f20b105fb95b6bd5d252f6d31dd385846101601b5dffe077346d5ab1dcabc5fa82c0e4e7deb92e5cc8b |
Background: How many MCP packages publish verified provenance →
Dependencies 137 packages
| Packages resolved | 137 |
|---|---|
| Stale | 45 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
martin_arcade ~32
Open the presentation-only MartinLoop Arcade when the host supports MCP Apps. The Arcade cannot change governed execution or evidence.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
martin_arcade_status ~93
Read the read-only evidence projection used by the Arcade view. Provide loopId for one exact run or omit it to load the latest run. Use only for Arcade rendering; use martin_status for budget pressure or martin_run_dossier for full evidence. This tool reads persisted evidence and never changes run state.
| Name | Type | Req | Description |
|---|---|---|---|
| loopId | string | – | Optional MartinLoop run identifier. Omit it to read the latest persisted run. |
| Name | Type | Req | Description |
|---|---|---|---|
| attempts | integer | yes | Number of recorded attempts. |
| budget | object | yes | – |
| completed | boolean | yes | Whether the run is outside an active lifecycle state. |
| cost | object | yes | – |
| displayOutcome | – | yes | Terminal verified-handoff outcome, or null while the run is active. |
| lifecycleState | string | yes | Current persisted lifecycle state. |
| loopId | string | yes | Run identifier represented by this Arcade snapshot. |
| receiptIntegrity | object | yes | Persisted receipt-integrity verdict. |
| verification | object | yes | Persisted verifier evidence summary. |
| warnings | array | yes | Evidence or interpretation warnings for the Arcade view. |
No examples provided.
martin_cancel ~202
Write a durable cancellation receipt for one canonical MartinLoop run. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root, while reason and requestedBy add audit context. Use when work must be abandoned, not temporarily held. This records a request and does not kill a process; use martin_pause for a reversible hold.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Path to one canonical run record or directory. Mutually exclusive with loopId and latest. |
| latest | – | – | When true, targets the latest canonical run. Mutually exclusive with file and loopId. |
| loopId | string | – | Canonical MartinLoop run identifier. Mutually exclusive with file and latest. |
| reason | string | – | Optional non-empty reason recorded in the cancellation receipt. |
| requestedBy | string | – | Optional human or runtime identity label recorded for audit context. |
| runsDir | string | – | Optional run-store root override used to resolve loopId or latest. |
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | The control action that was recorded. |
| controlId | string | yes | Unique receipt ID for this control action. |
| loopId | string | yes | MartinLoop run identifier the control was applied to. |
| reason | string | – | Human-readable reason for the control, if provided. |
| requestedAt | string | yes | ISO 8601 timestamp when the control was recorded. |
| requestedBy | string | – | Identity that requested the control, if provided. |
No examples provided.
martin_continue ~70
Record a durable continue or resume request for a Martin run after a human pause or approval checkpoint.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | – |
| latest | – | – | – |
| loopId | string | – | – |
| reason | string | – | – |
| requestedBy | string | – | – |
| runsDir | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | The control action that was recorded. |
| controlId | string | yes | Unique receipt ID for this control action. |
| loopId | string | yes | MartinLoop run identifier the control was applied to. |
| reason | string | – | Human-readable reason for the control, if provided. |
| requestedAt | string | yes | ISO 8601 timestamp when the control was recorded. |
| requestedBy | string | – | Identity that requested the control, if provided. |
No examples provided.
martin_create_pr ~87
Create or preview a GitHub PR with a MartinLoop dossier body. Use execute=true to actually call gh.
| Name | Type | Req | Description |
|---|---|---|---|
| base | string | – | – |
| execute | boolean | – | – |
| file | string | – | – |
| format | string | – | – |
| latest | – | – | – |
| loopId | string | – | – |
| runsDir | string | – | – |
| title | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | GitHub-flavoured Markdown PR body containing the run dossier. |
| grade | string | yes | Verification grade assigned to the run. |
| loopId | string | yes | MartinLoop run identifier used to generate the summary. |
| score | number | yes | Numeric verification score from 0–100. |
| title | string | yes | Suggested GitHub pull-request title. |
No examples provided.
martin_doctor ~122
Read-only environment, engine, workspace, and run-store diagnostics for MartinLoop. Use first for software work, fresh installs, suspicious state, or before retries. Do not use as proof that a task is complete. Next: call martin_estimate or martin_triage_runs depending on whether this is new work or failed prior work.
| Name | Type | Req | Description |
|---|---|---|---|
| engine | string | – | Optional engine to highlight in diagnostics. |
| runsDir | string | – | Optional runs-root override resolved under the default Martin runs root. |
| workingDirectory | string | – | Optional repo-root override for doctor context. |
| Name | Type | Req | Description |
|---|---|---|---|
| engines | object | yes | – |
| environment | object | yes | – |
| receiptScope | object | yes | – |
| requestedEngine | string | – | – |
| runStore | object | yes | – |
| server | object | yes | – |
| status | string | yes | – |
| summary | string | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_dossier ~207
Read a formatted evidence summary for one MartinLoop run. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root. Set format to json, md, or github-pr; json is the default. Use after martin_run, before merge or release claims, or when sharing what happened. Do not use as a substitute for missing verifier evidence; use martin_run_dossier for the full structured record. Next: review verification results, retry, or hand off the receipt.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Path to one run record or directory. Mutually exclusive with loopId and latest. |
| format | string | – | Output format. Defaults to json. |
| latest | – | – | When true, loads the latest run. Mutually exclusive with file and loopId. |
| loopId | string | – | MartinLoop run identifier. Mutually exclusive with file and latest. |
| runsDir | string | – | Optional run-store root override used to resolve loopId or latest. |
| Name | Type | Req | Description |
|---|---|---|---|
| artifacts | object | yes | – |
| attempts | array | yes | – |
| budget | object | yes | – |
| cost | object | yes | – |
| inspection | object | yes | – |
| loop | object | yes | – |
| recentEvents | array | yes | – |
| related | object | yes | – |
| source | string | yes | – |
| sourceKind | string | yes | – |
| verification | object | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_estimate ~162
Read-only cost, route, and pre-work burn estimate for a software objective. Use before planning/preflight when a change may spend agent time or exceed budget. Do not use for casual questions or as permission to execute. Next: call martin_plan if the estimate is acceptable, or ask for consent if budget/risk is high.
| Name | Type | Req | Description |
|---|---|---|---|
| budgetUsd | number | – | Budget ceiling for estimation. Defaults to 5. |
| engine | string | – | Which agent CLI would be used. Defaults to claude. |
| fileScope | array | – | Optional file paths to scope the estimate. |
| objective | string | yes | The coding task to estimate. |
| workingDirectory | string | – | Optional workspace path for recording the estimate receipt against the same task root you plan to run. |
| Name | Type | Req | Description |
|---|---|---|---|
| blockedSteps | array | – | – |
| budgetUsd | number | yes | – |
| compressed | boolean | – | – |
| compressionSummary | string | – | – |
| confidence | number | yes | – |
| engine | string | yes | – |
| expectedCostUsd | number | yes | – |
| expectedPreworkBurnPct | number | yes | – |
| objective | string | yes | – |
| reason | array | yes | – |
| recommendedBudgetUsd | number | – | – |
| selectedMode | string | yes | – |
No examples provided.
martin_eval ~235
Grade a MartinLoop run across six dimensions — task completion, verifier health, diff discipline, regression risk, security risk, and reviewability — and return a scored merge-readiness verdict. Use after a governed run completes to decide whether the result is safe to merge or promote. Use before martin_pr_summary or martin_create_pr to confirm the run is merge-ready. Do not use to retrieve raw verification command output — use martin_get_verification_results for that. Do not use to review an existing PR body — use martin_review_pr instead. This tool reads saved run evidence and inspects local git signals; it does not modify state or contact GitHub.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Absolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest. |
| latest | – | – | When true, evaluates the most recently updated run in the run store. Mutually exclusive with file and loopId. |
| loopId | string | – | MartinLoop run identifier from the run store. Mutually exclusive with file and latest. |
| runsDir | string | – | Override the default run-store root directory. Optional. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | object | yes | – |
| grade | string | yes | Overall merge readiness grade derived from the six check dimensions. |
| loopId | string | yes | Unique MartinLoop run identifier. |
| score | number | yes | Numeric evaluation score from 0–100. |
| source | string | yes | Resolved path to the loop-record source file. |
| sourceKind | string | yes | How the run was identified. |
| summary | string | yes | One-paragraph plain-English evaluation summary. |
| warnings | array | yes | Non-blocking advisory warnings from the evaluation. |
No examples provided.
martin_get_attempt ~85
Load one Martin attempt summary with artifact directory references for a canonical run.
| Name | Type | Req | Description |
|---|---|---|---|
| attemptIndex | integer | – | Attempt index to inspect. Defaults to the latest attempt. |
| file | string | – | Path to a canonical loop-record.json file or run directory. |
| loopId | string | – | Loop ID under the run store. |
| runsDir | string | – | Optional runs-root override. |
| Name | Type | Req | Description |
|---|---|---|---|
| attempt | object | yes | – |
| loop | object | yes | – |
| source | string | yes | – |
| sourceKind | string | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_get_run ~96
Load one Martin run and return its budget, cost, verification, artifact, and canonical path summary.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Path to a canonical loop-record.json, legacy file, or run-store directory. |
| latest | – | – | When true, loads the most recently updated loop record in the run store. |
| loopId | string | – | Loop ID under the run store. |
| runsDir | string | – | Optional runs-root override. |
| Name | Type | Req | Description |
|---|---|---|---|
| artifacts | object | yes | – |
| budget | object | yes | – |
| cost | object | yes | – |
| inspection | object | yes | – |
| loop | object | yes | – |
| source | string | yes | – |
| sourceKind | string | yes | – |
| verification | object | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_get_verification_results ~184
Load structured verification evidence for a MartinLoop run — verifier commands, pass/fail outcomes, and contradiction signals — from stored loop events and ledger entries. Use after a run completes to confirm whether automated verifiers passed before merging or promoting the result. Do not use to get a merge-readiness grade — use martin_eval for a scored grade with six check dimensions. Do not use for live run status — use martin_get_status instead. This tool only reads persisted run files and does not execute commands, modify state, or contact GitHub.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Absolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId. |
| loopId | string | – | MartinLoop run identifier from the run store. Mutually exclusive with file. |
| runsDir | string | – | Override the default run-store root directory. Optional. |
| Name | Type | Req | Description |
|---|---|---|---|
| loop | object | yes | – |
| source | string | yes | – |
| sourceKind | string | yes | – |
| verification | object | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_inspect ~78
Summarise Martin Loop run records from a saved loop file or run-store directory.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Optional path under the Martin runs root to a loop-record.json file, a legacy .jsonl file, or a run-store directory. |
| runsDir | string | – | Optional runs-root override resolved under the default Martin runs root. |
| Name | Type | Req | Description |
|---|---|---|---|
| inspection | object | yes | – |
| latestRun | object | – | – |
| lifecycleBreakdown | object | yes | – |
| loopCount | integer | yes | – |
| portfolio | object | yes | – |
| recentRuns | array | yes | – |
| source | string | yes | – |
| statusBreakdown | object | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_list_runs ~127
List recent Martin runs from the run store with lightweight filters for status, lifecycle, engine metadata, and recency.
| Name | Type | Req | Description |
|---|---|---|---|
| adapterId | string | – | Filter by attempt adapter ID. |
| lifecycleState | string | – | Filter by lifecycle state. |
| limit | integer | – | Maximum number of runs to return. Defaults to 20. |
| model | string | – | Filter by attempt model. |
| runsDir | string | – | Optional runs-root override. |
| status | string | – | Filter by loop status. |
| updatedAfter | string | – | Optional ISO-8601 timestamp for recency filtering. |
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | – |
| latestRun | object | – | – |
| lifecycleBreakdown | object | yes | – |
| loopCount | integer | yes | – |
| recentRuns | array | yes | – |
| runsRoot | string | yes | – |
| source | string | yes | – |
| statusBreakdown | object | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_logs ~227
Read recent MartinLoop events, ledger entries, and operator control receipts for a single run. Use to observe live or completed run activity, diagnose stuck or failed runs, or audit operator actions. Do not use to check run completion status — use martin_get_status instead. Do not use to retrieve verification evidence — use martin_get_verification_results instead. This tool only reads persisted run files and does not execute commands, modify state, or contact GitHub.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Absolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest. |
| latest | – | – | When true, loads the most recently updated run in the run store. Mutually exclusive with file and loopId. |
| limit | integer | – | Maximum number of log entries to return, sorted by timestamp descending. Defaults to 20. |
| loopId | string | – | MartinLoop run identifier from the run store. Mutually exclusive with file and latest. |
| runsDir | string | – | Override the default run-store root directory. Optional; defaults to the MartinLoop runs directory. |
| Name | Type | Req | Description |
|---|---|---|---|
| entries | array | yes | Log entries sorted by timestamp descending, capped at limit. |
| live | object | yes | – |
| logCount | integer | yes | Number of log entries returned after applying the limit. |
| loopId | string | yes | Unique MartinLoop run identifier. |
| source | string | yes | Resolved path to the loop-record source file. |
| sourceKind | string | yes | How the run was identified: by file path, loop ID, latest flag, or runs directory. |
No examples provided.
martin_pause ~206
Write a durable pause receipt for one canonical MartinLoop run. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root, while reason and requestedBy add audit context. Use for a temporary hold before risky follow-up work. This records a request and does not kill a process; use martin_cancel to abandon work or martin_continue to resume.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Path to one canonical run record or directory. Mutually exclusive with loopId and latest. |
| latest | – | – | When true, targets the latest canonical run. Mutually exclusive with file and loopId. |
| loopId | string | – | Canonical MartinLoop run identifier. Mutually exclusive with file and latest. |
| reason | string | – | Optional non-empty reason recorded in the pause receipt. |
| requestedBy | string | – | Optional human or runtime identity label recorded for audit context. |
| runsDir | string | – | Optional run-store root override used to resolve loopId or latest. |
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | The control action that was recorded. |
| controlId | string | yes | Unique receipt ID for this control action. |
| loopId | string | yes | MartinLoop run identifier the control was applied to. |
| reason | string | – | Human-readable reason for the control, if provided. |
| requestedAt | string | yes | ISO 8601 timestamp when the control was recorded. |
| requestedBy | string | – | Identity that requested the control, if provided. |
No examples provided.
martin_plan ~191
Read-only planning step that turns an objective into bounded scope, verifier proposal, policy pack, and risk recommendation. Use for authorized software changes before preflight/run. Do not use to mutate files or replace the verifier. Next: call martin_preflight with the chosen scope, budget, and verifier.
| Name | Type | Req | Description |
|---|---|---|---|
| allowedPaths | array | – | – |
| context | string | – | Optional extra issue or bug context. |
| deniedPaths | array | – | – |
| maxCommands | integer | – | – |
| maxFilesChanged | integer | – | – |
| maxIterations | integer | – | – |
| maxMinutes | integer | – | – |
| maxTokens | integer | – | – |
| maxUsd | number | – | – |
| objective | string | yes | The coding objective to plan. |
| policyPack | string | – | – |
| verificationPlan | array | – | – |
| workingDirectory | string | – | Optional repo-root override resolved under the MCP workspace root. |
Structured output declared, but exposes no named fields.
No examples provided.
martin_pr_summary ~242
Generate a GitHub-ready pull-request title and Markdown body from a completed MartinLoop run dossier, including its verification grade and score. Use after a governed run completes when you need PR copy without creating the PR. Use martin_create_pr instead to actually open the PR on GitHub. Use martin_review_pr to evaluate an existing PR body against run evidence. Use martin_eval first if you need a merge-readiness grade before generating the PR body. This tool only reads saved run evidence and does not modify the repository or contact GitHub.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Absolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest. |
| format | string | – | Dossier rendering format. Defaults to github-pr for PR body generation. Use md for plain Markdown or json for structured output. |
| latest | – | – | When true, generates the summary for the most recently updated run. Mutually exclusive with file and loopId. |
| loopId | string | – | MartinLoop run identifier from the run store. Mutually exclusive with file and latest. |
| runsDir | string | – | Override the default run-store root directory. Optional. |
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | GitHub-flavoured Markdown PR body containing the run dossier. |
| grade | string | yes | Verification grade assigned to the run. |
| loopId | string | yes | MartinLoop run identifier used to generate the summary. |
| score | number | yes | Numeric verification score from 0–100. |
| title | string | yes | Suggested GitHub pull-request title. |
No examples provided.
martin_preflight ~304
Read-only validation of the exact run contract before execution or spend. Use after planning and before martin_run to check engine, verifier, path scope, and budget. Do not use as execution or completion proof. Next: call martin_run if allowed, otherwise resolve the reported blocker.
| Name | Type | Req | Description |
|---|---|---|---|
| allowedPaths | array | – | Repo-relative path globs Martin may modify. |
| context | string | – | Optional issue context carried into the run contract. |
| deniedPaths | array | – | Repo-relative path globs Martin must never modify. |
| engine | string | – | Which agent CLI would be used. Defaults to claude. |
| maxCommands | integer | – | Estimated maximum commands allowed for the run contract. |
| maxFilesChanged | integer | – | Estimated maximum files changed for the run contract. |
| maxIterations | integer | – | Maximum number of loop attempts. |
| maxMinutes | integer | – | Estimated wall-clock minutes allowed for the run contract. |
| maxTokens | integer | – | Maximum total tokens across all attempts. |
| maxUsd | number | – | Hard budget ceiling in USD. |
| model | string | – | Model override passed to the CLI. |
| objective | string | yes | The coding task to validate. |
| policyPack | string | – | – |
| projectId | string | – | – |
| verificationPlan | array | – | Commands that must all exit 0 for completion. |
| workingDirectory | string | – | Optional repo-root override resolved under the MCP workspace root. |
| workspaceId | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| execution | object | yes | – |
| normalized | object | yes | – |
| ok | boolean | yes | – |
| readiness | object | yes | – |
| receiptScope | object | yes | – |
| summary | string | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_review_pr ~268
Review a PR body or draft against the MartinLoop run dossier and evaluation evidence, and return a verdict with specific findings. Use when you have an existing PR body and want to check whether it accurately represents the governed run evidence. Supply prBody to review a specific body string; omit it to evaluate the auto-generated dossier body. Do not use to generate a PR body from scratch — use martin_pr_summary instead. Do not use to open or create a PR — use martin_create_pr instead. This tool only reads saved run evidence and does not modify the repository or contact GitHub.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Absolute or relative path to a loop-record.json file or run directory. Mutually exclusive with loopId and latest. |
| format | string | – | Dossier format used when generating the reference body for comparison. Defaults to github-pr. |
| latest | – | – | When true, reviews against the most recently updated run. Mutually exclusive with file and loopId. |
| loopId | string | – | MartinLoop run identifier from the run store. Mutually exclusive with file and latest. |
| prBody | string | – | The PR body text to review. If omitted, the auto-generated dossier body is evaluated instead. |
| runsDir | string | – | Override the default run-store root directory. Optional. |
| Name | Type | Req | Description |
|---|---|---|---|
| findings | array | yes | Specific findings that informed the verdict. |
| loopId | string | yes | MartinLoop run identifier the review was performed against. |
| summary | string | yes | Plain-English review summary. |
| verdict | string | yes | Merge verdict: approve_with_review means safe to merge with human review; needs_changes requires fixes; blocked means do not merge. |
No examples provided.
martin_run ~313
Execute a governed MartinLoop coding run after MCP workflow admission is satisfied. Use when the user has authorized implementation, bug fixing, tests, or refactoring and doctor/estimate/plan/preflight receipts match this task. Do not use for question-only diagnosis or when policy, budget, credentials, or scope still need consent. Next: read martin_dossier and verifier evidence.
| Name | Type | Req | Description |
|---|---|---|---|
| allowedPaths | array | – | Repo-relative path globs Martin may modify. |
| deniedPaths | array | – | Repo-relative path globs Martin must never modify. |
| engine | string | – | Which agent CLI to use. Defaults to claude. |
| maxIterations | integer | – | Maximum number of loop attempts. |
| maxTokens | integer | – | Maximum total tokens across all attempts. |
| maxUsd | number | – | Hard budget ceiling in USD. |
| model | string | – | Optional model override passed to the CLI. |
| objective | string | yes | The coding task to complete. Be specific about what needs to change. |
| projectId | string | – | Project identifier for telemetry. |
| providerExecutionTimeoutMs | integer | – | Hard timeout for each provider coding process in milliseconds. |
| verificationPlan | array | – | Commands that must all exit 0 for the task to be considered complete. |
| verifyTimeoutMs | integer | – | Hard timeout for each verifier command in milliseconds. |
| workingDirectory | string | – | Optional repo-root override resolved under the MCP workspace root. Must stay within that safe root. |
| workspaceId | string | – | Workspace identifier for telemetry. |
| Name | Type | Req | Description |
|---|---|---|---|
| attempts | integer | yes | – |
| budget | object | yes | – |
| costUsd | number | yes | – |
| engine | string | yes | – |
| inspection | object | yes | – |
| lifecycleState | string | yes | – |
| loopId | string | yes | – |
| pressure | string | yes | – |
| reason | string | yes | – |
| remainingBudgetUsd | number | yes | – |
| remainingIterations | integer | yes | – |
| remainingTokens | integer | – | – |
| shouldStop | boolean | yes | – |
| status | string | yes | – |
| verificationPassed | boolean | yes | – |
| workingDirectory | string | yes | – |
No examples provided.
martin_run_dossier ~190
Read the full structured execution dossier for one MartinLoop run, including attempts, events, artifacts, verification, integrity, cost, and related discovery surfaces. Provide exactly one selector: file, loopId, or latest; runsDir changes the run-store root. Use for comprehensive evidence review. Do not use for a compact state check; use martin_get_run, or use martin_dossier when formatted sharing output is required.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Path to a canonical loop-record.json, legacy file, or run-store directory. Mutually exclusive with loopId and latest. |
| latest | – | – | When true, loads the most recently updated loop record. Mutually exclusive with file and loopId. |
| loopId | string | – | Loop ID under the run store. Mutually exclusive with file and latest. |
| runsDir | string | – | Optional run-store root override used to resolve loopId or latest. |
| Name | Type | Req | Description |
|---|---|---|---|
| artifacts | object | yes | – |
| attempts | array | yes | – |
| budget | object | yes | – |
| cost | object | yes | – |
| inspection | object | yes | – |
| loop | object | yes | – |
| recentEvents | array | yes | – |
| related | object | yes | – |
| source | string | yes | – |
| sourceKind | string | yes | – |
| verification | object | yes | – |
| warnings | array | yes | – |
No examples provided.
martin_status ~235
Read the current budget, cost, remaining limits, and stop pressure for one MartinLoop run. Provide exactly one selector: loopJson for an inline record, file for a saved record, loopId for a run-store ID, or latest for the newest run; runsDir only changes the run-store root. Use for a compact budget check. Do not use for full events or artifacts; use martin_get_run or martin_run_dossier instead.
| Name | Type | Req | Description |
|---|---|---|---|
| file | string | – | Path under the Martin runs root to a loop-record.json file, a legacy .jsonl file, or a run-store directory. Mutually exclusive with loopJson, loopId, and latest. |
| latest | – | – | When true, loads the most recently updated loop record. Mutually exclusive with loopJson, file, and loopId. |
| loopId | string | – | Loop ID resolved as <runsDir>/<loopId>/loop-record.json. Mutually exclusive with loopJson, file, and latest. |
| loopJson | string | – | JSON-serialized LoopRecord. |
| runsDir | string | – | Optional runs-root override resolved under the default Martin runs root. |
| Name | Type | Req | Description |
|---|---|---|---|
| attempts | integer | yes | – |
| avoidedUsd | number | yes | – |
| budget | object | yes | – |
| costUsd | number | yes | – |
| inspection | object | yes | – |
| lifecycleState | string | yes | – |
| loopId | string | yes | – |
| pressure | string | yes | – |
| remainingBudgetUsd | number | yes | – |
| remainingIterations | integer | yes | – |
| remainingTokens | integer | – | – |
| shouldStop | boolean | yes | – |
| source | string | yes | – |
| status | string | yes | – |
No examples provided.
martin_triage_runs ~186
Read-only prioritization of saved Martin runs that need attention. Use when the user says a prior attempt failed, asks what to fix next, or resumes an interrupted session. Do not use for a brand-new objective with no relevant run history. Next: inspect the selected run or dossier before retrying.
| Name | Type | Req | Description |
|---|---|---|---|
| adapterId | string | – | Filter by attempt adapter ID. |
| includeHealthy | boolean | – | When true, include healthy runs instead of only attention-worthy findings. |
| lifecycleState | string | – | Filter by lifecycle state. |
| limit | integer | – | Maximum number of runs to triage. Defaults to 20. |
| model | string | – | Filter by attempt model. |
| runsDir | string | – | Optional runs-root override. |
| status | string | – | Filter by loop status. |
| updatedAfter | string | – | Optional ISO-8601 timestamp for recency filtering. |
| Name | Type | Req | Description |
|---|---|---|---|
| evaluatedRuns | integer | yes | – |
| filters | object | yes | – |
| findingCount | integer | yes | – |
| findings | array | yes | – |
| runsRoot | string | yes | – |
| severityBreakdown | object | yes | – |
| source | string | yes | – |
| warnings | array | yes | – |
No examples provided.
What is the Martin Loop MCP server?
Martin Loop is an MCP server listed in the public MCP registry as io.github.Keesan12/martin-loop. One system around coding agents to run, verify, recover, and hand off software work. This page covers its npm package (@martinloop/mcp).
Is the Martin Loop MCP server safe to use?
Martin Loop scores 94 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Martin Loop MCP server expose?
Martin Loop exposes 24 tools: martin_run, martin_inspect, martin_status, martin_doctor, martin_plan, and 19 more. Their descriptions and schemas cost roughly 4,142 tokens of context every time the server is loaded.
Is the Martin Loop MCP server still maintained?
Martin Loop is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Martin Loop MCP server under?
Martin Loop declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.