@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
JavaScript
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