@runapi.ai/mcp 0.1.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +201 -0
  3. package/README.md +367 -0
  4. package/data/contract.json +3493 -0
  5. package/data/pricing.json +1263 -0
  6. package/dist/bin/runapi-mcp.d.ts +2 -0
  7. package/dist/bin/runapi-mcp.js +10 -0
  8. package/dist/bin/runapi-mcp.js.map +1 -0
  9. package/dist/scripts/sync-data.d.ts +2 -0
  10. package/dist/scripts/sync-data.js +22 -0
  11. package/dist/scripts/sync-data.js.map +1 -0
  12. package/dist/src/config.d.ts +7 -0
  13. package/dist/src/config.js +32 -0
  14. package/dist/src/config.js.map +1 -0
  15. package/dist/src/constants.d.ts +5 -0
  16. package/dist/src/constants.js +6 -0
  17. package/dist/src/constants.js.map +1 -0
  18. package/dist/src/index.d.ts +2 -0
  19. package/dist/src/index.js +6 -0
  20. package/dist/src/index.js.map +1 -0
  21. package/dist/src/init.d.ts +1 -0
  22. package/dist/src/init.js +52 -0
  23. package/dist/src/init.js.map +1 -0
  24. package/dist/src/lib/contract.d.ts +21 -0
  25. package/dist/src/lib/contract.js +81 -0
  26. package/dist/src/lib/contract.js.map +1 -0
  27. package/dist/src/lib/data.d.ts +3 -0
  28. package/dist/src/lib/data.js +22 -0
  29. package/dist/src/lib/data.js.map +1 -0
  30. package/dist/src/lib/errors.d.ts +10 -0
  31. package/dist/src/lib/errors.js +88 -0
  32. package/dist/src/lib/errors.js.map +1 -0
  33. package/dist/src/lib/input-rules.d.ts +9 -0
  34. package/dist/src/lib/input-rules.js +61 -0
  35. package/dist/src/lib/input-rules.js.map +1 -0
  36. package/dist/src/lib/pricing.d.ts +7 -0
  37. package/dist/src/lib/pricing.js +42 -0
  38. package/dist/src/lib/pricing.js.map +1 -0
  39. package/dist/src/lib/runapi-client.d.ts +22 -0
  40. package/dist/src/lib/runapi-client.js +119 -0
  41. package/dist/src/lib/runapi-client.js.map +1 -0
  42. package/dist/src/lib/schema.d.ts +3 -0
  43. package/dist/src/lib/schema.js +44 -0
  44. package/dist/src/lib/schema.js.map +1 -0
  45. package/dist/src/lib/text.d.ts +5 -0
  46. package/dist/src/lib/text.js +27 -0
  47. package/dist/src/lib/text.js.map +1 -0
  48. package/dist/src/lib/tool-response.d.ts +6 -0
  49. package/dist/src/lib/tool-response.js +11 -0
  50. package/dist/src/lib/tool-response.js.map +1 -0
  51. package/dist/src/server-instructions.d.ts +1 -0
  52. package/dist/src/server-instructions.js +66 -0
  53. package/dist/src/server-instructions.js.map +1 -0
  54. package/dist/src/server.d.ts +2 -0
  55. package/dist/src/server.js +20 -0
  56. package/dist/src/server.js.map +1 -0
  57. package/dist/src/tools/authenticated-handlers.d.ts +77 -0
  58. package/dist/src/tools/authenticated-handlers.js +144 -0
  59. package/dist/src/tools/authenticated-handlers.js.map +1 -0
  60. package/dist/src/tools/authenticated.d.ts +3 -0
  61. package/dist/src/tools/authenticated.js +53 -0
  62. package/dist/src/tools/authenticated.js.map +1 -0
  63. package/dist/src/tools/catalog-handlers.d.ts +88 -0
  64. package/dist/src/tools/catalog-handlers.js +104 -0
  65. package/dist/src/tools/catalog-handlers.js.map +1 -0
  66. package/dist/src/tools/catalog.d.ts +3 -0
  67. package/dist/src/tools/catalog.js +29 -0
  68. package/dist/src/tools/catalog.js.map +1 -0
  69. package/dist/src/types.d.ts +75 -0
  70. package/dist/src/types.js +2 -0
  71. package/dist/src/types.js.map +1 -0
  72. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticated.js","sourceRoot":"","sources":["../../../src/tools/authenticated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import type { RunApiClient } from "../lib/runapi-client.js";
