A1 Lane

MCP reference

Endpoint: https://a1lane.ai/mcp/v1 (Streamable HTTP, JSON-RPC over POST; protocol 2025-06-18; tool contract v1.3, 26 tools). Authorise with OAuth 2.0 (discovery at /.well-known/oauth-authorization-server, authorization-code + PKCE S256; clients identify themselves with a Client ID Metadata Document URL or register dynamically) or, for developers, a pasted workspace token. The stdio server (python -m postlane.mcp) exposes the same tools.

Every mutating tool accepts an optional idempotency_key: replaying a key returns the original result and executes nothing again; a key can never force past an uncertain outcome. The tool list, annotations and schemas below are frozen at v1.3; changes are announced on the changelog. Start with get_delivery_digest; per-assistant setup: Claude, ChatGPT, Grok.

Every tool validates its input strictly (additionalProperties: false): unknown fields are errors, never dropped. Errors are {code, reason, fix_hint}. Writes are draft-first; scheduling needs the publish scope; retries pass the same uncertain-probe and duplicate guards as every other surface. Per-token rate limit: 120 calls/minute.

ToolTitleAnnotationsDescription
list_accountsList connected accountsreadOnly, idempotent, openWorldConnected social accounts in this workspace with health state (ok / credential_invalid / action_required_in_app / unknown) and posting-slot schedules.
get_platform_schemaGet platform constraintsreadOnly, idempotent, openWorldMedia constraints, caption limits, per-destination options and disclosure fields per platform — call before composing to avoid validation errors.
upload_mediaImport media from a linkopenWorldIngest a video or image the user supplies (https URL) into the workspace library; returns the media id. No generation.
create_draftCreate a draft postopenWorldCreate a DRAFT (never queued). Schedule it with schedule_draft; the workspace's approval policy applies.
schedule_draftSchedule or queue a draftopenWorldQueue a draft now, at an instant, or into an account's next free slot. Needs the publish scope; a workspace that requires approval refuses until approved.
update_draft_settingsUpdate a draftopenWorldChange caption, destinations, options, schedule, parts, first comment or UTM on a post that has not started delivering. Edits after an approval reset the approval.
cancel_scheduledCancel a scheduled postdestructive, openWorldCancel before send = clean stop; a destination whose request may have landed becomes uncertain, never silently cancelled.
delete_draftDelete a draftdestructive, openWorldDelete a draft or finished post. Queued or scheduled posts must be cancelled first.
submit_batchSubmit a batch of draftsopenWorldCreate many posts in one call with per-item results; one bad item never sinks the batch. Items are drafts unless the token has publish scope and the item names a mode.
get_batch_statusGet batch statusreadOnly, idempotent, openWorldRoll-up for a batch: live / pending / parked per destination, fullyLive and done flags.
get_receiptGet a delivery receiptreadOnly, idempotent, openWorldFull receipt for one post: destinations, platform ids and URLs, flags, every checkpoint.
get_verification_statusGet verification statusreadOnly, idempotent, openWorldWhich destinations are verified live, still pending, awaiting a human finish, or parked as uncertain — for one post or across the workspace's active posts.
list_attention_itemsList attention itemsreadOnly, idempotent, openWorldThe needs-attention feed: failed, uncertain, awaiting human finish, held, blocked, flagged, approvals, unhealthy accounts.
resolve_attentionResolve an attention itemdestructive, openWorldprobe: run the read-back probe on an uncertain destination. retry: retry provably-failed destinations (uncertain is refused). release: release a same-asset hold. acknowledge_force_retry: after a probe, re-send an uncertain destination — requires acknowledge=true because a duplicate is possible. confirm_deleted: record that the user deleted the post in the platform's app, closing a delete_manual destination whose route has no read-back — requires destination_id and acknowledge=true; the delete is human-attested, never read-back verified.
create_handoff_packCreate a handoff packreadOnly, idempotent, openWorldFor destinations that end with a human finishing in the platform app: caption and every toggle to set, phone-sized.
request_approvalRequest approvalopenWorldSubmit a draft to the workspace's approvers (draft → pending_approval).
list_postsList postsreadOnly, idempotent, openWorldPosts with per-destination status. status filter: active | attention | published | draft | pending_approval | scheduled | failed | …
get_delivery_digestGet the delivery digestreadOnly, idempotent, openWorldStart here: what went out since a time (default the last 24 hours) with platform links — live counts published only, limited deliveries on their own line — plus what needs you, each with a link to the exact post.
create_upload_linkCreate an upload linkopenWorldA single-use link the user opens to drop ONE file into the library (phone or desktop). The link adds exactly one library item and can never post or publish. Poll get_upload_status, then create_draft with the media id.
get_upload_statusGet upload statusreadOnly, idempotent, openWorldState of an upload link: waiting / receiving (percent) / validating / ready (media id + per-platform fit) / rejected (code, reason, fix_hint) / expired / revoked.
pause_workspacePause or resume publishingidempotent, openWorldPause every new delivery in the workspace (or one account with account_id): queued posts are held, not failed. resume=true clears that pause. Needs the publish scope.
unpublish_postUnpublish a postdestructive, openWorldDelete a live post from its platforms (or one destination). Requires acknowledge=true. Ends deleted only when a read-back confirms it is gone; delete_uncertain is probed, never blindly re-deleted; delete_manual means the platform has no delete API and returns the in-app steps.
get_post_engagementGet post engagementreadOnly, idempotent, openWorldEngagement for one post, per destination: latest platform-reported views / likes / comments / shares, each with its as-of time, the pull pipeline state, and the series. Metrics a platform did not report are marked unavailable with the reason, never shown as zero. Engagement is the platform's number, not delivery truth — use get_receipt for delivery.
get_engagement_rollupGet engagement rollupreadOnly, idempotent, openWorldEngagement totals over a window (default 30 days, capped by the plan's history), per metric, platform and channel. Posts whose platform did not report a metric are excluded from that metric and counted with their reason — never zero-filled.
get_best_timesGet best times to postreadOnly, idempotent, openWorldBest weekday x hour slots for one channel, from that channel's own scored history (never other accounts, never a reschedule). Below the evidence threshold the answer is {enough: false, message: "Not enough data yet."} instead of a guess.
get_engagement_coverageGet engagement coveragereadOnly, idempotent, openWorldWhich engagement metrics each platform exposes, which are scope-gated, and the pull cadence — the same generated matrix as the public /docs/engagement page. Discord and Telegram expose none; X reads are off until the operator enables them (they bill per read).

R-42: a listing in an assistant directory is a listing of this connector. It is not an approval of your platform apps by YouTube, Meta, TikTok, X or LinkedIn.