io.github.Harflow-Dev/harflow-mcp
PYPI · HARFLOW-MCP
Dispatch coding tasks to local headless agents with persistent history and workflows.
Available components
Last scanned (13 hours ago)
Scores higher than 77% of PyPI servers
Category Developer Tools
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 Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 29 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Harflow-Dev/HarflowMCP). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability45
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 18109 tokens (~329/item across 55 items; 55 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management47
- Stability observed for 14 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "send_message" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 56 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (16)
- Malware scan
- Known CVEs
- Install scripts
- Dependency health
- Source repository
- Provenance
- License
- Maintenance
- Security disclosure
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this package (2)
- Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
- Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
The score does not measure everything. What the score does not measure →
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.
- 5 Nov 26 +44
- Malware scan: unverified → pass ▲ security
- Injection markers: unverified → pass ▲ security
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- Stability: unverified → 0.47 ▲ functional
- Package version: 0.0.9 → 0.0.10 functional
- 4 Nov 26 −43
- Stability: 0.40 → unverified ▼ security
- Malware scan: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.0.7 → 0.0.9 functional
- Package version: 0.0.7 → 0.0.8 functional
- 3 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 2 Nov 26 −14
- Malware scan: pass → unverified ▼ security
- Package version: 0.0.6 → 0.0.7 functional
- 1 Nov 26 0
- Tool safety: pass → unverified ▼ security
- Stability: 0.30 → unverified ▼ security
- Schema quality: 15162 → 18053 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- Package version: 0.0.5 → 0.0.6 functional
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 29 Oct 26 0
- Package version: 0.0.4 → 0.0.5 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 5 Nov 2026 · Analysed pypi/harflow-mcp@0.0.10
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 | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Harflow-Dev/HarflowMCP |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Harflow-Dev/HarflowMCP/.github/workflows/release.yml@refs/tags/v0.0.10 |
| Rekor log index | 3692248179 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:5b887fa4e26d3a61dd6db416e946149b7d0561fe4d8e23c4578fa102ccdb35e9 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | Known build tool | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 29 packages
| Packages resolved | 29 |
|---|---|
| No linked repository | 1 |
| 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 →
wait_for_task ~791
Wait for a task to finish, giving up after a timeout without disturbing the run. Args: task_id: Identifier of the task to await. timeout_seconds: How long to hold, 0..3600 (default 50; 0 observes once without sleeping). Honoured as asked, never silently clamped; out of range is INVALID_PARAMS. Breaking change: values above 3600 are now rejected (0 is newly accepted). Your MCP client applies its own request deadline, and exceeding it fails the *call* even though the task keeps running — see docs/multi-task-waiting.md before asking for long holds. include_tail: If True, include the full last_output_tail (20 lines × 2000 chars each); if False (default), the tail is omitted for running/completed tasks and shortened to 5 lines × 500 chars for failed tasks. detail: "compact" (default) omits static execution metadata and detailed outcome probes; "full" returns complete MCP status. Both preserve the complete summary/report, approval attention, failure diagnostics and wait fields. include_tail=True retains the full tail in either mode. until: "timeout" (default) returns when the task settles or timeout_seconds elapses. "terminal" holds until the task settles, bounded only by a 6 hour server ceiling; timeout_seconds must then be omitted (passing both is INVALID_PARAMS). ctx: Injected by the server; not a caller argument. The result is the task status plus `requested_timeout_seconds`, `effective_timeout_seconds`, `until`, `timed_out`, `stop_reason` (terminal, attention, timeout, ceiling or observation_unavailable), `elapsed_seconds` and `polling_guidance`. If the task is still going when the wait ends, the status is "running" with a `next_step` hint: call this again, or poll get_task_status. The dispatched process is never signalled, written or resumed by a wait, so waiting is always safe and repeating it costs nothing. For a task recovered from an earlier server…
| Name | Type | Req | Description |
|---|---|---|---|
| detail | string | – | – |
| include_tail | boolean | – | – |
| task_id | string | yes | – |
| timeout_seconds | – | – | – |
| until | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
wait_for_tasks ~387
Observe 1..32 unique task IDs, returning compact statuses in requested order. mode any returns when at least one requested task is settled; all waits for every task. timeout_seconds accepts 0..3600 (default 30) and is honoured as asked, never silently clamped; out of range is INVALID_PARAMS. Zero polls immediately. until="terminal" holds until the mode is satisfied, bounded by a 6 hour server ceiling, and requires timeout_seconds to be omitted. Your MCP client's own request deadline still applies. Prefer holds <=50 seconds after remote "device did not respond" or "connection closed" errors; see docs/multi-task-waiting.md. All IDs must exist and pass caller read authorization before waiting. Existence checks and initial metadata share a two-second I/O budget; undecidable existence rejects the request. A final metadata observation can add up to two more seconds. Returns terminal_task_ids, bounded summaries and get_task_status diagnostic references; no output tails. A recovered task whose process is confirmed gone without an observed exit is listed in undecidable_task_ids (status unknown) and counts as settled in both modes, as in wait_for_task, after a short grace if its owning harflow_mcp server is still alive; an uncertain identity keeps waiting. Under until="terminal", targets that stay unobservable for 3 rounds stop the wait with stop_reason observation_unavailable. Rows carry a bounded failure_diagnostic (category, reason) when one exists. Also returns requested/effective timeout, until, timed_out, stop_reason, elapsed_seconds and polling_guidance. Progress is sent every 5 seconds. Timeout and caller cancellation never cancel or signal the observed tasks.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | – |
| task_ids | array | yes | – |
| timeout_seconds | – | – | – |
| until | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
wait_for_workflow ~361
Wait for a workflow run to need attention or finish; read-only and resumable. timeout_seconds accepts 0..3600 (default 30; 0 reads once). It is honoured as asked, never silently clamped; out of range is INVALID_PARAMS. Breaking change: values above 300 used to be rejected, and 46..300 were silently held for only 45 seconds. until="terminal" holds until the run stops needing the wait, bounded by a 6 hour server ceiling, and requires timeout_seconds to be omitted. Your MCP client's own request deadline still applies. Prefer holds <=50 seconds after remote "device did not respond" or "connection closed" errors; see docs/multi-task-waiting.md. Returns when the run is completed, failed or cancelled and has finished settling (stop_reason terminal), or reaches needs_input, needs_attention or paused (stop_reason attention), or the hold ends (timeout, ceiling). If reading the run keeps failing for 3 rounds the last good snapshot comes back with stop_reason observation_unavailable, as does an until="terminal" wait on a terminal run that stays settling with its run file unchanged for 300 seconds. Also returns requested/effective timeout, until, timed_out, elapsed_seconds and polling_guidance. Approval read errors alone do not stop the wait for attention; inspect approval_summary.read_errors for incomplete sources. Known unanswered requests and uncertain approval ownership still stop for attention. Progress is sent every 5 seconds, best effort. A wait never changes, resumes or cancels a run.
| Name | Type | Req | Description |
|---|---|---|---|
| timeout_seconds | – | – | – |
| until | string | – | – |
| workflow_run_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
workflow_builder ~623
Generate a workflow, or refine the current canvas into an unsaved validated proposal. Orchestrator instructions belong in orchestrator.instructions; Start/End are structural. Optional on_demand_nodes are a separate ordered list with globally unique local id, title, required nonempty instructions, optional call_condition (When to call guidance), agent, freedom, network, session_mode agent_decides|fresh|resume and execution_mode. They have no position, role or connections. max_on_demand_calls defaults to 5 (1–50) per routing/question checkpoint; no per-node or per-run call cap exists. Write prompt in plain prose: preserve spaces and word boundaries rather than concatenating words to save tokens. The caller's prompt is retained unchanged before builder input assembly. Keep node and connection instructions concise and task-specific. HarflowMCP owns runtime retries, budget enforcement, configured fallback dispatch and user interaction; use existing configuration fields for limits and fallback candidates, and orchestrator needs_input for clarification or approval. End means intentional workflow termination, not waiting for user input. Preserve legitimate task branches and revision loops. Layout uses top-left logical point coordinates with x/y >= 0 and a 10-point dot grid. Agent nodes are 200 x 92 points (reserve 20 x 10 grid cells); Start/End are 72 x 72 (reserve 8 x 8 cells). Leave at least 40 points (4 cells) between node edges and avoid overlaps. Arrange forward steps left to right and parallel branches on separate rows. Use routing_mode="explicit". Ordinary outgoing paths are exclusive alternatives. Parallel execution requires paired parallel_start/parallel_end structural nodes with a shared parallel_group_id; every branch must reach its matching end. Parallel start defaults to `branch_selection: "all"`. With `branch_selection: "orchestrator"`, the orchestrator selects applicable issued branch continuations, assigns each selected entry through `branch_assignments…
| Name | Type | Req | Description |
|---|---|---|---|
| agent | – | – | – |
| definition | – | – | – |
| fallbacks | – | – | – |
| name | string | yes | – |
| prompt | string | yes | – |
| repo_path | – | – | – |
| source | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
workflow_limit_hits ~458
Provider usage-limit hits and blocking recoveries of workflow runs, from persisted run evidence. Read-only: nothing is retried, switched or continued. Evidence is only an attempt's failure_diagnostic with category usage_limit (headless and Codex-native attempts alike) and the run's orchestrator or worker usage-limit recovery checkpoint; node results and prose are never read. Direct callers read every run; a workflow orchestrator reads its own run and descendants verified through persisted invocation links; workers and builders are refused. current lists runs blocked on a usage-limit recovery (at most 100), reported on the owning run even while its root is running. latest is the newest hit per (backend, requested_model, observed_model) among the newest 500 hits matching the window bound: the first of root_workflow_run_id (not supported for managed callers), workflow_id and repo that is set, plus the since (inclusive) and before (exclusive) ISO8601 range with timezone; the other filters apply inside that window and there is no pagination. At most 50 keys are returned. current_only reports only current. Each hit carries root_workflow_run_id, workflow_run_id, node_id, execution_id, attempt, task_id, transport_task_id, observed_at (when the attempt settled; observed_at_source names the field), diagnostic, reset {raw, at, state} (a numeric reset is epoch seconds; elapsed does not say the provider is available again), an accepted recovery {accepted, answer} when one answered it, and detail_ref, the get_workflow_run_detail arguments for execution:<id>. Each attempt is its own hit: native children that share a transport report it in transport_task_id. unavailable lists up to 20 runs whose document could not be read. scan.complete is false when a cap was reached, runs are unavailable or the index is still preparing (index_state), so retry while it is preparing. See docs/usage-limits.md.
| Name | Type | Req | Description |
|---|---|---|---|
| before | – | – | – |
| current_only | boolean | – | – |
| repo | – | – | – |
| root_workflow_run_id | – | – | – |
| since | – | – | – |
| workflow_id | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the io.github.Harflow-Dev/harflow-mcp server?
io.github.Harflow-Dev/harflow-mcp runs locally as a PyPI package, launched with uvx harflow-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · harflow-mcp
claude mcp add harflow-dev-harflow-mcp -- uvx harflow-mcp
What is the io.github.Harflow-Dev/harflow-mcp server?
io.github.Harflow-Dev/harflow-mcp is listed in the public MCP registry as io.github.Harflow-Dev/harflow-mcp. Dispatch coding tasks to local headless agents with persistent history and workflows. This page covers its PyPI package (harflow-mcp).
Is the io.github.Harflow-Dev/harflow-mcp server safe to use?
io.github.Harflow-Dev/harflow-mcp scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. 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 io.github.Harflow-Dev/harflow-mcp server expose?
io.github.Harflow-Dev/harflow-mcp exposes 55 tools: list_backends, start_task, list_approval_requests, get_approval_request, respond_approval_request, and 50 more. Their descriptions and schemas cost roughly 17,096 tokens of context every time the server is loaded.
Is the io.github.Harflow-Dev/harflow-mcp server still maintained?
io.github.Harflow-Dev/harflow-mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 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 io.github.Harflow-Dev/harflow-mcp server under?
io.github.Harflow-Dev/harflow-mcp 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.
What did VerifyMCP test on the io.github.Harflow-Dev/harflow-mcp server?
VerifyMCP ran 16 checks on io.github.Harflow-Dev/harflow-mcp, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.