@1ly/mcp-server 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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +330 -0
  3. package/dist/budget.d.ts +7 -0
  4. package/dist/budget.d.ts.map +1 -0
  5. package/dist/budget.js +64 -0
  6. package/dist/budget.js.map +1 -0
  7. package/dist/config.d.ts +53 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +37 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/http.d.ts +26 -0
  12. package/dist/http.d.ts.map +1 -0
  13. package/dist/http.js +85 -0
  14. package/dist/http.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +87 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp.d.ts +22 -0
  20. package/dist/mcp.d.ts.map +1 -0
  21. package/dist/mcp.js +23 -0
  22. package/dist/mcp.js.map +1 -0
  23. package/dist/selftest.d.ts +2 -0
  24. package/dist/selftest.d.ts.map +1 -0
  25. package/dist/selftest.js +57 -0
  26. package/dist/selftest.js.map +1 -0
  27. package/dist/tools/call.d.ts +36 -0
  28. package/dist/tools/call.d.ts.map +1 -0
  29. package/dist/tools/call.js +131 -0
  30. package/dist/tools/call.js.map +1 -0
  31. package/dist/tools/create-link.d.ts +44 -0
  32. package/dist/tools/create-link.d.ts.map +1 -0
  33. package/dist/tools/create-link.js +62 -0
  34. package/dist/tools/create-link.js.map +1 -0
  35. package/dist/tools/delete-link.d.ts +22 -0
  36. package/dist/tools/delete-link.d.ts.map +1 -0
  37. package/dist/tools/delete-link.js +37 -0
  38. package/dist/tools/delete-link.js.map +1 -0
  39. package/dist/tools/details.d.ts +23 -0
  40. package/dist/tools/details.d.ts.map +1 -0
  41. package/dist/tools/details.js +101 -0
  42. package/dist/tools/details.js.map +1 -0
  43. package/dist/tools/get-stats.d.ts +26 -0
  44. package/dist/tools/get-stats.d.ts.map +1 -0
  45. package/dist/tools/get-stats.js +44 -0
  46. package/dist/tools/get-stats.js.map +1 -0
  47. package/dist/tools/list-links.d.ts +18 -0
  48. package/dist/tools/list-links.d.ts.map +1 -0
  49. package/dist/tools/list-links.js +30 -0
  50. package/dist/tools/list-links.js.map +1 -0
  51. package/dist/tools/review.d.ts +35 -0
  52. package/dist/tools/review.d.ts.map +1 -0
  53. package/dist/tools/review.js +73 -0
  54. package/dist/tools/review.js.map +1 -0
  55. package/dist/tools/search.d.ts +40 -0
  56. package/dist/tools/search.d.ts.map +1 -0
  57. package/dist/tools/search.js +79 -0
  58. package/dist/tools/search.js.map +1 -0
  59. package/dist/tools/update-link.d.ts +43 -0
  60. package/dist/tools/update-link.d.ts.map +1 -0
  61. package/dist/tools/update-link.js +61 -0
  62. package/dist/tools/update-link.js.map +1 -0
  63. package/dist/types.d.ts +61 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +3 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/wallet/evm.d.ts +48 -0
  68. package/dist/wallet/evm.d.ts.map +1 -0
  69. package/dist/wallet/evm.js +229 -0
  70. package/dist/wallet/evm.js.map +1 -0
  71. package/dist/wallet/solana.d.ts +6 -0
  72. package/dist/wallet/solana.d.ts.map +1 -0
  73. package/dist/wallet/solana.js +95 -0
  74. package/dist/wallet/solana.js.map +1 -0
  75. package/package.json +70 -0
