Eclipse Dispatch MCP
Syndicates approved canonical drafts into Ghost as drafts via an API-shaped adapter targeting the Ghost Admin API, and reports unified analytics normalized by metric key with provenance and the platform's own definitions.
Read-only integration: consumes the owner's own publication RSS feed for analytics and produces local paste packs (rendered previews plus adaptation diffs) that the owner posts manually in-app; all write attempts are refused by name.
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., "@Eclipse Dispatch MCPCreate a draft and show previews for beehiiv, Ghost, and Substack"
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.
Eclipse Dispatch MCP
Powered by Cyan Eclipse Technologies — https://cetech.ai
Eclipse Dispatch — the newsletter layer above the platforms: it drafts once and syndicates the drafts to every sanctioned platform, unifies the analytics, and watches your own subscriptions like a portfolio. It never publishes without approval, and it never scrapes.
Why this exists
A publisher multi-homed across beehiiv, Ghost, and Substack writes once and re-enters everywhere, then reads three dashboards with three different definitions of an "open." Each platform's own tooling stops at its own wall: Substack's official MCP is read-only analytics gated to Bestseller admins; beehiiv's official MCP drafts into beehiiv only. Dispatch is the cross-platform layer none of them will build — one canonical draft, per-platform drafts via sanctioned routes, analytics unified without silent blending, and review-first as a property of the code, not a policy memo.
Related MCP server: Clearon Content Archive MCP
Status — honest labels
v0.1.0, phases D0 + D1-core. Bench pending — no certification claimed. Local stdio transport, Python stdlib only. Adapters run against shipped fixtures and local stub HTTP servers shaped like the real APIs — nothing in this build contacts a platform. Live wiring is owner-gated Wave 2: the beehiiv signup is an open owner item, and no Ghost instance runs here. The reader face (spec §5, phase D2 — subscription portfolio, renewal radar, engagement truth) is not in v0.1; neither is the §4.6 unofficial-endpoint module, which the spec recommends not building in v1 at all.
Tools (6)
Tool | What it does |
| Create the canonical draft (title, body, subtitle, |
| The review artifact: per-platform rendered previews plus every adaptation diff vs the canonical draft — variant overrides and platform constraints (Substack = paste pack; beehiiv = draft-only, publish in-app). |
| Record owner approval; returns a token bound to the content hash. |
| Fan the approved draft out: beehiiv/Ghost drafts via the API-shaped adapters; Substack gets a paste pack (local files the owner posts in-app). Requires the approval token and an un-invalidated hash. Receipt per platform. |
| D0 unified analytics, read-only. Figures normalized by metric key, each carrying platform provenance + the platform's own definition. A combined figure appears only where definitions are identical across sources; otherwise |
| Hash-chained receipts (drafts, approvals, syndications, analytics runs) + chain verification. |
The invariants (encoded + tested)
Hash-bound approval. Approval binds to the canonical draft's content hash. Any post-approval edit — a new version, or a silent in-place tamper — invalidates it; syndication recomputes the hash and refuses by name. There is no path from "edited" to "sent" that passes through a stale approval.
The beehiiv adapter has no publish method. Deliberate, mirroring the platform's own design (its official MCP also stops at drafts; publishing is the publisher's in-app act). A unit test asserts the method's absence. The server exposes no publish tool at all — no auto-publish, at any tier, for any platform.
The Substack adapter is read-only. No sanctioned write surface exists, so write attempts raise a named refusal (
ReadOnlyRefusal: "Substack adapter is READ-ONLY…"). Substack receives paste packs, never writes. The spec's unofficial-endpoint module is not built (spec decision 3 recommendation: not in v1) — its absence changes nothing.Analytics never blend silently. Three platforms define "open rate" over three different populations (the fixtures say so, in each definition). Dispatch labels every figure and refuses to average across definitions.
No scraping. Public RSS of the owner's own publication is consumption as offered; bulk extraction does not exist here (spec §7).
Receipts
Draft creations, preview packs, approvals, per-platform syndications, and analytics runs append hash-chained receipts — append-only and machine-verifiable (verify_receipt_chain); tampering with any entry breaks the chain and is detected by test.
Run it
python3 server.py # MCP over stdio, stdlib only
python3 smoke.py # end-to-end smoke over real stdio (temp state, fixture adapters)
python3 -m unittest discover -s tests # 15 testsState persists in data/state.json beside the server (override with ECLIPSE_DISPATCH_STATE); paste packs land in data/paste-packs/. data/ is gitignored. Adapter base URLs can be pointed at stub (or, in Wave 2, real) endpoints via ECLIPSE_DISPATCH_BEEHIIV_URL / ECLIPSE_DISPATCH_GHOST_URL; with none set, in-process fixture transports answer.
Fixtures
fixtures/ ships per-platform analytics (each metric with the platform's own name and definition — the beehiiv and Ghost revenue figures deliberately use different definitions, period gross vs MRR, so the no-blending rule has something honest to catch) and substack_feed.xml, the owner's own publication RSS in fixture form. Stub servers shaped like the beehiiv v2 API and the Ghost Admin API live in adapters.py and are exercised over real local HTTP by the tests.
Roadmap (per spec)
D2 — reader face: subscription portfolio graph, renewal radar, engagement truth, cancel prep (own data only, strictest data tier).
D3 — Substack depth as the sanctioned surface grows — design waits for sanctioned writes; no scraping milestone exists.
Wave 2 (owner-gated) — live beehiiv wiring after the owner's signup; live Ghost against a real instance.
License / attribution
A Cyan Eclipse Technologies product. The "Powered by Cyan Eclipse Technologies" attribution travels with it.
Available Tools
6 toolsanalytics_reportB
D0 unified analytics (read-only): per-platform figures normalized by metric key, each carrying platform provenance + the platform's own definition. Combined figures appear ONLY where definitions are identical; differing definitions are flagged DEFINITIONS_DIFFER, never averaged.
| Name | Required | Description | Default |
|---|---|---|---|
| platforms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does meaningful work: it discloses that figures are never averaged across differing definitions, that DEFINITIONS_DIFFER is flagged, and that combined figures appear only under identical definitions. Missing are auth/rate-limit/permission notes and default-scope behavior, so not quite a 5.
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?
One tight sentence that front-loads the read-only nature and the normalization rule, with zero filler. The unexplained 'D0' prefix and dense clause stacking cost it a point.
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 read-only tool with no output schema, the description does well explaining result semantics (provenance, definition flags, non-averaging). However, it leaves the sole input parameter wholly undocumented and gives no guidance on default scope, which is a real gap for an agent trying to invoke it.
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?
There is one parameter (`platforms`, an untyped array) with 0% schema description coverage, and the description never mentions it at all — no format, no accepted values, no default-when-absent semantics. The description therefore adds nothing to a completely bare schema field.
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 names the resource (unified analytics), its scope (per-platform figures normalized by metric key), and its operation (read-only report), which is clearly distinct from the sibling draft/syndication/receipt tools. It is specific but never uses a plain verb like 'returns' or 'generates', and the 'D0' label is unexplained jargon.
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?
'(read-only)' signals it is a safe read, which is useful context. But there is no statement of when an agent should call this versus the sibling tools, no prerequisites, and no indication of what happens when the optional `platforms` filter is omitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_approveA
Record owner approval of the current version. Returns an approval token bound to the content hash; any later edit invalidates it.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | ||
| approved_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries real weight and delivers: it discloses the return value (an approval token bound to the content hash) and a non-obvious side effect (any later edit invalidates the token). It leaves out idempotency and failure behavior, but the invalidation rule is exactly the kind of trait annotations would otherwise cover.
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 tight sentences with no filler; the core action comes first and the token/invalidation caveat follows. Every sentence earns its place.
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?
No output schema exists, and the description does explain the return value and its invalidation semantics, which is the main thing an agent needs. What remains thin is the parameter-level guidance and repeat-call behavior, both of which matter given two undocumented inputs.
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 0% and neither parameter is documented. The phrase 'owner approval' loosely hints that approved_by identifies the approver, but the description never mentions draft_id, never says whether approved_by is optional, and never clarifies whose identity or which version is targeted.
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 and object: recording owner approval of the current draft version, which is clearly distinct from draft_create, draft_preview and syndicate_drafts. It stops short of explicitly naming siblings, but the action is unambiguous.
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?
Usage is only implied: you call it to approve the current version, and the invalidation note hints at sequencing (approve after edits). There is no explicit when-not guidance, no mention of required owner privileges, and no statement about what happens if approval is repeated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_createB
Create (or re-version) the canonical draft: title, body, subtitle, canonical_url (home), tags, audience, per-platform variants. Hash-bound: the returned content_hash is what approval binds to. Re-creating an existing draft_id makes a NEW version and resets approval to none.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| tags | No | ||
| title | Yes | ||
| audience | No | ||
| draft_id | No | ||
| subtitle | No | ||
| variants | No | ||
| canonical_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses hash-binding semantics, that content_hash is the value approval binds to, and that re-creating an existing draft_id creates a new version and resets approval to none. It omits auth/permission requirements and failure modes (e.g. what happens on invalid variants), which keeps it short of a 5.
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?
Three dense sentences, front-loaded with what is created and followed by the behavior that matters most (hash binding, versioning side effect). No filler, though the telegraphic '(home)' parenthetical is slightly cryptic rather than explanatory.
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?
There is no output schema, and the description does say a content_hash is returned, which covers the key return value. However, for a mutation tool with 8 parameters, a nested variants object, and zero annotation coverage, it leaves the variants payload shape, validation behavior, and permission requirements unexplained.
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 0% across 8 parameters, so the description must supply the missing semantics. It mostly just re-lists the parameter names (title, body, subtitle, tags, audience) with only two hints of meaning — 'canonical_url (home)' and 'per-platform variants' — and gives no structure for the nested variants object or the draft_id format.
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 (create/re-version) and resource (the canonical draft) and enumerates the content it covers. The '(or re-version)' clause and the draft_id note separate it from a pure create, though it never names draft_preview, draft_approve, or syndicate_drafts to draw the workflow boundary explicitly.
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 note that re-creating an existing draft_id makes a new version and resets approval implies the intended entry point of the draft→approve→syndicate flow, but it never says to use this instead of draft_preview or draft_approve, nor when not to call it. Usage must be inferred from the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_previewB
The review artifact: per-platform rendered previews + every adaptation diff against the canonical draft (variant overrides and platform constraints, e.g. Substack = paste pack, beehiiv = draft-only).
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does disclose genuine domain behavior by explaining per-platform constraints (Substack = paste pack, beehiiv = draft-only), which is useful context beyond the name. It says nothing about whether the call is read-only, whether it triggers rendering work, or about cost/latency, leaving meaningful gaps for an unannotated tool.
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?
One dense sentence with no filler, and the core payoff (per-platform previews plus diffs) is front-loaded. The parenthetical about platform constraints is worth its length, though the jargon ('adaptation diff', 'paste pack') is left undefined.
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 one-parameter read tool with no output schema, the description does sketch the return payload (rendered previews and diffs), which the schema cannot. It stops short of describing structure, size, or how many platforms appear, so an agent still cannot anticipate the response shape.
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 0% and the single parameter draft_id appears nowhere in the description. The argument is largely self-explanatory from its name, but nothing explains whether it accepts an ID versus a slug, or what happens with an unknown or unapproved draft.
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 names the specific artifact produced: per-platform rendered previews plus adaptation diffs against the canonical draft. That distinguishes it clearly from draft_create, draft_approve, and syndicate_drafts. It never states the operation as a verb (fetch/generate), reading more like a description of output than an action, which keeps it from a 5.
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 review artifact' faintly implies use at the review stage, but there is no explicit when-to-use, no prerequisite such as an existing draft_id, and no comparison to draft_approve or syndicate_drafts. An agent must infer the call site from the noun phrase alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_listB
List hash-chained receipts (draft creations, approvals, syndications per platform, analytics runs) and verify the chain.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that receipts are hash-chained and that the tool can verify the chain, which is behavior beyond the schema. However, it does not state whether the operation is read-only, what permissions are required, pagination/order behavior, or what happens when verification fails.
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 a single front-loaded sentence with no wasted words, and the parenthetical enumeration earns its place by clarifying receipt categories. It slightly conflates two behaviors, listing and chain verification, without clarifying whether verification is always performed, which keeps it from a 5.
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 read-only listing tool with no output schema, the description identifies what is listed and notes chain verification, which is adequate to start. It still omits return structure, limit behavior, default ordering, and failure semantics for chain verification, so an agent lacks some context needed to invoke it confidently.
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 only parameter, "limit", has 0% schema description coverage, and the description does not mention it at all. It adds no semantics such as default value, maximum, or whether the limit applies before or after chain verification, though the single optional and intuitively named parameter keeps this from being a 1.
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 gives a specific read verb ("List") and resource ("hash-chained receipts"), then enumerates receipt categories such as draft creations, approvals, syndications, and analytics runs. It does not explicitly differentiate itself from the sibling action tools, but the resource and read operation are clear enough that an agent can distinguish it.
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 enumerated receipt types imply an audit/history use case, but there is no explicit guidance on when to use this tool versus siblings, nor any exclusions or prerequisites. The mention of verifying the chain hints at a purpose but does not route the agent between alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
syndicate_draftsA
Fan the approved draft out to per-platform DRAFTS via the fixture adapters (beehiiv/Ghost draft APIs-shaped; Substack gets a paste pack — read-only adapter, never a write). Requires the approval token and an un-invalidated approval hash. There is no publish path.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | ||
| platforms | No | ||
| approval_token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses the adapter targets, that Substack is a read-only paste pack and 'never a write', and that a valid approval hash is required. It omits what happens on an invalidated hash, whether re-running is idempotent or overwrites existing platform drafts, and any permission model.
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?
Front-loaded with the core action, then the fixture-adapter detail, then the hard constraint. Every clause carries information, though the parenthetical adapter aside is dense enough to slow parsing.
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 mutation tool with no annotations and no output schema, the description covers behavior and preconditions but leaves the platforms parameter, draft_id semantics, failure modes, and return shape undefined. An agent knows roughly what the tool does but not exactly what to pass or expect back.
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 0% across three parameters, so the description must compensate and largely does not: only approval_token is explained (approval hash requirement). draft_id and especially platforms (an untyped array — which platform identifiers are valid, whether omission means all platforms) get no meaning from either schema or description.
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 (fan out / syndicate) and resource (approved draft → per-platform drafts) and scopes it with 'there is no publish path'. It implicitly distinguishes itself from draft_create by requiring an already-approved draft, though it never names the sibling explicitly.
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 clear preconditions — requires the approval token and an un-invalidated approval hash — and an explicit exclusion ('There is no publish path'), which tells an agent not to look here for publishing. It does not name which sibling to use instead when approval is missing.
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.
6 tool updates
v0.1.0- First observed
analytics_report - First observed
draft_approve - First observed
draft_create - First observed
draft_preview - First observed
receipt_list - First observed
syndicate_drafts
TDQS
Scored across 6 tools
Each tool has a clearly distinct role in the draft lifecycle: creation, previewing, approval, syndication, analytics, and receipts. There is little risk of an agent confusing these operations because their boundaries are explicit, especially around approval and syndication requirements.
The set mixes naming conventions: draft_create/draft_preview/draft_approve use noun_verb with a shared draft_ prefix, syndicate_drafts uses verb_noun, and analytics_report/receipt_list use other noun-based patterns. All names are snake_case and readable, but the verb/noun order is not predictable across the set.
Six tools is well-scoped for a focused draft-to-syndication workflow with analytics and audit receipts. Each tool earns its place, and the set avoids unnecessary surface area.
The core lifecycle is covered: create/re-version, preview, approve, syndicate as platform drafts, report analytics, and verify receipts. Minor gaps remain, such as no explicit draft list/get or delete/archive operation, though re-creation handles versioning and publishing is intentionally excluded.
Maintenance
Related MCP Connectors
Draft, schedule, and analyze content for Substack, Medium, LinkedIn, X, Bluesky, and Threads.
Editorial tools for LinkedIn. Capture ideas, draft posts, build narrative arcs, manage a schedule.
Creation-first AI content engine: one brief in, finished content everywhere, in your brand voice.
Attestable memory, truth, provenance. Hybrid Ed25519 + ML-DSA-65 receipts; USDC settlement on Base.
Related MCP Servers
- AlicenseAqualityCmaintenanceCross-publishes a single markdown draft to 5 CMS platforms (dev.to, Hashnode, Ghost, WordPress, Medium) and 4 social networks (Bluesky, Mastodon, LinkedIn, X) from any MCP client, with built-in SEO scoring, schema.org JSON-LD, and canonical URL handling so cross-posts compound search rankings instead of competing.2931 npm5MIT
- AlicenseBqualityCmaintenanceEnables users to maintain append-only content history with verified publication and social follow-through outcomes, search for overlaps, and run read-only integrity verification of stored snapshots.16MIT
- AlicenseAqualityCmaintenanceEnables append-only revision projects with SHA-256-fingerprinted changes, style heuristics, human approval checkpoints, and draft-only WordPress export handoffs.9MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to manage a self-hosted content hub: create, edit, publish, and update articles across multiple platforms, plus AI writing and account management.2MIT