@agentutility/mcp-synthforge 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # @agentutility/mcp-synthforge
2
+
3
+ > Generative media for agents that ship products.
4
+
5
+ Image, video, music, voice generation across three price tiers. One API surface, USDC-settled, no SaaS account.
6
+
7
+ **Pricing:** pay-per-call in USDC on Base. No subscriptions, no API keys. See per-tool prices below.
8
+
9
+ ## Install — Claude Desktop
10
+
11
+ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
12
+
13
+ ```json
14
+ {
15
+ "mcpServers": {
16
+ "agentutility-synthforge": {
17
+ "command": "npx",
18
+ "args": ["-y", "@agentutility/mcp-synthforge"],
19
+ "env": { "X402_PRIVATE_KEY": "0xYOUR_PRIVATE_KEY_HEX" }
20
+ }
21
+ }
22
+ }
23
+ ```
24
+
25
+ Restart Claude Desktop. 14 tools appear in the tool palette.
26
+
27
+ ## Install — Cursor
28
+
29
+ Add to `.cursor/mcp.json`:
30
+
31
+ ```json
32
+ {
33
+ "mcpServers": {
34
+ "agentutility-synthforge": {
35
+ "command": "npx",
36
+ "args": ["-y", "@agentutility/mcp-synthforge"],
37
+ "env": { "X402_PRIVATE_KEY": "0x..." }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ## Funding
44
+
45
+ Send any amount of **USDC on Base mainnet** to the address derived from your `X402_PRIVATE_KEY`. The MCP server uses it to pay for tool calls automatically.
46
+
47
+ USDC on Base contract: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`
48
+
49
+ ## Tools (14)
50
+
51
+ | Tool | Description |
52
+ |---|---|
53
+ | `image-edit` | (0.02 USDC/call) Image edit / instruction-based image edit / text-driven photo edit / nano-banana image editor / GPT-image-2 edit. Mask-free instruction-driven image editing — describe the change in text and the model applies it to the whole image. Default model: nano-banana-pro. Returns a permanent fal-hosted PNG URL. |
54
+ | `image-expand` | (0.15 USDC/call) AI image outpainting / image expansion. Bria Expand model. Generates realistic content beyond original borders. Set canvas size + original placement. Commercial-license model. |
55
+ | `image-generate` | (0.01 USDC/call) Image generate (fast/cheap) / text-to-image / AI art. SFW, sub-5s turnaround. Four tiers backed by curated $0.01 Venice models: 'fast' (z-image-turbo, default), 'creative' (chroma), 'anime' (wai-Illustrious), 'sd35' (venice-sd35). For top-tier quality use image-generate-pro ($0.10, Flux 2 Pro / Recraft / Seedream / Qwen Image 2 Pro) or image-generate-ultra ($0.30, Google nano-banana-pro / OpenAI gpt-image-2). Returns a permanent fal-hosted PNG URL. |
56
+ | `image-generate-pro` | (0.10 USDC/call) Image generate (pro) / premium text-to-image / Flux 2 Pro / Recraft / Seedream / Qwen Image 2 Pro / xAI Grok Imagine. Premium multi-model lineup for photoreal, design/illustration, text-in-image, and stylized art. Tiers: 'balanced' (flux-2-pro, default), 'max' (flux-2-max), 'text' (qwen-image-2-pro — best at rendering text in images), 'recraft' (recraft-v4), 'seedream' (seedream-v4), 'grok' (grok-imagine-image), 'art' (imagineart-1.5-pro), 'hunyuan' (hunyuan-image-v3). For flagship Google/OpenAI models use image-generate-ultra. Returns a permanent fal-hosted PNG URL. |
57
+ | `image-generate-ultra` | (0.30 USDC/call) Image generate (ultra) / flagship text-to-image / Google nano-banana-pro (Gemini Image 3) / OpenAI gpt-image-2 / Recraft V4 Pro / xAI Grok SOTA. Top proprietary models for the highest quality output. Tiers: 'nano-banana' (nano-banana-pro, default — Google Gemini Image 3), 'nano-banana-2' (cheaper Google variant), 'gpt' (gpt-image-2 — OpenAI flagship), 'gpt-1-5' (gpt-image-1-5), 'recraft-pro' (recraft-v4-pro), 'grok-sota' (grok-imagine-image-quality). Output is capped to 1024x1024 to keep wholesale within retail; for higher resolution, chain image-upscale. Returns a permanent fal-hosted PNG URL. |
58
+ | `image-inpaint` | (0.02 USDC/call) Image inpainting / mask-based image edit / fill in masked region / object replacement / face swap (mask-driven) / generative fill. Replaces the masked region of an image with content matching a text prompt. White pixels in the mask = region to inpaint. Default model: gpt-image-2. Returns a permanent fal-hosted PNG URL. |
59
+ | `image-to-video` | (0.20 USDC/call) Image-to-video / animate still image / Seedance image-to-video / motion-from-photo / camera-movement on photo. Animates a still image into video via Venice's seedance-2-0-fast-image-to-video. Optional prompt steers the motion (camera moves, subject motion). Same async-vs-sync handling as text-to-video. |
60
+ | `music-generate` | (0.05 USDC/call) Music generation / text-to-music / AI music / generative song / instrumental and vocal music. Text-to-music via Venice with the minimax-music-v26 model. Optional lyrics input. Duration 5-120 seconds. Returns a permanent fal-hosted audio URL (or a Venice-hosted URL when Venice already provides one). |
61
+ | `remove-bg` | (0.08 USDC/call) AI background remover / background eraser / cutout tool. Returns transparent PNG. Optional crop_to_bbox. fal.ai imageutils/rembg. |
62
+ | `seedance-video` | (0.20 USDC/call) Seedance 2.0 / Seedance 2.0 video generation / Seedance video AI / generative AI video / text-to-video AI / cinematic AI clips on AI Gateway. Powered by Venice's seedance-2-0-fast-text-to-video model. Duration / aspect-ratio / resolution configurable. Same backend as text-to-video under a model-named slug for direct discovery by agents searching for 'Seedance'. |
63
+ | `sound-effect-generate` | (0.01 USDC/call) Sound effect generation / text-to-SFX / Foley generator / ElevenLabs sound effects / ambient audio synth. Text-to-SFX via Venice with elevenlabs-sound-effects-v2. Duration 0.5-22 seconds. Returns a permanent fal-hosted audio URL (or Venice-hosted when applicable). |
64
+ | `text-to-speech` | (0.05 USDC/call) Text to speech / TTS / voice generator. Venice TTS (Kokoro / xAI / ElevenLabs / Orpheus / MiniMax / Gemini). 30+ voices, 6 audio formats. Returns hosted MP3 URL. |
65
+ | `text-to-video` | (0.20 USDC/call) Text-to-video / AI video / Seedance / generative video / cinematic clip from prompt. Text-to-video via Venice's seedance-2-0-fast-text-to-video. Duration / aspect-ratio / resolution configurable. The synchronous path has a 22s budget; if Venice can't return inline within that window, the response surfaces a job_id + poll_url for the caller to resolve later. |
66
+ | `voice` | (0.05 USDC/call) Text-to-speech / TTS / voice synthesis. Venice TTS (Kokoro/xAI/ElevenLabs/Orpheus/MiniMax). 30+ voices, MP3/WAV/OPUS/AAC/FLAC. |
67
+
68
+ ## How it works
69
+
70
+ 1. Agent calls a tool (e.g. `image-edit`).
71
+ 2. MCP server POSTs to `https://x402.agentutility.ai/image-edit`.
72
+ 3. The endpoint responds **HTTP 402** with payment instructions.
73
+ 4. The MCP server signs an EIP-3009 USDC transfer authorization with `X402_PRIVATE_KEY` and retries.
74
+ 5. CDP facilitator settles on Base.
75
+ 6. The endpoint returns the actual response.
76
+
77
+ The agent never sees the payment flow — it just gets the result.
78
+
79
+ ## Links
80
+
81
+ - Cluster overview: https://agentutility.ai/synthforge/
82
+ - All MCP packages: https://mcp.agentutility.ai/
83
+ - Source: https://github.com/rooz21/x402/tree/main/packages/mcp-synthforge
84
+
85
+ ---
86
+
87
+ **Version:** 0.1.8 · **License:** MIT
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @agentutility/mcp-<cluster> — stdio MCP server exposing the cluster's
4
+ * x402-paid endpoints as MCP tools. Forwards every CallToolRequest to
5
+ * x402.agentutility.ai, where @x402/fetch handles 402 → payment → retry
6
+ * using the agent's own wallet (X402_PRIVATE_KEY env var).
7
+ *
8
+ * Boilerplate is single-sourced at packages/_template/src/index.ts and
9
+ * copied verbatim into each packages/mcp-<cluster>/src/index.ts by
10
+ * scripts/generate-mcp-clusters.mjs. The codegen also writes a matching
11
+ * tools.generated.ts so this file imports CLUSTER_SLUG + VERSION + TOOLS
12
+ * rather than hard-coding.
13
+ *
14
+ * Required env: X402_PRIVATE_KEY (hex EVM key, USDC on Base).
15
+ * Optional env: X402_BASE_URL (default https://x402.agentutility.ai)
16
+ * X402_RPC_URL (default https://mainnet.base.org)
17
+ */
18
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
19
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
20
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
21
+ import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
22
+ import { ExactEvmScheme, toClientEvmSigner } from "@x402/evm";
23
+ import { privateKeyToAccount } from "viem/accounts";
24
+ import { createPublicClient, http } from "viem";
25
+ import { base } from "viem/chains";
26
+ import { TOOLS, CLUSTER_SLUG, VERSION } from "./tools.generated.js";
27
+ const BASE_URL = (process.env.X402_BASE_URL || "https://x402.agentutility.ai").replace(/\/$/, "");
28
+ const RPC_URL = process.env.X402_RPC_URL || "https://mainnet.base.org";
29
+ const PK = process.env.X402_PRIVATE_KEY;
30
+ if (!PK) {
31
+ console.error(`[@agentutility/mcp-${CLUSTER_SLUG}] FATAL: X402_PRIVATE_KEY env var is required.`);
32
+ console.error("Set it to a hex-encoded EVM private key with USDC balance on Base (chain 8453).");
33
+ console.error("USDC on Base: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
34
+ process.exit(1);
35
+ }
36
+ const account = privateKeyToAccount((PK.startsWith("0x") ? PK : `0x${PK}`));
37
+ const publicClient = createPublicClient({
38
+ chain: base,
39
+ transport: http(RPC_URL),
40
+ });
41
+ const signer = toClientEvmSigner(account, publicClient);
42
+ const client = new x402Client().register("eip155:8453", new ExactEvmScheme(signer));
43
+ const paidFetch = wrapFetchWithPayment(fetch, client);
44
+ async function trackedFetch(url, init) {
45
+ const headers = new Headers(init?.headers);
46
+ headers.set("X-Agent-Channel", `mcp-stdio-${CLUSTER_SLUG}`);
47
+ headers.set("X-Agent-Id", "47167");
48
+ if (!headers.has("User-Agent")) {
49
+ headers.set("User-Agent", `agentutility-mcp/${CLUSTER_SLUG}/${VERSION}`);
50
+ }
51
+ return paidFetch(url, { ...init, headers });
52
+ }
53
+ const server = new Server({ name: `agentutility-${CLUSTER_SLUG}`, version: VERSION }, { capabilities: { tools: {} } });
54
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
55
+ tools: TOOLS.map((t) => ({
56
+ name: t.name,
57
+ description: t.description,
58
+ inputSchema: t.input_schema,
59
+ })),
60
+ }));
61
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
62
+ const name = req.params.name;
63
+ const tool = TOOLS.find((t) => t.name === name);
64
+ if (!tool) {
65
+ return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
66
+ }
67
+ try {
68
+ const res = await trackedFetch(`${BASE_URL}/${tool.http_name}`, {
69
+ method: "POST",
70
+ headers: { "Content-Type": "application/json" },
71
+ body: JSON.stringify(req.params.arguments ?? {}),
72
+ });
73
+ const body = await res.text();
74
+ if (!res.ok) {
75
+ return { content: [{ type: "text", text: `HTTP ${res.status}: ${body}` }], isError: true };
76
+ }
77
+ return { content: [{ type: "text", text: body }] };
78
+ }
79
+ catch (err) {
80
+ return {
81
+ content: [{ type: "text", text: `tool call failed: ${err instanceof Error ? err.message : String(err)}` }],
82
+ isError: true,
83
+ };
84
+ }
85
+ });
86
+ await server.connect(new StdioServerTransport());
@@ -0,0 +1,549 @@
1
+ /** Auto-generated by scripts/generate-mcp-clusters.mjs. Do not edit by hand. */
2
+ export const CLUSTER_SLUG = "synthforge";
3
+ export const VERSION = "0.1.8";
4
+ export const TOOLS = [
5
+ {
6
+ "name": "image-edit",
7
+ "http_name": "image-edit",
8
+ "description": "(0.02 USDC/call) Image edit / instruction-based image edit / text-driven photo edit / nano-banana image editor / GPT-image-2 edit. Mask-free instruction-driven image editing — describe the change in text and the model applies it to the whole image. Default model: nano-banana-pro. Returns a permanent fal-hosted PNG URL.",
9
+ "method": "POST",
10
+ "input_schema": {
11
+ "type": "object",
12
+ "properties": {
13
+ "image_url": {
14
+ "type": "string",
15
+ "description": "Public http(s) URL of the source image."
16
+ },
17
+ "prompt": {
18
+ "type": "string",
19
+ "description": "Edit instructions in plain English."
20
+ },
21
+ "model": {
22
+ "type": "string",
23
+ "description": "Override the model. Default 'nano-banana-pro'."
24
+ }
25
+ },
26
+ "required": [
27
+ "image_url",
28
+ "prompt"
29
+ ]
30
+ }
31
+ },
32
+ {
33
+ "name": "image-expand",
34
+ "http_name": "image-expand",
35
+ "description": "(0.15 USDC/call) AI image outpainting / image expansion. Bria Expand model. Generates realistic content beyond original borders. Set canvas size + original placement. Commercial-license model.",
36
+ "method": "POST",
37
+ "input_schema": {
38
+ "type": "object",
39
+ "properties": {
40
+ "image_url": {
41
+ "type": "string",
42
+ "description": "Public URL of the source image."
43
+ },
44
+ "canvas_width": {
45
+ "type": "number",
46
+ "description": "Final canvas width in pixels (256-4096)."
47
+ },
48
+ "canvas_height": {
49
+ "type": "number",
50
+ "description": "Final canvas height in pixels (256-4096)."
51
+ },
52
+ "original_width": {
53
+ "type": "number",
54
+ "description": "Width to render the original at within the new canvas."
55
+ },
56
+ "original_height": {
57
+ "type": "number",
58
+ "description": "Height to render the original at within the new canvas."
59
+ },
60
+ "original_x": {
61
+ "type": "number",
62
+ "description": "X position of the original (top-left) within the canvas."
63
+ },
64
+ "original_y": {
65
+ "type": "number",
66
+ "description": "Y position of the original (top-left) within the canvas."
67
+ },
68
+ "prompt": {
69
+ "type": "string",
70
+ "description": "Optional guidance for the generated regions."
71
+ },
72
+ "seed": {
73
+ "type": "number",
74
+ "description": "Optional seed for reproducibility (0 to 2^31-1)."
75
+ }
76
+ },
77
+ "required": [
78
+ "image_url",
79
+ "canvas_width",
80
+ "canvas_height"
81
+ ]
82
+ }
83
+ },
84
+ {
85
+ "name": "image-generate",
86
+ "http_name": "image-generate",
87
+ "description": "(0.01 USDC/call) Image generate (fast/cheap) / text-to-image / AI art. SFW, sub-5s turnaround. Four tiers backed by curated $0.01 Venice models: 'fast' (z-image-turbo, default), 'creative' (chroma), 'anime' (wai-Illustrious), 'sd35' (venice-sd35). For top-tier quality use image-generate-pro ($0.10, Flux 2 Pro / Recraft / Seedream / Qwen Image 2 Pro) or image-generate-ultra ($0.30, Google nano-banana-pro / OpenAI gpt-image-2). Returns a permanent fal-hosted PNG URL.",
88
+ "method": "POST",
89
+ "input_schema": {
90
+ "type": "object",
91
+ "properties": {
92
+ "prompt": {
93
+ "type": "string",
94
+ "description": "Image description. Up to 2000 chars."
95
+ },
96
+ "width": {
97
+ "type": "number",
98
+ "description": "Output width in pixels. Range [256, 2048], snapped to multiples of 16. Default 1024."
99
+ },
100
+ "height": {
101
+ "type": "number",
102
+ "description": "Output height in pixels. Range [256, 2048], snapped to multiples of 16. Default 1024."
103
+ },
104
+ "tier": {
105
+ "type": "string",
106
+ "enum": [
107
+ "fast",
108
+ "creative",
109
+ "anime",
110
+ "sd35"
111
+ ],
112
+ "description": "Model shorthand. Default 'fast'."
113
+ },
114
+ "model": {
115
+ "type": "string",
116
+ "description": "Override the model. Must be one of: z-image-turbo, chroma, wai-Illustrious, venice-sd35."
117
+ },
118
+ "steps": {
119
+ "type": "number",
120
+ "description": "Diffusion steps. Optional; depends on model."
121
+ },
122
+ "cfg_scale": {
123
+ "type": "number",
124
+ "description": "Classifier-free guidance scale. Optional."
125
+ },
126
+ "seed": {
127
+ "type": "number",
128
+ "description": "Random seed. Optional."
129
+ },
130
+ "negative_prompt": {
131
+ "type": "string",
132
+ "description": "Negative prompt. Optional."
133
+ }
134
+ },
135
+ "required": [
136
+ "prompt"
137
+ ]
138
+ }
139
+ },
140
+ {
141
+ "name": "image-generate-pro",
142
+ "http_name": "image-generate-pro",
143
+ "description": "(0.10 USDC/call) Image generate (pro) / premium text-to-image / Flux 2 Pro / Recraft / Seedream / Qwen Image 2 Pro / xAI Grok Imagine. Premium multi-model lineup for photoreal, design/illustration, text-in-image, and stylized art. Tiers: 'balanced' (flux-2-pro, default), 'max' (flux-2-max), 'text' (qwen-image-2-pro — best at rendering text in images), 'recraft' (recraft-v4), 'seedream' (seedream-v4), 'grok' (grok-imagine-image), 'art' (imagineart-1.5-pro), 'hunyuan' (hunyuan-image-v3). For flagship Google/OpenAI models use image-generate-ultra. Returns a permanent fal-hosted PNG URL.",
144
+ "method": "POST",
145
+ "input_schema": {
146
+ "type": "object",
147
+ "properties": {
148
+ "prompt": {
149
+ "type": "string",
150
+ "description": "Image description. Up to 3000 chars."
151
+ },
152
+ "width": {
153
+ "type": "number",
154
+ "description": "Output width in pixels. Range [256, 2048]. Default 1024."
155
+ },
156
+ "height": {
157
+ "type": "number",
158
+ "description": "Output height in pixels. Range [256, 2048]. Default 1024."
159
+ },
160
+ "tier": {
161
+ "type": "string",
162
+ "enum": [
163
+ "balanced",
164
+ "max",
165
+ "text",
166
+ "recraft",
167
+ "seedream",
168
+ "grok",
169
+ "art",
170
+ "hunyuan"
171
+ ],
172
+ "description": "Model shorthand. balanced=flux-2-pro (default), max=flux-2-max, text=qwen-image-2-pro, recraft=recraft-v4, seedream=seedream-v4, grok=grok-imagine-image, art=imagineart-1.5-pro, hunyuan=hunyuan-image-v3."
173
+ },
174
+ "model": {
175
+ "type": "string",
176
+ "description": "Override the model. Allowed: flux-2-pro, flux-2-max, qwen-image-2-pro, qwen-image-2, recraft-v4, seedream-v4, seedream-v5-lite, grok-imagine-image, imagineart-1.5-pro, hunyuan-image-v3, wan-2-7-text-to-image."
177
+ },
178
+ "steps": {
179
+ "type": "number",
180
+ "description": "Diffusion steps. Optional; depends on model."
181
+ },
182
+ "cfg_scale": {
183
+ "type": "number",
184
+ "description": "Classifier-free guidance scale. Optional."
185
+ },
186
+ "seed": {
187
+ "type": "number",
188
+ "description": "Random seed. Optional."
189
+ },
190
+ "negative_prompt": {
191
+ "type": "string",
192
+ "description": "Negative prompt. Optional."
193
+ }
194
+ },
195
+ "required": [
196
+ "prompt"
197
+ ]
198
+ }
199
+ },
200
+ {
201
+ "name": "image-generate-ultra",
202
+ "http_name": "image-generate-ultra",
203
+ "description": "(0.30 USDC/call) Image generate (ultra) / flagship text-to-image / Google nano-banana-pro (Gemini Image 3) / OpenAI gpt-image-2 / Recraft V4 Pro / xAI Grok SOTA. Top proprietary models for the highest quality output. Tiers: 'nano-banana' (nano-banana-pro, default — Google Gemini Image 3), 'nano-banana-2' (cheaper Google variant), 'gpt' (gpt-image-2 — OpenAI flagship), 'gpt-1-5' (gpt-image-1-5), 'recraft-pro' (recraft-v4-pro), 'grok-sota' (grok-imagine-image-quality). Output is capped to 1024x1024 to keep wholesale within retail; for higher resolution, chain image-upscale. Returns a permanent fal-hosted PNG URL.",
204
+ "method": "POST",
205
+ "input_schema": {
206
+ "type": "object",
207
+ "properties": {
208
+ "prompt": {
209
+ "type": "string",
210
+ "description": "Image description. Up to 5000 chars."
211
+ },
212
+ "width": {
213
+ "type": "number",
214
+ "description": "Output width in pixels. Range [256, 1024]. Default 1024."
215
+ },
216
+ "height": {
217
+ "type": "number",
218
+ "description": "Output height in pixels. Range [256, 1024]. Default 1024."
219
+ },
220
+ "tier": {
221
+ "type": "string",
222
+ "enum": [
223
+ "nano-banana",
224
+ "nano-banana-2",
225
+ "gpt",
226
+ "gpt-1-5",
227
+ "recraft-pro",
228
+ "grok-sota"
229
+ ],
230
+ "description": "Model shorthand. nano-banana=nano-banana-pro (default), nano-banana-2=nano-banana-2, gpt=gpt-image-2, gpt-1-5=gpt-image-1-5, recraft-pro=recraft-v4-pro, grok-sota=grok-imagine-image-quality."
231
+ },
232
+ "model": {
233
+ "type": "string",
234
+ "description": "Override the model. Allowed: nano-banana-pro, nano-banana-2, gpt-image-2, gpt-image-1-5, recraft-v4-pro, grok-imagine-image-quality."
235
+ },
236
+ "steps": {
237
+ "type": "number",
238
+ "description": "Diffusion steps. Optional; depends on model."
239
+ },
240
+ "cfg_scale": {
241
+ "type": "number",
242
+ "description": "Classifier-free guidance scale. Optional."
243
+ },
244
+ "seed": {
245
+ "type": "number",
246
+ "description": "Random seed. Optional."
247
+ },
248
+ "negative_prompt": {
249
+ "type": "string",
250
+ "description": "Negative prompt. Optional."
251
+ }
252
+ },
253
+ "required": [
254
+ "prompt"
255
+ ]
256
+ }
257
+ },
258
+ {
259
+ "name": "image-inpaint",
260
+ "http_name": "image-inpaint",
261
+ "description": "(0.02 USDC/call) Image inpainting / mask-based image edit / fill in masked region / object replacement / face swap (mask-driven) / generative fill. Replaces the masked region of an image with content matching a text prompt. White pixels in the mask = region to inpaint. Default model: gpt-image-2. Returns a permanent fal-hosted PNG URL.",
262
+ "method": "POST",
263
+ "input_schema": {
264
+ "type": "object",
265
+ "properties": {
266
+ "image_url": {
267
+ "type": "string",
268
+ "description": "Public http(s) URL of the source image."
269
+ },
270
+ "mask_url": {
271
+ "type": "string",
272
+ "description": "Public http(s) URL of the mask image (white = inpaint region; black = keep)."
273
+ },
274
+ "prompt": {
275
+ "type": "string",
276
+ "description": "What to fill the masked region with."
277
+ },
278
+ "model": {
279
+ "type": "string",
280
+ "description": "Override the inpaint model. Default 'gpt-image-2'."
281
+ }
282
+ },
283
+ "required": [
284
+ "image_url",
285
+ "mask_url",
286
+ "prompt"
287
+ ]
288
+ }
289
+ },
290
+ {
291
+ "name": "image-to-video",
292
+ "http_name": "image-to-video",
293
+ "description": "(0.20 USDC/call) Image-to-video / animate still image / Seedance image-to-video / motion-from-photo / camera-movement on photo. Animates a still image into video via Venice's seedance-2-0-fast-image-to-video. Optional prompt steers the motion (camera moves, subject motion). Same async-vs-sync handling as text-to-video.",
294
+ "method": "POST",
295
+ "input_schema": {
296
+ "type": "object",
297
+ "properties": {
298
+ "image_url": {
299
+ "type": "string",
300
+ "description": "Public http(s) URL of the source image."
301
+ },
302
+ "prompt": {
303
+ "type": "string",
304
+ "description": "Optional motion description (e.g. 'camera slowly zooms in')."
305
+ },
306
+ "duration": {
307
+ "type": "string",
308
+ "description": "Clip length. Default '5s'."
309
+ },
310
+ "aspect_ratio": {
311
+ "type": "string",
312
+ "description": "Aspect ratio. Default '16:9'."
313
+ },
314
+ "resolution": {
315
+ "type": "string",
316
+ "description": "Resolution. Default '720p'."
317
+ },
318
+ "model": {
319
+ "type": "string",
320
+ "description": "Override the model. Default 'seedance-2-0-fast-image-to-video'."
321
+ }
322
+ },
323
+ "required": [
324
+ "image_url"
325
+ ]
326
+ }
327
+ },
328
+ {
329
+ "name": "music-generate",
330
+ "http_name": "music-generate",
331
+ "description": "(0.05 USDC/call) Music generation / text-to-music / AI music / generative song / instrumental and vocal music. Text-to-music via Venice with the minimax-music-v26 model. Optional lyrics input. Duration 5-120 seconds. Returns a permanent fal-hosted audio URL (or a Venice-hosted URL when Venice already provides one).",
332
+ "method": "POST",
333
+ "input_schema": {
334
+ "type": "object",
335
+ "properties": {
336
+ "prompt": {
337
+ "type": "string",
338
+ "description": "Genre / mood / instrumentation description."
339
+ },
340
+ "duration_seconds": {
341
+ "type": "number",
342
+ "description": "Length in seconds. Range [5, 120]. Default 30."
343
+ },
344
+ "lyrics": {
345
+ "type": "string",
346
+ "description": "Optional lyrics. The model will sing them."
347
+ },
348
+ "model": {
349
+ "type": "string",
350
+ "description": "Override the model. Default 'minimax-music-v26'."
351
+ }
352
+ },
353
+ "required": [
354
+ "prompt"
355
+ ]
356
+ }
357
+ },
358
+ {
359
+ "name": "remove-bg",
360
+ "http_name": "remove-bg",
361
+ "description": "(0.08 USDC/call) AI background remover / background eraser / cutout tool. Returns transparent PNG. Optional crop_to_bbox. fal.ai imageutils/rembg.",
362
+ "method": "POST",
363
+ "input_schema": {
364
+ "type": "object",
365
+ "properties": {
366
+ "image_url": {
367
+ "type": "string",
368
+ "description": "Source image URL to remove the background from; returns a transparent PNG cutout of the foreground subject."
369
+ },
370
+ "crop_to_bbox": {
371
+ "type": "boolean",
372
+ "description": "Default false."
373
+ }
374
+ },
375
+ "required": [
376
+ "image_url"
377
+ ]
378
+ }
379
+ },
380
+ {
381
+ "name": "seedance-video",
382
+ "http_name": "seedance-video",
383
+ "description": "(0.20 USDC/call) Seedance 2.0 / Seedance 2.0 video generation / Seedance video AI / generative AI video / text-to-video AI / cinematic AI clips on AI Gateway. Powered by Venice's seedance-2-0-fast-text-to-video model. Duration / aspect-ratio / resolution configurable. Same backend as text-to-video under a model-named slug for direct discovery by agents searching for 'Seedance'.",
384
+ "method": "POST",
385
+ "input_schema": {
386
+ "type": "object",
387
+ "properties": {
388
+ "prompt": {
389
+ "type": "string",
390
+ "description": "Video scene description."
391
+ },
392
+ "duration": {
393
+ "type": "string",
394
+ "description": "Clip length, e.g. '5s' or '10s'. Default '5s'."
395
+ },
396
+ "aspect_ratio": {
397
+ "type": "string",
398
+ "description": "Aspect ratio: '16:9', '9:16', '1:1', '4:3'. Default '16:9'."
399
+ },
400
+ "resolution": {
401
+ "type": "string",
402
+ "description": "Video resolution: '720p', '480p'. Default '720p'."
403
+ },
404
+ "model": {
405
+ "type": "string",
406
+ "description": "Override the model. Default 'seedance-2-0-fast-text-to-video'."
407
+ }
408
+ },
409
+ "required": [
410
+ "prompt"
411
+ ]
412
+ }
413
+ },
414
+ {
415
+ "name": "sound-effect-generate",
416
+ "http_name": "sound-effect-generate",
417
+ "description": "(0.01 USDC/call) Sound effect generation / text-to-SFX / Foley generator / ElevenLabs sound effects / ambient audio synth. Text-to-SFX via Venice with elevenlabs-sound-effects-v2. Duration 0.5-22 seconds. Returns a permanent fal-hosted audio URL (or Venice-hosted when applicable).",
418
+ "method": "POST",
419
+ "input_schema": {
420
+ "type": "object",
421
+ "properties": {
422
+ "prompt": {
423
+ "type": "string",
424
+ "description": "Sound description."
425
+ },
426
+ "duration_seconds": {
427
+ "type": "number",
428
+ "description": "Length in seconds. Range [0.5, 22]. Default 5."
429
+ },
430
+ "model": {
431
+ "type": "string",
432
+ "description": "Override the model. Default 'elevenlabs-sound-effects-v2'."
433
+ }
434
+ },
435
+ "required": [
436
+ "prompt"
437
+ ]
438
+ }
439
+ },
440
+ {
441
+ "name": "text-to-speech",
442
+ "http_name": "text-to-speech",
443
+ "description": "(0.05 USDC/call) Text to speech / TTS / voice generator. Venice TTS (Kokoro / xAI / ElevenLabs / Orpheus / MiniMax / Gemini). 30+ voices, 6 audio formats. Returns hosted MP3 URL.",
444
+ "method": "POST",
445
+ "input_schema": {
446
+ "type": "object",
447
+ "properties": {
448
+ "text": {
449
+ "type": "string",
450
+ "description": "Max 4000 chars."
451
+ },
452
+ "voice": {
453
+ "type": "string",
454
+ "description": "Default 'af_sky'."
455
+ },
456
+ "model": {
457
+ "type": "string",
458
+ "description": "Default 'tts-kokoro'. Other options: tts-xai-v1, tts-elevenlabs-turbo-v2-5, tts-orpheus, etc."
459
+ },
460
+ "speed": {
461
+ "type": "number",
462
+ "description": "0.25-4. Default 1."
463
+ },
464
+ "format": {
465
+ "type": "string",
466
+ "enum": [
467
+ "mp3",
468
+ "wav",
469
+ "opus",
470
+ "aac",
471
+ "flac"
472
+ ],
473
+ "description": "mp3 (default), wav, opus, aac, flac."
474
+ }
475
+ },
476
+ "required": [
477
+ "text"
478
+ ]
479
+ }
480
+ },
481
+ {
482
+ "name": "text-to-video",
483
+ "http_name": "text-to-video",
484
+ "description": "(0.20 USDC/call) Text-to-video / AI video / Seedance / generative video / cinematic clip from prompt. Text-to-video via Venice's seedance-2-0-fast-text-to-video. Duration / aspect-ratio / resolution configurable. The synchronous path has a 22s budget; if Venice can't return inline within that window, the response surfaces a job_id + poll_url for the caller to resolve later.",
485
+ "method": "POST",
486
+ "input_schema": {
487
+ "type": "object",
488
+ "properties": {
489
+ "prompt": {
490
+ "type": "string",
491
+ "description": "Video scene description."
492
+ },
493
+ "duration": {
494
+ "type": "string",
495
+ "description": "Clip length, e.g. '5s' or '10s'. Default '5s'."
496
+ },
497
+ "aspect_ratio": {
498
+ "type": "string",
499
+ "description": "Aspect ratio: '16:9', '9:16', '1:1', '4:3'. Default '16:9'."
500
+ },
501
+ "resolution": {
502
+ "type": "string",
503
+ "description": "Video resolution: '720p', '480p'. Default '720p'."
504
+ },
505
+ "model": {
506
+ "type": "string",
507
+ "description": "Override the model. Default 'seedance-2-0-fast-text-to-video'."
508
+ }
509
+ },
510
+ "required": [
511
+ "prompt"
512
+ ]
513
+ }
514
+ },
515
+ {
516
+ "name": "voice",
517
+ "http_name": "voice",
518
+ "description": "(0.05 USDC/call) Text-to-speech / TTS / voice synthesis. Venice TTS (Kokoro/xAI/ElevenLabs/Orpheus/MiniMax). 30+ voices, MP3/WAV/OPUS/AAC/FLAC.",
519
+ "method": "POST",
520
+ "input_schema": {
521
+ "type": "object",
522
+ "properties": {
523
+ "text": {
524
+ "type": "string",
525
+ "description": "Max 4000 chars."
526
+ },
527
+ "voice": {
528
+ "type": "string",
529
+ "description": "Default 'af_sky'."
530
+ },
531
+ "model": {
532
+ "type": "string",
533
+ "description": "Default 'tts-kokoro'. Other options: tts-xai-v1, tts-elevenlabs-turbo-v2-5, tts-orpheus, etc."
534
+ },
535
+ "speed": {
536
+ "type": "number",
537
+ "description": "0.25-4. Default 1."
538
+ },
539
+ "format": {
540
+ "type": "string",
541
+ "description": "mp3 (default), wav, opus, aac, flac."
542
+ }
543
+ },
544
+ "required": [
545
+ "text"
546
+ ]
547
+ }
548
+ }
549
+ ];
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@agentutility/mcp-synthforge",
3
+ "version": "0.1.8",
4
+ "description": "MCP server for the @agentutility synthforge cluster — pay-per-call x402 tools, no API keys, USDC on Base.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "bin": {
9
+ "agentutility-mcp-synthforge": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/rooz21/x402",
18
+ "directory": "packages/mcp-synthforge"
19
+ },
20
+ "homepage": "https://mcp.agentutility.ai/synthforge/",
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "model-context-protocol",
28
+ "x402",
29
+ "agentutility",
30
+ "agent-tools",
31
+ "synthforge"
32
+ ],
33
+ "dependencies": {
34
+ "@modelcontextprotocol/sdk": "^1.0.4",
35
+ "@x402/fetch": "^2.12.0",
36
+ "@x402/evm": "^2.12.0",
37
+ "viem": "^2.21.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^22.0.0",
41
+ "typescript": "^5.5.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=18"
45
+ }
46
+ }