---
title: Changelog
description: Notable changes and additions to the Schedule & Chill API and MCP server.
published: 2026-06-07
updated: 2026-09-14
---

# Changelog

Notable changes to the public API and MCP server. Breaking changes will always be announced here first.

## 2026-09-14

- **The developer docs moved to `https://schedulenchill.com/help/developers`**, inside the Help Center. Every old `/docs` and `/developers` link redirects permanently (301) to the same page, `.md` copies included.

## 2026-09-01

- **The MCP server now speaks OAuth 2.1, at a second endpoint: `https://schedulenchill.com/mcp-oauth`.** Paste that URL into Claude, ChatGPT, Claude Desktop, Cursor, VS Code or Zapier as a custom connector and approve the consent screen — there is no API key to create, copy or store. It supports PKCE and dynamic client registration (RFC 7591), so a client configures itself from the URL alone. Tokens are scoped to `mcp:use`, issued per tool, and revocable individually.
- **`https://schedulenchill.com/mcp` is unchanged and is not going away.** Both endpoints expose exactly the same 22 tools, 4 resources and 2 prompts; only the authentication differs. Every existing API-key configuration keeps working.
- **ChatGPT connectors now work.** They authenticate with OAuth and have no field for a static bearer header, which is why the old bearer-only endpoint could not be used from ChatGPT. The docs previously said this was unsupported and on the roadmap; it has shipped.
- **Fixed: tools failed over OAuth.** Any tool that touched a relation — `get_accounts` among them — returned `Call to undefined method OAuthUser::socialAccounts()`. The Passport guard resolves an identity-only model that is swapped for the real user by middleware, but the swap only reached `Illuminate\Http\Request::user()`, while MCP tools resolve through the auth manager. The handshake succeeded and every tool call failed.
- **Fixed: a 401 from `/mcp-oauth` carried no `WWW-Authenticate` header.** RFC 9728 and the MCP authorization spec both require it, and strict clients use it to find the resource metadata. Without it a client could only report that the server does not support OAuth.

## 2026-08-07

- **Breaking (MCP `schedule_post`): timing is now an explicit, required `when`.** It takes `"draft"`, `"now"`, `"next_slot"`, or an ISO-8601 timestamp. Previously an **omitted** `scheduled_at` meant "publish immediately and irreversibly" — an absent parameter deciding to broadcast, on the surface driven by a model. Omitting both `when` and `scheduled_at` now returns `no_timing_specified` and publishes nothing. `scheduled_at` still works for **one more release** and is equivalent to passing that timestamp in `when` (ignored if `when` is also given; the response `warnings` say so). `when="draft"` creates a draft — no publish job is queued, and drafts do not count against the monthly post limit. `when="next_slot"` with no posting schedule returns `no_queue_slots` rather than falling through to publish-now. REST `POST /api/posts` is unchanged: it already required an explicit `publish_now` and defaulted to draft.
- **New MCP tool `get_queue_slots`** — read-only; returns the next open slots in your posting schedule as `{iso, label}`. Slots are computed, not reserved, so use it to show a human real options; use `when="next_slot"` when you want the server to pick at write time.
- **MCP `list_scheduled` renamed to `list_posts`**, with a new `status` filter (`scheduled` default, plus `draft`, `published`, `failed`, `all`) so agent-created drafts are findable. `list_scheduled` stays registered as a deprecated alias for one release and keeps its old scheduled-only behaviour.
- **LinkedIn post visibility** — `platform_options` for `linkedin` now accepts `visibility`: `PUBLIC` (default) or `CONNECTIONS`. Discoverable via `get_capabilities` / `GET /api/capabilities`.
- **Error envelopes rewritten for agents** — `plan_limit_reached`, `no_connected_accounts`, and `account_inactive` no longer end at "upgrade your plan" or "go to Settings", which a caller with no browser cannot do. Each now leads with an action the caller can take and carries structured recovery data: `alternatives[]` (healthy accounts with `health`), `resets_at`, `drafts_count_against_limit`, and `connect_url`/`reconnect_url`/`upgrade_url` for the human handoff.
- **Six new MCP tools bring the agent surface level with the dashboard** — `publish_now` (send a draft, scheduled or failed post immediately), `retry_post` (resend only the channels that failed, leaving published ones untouched), `duplicate_post` (copy content, channels and media into a new draft), `delete_post` (remove a post in any state), `restore_post` (undo a delete or cancel), and `get_analytics` (reach, impressions, likes/comments/shares, engagement rate, per-channel and per-platform breakdowns, daily timeline and top posts over a date window).
- **Removing a post is now reversible from an agent.** `cancel_post` and `delete_post` soft-delete, and `restore_post` brings the post back. `get_post` now also finds deleted posts, returning `deleted_at` and an `outcome` of `deleted` — previously a cancelled post vanished from every read surface. A post whose scheduled time has passed is restored as a **draft** rather than re-armed, so restoring never publishes anything by itself.
- **New error codes**: `post_not_publishable`, `post_not_retryable`, `post_not_deleted`.
- **A platform with no native options now returns `{}`, not a missing key** — on both `get_capabilities` and `GET /api/capabilities`. A missing key read as "unknown platform".
- **REST gets the same verbs**: `POST /api/posts/{id}/cancel`, `/publish-now`, `/retry`, `/duplicate`, `/restore`, plus `GET /api/analytics`. Each mirrors the MCP tool of the same name; a test asserts `GET /api/analytics` and `get_analytics` return identical payloads.
- **`DELETE /api/posts/{id}` on a scheduled post is no longer a dead end.** It told you to "cancel scheduled post before deleting" while no cancel endpoint existed, so a scheduled post could not be removed over REST at all. Cancel now exists. **Breaking:** that refusal changes from `422 {message}` to `409 {error: {code: 'post_not_cancelable', ...}}`, matching the error envelope every other endpoint uses.
- **State-conflict errors now return 409, not 422** — `post_not_cancelable`, `post_not_publishable`, `post_not_retryable`, `post_not_deleted`. The request body is fine; the post is in a state that does not allow the action.

## 2026-07-17

- **Per-account `publishing` status** — while a post publishes, each targeted account's `pivot.status` transitions `pending → publishing → published | failed`. `publishing` is transient (a channel is uploading/processing). The post's own `status` stays `scheduled` throughout publishing; poll until no account is `pending` or `publishing`, then treat a `published` post that still has a `failed` account as a **partial** publish. `partial` is derived, not a stored `status`.
- **New MCP tool `get_post`** — retrieve a single post by id with its post-level `status`, a derived `outcome` (`draft`/`scheduled`/`publishing`/`published`/`partial`/`failed`), and `per_account[]` delivery records (`status`, `error_message`, `platform_url`, `published_at`). Use it to poll a just-published post; `list_scheduled` now also includes per-account `status`, and `get_stats` reports a `publishing` count.

## 2026-06-07

- **Developer documentation launched** — REST API, MCP server, and reference.

## 2026-06

- **MCP server** available at `/mcp` with seven tools, three resources, and two prompts.
- **REST API**: Posts, Media, and API Keys resources with bearer-token authentication.
- **Platforms**: X, LinkedIn (profiles + Pages), Facebook, Instagram, Pinterest, YouTube, TikTok.

## Roadmap

- Outbound webhooks for publish/fail events.
- Per-key rate limits with `X-RateLimit-*` headers.
- Additional platforms: Threads, Bluesky, Google Business Profile.
- OpenAPI specification and official SDKs.
