Everything shipped under “api”, across every version, newest first.
Added
The calendar opens on a new All view that shows each post with its platform icons. Posts that another tool publishes for you (Riverside, Typefully and others) can be added through the API or MCP as read-only records, so the calendar shows your whole plan. NoteSurge never publishes those posts itself; you can only tag, pin or delete them.
Added
The API and MCP can now find the next free posting slot, attach an image or video from a URL, and read a published note’s engagement. Rate limits are now per key scope (60 requests a minute for full and draft-only keys, 120 for read-only) and every response carries X-RateLimit headers. SDK 0.3.0 can list, create and delete scheduled tasks.
Added
Select notes in Queue or Drafts to tag, untag, pin, unpin or plan them in one go, and Compose has a Plan panel. Planned notes never publish on their own. The public API now covers drafts, tags, queue scheduling, media and comments, with an OpenAPI document and SDK 0.2.0.
Added
AI apps that support remote MCP can now connect to NoteSurge by signing in and approving access, with no token to copy. Tokens can be limited to analytics, one area or one platform, can expire, and Settings lists the apps you have authorized with a Disconnect button. MCP clients also get NoteSurge resources and prompts, and every API capability is now available over MCP.
Added
A typed JavaScript client covers notes, scheduling, the Library and analytics. The public API gains top posts and best times. Agencies can create a separate workspace for each client, each with its own connections, queue and Library and its own people and roles, and set a brand name, logo and color that clients see on review pages, invite emails and in the app.
Added
Your queue times are now saved to your account instead of one browser, so Compose, Rebalance, the API and MCP all use the same slots, and slots you had saved in a browser move over once. Notes can be tagged and filtered by tag, searched by text, and pinned to the top of Drafts. A scratchpad sits in the Drafts tab, and a Planned note keeps a date without ever posting by itself until you schedule it.
Added
MIT-E: the public content feed (api/content-feed/[token]/feed) now renders in three formats selected by URL extension — /feed.xml (RSS 2.0, unchanged), /feed.atom (Atom 1.0), and /feed.json (JSON Feed 1.1). RSS delegates to the existing X5 renderer (output pinned by tests); Atom and JSON use the MIT-licensed `feed` library. All three reuse the shared description cleaner and token plumbing from the X5 seam.
Added
The /docs/api reference page gains an "Agent tools" section that renders every api-bound capability — starting with the three cronjob management endpoints (GET/POST /v1/cronjobs, DELETE /v1/cronjobs/{id}) that were previously silently dropped because the page only split endpoints into Notes and Library groups. A drift-lock test now asserts every apiEndpointRows() result is claimed by exactly one rendered group, so future non-content endpoints are documented the day they register.
Fixed
The Composer "Add to queue" on an existing note sent body.slots but the PATCH route ignored them, leaving the note frozen at its stale draft-creation time. Now mirrors scheduleNoteCore: when body.slots is present and no explicit body.publishAt, resolves via nextFreeSlot (#767, PR #770).
Fixed
The reports log was created at process umask (often 0o644 → not group-writable → cross-uid write failures recur). Now calls chmod after creation (#768, PR #770).
Fixed
The marketplace install route forwards the inbound session cookie on its internal /api/skills fetch; previously the cookie-less sub-request hit a 401 and every install surfaced as a 502 (#495). Drive/Dropbox re-import is also idempotent again — the pre-fetch check queries metadata->>fileId instead of externalId, which held the sha-256 (#569).
Fixed
The /api/workflow-canvas/[id] GET endpoint validated the canvas id against the UUID format before hitting the database; a non-UUID value previously made Postgres throw an "invalid input syntax for type uuid" error and surface as a 500. It now answers with an honest 404 instead.
Added
Creators can publish a skill from their workspace to a curated marketplace directory, where other users can browse approved entries and install them with one click via the same SKILL.md import path. Submissions start as pending and require admin approval before appearing in the public directory. Free directory in v1 — no payments, paid listings may come later.
Added
The Telegram agent no longer only replies to you — it can push messages to your chat on its own and react to your latest message with an emoji (or retract one). message.send sends a proactive note to your own chat (e.g. "digest queued" or "clip render finished") via the agent's Telegram connection; message.react attaches a single emoji reaction to your most recent message (or a specific one by id) via Telegram's setMessageReaction. Both are registry capabilities (message.send / message.react) exposed through the MCP adapter and the telegram-agent TOOL_EXECUTORS, gated on canWrite like other draft-tier tools, and blocked for sub-agents so a detached agent can never message you. The not-connected case returns an honest refusal instead of throwing. Ported from Hermes' MIT send_message_tool.py and react_to_message_tool.py.
Added
NoteSurge is now automatable from Zapier: five webhook triggers (note scheduled / published / failed / library added / feed updated) and two API actions, all HMAC-signed and managed alongside API keys in Settings. A brand-new workspace content feed (per-workspace RSS 2.0 URL, bearer-token protected) gives Zapier/n8n/Make a single poll-any-publishing contract.
Fixed
Uploading a video or large file to the Library used to die at the serverless function body cap (~4.5MB) with a bare 413 Request Failed. Files over 4MB now stream directly from the browser to Vercel Blob via a presigned PUT URL, completely bypassing our function body limit. The upload-url route was also routed through the media-storage seam instead of importing the Blob SDK directly, closing a structural violation of the one-seam rule. Smaller uploads keep taking the cheap multipart path.
Added
NoteSurge could already expose an MCP server for agents like Claude Desktop to consume. Now the flip side: Notey itself can connect to any external MCP server, discover what tools it offers, and call one. The stateless client handles Streamable-HTTP JSON-RPC 2.0 (bare JSON or SSE framing), validates URLs before any network hit, and surfaces server-side tool failures honestly — never collapsing errors into fake success. Both capabilities are registry-tied: mcp.tools is a read-tier discovery, mcp.call is a write-class draft gated on canWrite.
Fixed
A routing regression sent signed-out visitors to login when reading the capability pages; both paths are properly public again.
Added
Three engines that already power the app were invisible to outside callers. They’re now registered capabilities with stable names: get_repurpose_suggestions returns the one ranked “what should I repurpose” answer; get_note_stats pulls back measured engagement per note — Substack restacks and reactions, Bluesky likes and reposts, X likes, reposts and impressions — and says “nothing measured yet” instead of faking zeros; fan_out_piece turns one strong piece into platform-native draft variants that wait for per-child human approval. Everything passes the same token scopes and live role checks as the rest, and the AI tab’s tool list now renders straight from the server so it can’t silently drift out of date again.
Added
An MCP token used to be all-or-nothing: connect Claude Desktop or any other agent and it could do everything your connection allows, with no way to hand one client read-only access. Every token now carries tier checkboxes — Read (list notes, account status, best times), Draft (save drafts, library writes, repurpose), Publish (schedule real publishing) — and every call is checked against those tiers at a single gate before anything runs. A token without Publish checked can never schedule real publishing, no matter how it's prompted.
Added
Connecting a tool or an AI agent used to mean reading code or guessing tool names. Now there's one machine-readable answer: open /api/capabilities in a browser, or ask the new discover_capabilities tool over MCP. Every capability lists what it does, what permission tier it needs, and exactly how to reach it — endpoint, method, or tool name.
Nothing to configure: existing API keys and MCP tokens work unchanged, and the same list powers both surfaces, so what the catalog says is what the tools actually accept.
Added
The MCP & API section now lists every tool an agent gets once you connect one -- what each one does, and whether scheduling is locked until you turn on "Allow agents to schedule/publish."
A new get_account_status tool also lets an agent check what's actually connected before trying to draft or schedule anything, instead of finding out by trial and error.
Added
You can issue a draft-only API key now instead of a full-access one. It can create and list content, but any call that tries to actually schedule something gets rejected outright.
Handy for a client’s Zapier account, or a teammate’s own script, where you want them building things without being able to accidentally publish.
Added
Register a URL and NoteSurge will hit it with a POST the moment a note is scheduled, published, or fails. It’s the same primitive Zapier, n8n, and Make automations run on.
Added
You can create, list, and delete notes and library pieces from outside NoteSurge now, using an API key you generate from Settings.
Full curl examples live at /docs/api, and that page doesn’t require a login to read.
Added
Any MCP-compatible AI agent, Claude included, can talk to NoteSurge directly now. Three tools: list your notes, draft one (always safe, it never auto-publishes), or schedule one, but only if you’ve turned on publish access for that specific token.