package/dist/index.js ADDED
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
7
+ const search_js_1 = require("./tools/search.js");
8
+ const details_js_1 = require("./tools/details.js");
9
+ const call_js_1 = require("./tools/call.js");
10
+ const review_js_1 = require("./tools/review.js");
11
+ const create_link_js_1 = require("./tools/create-link.js");
12
+ const list_links_js_1 = require("./tools/list-links.js");
13
+ const update_link_js_1 = require("./tools/update-link.js");
14
+ const delete_link_js_1 = require("./tools/delete-link.js");
15
+ const get_stats_js_1 = require("./tools/get-stats.js");
16
+ const config_js_1 = require("./config.js");
17
+ const selftest_js_1 = require("./selftest.js");
18
+ const mcp_js_1 = require("./mcp.js");
19
+ const argv = process.argv.slice(2);
20
+ const isSelfTest = argv.includes("--self-test");
21
+ async function main() {
22
+ if (isSelfTest) {
23
+ const code = await (0, selftest_js_1.runSelfTest)(argv);
24
+ process.exit(code);
25
+ }
26
+ const config = (0, config_js_1.loadConfig)();
27
+ const server = new index_js_1.Server({
28
+ name: "1ly",
29
+ version: "0.1.0",
30
+ }, {
31
+ capabilities: {
32
+ tools: {},
33
+ },
34
+ });
35
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
36
+ tools: [
37
+ search_js_1.searchTool,
38
+ details_js_1.detailsTool,
39
+ call_js_1.callTool,
40
+ review_js_1.reviewTool,
41
+ create_link_js_1.createLinkTool,
42
+ list_links_js_1.listLinksTool,
43
+ update_link_js_1.updateLinkTool,
44
+ delete_link_js_1.deleteLinkTool,
45
+ get_stats_js_1.getStatsTool,
46
+ ],
47
+ }));
48
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
49
+ const { name, arguments: args } = request.params;
50
+ try {
51
+ switch (name) {
52
+ case "1ly_search":
53
+ return await (0, search_js_1.handleSearch)(args, config);
54
+ case "1ly_get_details":
55
+ return await (0, details_js_1.handleDetails)(args, config);
56
+ case "1ly_call":
57
+ return await (0, call_js_1.handleCall)(args, config);
58
+ case "1ly_review":
59
+ return await (0, review_js_1.handleReview)(args, config);
60
+ case "1ly_create_link":
61
+ return await (0, create_link_js_1.handleCreateLink)(args, config);
62
+ case "1ly_list_links":
63
+ return await (0, list_links_js_1.handleListLinks)(args, config);
64
+ case "1ly_update_link":
65
+ return await (0, update_link_js_1.handleUpdateLink)(args, config);
66
+ case "1ly_delete_link":
67
+ return await (0, delete_link_js_1.handleDeleteLink)(args, config);
68
+ case "1ly_get_stats":
69
+ return await (0, get_stats_js_1.handleGetStats)(args, config);
70
+ default:
71
+ return {
72
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
73
+ isError: true,
74
+ };
75
+ }
76
+ }
77
+ catch (error) {
78
+ const message = error instanceof Error ? error.message : "Unknown error";
79
+ return (0, mcp_js_1.mcpError)(message);
80
+ }
81
+ });
82
+ const transport = new stdio_js_1.StdioServerTransport();
83
+ await server.connect(transport);
84
+ console.error("1ly MCP server running");
85
+ }
86
+ main().catch(console.error);
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export declare function mcpJson(ok: boolean, payload: Record<string, unknown>, isError?: boolean): {
2
+ isError?: true | undefined;
3
+ content: {
4
+ type: "text";
5
+ text: string;
6
+ }[];
7
+ };
8
+ export declare function mcpOk(data: unknown, meta?: Record<string, unknown>): {
9
+ isError?: true | undefined;
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ };
15
+ export declare function mcpError(message: string, meta?: Record<string, unknown>): {
16
+ isError?: true | undefined;
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ };
22
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,UAAQ;;;;;;EAUrF;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;EAElE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;EAEvE"}
package/dist/mcp.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mcpJson = mcpJson;
4
+ exports.mcpOk = mcpOk;
5
+ exports.mcpError = mcpError;
6
+ function mcpJson(ok, payload, isError = false) {
7
+ return {
8
+ content: [
9
+ {
10
+ type: "text",
11
+ text: JSON.stringify({ ok, ...payload }, null, 2),
12
+ },
13
+ ],
14
+ ...(isError ? { isError: true } : {}),
15
+ };
16
+ }
17
+ function mcpOk(data, meta) {
18
+ return mcpJson(true, { data, ...(meta ? { meta } : {}) });
19
+ }
20
+ function mcpError(message, meta) {
21
+ return mcpJson(false, { error: { message }, ...(meta ? { meta } : {}) }, true);
22
+ }
23
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";;AAEA,0BAUC;AAED,sBAEC;AAED,4BAEC;AAlBD,SAAgB,OAAO,CAAC,EAAW,EAAE,OAAgC,EAAE,OAAO,GAAG,KAAK;IACpF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aACzB;SAC3B;QACD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAgB,KAAK,CAAC,IAAa,EAAE,IAA8B;IACjE,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,QAAQ,CAAC,OAAe,EAAE,IAA8B;IACtE,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runSelfTest(argv: string[]): Promise<number>;
2
+ //# sourceMappingURL=selftest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selftest.d.ts","sourceRoot":"","sources":["../src/selftest.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CjE"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSelfTest = runSelfTest;
4
+ const config_js_1 = require("./config.js");
5
+ const http_js_1 = require("./http.js");
6
+ const solana_js_1 = require("./wallet/solana.js");
7
+ const evm_js_1 = require("./wallet/evm.js");
8
+ function log(line) {
9
+ console.error(line);
10
+ }
11
+ async function runSelfTest(argv) {
12
+ const showHelp = argv.includes("--help") || argv.includes("-h");
13
+ if (showHelp) {
14
+ log("1ly-mcp --self-test");
15
+ log("");
16
+ log("Required env:");
17
+ log("- ONELY_WALLET_TYPE=solana|evm");
18
+ log("- ONELY_WALLET_KEY=/path/to/key (or inline key)");
19
+ log("");
20
+ log("Optional env:");
21
+ log("- ONELY_API_BASE is not configurable (always https://1ly.store)");
22
+ log("- ONELY_BUDGET_PER_CALL=1.00");
23
+ log("- ONELY_BUDGET_DAILY=50.00");
24
+ log("- ONELY_BUDGET_STATE_FILE=/path/to/state.json");
25
+ return 0;
26
+ }
27
+ try {
28
+ log("[self-test] loading config");
29
+ const config = (0, config_js_1.loadConfig)();
30
+ log(`[self-test] apiBase=${config.apiBase}`);
31
+ if (!config.wallet) {
32
+ throw new Error("Missing wallet config: set ONELY_WALLET_TYPE and ONELY_WALLET_KEY");
33
+ }
34
+ log(`[self-test] walletType=${config.wallet.type}`);
35
+ log("[self-test] loading wallet");
36
+ if (config.wallet.type === "solana") {
37
+ const kp = await (0, solana_js_1.loadSolanaWallet)(config.wallet.key);
38
+ log(`[self-test] solana pubkey=${kp.publicKey.toBase58()}`);
39
+ }
40
+ else {
41
+ const account = await (0, evm_js_1.loadEvmWallet)(config.wallet.key);
42
+ log(`[self-test] evm address=${account.address}`);
43
+ }
44
+ log("[self-test] checking 1ly.store reachability");
45
+ const url = `${config.apiBase}/api/discover?q=api&limit=1`;
46
+ const res = await (0, http_js_1.fetchWithTimeout)(url, { timeoutMs: 10_000, retries: 1 });
47
+ await (0, http_js_1.assertOk)(res, "Reachability check failed");
48
+ await res.json().catch(() => null);
49
+ log("[self-test] OK");
50
+ return 0;
51
+ }
52
+ catch (e) {
53
+ log(`[self-test] FAIL: ${e instanceof Error ? e.message : String(e)}`);
54
+ return 1;
55
+ }
56
+ }
57
+ //# sourceMappingURL=selftest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selftest.js","sourceRoot":"","sources":["../src/selftest.ts"],"names":[],"mappings":";;AASA,kCA8CC;AAvDD,2CAAyC;AACzC,uCAAuD;AACvD,kDAAsD;AACtD,4CAAgD;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,GAAG,CAAC,eAAe,CAAC,CAAC;QACrB,GAAG,CAAC,gCAAgC,CAAC,CAAC;QACtC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACvD,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,GAAG,CAAC,eAAe,CAAC,CAAC;QACrB,GAAG,CAAC,iEAAiE,CAAC,CAAC;QACvE,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACpC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAClC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACH,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;QAC5B,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QACD,GAAG,CAAC,0BAA0B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEpD,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,MAAM,IAAA,4BAAgB,EAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrD,GAAG,CAAC,6BAA6B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,IAAA,sBAAa,EAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvD,GAAG,CAAC,2BAA2B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,6BAA6B,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,IAAA,0BAAgB,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAA,kBAAQ,EAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACjD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACnC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Config } from "../config.js";
2
+ export declare const callTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ endpoint: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ method: {
13
+ type: string;
14
+ enum: string[];
15
+ description: string;
16
+ };
17
+ body: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ headers: {
22
+ type: string;
23
+ description: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ };
29
+ export declare function handleCall(args: unknown, config: Config): Promise<{
30
+ isError?: true | undefined;
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ }>;
36
+ //# sourceMappingURL=call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/tools/call.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BpB,CAAC;AAiBF,wBAAsB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;;;;;;GAiH7D"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.callTool = void 0;
4
+ exports.handleCall = handleCall;
5
+ const zod_1 = require("zod");
6
+ const solana_js_1 = require("../wallet/solana.js");
7
+ const evm_js_1 = require("../wallet/evm.js");
8
+ const http_js_1 = require("../http.js");
9
+ const budget_js_1 = require("../budget.js");
10
+ const mcp_js_1 = require("../mcp.js");
11
+ const client_1 = require("@x402/core/client");
12
+ const http_1 = require("@x402/core/http");
13
+ exports.callTool = {
14
+ name: "1ly_call",
15
+ description: "Call a paid API on 1ly.store with automatic x402 payment. Returns the API response and purchase metadata for leaving a review.",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ endpoint: {
20
+ type: "string",
21
+ description: "API endpoint (e.g., 'joe/weather' or '/api/link/joe/weather')",
22
+ },
23
+ method: {
24
+ type: "string",
25
+ enum: ["GET", "POST", "PUT", "DELETE", "PATCH"],
26
+ description: "HTTP method (default: GET)",
27
+ },
28
+ body: {
29
+ type: "object",
30
+ description: "Request body for POST/PUT/PATCH requests",
31
+ },
32
+ headers: {
33
+ type: "object",
34
+ description: "Additional headers to send",
35
+ },
36
+ },
37
+ required: ["endpoint"],
38
+ },
39
+ };
40
+ const InputSchema = zod_1.z.object({
41
+ endpoint: zod_1.z.string(),
42
+ method: zod_1.z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional().default("GET"),
43
+ body: zod_1.z.record(zod_1.z.unknown()).optional(),
44
+ headers: zod_1.z.record(zod_1.z.string()).optional(),
45
+ });
46
+ function parseEndpoint(endpoint) {
47
+ if (endpoint.startsWith("/api/link/")) {
48
+ return endpoint;
49
+ }
50
+ const cleaned = endpoint.replace(/^\//, "");
51
+ return `/api/link/${cleaned}`;
52
+ }
53
+ async function handleCall(args, config) {
54
+ const input = InputSchema.parse(args);
55
+ if (!config.wallet) {
56
+ throw new Error("Missing wallet config: set ONELY_WALLET_TYPE and ONELY_WALLET_KEY");
57
+ }
58
+ const endpointPath = parseEndpoint(input.endpoint);
59
+ const fullUrl = `${config.apiBase}${endpointPath}`;
60
+ const initialResponse = await (0, http_js_1.fetchWithTimeout)(fullUrl, {
61
+ method: input.method,
62
+ headers: {
63
+ "Content-Type": "application/json",
64
+ ...input.headers,
65
+ },
66
+ body: input.body ? JSON.stringify(input.body) : undefined,
67
+ });
68
+ if (initialResponse.status !== 402) {
69
+ if (initialResponse.ok) {
70
+ const data = await initialResponse.json();
71
+ return (0, mcp_js_1.mcpOk)({ data, _1ly: { note: "No payment required (free API)" } });
72
+ }
73
+ // Non-402 failure
74
+ await (0, http_js_1.assertOk)(initialResponse, "API call failed");
75
+ }
76
+ // Parse 402 response body for payment requirements
77
+ const body402 = (await initialResponse.json());
78
+ const prefersSolana = config.wallet.type === "solana";
79
+ const accepts = body402.accepts?.find((entry) => prefersSolana ? String(entry.network).startsWith("solana:") : String(entry.network).startsWith("eip155:")) || body402.accepts?.[0];
80
+ if (!accepts) {
81
+ throw new Error("402 response missing payment requirements in body");
82
+ }
83
+ // Price is in smallest unit (e.g., 10000 = 0.01 USDC with 6 decimals)
84
+ const priceInSmallestUnit = parseInt(accepts.amount || accepts.maxAmountRequired || "0");
85
+ const priceUsd = priceInSmallestUnit / 1_000_000;
86
+ if (priceUsd > config.budgets.perCall) {
87
+ throw new Error(`Price $${priceUsd} exceeds per-call budget limit of $${config.budgets.perCall}`);
88
+ }
89
+ // Enforce and record daily spending
90
+ (0, budget_js_1.checkAndRecordDailySpend)(config, priceUsd);
91
+ // Build x402 payment signature header (v2)
92
+ let paymentSignature;
93
+ if (config.wallet.type === "solana") {
94
+ const wallet = await (0, solana_js_1.loadSolanaWallet)(config.wallet.key);
95
+ const coreClient = new client_1.x402Client((_, acceptsList) => {
96
+ return (acceptsList.find((entry) => String(entry.network).startsWith("solana:")) ||
97
+ acceptsList[0]);
98
+ });
99
+ const httpClient = new http_1.x402HTTPClient(coreClient);
100
+ const paymentRequired = httpClient.getPaymentRequiredResponse((name) => initialResponse.headers.get(name), body402);
101
+ paymentSignature = await (0, solana_js_1.buildSolanaPaymentSignature)(paymentRequired, wallet);
102
+ }
103
+ else if (config.wallet.type === "evm") {
104
+ const coreClient = new client_1.x402Client((_, acceptsList) => {
105
+ return (acceptsList.find((entry) => String(entry.network).startsWith("eip155:")) ||
106
+ acceptsList[0]);
107
+ });
108
+ const httpClient = new http_1.x402HTTPClient(coreClient);
109
+ const paymentRequired = httpClient.getPaymentRequiredResponse((name) => initialResponse.headers.get(name), body402);
110
+ paymentSignature = await (0, evm_js_1.buildEvmPaymentSignature)(paymentRequired, config.wallet.key);
111
+ }
112
+ else {
113
+ throw new Error(`Unsupported wallet type: ${config.wallet.type}`);
114
+ }
115
+ const paidResponse = await fetch(fullUrl, {
116
+ method: input.method,
117
+ headers: {
118
+ "Content-Type": "application/json",
119
+ "payment-signature": paymentSignature,
120
+ ...input.headers,
121
+ },
122
+ body: input.body ? JSON.stringify(input.body) : undefined,
123
+ });
124
+ if (!paidResponse.ok) {
125
+ const errorText = await paidResponse.text();
126
+ throw new Error(`Payment failed: ${paidResponse.status} - ${errorText}`);
127
+ }
128
+ const responseData = await paidResponse.json();
129
+ return (0, mcp_js_1.mcpOk)(responseData);
130
+ }
131
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/tools/call.ts"],"names":[],"mappings":";;;AAuDA,gCAiHC;AAxKD,6BAAwB;AAExB,mDAAoF;AACpF,6CAA4D;AAC5D,wCAAwD;AACxD,4CAAwD;AACxD,sCAAkC;AAClC,8CAA+C;AAC/C,0CAAiD;AAEpC,QAAA,QAAQ,GAAG;IACtB,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,gIAAgI;IAClI,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,+DAA+D;aAClE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;gBAC/C,WAAW,EAAE,4BAA4B;aAC1C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0CAA0C;aACxD;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4BAA4B;aAC1C;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB;CACF,CAAC;AAEF,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnF,IAAI,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO,aAAa,OAAO,EAAE,CAAC;AAChC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,IAAa,EAAE,MAAc;IAC5D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAM,IAAA,0BAAgB,EAAC,OAAO,EAAE;QACtD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,KAAK,CAAC,OAAO;SACjB;QACD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC1D,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACnC,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;YAC1C,OAAO,IAAA,cAAK,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAA,kBAAQ,EAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACrD,CAAC;IAED,mDAAmD;IACnD,MAAM,OAAO,GAAG,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAW5C,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9C,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAC1G,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,sEAAsE;IACtE,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,mBAAmB,GAAG,SAAS,CAAC;IAEjD,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,UAAU,QAAQ,sCAAsC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CACjF,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,IAAA,oCAAwB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE3C,2CAA2C;IAC3C,IAAI,gBAAwB,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAgB,EAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE;YACnD,OAAO,CACL,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACxE,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,qBAAc,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,UAAU,CAAC,0BAA0B,CAC3D,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3C,OAAO,CACR,CAAC;QACF,gBAAgB,GAAG,MAAM,IAAA,uCAA2B,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,mBAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE;YACnD,OAAO,CACL,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACxE,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,qBAAc,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,UAAU,CAAC,0BAA0B,CAC3D,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3C,OAAO,CACR,CAAC;QACF,gBAAgB,GAAG,MAAM,IAAA,iCAAwB,EAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxF,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;QACxC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,mBAAmB,EAAE,gBAAgB;YACrC,GAAG,KAAK,CAAC,OAAO;SACjB;QACD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC1D,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAE/C,OAAO,IAAA,cAAK,EAAC,YAAY,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Config } from "../config.js";
2
+ export declare const createLinkTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ title: {
9
+ type: string;
10
+ };
11
+ url: {
12
+ type: string;
13
+ };
14
+ description: {
15
+ type: string;
16
+ };
17
+ slug: {
18
+ type: string;
19
+ };
20
+ price: {
21
+ type: string;
22
+ };
23
+ currency: {
24
+ type: string;
25
+ enum: string[];
26
+ };
27
+ isPublic: {
28
+ type: string;
29
+ };
30
+ isStealth: {
31
+ type: string;
32
+ };
33
+ };
34
+ required: string[];
35
+ };
36
+ };
37
+ export declare function handleCreateLink(args: unknown, config: Config): Promise<{
38
+ isError?: true | undefined;
39
+ content: {
40
+ type: "text";
41
+ text: string;
42
+ }[];
43
+ }>;
44
+ //# sourceMappingURL=create-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-link.d.ts","sourceRoot":"","sources":["../../src/tools/create-link.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiB1B,CAAC;AAaF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;;;;;;GA2BnE"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLinkTool = void 0;
4
+ exports.handleCreateLink = handleCreateLink;
5
+ const zod_1 = require("zod");
6
+ const http_js_1 = require("../http.js");
7
+ const mcp_js_1 = require("../mcp.js");
8
+ exports.createLinkTool = {
9
+ name: "1ly_create_link",
10
+ description: "Create a new API link (paid or free) using your 1ly developer API key.",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ title: { type: "string" },
15
+ url: { type: "string" },
16
+ description: { type: "string" },
17
+ slug: { type: "string" },
18
+ price: { type: "string" },
19
+ currency: { type: "string", enum: ["USDC"] },
20
+ isPublic: { type: "boolean" },
21
+ isStealth: { type: "boolean" },
22
+ },
23
+ required: ["title", "url"],
24
+ },
25
+ };
26
+ const InputSchema = zod_1.z.object({
27
+ title: zod_1.z.string().min(1).max(200),
28
+ url: zod_1.z.string().url(),
29
+ description: zod_1.z.string().max(500).optional(),
30
+ slug: zod_1.z.string().min(3).max(64).regex(/^[a-z0-9-]+$/).optional(),
31
+ price: zod_1.z.string().regex(/^\d+(\.\d{1,18})?$/).optional(),
32
+ currency: zod_1.z.literal("USDC").optional(),
33
+ isPublic: zod_1.z.boolean().optional(),
34
+ isStealth: zod_1.z.boolean().optional(),
35
+ });
36
+ async function handleCreateLink(args, config) {
37
+ const input = InputSchema.parse(args);
38
+ if (!config.apiKey) {
39
+ throw new Error("Missing ONELY_API_KEY for create link");
40
+ }
41
+ const res = await (0, http_js_1.fetchWithTimeout)(`${config.apiBase}/api/v1/links`, {
42
+ method: "POST",
43
+ headers: {
44
+ "Content-Type": "application/json",
45
+ Authorization: `Bearer ${config.apiKey}`,
46
+ },
47
+ body: JSON.stringify({
48
+ title: input.title,
49
+ url: input.url,
50
+ description: input.description,
51
+ slug: input.slug,
52
+ price: input.price,
53
+ currency: input.currency || "USDC",
54
+ isPublic: input.isPublic ?? true,
55
+ isStealth: input.isStealth ?? false,
56
+ }),
57
+ });
58
+ await (0, http_js_1.assertOk)(res, "Create link failed");
59
+ const data = await res.json();
60
+ return (0, mcp_js_1.mcpOk)(data);
61
+ }
62
+ //# sourceMappingURL=create-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-link.js","sourceRoot":"","sources":["../../src/tools/create-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Config } from "../config.js";
2
+ export declare const deleteLinkTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ id: {
9
+ type: string;
10
+ };
11
+ };
12
+ required: string[];
13
+ };
14
+ };
15
+ export declare function handleDeleteLink(args: unknown, config: Config): Promise<{
16
+ isError?: true | undefined;
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ }>;
22
+ //# sourceMappingURL=delete-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-link.d.ts","sourceRoot":"","sources":["../../src/tools/delete-link.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,eAAO,MAAM,cAAc;;;;;;;;;;;;CAU1B,CAAC;AAMF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;;;;;;GAgBnE"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteLinkTool = void 0;
4
+ exports.handleDeleteLink = handleDeleteLink;
5
+ const zod_1 = require("zod");
6
+ const http_js_1 = require("../http.js");
7
+ const mcp_js_1 = require("../mcp.js");
8
+ exports.deleteLinkTool = {
9
+ name: "1ly_delete_link",
10
+ description: "Delete an API link by id (requires ONELY_API_KEY).",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ id: { type: "string" },
15
+ },
16
+ required: ["id"],
17
+ },
18
+ };
19
+ const InputSchema = zod_1.z.object({
20
+ id: zod_1.z.string().uuid(),
21
+ });
22
+ async function handleDeleteLink(args, config) {
23
+ const input = InputSchema.parse(args);
24
+ if (!config.apiKey) {
25
+ throw new Error("Missing ONELY_API_KEY for delete link");
26
+ }
27
+ const res = await (0, http_js_1.fetchWithTimeout)(`${config.apiBase}/api/v1/links/${input.id}`, {
28
+ method: "DELETE",
29
+ headers: {
30
+ Authorization: `Bearer ${config.apiKey}`,
31
+ },
32
+ });
33
+ await (0, http_js_1.assertOk)(res, "Delete link failed");
34
+ const data = await res.json();
35
+ return (0, mcp_js_1.mcpOk)(data);
36
+ }
37
+ //# sourceMappingURL=delete-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-link.js","sourceRoot":"","sources":["../../src/tools/delete-link.ts"],"names":[],"mappings":";;;AAqBA,4CAgBC;AArCD,6BAAwB;AAExB,wCAAwD;AACxD,sCAAkC;AAErB,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,oDAAoD;IACjE,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACvB;QACD,QAAQ,EAAE,CAAC,IAAI,CAAC;KACjB;CACF,CAAC;AAEF,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3B,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CACtB,CAAC,CAAC;AAEI,KAAK,UAAU,gBAAgB,CAAC,IAAa,EAAE,MAAc;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,IAAA,0BAAgB,EAAC,GAAG,MAAM,CAAC,OAAO,iBAAiB,KAAK,CAAC,EAAE,EAAE,EAAE;QAC/E,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;SACzC;KACF,CAAC,CAAC;IAEH,MAAM,IAAA,kBAAQ,EAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,IAAA,cAAK,EAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Config } from "../config.js";
2
+ export declare const detailsTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ type: "object";
7
+ properties: {
8
+ endpoint: {
9
+ type: string;
10
+ description: string;
11
+ };
12
+ };
13
+ required: string[];
14
+ };
15
+ };
16
+ export declare function handleDetails(args: unknown, config: Config): Promise<{
17
+ isError?: true | undefined;
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ }>;
23
+ //# sourceMappingURL=details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"details.d.ts","sourceRoot":"","sources":["../../src/tools/details.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAK3C,eAAO,MAAM,WAAW;;;;;;;;;;;;;CAevB,CAAC;AAmBF,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;;;;;;GAqEhE"}