# Awaitless (pypi · awaitless-runner)

Durable execution and named concurrency queues for coding agents across local, SSH, and Slurm.

- Trust score: 66/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-20

## Components

- pypi · `awaitless-runner`: 66/100 (this document), [markdown](https://verifymcp.io/servers/xpluspro-awaitless/awaitless-runner.md), [page](https://verifymcp.io/servers/xpluspro-awaitless/awaitless-runner)

## Channel facts

- Registry: `pypi`
- Package: `awaitless-runner`
- Version: `0.8.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-20.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it.
  - 2 of 31 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 62/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 1434 tokens (~130/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 33/100
  - Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### Claude

```bash
claude mcp add xpluspro-awaitless -- uvx awaitless-runner
```

### Codex

```bash
codex mcp add xpluspro-awaitless -- uvx awaitless-runner
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "xpluspro-awaitless": {
      "type": "local",
      "command": [
        "uvx",
        "awaitless-runner"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add xpluspro-awaitless --command uvx --arg awaitless-runner
```

### Hermes

```yaml
mcp_servers:
  xpluspro-awaitless:
    command: "uvx"
    args: ["awaitless-runner"]
```

### Other

```json
{
  "mcpServers": {
    "xpluspro-awaitless": {
      "command": "uvx",
      "args": [
        "awaitless-runner"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-20 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-19 (score 65, +1)

- [security regression] Stability: 0.27 → unverified
- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 67 → 86
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: pass → fail
- [functional] First check of Schema quality: unverified
- [functional] Schema quality: fair → good
- [functional] Package version: 0.4.0 → 0.8.0
- [functional] Package version: 0.4.0 → 0.7.0

### 2026-08-17 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-15 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-13 (score 62, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-12 (score 61, +15)

- [security improvement] Malware scan: unverified → pass
- [functional regression] Security disclosure: unverified → fail

### 2026-08-11 (score 46, −12)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 506 → 610
- [functional regression] Security disclosure: fail → unverified
- [functional improvement] Stability: unverified → 0.03
- [functional] Package version: 0.3.0 → 0.4.0
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-08-10 (score 58)

First indexed and scored.

## MCP tools (11)

### `run` (~248 tokens)

Default tool for starting one non-interactive command of uncertain duration.

Every command is a durable Job from launch. Commands that finish within the
inline timeout return their ordinary bounded result. Longer or queued work
returns a detached Job handle without cancelling the workload. Omit queue to
use an operator-configured default queue for the selected target.

Do not use this tool for explicit fire-and-forget or batch fan-out; use
submit_job. Do not use it when an MCP Tasks handle is explicitly required;
use run_job. Do not use it to resume an existing job_id; wait for or inspect
that job instead. If a detached handle is returned, keep its job_id and call
wait_for_job once when the result is needed rather than polling status.

Input parameters:

- `artifacts`
- `backend`
- `capture_logs`
- `client_request_id`
- `command` (array, required)
- `cwd`
- `env`
- `host`
- `inline_timeout_seconds`
- `name`
- `queue`
- `resources`
- `slurm_options`
- `stall_timeout_seconds`
- `timeout_seconds`

### `submit_job` (~269 tokens)

Explicitly submit one asynchronous or fan-out job without waiting.

Omitted backend and host values use the Awaitless configuration defaults.
Reuse client_request_id only when retrying the same logical submission; an
identical retry returns the original job and a conflicting retry is rejected.
A named queue provides FIFO, non-preemptive admission for local or SSH work.
Slurm options may contain account, constraint, cpus_per_task, gres, mem,
nodes, ntasks, partition, qos, or time. Cluster config supplies defaults.

Do not use this as the default for a single command with uncertain duration;
use run. Do not use it for MCP Tasks creation; use run_job. Do not resubmit
merely because a client disconnected or a wait timed out: keep the original
job_id, or retry the identical logical submission with the same
client_request_id if the creation response was lost.

Input parameters:

- `artifacts`
- `backend`
- `capture_logs`
- `client_request_id`
- `command` (array, required)
- `cwd`
- `env`
- `host`
- `name`
- `queue`
- `resources`
- `slurm_options`
- `stall_timeout_seconds`
- `timeout_seconds`

### `run_job` (~189 tokens)

MCP Tasks compatibility entry point for explicitly creating a Task handle.

A client declaring io.modelcontextprotocol/tasks receives a Task handle
immediately. Older clients block and receive the ordinary final tool result.
The stable client_request_id makes a lost creation response safe to retry.

Do not choose this for ordinary command execution: use run. Do not choose it
for generic asynchronous submission or fan-out: use submit_job. Only retry a
lost Task creation with the same client_request_id and identical arguments.

Input parameters:

- `artifacts`
- `backend`
- `capture_logs`
- `client_request_id` (string, required)
- `command` (array, required)
- `cwd`
- `env`
- `host`
- `name`
- `queue`
- `resources`
- `slurm_options`
- `stall_timeout_seconds`
- `timeout_seconds`

### `wait_for_job` (~105 tokens)

Wait once for a known job_id and consume its durable terminal result.

Returns state, exit code, bounded logs, and declared Artifacts. A client-side
timeout or disconnect does not cancel the Job; call this tool again later with
the same job_id. Do not use it to start work, do not poll it repeatedly, and
use wait_for_completions instead when collecting several independent Jobs.

Input parameters:

- `job_id` (string, required)
- `timeout_seconds`

### `wait_for_completions` (~168 tokens)

Collect durable terminal results across multiple known jobs after a cursor.

Existing completions return immediately. Otherwise the call waits until at
least one selected job completes or the optional call-level timeout expires.
Reusing the same cursor replays results; advancing to next_cursor consumes
the returned batch. A timeout never cancels a managed job.

Submit all independent jobs before calling this tool. Treat delivery as
at-least-once: process and deduplicate by completion_id before advancing the
cursor. Do not use this for one job, do not poll get_job_status between
continuation calls, and never resubmit active jobs after a waiter disconnects.

Input parameters:

- `after_cursor`
- `job_ids` (array, required)
- `limit` (integer)
- `timeout_seconds`

### `get_job_status` (~83 tokens)

Get one immediate, non-waiting state snapshot for a known job_id.

Use only when the caller needs current status now. Do not use this to wait for
completion or build a polling loop; use wait_for_job for one Job or
wait_for_completions for several. This tool never starts or retries work.

Input parameters:

- `job_id` (string, required)

### `get_job_logs` (~99 tokens)

Inspect bounded stdout and stderr tails for a known failed or stalled job.

Use after a terminal wait reports failure, timeout, stall, or loss and its
bounded result needs focused diagnostics. Do not use as a progress stream,
do not repeatedly tail a running healthy Job, and do not use it instead of
wait_for_job to learn that work completed.

Input parameters:

- `job_id` (string, required)
- `max_bytes`
- `tail`

### `cancel_job` (~37 tokens)

Cancel a durable job without relying on a client-side process handle.

Input parameters:

- `grace_seconds` (number)
- `job_id` (string, required)

### `list_jobs` (~42 tokens)

List recent durable jobs, optionally filtered by state or host.

Input parameters:

- `host`
- `limit` (integer)
- `queue`
- `state`

### `create_queue` (~34 tokens)

Create an immutable named FIFO queue with a fixed concurrency limit.

Input parameters:

- `concurrency` (integer, required)
- `name` (string, required)

### `list_queues` (~21 tokens)

List named queues and their current queued/active job counts.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/xpluspro-awaitless/awaitless-runner#diagnostics

## Score history

- 2026-08-20: 66
- 2026-08-19: 65
- 2026-08-18: 64
- 2026-08-17: 64
- 2026-08-16: 63
- 2026-08-15: 63
- 2026-08-14: 62
- 2026-08-13: 62
- 2026-08-12: 61
- 2026-08-11: 46
- 2026-08-10: 58

## Links

- PyPI project: https://pypi.org/project/awaitless-runner/
- Socket report: https://socket.dev/pypi/package/awaitless-runner
- Repository: https://github.com/xpluspro/Awaitless
- Changelog RSS feed: https://verifymcp.io/servers/xpluspro-awaitless/awaitless-runner.xml
- Changelog JSON feed: https://verifymcp.io/servers/xpluspro-awaitless/awaitless-runner.json
- HTML version of this page: https://verifymcp.io/servers/xpluspro-awaitless/awaitless-runner
