# io.github.AutomateLab-tech/content-distribution (npm · @automatelab/content-distribution-mcp)

Publish content to DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, and Medium.

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

## Components

- npm · `@automatelab/content-distribution-mcp`: 68/100 (this document), [markdown](https://verifymcp.io/servers/automatelab-tech-content-distribution/automatelab-content-distribution-mcp.md), [page](https://verifymcp.io/servers/automatelab-tech-content-distribution/automatelab-content-distribution-mcp)

## Channel facts

- Registry: `npm`
- Package: `@automatelab/content-distribution-mcp`
- Version: `2.2.1`
- 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-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (97 of 101), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (97 of 101), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 55 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 73/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 1046 tokens (~130/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 91/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 69% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add automatelab-tech-content-distribution -- npx -y @automatelab/content-distribution-mcp
```

### Codex

```bash
codex mcp add automatelab-tech-content-distribution -- npx -y @automatelab/content-distribution-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "automatelab-tech-content-distribution": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@automatelab/content-distribution-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add automatelab-tech-content-distribution --command npx --arg -y --arg @automatelab/content-distribution-mcp
```

### Hermes

```yaml
mcp_servers:
  automatelab-tech-content-distribution:
    command: "npx"
    args: ["-y", "@automatelab/content-distribution-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "automatelab-tech-content-distribution": {
      "command": "npx",
      "args": [
        "-y",
        "@automatelab/content-distribution-mcp"
      ]
    }
  }
}
```

## 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-03 (score 68, +1)

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

### 2026-08-02 (score 67, +47)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [functional regression] Security disclosure: fail → unverified
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

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

- [security improvement] Malware scan: unverified → pass
- [functional regression] Tool coverage: 100 → unverified

### 2026-07-31 (score 19, −5)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 24, −20)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 44)

First indexed and scored.

## MCP tools (8)

### `post.publish` (~139 tokens)

Publish variants to one or more channels immediately

Publish one or more channel variants immediately. Side effects: makes external HTTP requests to each channel platform; writes publish state to the local YAML backend; requires valid credentials in the named profile. Idempotent on (content.id, channel) — re-running with the same IDs returns cached state without re-posting. Use post.publish for immediate-only delivery; use post.schedule when any variant needs a future schedule_at; use post.drain to flush a previously built queue.

Input parameters:

- `content` (object, required)
- `profile_name` (string, required): Name of the distribution profile (credentials store). Use profile.list to discover available names.
- `variants` (array, required)

Output parameters:

- `results` (array): Per-variant results, one entry per input variant in the same order.

### `post.schedule` (~137 tokens)

Schedule variants for future publishing

Enqueue channel variants with schedule_at for future publishing; variants without schedule_at are published immediately. Side effects: writes entries to the local YAML schedule store; makes external HTTP requests for any immediately-published variants; requires credentials in the named profile. Idempotent on (content.id, channel). Use post.schedule when any variant needs a future publish time; use post.publish for all-immediate delivery; use post.drain to process the scheduled queue later.

Input parameters:

- `content` (object, required)
- `profile_name` (string, required): Name of the distribution profile (credentials store). Use profile.list to discover available names.
- `variants` (array, required)

Output parameters:

- `results` (array): Per-variant results, one entry per input variant in the same order.

### `post.drain` (~145 tokens)

Fire all scheduled posts due now

Fire all scheduled posts due at or before the given time boundary. Side effects: makes external HTTP requests for each due entry; writes results to the YAML backend. Idempotent — already-published (content.id, channel) pairs are skipped; no-op when no entries are due. Safe to call from cron. Use post.drain on a recurring schedule to flush the queue; use post.publish or post.schedule to add new content; use post.status to inspect results after drain runs.

Input parameters:

- `now` (string): ISO-8601 datetime boundary, e.g. '2026-05-21T09:00:00Z'; defaults to current UTC time when omitted.

Output parameters:

- `results` (array): Per-variant results, one entry per input variant in the same order.

### `post.status` (~150 tokens)

Read publish state for content pieces

Return publish state for content pieces. Filters by content_id, channel, or both; returns all entries when neither is given. Side effects: read-only; no external HTTP calls; no auth needed. Deterministic given unchanged backend state. Use post.status to inspect what has been published, what is queued, or what errored; use post.publish, post.schedule, or post.drain to change state.

Input parameters:

- `channel` (string): Filter to a specific channel slug, e.g. 'devto', 'reddit:ClaudeAI'; omit to return state for all channels.
- `content_id` (string): Filter to a specific content piece by its stable ID; omit to return state for all content.

Output parameters:

- `results` (array): Publish-log entries matching the filter.

### `post.unpublish` (~165 tokens)

Retract a published post (best-effort)

Best-effort delete of a published post on the target platform. Side effects: makes an external HTTP DELETE or update request; DEV.to sets published=false (soft delete); platforms without a delete API return success=false without error. Non-idempotent — calling on an already-deleted URL may return a platform 404. Use post.unpublish to retract a live post; use post.status first to obtain the live_url; use post.publish to re-publish after an unpublish.

Input parameters:

- `channel` (string, required): Channel slug the post was published to, e.g. 'devto', 'hashnode', 'reddit:ClaudeAI'.
- `live_url` (string, required): URL of the live published post to retract, e.g. 'https://dev.to/user/post-slug'.

Output parameters:

- `error` (string|null): Platform error message; null on success.
- `success` (boolean): Whether the retract succeeded on the platform side.

### `channel.hints` (~126 tokens)

Static per-channel metadata

Return static per-channel metadata: character limits, Markdown support flags, tag vocabulary, and CTA placement rules. Side effects: read-only; no external HTTP calls; no auth needed. Fully deterministic — returns compile-time adapter constants. Use channel.hints before composing a variant body to understand channel constraints; use post.publish or post.schedule once you have a valid variant.

Input parameters:

- `channel` (string, required): Channel platform name, e.g. 'devto', 'reddit', 'hashnode', 'bluesky'. Use the platform prefix only, not the full 'platform:account' form.

Output parameters:

- `browser_only` (boolean): True when posting requires the browser-fallback flow (no public API).
- `canonical_url_supported` (boolean): Whether the channel honours canonical_url natively.
- `cta_placement` (string): Where the CTA block lands on this channel.
- `max_length` (number): Max post length in characters; omitted when the channel has no limit.
- `supported_md_features` (array): Markdown features the channel renders, e.g. 'links', 'code_blocks'.
- `tag_vocab` (array): Canonical tag vocabulary; omitted when the channel accepts free-form tags.

### `profile.list` (~65 tokens)

List configured distribution profiles

Return all distribution profile names configured in the YAML backend. Side effects: read-only; no external HTTP calls. Deterministic given backend state. Use profile.list to discover available profiles before calling post.publish, post.schedule, or subreddit.list; then pass the chosen name as profile_name.

Output parameters:

- `profiles` (array): Configured distribution profile names.

### `subreddit.list` (~119 tokens)

List Subreddit Catalog entries

Return all subreddits in the Subreddit Catalog with cooldown windows, flair vocabulary, and last-posted metadata. Optionally filtered to subreddits allowed by the named profile. Side effects: read-only; no external HTTP calls. Deterministic given backend state. Use subreddit.list to select a subreddit and obtain flair IDs before composing a reddit: channel variant; pass flair in variant.extras.flair.

Input parameters:

- `profile_name` (string): Optional profile name to filter subreddits to those allowed by that profile; omit to return the full catalog.

Output parameters:

- `subreddits` (array): Subreddit Catalog entries matching the filter.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/automatelab-tech-content-distribution/automatelab-content-distribution-mcp#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 67
- 2026-08-01: 20
- 2026-07-31: 19
- 2026-07-30: 24
- 2026-07-28: 44
- 2026-07-27: 44

## Links

- npm package: https://www.npmjs.com/package/@automatelab/content-distribution-mcp
- Socket report: https://socket.dev/npm/package/@automatelab/content-distribution-mcp
- Repository: https://github.com/AutomateLab-tech/content-distribution-mcp
- Changelog RSS feed: https://verifymcp.io/servers/automatelab-tech-content-distribution/automatelab-content-distribution-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/automatelab-tech-content-distribution/automatelab-content-distribution-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/automatelab-tech-content-distribution/automatelab-content-distribution-mcp
