{
  "serverInfo": {
    "name": "sprkly-mcp",
    "title": "Sprkly",
    "version": "1.0.0",
    "description": "Schedule and manage social media posts across Instagram, TikTok, YouTube, Threads and Facebook. Read the queue, draft and validate captions, schedule and reschedule posts, and route anything sensitive through human approval.",
    "websiteUrl": "https://sprkly.app"
  },
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://sprkly.app/api/mcp"
  },
  "protocolVersion": "2025-11-25",
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "auth": {
    "methods": [
      {
        "type": "oauth2",
        "description": "OAuth 2.1 with PKCE. Dynamic Client Registration and Client ID Metadata Documents are both supported.",
        "protectedResourceMetadata": "https://sprkly.app/.well-known/oauth-protected-resource/api/mcp",
        "authorizationServer": "https://sprkly.app",
        "scopesSupported": [
          "profile",
          "mcp:read",
          "mcp:write"
        ]
      },
      {
        "type": "bearer",
        "description": "A Sprkly API key (sk_live_…) sent as Authorization: Bearer. Create one in Settings."
      }
    ],
    "docsUrl": "https://sprkly.app/docs/mcp"
  },
  "tools": [
    {
      "name": "sprkly_delete_scheduled_post",
      "title": "Delete a scheduled post",
      "description": "Remove a post from the queue. This is a soft delete — the user can restore it from the Deleted tab for 30 days. Posts that have already published cannot be deleted this way. Always confirm with the user before calling.",
      "annotations": {
        "title": "Delete a scheduled post",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_draft_post",
      "title": "Draft a post",
      "description": "Compose a caption from a content hint and save it as a draft in Sprkly, shaped to the tightest caption limit among the target platforms. Returns a draft id; the draft appears under /drafts for the user to review.",
      "annotations": {
        "title": "Draft a post",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_get_account_summary",
      "title": "Get account summary",
      "description": "Plan tier, trial state, connected account count, scheduled post counts by status, and the next three upcoming posts. Never returns tokens or secrets.",
      "annotations": {
        "title": "Get account summary",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_get_billing_summary",
      "title": "Get billing summary",
      "description": "Subscription status, current plan, period end, purchased handles and the last few billing events. No payment method details; the Stripe customer id is truncated.",
      "annotations": {
        "title": "Get billing summary",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_get_post_approval_status",
      "title": "Get approval status",
      "description": "Whether a post is awaiting human review, approved or rejected, including reviewer notes and timestamps.",
      "annotations": {
        "title": "Get approval status",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_get_post_status",
      "title": "Get post status",
      "description": "Full detail for one post: status, targets, scheduled and published times, permalink, and the failure reason if it did not publish.",
      "annotations": {
        "title": "Get post status",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_list_connected_social_accounts",
      "title": "List connected accounts",
      "description": "Every social account linked to this Sprkly account: platform, handle, follower count, whether it is active, and whether it needs reconnecting. Never returns access tokens.",
      "annotations": {
        "title": "List connected accounts",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_list_profiles",
      "title": "List posting targets",
      "description": "The profile ids needed to target a post, with each one's platform and handle. Call this before sprkly_schedule_post.",
      "annotations": {
        "title": "List posting targets",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_list_scheduled_posts",
      "title": "List scheduled posts",
      "description": "The post queue, newest first, with a caption preview, targets, status and failure reason. Supports a status filter and cursor pagination.",
      "annotations": {
        "title": "List scheduled posts",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_request_post_approval",
      "title": "Request human approval",
      "description": "Submit a draft post for human review. Moves the post to pending_approval and returns an approval id to poll with sprkly_get_post_approval_status. Use this when the user wants a person to sign off before anything publishes.",
      "annotations": {
        "title": "Request human approval",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_schedule_post",
      "title": "Schedule a post",
      "description": "Queue a post for publishing. Runs the same quota, duplicate-content and platform pre-flight checks as the Sprkly app. Instagram and TikTok require media at submission time; YouTube requires a title. Confirm the date, time and target accounts with the user first.",
      "annotations": {
        "title": "Schedule a post",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "sprkly_update_scheduled_post",
      "title": "Reschedule or edit a post",
      "description": "Change the caption, publish time, target accounts or attached media on a post that has not published yet. Only posts with status \"scheduled\" can be edited.",
      "annotations": {
        "title": "Reschedule or edit a post",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sprkly_validate_post_policy",
      "title": "Validate against platform rules",
      "description": "Check a caption against each target platform's posting rules before scheduling: caption length, media requirements, hashtag ceilings, whether links are clickable, required YouTube titles, and PII or prohibited-content warnings. Pure analysis — writes nothing.",
      "annotations": {
        "title": "Validate against platform rules",
        "readOnlyHint": true,
        "openWorldHint": false
      }
    }
  ],
  "legacy": {
    "endpoint": "https://mcp.sprkly.app/mcp",
    "note": "Proxies to the endpoint above. Kept for agents configured before the server moved into the app."
  }
}