UNPKG

@tanstack/ai-mcp

Version:

Host-side Model Context Protocol client for TanStack AI: discover and run MCP server tools, resources, and prompts in any adapter's chat() loop, with generated end-to-end types.

59 lines (58 loc) • 2.22 kB
import { MCPEventConfigError } from "../errors.js"; import { isRecord } from "./value.js"; import { listEventDefinitions } from "./list.js"; //#region src/events/managed.ts function isThenable(value) { return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function"; } /** * Validate the object returned by `adapter.createAdapter`. * `createAdapter` must be synchronous. * * @experimental */ function validateMCPEventOperations(value) { if (isThenable(value)) throw new MCPEventConfigError("createAdapter must return operations synchronously, not a Promise"); if (!isRecord(value)) throw new MCPEventConfigError("createAdapter must return event operations"); const subscribe = value.subscribe; const getSubscription = value.getSubscription; const listSubscriptions = value.listSubscriptions; const unsubscribe = value.unsubscribe; if (typeof getSubscription !== "function") throw new MCPEventConfigError("adapter operations missing getSubscription"); if (typeof subscribe !== "function") throw new MCPEventConfigError("adapter operations missing subscribe"); if (typeof listSubscriptions !== "function") throw new MCPEventConfigError("adapter operations missing listSubscriptions"); if (typeof unsubscribe !== "function") throw new MCPEventConfigError("adapter operations missing unsubscribe"); return { subscribe(input) { return subscribe.call(value, input); }, getSubscription(id) { return getSubscription.call(value, id); }, listSubscriptions() { return listSubscriptions.call(value); }, unsubscribe(id) { return unsubscribe.call(value, id); } }; } /** * Managed-mode events API. Subscribe operations go to the adapter; `list()` is MCP. * * @experimental */ function createManagedMCPEvents(ctx, operations) { return { list(options) { return listEventDefinitions(ctx, options?.signal); }, subscribe: (input) => operations.subscribe(input), getSubscription: (id) => operations.getSubscription(id), listSubscriptions: () => operations.listSubscriptions(), unsubscribe: (id) => operations.unsubscribe(id) }; } //#endregion export { createManagedMCPEvents, validateMCPEventOperations }; //# sourceMappingURL=managed.js.map