Use SelfScale from your AI assistant
Connect Claude, Cursor, VS Code and other AI tools to SelfScale, so they can read your voice, brand, analytics, competitors, trends and drafts while you work.
On this page
What it is
MCP (the Model Context Protocol) is the standard way AI assistants connect to other apps. Once you add SelfScale, you can ask your assistant things like “what did my best LinkedIn posts this month have in common?” or “which of my competitors had a breakout video this week?” and it answers from your real SelfScale data.
It works with any MCP client that can send a header with your key, including Claude Code, Claude Desktop, Cursor and VS Code. Every tool is read-only: it looks things up and never posts, edits, deletes or spends credits.
| Server URL | https://selfscale.app/api/mcp |
| Transport | Streamable HTTP |
| Auth | Personal API key: Authorization: Bearer ss_live_... |
Which plans include it
The MCP server comes with Premium and Power.
| Plan | MCP calls per day |
|---|---|
| Standard | Not included |
| Premium | 25 calls per day |
| Power | 25 calls per day |
| Pro (existing subscribers) | 5 calls per day |
First-cohort members get the Premium allowance. Change your plan in Settings › Billing.
Create a key
- Open SelfScale and go to Settings › Developer.
- Create a key, give it a name you'll recognize, like “Claude on my laptop”, and choose when it expires: 30 days, 90 days (the default) or a year.
- Copy the key. It starts with
ss_live_and is shown only once. If you lose it, revoke it and create a new one.
You can have up to 5 active keys. Use a separate key for each app or computer, so you can revoke one without breaking the others.
Set up your client
In each snippet, replace ss_live_your_key_here with your key, or set it in an environment variable where the client supports one.
Claude Code
Run this in your terminal:
claude mcp add --transport http selfscale https://selfscale.app/api/mcp \
--header "Authorization: Bearer ss_live_your_key_here"Add --scope user to use SelfScale in every project, not just the current one. Then run /mcp inside Claude Code to check it's connected. To share the setup with a project without committing your key, put this in .mcp.json and set SELFSCALE_API_KEY in your shell:
{
"mcpServers": {
"selfscale": {
"type": "http",
"url": "https://selfscale.app/api/mcp",
"headers": {
"Authorization": "Bearer ${SELFSCALE_API_KEY}"
}
}
}
}Claude Desktop
Go to Settings › Connectors › Add custom connector and enter the server URL. If the dialog shows a Request headers section, add Authorization with the value Bearer followed by your key. Anthropic is still rolling that section out, so not every account has it yet.
If you don't see it, connect through the mcp-remote bridge instead (needs Node.js). Open Settings › Developer › Edit Config and add:
{
"mcpServers": {
"selfscale": {
"command": "npx",
"args": [
"mcp-remote",
"https://selfscale.app/api/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer ss_live_your_key_here"
}
}
}
}Keep the key in env as shown: some systems split arguments at spaces. Restart Claude Desktop afterwards.
Cursor
Add this to ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project), and set SELFSCALE_API_KEY in your environment:
{
"mcpServers": {
"selfscale": {
"url": "https://selfscale.app/api/mcp",
"headers": {
"Authorization": "Bearer ${env:SELFSCALE_API_KEY}"
}
}
}
}VS Code
Add this to .vscode/mcp.json in your workspace, or run MCP: Open User Configuration to add it for every workspace. VS Code asks for the key the first time the server starts and stores it securely.
{
"inputs": [
{
"type": "promptString",
"id": "selfscale-key",
"description": "SelfScale API key",
"password": true
}
],
"servers": {
"selfscale": {
"type": "http",
"url": "https://selfscale.app/api/mcp",
"headers": {
"Authorization": "Bearer ${input:selfscale-key}"
}
}
}
}ChatGPT
ChatGPT connects to MCP servers through developer mode, which is in beta for some plans. Its connector form signs in with OAuth and has no field for a personal key, so SelfScale can't be added to ChatGPT yet. It will work once sign-in arrives (see Coming soon).
Other clients
Any MCP client that supports Streamable HTTP and custom headers works: point it at https://selfscale.app/api/mcp and send Authorization: Bearer with your key. To call the server from your own code, see the API docs.
Tools reference
Every tool below is read-only and costs no credits. Your assistant picks the right tool from your question, so you rarely need to name one. Tools that call AI or use credits aren't available with a personal key.
Your SelfScale workspace
Read what SelfScale knows about you: your voice, your brand, your numbers, your competitors, trends and drafts.
get_voice_profileRead-onlyGet my voice profile
Your SelfScale voice profile: the rules your writing follows, your signature phrases, words you avoid, and your tone settings. Use it to write in your voice.
No arguments.
Try asking: “Read my SelfScale voice profile, then rewrite this intro so it sounds like me.”
Example response
{
"success": true,
"hasProfile": true,
"profile": {
"name": "My voice",
"active": true,
"version": 3,
"updatedAt": "2026-10-02T12:00:00.000Z"
},
"voice": {
"learned": true,
"rules": [
"Short sentences.",
"Open with a concrete number."
],
"signaturePhrases": [
"Here's the thing"
],
"avoidedWords": [
"leverage",
"synergy"
]
},
"tone": {
"...": "your tone settings"
},
"toneOmitted": false
}get_brand_kitRead-onlyGet my brand kit
Your SelfScale brand kit: your brand rules, words you never say, who you sound like, your fonts and your visual styles.
Needs the Brand & Business page to be available on your account.
No arguments.
Try asking: “Check this caption against my brand kit and flag anything off-brand.”
Example response
{
"success": true,
"hasKit": true,
"profileName": "My voice",
"rules": [
"Always plain English."
],
"neverSay": [
"game-changer"
],
"soundsLike": [
"A friendly operator, not a guru."
],
"typography": {
"...": "your fonts"
},
"visualStyles": [
{
"title": "Clean desk",
"body": "..."
}
],
"updatedAt": "2026-10-01T09:00:00.000Z"
}get_channel_analyticsRead-onlyGet my channel analytics
Your channel analytics from SelfScale: connection status, post count and totals (likes, comments, shares, views) for the last 30 days, and your latest follower count, per channel.
Needs Full Analytics on your plan.
| Argument | Type | Required | Description |
|---|---|---|---|
channel | "linkedin" | "x" | "instagram" | "threads" | "tiktok" | "skool" | No | One channel. Leave out for every channel. |
Try asking: “How are my channels doing this month?”
Example response
{
"success": true,
"channels": [
{
"channel": "linkedin",
"connection": {
"connected": true,
"account": "yourhandle",
"via": "oauth",
"expiresAt": "2026-12-01T00:00:00.000Z"
},
"stats": {
"windowDays": 30,
"posts": 12,
"truncated": false,
"likes": 840,
"comments": 96,
"shares": 41,
"views": 21500,
"followers": 4210,
"countCapturedAt": "2026-10-09T06:00:00.000Z"
}
}
]
}list_top_postsRead-onlyList my top posts
Your best-performing posts from SelfScale's stored analytics, ranked by engagement, views, likes or comments over the period you choose.
Needs Full Analytics on your plan.
| Argument | Type | Required | Description |
|---|---|---|---|
channel | string | No | One channel (linkedin, x, instagram, threads, tiktok, skool). Leave out for every channel. |
days | integer 1-90 | No | How many days back to look (default 30) |
sortBy | "engagement" | "views" | "likes" | "comments" | No | engagement is likes + comments + shares (default) |
limit | integer 1-20 | No | How many posts to return (default 10) |
Try asking: “What were my five best posts by views in the last 90 days, and what do they have in common?”
Example response
{
"success": true,
"days": 90,
"sortBy": "views",
"scanned": 64,
"posts": [
{
"channel": "linkedin",
"title": "...",
"url": "https://...",
"publishedAt": "2026-09-14T15:00:00.000Z",
"contentType": "text",
"likes": 410,
"comments": 52,
"shares": 19,
"views": 18200,
"score": 18200
}
]
}list_competitorsRead-onlyList my competitors
The creators you track on SelfScale's Competitors page, with their follower counts, last upload and best recent video. Numbers are stored observations; nothing is estimated.
Lists the creators you follow on the Competitors page, up to 50. A creator you just followed appears after you open that page once.
| Argument | Type | Required | Description |
|---|---|---|---|
list | "competitor" | "adjacent" | "all" | No | competitor (default), adjacent (near your niche) or all |
Try asking: “Who am I tracking, and who posted most recently?”
Example response
{
"success": true,
"updatedAt": "2026-10-10T08:00:00.000Z",
"total": 6,
"creators": [
{
"name": "Creator name",
"platform": "youtube",
"list": "competitor",
"profileUrl": "https://www.youtube.com/@...",
"pinned": false,
"followers": 182000,
"followersHidden": false,
"followersRounded": true,
"niche": "...",
"statsStatus": "ok",
"lastUploadAt": "2026-10-08T17:00:00.000Z",
"checkedAt": "2026-10-10T08:00:00.000Z",
"tracked": null,
"best": {
"title": "...",
"url": "https://...",
"publishedAt": "...",
"isShort": false,
"views": 410000,
"likes": 12000,
"comments": 800,
"multiplier": 3.4
}
}
]
}get_competitor_outliersRead-onlyGet competitor outliers
Recent videos (the last two weeks) from the creators you track that beat that creator's normal views, ranked by how many times their median views they got.
| Argument | Type | Required | Description |
|---|---|---|---|
minMultiplier | number 1.5-50 | No | Only videos with at least this many times the channel's normal views (default 2) |
limit | integer 1-20 | No | How many outliers to return (default 10) |
Try asking: “Which competitor videos broke out recently, and what hooks did they use?”
Example response
{
"success": true,
"windowDays": 14,
"minMultiplier": 3,
"updatedAt": "2026-10-10T08:00:00.000Z",
"outliers": [
{
"creator": "Creator name",
"list": "competitor",
"title": "...",
"url": "https://...",
"publishedAt": "...",
"isShort": true,
"views": 920000,
"likes": 41000,
"comments": 1300,
"multiplier": 6.1,
"baselineMedian": 151000,
"baselineSize": 20
}
]
}get_trendsRead-onlyGet trending content
Trending posts from SelfScale's trend feed (LinkedIn, YouTube, TikTok, Instagram, X) with their metrics, hook type and why they work. If nothing is new in the window you asked for, the freshest items come back marked stale.
| Argument | Type | Required | Description |
|---|---|---|---|
platforms | array of "linkedin" | "youtube" | "tiktok" | "instagram" | "twitter" | No | Only these platforms (default all) |
hoursBack | integer 1-1440 | No | How many hours back to look (default 168, one week) |
limit | integer 1-20 | No | How many items to return (default 10) |
Try asking: “What's trending on LinkedIn this week that fits my niche?”
Example response
{
"success": true,
"hoursBack": 168,
"stale": false,
"newestItemAt": "2026-10-10T07:40:00.000Z",
"items": [
{
"platform": "linkedin",
"text": "...",
"truncated": false,
"metrics": {
"...": "likes, comments, shares"
},
"url": "https://...",
"author": "...",
"hookType": "contrarian",
"whyItWorks": "...",
"createdAt": "2026-10-09T12:00:00.000Z"
}
]
}list_draftsRead-onlyList my drafts
Your saved SelfScale posts and drafts, newest first, optionally filtered by status.
| Argument | Type | Required | Description |
|---|---|---|---|
status | "planned" | "drafted" | "approved" | "scheduled" | "published" | "exported" | No | Only this status (default every status) |
limit | integer 1-25 | No | How many to return, newest first (default 10) |
Try asking: “Show me the drafts I haven't approved yet.”
Example response
{
"success": true,
"status": "drafted",
"drafts": [
{
"id": "6f1c...",
"status": "drafted",
"channel": "linkedin",
"title": "...",
"text": "...",
"truncated": false,
"createdAt": "2026-10-09T10:00:00.000Z",
"updatedAt": "2026-10-09T10:05:00.000Z"
}
]
}get_credits_balanceRead-onlyGet my credits balance
Your SelfScale credits: how many you have left, this month's allowance and when it renews.
No arguments.
Try asking: “How many SelfScale credits do I have left this month?”
Example response
{
"success": true,
"plan": {
"id": "ultimate",
"name": "Premium"
},
"creditsRemaining": 212,
"monthly": {
"allocated": 300,
"rollover": 0,
"used": 88
},
"topUpCredits": 0,
"periodEndsAt": "2026-11-01T00:00:00.000Z"
}Limits
| Limit | Value |
|---|---|
| Requests per minute, per key | 60 |
| Calls per day, Premium | 25 |
| Calls per day, Power | 25 |
| Calls per day, Pro (existing subscribers) | 5 |
| Messages per request | 1 (batches are refused) |
| Active keys per account | 5 |
Daily calls reset at midnight UTC and are shared by all your keys. Every request counts, including the one your client makes to list tools when it connects. Responses carry X-MCP-Limit, X-MCP-Used and X-MCP-Remaining headers.
Errors
Request errors
| Status | When | What to do |
|---|---|---|
400 | The body was a JSON-RPC batch (an array of messages). | Send one message per request. |
401 | The Authorization header is missing, or the key is wrong, revoked or expired. | Check the header reads Bearer followed by your full key, or create a new key. |
403 | Your plan doesn't include MCP, or the request came from a browser origin that isn't allowed. | MCP comes with Premium and Power. Browser pages can't call it; call from a server, script or desktop app. |
406 | The Accept header doesn't list both application/json and text/event-stream. | Send Accept: application/json, text/event-stream. |
413 | The request body is larger than 256 KB. | Send smaller arguments. |
429 | You went over 60 requests a minute, or your plan's calls for the day. | Wait for Retry-After or the daily reset (resetAt), then retry. |
503 | SelfScale couldn't check your key, plan or usage just then, or MCP is paused. Nothing was run. | Retry after the seconds in Retry-After. |
Tool errors
When a tool can't finish, your assistant gets isError: true with a code and a message it can read to you.
| Code | Meaning |
|---|---|
INVALID_INPUT | An argument is missing, the wrong type, out of range or too long. The message says which. Arguments that don't match the schema come back as "Invalid input" with details. |
UNAUTHORIZED | Your key or plan can't use this tool (the analytics tools need Full Analytics), or a connected app rejected SelfScale's stored connection. The message says which; for a connected app, reconnect it on the Integrations page. |
NOT_FOUND | The thing you asked for doesn't exist, or the feature isn't available on your account yet. |
RATE_LIMITED | A connected app (or that tool's own limit) asked to slow down. Try again later. |
UNAVAILABLE | Your data couldn't be read just then. Nothing changed; try again. |
Security
- Keys are shown once. SelfScale stores only a hash of each key, so nobody, including us, can show it to you again.
- Revoke anytime. Revoking a key in Settings › Developer stops it on the next request. Revoke a key straight away if it leaks. Every key also expires on the date you picked, at most a year after you made it.
- Scopes. Each key holds scopes that decide what it can do. Personal keys hold the
readscope only, so they can read your data but can't post, edit, delete or spend credits. - Your data only. A key reads only your own account, and the apps you connected yourself.
- Not for browsers. The server refuses requests from web pages on other sites, so a key can't be used from someone else's website. Keep keys out of front-end code and public repos.
Troubleshooting
My client says it can't connect, or shows 401 Unauthorized.
Check the header is exactly Authorization: Bearer ss_live_..., with one space after Bearer and the whole key. Check the key wasn't revoked in Settings › Developer. When in doubt, create a new key.
I get 403 and a message about my plan.
The MCP server comes with Premium and Power. Change your plan in Settings › Billing, then try again.
A tool I expected isn't listed.
A personal key reaches the tools listed on this page. Tools that use credits aren't available with a personal key.
A tool says NOT_FOUND.
That feature isn't available on your account yet.
I get 429 Too Many Requests.
You went over 60 requests a minute, or used your calls for the day. Wait a minute, or until midnight UTC for the daily reset.
Claude Desktop has no Request headers option.
Use the mcp-remote setup under Claude Desktop. It needs Node.js installed.
curl returns 406 Not Acceptable.
Add -H "Accept: application/json, text/event-stream". The server needs both.
I get 503 Service Unavailable.
SelfScale couldn't check your key or usage just then, so nothing ran. Wait the seconds in Retry-After and try again.
Coming soon
- SoonSign in from Claude's connector directory (OAuth). Add SelfScale with one click and sign in, no key to copy.
- SoonWrite tools. Ask your assistant to write a draft, and it lands in your SelfScale approval queue for you to review. Nothing goes out without your approval.