corent-mcp 0.4.1 → 0.5.0
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/dist/server.js +32 -5
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared Corent MCP server definition — the
|
|
2
|
+
* Shared Corent MCP server definition — the 8 tools, used by both the
|
|
3
3
|
* stdio entrypoint (index.ts, for local `npx` use) and the hosted HTTP
|
|
4
4
|
* entrypoint (http.ts). Keeping the tools in one place means the two
|
|
5
5
|
* transports can never drift apart.
|
|
@@ -17,7 +17,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
17
17
|
import { z } from "zod";
|
|
18
18
|
import { MEDIA_WIDGET_HTML } from "./widget-html.js";
|
|
19
19
|
export const DEFAULT_API_URL = "https://api.corent.tech";
|
|
20
|
-
export const SERVER_VERSION = "0.
|
|
20
|
+
export const SERVER_VERSION = "0.5.0";
|
|
21
21
|
// --- MCP Apps (SEP-1865): the media tools render an inline widget in hosts
|
|
22
22
|
// that support it (claude.ai web/desktop, others). Hosts without the extension
|
|
23
23
|
// ignore the _meta and fall back to plain text results, so this is additive.
|
|
@@ -209,13 +209,40 @@ export function createCorentServer(config = {}) {
|
|
|
209
209
|
preference: z.enum(["fast", "cheap", "quality", "balanced"]).default("balanced"),
|
|
210
210
|
aspect_ratio: z.enum(["16:9", "9:16", "1:1"]).default("16:9"),
|
|
211
211
|
duration_s: z.number().int().min(1).max(30).optional().describe("Requested duration in seconds"),
|
|
212
|
+
resolution: z
|
|
213
|
+
.enum(["720p", "1080p", "4k"])
|
|
214
|
+
.optional()
|
|
215
|
+
.describe("Pixel resolution (default 720p). Tier-capped: pro allows up to 1080p, max_pro up to 4k; above the tier's cap it is clamped down, never rejected. Higher resolutions cost more (1080p ~2.5x, 4k ~5.5x). GET /v1/tiers lists each tier's menu with prices."),
|
|
212
216
|
image_url: z.string().url().optional().describe("If set, animates this image instead of pure text-to-video"),
|
|
213
217
|
},
|
|
214
218
|
outputSchema: jobOutput,
|
|
215
219
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
216
|
-
}, wrap(async ({ prompt, tier, preference, aspect_ratio, duration_s, image_url }) => corent("/v1/videos/generate", {
|
|
220
|
+
}, wrap(async ({ prompt, tier, preference, aspect_ratio, duration_s, resolution, image_url }) => corent("/v1/videos/generate", {
|
|
221
|
+
method: "POST",
|
|
222
|
+
body: JSON.stringify({ prompt, tier, preference, aspect_ratio, duration_s, resolution, image_url }),
|
|
223
|
+
})));
|
|
224
|
+
server.registerTool("generate_speech", {
|
|
225
|
+
title: "Generate speech (voice)",
|
|
226
|
+
description: "Generate spoken audio (text to speech) from text. Synchronous: returns the finished audio URL and the exact charge. Billed per 1,000 characters of input text (a few cents for a short narration). Failed generations are never billed.",
|
|
227
|
+
inputSchema: {
|
|
228
|
+
text: z.string().min(1).max(5000).describe("The text to speak, max 5000 characters"),
|
|
229
|
+
voice_id: z
|
|
230
|
+
.string()
|
|
231
|
+
.regex(/^[A-Za-z0-9]{8,64}$/)
|
|
232
|
+
.optional()
|
|
233
|
+
.describe("Optional provider voice id; omit for the default narration voice"),
|
|
234
|
+
},
|
|
235
|
+
outputSchema: {
|
|
236
|
+
id: z.string().optional(),
|
|
237
|
+
status: z.string().optional(),
|
|
238
|
+
audio_url: z.string().optional(),
|
|
239
|
+
meta: mediaMeta.optional(),
|
|
240
|
+
error: z.string().optional(),
|
|
241
|
+
},
|
|
242
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
243
|
+
}, wrap(async ({ text, voice_id }) => corent("/v1/audio/speech", {
|
|
217
244
|
method: "POST",
|
|
218
|
-
body: JSON.stringify({
|
|
245
|
+
body: JSON.stringify({ text, voice_id }),
|
|
219
246
|
})));
|
|
220
247
|
server.registerTool("get_job", {
|
|
221
248
|
title: "Check job status",
|
|
@@ -244,7 +271,7 @@ export function createCorentServer(config = {}) {
|
|
|
244
271
|
// prompt. The agent never picks a model or tier. ---
|
|
245
272
|
server.registerTool("plan", {
|
|
246
273
|
title: "Plan (cost preview, no generation)",
|
|
247
|
-
description: "Preview how Corent would handle a plain-language request WITHOUT generating anything (costs a fraction of a cent). Corent decides whether it's an image or video, which tier, aspect ratio, and duration, and returns the plan plus an estimated cost. Use this to decide or confirm cost before spending. If the request is something Corent can't generate (
|
|
274
|
+
description: "Preview how Corent would handle a plain-language request WITHOUT generating anything (costs a fraction of a cent). Corent decides whether it's an image or video, which tier, aspect ratio, and duration, and returns the plan plus an estimated cost. Use this to decide or confirm cost before spending. The planner covers image and video; for spoken audio call generate_speech directly. If the request is something Corent can't generate (text documents, 3D, editing, real-world actions), can_fulfill is false with a reason.",
|
|
248
275
|
inputSchema: {
|
|
249
276
|
intent: z
|
|
250
277
|
.string()
|
package/package.json
CHANGED