2
+ export type ListModelsInput = {
3
+ modality?: "image" | "video" | "audio" | "utility" | "llm";
4
+ service?: string;
5
+ action?: string;
6
+ };
7
+ export type GetModelInfoInput = {
8
+ model: string;
9
+ service?: string;
10
+ action?: string;
11
+ };
12
+ export declare function listModelsHandler(input: ListModelsInput, client: Pick<RunApiClient, "listModels">): Promise<{
13
+ count: number;
14
+ source: string;
15
+ runtime_models: unknown;
16
+ models: {
17
+ model: string;
18
+ service: string;
19
+ action: string;
20
+ modality: "image" | "video" | "audio" | "utility";
21
+ model_line: string;
22
+ required_fields: string[];
23
+ }[];
24
+ }>;
25
+ export declare function getModelInfoHandler(input: string | GetModelInfoInput): {
26
+ error: string;
27
+ hint: string;
28
+ } | {
29
+ ambiguous?: boolean | undefined;
30
+ hint?: string | undefined;
31
+ matches?: {
32
+ service: string;
33
+ action: string;
34
+ modality: "image" | "video" | "audio" | "utility";
35
+ }[] | undefined;
36
+ price: {
37
+ pricing: Record<string, unknown> | undefined;
38
+ pricing_source: string;
39
+ pricing_url: string;
40
+ };
41
+ input_rules?: import("../lib/input-rules.js").InputRule[] | undefined;
42
+ model: string;
43
+ service: string;
44
+ action: string;
45
+ modality: "image" | "video" | "audio" | "utility";
46
+ model_line: string;
47
+ fields: {
48
+ name: string;
49
+ required: boolean;
50
+ enum: unknown[] | undefined;
51
+ default: unknown;
52
+ min: number | undefined;
53
+ max: number | undefined;
54
+ type: string | undefined;
55
+ }[];
56
+ error?: undefined;
57
+ };
58
+ export declare function listActionsHandler(): {
59
+ groups: {
60
+ modality: string;
61
+ actions: string[];
62
+ }[];
63
+ };
64
+ export declare function checkPricingHandler(input: {
65
+ service: string;
66
+ action: string;
67
+ model?: string;
68
+ }): {
69
+ supported: boolean;
70
+ message: string;
71
+ hint: string;
72
+ model?: undefined;
73
+ service?: undefined;
74
+ action?: undefined;
75
+ price?: undefined;
76
+ } | {
77
+ supported: boolean;
78
+ model: string;
79
+ service: string;
80
+ action: string;
81
+ price: {
82
+ pricing: Record<string, unknown> | undefined;
83
+ pricing_source: string;
84
+ pricing_url: string;
85
+ };
86
+ message?: undefined;
87
+ hint?: undefined;
88
+ };
@@ -0,0 +1,104 @@
1
+ import { fieldSummary, findModel, findModelForAction, findModels, listActionGroups, listContractModels } from "../lib/contract.js";
2
+ import { inputRulesForModel } from "../lib/input-rules.js";
3
+ import { priceForModel } from "../lib/pricing.js";
4
+ import { modalityForAction } from "../lib/text.js";
5
+ export async function listModelsHandler(input, client) {
6
+ let models = listContractModels();
7
+ if (input.modality && input.modality !== "llm") {
8
+ models = models.filter((model) => modalityForAction(model.action) === input.modality);
9
+ }
10
+ if (input.service) {
11
+ models = models.filter((model) => model.service === input.service);
12
+ }
13
+ if (input.action) {
14
+ models = models.filter((model) => model.action === input.action);
15
+ }
16
+ let runtimeModels;
17
+ try {
18
+ runtimeModels = await client.listModels();
19
+ }
20
+ catch {
21
+ runtimeModels = undefined;
22
+ }
23
+ return {
24
+ count: models.length,
25
+ source: runtimeModels ? "embedded catalog + /v1/models" : "embedded catalog",
26
+ runtime_models: runtimeModels,
27
+ models: models.map((model) => ({
28
+ model: model.model,
29
+ service: model.service,
30
+ action: model.action,
31
+ modality: modalityForAction(model.action),
32
+ model_line: model.model_line,
33
+ required_fields: fieldSummary(model.fields).filter((field) => field.required).map((field) => field.name)
34
+ }))
35
+ };
36
+ }
37
+ export function getModelInfoHandler(input) {
38
+ const request = typeof input === "string" ? { model: input } : input;
39
+ const info = request.service && request.action
40
+ ? findModelForAction(request.service, request.action, request.model)
41
+ : findModel(request.model);
42
+ if (!info) {
43
+ if (request.service || request.action) {
44
+ return {
45
+ error: `Unsupported RunAPI model/action combination: ${request.service || "(missing service)"}/${request.action || "(missing action)"} with model ${request.model}`,
46
+ hint: "Call list_models with service/action filters to find supported combinations."
47
+ };
48
+ }
49
+ return {
50
+ error: `Unknown RunAPI model: ${request.model}`,
51
+ hint: "Call list_models first to find valid model slugs."
52
+ };
53
+ }
54
+ const matches = findModels(request.model);
55
+ const ambiguous = !request.service && !request.action && matches.length > 1;
56
+ return {
57
+ ...modelInfoResponse(info),
58
+ ...(ambiguous ? {
59
+ ambiguous: true,
60
+ hint: "This model supports multiple service/action pairs. Call get_model_info with service and action to inspect the exact input constraints before create_task.",
61
+ matches: matches.map((match) => ({
62
+ service: match.service,
63
+ action: match.action,
64
+ modality: modalityForAction(match.action)
65
+ }))
66
+ } : {})
67
+ };
68
+ }
69
+ export function listActionsHandler() {
70
+ return {
71
+ groups: listActionGroups()
72
+ };
73
+ }
74
+ function modelInfoResponse(info) {
75
+ const inputRules = inputRulesForModel(info);
76
+ return {
77
+ model: info.model,
78
+ service: info.service,
79
+ action: info.action,
80
+ modality: modalityForAction(info.action),
81
+ model_line: info.model_line,
82
+ fields: fieldSummary(info.fields),
83
+ ...(inputRules.length > 0 ? { input_rules: inputRules } : {}),
84
+ price: priceForModel(info)
85
+ };
86
+ }
87
+ export function checkPricingHandler(input) {
88
+ const info = findModelForAction(input.service, input.action, input.model);
89
+ if (!info) {
90
+ return {
91
+ supported: false,
92
+ message: "No matching RunAPI model/action pair in the local contract.",
93
+ hint: "Use list_models with service/action filters to find supported combinations."
94
+ };
95
+ }
96
+ return {
97
+ supported: true,
98
+ model: info.model,
99
+ service: info.service,
100
+ action: info.action,
101
+ price: priceForModel(info)
102
+ };
103
+ }
104
+ //# sourceMappingURL=catalog-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-handlers.js","sourceRoot":"","sources":["../../../src/tools/catalog-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { RunApiClient } from "../lib/runapi-client.js";
3
+ export declare function registerCatalogTools(server: McpServer, client?: RunApiClient): void;
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ import { jsonText } from "../lib/tool-response.js";
3
+ import { RunApiClient } from "../lib/runapi-client.js";
4
+ import { checkPricingHandler, getModelInfoHandler, listActionsHandler, listModelsHandler } from "./catalog-handlers.js";
5
+ export function registerCatalogTools(server, client = new RunApiClient()) {
6
+ server.tool("list_models", "List RunAPI models from the embedded catalog. Optional filters: modality, service, or action.", {
7
+ modality: z.enum(["image", "video", "audio", "utility", "llm"]).optional(),
8
+ service: z.string().optional(),
9
+ action: z.string().optional()
10
+ }, async ({ modality, service, action }) => {
11
+ return jsonText(await listModelsHandler({ modality, service, action }, client));
12
+ });
13
+ 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.", {
14
+ model: z.string().describe("RunAPI model slug returned by list_models"),
15
+ service: z.string().optional().describe("RunAPI service slug returned by list_models; use with action to disambiguate multi-endpoint models"),
16
+ action: z.string().optional().describe("RunAPI endpoint name returned by list_models; use with service to disambiguate multi-endpoint models")
17
+ }, async ({ model, service, action }) => {
18
+ return jsonText(getModelInfoHandler({ model, service, action }));
19
+ });
20
+ server.tool("list_actions", "List RunAPI endpoint names grouped by output modality.", {}, async () => jsonText(listActionsHandler()));
21
+ server.tool("check_pricing", "Return embedded pricing snapshot data for a RunAPI model/action pair.", {
22
+ service: z.string().describe("RunAPI service slug returned by list_models"),
23
+ action: z.string().describe("RunAPI endpoint name, for example text_to_image or text_to_music"),
24
+ model: z.string().optional().describe("RunAPI model slug")
25
+ }, async ({ service, action, model }) => {
26
+ return jsonText(checkPricingHandler({ service, action, model }));
27
+ });
28
+ }
29
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/tools/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAExH,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAM,GAAG,IAAI,YAAY,EAAE;IACjF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,+FAA+F,EAC/F;QACE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC1E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACtC,OAAO,QAAQ,CAAC,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,uLAAuL,EACvL;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACvE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;QAC7I,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sGAAsG,CAAC;KAC/I,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACnC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,wDAAwD,EACxD,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAC3C,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,uEAAuE,EACvE;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAC/F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC3D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,OAAO,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,75 @@
1
+ export type ContractField = {
2
+ required?: boolean;
3
+ enum?: unknown[];
4
+ default?: unknown;
5
+ min?: number;
6
+ max?: number;
7
+ minimum?: number;
8
+ maximum?: number;
9
+ type?: string;
10
+ description?: string;
11
+ };
12
+ export type ContractAction = {
13
+ provider: string;
14
+ model: string;
15
+ endpoint: string;
16
+ models: string[];
17
+ fields_by_model: Record<string, Record<string, ContractField>>;
18
+ };
19
+ export type Contract = {
20
+ generated_by: string;
21
+ catalog_models: string[];
22
+ actions: Record<string, ContractAction>;
23
+ unresolved_actions: string[];
24
+ };
25
+ export type PricingConfig = {
26
+ markup_rate?: number;
27
+ provider_markup?: Record<string, number>;
28
+ endpoint_markup?: Record<string, number>;
29
+ endpoints?: Record<string, PricingEndpoint>;
30
+ };
31
+ export type PricingEndpoint = {
32
+ cost_unit_price_cents?: number;
33
+ cost_input_price_per_1m_cents?: number;
34
+ cost_output_price_per_1m_cents?: number;
35
+ cost_cache_read_price_per_1m_cents?: number;
36
+ cost_cache_write_5m_price_per_1m_cents?: number;
37
+ cost_cache_write_1h_price_per_1m_cents?: number;
38
+ cost_billing_config?: {
39
+ key?: string;
40
+ overrides?: Record<string, number>;
41
+ };
42
+ };
43
+ export type ModelInfo = {
44
+ service: string;
45
+ action: string;
46
+ route_action: string;
47
+ provider: string;
48
+ model_line: string;
49
+ model: string;
50
+ fields: Record<string, ContractField>;
51
+ };
52
+ export type RunApiTaskResponse = {
53
+ id?: string;
54
+ task_id?: string;
55
+ status?: string;
56
+ state?: string;
57
+ data?: unknown;
58
+ result?: unknown;
59
+ output?: unknown;
60
+ outputs?: unknown;
61
+ url?: string;
62
+ urls?: string[];
63
+ cost_cents?: number;
64
+ amount_cents?: number;
65
+ [key: string]: unknown;
66
+ };
67
+ export type PollingOptions = {
68
+ timeoutMs?: number;
69
+ intervalMs?: number;
70
+ onProgress?: (task: RunApiTaskResponse) => Promise<void> | void;
71
+ };
72
+ export type ChatMessage = {
73
+ role: "system" | "user" | "assistant";
74
+ content: string;
75
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@runapi.ai/mcp",
3
+ "version": "0.1.0",
4
+ "description": "RunAPI MCP server for model discovery, pricing lookup, task creation, and LLM chat.",
5
+ "type": "module",
6
+ "main": "dist/src/index.js",
7
+ "bin": {
8
+ "runapi-mcp": "dist/bin/runapi-mcp.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "data/contract.json",
13
+ "data/pricing.json",
14
+ "README.md",
15
+ "CHANGELOG.md",
16
+ "LICENSE"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "dev": "tsx src/index.ts",
21
+ "prepack": "npm run build",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "vitest run",
24
+ "sync:data": "tsx scripts/sync-data.ts .."
25
+ },
26
+ "keywords": [
27
+ "runapi",
28
+ "mcp",
29
+ "model-context-protocol",
30
+ "ai",
31
+ "claude-code",
32
+ "cursor",
33
+ "vscode",
34
+ "image-generation",
35
+ "video-generation",
36
+ "music-generation",
37
+ "audio-generation",
38
+ "llm"
39
+ ],
40
+ "author": "RunAPI",
41
+ "license": "Apache-2.0",
42
+ "homepage": "https://runapi.ai",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/runapi-ai/mcp.git"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/runapi-ai/mcp/issues"
49
+ },
50
+ "engines": {
51
+ "node": ">=20.0.0"
52
+ },
53
+ "dependencies": {
54
+ "@modelcontextprotocol/sdk": "^1.29.0",
55
+ "zod": "^3.25.76"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^24.10.1",
59
+ "tsx": "^4.20.6",
60
+ "typescript": "^5.9.3",
61
+ "vitest": "^4.0.14"
62
+ },
63
+ "publishConfig": {
64
+ "access": "public"
65
+ }
66
+ }