Atlas / MCP servers / synchronicity-labs / mcp-server

mcp-serverSAFE

mcp/synchronicity-labs/mcp-server

MCP server for the Sync API — give AI agents the ability to create lipsync videos, manage assets, and more

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
16 4r · 12w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

An open-source Model Context Protocol (MCP) server for the Sync API. Gives AI agents the ability to create lipsync videos, manage assets, check generation status, and more.

Tools are auto-generated from the Sync OpenAPI spec at startup. As new API endpoints ship, they become available to agents automatically — no server update needed.

Supported Clients

Quick Start

Claude Web (claude.ai)

No installation required — connect directly from your browser.

  1. Go to claude.ai → Settings → Integrations
  2. Click Add custom connector
  3. Enter Name: Sync and URL: https://mcp.sync.so/mcp
  4. Click Add, then Connect
  5. Log in with your Sync account when prompted

No API key needed — authentication is handled via OAuth.

Claude Code

claude mcp add sync -- npx -y @sync.so/mcp-server --api-key YOUR_API_KEY

Or add to .mcp.json in your project root:

{
"mcpServers": {
"sync": {
"command": "npx",
"args": ["-y", "@sync.so/mcp-server"],
"env": {
"SYNC_API_KEY": "your-api-key"
}
}
}
}

Claude Desktop

Add to claude_desktop_config.json:

