@hediet/linkrpc-mcp 0.0.1

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.
@@ -0,0 +1,168 @@
1
+ //#region src/guest/guestMain.ts
2
+ const __toJson = (v) => v === void 0 ? "" : JSON.stringify(v);
3
+ const __fromJson = (s) => s === "" ? void 0 : JSON.parse(s);
4
+ const __mkMethod = (serviceId, interfaceId, member) => serviceId ? `${serviceId}::${interfaceId}::${member}` : `${interfaceId}::${member}`;
5
+ const __presentationTag = "__linkrpcMcpPresentationV1";
6
+ let __nextStreamId = 0;
7
+ const __streamHandlers = /* @__PURE__ */ new Map();
8
+ let __nextTimerId = 0;
9
+ const __timerHandlers = /* @__PURE__ */ new Map();
10
+ const __mcpContent = (content) => ({ [__presentationTag]: {
11
+ kind: "content",
12
+ content
13
+ } });
14
+ const __callHost = (method, params, options) => {
15
+ const onStreamMessage = options?.onStreamMessage ?? ((message) => __console.log("stream", method, message));
16
+ const streamId = String(++__nextStreamId);
17
+ __streamHandlers.set(streamId, onStreamMessage);
18
+ const hostOptions = options === void 0 ? void 0 : { ...options };
19
+ if (hostOptions !== void 0) delete hostOptions.onStreamMessage;
20
+ return __hostCall(method, __toJson(params), __toJson(hostOptions), streamId).then(__fromJson).finally(() => __streamHandlers.delete(streamId));
21
+ };
22
+ const __dispatchHostStream = (streamId, payloadJson) => {
23
+ __streamHandlers.get(streamId)?.(__fromJson(payloadJson));
24
+ };
25
+ const __setTimer = (callback, timeout, args, repeat) => {
26
+ if (typeof callback !== "function") throw new TypeError("Timer callback must be a function");
27
+ const timerId = ++__nextTimerId;
28
+ const numericDelay = Number(timeout ?? 0);
29
+ const delay = Number.isFinite(numericDelay) ? Math.max(0, numericDelay) : 0;
30
+ __timerHandlers.set(timerId, {
31
+ callback,
32
+ args,
33
+ repeat
34
+ });
35
+ __hostSetTimer(timerId, delay, repeat ? 1 : 0);
36
+ return timerId;
37
+ };
38
+ const __dispatchHostTimer = (timerId) => {
39
+ const timer = __timerHandlers.get(timerId);
40
+ if (!timer) return;
41
+ if (!timer.repeat) __timerHandlers.delete(timerId);
42
+ timer.callback(...timer.args);
43
+ };
44
+ const __clearTimer = (timerId) => {
45
+ if (timerId === void 0) return;
46
+ __timerHandlers.delete(timerId);
47
+ __hostClearTimer(timerId);
48
+ };
49
+ const con = {
50
+ abortSignal: {
51
+ aborted: false,
52
+ reason: void 0,
53
+ throwIfAborted() {
54
+ if (this.aborted) {
55
+ const e = /* @__PURE__ */ new Error("AbortError: " + (this.reason || "aborted"));
56
+ e.name = "AbortError";
57
+ throw e;
58
+ }
59
+ }
60
+ },
61
+ callRaw(method, params, options) {
62
+ return __callHost(method, params, options);
63
+ },
64
+ notifyRaw(method, params) {
65
+ return __hostNotify(method, __toJson(params)).then(() => void 0);
66
+ },
67
+ call(serviceId, interfaceId, member, params, options) {
68
+ return this.callRaw(__mkMethod(serviceId, interfaceId, member), params, options);
69
+ },
70
+ notify(serviceId, interfaceId, member, params) {
71
+ return this.notifyRaw(__mkMethod(serviceId, interfaceId, member), params);
72
+ },
73
+ explore(args) {
74
+ return __hostExplore(__toJson(args), "").then(__fromJson);
75
+ },
76
+ requestAccess(args) {
77
+ return __hostRequestAccess(__toJson(args), "").then(__fromJson);
78
+ },
79
+ grants() {
80
+ return __hostGrants("", "").then(__fromJson);
81
+ },
82
+ getDocs() {
83
+ return __docs;
84
+ }
85
+ };
86
+ const __safeStringify = (v) => {
87
+ if (typeof v === "string") return v;
88
+ try {
89
+ return JSON.stringify(v);
90
+ } catch {
91
+ return String(v);
92
+ }
93
+ };
94
+ const __console = {
95
+ log: (...a) => __hostLog("log", a.map(__safeStringify).join(" ")),
96
+ warn: (...a) => __hostLog("warn", a.map(__safeStringify).join(" ")),
97
+ error: (...a) => __hostLog("error", a.map(__safeStringify).join(" "))
98
+ };
99
+ const mcp = {
100
+ raw(value) {
101
+ return { [__presentationTag]: {
102
+ kind: "raw",
103
+ value
104
+ } };
105
+ },
106
+ text(text, annotations) {
107
+ return __mcpContent({
108
+ type: "text",
109
+ text,
110
+ ...annotations ? { annotations } : {}
111
+ });
112
+ },
113
+ image(data, mimeType, annotations) {
114
+ return __mcpContent({
115
+ type: "image",
116
+ data,
117
+ mimeType,
118
+ ...annotations ? { annotations } : {}
119
+ });
120
+ },
121
+ audio(data, mimeType, annotations) {
122
+ return __mcpContent({
123
+ type: "audio",
124
+ data,
125
+ mimeType,
126
+ ...annotations ? { annotations } : {}
127
+ });
128
+ },
129
+ resource(resource, annotations) {
130
+ return __mcpContent({
131
+ type: "resource",
132
+ resource,
133
+ ...annotations ? { annotations } : {}
134
+ });
135
+ },
136
+ resourceLink(resource) {
137
+ return __mcpContent({
138
+ type: "resource_link",
139
+ ...resource
140
+ });
141
+ },
142
+ content(block) {
143
+ return __mcpContent(block);
144
+ },
145
+ result(options) {
146
+ return { [__presentationTag]: {
147
+ kind: "result",
148
+ ...Object.prototype.hasOwnProperty.call(options, "value") ? { value: options.value } : {},
149
+ ...Object.prototype.hasOwnProperty.call(options, "structuredContent") ? { structuredContent: options.structuredContent } : {},
150
+ ...options.content ? { content: options.content } : {},
151
+ ...options.isError !== void 0 ? { isError: options.isError } : {},
152
+ ...options._meta ? { _meta: options._meta } : {}
153
+ } };
154
+ }
155
+ };
156
+ const __g = globalThis;
157
+ __g.con = con;
158
+ __g.console = __console;
159
+ __g.mcp = mcp;
160
+ __g.setTimeout = (callback, timeout, ...args) => __setTimer(callback, timeout, args, false);
161
+ __g.clearTimeout = __clearTimer;
162
+ __g.setInterval = (callback, timeout, ...args) => __setTimer(callback, timeout, args, true);
163
+ __g.clearInterval = __clearTimer;
164
+ __g.__dispatchHostStream = __dispatchHostStream;
165
+ __g.__dispatchHostTimer = __dispatchHostTimer;
166
+ //#endregion
167
+
168
+ //# sourceMappingURL=src-guest-guestMain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-guest-guestMain.js","names":[],"sources":["../src/guest/guestMain.ts"],"sourcesContent":["// ---- guest runtime ------------------------------------------------------\n//\n// Handcrafted implementation of the `con` API declared in `connection.d.ts`.\n// It runs INSIDE the QuickJS sandbox. The host (`sandbox.ts`) bundles this\n// file (via `new URL(\"./guestMain.ts?esm\", ...)`) and evaluates the result\n// before any user code, then reads back `globalThis.con` / `globalThis.console`.\n//\n// Typing it as `SvcConnection` is the whole point: if the public contract in\n// `connection.d.ts` drifts from what we actually expose here, this file stops\n// compiling. The only way out to the host is the `__host*` seam declared in\n// `hostBridge.d.ts` — every call marshals through JSON strings.\n\nconst __toJson = (v: unknown): string => (v === undefined ? \"\" : JSON.stringify(v));\nconst __fromJson = (s: string): unknown => (s === \"\" ? undefined : JSON.parse(s));\nconst __mkMethod = (serviceId: string, interfaceId: string, member: string): string =>\n serviceId ? `${serviceId}::${interfaceId}::${member}` : `${interfaceId}::${member}`;\nconst __presentationTag = \"__linkrpcMcpPresentationV1\";\nlet __nextStreamId = 0;\nconst __streamHandlers = new Map<string, (message: unknown) => void>();\nlet __nextTimerId = 0;\nconst __timerHandlers = new Map<number, {\n readonly callback: (...args: unknown[]) => void;\n readonly args: readonly unknown[];\n readonly repeat: boolean;\n}>();\nconst __mcpContent = (content: McpContentBlock): McpContentBlock => ({\n [__presentationTag]: { kind: \"content\", content },\n}) as unknown as McpContentBlock;\n\nconst __callHost = (\n method: string,\n params: unknown,\n options: CallOptions | undefined,\n): Promise<unknown> => {\n const onStreamMessage = options?.onStreamMessage\n ?? ((message: unknown) => __console.log(\"stream\", method, message));\n const streamId = String(++__nextStreamId);\n __streamHandlers.set(streamId, onStreamMessage);\n const hostOptions = options === undefined ? undefined : { ...options };\n if (hostOptions !== undefined) {\n delete hostOptions.onStreamMessage;\n }\n return __hostCall(method, __toJson(params), __toJson(hostOptions), streamId)\n .then(__fromJson)\n .finally(() => __streamHandlers.delete(streamId));\n};\n\nconst __dispatchHostStream = (streamId: string, payloadJson: string): void => {\n __streamHandlers.get(streamId)?.(__fromJson(payloadJson));\n};\n\nconst __setTimer = (\n callback: (...args: unknown[]) => void,\n timeout: number | undefined,\n args: readonly unknown[],\n repeat: boolean,\n): number => {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Timer callback must be a function\");\n }\n const timerId = ++__nextTimerId;\n const numericDelay = Number(timeout ?? 0);\n const delay = Number.isFinite(numericDelay) ? Math.max(0, numericDelay) : 0;\n __timerHandlers.set(timerId, { callback, args, repeat });\n __hostSetTimer(timerId, delay, repeat ? 1 : 0);\n return timerId;\n};\n\nconst __dispatchHostTimer = (timerId: number): void => {\n const timer = __timerHandlers.get(timerId);\n if (!timer) return;\n if (!timer.repeat) __timerHandlers.delete(timerId);\n timer.callback(...timer.args);\n};\n\nconst __clearTimer = (timerId: number | undefined): void => {\n if (timerId === undefined) return;\n __timerHandlers.delete(timerId);\n __hostClearTimer(timerId);\n};\n\nconst con: SvcConnection = {\n abortSignal: {\n aborted: false,\n reason: undefined,\n throwIfAborted(): void {\n if (this.aborted) {\n const e = new Error(\"AbortError: \" + (this.reason || \"aborted\"));\n e.name = \"AbortError\";\n throw e;\n }\n },\n },\n\n callRaw(method, params, options) {\n return __callHost(method, params, options);\n },\n notifyRaw(method, params) {\n return __hostNotify(method, __toJson(params)).then(() => undefined);\n },\n call(serviceId, interfaceId, member, params, options) {\n return this.callRaw(__mkMethod(serviceId, interfaceId, member), params, options);\n },\n notify(serviceId, interfaceId, member, params) {\n return this.notifyRaw(__mkMethod(serviceId, interfaceId, member), params);\n },\n explore(args) {\n return __hostExplore(__toJson(args), \"\").then(__fromJson) as Promise<ExploreResult>;\n },\n requestAccess(args) {\n return __hostRequestAccess(__toJson(args), \"\").then(__fromJson) as Promise<RequestAccessResult>;\n },\n grants() {\n return __hostGrants(\"\", \"\").then(__fromJson) as Promise<GrantsSummary>;\n },\n getDocs() {\n return __docs;\n },\n};\n\nconst __safeStringify = (v: unknown): string => {\n if (typeof v === \"string\") {\n return v;\n }\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n};\n\nconst __console = {\n log: (...a: unknown[]): void => __hostLog(\"log\", a.map(__safeStringify).join(\" \")),\n warn: (...a: unknown[]): void => __hostLog(\"warn\", a.map(__safeStringify).join(\" \")),\n error: (...a: unknown[]): void => __hostLog(\"error\", a.map(__safeStringify).join(\" \")),\n};\n\nconst mcp: McpPresentation = {\n raw(value) {\n return {\n [__presentationTag]: { kind: \"raw\", value },\n } as unknown as typeof value;\n },\n text(text, annotations) {\n return __mcpContent({ type: \"text\", text, ...(annotations ? { annotations } : {}) });\n },\n image(data, mimeType, annotations) {\n return __mcpContent({ type: \"image\", data, mimeType, ...(annotations ? { annotations } : {}) });\n },\n audio(data, mimeType, annotations) {\n return __mcpContent({ type: \"audio\", data, mimeType, ...(annotations ? { annotations } : {}) });\n },\n resource(resource, annotations) {\n return __mcpContent({ type: \"resource\", resource, ...(annotations ? { annotations } : {}) });\n },\n resourceLink(resource) {\n return __mcpContent({ type: \"resource_link\", ...resource });\n },\n content(block) {\n return __mcpContent(block);\n },\n result(options) {\n return {\n [__presentationTag]: {\n kind: \"result\",\n ...(Object.prototype.hasOwnProperty.call(options, \"value\")\n ? { value: options.value }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(options, \"structuredContent\")\n ? { structuredContent: options.structuredContent }\n : {}),\n ...(options.content ? { content: options.content } : {}),\n ...(options.isError !== undefined ? { isError: options.isError } : {}),\n ...(options._meta ? { _meta: options._meta } : {}),\n },\n };\n },\n};\n\n// Publish onto the guest global so later-evaluated user code (and the host's\n// soft-abort poke at `con.abortSignal`) can reach them by bare name.\nconst __g = globalThis as Record<string, unknown>;\n__g.con = con;\n__g.console = __console;\n__g.mcp = mcp;\n__g.setTimeout = (\n callback: (...args: unknown[]) => void,\n timeout?: number,\n ...args: unknown[]\n) => __setTimer(callback, timeout, args, false);\n__g.clearTimeout = __clearTimer;\n__g.setInterval = (\n callback: (...args: unknown[]) => void,\n timeout?: number,\n ...args: unknown[]\n) => __setTimer(callback, timeout, args, true);\n__g.clearInterval = __clearTimer;\n__g.__dispatchHostStream = __dispatchHostStream;\n__g.__dispatchHostTimer = __dispatchHostTimer;\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@hediet/linkrpc-mcp",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./node": {
13
+ "types": "./dist/node.d.ts",
14
+ "default": "./dist/node.js"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
18
+ "bin": {
19
+ "linkrpc-mcp": "./dist/cli.js"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.29.0",
26
+ "quickjs-emscripten": "^0.31.0",
27
+ "zod": "^4.4.3",
28
+ "@hediet/linkrpc": "0.0.1",
29
+ "@hediet/linkrpc-hub": "0.0.1"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.0.0",
33
+ "@vscode/rollup-plugin-esm-url": "1.0.1-11",
34
+ "tsdown": "^0.22.3",
35
+ "tslib": "^2.8.1",
36
+ "tsx": "4.22.4",
37
+ "typescript": "^6.0.3",
38
+ "vitest": "^3.0.0",
39
+ "@hediet/linkrpc-client": "0.0.1"
40
+ },
41
+ "scripts": {
42
+ "start": "node dist/cli.js",
43
+ "build": "tsdown",
44
+ "dev": "tsdown --watch",
45
+ "typecheck:guest": "tsc -p src/guest/tsconfig.json",
46
+ "test": "vitest --run",
47
+ "test:watch": "vitest"
48
+ }
49
+ }