Faceless MCP server

Create, render and auto-post AI faceless videos from Claude, ChatGPT, Cursor or any MCP client: scripts, voiceover, visuals, captions, series and scheduling to YouTube, TikTok, Instagram and 4 more.

Hosted MCP Server

npx add-mcp 'https://faceless.so/api/v1/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

MCP

Faceless ships a Model Context Protocol (MCP) server so agent runtimes (Claude, Claude Code, Claude Desktop, Cursor and any other MCP client) can call the API as tools. There are two ways to connect: the remote server over streamable HTTP, or a local stdio server. The remote server accepts OAuth (sign in with your Faceless account, no key handling) or an API key from your team settings at https://faceless.so/team; the local server needs an API key.

Connect Claude (claude.ai and the Claude apps)

The fastest path for Claude users is a custom connector. No install, no API key: you sign in with your Faceless account and approve exactly the permissions you want.

  1. In Claude, open Settings > Connectors > Add custom connector.
  2. Enter https://faceless.so/api/v1/mcp and continue.
  3. Claude opens the Faceless consent screen. Sign in, pick the team to connect, untick any permissions you do not want to grant, and click Authorize.
  4. Back in Claude, enable the connector in any chat. Try: "Check my Faceless credits" or "Make a faceless video about deep sea creatures and post it to my YouTube".

Available on Claude Pro, Max, Team and Enterprise plans. Access can be revoked anytime from your Faceless team settings.

Faceless in the Claude directory

The Faceless connector listed in Claude's connector directory uses https://faceless.so/api/v1/mcp/claude. It signs in the same way (OAuth, you pick the team and permissions) and carries the tools for managing, rendering and publishing the videos you already have in Faceless:

  • faceless_get_me: the connected team, plan and credit balance
  • faceless_list_videos, faceless_get_video, faceless_get_video_status: your videos and where each one stands
  • faceless_update_video, faceless_select_video_thumbnail: per-platform titles, captions and descriptions, and which thumbnail a video uses
  • faceless_render_video, faceless_get_render: render a finished video to MP4 and follow the render
  • faceless_list_accounts, faceless_publish_post, faceless_schedule_post, faceless_cancel_post, faceless_get_calendar: post now, schedule, cancel and see what is queued
  • faceless_list_series, faceless_get_series, faceless_list_series_episodes: your automated series and their episodes
  • faceless_get_analytics: views, likes, comments and posting volume across platforms

Making new videos and buying credits are not part of this connector; do those in the Faceless app at https://faceless.so.

Try: "List my Faceless videos from this week", "Schedule my latest Faceless video to YouTube and TikTok for 6pm tomorrow" or "How did my Faceless posts do on TikTok over the last 30 days?".

Troubleshooting: a forbidden_scope error means the permission was unticked at sign-in, so disconnect and reconnect the connector and keep it ticked. A schedule_post rejection usually means the platform's post metadata is missing; set it with faceless_update_video first. Publishing needs the platform connected in Faceless (check with faceless_list_accounts). Anything else: support@faceless.so.

Remote server (nothing to install)

The remote server lives at https://faceless.so/api/v1/mcp and speaks the streamable HTTP transport. Authenticate with the same Authorization header as the REST API.

Claude Code:

claude mcp add --transport http faceless https://faceless.so/api/v1/mcp \
  --header "Authorization: Bearer fl_live_..."

Any MCP client that supports streamable HTTP works the same way: point it at the URL and send Authorization: Bearer fl_live_... with every request.

Local server (stdio)

For clients that only speak stdio, run the server locally. Two equivalent ways: npx -y faceless-mcp, or faceless mcp if the CLI is installed. Both read the key from the FACELESS_API_KEY environment variable.

Claude Code:

claude mcp add faceless --env FACELESS_API_KEY=fl_live_... -- npx -y faceless-mcp

Claude Desktop (Settings > Developer > Edit Config, claude_desktop_config.json):

{
	"mcpServers": {
		"faceless": {
			"command": "npx",
			"args": ["-y", "faceless-mcp"],
			"env": { "FACELESS_API_KEY": "fl_live_..." }
		}
	}
}

Cursor (.cursor/mcp.json in your project, or the global ~/.cursor/mcp.json):

{
	"mcpServers": {
		"faceless": {
			"command": "npx",
			"args": ["-y", "faceless-mcp"],
			"env": { "FACELESS_API_KEY": "fl_live_..." }
		}
	}
}

Use the remote server when you want zero install and always-current tools; use the local one when your client only speaks stdio or your network policy prefers a locally spawned process.

Tools

All 28 API operations are exposed as tools named faceless_*, and each respects the key's scopes (a missing scope surfaces as a forbidden_scope error). The core ones an agent reaches for:

  • faceless_get_me, faceless_get_credits: identity, scopes and budget
  • faceless_list_voices, faceless_list_options: catalogs to choose voices, styles and models
  • faceless_create_video, faceless_get_video_status, faceless_render_video, faceless_get_render: the create, poll, render, poll lifecycle
  • faceless_create_caption_video: caption existing footage
  • faceless_update_video, faceless_publish_post, faceless_schedule_post, faceless_cancel_post, faceless_get_calendar: publishing and scheduling
  • faceless_create_series, faceless_list_series, faceless_get_series, faceless_update_series, faceless_delete_series, faceless_generate_series_episode, faceless_list_series_episodes: automated series
  • faceless_list_videos, faceless_get_video, faceless_delete_video, faceless_list_accounts, faceless_create_asset, faceless_get_analytics: the rest of the surface

Mutating tools accept an optional idempotencyKey argument with the same semantics as the REST Idempotency-Key header: retries with the same key and arguments replay the stored result instead of re-running (and re-charging). Pass one when a tool call might be retried.

Tool results use the same envelope and error types as the REST API; see errors and rate limits. Rate limits also apply per key, so a busy agent should back off on rate_limited.

Related