{
"mcpServers": {
"sync": {
"command": "npx",
Read from source at commit 8d4ba2a5983cOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add mcp-server --env OAUTH_REGISTRATION_SECRET=${OAUTH_REGISTRATION_SECRET} --env OPENAI_APPS_CHALLENGE_TOKEN=${OPENAI_APPS_CHALLENGE_TOKEN} --env SYNC_API_KEY=${SYNC_API_KEY} -- npx -y @sync.so/[email protected]
claude-desktop
{
  "mcpServers": {
    "mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "@sync.so/[email protected]"
      ],
      "env": {
        "OAUTH_REGISTRATION_SECRET": "${OAUTH_REGISTRATION_SECRET}",
        "OPENAI_APPS_CHALLENGE_TOKEN": "${OPENAI_APPS_CHALLENGE_TOKEN}",
        "SYNC_API_KEY": "${SYNC_API_KEY}"
      }
    }
  }
}
03

Exposed tools (16)

4 read · 12 write · 0 destructive.

ToolRiskDescription
assets_create-upload-urlwrite
create-dialogue-previewwritePreview timed word changes/removals in the original speaker’s voice. This is a synthesis action. Use a completed transcription, or a prior preview of this source when reopening. Confirm edits first. Never retry an ambiguous creation automatically. This is not arbitrary full-transcript replacement.
create-dialogue-transcriptionwriteTranscribe a saved single-speaker video for timed-word editing. Transcription is unbilled and identical sources reuse their existing job. Does not replace dialogue or generate a video.
create-dialogue-videowriteGenerate the final video from an approved completed audio preview matching the current edits. Confirm the estimate first. Reuse the same idempotency key and inputs for recovery; poll generate_get-generation for the returned ID.
create-lipsyncwriteCreate a lipsync video with exactly one visual input (image or video) and one driver (audio or script).
create-translate-and-dubwriteTranslate a video’s speech and lip-sync it in the target language. Requires a saved video asset, selected project, model, and persistent idempotency key.
estimate-dialogue-videoreadEstimate final video cost using the completed dialogue preview and canonical server retiming. Does not generate or reserve credits.
get-dialogue-optionswriteCheck whether the connected API supports timed-word Edit Dialogue. Does not transcribe, synthesize or generate.
get-dialogue-previewwriteRead one existing Edit Dialogue audio preview. Partial completion must be disclosed, not described as every edit succeeding.
get-dialogue-transcriptionreadRead the same transcription job until complete. Requires its original saved video and accessible project.
get-translation-optionsreadRead the source and target languages supported by the current translation API. Does not create a generation or estimate pricing.
holdread
open-sync-appwriteOpen Sync to browse existing projects, choose media and configure a video generation. Requesting the interface does not start a generation or spend credits. The result only confirms the request; do not claim the interface rendered unless the user confirms it.
open-upload-widgetwriteDisplay the Sync image/audio uploader in ChatGPT. The widget can stage a selected local image or audio file as a Sync asset and start a lipsync generation. It does not accept video files.
projects_get-generationswriteRead generation history for an accessible Sync project. Requires a projectId returned by projects_get-all. Pass limit and the last returned generation id as cursor to load another page. These are the same records used by the Sync web app.
upload-mediawriteStage an image, video, or audio file in Sync asset storage and return a durable assetId.
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
none-observed
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (15)

LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/tools/app-tools.source.test.ts:156
'http://169.254.169.254/private',
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/tools/app-tools.source.test.ts:196
{ results: [{ address: '::ffff:169.254.169.254', family: 6 }] },
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/app-upload-relay.browser.test.js:12
http.request(`http://127.0.0.1:${upstreamAddress.port}/object`, options, callback),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/app-upload-relay.browser.test.js:38
const origin = `http://127.0.0.1:${listener.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/app-upload-relay.test.ts:13
http.request(`http://127.0.0.1:${upstreamAddress.port}/object`, options, callback as never),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/app-upload-relay.test.ts:36
const origin = `http://127.0.0.1:${(listener.address() as AddressInfo).port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
src/auth/bearer-auth.test.ts:33
await run(`http://127.0.0.1:${(server.address() as AddressInfo).port}`, () => reached);
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, cors, express, express-rate-limit, ipaddr.js, undici, zod, @biomejs/biome
Why it matters. 13 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
README.md:227
The HTTP server writes newline-delimited JSON diagnostics to stderr. Lifecycle events distinguish graceful pod termination from abrupt process loss, request logs include latency and abort state, and `
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/release-verification.md:19
[Session E's previous exact-head report](https://linear.app/sync-labs/issue/CRAFT-6168#comment-5b306d82-3e81-4f2f-9e72-1d9e75e9ab19)
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/release-verification.md:60
[Session C's reviewer kit](https://linear.app/sync-labs/document/muse-connector-launch-reviewer-kit-and-release-evidence-499e8a3c25d7)
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOInventory / provenance · inv.oversize · CWE-1104
deploy/chatgpt/0f4f454753a88e6264cf1393500c9d9dac8673040459642407230a0e1ddbb258/app.html.gz
deploy/chatgpt/0f4f454753a88e6264cf1393500c9d9dac8673040459642407230a0e1ddbb258/app.html.gz
Why it matters. 1182320 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
deploy/chatgpt/5c28555d1843dfb74841ff1af3f5fff5cf8204f4ce52a8f6dabccbfc02d9c861/app.html.gz
deploy/chatgpt/5c28555d1843dfb74841ff1af3f5fff5cf8204f4ce52a8f6dabccbfc02d9c861/app.html.gz
Why it matters. 1072554 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
deploy/chatgpt/a39e27ca488992ab54f148417646a041c7e6d667055dbc0fa5bcd674af76532b/app.html.gz
deploy/chatgpt/a39e27ca488992ab54f148417646a041c7e6d667055dbc0fa5bcd674af76532b/app.html.gz
Why it matters. 1144428 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
deploy/chatgpt/c048cd48c1d3bde0c9fafb1dd3cdd9ccc6dd45085060a92ed653b7cfce7592dd/app.html.gz
deploy/chatgpt/c048cd48c1d3bde0c9fafb1dd3cdd9ccc6dd45085060a92ed653b7cfce7592dd/app.html.gz
Why it matters. 1118539 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 8d4ba2a5983cfull audit observations/trust-audit/mcp-server/synchronicity-labs__mcp-server.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-118d4ba2a5983cSAFEB89first audit
06

Questions

What is the mcp-server MCP server?

MCP server for the Sync API — give AI agents the ability to create lipsync videos, manage assets, and more

What tools does mcp-server expose?

16 in total: 4 read-only, 12 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is mcp-server safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does mcp-server need?

It reads OAUTH_REGISTRATION_SECRET, OPENAI_APPS_CHALLENGE_TOKEN and SYNC_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does mcp-server run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @sync.so/mcp-server at 0.1.4.

How current is this page?

The grade is for one exact copy of the source (8d4ba2a5983c), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement