Skip to content

Client work · AI infrastructure and social media operations · 2026

The same product. A new interface.

Building a safe, draft-first MCP layer that lets AI agents inspect Publer, reason over performance, plan campaigns and prepare publish-ready drafts.

Publer already had the system of record—the workspaces, accounts, content, analytics and API. Cadmus built the agent-facing layer around it: ten explicit tools, one brand resource, one reusable campaign prompt and two MCP transports, governed by a simple rule for the initial scope. AI may prepare the work; a person decides what gets published.

Cadmus14 min read
A classical scribe at a laptop pauses with a wax seal above three blank draft cards beside a brass instrument with ten radial nodes.
Ten tools prepare the work; a human decision remains between the draft and the public post.

Project

Client
Publer
Product
Publer Copilot / MCP prototype
Engagement
AI product strategy, UX, MCP architecture and full-stack engineering
Core scope
10 tools, 1 resource, 1 prompt, web chat and draft creation
Interfaces
Streamable HTTP, local stdio and first-party web chat
Safety model
Draft-first with human approval
  • Model Context Protocol
  • AI agents
  • SaaS integration
  • TypeScript
  • Social media

A protocol layer for real social media work.

An API exposes capability. An agent interface has to expose judgment: which operation should run, what information it needs, how its result is explained, and where the system must stop for a person.

Cadmus translated Publer’s workspace, content and analytics operations into a compact, typed agent contract. The result could inspect a workspace, retrieve recent performance, interpret posts and hashtags, identify useful publishing windows, generate a campaign plan and save the resulting content as drafts.

The same operations supported two product surfaces. External AI clients connected through MCP; a first-party SvelteKit chat used a provider-compatible function-tool loop. Publer remained the operational engine in both cases.

The project is best understood as a working agent-product MVP, not as evidence of autonomous publishing or measured business impact. Its value lies in the boundaries it made explicit: schemas, permissions, progress, fallbacks and human approval.

01 Context

Social media software already has the data. Agents need a contract for acting on it.

Publer brings accounts, drafts, scheduled content, media and analytics into one operating environment. Its API makes those capabilities programmable. But a conversational request such as “What worked recently, and turn that into next week’s campaign” is not a single endpoint call.

The request crosses context, analysis, planning and execution. It must select a workspace, identify the right accounts, retrieve enough history, handle partial insight data, distinguish evidence from inference, propose a plan and create content in the correct state.

That is the gap MCP can close. Not by replacing Publer, but by giving AI clients a governed language for using it.

The API remained the engine. MCP became the contract.

02 Public trail

Publer had already named the interface shift in public.

The product question did not appear in isolation. In March 2026, a Publer engineer described operating an account through Claude Code using natural language and reduced the idea to four words: “Same API. Different interface.”

In May, Publer’s founder challenged students at the Canadian Institute of Technology to build an MCP server for Publer in 24 hours. By August, Publer’s help center documented an official MCP beta for eligible customers and multiple AI clients.

This timeline provides context for the interface shift. The Cadmus engagement described here is the Copilot MVP; Publer’s current MCP beta is documented separately in its help center.

Publer’s AI and Automations settings, with the MCP connection entry highlighted.
The MCP connection entry in Publer’s public setup guide. This documents the current product context; it is not a screenshot of the separate Copilot MVP. Image: Publer Help Center, accessed 10 October 2026. Publer setup guide
03 The challenge

Make an agent useful without making it reckless.

A useful social media agent needs broad context. It should understand the workspace, recent posts, account performance, hashtags, publishing windows and the campaign brief. A safe social media agent needs narrow authority. It should not guess identifiers, invent metrics, hide failed requests or publish content merely because a model produced it.

The design problem was therefore not “How many API endpoints can we wrap?” It was “What is the smallest set of operations an agent needs to complete a valuable workflow, and what must each operation guarantee?”

The initial scope answered with ten tools and a deliberate stop at drafts. The agent could research, interpret, plan and prepare. Human review remained between preparation and publication.

Condition and product response

