🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@runapi.ai/mcp

Package Overview
Dependencies
Maintainers
1
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@runapi.ai/mcp - npm Package Compare versions

Comparing version
0.3.0
to
0.5.0
+35
dist/src/business-tools.d.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { Contract, PollingOptions, PricingConfig, RunApiPromptsResponse, RunApiTaskResponse, SearchPromptsParams } from "@runapi.ai/mcp-core/web";
export { errorFromResponse, PollTimeoutError, taskStatus } from "@runapi.ai/mcp-core/web";
export type BusinessToolClient = {
listModels(): Promise<unknown>;
searchPrompts(params?: SearchPromptsParams): Promise<RunApiPromptsResponse>;
balance(): Promise<unknown>;
createTask(service: string, action: string, params: Record<string, unknown>, idempotencyKey: string): Promise<RunApiTaskResponse>;
getTask(service: string, taskId: string, action?: string): Promise<RunApiTaskResponse>;
pollTask(service: string, taskId: string, action?: string, options?: PollingOptions): Promise<RunApiTaskResponse>;
};
export type DiscoveryToolClient = Pick<BusinessToolClient, "listModels" | "searchPrompts">;
export type DiscoveryServerOptions = {
name: string;
version: string;
instructions?: string;
contract: Contract;
pricing: PricingConfig;
client: DiscoveryToolClient;
errorFormatter?: (error: unknown) => string;
};
export type BusinessServerOptions = Omit<DiscoveryServerOptions, "client"> & {
client: BusinessToolClient;
};
export type DiscoveryToolDependencies = {
contract: Contract;
pricing: PricingConfig;
client: DiscoveryToolClient;
errorFormatter: (error: unknown) => string;
};
export type BusinessToolDependencies = Omit<DiscoveryToolDependencies, "client"> & {
client: BusinessToolClient;
};
export declare function createDiscoveryServer(options: DiscoveryServerOptions): McpServer;
export declare function createBusinessServer(options: BusinessServerOptions): McpServer;
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { friendlyError } from "@runapi.ai/mcp-core/web";
import { registerAuthenticatedTools } from "./tools/authenticated.js";
import { registerCatalogTools } from "./tools/catalog.js";
export { errorFromResponse, PollTimeoutError, taskStatus } from "@runapi.ai/mcp-core/web";
export function createDiscoveryServer(options) {
const server = new McpServer({
name: options.name,
version: options.version
}, {
instructions: options.instructions,
capabilities: {
tools: {},
logging: {}
}
});
const dependencies = {
contract: options.contract,
pricing: options.pricing,
client: options.client,
errorFormatter: options.errorFormatter ?? hostedError
};
registerCatalogTools(server, dependencies);
return server;
}
export function createBusinessServer(options) {
const server = createDiscoveryServer(options);
const dependencies = {
contract: options.contract,
pricing: options.pricing,
client: options.client,
errorFormatter: options.errorFormatter ?? hostedError
};
registerAuthenticatedTools(server, dependencies);
return server;
}
function hostedError(error) {
return friendlyError(error, {
authentication: "RunAPI could not authenticate the credentials attached to this MCP request. Verify them, then retry."
});
}
//# sourceMappingURL=business-tools.js.map
{"version":3,"file":"business-tools.js","sourceRoot":"","sources":["../../src/business-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AA2C1F,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,EACD;QACE,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,MAAM,YAAY,GAA8B;QAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,WAAW;KACtD,CAAC;IAEF,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,YAAY,GAA6B;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,WAAW;KACtD,CAAC;IAEF,0BAA0B,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEjD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,aAAa,CAAC,KAAK,EAAE;QAC1B,cAAc,EAAE,sGAAsG;KACvH,CAAC,CAAC;AACL,CAAC"}
{
"service": "flux-kontext",
"action": "text_to_image",
"model": "flux-kontext-pro",
"params": {
"prompt": "A studio product photo on a neutral background"
},
"idempotency_key": "opaque-logical-task-1",
"wait": false
}
+13
-0
# Changelog
## [v0.5.0](https://github.com/runapi-ai/mcp/releases/tag/v0.5.0) - 2026-07-23
### Breaking
- Require a caller-generated idempotency_key on every create_task call and preserve it as the RunAPI Idempotency-Key header.
Migration: Generate one opaque key per logical task and reuse it only with identical input when retrying an unknown create result.
### Added
- Let Hosted MCP sessions check balance, create tasks without waiting, and query task status through request-scoped credentials.
### Fixed
- Preserve the created task ID and current status when optional polling times out or disconnects so callers can continue with get_task without recreating the task.
## [v0.3.0](https://github.com/runapi-ai/mcp/releases/tag/v0.3.0) - 2026-07-22

@@ -4,0 +17,0 @@

+130
-30

@@ -9,4 +9,46 @@ {

},
"fuzz-2.0-pro/text_to_music": {
"unit_price_cents": 17
},
"fuzz-2.0-pro/text_to_music_query": {
"unit_price_cents": 0
},
"fuzz-2.0-raw/text_to_music": {
"unit_price_cents": 17
},
"fuzz-2.0-raw/text_to_music_query": {
"unit_price_cents": 0
},
"fuzz-1.1-pro/text_to_music": {
"unit_price_cents": 17
},
"fuzz-1.1-pro/text_to_music_query": {
"unit_price_cents": 0
},
"fuzz-1.0-pro/text_to_music": {
"unit_price_cents": 17
},
"fuzz-1.0-pro/text_to_music_query": {
"unit_price_cents": 0
},
"fuzz-1.0/text_to_music": {
"unit_price_cents": 17
},
"fuzz-1.0/text_to_music_query": {
"unit_price_cents": 0
},
"fuzz-1.1/text_to_music": {
"unit_price_cents": 17
},
"fuzz-1.1/text_to_music_query": {
"unit_price_cents": 0
},
"fuzz-0.8/text_to_music": {
"unit_price_cents": 17
},
"fuzz-0.8/text_to_music_query": {
"unit_price_cents": 0
},
"midjourney-v8.1/text_to_image": {
"unit_price_cents": 6
"unit_price_cents": 7
},

@@ -413,10 +455,3 @@ "midjourney-edit-image/edit_image": {

"grok-imagine-video-1.5-preview/image_to_video": {
"unit_price_cents": 2,
"billing_config": {
"key": "output_resolution",
"overrides": {
"480p": 1.6,
"720p": 3
}
}
"unit_price_cents": 3
},

@@ -647,3 +682,3 @@ "grok-imagine-video-1.5-fast/text_to_video": {

"nano-banana-2-lite/edit_image": {
"unit_price_cents": 3
"unit_price_cents": 4
},

@@ -832,2 +867,22 @@ "nano-banana-2/text_to_image": {

},
"kling-v2.5-turbo-text-to-video-pro/extend_video": {
"unit_price_cents": 9,
"billing_config": {
"key": "mode",
"overrides": {
"std": 4.2,
"pro": 8.4
}
}
},
"kling-v2.5-turbo-image-to-video-pro/extend_video": {
"unit_price_cents": 9,
"billing_config": {
"key": "mode",
"overrides": {
"std": 4.2,
"pro": 8.4
}
}
},
"kling-v2.6/text_to_video": {

@@ -869,2 +924,48 @@ "unit_price_cents": 40,

},
"kling-v3-omni/text_to_video": {
"unit_price_cents": 120,
"billing_config": {
"keys": [
"output_resolution",
"enable_sound"
],
"matrix": {
"720p": {
"false": 24,
"true": 32
},
"1080p": {
"false": 32,
"true": 40
},
"4k": {
"false": 119.5,
"true": 119.5
}
}
}
},
"kling-v3-omni/image_to_video": {
"unit_price_cents": 120,
"billing_config": {
"keys": [
"output_resolution",
"enable_sound"
],
"matrix": {
"720p": {
"false": 24,
"true": 32
},
"1080p": {
"false": 32,
"true": 40
},
"4k": {
"false": 119.5,
"true": 119.5
}
}
}
},
"kling-v3-turbo-text-to-video/text_to_video": {

@@ -1065,6 +1166,6 @@ "unit_price_cents": 18,

"s1/text_to_speech": {
"unit_price_cents": 2
"unit_price_cents": 4
},
"s2-pro/text_to_speech": {
"unit_price_cents": 2
"unit_price_cents": 4
},

@@ -1088,10 +1189,3 @@ "tts-1/text_to_speech": {

"gpt-image-1.5/edit_image": {
"unit_price_cents": 4,
"billing_config": {
"key": "quality",
"overrides": {
"medium": 4,
"high": 22
}
}
"unit_price_cents": 22
},

@@ -1110,11 +1204,3 @@ "gpt-image-2/text_to_image": {

"gpt-image-2/edit_image": {
"unit_price_cents": 6,
"billing_config": {
"key": "output_resolution",
"overrides": {
"1k": 6,
"2k": 10,
"4k": 16
}
}
"unit_price_cents": 16
},

@@ -1185,5 +1271,7 @@ "gpt-4o-image/text_to_image": {

"glm-5.1/chat_completion": {},
"kimi-k2.7-code/chat_completion": {},
"glm-5.2/chat_completion": {},
"kimi-k2.5/chat_completion": {},
"kimi-k2.6/chat_completion": {},
"kimi-k2.7-code/chat_completion": {},
"kimi-k3/chat_completion": {},
"MiniMax-M2/chat_completion": {},

@@ -1720,5 +1808,11 @@ "MiniMax-M2.1/chat_completion": {},

},
"kling-v2.5-turbo-image-to-video-pro/extend_video_query": {
"unit_price_cents": 0
},
"kling-v2.5-turbo-text-to-video-pro/text_to_video_query": {
"unit_price_cents": 0
},
"kling-v2.5-turbo-text-to-video-pro/extend_video_query": {
"unit_price_cents": 0
},
"kling-v2.6/image_to_video_query": {

@@ -1730,2 +1824,8 @@ "unit_price_cents": 0

},
"kling-v3-omni/image_to_video_query": {
"unit_price_cents": 0
},
"kling-v3-omni/text_to_video_query": {
"unit_price_cents": 0
},
"kling-v3-turbo-image-to-video/image_to_video_query": {

@@ -1732,0 +1832,0 @@ "unit_price_cents": 0

+2
-2
export declare const PACKAGE_NAME = "@runapi.ai/mcp";
export declare const PACKAGE_VERSION = "0.3.0";
export declare const USER_AGENT = "@runapi.ai/mcp/0.3.0";
export declare const PACKAGE_VERSION = "0.5.0";
export declare const USER_AGENT = "@runapi.ai/mcp/0.5.0";
export const PACKAGE_NAME = "@runapi.ai/mcp";
export const PACKAGE_VERSION = "0.3.0";
export const PACKAGE_VERSION = "0.5.0";
export const USER_AGENT = `${PACKAGE_NAME}/${PACKAGE_VERSION}`;
//# sourceMappingURL=constants.js.map

@@ -1,1 +0,1 @@

export { errorFromResponse, friendlyError, PollTimeoutError, RunApiClientError } from "@runapi.ai/mcp-core";
export { errorFromResponse, friendlyError, PollTimeoutError, RunApiClientError } from "@runapi.ai/mcp-core/web";

@@ -1,2 +0,2 @@

export { errorFromResponse, friendlyError, PollTimeoutError, RunApiClientError } from "@runapi.ai/mcp-core";
export { errorFromResponse, friendlyError, PollTimeoutError, RunApiClientError } from "@runapi.ai/mcp-core/web";
//# sourceMappingURL=errors.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
import type { InputRule, ModelInfo } from "../types.js";
import type { Contract } from "../types.js";
export type { InputRule } from "@runapi.ai/mcp-core";
export declare function inputRulesForModel(info: Pick<ModelInfo, "service" | "action">): InputRule[];
export declare function inputRulesForModel(info: Pick<ModelInfo, "service" | "action">, source?: Contract): InputRule[];
export declare function validateInputRules(info: ModelInfo, params: Record<string, unknown>): string | undefined;

@@ -1,9 +0,5 @@

import { validateInputRules as coreValidateInputRules } from "@runapi.ai/mcp-core";
import { findAction } from "./contract.js";
export function inputRulesForModel(info) {
return (findAction(info.service, info.action)?.rules ?? []).map((rule) => ({
...rule,
required: rule.required ?? [],
forbidden: rule.forbidden ?? []
}));
import { inputRulesForModel as coreInputRulesForModel, validateInputRules as coreValidateInputRules } from "@runapi.ai/mcp-core/web";
import { contract } from "./contract.js";
export function inputRulesForModel(info, source = contract) {
return coreInputRulesForModel(info, source);
}

@@ -10,0 +6,0 @@ export function validateInputRules(info, params) {

@@ -1,1 +0,1 @@

{"version":3,"file":"input-rules.js","sourceRoot":"","sources":["../../../src/lib/input-rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,MAAM,UAAU,kBAAkB,CAAC,IAA2C;IAC5E,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzE,GAAG,IAAI;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;KAChC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAe,EAAE,MAA+B;IACjF,OAAO,sBAAsB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAClE,CAAC"}
{"version":3,"file":"input-rules.js","sourceRoot":"","sources":["../../../src/lib/input-rules.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,IAAI,sBAAsB,EAC5C,kBAAkB,IAAI,sBAAsB,EAC7C,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,MAAM,UAAU,kBAAkB,CAChC,IAA2C,EAC3C,SAAmB,QAAQ;IAE3B,OAAO,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAe,EAAE,MAA+B;IACjF,OAAO,sBAAsB,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAClE,CAAC"}

@@ -1,1 +0,1 @@

export { validateParams, zodShapeForFields } from "@runapi.ai/mcp-core";
export { validateParams, zodShapeForFields } from "@runapi.ai/mcp-core/web";

@@ -1,2 +0,2 @@

export { validateParams, zodShapeForFields } from "@runapi.ai/mcp-core";
export { validateParams, zodShapeForFields } from "@runapi.ai/mcp-core/web";
//# sourceMappingURL=schema.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}

@@ -1,1 +0,1 @@

export { contractKey, humanize, modalityForAction, publicModelUrl, routeAction } from "@runapi.ai/mcp-core";
export { contractKey, humanize, modalityForAction, publicModelUrl, routeAction } from "@runapi.ai/mcp-core/web";

@@ -1,2 +0,2 @@

export { contractKey, humanize, modalityForAction, publicModelUrl, routeAction } from "@runapi.ai/mcp-core";
export { contractKey, humanize, modalityForAction, publicModelUrl, routeAction } from "@runapi.ai/mcp-core/web";
//# sourceMappingURL=text.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/lib/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/lib/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}

@@ -1,1 +0,1 @@

export { jsonText } from "@runapi.ai/mcp-core";
export { jsonText } from "@runapi.ai/mcp-core/web";

@@ -1,2 +0,2 @@

export { jsonText } from "@runapi.ai/mcp-core";
export { jsonText } from "@runapi.ai/mcp-core/web";
//# sourceMappingURL=tool-response.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"tool-response.js","sourceRoot":"","sources":["../../../src/lib/tool-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC"}
{"version":3,"file":"tool-response.js","sourceRoot":"","sources":["../../../src/lib/tool-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC"}

@@ -11,3 +11,3 @@ export const SERVER_INSTRUCTIONS = `

- check_balance: check account balance and spending. Requires API key.
- create_task: create a media task and optionally poll for completion. Requires API key.
- create_task: create a media task with a required caller-generated opaque idempotency_key, then optionally poll for completion. Requires API key.
- get_task: fetch current status and latest payload for an existing task. Requires API key.

@@ -53,6 +53,9 @@ - login: open a browser PKCE login flow and save RunAPI credentials to ~/.config/runapi/config.json, the shared config used by runapi login. No API key required; call only when authentication is needed.

- Include model in create_task when the selected action requires or supports a model slug.
- Generate one new opaque idempotency_key for each logical task and retain it with the exact service, action, model, and params.
- Reuse an idempotency_key only to retry the same logical task with identical input. Never reuse it with different input.
- Never derive idempotency_key from the JSON-RPC request ID or X-Client-Request-Id.
- Confirm before expensive, long-running, or batch media requests.
- For ordinary image requests, wait for completion unless the user wants submit-only behavior.
- For long-running audio/video/batch work, consider wait=false when the host timeout is likely to interrupt the response, then tell the user to call get_task later.
- Never retry create_task automatically after a timeout because the original task may still be processing.
- Never retry create_task automatically when its result is unknown because the original task may still be processing. If the user explicitly retries, use the same idempotency_key and identical input.

@@ -71,4 +74,4 @@ Phase 4: Result presentation

- Invalid params: call get_model_info, show valid fields, constraints, and input_rules, and ask for the corrected input.
- Timeout: do not recreate the task automatically; tell the user to check status with get_task.
- Timeout or connection loss: do not recreate the task automatically; tell the user to check status with get_task. If no task ID was returned and the user explicitly retries, reuse the original idempotency_key and identical input.
`.trim();
//# sourceMappingURL=server-instructions.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/server-instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqElC,CAAC,IAAI,EAAE,CAAC"}
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/server-instructions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwElC,CAAC,IAAI,EAAE,CAAC"}

@@ -1,2 +0,1 @@

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
export declare function createServer(): McpServer;
export declare function createServer(): import("@modelcontextprotocol/sdk/server/mcp").McpServer;

@@ -1,23 +0,21 @@

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { registerLoginTool } from "@runapi.ai/mcp-core";
import { friendlyError } from "@runapi.ai/mcp-core/web";
import { createBusinessServer } from "./business-tools.js";
import { PACKAGE_NAME, PACKAGE_VERSION, USER_AGENT } from "./constants.js";
import { readContract, readPricing } from "./lib/data.js";
import { RunApiClient } from "./lib/runapi-client.js";
import { SERVER_INSTRUCTIONS } from "./server-instructions.js";
import { registerAuthenticatedTools } from "./tools/authenticated.js";
import { registerCatalogTools } from "./tools/catalog.js";
export function createServer() {
const server = new McpServer({
const server = createBusinessServer({
name: PACKAGE_NAME,
version: PACKAGE_VERSION
}, {
version: PACKAGE_VERSION,
instructions: SERVER_INSTRUCTIONS,
capabilities: {
tools: {},
logging: {}
}
contract: readContract(),
pricing: readPricing(),
client: new RunApiClient(),
errorFormatter: friendlyError
});
registerCatalogTools(server);
registerLoginTool(server, { userAgent: USER_AGENT });
registerAuthenticatedTools(server);
return server;
}
//# sourceMappingURL=server.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,eAAe;KACzB,EACD;QACE,YAAY,EAAE,mBAAmB;QACjC,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,iBAAiB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACrD,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,eAAe;QACxB,YAAY,EAAE,mBAAmB;QACjC,QAAQ,EAAE,YAAY,EAAE;QACxB,OAAO,EAAE,WAAW,EAAE;QACtB,MAAM,EAAE,IAAI,YAAY,EAAE;QAC1B,cAAc,EAAE,aAAa;KAC9B,CAAC,CAAC;IACH,iBAAiB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAErD,OAAO,MAAM,CAAC;AAChB,CAAC"}

@@ -1,2 +0,3 @@

import { type RunApiClient } from "../lib/runapi-client.js";
import { type Contract } from "@runapi.ai/mcp-core/web";
import type { BusinessToolClient } from "../business-tools.js";
import type { RunApiTaskResponse } from "../types.js";

@@ -9,3 +10,4 @@ export type ProgressSender = (message: {

}) => Promise<void> | void;
export declare function checkBalanceHandler(client: Pick<RunApiClient, "balance">): Promise<unknown>;
export type ErrorFormatter = (error: unknown) => string;
export declare function checkBalanceHandler(client: Pick<BusinessToolClient, "balance">, formatError: ErrorFormatter): Promise<unknown>;
export declare function createTaskHandler(input: {

@@ -16,6 +18,7 @@ service: string;

params?: Record<string, unknown>;
idempotency_key?: string;
wait?: boolean;
timeout_ms?: number;
poll_interval_ms?: number;
}, client: Pick<RunApiClient, "createTask" | "pollTask">, sendProgress?: ProgressSender, progressToken?: string | number): Promise<{
}, client: Pick<BusinessToolClient, "createTask" | "pollTask">, contract: Contract, formatError: ErrorFormatter, sendProgress?: ProgressSender, progressToken?: string | number): Promise<{
error: string;

@@ -27,2 +30,3 @@ hint: string;

status?: undefined;
warning?: undefined;
} | {

@@ -35,2 +39,3 @@ result: RunApiTaskResponse;

status?: undefined;
warning?: undefined;
} | {

@@ -43,2 +48,3 @@ created: RunApiTaskResponse;

result?: undefined;
warning?: undefined;
} | {

@@ -51,3 +57,12 @@ task_id: string;

created?: undefined;
warning?: undefined;
} | {
created: RunApiTaskResponse;
task_id: string;
status: string;
warning: string;
hint: string;
error?: undefined;
result?: undefined;
} | {
error: string;

@@ -59,2 +74,3 @@ hint?: undefined;

status?: undefined;
warning?: undefined;
}>;

@@ -65,3 +81,3 @@ export declare function getTaskHandler(input: {

task_id: string;
}, client: Pick<RunApiClient, "getTask">): Promise<{
}, client: Pick<BusinessToolClient, "getTask">, formatError: ErrorFormatter): Promise<{
task_id: string;

@@ -68,0 +84,0 @@ status: string;

@@ -1,7 +0,4 @@

import { findAction, findModelForAction } from "../lib/contract.js";
import { friendlyError } from "../lib/errors.js";
import { validateInputRules } from "../lib/input-rules.js";
import { taskIdFromResponse, taskStatus } from "../lib/runapi-client.js";
import { findAction, findModelForAction, taskIdFromResponse, taskStatus, validateInputRules } from "@runapi.ai/mcp-core/web";
import { validateParams } from "../lib/schema.js";
export async function checkBalanceHandler(client) {
export async function checkBalanceHandler(client, formatError) {
try {

@@ -11,9 +8,15 @@ return await client.balance();

catch (error) {
return { error: friendlyError(error) };
return { error: formatError(error) };
}
}
export async function createTaskHandler(input, client, sendProgress, progressToken) {
export async function createTaskHandler(input, client, contract, formatError, sendProgress, progressToken) {
try {
const info = findModelForAction(input.service, input.action, input.model);
const action = findAction(input.service, input.action);
if (!input.idempotency_key?.trim()) {
return {
error: "idempotency_key is required before RunAPI can create a task.",
hint: "Generate one opaque key per logical task and reuse it only when retrying that same task input."
};
}
const info = findModelForAction(input.service, input.action, input.model, contract);
const action = findAction(input.service, input.action, contract);
if (!info) {

@@ -29,3 +32,3 @@ return {

});
const ruleError = validateInputRules(info, body);
const ruleError = validateInputRules(action?.rules ?? [], body);
if (ruleError) {

@@ -37,3 +40,3 @@ return {

}
const created = await client.createTask(input.service, input.action, body);
const created = await client.createTask(input.service, input.action, body, input.idempotency_key);
if (action?.task_type === "synchronous") {

@@ -50,28 +53,39 @@ return { result: created };

}
const timeout = input.timeout_ms ?? defaultTimeout(input.action);
const startedAt = Date.now();
const completed = await client.pollTask(input.service, taskId, input.action, {
timeoutMs: timeout,
intervalMs: input.poll_interval_ms ?? 5_000,
onProgress: async (task) => {
const elapsed = Date.now() - startedAt;
await sendProgress?.({
progressToken: progressToken || taskId,
progress: Math.min(elapsed, timeout),
total: timeout,
message: `RunAPI task ${taskId}: ${taskStatus(task)}`
});
}
});
return {
task_id: taskId,
status: taskStatus(completed),
result: completed
};
try {
const timeout = input.timeout_ms ?? defaultTimeout(input.action);
const startedAt = Date.now();
const completed = await client.pollTask(input.service, taskId, input.action, {
timeoutMs: timeout,
intervalMs: input.poll_interval_ms ?? 5_000,
onProgress: async (task) => {
const elapsed = Date.now() - startedAt;
await sendProgress?.({
progressToken: progressToken || taskId,
progress: Math.min(elapsed, timeout),
total: timeout,
message: `RunAPI task ${taskId}: ${taskStatus(task)}`
});
}
});
return {
task_id: taskId,
status: taskStatus(completed),
result: completed
};
}
catch (error) {
return {
created,
task_id: taskId,
status: taskStatus(created),
warning: formatError(error),
hint: "The task was created and may still be processing. Call get_task with this task_id to continue."
};
}
}
catch (error) {
return { error: friendlyError(error) };
return { error: formatError(error) };
}
}
export async function getTaskHandler(input, client) {
export async function getTaskHandler(input, client, formatError) {
try {

@@ -86,3 +100,3 @@ const task = await client.getTask(input.service, input.task_id, input.action);

catch (error) {
return { error: friendlyError(error) };
return { error: formatError(error) };
}

@@ -89,0 +103,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"authenticated-handlers.js","sourceRoot":"","sources":["../../../src/tools/authenticated-handlers.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"authenticated-handlers.js","sourceRoot":"","sources":["../../../src/tools/authenticated-handlers.ts"],"names":[],"mappings":"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"}
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { RunApiClient } from "../lib/runapi-client.js";
export declare function registerAuthenticatedTools(server: McpServer, client?: RunApiClient): void;
import type { BusinessToolDependencies } from "../business-tools.js";
export declare function registerAuthenticatedTools(server: McpServer, dependencies: BusinessToolDependencies): void;
import { z } from "zod";
import { RunApiClient } from "../lib/runapi-client.js";
import { jsonText } from "../lib/tool-response.js";
import { checkBalanceHandler, createTaskHandler, getTaskHandler } from "./authenticated-handlers.js";
export function registerAuthenticatedTools(server, client = new RunApiClient()) {
export function registerAuthenticatedTools(server, dependencies) {
server.tool("check_balance", "Return the authenticated RunAPI account balance and spending metrics.", {}, async () => {
return jsonText(await checkBalanceHandler(client));
return jsonText(await checkBalanceHandler(dependencies.client, dependencies.errorFormatter));
});
server.tool("create_task", "Run a RunAPI operation. Asynchronous operations can optionally poll until completion.", {
server.tool("create_task", "Run a RunAPI operation with a caller-generated idempotency key. Asynchronous operations can optionally poll until completion.", {
service: z.string().describe("RunAPI service slug returned by list_models"),

@@ -14,8 +13,13 @@ action: z.string().describe("RunAPI endpoint name, for example text_to_image"),

params: z.record(z.unknown()).default({}).describe("Endpoint parameters validated against data/contract.json where constrained."),
idempotency_key: z.string()
.min(1)
.max(512)
.refine((value) => value.trim().length > 0, "idempotency_key cannot be blank")
.describe("Opaque caller-generated key for safely replaying one logical task creation."),
wait: z.boolean().default(true).describe("For asynchronous endpoints, poll until the task reaches a terminal status."),
timeout_ms: z.number().int().positive().optional().describe("Polling timeout for asynchronous endpoints."),
poll_interval_ms: z.number().int().positive().optional().describe("Polling interval for asynchronous endpoints.")
}, async ({ service, action, model, params, wait, timeout_ms, poll_interval_ms }, extra) => {
}, async ({ service, action, model, params, idempotency_key, wait, timeout_ms, poll_interval_ms }, extra) => {
const progressToken = extra._meta?.progressToken;
const result = await createTaskHandler({ service, action, model, params, wait, timeout_ms, poll_interval_ms }, client, async (progress) => {
const result = await createTaskHandler({ service, action, model, params, idempotency_key, wait, timeout_ms, poll_interval_ms }, dependencies.client, dependencies.contract, dependencies.errorFormatter, async (progress) => {
await extra.sendNotification?.({

@@ -26,3 +30,4 @@ method: "notifications/progress",

}, progressToken);
return jsonText(result);
const response = jsonText(result);
return "error" in result ? { ...response, isError: true } : response;
});

@@ -34,5 +39,5 @@ server.tool("get_task", "Fetch the current status and latest payload for an existing RunAPI task.", {

}, async ({ service, action, task_id }) => {
return jsonText(await getTaskHandler({ service, action, task_id }, client));
return jsonText(await getTaskHandler({ service, action, task_id }, dependencies.client, dependencies.errorFormatter));
});
}
//# sourceMappingURL=authenticated.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"authenticated.js","sourceRoot":"","sources":["../../../src/tools/authenticated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAErG,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,MAAM,GAAG,IAAI,YAAY,EAAE;IACvF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,uEAAuE,EACvE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,OAAO,QAAQ,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,uFAAuF,EACvF;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6EAA6E,CAAC;QACjI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,4EAA4E,CAAC;QACtH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC1G,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAClH,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE;QACtF,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,EACtE,MAAM,EACN,KAAK,EAAE,QAAQ,EAAE,EAAE;YACjB,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC7B,MAAM,EAAE,wBAAwB;gBAChC,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC,EACD,aAAa,CACd,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,UAAU,EACV,0EAA0E,EAC1E;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAC1G,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACrC,OAAO,QAAQ,CAAC,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC,CACF,CAAC;AACJ,CAAC"}
{"version":3,"file":"authenticated.js","sourceRoot":"","sources":["../../../src/tools/authenticated.ts"],"names":[],"mappings":"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"}

@@ -1,2 +0,3 @@

import type { RunApiClient } from "../lib/runapi-client.js";
import { type Contract, type PricingConfig } from "@runapi.ai/mcp-core/web";
import type { BusinessToolClient } from "../business-tools.js";
import type { SearchPromptsParams } from "../types.js";

@@ -13,3 +14,3 @@ export type ListModelsInput = {

};
export declare function listModelsHandler(input: ListModelsInput, client: Pick<RunApiClient, "listModels">): Promise<{
export declare function listModelsHandler(input: ListModelsInput, client: Pick<BusinessToolClient, "listModels">, contract: Contract): Promise<{
count: number;

@@ -27,3 +28,3 @@ source: string;

}>;
export declare function getModelInfoHandler(input: string | GetModelInfoInput): {
export declare function getModelInfoHandler(input: string | GetModelInfoInput, contract: Contract, pricing: PricingConfig): {
error: string;

@@ -40,7 +41,7 @@ hint: string;

price: {
pricing: import("@runapi.ai/mcp-core/dist/types.js").PricingEndpoint | undefined;
pricing: import("@runapi.ai/mcp-core/web").PricingEndpoint | undefined;
pricing_source: string;
pricing_url: string;
};
input_rules?: import("@runapi.ai/mcp-core/dist/types.js").InputRule[] | undefined;
input_rules?: import("@runapi.ai/mcp-core/web").InputRule[] | undefined;
model: string | undefined;

@@ -64,3 +65,3 @@ service: string;

};
export declare function listActionsHandler(): {
export declare function listActionsHandler(contract: Contract): {
groups: {

@@ -75,3 +76,3 @@ modality: string;

model?: string;
}): {
}, contract: Contract, pricing: PricingConfig): {
supported: boolean;

@@ -90,3 +91,3 @@ message: string;

price: {
pricing: import("@runapi.ai/mcp-core/dist/types.js").PricingEndpoint | undefined;
pricing: import("@runapi.ai/mcp-core/web").PricingEndpoint | undefined;
pricing_source: string;

@@ -98,3 +99,3 @@ pricing_url: string;

};
export declare function searchPromptsHandler(input: SearchPromptsParams, client: Pick<RunApiClient, "searchPrompts">): Promise<{
export declare function searchPromptsHandler(input: SearchPromptsParams, client: Pick<BusinessToolClient, "searchPrompts">): Promise<{
source: string;

@@ -101,0 +102,0 @@ count: number;

@@ -1,7 +0,5 @@

import { fieldSummary, findModel, findModelForAction, findModels, listActionGroups, listContractModels } from "../lib/contract.js";
import { inputRulesForModel } from "../lib/input-rules.js";
import { priceForModel } from "../lib/pricing.js";
import { fieldSummary, findModel, findModelForAction, findModels, inputRulesForModel, listActionGroups, listContractModels, priceForModel } from "@runapi.ai/mcp-core/web";
import { modalityForAction } from "../lib/text.js";
export async function listModelsHandler(input, client) {
let models = listContractModels();
export async function listModelsHandler(input, client, contract) {
let models = listContractModels(contract);
if (input.modality && input.modality !== "llm") {

@@ -37,7 +35,7 @@ models = models.filter((model) => modalityForAction(model.action) === input.modality);

}
export function getModelInfoHandler(input) {
export function getModelInfoHandler(input, contract, pricing) {
const request = typeof input === "string" ? { model: input } : input;
const info = request.service && request.action
? findModelForAction(request.service, request.action, request.model)
: findModel(request.model);
? findModelForAction(request.service, request.action, request.model, contract)
: findModel(request.model, contract);
if (!info) {

@@ -55,6 +53,6 @@ if (request.service || request.action) {

}
const matches = findModels(request.model);
const matches = findModels(request.model, contract);
const ambiguous = !request.service && !request.action && matches.length > 1;
return {
...modelInfoResponse(info),
...modelInfoResponse(info, contract, pricing),
...(ambiguous ? {

@@ -71,9 +69,9 @@ ambiguous: true,

}
export function listActionsHandler() {
export function listActionsHandler(contract) {
return {
groups: listActionGroups()
groups: listActionGroups(contract)
};
}
function modelInfoResponse(info) {
const inputRules = inputRulesForModel(info);
function modelInfoResponse(info, contract, pricing) {
const inputRules = inputRulesForModel(info, contract);
return {

@@ -87,7 +85,7 @@ model: info.model,

...(inputRules.length > 0 ? { input_rules: inputRules } : {}),
price: priceForModel(info)
price: priceForModel(info, pricing)
};
}
export function checkPricingHandler(input) {
const info = findModelForAction(input.service, input.action, input.model);
export function checkPricingHandler(input, contract, pricing) {
const info = findModelForAction(input.service, input.action, input.model, contract);
if (!info) {

@@ -105,3 +103,3 @@ return {

action: info.action,
price: priceForModel(info)
price: priceForModel(info, pricing)
};

@@ -108,0 +106,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"catalog-handlers.js","sourceRoot":"","sources":["../../../src/tools/catalog-handlers.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"catalog-handlers.js","sourceRoot":"","sources":["../../../src/tools/catalog-handlers.ts"],"names":[],"mappings":"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"}
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { RunApiClient } from "../lib/runapi-client.js";
export declare function registerCatalogTools(server: McpServer, client?: RunApiClient): void;
import type { DiscoveryToolDependencies } from "../business-tools.js";
export declare function registerCatalogTools(server: McpServer, dependencies: DiscoveryToolDependencies): void;
import { z } from "zod";
import { jsonText } from "../lib/tool-response.js";
import { RunApiClient } from "../lib/runapi-client.js";
import { checkPricingHandler, getModelInfoHandler, listActionsHandler, listModelsHandler, searchPromptsHandler } from "./catalog-handlers.js";
export function registerCatalogTools(server, client = new RunApiClient()) {
export function registerCatalogTools(server, dependencies) {
server.tool("list_models", "List RunAPI models from the embedded catalog. Optional filters: modality, service, or action.", {

@@ -11,3 +10,3 @@ modality: z.enum(["image", "video", "audio", "utility", "llm"]).optional(),

}, async ({ modality, service, action }) => {
return jsonText(await listModelsHandler({ modality, service, action }, client));
return jsonText(await listModelsHandler({ modality, service, action }, dependencies.client, dependencies.contract));
});

@@ -19,5 +18,5 @@ server.tool("get_model_info", "Get supported endpoint, pricing snapshot, and input constraints from the embedded catalog for a RunAPI model slug. Add service and action when the model supports multiple endpoints.", {

}, async ({ model, service, action }) => {
return jsonText(getModelInfoHandler({ model, service, action }));
return jsonText(getModelInfoHandler({ model, service, action }, dependencies.contract, dependencies.pricing));
});
server.tool("list_actions", "List RunAPI endpoint names grouped by output modality.", {}, async () => jsonText(listActionsHandler()));
server.tool("list_actions", "List RunAPI endpoint names grouped by output modality.", {}, async () => jsonText(listActionsHandler(dependencies.contract)));
server.tool("check_pricing", "Return embedded pricing snapshot data for a RunAPI model/action pair.", {

@@ -28,3 +27,3 @@ service: z.string().describe("RunAPI service slug returned by list_models"),

}, async ({ service, action, model }) => {
return jsonText(checkPricingHandler({ service, action, model }));
return jsonText(checkPricingHandler({ service, action, model }, dependencies.contract, dependencies.pricing));
});

@@ -50,5 +49,5 @@ server.tool("search_prompts", "Search RunAPI prompt examples by modality, category, tags, text query, model, or featured status. Free, no API key required.", {

per_page
}, client));
}, dependencies.client));
});
}
//# sourceMappingURL=catalog.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/tools/catalog.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/tools/catalog.ts"],"names":[],"mappings":"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"}
{
"name": "@runapi.ai/mcp",
"version": "0.3.0",
"version": "0.5.0",
"description": "RunAPI MCP server for model discovery, pricing lookup, media task creation, and balance checks.",
"type": "module",
"main": "dist/src/index.js",
"exports": {
".": {
"import": "./dist/src/index.js"
},
"./business-tools": {
"types": "./dist/src/business-tools.d.ts",
"import": "./dist/src/business-tools.js"
},
"./*": "./*"
},
"bin": {

@@ -23,4 +33,6 @@ "runapi-mcp": "dist/bin/runapi-mcp.js"

"scripts": {
"build": "tsc -p tsconfig.json",
"build": "tsc -p tsconfig.json && npm run check:web-safe",
"check:web-safe": "tsx scripts/check-web-safe-build.ts",
"dev": "tsx src/index.ts",
"pretest": "npm run build",
"prepack": "npm run sync:data -- --if-rails-root && npm run build",

@@ -59,3 +71,3 @@ "typecheck": "tsc --noEmit",

"@modelcontextprotocol/sdk": "^1.29.0",
"@runapi.ai/mcp-core": "0.1.8",
"@runapi.ai/mcp-core": "0.2.1",
"zod": "^3.25.76"

@@ -65,2 +77,3 @@ },

"@types/node": "^24.10.1",
"esbuild": "^0.28.1",
"tsx": "^4.20.6",

@@ -67,0 +80,0 @@ "typescript": "^5.9.3",

@@ -99,3 +99,3 @@ <h1 align="center">RunAPI MCP Server</h1>

| `login` | No | Start browser login and save RunAPI credentials to shared local config. |
| `create_task` | Yes | Create a media task and optionally poll until completion. |
| `create_task` | Yes | Create a media task with a required caller-generated `idempotency_key`, then optionally poll until completion. |
| `get_task` | Yes | Fetch status and latest payload for an existing media task. |

@@ -162,3 +162,3 @@ | `check_balance` | Yes | Return account balance and spending metrics. |

3. It asks for confirmation if the request is expensive, long-running, or a batch.
4. It calls `create_task`.
4. It generates one opaque `idempotency_key` for this logical task and calls `create_task`.
5. It returns task ID, status, output URLs, and cost fields when available.

@@ -174,6 +174,16 @@

1. The assistant calls `create_task` with `wait: false`.
1. The assistant generates one opaque `idempotency_key` and calls `create_task` with `wait: false`.
2. It returns the task ID.
3. You can later ask for status with `get_task`.
### Replay A Task Creation Safely
`create_task` requires an opaque `idempotency_key` from 1 to 512 characters. Generate one new key for each logical task and retain it with the exact `service`, `action`, `model`, and `params` used for that task.
If the create result is unknown because the connection closed or timed out, do not automatically create another task. Retry only when intended, using the same key with the same input. Reusing the key with different input returns a conflict. Do not derive the key from a JSON-RPC request ID or `X-Client-Request-Id`.
If task creation succeeds but optional polling times out or disconnects, the response still includes the created `task_id`, its current status, and a warning. Continue with `get_task`; do not create a replacement task.
See [`examples/create-task.arguments.json`](examples/create-task.arguments.json) for the tool arguments shape.
### Check Account Balance

@@ -180,0 +190,0 @@

@@ -83,3 +83,3 @@ <h1 align="center">RunAPI MCP Server</h1>

| `login` | 否 | 打开浏览器登录,并把 RunAPI 凭据保存到共享本地配置。 |
| `create_task` | 是 | 创建媒体任务,并可选择轮询到完成。 |
| `create_task` | 是 | 使用调用方生成的必填 `idempotency_key` 创建媒体任务,并可选择轮询到完成。 |
| `get_task` | 是 | 查询已有媒体任务的状态和最新 payload。 |

@@ -143,3 +143,3 @@ | `check_balance` | 是 | 查询账户余额和消费指标。 |

3. 如果请求昂贵、耗时或批量,先确认。
4. 调用 `create_task`。
4. 为这个逻辑任务生成一个 opaque `idempotency_key`,再调用 `create_task`。
5. 返回 task ID、status、output URLs 和可用的 cost 字段。

@@ -155,6 +155,16 @@

1. 调用 `create_task`,传入 `wait: false`。
1. 生成一个 opaque `idempotency_key`,再调用 `create_task` 并传入 `wait: false`。
2. 返回 task ID。
3. 之后可以用 `get_task` 查询状态。
### 安全重放任务创建
`create_task` 要求 1 到 512 个字符的 opaque `idempotency_key`。每个逻辑任务生成一个新 key,并把它与该任务的 `service`、`action`、`model` 和 `params` 一起保留。
如果连接中断或超时导致创建结果未知,不要自动创建另一个任务。只有在确实需要重试时,才对相同输入复用原 key;对不同输入复用同一个 key 会返回 conflict。不要从 JSON-RPC request ID 或 `X-Client-Request-Id` 推导这个 key。
如果 task 创建成功,但可选轮询超时或连接中断,响应仍会返回已创建的 `task_id`、当前状态和 warning。继续使用 `get_task` 查询,不要创建替代 task。
工具参数结构见 [`examples/create-task.arguments.json`](examples/create-task.arguments.json)。
### 查询余额

@@ -161,0 +171,0 @@

Sorry, the diff of this file is too big to display