images
Generate an image from a text prompt. Choose aspect ratio: 1:1, 16:9, 9:16, or 4:3.
Instructions
Generate an image from a text prompt. Cost: 3 credits.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | Text description of the image to generate | |
| aspect_ratio | No | 1:1, 16:9, 9:16, or 4:3 | 1:1 |
Implementation Reference
- src/index.ts:74-81 (schema)Schema definition for the 'images' tool, defining its name, description, and input schema (prompt and optional aspect_ratio) as part of CAPABILITIES array.
{ name: "images", description: "Generate an image from a text prompt. Cost: 3 credits.", inputSchema: { prompt: z.string().describe("Text description of the image to generate"), aspect_ratio: z.string().optional().default("1:1").describe("1:1, 16:9, 9:16, or 4:3"), }, }, - src/index.ts:246-259 (registration)Registration loop that iterates over CAPABILITIES (including 'images') and registers each as an MCP tool via server.registerTool().
// Register each capability as an MCP tool for (const cap of CAPABILITIES) { // Cast inputSchema to avoid TS2589 (excessively deep type instantiation from Zod chains) server.registerTool( cap.name, { description: cap.description, inputSchema: cap.inputSchema as any, }, async (args: any): Promise<CallToolResult> => { return callSuprsonic(cap.name, args as Record<string, unknown>); }, ); } - src/index.ts:255-257 (handler)The handler function (async callback) for all tools including 'images'. Calls callSuprsonic(cap.name, args) to dispatch the request.
async (args: any): Promise<CallToolResult> => { return callSuprsonic(cap.name, args as Record<string, unknown>); }, - src/index.ts:183-233 (helper)Helper function callSuprsonic that makes HTTP requests to the Suprsonic REST API with the capability name and params. Used by all tool handlers including 'images'.
async function callSuprsonic(capability: string, params: Record<string, unknown>): Promise<CallToolResult> { if (!API_KEY) { return { content: [{ type: "text", text: "Error: SUPRSONIC_API_KEY environment variable is not set. Get your key at https://suprsonic.ai/app/apis" }], isError: true, }; } try { const resp = await fetch(`${BASE_URL}/v1/agent`, { method: "POST", headers: { "Authorization": `Bearer ${API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ capability, params }), }); const result = await resp.json() as any; // Handle non-envelope responses (401, 429, etc. return {"detail": ...}) if (result.detail && result.success === undefined) { const msg = typeof result.detail === "object" ? (result.detail.title || result.detail.detail || JSON.stringify(result.detail)) : String(result.detail); return { content: [{ type: "text", text: `Error (HTTP ${resp.status}): ${msg}` }], isError: true, }; } if (!result.success) { const errMsg = result.error?.detail || result.error?.title || "Request failed"; return { content: [{ type: "text", text: `Error: ${errMsg}` }], isError: true, }; } const text = JSON.stringify(result.data, null, 2); const meta = result.metadata ? `\n\n[Provider: ${(result.metadata as any).provider_used || "unknown"}, ${(result.metadata as any).response_time_ms || 0}ms, ${result.credits_used || 0} credits]` : ""; return { content: [{ type: "text", text: text + meta }], }; } catch (err) { return { content: [{ type: "text", text: `Network error: ${err instanceof Error ? err.message : String(err)}` }], isError: true, }; }