Operational condition A natural-language request omits workspace and account identifiers.System response Expose explicit workspace and account discovery tools before analysis or creation.
Operational condition Analytics may be incomplete or unavailable for a post.System response Fail soft to recent-post data, explain the limitation and never invent missing metrics.
Operational condition Campaign creation can involve several slow API operations.System response Expose asynchronous job status and progress instead of leaving the client apparently frozen.
Operational condition Model output is probabilistic while publishing has public consequences.System response Default all created posts to draft and keep the approval step outside the model.
Operational condition Different AI clients speak different integration dialects.System response Keep business operations transport-independent and adapt them to MCP and first-party function tools.
04 Product strategy

Organize the work as Read, Reason, Draft.

We reduced the full campaign workflow to three legible stages. Read establishes the operating context and evidence. Reason turns that evidence and a brief into recommendations. Draft writes the approved plan back into Publer without making it public.

This sequence created a mental model for users, a tool taxonomy for the model and a test boundary for engineers. Each stage could be inspected independently, while the campaign prompt could compose the stages into a single guided flow.

The sequence also made failure easier to communicate. If analytics were incomplete, the plan could say so. If draft creation became an asynchronous Publer job, the interface could report progress. If no model provider was available, a deterministic fallback could still demonstrate the workflow.

Read, Reason, Draft

3 stages, one continuous service.

  1. 01

    Read

    Find the workspace, accounts, posts, insights, hashtags and publishing windows.

    What is true right now?

  2. 02

    Reason

    Interpret recent performance and turn a campaign brief into a structured plan.

    What should we do next, and why?

  3. 03

    Draft

    Create reviewable Publer drafts and expose the job state until they are ready.

    What is prepared for approval?

05 Agent contract

Ten tools, each with one accountable job.

The MCP surface was intentionally compact. Instead of mirroring every low-level API operation, it exposed the decisions an agent actually needs to make. Discovery tools establish scope. Evidence tools retrieve performance. Synthesis tools produce recommendations. The write path creates drafts and reports job state.

Typed inputs make missing context visible before a request reaches Publer. Normalized outputs reduce provider-specific payload noise. Tool descriptions tell the model when to call an operation and what not to infer from its result.

The result is less like a remote control with every button exposed and more like an operating contract: a small vocabulary whose boundaries can be reviewed by product, engineering and security together.

The ten-tool contract

The Publer API remains the engine. These operations are the agent contract around it.

Context

Establish the workspace and connected accounts.

  • list_publer_workspaces
  • list_publer_accounts

Evidence

Retrieve recent content, post performance, hashtag performance and useful publishing windows.

  • get_recent_posts
  • get_post_insights
  • get_hashtag_insights
  • get_best_times_to_post

Interpretation

Turn evidence into a readable performance audit and a campaign plan.

  • analyze_recent_performance
  • generate_campaign_plan

Action

Create reviewable drafts and follow asynchronous work to completion.

  • create_publer_drafts
  • get_publer_job_status

Supporting primitives

  • Resource

    publer-copilot://brand/voice

    Give the agent a stable, mergeable brand-voice context without repeating it in every prompt.

  • Prompt

    campaign_from_brief

    Compose performance, best times, hashtags, planning and draft creation into a reusable guided workflow.

06 Read

Give the model context before asking it for judgment.

Agent errors often begin before generation. A request runs against the wrong workspace, a display name is mistaken for an identifier, a page of posts is treated as the complete history, or a raw provider response consumes context without improving the answer.

The Publer client contained those risks behind one boundary. It owned authentication, workspace headers, pagination, timeouts, error parsing and normalized responses. Higher-level services received a stable product model rather than learning Publer’s transport details independently.

That structure let the agent build evidence in order: discover the workspace, identify the accounts, retrieve recent posts, request the available insights and state what could not be known.

Live context instructed the model not to invent metrics. Missing evidence stayed missing.

07 Reason

Turn analytics into a recommendation that can be audited.

Raw metrics do not make a campaign. The analytics layer converted recent post and insight data into a stable summary: what appeared to perform, which formats or themes deserved attention, where the evidence was thin and what an operator could test next.

The campaign service then combined that summary with the brief, brand voice, hashtag evidence and useful publishing windows. Its output was structured enough to preview, edit and pass to draft creation, rather than appearing only as a persuasive paragraph in chat.

