Keep the 1.x handler registration forms as deprecated overloads (#769)
setRequestHandler(Schema, handler) and setNotificationHandler(Schema, handler) work on App and AppBridge as deprecated overloads forwarding to the 2.x method-keyed form; AppRequest, AppNotification and AppResult return as deprecated type aliases. Both removed in 3.0.
This commit is contained in:
commit
218aef167e
6 changed files with 426 additions and 31 deletions
|
|
@ -41,8 +41,9 @@ its `Protocol` class); `@modelcontextprotocol/core` is a required peer that `cli
|
||||||
Valibot. Raw zod shapes (`{ q: z.string() }`) still work with
|
Valibot. Raw zod shapes (`{ q: z.string() }`) still work with
|
||||||
`registerAppTool` but are deprecated; wrap them with `z.object({...})`.
|
`registerAppTool` but are deprecated; wrap them with `z.object({...})`.
|
||||||
- **`App` / `AppBridge` extend `Protocol` from `@modelcontextprotocol/client`.**
|
- **`App` / `AppBridge` extend `Protocol` from `@modelcontextprotocol/client`.**
|
||||||
`ProtocolWithEvents`, `AppRequest`, `AppNotification` and `AppResult` are
|
`ProtocolWithEvents` is gone; use the SDK's `Protocol`. The `AppRequest`,
|
||||||
gone; use the SDK's `Protocol`, `Request`, `Notification` and `Result`.
|
`AppNotification` and `AppResult` unions are kept as deprecated type
|
||||||
|
aliases (nothing in 2.x consumes them) and will be removed in 3.0.
|
||||||
- **Handler context.** Custom handlers receive the SDK 2.x context:
|
- **Handler context.** Custom handlers receive the SDK 2.x context:
|
||||||
`extra.signal` → `extra.mcpReq.signal`, `extra.requestId` →
|
`extra.signal` → `extra.mcpReq.signal`, `extra.requestId` →
|
||||||
`extra.mcpReq.id`.
|
`extra.mcpReq.id`.
|
||||||
|
|
@ -51,7 +52,11 @@ its `Protocol` class); `@modelcontextprotocol/core` is a required peer that `cli
|
||||||
`app.setRequestHandler("some/method", { params: SomeParamsSchema }, (params, ctx) => …)`
|
`app.setRequestHandler("some/method", { params: SomeParamsSchema }, (params, ctx) => …)`
|
||||||
for custom methods (the handler receives the parsed params); the two-argument
|
for custom methods (the handler receives the parsed params); the two-argument
|
||||||
`setRequestHandler("tools/call", handler)` form exists only for spec-defined
|
`setRequestHandler("tools/call", handler)` form exists only for spec-defined
|
||||||
method names.
|
method names. The 1.x `(Schema, handler)` form still works on `App` and
|
||||||
|
`AppBridge` as a deprecated overload: it logs a one-time warning, hands the
|
||||||
|
handler the whole `{ method, params }` message as before, and gives request
|
||||||
|
handlers a 1.x-shaped `extra` (`signal`, `requestId`, `sessionId`, `_meta`).
|
||||||
|
It will be removed in 3.0.
|
||||||
- **Errors.** Remote JSON-RPC errors are `ProtocolError` (numeric `code`);
|
- **Errors.** Remote JSON-RPC errors are `ProtocolError` (numeric `code`);
|
||||||
local conditions are `SdkError` with a string `code`: request timeout →
|
local conditions are `SdkError` with a string `code`: request timeout →
|
||||||
`"REQUEST_TIMEOUT"`, connection closed → `"CONNECTION_CLOSED"`. Cancelling a
|
`"REQUEST_TIMEOUT"`, connection closed → `"CONNECTION_CLOSED"`. Cancelling a
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,12 @@ import {
|
||||||
LoggingMessageNotificationSchema,
|
LoggingMessageNotificationSchema,
|
||||||
} from "@modelcontextprotocol/core";
|
} from "@modelcontextprotocol/core";
|
||||||
import { EventDispatcher, MethodRegistry } from "./events.js";
|
import { EventDispatcher, MethodRegistry } from "./events.js";
|
||||||
|
import {
|
||||||
|
toModernArgs,
|
||||||
|
type LegacyMethodSchema,
|
||||||
|
type LegacyNotificationHandler,
|
||||||
|
type LegacyRequestHandler,
|
||||||
|
} from "./legacy-handlers.js";
|
||||||
import type { ZodLiteral, ZodObject, ZodType } from "zod/v4";
|
import type { ZodLiteral, ZodObject, ZodType } from "zod/v4";
|
||||||
|
|
||||||
type MethodSchema = ZodObject<{
|
type MethodSchema = ZodObject<{
|
||||||
|
|
@ -324,11 +330,14 @@ export class AppBridge extends Protocol<BaseContext> {
|
||||||
*
|
*
|
||||||
* @throws {Error} if a handler for this method is already registered.
|
* @throws {Error} if a handler for this method is already registered.
|
||||||
*/
|
*/
|
||||||
override setRequestHandler: Protocol<BaseContext>["setRequestHandler"] = (
|
override setRequestHandler: Protocol<BaseContext>["setRequestHandler"] &
|
||||||
method: string,
|
(<S extends LegacyMethodSchema>(
|
||||||
...rest: unknown[]
|
/** @deprecated Pass the method name and `{ params }` instead. */
|
||||||
) => {
|
schema: S,
|
||||||
this._methods.claim(method, "setRequestHandler");
|
handler: LegacyRequestHandler<S>,
|
||||||
|
) => void) = (...args: unknown[]) => {
|
||||||
|
const [method, ...rest] = toModernArgs("request", args) ?? args;
|
||||||
|
this._methods.claim(method as string, "setRequestHandler");
|
||||||
(super.setRequestHandler as unknown as UntypedHandlerSetter).call(
|
(super.setRequestHandler as unknown as UntypedHandlerSetter).call(
|
||||||
this,
|
this,
|
||||||
method,
|
method,
|
||||||
|
|
@ -343,15 +352,20 @@ export class AppBridge extends Protocol<BaseContext> {
|
||||||
*
|
*
|
||||||
* @throws {Error} if a handler for this method is already registered.
|
* @throws {Error} if a handler for this method is already registered.
|
||||||
*/
|
*/
|
||||||
override setNotificationHandler: Protocol<BaseContext>["setNotificationHandler"] =
|
override setNotificationHandler: Protocol<BaseContext>["setNotificationHandler"] &
|
||||||
(method: string, ...rest: unknown[]) => {
|
(<S extends LegacyMethodSchema>(
|
||||||
this._methods.claim(method, "setNotificationHandler");
|
/** @deprecated Pass the method name and `{ params }` instead. */
|
||||||
(super.setNotificationHandler as unknown as UntypedHandlerSetter).call(
|
schema: S,
|
||||||
this,
|
handler: LegacyNotificationHandler<S>,
|
||||||
method,
|
) => void) = (...args: unknown[]) => {
|
||||||
...rest,
|
const [method, ...rest] = toModernArgs("notification", args) ?? args;
|
||||||
);
|
this._methods.claim(method as string, "setNotificationHandler");
|
||||||
};
|
(super.setNotificationHandler as unknown as UntypedHandlerSetter).call(
|
||||||
|
this,
|
||||||
|
method,
|
||||||
|
...rest,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
override removeRequestHandler: Protocol<BaseContext>["removeRequestHandler"] =
|
override removeRequestHandler: Protocol<BaseContext>["removeRequestHandler"] =
|
||||||
(method: string) => {
|
(method: string) => {
|
||||||
|
|
|
||||||
48
src/app.ts
48
src/app.ts
|
|
@ -24,6 +24,18 @@ import {
|
||||||
import { EmptyResultSchema } from "@modelcontextprotocol/core";
|
import { EmptyResultSchema } from "@modelcontextprotocol/core";
|
||||||
export { RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "./constants.js";
|
export { RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY } from "./constants.js";
|
||||||
import { EventDispatcher, MethodRegistry } from "./events.js";
|
import { EventDispatcher, MethodRegistry } from "./events.js";
|
||||||
|
import {
|
||||||
|
toModernArgs,
|
||||||
|
type LegacyMethodSchema,
|
||||||
|
type LegacyNotificationHandler,
|
||||||
|
type LegacyRequestHandler,
|
||||||
|
} from "./legacy-handlers.js";
|
||||||
|
export type {
|
||||||
|
LegacyMethodSchema,
|
||||||
|
LegacyNotificationHandler,
|
||||||
|
LegacyRequestHandler,
|
||||||
|
LegacyRequestHandlerExtra,
|
||||||
|
} from "./legacy-handlers.js";
|
||||||
export { EventDispatcher } from "./events.js";
|
export { EventDispatcher } from "./events.js";
|
||||||
|
|
||||||
import { PostMessageTransport } from "./message-transport.js";
|
import { PostMessageTransport } from "./message-transport.js";
|
||||||
|
|
@ -316,11 +328,14 @@ export class App extends Protocol<BaseContext> {
|
||||||
*
|
*
|
||||||
* @throws {Error} if a handler for this method is already registered.
|
* @throws {Error} if a handler for this method is already registered.
|
||||||
*/
|
*/
|
||||||
override setRequestHandler: Protocol<BaseContext>["setRequestHandler"] = (
|
override setRequestHandler: Protocol<BaseContext>["setRequestHandler"] &
|
||||||
method: string,
|
(<S extends LegacyMethodSchema>(
|
||||||
...rest: unknown[]
|
/** @deprecated Pass the method name and `{ params }` instead. */
|
||||||
) => {
|
schema: S,
|
||||||
this._methods.claim(method, "setRequestHandler");
|
handler: LegacyRequestHandler<S>,
|
||||||
|
) => void) = (...args: unknown[]) => {
|
||||||
|
const [method, ...rest] = toModernArgs("request", args) ?? args;
|
||||||
|
this._methods.claim(method as string, "setRequestHandler");
|
||||||
(super.setRequestHandler as unknown as UntypedHandlerSetter).call(
|
(super.setRequestHandler as unknown as UntypedHandlerSetter).call(
|
||||||
this,
|
this,
|
||||||
method,
|
method,
|
||||||
|
|
@ -335,15 +350,20 @@ export class App extends Protocol<BaseContext> {
|
||||||
*
|
*
|
||||||
* @throws {Error} if a handler for this method is already registered.
|
* @throws {Error} if a handler for this method is already registered.
|
||||||
*/
|
*/
|
||||||
override setNotificationHandler: Protocol<BaseContext>["setNotificationHandler"] =
|
override setNotificationHandler: Protocol<BaseContext>["setNotificationHandler"] &
|
||||||
(method: string, ...rest: unknown[]) => {
|
(<S extends LegacyMethodSchema>(
|
||||||
this._methods.claim(method, "setNotificationHandler");
|
/** @deprecated Pass the method name and `{ params }` instead. */
|
||||||
(super.setNotificationHandler as unknown as UntypedHandlerSetter).call(
|
schema: S,
|
||||||
this,
|
handler: LegacyNotificationHandler<S>,
|
||||||
method,
|
) => void) = (...args: unknown[]) => {
|
||||||
...rest,
|
const [method, ...rest] = toModernArgs("notification", args) ?? args;
|
||||||
);
|
this._methods.claim(method as string, "setNotificationHandler");
|
||||||
};
|
(super.setNotificationHandler as unknown as UntypedHandlerSetter).call(
|
||||||
|
this,
|
||||||
|
method,
|
||||||
|
...rest,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
override removeRequestHandler: Protocol<BaseContext>["removeRequestHandler"] =
|
override removeRequestHandler: Protocol<BaseContext>["removeRequestHandler"] =
|
||||||
(method: string) => {
|
(method: string) => {
|
||||||
|
|
|
||||||
145
src/legacy-handlers.test.ts
Normal file
145
src/legacy-handlers.test.ts
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
import { afterEach, beforeEach, describe, expect, it, spyOn } from "bun:test";
|
||||||
|
import { InMemoryTransport, Server } from "@modelcontextprotocol/server";
|
||||||
|
import { z } from "zod/v4";
|
||||||
|
|
||||||
|
import { App } from "./app.js";
|
||||||
|
import { AppBridge } from "./app-bridge.js";
|
||||||
|
import {
|
||||||
|
McpUiInitializeRequestSchema,
|
||||||
|
McpUiInitializeResultSchema,
|
||||||
|
McpUiInitializedNotificationSchema,
|
||||||
|
McpUiResourceTeardownRequestSchema,
|
||||||
|
McpUiToolInputNotificationSchema,
|
||||||
|
McpUiSizeChangedNotificationSchema,
|
||||||
|
McpUiOpenLinkRequestSchema,
|
||||||
|
} from "./types.js";
|
||||||
|
|
||||||
|
const CustomRequestSchema = z.object({
|
||||||
|
method: z.literal("test/echo"),
|
||||||
|
params: z.object({ text: z.string() }),
|
||||||
|
});
|
||||||
|
|
||||||
|
const CustomNotificationSchema = z.object({
|
||||||
|
method: z.literal("test/ping"),
|
||||||
|
params: z.object({ n: z.number() }),
|
||||||
|
});
|
||||||
|
|
||||||
|
let warn: ReturnType<typeof spyOn>;
|
||||||
|
beforeEach(() => {
|
||||||
|
warn = spyOn(console, "warn").mockImplementation(() => {});
|
||||||
|
});
|
||||||
|
afterEach(() => warn.mockRestore());
|
||||||
|
|
||||||
|
describe("1.x setRequestHandler(Schema, handler) on App", () => {
|
||||||
|
it("registers a custom request and hands the handler the whole message plus a 1.x extra", async () => {
|
||||||
|
const app = new App({ name: "a", version: "1" }, {}, { autoResize: false });
|
||||||
|
const server = new Server(
|
||||||
|
{ name: "s", version: "1" },
|
||||||
|
{ capabilities: {} },
|
||||||
|
);
|
||||||
|
server.setRequestHandler(
|
||||||
|
"ui/initialize",
|
||||||
|
{
|
||||||
|
params: McpUiInitializeRequestSchema.shape.params,
|
||||||
|
result: McpUiInitializeResultSchema,
|
||||||
|
},
|
||||||
|
() => ({
|
||||||
|
protocolVersion: "2026-01-26",
|
||||||
|
hostCapabilities: {},
|
||||||
|
hostInfo: { name: "h", version: "1" },
|
||||||
|
hostContext: {},
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
server.setNotificationHandler(
|
||||||
|
"ui/notifications/initialized",
|
||||||
|
{ params: McpUiInitializedNotificationSchema.shape.params },
|
||||||
|
() => {},
|
||||||
|
);
|
||||||
|
|
||||||
|
let seen: unknown;
|
||||||
|
let seenExtra: { signal: AbortSignal; requestId: unknown } | undefined;
|
||||||
|
app.setRequestHandler(CustomRequestSchema, (request, extra) => {
|
||||||
|
seen = request;
|
||||||
|
seenExtra = extra;
|
||||||
|
return { echoed: request.params.text };
|
||||||
|
});
|
||||||
|
|
||||||
|
const [at, st] = InMemoryTransport.createLinkedPair();
|
||||||
|
await server.connect(st);
|
||||||
|
await app.connect(at);
|
||||||
|
|
||||||
|
const result = await server.request(
|
||||||
|
{ method: "test/echo", params: { text: "hi" } },
|
||||||
|
z.object({ echoed: z.string() }),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result).toEqual({ echoed: "hi" });
|
||||||
|
expect(seen).toEqual({ method: "test/echo", params: { text: "hi" } });
|
||||||
|
expect(seenExtra?.signal).toBeInstanceOf(AbortSignal);
|
||||||
|
expect(seenExtra?.requestId).toBeDefined();
|
||||||
|
expect(warn).toHaveBeenCalledTimes(1);
|
||||||
|
expect(String(warn.mock.calls[0][0])).toContain(
|
||||||
|
'setRequestHandler("test/echo", { params: Schema.shape.params }, handler)',
|
||||||
|
);
|
||||||
|
|
||||||
|
await app.close();
|
||||||
|
await server.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("still throws for a method an on* setter already owns", () => {
|
||||||
|
const app = new App({ name: "a", version: "1" }, {}, { autoResize: false });
|
||||||
|
app.onteardown = async () => ({});
|
||||||
|
expect(() =>
|
||||||
|
app.setRequestHandler(
|
||||||
|
McpUiResourceTeardownRequestSchema,
|
||||||
|
async () => ({}),
|
||||||
|
),
|
||||||
|
).toThrow(/already registered/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("still throws for an event-mapped notification", () => {
|
||||||
|
const app = new App({ name: "a", version: "1" }, {}, { autoResize: false });
|
||||||
|
app.ontoolinput = () => {};
|
||||||
|
expect(() =>
|
||||||
|
app.setNotificationHandler(McpUiToolInputNotificationSchema, () => {}),
|
||||||
|
).toThrow(/already registered/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("1.x setNotificationHandler(Schema, handler) on AppBridge", () => {
|
||||||
|
it("registers a custom notification and hands the handler the whole message", async () => {
|
||||||
|
const bridge = new AppBridge(null, { name: "h", version: "1" }, {});
|
||||||
|
// A bare Server stands in for the View: unlike Client, connect() sends no
|
||||||
|
// MCP initialize, matching what a real App does on this channel.
|
||||||
|
const view = new Server({ name: "v", version: "1" }, { capabilities: {} });
|
||||||
|
let seen: unknown;
|
||||||
|
bridge.setNotificationHandler(CustomNotificationSchema, (n) => {
|
||||||
|
seen = n;
|
||||||
|
});
|
||||||
|
|
||||||
|
const [bt, vt] = InMemoryTransport.createLinkedPair();
|
||||||
|
await bridge.connect(bt);
|
||||||
|
await view.connect(vt);
|
||||||
|
await view.notification({ method: "test/ping", params: { n: 3 } });
|
||||||
|
await new Promise((r) => setTimeout(r, 10));
|
||||||
|
|
||||||
|
expect(seen).toEqual({ method: "test/ping", params: { n: 3 } });
|
||||||
|
await view.close();
|
||||||
|
await bridge.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("still throws for a method an on* setter already owns", () => {
|
||||||
|
const bridge = new AppBridge(null, { name: "h", version: "1" }, {});
|
||||||
|
bridge.onsizechange = () => {};
|
||||||
|
expect(() =>
|
||||||
|
bridge.setNotificationHandler(
|
||||||
|
McpUiSizeChangedNotificationSchema,
|
||||||
|
() => {},
|
||||||
|
),
|
||||||
|
).toThrow(/already registered/);
|
||||||
|
bridge.onopenlink = async () => ({});
|
||||||
|
expect(() =>
|
||||||
|
bridge.setRequestHandler(McpUiOpenLinkRequestSchema, async () => ({})),
|
||||||
|
).toThrow(/already registered/);
|
||||||
|
});
|
||||||
|
});
|
||||||
94
src/legacy-handlers.ts
Normal file
94
src/legacy-handlers.ts
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
import type { BaseContext, RequestId } from "@modelcontextprotocol/client";
|
||||||
|
import type { ZodLiteral, ZodObject, ZodType } from "zod/v4";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A whole-message Zod schema (`method` literal plus `params`), as accepted by
|
||||||
|
* the 1.x `setRequestHandler(Schema, handler)` forms.
|
||||||
|
*/
|
||||||
|
export type LegacyMethodSchema = ZodObject<{
|
||||||
|
method: ZodLiteral<string>;
|
||||||
|
params: ZodType;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `extra` argument 1.x request handlers received.
|
||||||
|
*
|
||||||
|
* @deprecated Use the 2.x `BaseContext` (`extra.mcpReq.signal`, `extra.mcpReq.id`).
|
||||||
|
*/
|
||||||
|
export type LegacyRequestHandlerExtra = {
|
||||||
|
signal: AbortSignal;
|
||||||
|
requestId: RequestId;
|
||||||
|
sessionId?: string;
|
||||||
|
_meta?: BaseContext["mcpReq"]["_meta"];
|
||||||
|
sendRequest: BaseContext["mcpReq"]["send"];
|
||||||
|
sendNotification: BaseContext["mcpReq"]["notify"];
|
||||||
|
authInfo?: NonNullable<BaseContext["http"]>["authInfo"];
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @deprecated Use `setRequestHandler("method", { params, result }, (params, ctx) => …)`. */
|
||||||
|
export type LegacyRequestHandler<S extends LegacyMethodSchema> = (
|
||||||
|
request: S["_output"],
|
||||||
|
extra: LegacyRequestHandlerExtra,
|
||||||
|
) => unknown;
|
||||||
|
|
||||||
|
/** @deprecated Use `setNotificationHandler("method", { params }, (params) => …)`. */
|
||||||
|
export type LegacyNotificationHandler<S extends LegacyMethodSchema> = (
|
||||||
|
notification: S["_output"],
|
||||||
|
) => void | Promise<void>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arguments for the 2.x three-argument `setRequestHandler` /
|
||||||
|
* `setNotificationHandler` form.
|
||||||
|
*/
|
||||||
|
type ModernArgs = [
|
||||||
|
method: string,
|
||||||
|
schemas: { params: ZodType },
|
||||||
|
handler: (params: unknown, ctx: BaseContext) => unknown,
|
||||||
|
];
|
||||||
|
|
||||||
|
const warned = new Set<string>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate a 1.x `(Schema, handler)` registration into the 2.x
|
||||||
|
* `(method, { params }, handler)` form, or return `undefined` when the call
|
||||||
|
* is already in the 2.x form. The 1.x handler receives the reassembled
|
||||||
|
* `{ method, params }` message and, for requests, a 1.x-shaped `extra`.
|
||||||
|
*/
|
||||||
|
export function toModernArgs(
|
||||||
|
kind: "request" | "notification",
|
||||||
|
args: unknown[],
|
||||||
|
): ModernArgs | undefined {
|
||||||
|
const [first, handler] = args;
|
||||||
|
const shape = (first as Partial<LegacyMethodSchema> | undefined)?.shape;
|
||||||
|
if (typeof shape?.method?.value !== "string") return undefined;
|
||||||
|
const method = shape.method.value;
|
||||||
|
const setter =
|
||||||
|
kind === "request" ? "setRequestHandler" : "setNotificationHandler";
|
||||||
|
if (!warned.has(setter)) {
|
||||||
|
warned.add(setter);
|
||||||
|
console.warn(
|
||||||
|
`[ext-apps] ${setter}(Schema, handler) is deprecated; use ` +
|
||||||
|
`${setter}("${method}", { params: Schema.shape.params }, handler).`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const call = handler as (...a: unknown[]) => unknown;
|
||||||
|
return [
|
||||||
|
method,
|
||||||
|
{ params: shape.params },
|
||||||
|
kind === "request"
|
||||||
|
? (params, ctx) => call({ method, params }, legacyExtra(ctx))
|
||||||
|
: (params) => call({ method, params }),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function legacyExtra(ctx: BaseContext): LegacyRequestHandlerExtra {
|
||||||
|
return {
|
||||||
|
signal: ctx.mcpReq.signal,
|
||||||
|
requestId: ctx.mcpReq.id,
|
||||||
|
sessionId: ctx.sessionId,
|
||||||
|
_meta: ctx.mcpReq._meta,
|
||||||
|
sendRequest: ctx.mcpReq.send,
|
||||||
|
sendNotification: ctx.mcpReq.notify,
|
||||||
|
authInfo: ctx.http?.authInfo,
|
||||||
|
};
|
||||||
|
}
|
||||||
117
src/types.ts
117
src/types.ts
|
|
@ -9,6 +9,55 @@
|
||||||
* @see `generated/schema.test.ts` for compile-time verification
|
* @see `generated/schema.test.ts` for compile-time verification
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import type {
|
||||||
|
CallToolRequest,
|
||||||
|
CallToolResult,
|
||||||
|
CreateMessageRequest,
|
||||||
|
CreateMessageResult,
|
||||||
|
CreateMessageResultWithTools,
|
||||||
|
EmptyResult,
|
||||||
|
ListPromptsRequest,
|
||||||
|
ListPromptsResult,
|
||||||
|
ListResourceTemplatesRequest,
|
||||||
|
ListResourceTemplatesResult,
|
||||||
|
ListResourcesRequest,
|
||||||
|
ListResourcesResult,
|
||||||
|
ListToolsRequest,
|
||||||
|
ListToolsResult,
|
||||||
|
LoggingMessageNotification,
|
||||||
|
PingRequest,
|
||||||
|
PromptListChangedNotification,
|
||||||
|
ReadResourceRequest,
|
||||||
|
ReadResourceResult,
|
||||||
|
ResourceListChangedNotification,
|
||||||
|
ToolListChangedNotification,
|
||||||
|
} from "@modelcontextprotocol/client";
|
||||||
|
import type {
|
||||||
|
McpUiDownloadFileRequest,
|
||||||
|
McpUiDownloadFileResult,
|
||||||
|
McpUiHostContextChangedNotification,
|
||||||
|
McpUiInitializeRequest,
|
||||||
|
McpUiInitializeResult,
|
||||||
|
McpUiInitializedNotification,
|
||||||
|
McpUiMessageRequest,
|
||||||
|
McpUiMessageResult,
|
||||||
|
McpUiOpenLinkRequest,
|
||||||
|
McpUiOpenLinkResult,
|
||||||
|
McpUiRequestDisplayModeRequest,
|
||||||
|
McpUiRequestDisplayModeResult,
|
||||||
|
McpUiRequestTeardownNotification,
|
||||||
|
McpUiResourceTeardownRequest,
|
||||||
|
McpUiResourceTeardownResult,
|
||||||
|
McpUiSandboxProxyReadyNotification,
|
||||||
|
McpUiSandboxResourceReadyNotification,
|
||||||
|
McpUiSizeChangedNotification,
|
||||||
|
McpUiToolCancelledNotification,
|
||||||
|
McpUiToolInputNotification,
|
||||||
|
McpUiToolInputPartialNotification,
|
||||||
|
McpUiToolResultNotification,
|
||||||
|
McpUiUpdateModelContextRequest,
|
||||||
|
} from "./spec.types.js";
|
||||||
|
|
||||||
// Re-export all types from spec.types.ts
|
// Re-export all types from spec.types.ts
|
||||||
export {
|
export {
|
||||||
LATEST_PROTOCOL_VERSION,
|
LATEST_PROTOCOL_VERSION,
|
||||||
|
|
@ -108,3 +157,71 @@ export {
|
||||||
McpUiToolVisibilitySchema,
|
McpUiToolVisibilitySchema,
|
||||||
McpUiToolMetaSchema,
|
McpUiToolMetaSchema,
|
||||||
} from "./generated/schema.js";
|
} from "./generated/schema.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Union of every request an {@link app!App `App`} may send or receive.
|
||||||
|
*
|
||||||
|
* @deprecated 1.x fed this to the SDK's `Protocol` generics; SDK 2.x derives
|
||||||
|
* request types from the method name, so nothing consumes it anymore.
|
||||||
|
*/
|
||||||
|
export type AppRequest =
|
||||||
|
| McpUiInitializeRequest
|
||||||
|
| McpUiOpenLinkRequest
|
||||||
|
| McpUiDownloadFileRequest
|
||||||
|
| McpUiMessageRequest
|
||||||
|
| McpUiUpdateModelContextRequest
|
||||||
|
| McpUiResourceTeardownRequest
|
||||||
|
| McpUiRequestDisplayModeRequest
|
||||||
|
| CallToolRequest
|
||||||
|
| ListToolsRequest
|
||||||
|
| ListResourcesRequest
|
||||||
|
| ListResourceTemplatesRequest
|
||||||
|
| ReadResourceRequest
|
||||||
|
| ListPromptsRequest
|
||||||
|
| CreateMessageRequest
|
||||||
|
| PingRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Union of every notification an {@link app!App `App`} may send or receive.
|
||||||
|
*
|
||||||
|
* @deprecated See {@link AppRequest}.
|
||||||
|
*/
|
||||||
|
export type AppNotification =
|
||||||
|
// Sent to app
|
||||||
|
| McpUiHostContextChangedNotification
|
||||||
|
| McpUiToolInputNotification
|
||||||
|
| McpUiToolInputPartialNotification
|
||||||
|
| McpUiToolResultNotification
|
||||||
|
| McpUiToolCancelledNotification
|
||||||
|
| McpUiSandboxResourceReadyNotification
|
||||||
|
| ToolListChangedNotification
|
||||||
|
| ResourceListChangedNotification
|
||||||
|
| PromptListChangedNotification
|
||||||
|
// Received from app
|
||||||
|
| McpUiInitializedNotification
|
||||||
|
| McpUiSizeChangedNotification
|
||||||
|
| McpUiSandboxProxyReadyNotification
|
||||||
|
| McpUiRequestTeardownNotification
|
||||||
|
| LoggingMessageNotification;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Union of every result an {@link app!App `App`} may send or receive.
|
||||||
|
*
|
||||||
|
* @deprecated See {@link AppRequest}.
|
||||||
|
*/
|
||||||
|
export type AppResult =
|
||||||
|
| McpUiInitializeResult
|
||||||
|
| McpUiOpenLinkResult
|
||||||
|
| McpUiDownloadFileResult
|
||||||
|
| McpUiMessageResult
|
||||||
|
| McpUiResourceTeardownResult
|
||||||
|
| McpUiRequestDisplayModeResult
|
||||||
|
| CallToolResult
|
||||||
|
| ListToolsResult
|
||||||
|
| ListResourcesResult
|
||||||
|
| ListResourceTemplatesResult
|
||||||
|
| ReadResourceResult
|
||||||
|
| ListPromptsResult
|
||||||
|
| CreateMessageResult
|
||||||
|
| CreateMessageResultWithTools
|
||||||
|
| EmptyResult;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue