> ## Documentation Index
> Fetch the complete documentation index at: https://docs.onlyfansapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Fansly over MCP (/onlyfans-ai/mcp/fansly)

import { Accordion, Accordions } from "fumadocs-ui/components/accordion";

## Fansly is already in your MCP server

There is **no separate Fansly MCP server**. Fansly tools live on the same endpoint you already use:

```
https://app.onlyfansapi.com/mcp/onlyfans-mcp
```

If you have already connected Claude, ChatGPT, or Manus, you have Fansly today — no reinstall, no second connector, no new API key. Reconnect the connector once so your client refreshes its tool list, and the Fansly tools appear.

Every documented Fansly endpoint maps one-to-one to a tool, so the [Fansly API reference](/api-reference/fansly) is the current list — or just ask your client for `tools/list`.

<Callout>
  Already set up? Skip to [tool naming](#tool-naming) — that's the only thing that behaves differently.
</Callout>

## Prerequisites

* An [OnlyFans API account](https://app.onlyfansapi.com) and an API key
* At least one [connected Fansly account](/api-reference/fansly/connect-fansly-account/start-authentication)

Connecting a Fansly account works exactly like connecting an OnlyFans one, and your agent can do it: `fansly_startAuthentication`, then `fansly_submit2FA` if a code is required, polling `fansly_pollAuthenticationStatus` in between.

## Tool naming

Every Fansly tool is prefixed **`fansly_`**. OnlyFans tools are unprefixed.

| Task                    | OnlyFans          | Fansly                   |
| ----------------------- | ----------------- | ------------------------ |
| List connected accounts | `listAccounts`    | `fansly_listAccounts`    |
| List chats              | `listChats`       | `fansly_listChats`       |
| Send a chat message     | `sendChatMessage` | `fansly_sendChatMessage` |
| Send a mass message     | `sendMassMessage` | `fansly_sendMassMessage` |
| Create a post           | `sendPost`        | `fansly_sendPost`        |
| Upload media            | `uploadMedia`     | `fansly_uploadMedia`     |

This prefix is not cosmetic. The two platforms share **26 identically-named operations** — `listAccounts`, `sendMassMessage`, `sendPost`, `blockUser`, `listVaultMedia` and more. Without a namespace, an agent could not tell which platform a tool belonged to.

<Callout type="warn">
  **The two platforms are separate APIs with separate accounts.** A `fansly_acct_…` ID will not work on an OnlyFans tool, and an `acct_…` ID will not work on a Fansly tool. If a tool call fails with a 403 or "not found" on an account you know exists, check that the prefix of the tool matches the prefix of the account ID.
</Callout>

## Account IDs

Most tools are account-scoped, and the parameter name differs per platform:

| Platform | Parameter       | Format                        | Discover with         |
| -------- | --------------- | ----------------------------- | --------------------- |
| OnlyFans | `account`       | `acct_XXXXXXXXXXXXXXX`        | `listAccounts`        |
| Fansly   | `fanslyAccount` | `fansly_acct_XXXXXXXXXXXXXXX` | `fansly_listAccounts` |

If your agent works on one creator, pin it in the system prompt so it stops asking:

```
Use Fansly account fansly_acct_XXXXXXXXXXXXXXX for all tool calls unless told otherwise.
```

## Narrowing the tool list

The server exposes **350+ tools** — 290+ OnlyFans and 80+ Fansly. That is a lot of context to hand a model, and some clients cap how many tools they will load.

If you only work with one platform, append `?platforms=` to the MCP URL and the server registers only that platform's tools:

```
https://app.onlyfansapi.com/mcp/onlyfans-mcp?platforms=fansly
```

```
https://app.onlyfansapi.com/mcp/onlyfans-mcp?platforms=onlyfans
```

Both platforms is the default, and `?platforms=onlyfans,fansly` is the same as omitting it.

<Callout>
  The filter applies to tool **execution** as well as listing — a connection scoped to `fansly` cannot call an OnlyFans tool even if the model guesses the name. It is a safe way to hand an agent one platform and nothing else.

  An unrecognised value (a typo like `?platforms=fansley`) falls back to loading every tool rather than none, so a bad config never leaves you with an empty server.
</Callout>

## Fansly-specific behaviour

Four things differ from OnlyFans in ways an agent cannot infer from the tool schema alone.

### There is no "FYP post" tool

Posting to the For You Page is a parameter on `fansly_sendPost`, not a separate endpoint:

* `fypFlags: 0` — post to the FYP if it meets Fansly's requirements (**default**)
* `fypFlags: 4` — do not post to the FYP

If you ask an agent to "make an FYP post" it may hunt for a tool that does not exist. Say "post it and leave FYP enabled" instead, or pin the behaviour in your system prompt.

### Media upload is URL-based over MCP

`fansly_uploadMedia` accepts either a raw `file` or a `file_url`. **Binary file parameters are stripped from MCP tool schemas** — they cannot be transported as JSON — so over MCP you always pass `file_url`.

For large files and videos, set `async: true`. The call returns HTTP 202 with a `polling_url`; poll `fansly_getUploadStatus` until it completes, then pass the returned `fansly_media_…` ID in `mediaFiles` on a post or message.

<Callout>
  Direct binary uploads still work over plain HTTP — this only affects the MCP tool surface. See [Upload Media](/api-reference/fansly/media/upload-media).
</Callout>

### Prices are in thousandths of a dollar

Fansly's smallest money unit is **not cents**. On `price` (for `requirePurchase`), `1000` = **$1.00** and `10000` = **$10.00**.

<Callout type="warn">
  Models frequently assume cents and under-price PPV content by 100×. If your agent sets prices, state the unit explicitly in your system prompt.
</Callout>

### Media is attached by upload ID

`mediaFiles` on `fansly_sendPost`, `fansly_sendChatMessage`, and `fansly_sendMassMessage` takes `fansly_media_…` IDs returned by `fansly_uploadMedia` — not URLs and not vault IDs. Upload first, then attach.

## Example prompts

Drop these into a chat with the connector enabled:

### Chat ops

* *"List my Fansly chats with unread messages and summarize what each fan last asked."*
* *"Reply to every unanswered Fansly chat from the last 24h with a short friendly nudge. Draft them, don't send."*
* *"Who are my top 20 Fansly supporters this month?"*

### Mass messaging

* *"Send a Fansly mass message to `groupId` X announcing tomorrow's drop. Text only, no media."*
* *"Show my scheduled Fansly mass messages and cancel anything going out this weekend."*

### Posting

* *"Upload `https://example.com/promo.jpg` to Fansly, then post it to my main wall with FYP enabled."*
* *"Post this caption to Fansly, lock the media behind a $12 unlock, and give it a free preview."*

### Reporting

* *"Compare this month's earnings across my OnlyFans and Fansly accounts."*
* *"Pull Fansly tracking link revenue stats for the last 30 days and rank the links."*

<Callout>
  The cross-platform prompt above is the reason both platforms share one server: the agent can call `listAccounts` and `fansly_listAccounts` in the same turn and reconcile them without you switching connectors.
</Callout>

## Troubleshooting

<Accordions type="single">
  <Accordion title="My client doesn't show any fansly_ tools">
    Your client cached the tool list from before Fansly shipped. Disconnect and reconnect the connector to force a refresh. If you set `?platforms=onlyfans` on the URL, remove it.
  </Accordion>

  <Accordion title="&#x22;Account not found&#x22; on a Fansly tool">
    You almost certainly passed an OnlyFans `acct_…` ID. Fansly tools take `fanslyAccount` in the form `fansly_acct_…`. Call `fansly_listAccounts` to get the right one.
  </Accordion>

  <Accordion title="The agent can't find a tool to post to the For You Page">
    There isn't one. FYP is the `fypFlags` parameter on `fansly_sendPost` — see [above](#there-is-no-fyp-post-tool).
  </Accordion>

  <Accordion title="The agent keeps trying to attach a media URL directly to a post">
    `mediaFiles` takes `fansly_media_…` upload IDs, not URLs. Have it call `fansly_uploadMedia` with `file_url` first, then pass the returned ID.
  </Accordion>

  <Accordion title="Too many tools / the client refuses to load them all">
    Scope the connection with `?platforms=fansly` on the MCP URL to drop the OnlyFans tools and leave only the 80+ Fansly ones.
  </Accordion>

  <Accordion title="Tool calls return 429 Too Many Requests">
    MCP calls are rate-limited to **120 requests/minute** per API key. A single agent turn can be many tool calls. Back off, or split work across multiple keys.
  </Accordion>
</Accordions>

## Sending safely

<Callout type="warn">
  Don't let an autonomous agent blind-retry a send. If `fansly_sendChatMessage` or `fansly_sendMassMessage` times out, the message may already have gone through — retrying can deliver it twice. Have the agent call `fansly_listChatMessages` to confirm before resending, and prefer draft-then-approve for mass messages.
</Callout>

The same controls that apply to OnlyFans apply here: scoped API keys, per-account permissions, and a full audit log of every call your agent makes. See [Control & safety](/onlyfans-ai/mcp#control--safety).

## See also

* [MCP overview](/onlyfans-ai/mcp) — what MCP is, the server URL, and supported clients
* [Claude](/onlyfans-ai/mcp/claude) · [ChatGPT](/onlyfans-ai/mcp/chatgpt) · [Manus](/onlyfans-ai/mcp/manus) — install guides
* [Embed in your app](/onlyfans-ai/mcp/embed) — backend integration with your own API key
* [Fansly API reference](/api-reference/fansly) — every endpoint exposed as a tool
* [Connect a Fansly account](/api-reference/fansly/connect-fansly-account/start-authentication) — prerequisite for account-scoped calls