A deterministic path could complete the same high-level sequence if the model provider was unavailable. That fallback was not meant to imitate sophisticated creative judgment. It kept the product demonstrable and the system honest about which layer had failed.

Fields a performance-to-campaign audit had to expose

  • evidence window
  • accounts considered
  • observed patterns
  • limitations
  • recommendations
  • campaign objective
  • content themes
  • draft schedule
08 Draft

Treat publishing as a boundary, not a convenience.

The most consequential design decision was also the simplest: content created by the Cadmus implementation entered Publer as a draft. The model could prepare a multi-post campaign, but the public act of publishing remained a separate human decision.

Draft creation still had operational complexity. Platform aliases had to be normalized, media could require upload, and Publer could return an asynchronous job rather than a finished record. The client polled that job with a bounded timeout and reported progress back to the MCP client.

This made waiting visible and authority explicit. The user could see that work was still happening, inspect the resulting drafts in Publer and use Publer’s existing review and scheduling environment for the final step.

Human approval gate

Publer’s August 2026 public beta documentation describes broader scoped capabilities, including scheduling and publishing. That is current Publer product context, not the behavior of this draft-first Cadmus MVP.

  1. 01

    AI agent

    Prepares a campaign and requests draft creation.

  2. 02

    Publer Copilot

    Validates inputs, creates drafts and reports job progress.

  3. 03

    Human operator

    Reviews account, copy, media, timing and platform options.

  4. 04

    Publer

    Handles the approved scheduling or publishing workflow.

Asynchronous job states the client could report

  • requested
  • queued
  • processing
  • completed
  • error or timeout
09 Architecture

One operating layer, two agent surfaces.

The project exposed a standards-compliant MCP server for external clients and a first-party web chat for direct product use. Those surfaces needed different protocols, but they needed the same business behavior.

A dedicated Publer client handled the external API. Analytics and campaign services expressed product logic above it. The MCP server registered tools, the brand resource and the campaign prompt over Streamable HTTP or local stdio. The web API adapted the same operations into provider-compatible function tools for the chat loop.

The implementation proved the reuse pattern, while also revealing the next architectural step: move every operation into a shared application-command layer so MCP, REST and the internal tool adapter cannot drift as the product grows.

Dual-surface architecture

External clients and first-party chat converge on the same operations, then on Publer.

  1. L1

    External AI clients

    Claude, ChatGPT, Cursor or another MCP client

    MCP over Streamable HTTP or stdio

  2. L2

    First-party web chat

    SvelteKit conversational UI

    REST and provider-compatible function tools

  3. L3

    Application operations

    workspace, analytics, campaign and draft commands

    typed services and normalized models

  4. L4

    Publer boundary

    auth, pagination, media, jobs and error handling

    Publer API

MCP transports

  • Streamable HTTP

    Client context
    Remote MCP-compatible clients connecting to a hosted server.
    Session
    HTTP session with progress reporting for slow operations.
    Use
    The path for Claude, ChatGPT, Cursor and similar external clients.
  • stdio

    Client context
    A local process started by an MCP host on the same machine.
    Session
    Standard input and output for a single local session.
    Use
    Development, inspection and local tooling without a public endpoint.

Implementation stack

  • TypeScript ESM monorepo
  • Hono API
  • SvelteKit 5 web application
  • official MCP TypeScript SDK
  • Zod schemas
  • optional persistence
  • provider-compatible model tool loop
  • Vitest with injected dependencies
  • Docker and Railway deployment configuration
10 Product experience

Make tool use legible without turning chat into a terminal.

A conversational surface can hide too much. The user sees a polished answer while workspace selection, data retrieval, failures and write operations disappear behind a typing indicator. Publer Copilot made the important work visible through context controls, tool progress, campaign previews and draft status.

The web experience organized chat history and workspace context around a primary conversation. Structured campaign output could appear as a reviewable object rather than a wall of prose. Responsive drawers kept the same context available on smaller screens without forcing a desktop control panel into a phone.

The interface used chat for intent and explanation, then switched to cards, lists and statuses when structure mattered. That distinction is essential in agent products: conversation starts the work; product UI makes the work accountable.

