# Moda MCP MCP Server

> **Moda MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Moda MCP.
>
> MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows,
> token refresh, and production-grade auto-scaling — so your AI agents can connect to
> third-party services and run freely without you managing any MCP server yourself.
>
> Server page:  https://mewcp.com/mcp/moda-mcp
> MewCP docs:   https://docs.mewcp.com
> Full catalog: https://mewcp.com/llms.txt

---

## About

Moda creates and edits fully editable presentations, sales documents, social media posts, Meta ads, motion graphics, and landing pages. Apply brand kits, refine individual design elements, collaborate on canvases, and export finished assets as PowerPoint, PDF, or images

---

## Details

- Server ID: `moda-mcp`
- Version: 3.2.4
- Tools: 42
- Authentication: OAuth, managed by MewCP
- Transport: http

---

## Access

The gateway URL below serves your **entire MewCP toolset**, not this server on its
own. Pasting a config snippet is not enough — Moda MCP has to be in the toolset
first. In order:

1. Add Moda MCP to your toolset at https://mewcp.com/mcp/moda-mcp
2. Connect your Moda MCP account (OAuth); MewCP stores the credential and attaches it to each call
3. Copy your MewCP API key from the dashboard (Developer)
4. Configure your client with the snippet for it below

Once connected, an agent does **not** see this server's tools as top-level tools.
It sees four meta-tools and reaches everything through them:

- `search(query)` — find tools by keyword across the toolset
- `get_schema(tools)` — full description and arguments for the tools you picked
- `list_accounts(provider)` — only when one app has several connected accounts
- `call_tool(server_maskedId, tool_name, args)` — execute

So the list below is what `search` can return for this server, not a set of
callable tool names on their own.

---

## Tools (42)

Descriptions are truncated to 160 characters; call `get_schema`
for the full text and the argument schema. Where a tool is annotated, its type
is shown — treat `destructive` as irreversible.

