@lunora/mcp 1.0.0-alpha.20 → 1.0.0-alpha.22
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/bin.mjs +1 -1
- package/dist/index.d.mts +31 -2
- package/dist/index.d.ts +31 -2
- package/dist/index.mjs +4 -2
- package/dist/packem_shared/{READ_ONLY_TOOL_DEFINITIONS-B5x61zt4.mjs → READ_ONLY_TOOL_DEFINITIONS-CWb_wFd5.mjs} +66 -7
- package/dist/packem_shared/{connectStdio-mHv2dT3u.mjs → connectStdio-CeI3w0q7.mjs} +1 -1
- package/dist/packem_shared/createMcpFetchHandler-D8HWylar.mjs +14 -0
- package/dist/packem_shared/createPaidMcpServer-D0vrMTDp.mjs +93 -0
- package/package.json +4 -3
package/dist/bin.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { connectStdio } from './packem_shared/connectStdio-
|
|
2
|
+
import { connectStdio } from './packem_shared/connectStdio-CeI3w0q7.mjs';
|
|
3
3
|
|
|
4
4
|
const ENABLED_ENV_VALUES = /* @__PURE__ */ new Set(["1", "on", "true", "yes"]);
|
|
5
5
|
const isEnvEnabled = (value) => value !== void 0 && ENABLED_ENV_VALUES.has(value.trim().toLowerCase());
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { LunoraClient } from '@lunora/client';
|
|
2
1
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
3
|
+
import { LunoraClient } from '@lunora/client';
|
|
4
|
+
import { X402ChargeConfig, X402Price } from '@lunora/x402/charge';
|
|
5
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
6
|
interface LunoraMcpServerOptions {
|
|
4
7
|
allowWrites?: boolean;
|
|
5
8
|
client?: LunoraClient;
|
|
@@ -9,6 +12,8 @@ interface LunoraMcpServerOptions {
|
|
|
9
12
|
}
|
|
10
13
|
declare const createLunoraMcpServer: (options: LunoraMcpServerOptions) => Server;
|
|
11
14
|
declare const connectStdio: (options: LunoraMcpServerOptions) => Promise<Server>;
|
|
15
|
+
type McpFetchHandler = (request: Request) => Promise<Response>;
|
|
16
|
+
declare const createMcpFetchHandler: (options: LunoraMcpServerOptions) => McpFetchHandler;
|
|
12
17
|
interface ToolInputSchema {
|
|
13
18
|
properties: Record<string, unknown>;
|
|
14
19
|
required?: ReadonlyArray<string>;
|
|
@@ -30,4 +35,28 @@ declare const READ_ONLY_TOOL_DEFINITIONS: ReadonlyArray<ToolDefinition>;
|
|
|
30
35
|
declare const WRITE_TOOL_DEFINITIONS: ReadonlyArray<ToolDefinition>;
|
|
31
36
|
declare const toolDefinitions: (allowWrites: boolean) => ReadonlyArray<ToolDefinition>;
|
|
32
37
|
declare const callTool: (client: LunoraClient, name: string, input: Record<string, unknown>, allowWrites?: boolean) => Promise<ToolResult>;
|
|
33
|
-
|
|
38
|
+
type ToolHandler = (arguments_: Record<string, unknown>) => Promise<ToolResult> | ToolResult;
|
|
39
|
+
interface RegisterToolOptions {
|
|
40
|
+
annotations?: Tool["annotations"];
|
|
41
|
+
description: string;
|
|
42
|
+
inputSchema: ToolInputSchema;
|
|
43
|
+
name: string;
|
|
44
|
+
}
|
|
45
|
+
interface RegisterPaidToolOptions extends RegisterToolOptions {
|
|
46
|
+
price: X402Price;
|
|
47
|
+
}
|
|
48
|
+
type PaidMcpChargeConfig = Omit<X402ChargeConfig, "price">;
|
|
49
|
+
interface PaidMcpServerConfig {
|
|
50
|
+
charge: PaidMcpChargeConfig;
|
|
51
|
+
serverInfo?: {
|
|
52
|
+
name: string;
|
|
53
|
+
version: string;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
interface PaidMcpServer {
|
|
57
|
+
readonly fetchHandler: McpFetchHandler;
|
|
58
|
+
paidTool: (options: RegisterPaidToolOptions, handler: ToolHandler) => void;
|
|
59
|
+
tool: (options: RegisterToolOptions, handler: ToolHandler) => void;
|
|
60
|
+
}
|
|
61
|
+
declare const createPaidMcpServer: (config: PaidMcpServerConfig) => PaidMcpServer;
|
|
62
|
+
export { type LunoraMcpServerOptions, type McpFetchHandler, type PaidMcpChargeConfig, type PaidMcpServer, type PaidMcpServerConfig, READ_ONLY_TOOL_DEFINITIONS, type RegisterPaidToolOptions, type RegisterToolOptions, type ToolDefinition, type ToolHandler, type ToolInputSchema, type ToolResult, WRITE_TOOL_DEFINITIONS, callTool, connectStdio, createLunoraMcpServer, createMcpFetchHandler, createPaidMcpServer, toolDefinitions };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { LunoraClient } from '@lunora/client';
|
|
2
1
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
3
|
+
import { LunoraClient } from '@lunora/client';
|
|
4
|
+
import { X402ChargeConfig, X402Price } from '@lunora/x402/charge';
|
|
5
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
6
|
interface LunoraMcpServerOptions {
|
|
4
7
|
allowWrites?: boolean;
|
|
5
8
|
client?: LunoraClient;
|
|
@@ -9,6 +12,8 @@ interface LunoraMcpServerOptions {
|
|
|
9
12
|
}
|
|
10
13
|
declare const createLunoraMcpServer: (options: LunoraMcpServerOptions) => Server;
|
|
11
14
|
declare const connectStdio: (options: LunoraMcpServerOptions) => Promise<Server>;
|
|
15
|
+
type McpFetchHandler = (request: Request) => Promise<Response>;
|
|
16
|
+
declare const createMcpFetchHandler: (options: LunoraMcpServerOptions) => McpFetchHandler;
|
|
12
17
|
interface ToolInputSchema {
|
|
13
18
|
properties: Record<string, unknown>;
|
|
14
19
|
required?: ReadonlyArray<string>;
|
|
@@ -30,4 +35,28 @@ declare const READ_ONLY_TOOL_DEFINITIONS: ReadonlyArray<ToolDefinition>;
|
|
|
30
35
|
declare const WRITE_TOOL_DEFINITIONS: ReadonlyArray<ToolDefinition>;
|
|
31
36
|
declare const toolDefinitions: (allowWrites: boolean) => ReadonlyArray<ToolDefinition>;
|
|
32
37
|
declare const callTool: (client: LunoraClient, name: string, input: Record<string, unknown>, allowWrites?: boolean) => Promise<ToolResult>;
|
|
33
|
-
|
|
38
|
+
type ToolHandler = (arguments_: Record<string, unknown>) => Promise<ToolResult> | ToolResult;
|
|
39
|
+
interface RegisterToolOptions {
|
|
40
|
+
annotations?: Tool["annotations"];
|
|
41
|
+
description: string;
|
|
42
|
+
inputSchema: ToolInputSchema;
|
|
43
|
+
name: string;
|
|
44
|
+
}
|
|
45
|
+
interface RegisterPaidToolOptions extends RegisterToolOptions {
|
|
46
|
+
price: X402Price;
|
|
47
|
+
}
|
|
48
|
+
type PaidMcpChargeConfig = Omit<X402ChargeConfig, "price">;
|
|
49
|
+
interface PaidMcpServerConfig {
|
|
50
|
+
charge: PaidMcpChargeConfig;
|
|
51
|
+
serverInfo?: {
|
|
52
|
+
name: string;
|
|
53
|
+
version: string;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
interface PaidMcpServer {
|
|
57
|
+
readonly fetchHandler: McpFetchHandler;
|
|
58
|
+
paidTool: (options: RegisterPaidToolOptions, handler: ToolHandler) => void;
|
|
59
|
+
tool: (options: RegisterToolOptions, handler: ToolHandler) => void;
|
|
60
|
+
}
|
|
61
|
+
declare const createPaidMcpServer: (config: PaidMcpServerConfig) => PaidMcpServer;
|
|
62
|
+
export { type LunoraMcpServerOptions, type McpFetchHandler, type PaidMcpChargeConfig, type PaidMcpServer, type PaidMcpServerConfig, READ_ONLY_TOOL_DEFINITIONS, type RegisterPaidToolOptions, type RegisterToolOptions, type ToolDefinition, type ToolHandler, type ToolInputSchema, type ToolResult, WRITE_TOOL_DEFINITIONS, callTool, connectStdio, createLunoraMcpServer, createMcpFetchHandler, createPaidMcpServer, toolDefinitions };
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { createMcpFetchHandler } from './packem_shared/createMcpFetchHandler-D8HWylar.mjs';
|
|
2
|
+
export { createPaidMcpServer } from './packem_shared/createPaidMcpServer-D0vrMTDp.mjs';
|
|
3
|
+
export { connectStdio, createLunoraMcpServer } from './packem_shared/connectStdio-CeI3w0q7.mjs';
|
|
4
|
+
export { READ_ONLY_TOOL_DEFINITIONS, WRITE_TOOL_DEFINITIONS, callTool, toolDefinitions } from './packem_shared/READ_ONLY_TOOL_DEFINITIONS-CWb_wFd5.mjs';
|
|
@@ -66,23 +66,82 @@ const readFunctionPath = (input) => {
|
|
|
66
66
|
}
|
|
67
67
|
return functionPath;
|
|
68
68
|
};
|
|
69
|
+
const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
70
|
+
const describeArgs = (value) => Array.isArray(value) ? "an array" : `a ${typeof value}`;
|
|
71
|
+
const readArgumentsBag = (raw) => {
|
|
72
|
+
if (raw === void 0 || raw === null) {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
75
|
+
if (typeof raw === "string") {
|
|
76
|
+
let parsed;
|
|
77
|
+
try {
|
|
78
|
+
parsed = JSON.parse(raw);
|
|
79
|
+
} catch {
|
|
80
|
+
throw new LunoraError("BAD_REQUEST", `"args" must be a JSON object; received a string that is not valid JSON`);
|
|
81
|
+
}
|
|
82
|
+
if (!isPlainObject(parsed)) {
|
|
83
|
+
throw new LunoraError("BAD_REQUEST", `"args" must be a JSON object; the provided string decoded to ${describeArgs(parsed)}`);
|
|
84
|
+
}
|
|
85
|
+
return parsed;
|
|
86
|
+
}
|
|
87
|
+
if (!isPlainObject(raw)) {
|
|
88
|
+
throw new LunoraError("BAD_REQUEST", `"args" must be a JSON object, got ${describeArgs(raw)}`);
|
|
89
|
+
}
|
|
90
|
+
return raw;
|
|
91
|
+
};
|
|
69
92
|
const readRunArguments = (input) => {
|
|
70
93
|
const functionPath = readFunctionPath(input);
|
|
71
|
-
const
|
|
72
|
-
const isPlainObject = typeof rawArguments === "object" && rawArguments !== null && !Array.isArray(rawArguments);
|
|
73
|
-
const args = isPlainObject ? rawArguments : {};
|
|
94
|
+
const args = readArgumentsBag(input.args);
|
|
74
95
|
const shardKey = typeof input.shardKey === "string" && input.shardKey.length > 0 ? input.shardKey : void 0;
|
|
75
96
|
return { args, functionPath, shardKey };
|
|
76
97
|
};
|
|
77
98
|
const reference = (functionPath) => {
|
|
78
99
|
return { __lunoraRef: functionPath };
|
|
79
100
|
};
|
|
101
|
+
const bytesToBase64 = (bytes) => {
|
|
102
|
+
let binary = "";
|
|
103
|
+
const chunk = 32768;
|
|
104
|
+
for (let index = 0; index < bytes.length; index += chunk) {
|
|
105
|
+
binary += String.fromCharCode(...bytes.subarray(index, index + chunk));
|
|
106
|
+
}
|
|
107
|
+
return btoa(binary);
|
|
108
|
+
};
|
|
109
|
+
const jsonResultReplacer = (_key, value) => {
|
|
110
|
+
if (typeof value === "bigint") {
|
|
111
|
+
return value.toString();
|
|
112
|
+
}
|
|
113
|
+
if (value instanceof ArrayBuffer) {
|
|
114
|
+
return bytesToBase64(new Uint8Array(value));
|
|
115
|
+
}
|
|
116
|
+
if (ArrayBuffer.isView(value)) {
|
|
117
|
+
const view = value;
|
|
118
|
+
return bytesToBase64(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
};
|
|
80
122
|
const ok = (value) => {
|
|
81
|
-
const text = value === void 0 ? "null" : JSON.stringify(value,
|
|
123
|
+
const text = value === void 0 ? "null" : JSON.stringify(value, jsonResultReplacer, 2);
|
|
82
124
|
return { content: [{ text, type: "text" }] };
|
|
83
125
|
};
|
|
126
|
+
const FUNCTIONS_CACHE_TTL_MS = 3e4;
|
|
127
|
+
const functionsCache = /* @__PURE__ */ new WeakMap();
|
|
128
|
+
const listFunctionsCached = (client) => {
|
|
129
|
+
const now = Date.now();
|
|
130
|
+
const cached = functionsCache.get(client);
|
|
131
|
+
if (cached !== void 0 && cached.expiresAt > now) {
|
|
132
|
+
return cached.promise;
|
|
133
|
+
}
|
|
134
|
+
const promise = client.listFunctions().catch((error) => {
|
|
135
|
+
if (functionsCache.get(client)?.promise === promise) {
|
|
136
|
+
functionsCache.delete(client);
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
});
|
|
140
|
+
functionsCache.set(client, { expiresAt: now + FUNCTIONS_CACHE_TTL_MS, promise });
|
|
141
|
+
return promise;
|
|
142
|
+
};
|
|
84
143
|
const assertRunnable = async (client, functionPath, expectedKind) => {
|
|
85
|
-
const functions = await client
|
|
144
|
+
const functions = await listFunctionsCached(client);
|
|
86
145
|
const descriptor = functions.find((function_) => function_.path === functionPath);
|
|
87
146
|
if (descriptor === void 0) {
|
|
88
147
|
throw new LunoraError("NOT_FOUND", `function not found or not public: ${functionPath}`);
|
|
@@ -104,7 +163,7 @@ const callTool = async (client, name, input, allowWrites = false) => {
|
|
|
104
163
|
switch (name) {
|
|
105
164
|
case "lunora_get_function_schema": {
|
|
106
165
|
const functionPath = readFunctionPath(input);
|
|
107
|
-
const functions = await client
|
|
166
|
+
const functions = await listFunctionsCached(client);
|
|
108
167
|
const descriptor = functions.find((function_) => function_.path === functionPath);
|
|
109
168
|
if (descriptor === void 0) {
|
|
110
169
|
return { content: [{ text: `function not found: ${functionPath}`, type: "text" }], isError: true };
|
|
@@ -112,7 +171,7 @@ const callTool = async (client, name, input, allowWrites = false) => {
|
|
|
112
171
|
return ok({ args: descriptor.args ?? [], kind: descriptor.kind, path: descriptor.path });
|
|
113
172
|
}
|
|
114
173
|
case "lunora_list_functions": {
|
|
115
|
-
return ok(await client
|
|
174
|
+
return ok(await listFunctionsCached(client));
|
|
116
175
|
}
|
|
117
176
|
case "lunora_list_tables": {
|
|
118
177
|
return ok(await client.listGlobalTables());
|
|
@@ -6,7 +6,7 @@ import { LunoraError } from '@lunora/errors';
|
|
|
6
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
7
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
8
|
import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
-
import { toolDefinitions, callTool } from './READ_ONLY_TOOL_DEFINITIONS-
|
|
9
|
+
import { toolDefinitions, callTool } from './READ_ONLY_TOOL_DEFINITIONS-CWb_wFd5.mjs';
|
|
10
10
|
|
|
11
11
|
const resolveVersion = () => {
|
|
12
12
|
try {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
2
|
+
import { createLunoraMcpServer } from './connectStdio-CeI3w0q7.mjs';
|
|
3
|
+
|
|
4
|
+
const serveStateless = async (server, request, options) => {
|
|
5
|
+
const transport = new WebStandardStreamableHTTPServerTransport({ enableJsonResponse: true, sessionIdGenerator: void 0 });
|
|
6
|
+
await server.connect(transport);
|
|
7
|
+
const response = await transport.handleRequest(request, options);
|
|
8
|
+
transport.close().catch(() => void 0);
|
|
9
|
+
server.close().catch(() => void 0);
|
|
10
|
+
return response;
|
|
11
|
+
};
|
|
12
|
+
const createMcpFetchHandler = (options) => (request) => serveStateless(createLunoraMcpServer(options), request);
|
|
13
|
+
|
|
14
|
+
export { createMcpFetchHandler, serveStateless };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { LunoraError } from '@lunora/errors';
|
|
2
|
+
import { createChargeMiddleware } from '@lunora/x402/charge';
|
|
3
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
|
+
import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { serveStateless } from './createMcpFetchHandler-D8HWylar.mjs';
|
|
6
|
+
|
|
7
|
+
const DEFAULT_SERVER_INFO = { name: "lunora-paid-mcp", version: "0.0.0" };
|
|
8
|
+
const CALL_TOOL_METHOD = "tools/call";
|
|
9
|
+
const callToolName = (message) => {
|
|
10
|
+
if (typeof message !== "object" || message === null) {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
const { method, params } = message;
|
|
14
|
+
if (method !== CALL_TOOL_METHOD || typeof params !== "object" || params === null) {
|
|
15
|
+
return void 0;
|
|
16
|
+
}
|
|
17
|
+
const { name } = params;
|
|
18
|
+
return typeof name === "string" ? name : void 0;
|
|
19
|
+
};
|
|
20
|
+
const refuseBatch = () => Response.json({ error: "A JSON-RPC batch may not reference a paid MCP tool; send paid tools/call requests individually." }, { status: 400 });
|
|
21
|
+
const createPaidMcpServer = (config) => {
|
|
22
|
+
const tools = /* @__PURE__ */ new Map();
|
|
23
|
+
const prices = /* @__PURE__ */ new Map();
|
|
24
|
+
const middlewareByTool = /* @__PURE__ */ new Map();
|
|
25
|
+
const serverInfo = config.serverInfo ?? DEFAULT_SERVER_INFO;
|
|
26
|
+
const register = (options, handler, price) => {
|
|
27
|
+
if (tools.has(options.name)) {
|
|
28
|
+
throw new LunoraError("BAD_REQUEST", `MCP tool "${options.name}" is already registered.`);
|
|
29
|
+
}
|
|
30
|
+
const definition = { description: options.description, inputSchema: options.inputSchema, name: options.name };
|
|
31
|
+
if (options.annotations !== void 0) {
|
|
32
|
+
definition.annotations = options.annotations;
|
|
33
|
+
}
|
|
34
|
+
tools.set(options.name, { definition, handler });
|
|
35
|
+
if (price !== void 0) {
|
|
36
|
+
prices.set(options.name, price);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const buildServer = () => {
|
|
40
|
+
const server = new Server(serverInfo, { capabilities: { tools: {} } });
|
|
41
|
+
server.setRequestHandler(ListToolsRequestSchema, () => {
|
|
42
|
+
return { tools: [...tools.values()].map((entry) => entry.definition) };
|
|
43
|
+
});
|
|
44
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
45
|
+
const entry = tools.get(request.params.name);
|
|
46
|
+
if (entry === void 0) {
|
|
47
|
+
return { content: [{ text: `unknown tool: ${request.params.name}`, type: "text" }], isError: true };
|
|
48
|
+
}
|
|
49
|
+
const result = await entry.handler(request.params.arguments ?? {});
|
|
50
|
+
return result;
|
|
51
|
+
});
|
|
52
|
+
return server;
|
|
53
|
+
};
|
|
54
|
+
const gateFor = (name, price) => {
|
|
55
|
+
let pending = middlewareByTool.get(name);
|
|
56
|
+
if (pending === void 0) {
|
|
57
|
+
pending = createChargeMiddleware({ ...config.charge, price }, { resource: name }).catch((error) => {
|
|
58
|
+
middlewareByTool.delete(name);
|
|
59
|
+
throw error;
|
|
60
|
+
});
|
|
61
|
+
middlewareByTool.set(name, pending);
|
|
62
|
+
}
|
|
63
|
+
return pending;
|
|
64
|
+
};
|
|
65
|
+
const fetchHandler = async (request) => {
|
|
66
|
+
let parsedBody;
|
|
67
|
+
try {
|
|
68
|
+
parsedBody = await request.clone().json();
|
|
69
|
+
} catch {
|
|
70
|
+
parsedBody = void 0;
|
|
71
|
+
}
|
|
72
|
+
const dispatch = () => serveStateless(buildServer(), request, parsedBody === void 0 ? void 0 : { parsedBody });
|
|
73
|
+
if (Array.isArray(parsedBody)) {
|
|
74
|
+
return parsedBody.some((message) => prices.has(callToolName(message) ?? "")) ? refuseBatch() : dispatch();
|
|
75
|
+
}
|
|
76
|
+
const name = callToolName(parsedBody);
|
|
77
|
+
const price = name === void 0 ? void 0 : prices.get(name);
|
|
78
|
+
if (name === void 0 || price === void 0) {
|
|
79
|
+
return dispatch();
|
|
80
|
+
}
|
|
81
|
+
const middleware = await gateFor(name, price);
|
|
82
|
+
return middleware.handle(request, dispatch);
|
|
83
|
+
};
|
|
84
|
+
const paidTool = (options, handler) => {
|
|
85
|
+
register(options, handler, options.price);
|
|
86
|
+
};
|
|
87
|
+
const tool = (options, handler) => {
|
|
88
|
+
register(options, handler);
|
|
89
|
+
};
|
|
90
|
+
return { fetchHandler, paidTool, tool };
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { createPaidMcpServer };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/mcp",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.22",
|
|
4
4
|
"description": "Model Context Protocol server exposing a Lunora deployment to AI agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -49,8 +49,9 @@
|
|
|
49
49
|
"access": "public"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@lunora/client": "1.0.0-alpha.
|
|
53
|
-
"@lunora/errors": "1.0.0-alpha.
|
|
52
|
+
"@lunora/client": "1.0.0-alpha.21",
|
|
53
|
+
"@lunora/errors": "1.0.0-alpha.4",
|
|
54
|
+
"@lunora/x402": "1.0.0-alpha.2",
|
|
54
55
|
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
55
56
|
},
|
|
56
57
|
"engines": {
|