Experience principles

  • Show the active context

    Keep the workspace and account in view so the reader knows what the agent is operating on.

  • Name the operation

    Describe the work being performed in human language, not only as a tool identifier.

  • Expose progress

    Make slow or multi-step work visible instead of hiding it behind a typing indicator.

  • Render structure as objects

    Plans and drafts appear as reviewable cards and lists when structure matters more than prose.

  • Separate evidence from recommendation

    Keep what was observed visually distinct from what the system suggests next.

  • Do not hide fallbacks

    Never present a partial result or deterministic fallback as confident synthesis.

11 Reliability

Degrade by layer, not by illusion.

The MVP was designed to remain understandable when an optional dependency failed. If detailed insights were unavailable, analytics could fall back to recent posts and attach a limitation note. If the model provider failed, a deterministic campaign path could still exercise the product flow. If persistence was unavailable, the core request could continue without pretending the save succeeded.

Timeouts bounded external calls. Job polling had a clear interval and deadline. Dependency injection made client and service behavior testable without live Publer calls. Tool telemetry was best-effort rather than a new reason for the user’s task to fail.

This is not the same as claiming nothing can go wrong. It is a design for honest failure: preserve useful work where possible, identify the missing layer and never fill an evidence gap with invented certainty.

Fallback behaviour

Dependency Detailed post insightsFallback Use recent post data with an explicit limitation note.What the user is told The summary is based on available post data; detailed insights were not returned.
Dependency Model providerFallback Run the deterministic performance-to-campaign workflow.What the user is told A rules-based campaign draft was prepared; model synthesis was unavailable.
Dependency Optional persistenceFallback Complete the live operation and report that history was not saved.What the user is told The current result is available, but conversation persistence is temporarily unavailable.
Dependency Asynchronous Publer jobFallback Poll with progress until success, error or bounded timeout.What the user is told Draft creation is still running in Publer; current job status is shown.
12 Outcome

A working blueprint for agent-operable social media software.

The project produced a complete working path from workspace discovery to campaign drafts. It made Publer’s existing operations available through a standards-based agent interface and a first-party conversational product, without asking the model to become the system of record.

Ten tools gave the model a compact operating vocabulary. Typed schemas and normalized results contained the API boundary. Progress made asynchronous work visible. Fallbacks preserved the workflow when optional layers failed. Draft-first behavior kept public consequences under human review.

Publer’s help center now documents an official MCP beta for eligible customers and multiple AI clients. That direction shows the relevance of the interface problem. The engagement described here covers the Cadmus Copilot prototype; the current beta is a separate Publer product release.

Delivered capabilities

  • A compact agent contract

    Ten explicit operations cover the core read, reason and draft workflow without mirroring the entire API.

  • Two usable interfaces

    External MCP clients and a first-party web chat can reach the same product operations.

  • Human control at the write boundary

    The MVP prepares Publer drafts and leaves publication to the existing review workflow.

  • Failure made legible

    Fallbacks, progress and limitation notes preserve useful work without inventing certainty.

  • A clear hardening path

    The prototype identifies the shared command layer, session model, permission model and observability needed for the next stage.

These are delivered capabilities and structural outcomes, not quantified business or adoption claims.

13 What the work reinforced

The most important agent feature is a boundary.

MCP makes software callable by models. It does not decide which calls are appropriate, what evidence is sufficient or when a person should take over. Those are product decisions expressed through schemas, tool descriptions, permissions, defaults and interface feedback.

Publer Copilot reinforced a principle central to Cadmus’s agent work: the strongest integration does not make the underlying product disappear. It keeps the system of record visible, preserves its rules and gives people a clearer way to direct it.

The protocol creates reach. The boundary creates trust.

“An agent becomes useful when it can act. It becomes trustworthy when the product is explicit about where that action stops.”

Scope and credits

  • AI product strategy
  • MCP and API architecture
  • tool and schema design
  • conversational UX
  • full-stack engineering
  • testing and deployment design

Designed and engineered by Cadmus for Publer.

Publer and its marks belong to their respective owner. The public LinkedIn sources linked on this page are context for Publer’s MCP direction; they are not testimonials for Cadmus.