- `moda_bootstrap` _(read)_ — Identity, plan, teams, entitlements, and the Moda working discipline. Call once before the first canvas operation — the other tools assume its context. NOT for…
- `load_skill` _(read)_ — Load one of Moda's full authoring guides (server-served skills) — deep, current, free. Call before authoring in a format you have not authored this session,…
- `canvas_list` _(read)_ — List the team's canvases, newest first, cursor-paginated. Use when browsing what exists or resolving 'my deck' to an id. NOT for keyword lookup → use…
- `canvas_search` _(read)_ — Search canvases by name or content, relevance-ranked. Use when the user names or describes a specific design — a deck, slides, a presentation, a poster, a…
- `canvas_create` _(write)_ — Create blank design pages. Defaults: slides → 960×540, social → 1080×1080, carousel → 1080×1350, pdf → 816×1056, animation → 1920×1080, prints → 816×1056,…
- `canvas_apply_markup` _(write)_ — Add or replace nodes on one page from Moda XML markup (inline string). Requires bootstrap context; page ids come from canvas_create's result or canvas_read,…
- `canvas_edit` _(write)_ — Run a sandboxed JS batch edit over existing nodes (move/restyle/retext by id). expected_revision is optional — edits apply on top of the current canvas by id;…
- `canvas_read` _(read)_ — Read a canvas as the lossless TOON snapshot, minting the short ids (n…/p_…) and the revision token every other canvas tool uses. Requires bootstrap context.…
- `canvas_screenshot` _(read)_ — Capture page images inline for visual verification — the only way to know how a canvas actually renders. Defaults to the current page; pages=[p_…] up to 3 per…
- `edit_read` _(read)_ — Read compact Main Edit state, or pass operations to validate without writing. Use its revision with edit_apply. Lists compositions: the canvas's pages, the ids…
- `edit_apply` _(destructive)_ — Atomically edit Main Edit clips, visual tracks and transitions with expected_revision from edit_read. New clips take composition sources (page ids from…
- `canvas_update` _(write)_ — Rename a canvas, set/clear its description, bind it to a brand kit (brand_kit_id from brand_list; clear_brand_kit=true unbinds), or flag it as a reusable team…
- `canvas_delete` _(destructive)_ — Delete by id: pass ids=[n…/p_…] to remove nodes/pages/variables (an ordinary scoped edit under the revision contract), or omit ids to soft-delete the WHOLE…
- `canvas_share` _(write)_ — Mint (or re-enable) the public share link for a canvas — permission 'view' or 'view_remix'. Use when the user wants to send the design to someone. The…
- `upload` _(write)_ — Bring a file into Moda and get a stable file_… reference for canvas markup file_ refs or media tool inputs. Pass url= to fetch it server-side — a plain GET of…
- `brand_list` _(read)_ — List the team's brand kits (id, title, default flag). Use when picking a kit or checking whether a brand exists. Pass query=<name> to filter by kit title or…
- `brand_show` _(read)_ — One brand kit's model-safe tokens: colors, fonts, tagline, brand values, logo listings (durable file ids per image), plus the kit's Moda app link (url) and the…
- `export` _(write)_ — Export a canvas as png, jpeg, pdf, pptx, or one animated page as mp4/gif — or, with scope='sequence' (mp4 only), every visible page's animation stitched into…
- `task_delegate` _(write)_ — Hands the whole design to Moda's own agent to produce. It builds the entire thing on a canvas by itself; you stop authoring and wait. METERED — it spends the…
- `task_status` _(write)_ — Poll a design task, canvas image operation, or export by handle. Polling can resume admitted image work after a lost worker wake. status='working' means keep…
- `task_cancel` _(write)_ — Request cancellation of an in-flight design task. Returns 'canceling' until the executor acknowledges — task_status shows the terminal state. Already-terminal…
- `canvas_edit_image` _(destructive)_ — Generate or transform an image inside an existing editable design element. Create the layout and a neutral shape first, then pass its node id from canvas_read.…
- `file_search` _(read)_ — Search images by keyword: the team's own assets (source='team', default) or the stock photo library (source='stock'); kind='icon' searches the shared icon…
- `file_list` _(read)_ — Browse the drive (the app file browser's own view), newest-modified first. With folder=fld_… (one folder) or folder='root' (unfiled): that location's files,…
- `file_read` _(read)_ — Read what is INSIDE a team file: extracted text for documents (PDF, DOCX, PPTX, XLSX, CSV, HTML, plain text), the image itself for images. Use whenever the…
- `drive_tree` _(read)_ — The workspace folder tree with per-folder item counts (bounded depth, default 3) — how the user organizes their work. Use before placing or moving anything,…
- `drive_organize` _(write)_ — Organize the workspace — one action per call: action='create_folder' (name=…, optional parent folder=fld_…), 'move' (item=fld_…/cvs_…/file_…, folder=fld_… or…
- `drive_delete` _(destructive)_ — Soft-delete a folder (item=fld_…) or file (item=file_…) for the whole team. A folder with contents is NOT deleted until you call again with confirm=true —…
- `template_list` _(read)_ — The team's flagged template canvases (name, category, page count, tags), cursor-paginated. Use when starting a design that should match the team's existing…
- `site_list` _(read)_ — List the team's websites with publish state and live URL, newest-updated first. Use when the user asks about their sites or wants a site's link. NOT for one…
- `site_show` _(read)_ — One website's metadata, publish state, live URL, and page inventory. Pass the id from site_list. Use to answer what a site contains or whether it is live. NOT…
- `ask_expert` _(read)_ — Ask Moda's built-in product expert a how-to question — free, fast, grounded in Moda's own guides, with citations. Ask early and often rather than guessing:…
- `media_video_frames` _(read)_ — Inspect an uploaded or existing video file by sampling still frames as inline images. Free. Pass its file_… ref; upload an http(s) URL first. Omit…
- `brand_create` _(write)_ — Create a brand kit from a website (url) or from tokens the user described (name plus colors/fonts). url is an ordinary public web page Moda fetches and reads…
- `brand_update` _(destructive)_ — Edit an existing brand kit — one action per call: action='update' (any of title, company_name, company_description, tagline, brand_values, brand_tone_of_voice,…
- `brand_delete` _(destructive)_ — Soft-delete a brand kit (bk_… id from brand_list) for the whole team — its palette, fonts, voice, guides and image attachments; canvases bound to it keep their…
- `media_remove_background` _(write)_ — Remove an image background with standard Bria matting. Returns a transparent PNG file; takes a file_… reference or public image URL. METERED: consumes team…
- `media_fetch_logo` _(write)_ — Fetch a brand's own logo files by DOMAIN and save them to the team library. FREE: it consumes no credits, so there is no quote preflight — just call it.…
- `canvas_import_pages` _(write)_ — Copy pages OUT of another canvas into this one — they are cloned with fresh ids and appended after the last page. source takes a cvs_ id, a UUID, or a bare…
- `design_progress_read` _(read)_ — Internal poller for Moda's design-progress preview widget, called only by that widget. Do not call it yourself: to inspect a canvas use canvas_read or…
- `template_search` _(read)_ — Find reusable ITEMS inside the team's templates and themes — one slide or page (of a deck, theme or carousel), or a whole document (a 2-page resume, a menu) —…
- `canvas_comments` _(read)_ — Read the comment threads people left on a canvas (review feedback), read-only. Open threads only unless include_resolved=true; page=<p_…> scopes to one page.…

---

## Connect

Gateway URL: https://gateway.mewcp.com/personal/mcp

Every request carries one header:

    Authorization: Bearer <API_KEY>

Replace `API_KEY` with your own key from the dashboard (Developer).

## Apps

### Claude Desktop

Mac & Windows app

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://gateway.mewcp.com/personal/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open Claude Desktop → Settings → Developer → "Edit Config"
2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one)
3. Save the file, then quit Claude Desktop completely and reopen it
4. Start a new conversation — your tool will be available

### VS Code

Copilot / Cline

- Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead.

```json
{
  "mcp.servers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have a "servers" section in your mcp.json? Just add the server entry inside it.

1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P)
2. Run "MCP: Open User Configuration" to open your mcp.json
3. Paste the snippet and save
4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat

### Cursor

AI-first editor

- macOS: `~/.cursor/mcp.json`
- Windows: `%USERPROFILE%\.cursor\mcp.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it.

1. Open Cursor → Settings → Cursor Settings → MCP
2. Click "Add new global MCP server"
3. Paste the snippet and save
4. Restart Cursor

### Codex

OpenAI's CLI agent

- Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers.

1. Open your Codex MCP config or project-level config file
2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects
3. Save the file and restart Codex
4. Verify the tool is available inside a fresh session

### Claude Code

Anthropic's CLI agent

- ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file and start (or restart) Claude Code
4. Or skip the file entirely and run the CLI command below instead

### OpenCode

Open-source terminal agent

- ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist.

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mewcp": {
      "type": "remote",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcp" section in your opencode.json? Just add the server entry inside it.

1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and start (or restart) OpenCode

### OpenClaw

Self-hosted agent gateway

- ~/.openclaw/openclaw.json — create it if it doesn't exist.

```json
{
  "mcp": {
    "servers": {
      "mewcp": {
        "transport": "streamable-http",
        "url": "https://gateway.mewcp.com/personal/mcp",
        "enabled": true,
        "headers": {
          "Authorization": "Bearer API_KEY"
        }
      }
    }
  }
}
```

Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers".

1. Open ~/.openclaw/openclaw.json in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and restart OpenClaw

### Antigravity

Google's agentic IDE

- ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist.

```json
{
  "mcpServers": {
    "mewcp": {
      "serverUrl": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported.

1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager)
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file — the server connects automatically

### Hermes

Nous Research's CLI agent

- config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key.

```yaml
mcp_servers:
  mewcp:
    url: "https://gateway.mewcp.com/personal/mcp"
    headers:
      Authorization: "Bearer API_KEY"
```

Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it.

1. Open config.yaml in your Hermes config directory
2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any)
3. Save the file, then run /reload-mcp in Hermes (or start a fresh session)
4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected

### DeepSeek Harness

DeepSeek's agent harness

- cordis.yml in your DSH project — or the patch file you mount plugins from.

```yaml
- id: mcp-mewcp
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: mewcp
    transport: streamable-http
    url: https://gateway.mewcp.com/personal/mcp
    headers:
      Authorization: "Bearer API_KEY"
```

One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry.

1. Open cordis.yml (or your patch file) in your DSH project
2. Paste the entry into your plugin list, keeping the leading dash and indentation
3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__<tool_name>
4. Verify with: dsh web --dump-config | grep -A3 mcp

## SDKs

### Python

fastmcp client

```python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport

SERVER_URL = "https://gateway.mewcp.com/personal/mcp"
API_KEY = "API_KEY"

transport = StreamableHttpTransport(
    url=SERVER_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
    }
)

async def main():
    client = Client(transport)
    async with client:
        tools = await client.list_tools()
        print(tools)

asyncio.run(main())
```

1. Install fastmcp: pip install fastmcp
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run your script

### TypeScript

MCP SDK

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const SERVER_URL = "https://gateway.mewcp.com/personal/mcp";
const API_KEY = "API_KEY";

const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), {
  requestInit: {
    headers: {
      Authorization: `Bearer ${API_KEY}`,
    },
  },
});

const client = new Client({ name: "mewcp-client", version: "1.0.0" });
await client.connect(transport);

const tools = await client.listTools();
console.log(tools.tools.map((t) => t.name));
```

1. Install: npm install @modelcontextprotocol/sdk
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)