Make most object types pass through unrecognized properties
This commit is contained in:
parent
cc2a1682bb
commit
ee7eb5e5c9
1 changed files with 296 additions and 256 deletions
552
src/types.ts
552
src/types.ts
|
|
@ -151,58 +151,68 @@ export const EmptyResultSchema = ResultSchema.strict();
|
|||
/**
|
||||
* Text provided to or from an LLM.
|
||||
*/
|
||||
export const TextContentSchema = z.object({
|
||||
type: z.literal("text"),
|
||||
/**
|
||||
* The text content of the message.
|
||||
*/
|
||||
text: z.string(),
|
||||
});
|
||||
export const TextContentSchema = z
|
||||
.object({
|
||||
type: z.literal("text"),
|
||||
/**
|
||||
* The text content of the message.
|
||||
*/
|
||||
text: z.string(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* An image provided to or from an LLM.
|
||||
*/
|
||||
export const ImageContentSchema = z.object({
|
||||
type: z.literal("image"),
|
||||
/**
|
||||
* The base64-encoded image data.
|
||||
*/
|
||||
data: z.string().base64(),
|
||||
/**
|
||||
* The MIME type of the image. Different providers may support different image types.
|
||||
*/
|
||||
mimeType: z.string(),
|
||||
});
|
||||
export const ImageContentSchema = z
|
||||
.object({
|
||||
type: z.literal("image"),
|
||||
/**
|
||||
* The base64-encoded image data.
|
||||
*/
|
||||
data: z.string().base64(),
|
||||
/**
|
||||
* The MIME type of the image. Different providers may support different image types.
|
||||
*/
|
||||
mimeType: z.string(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Describes a message issued to or received from an LLM API.
|
||||
*/
|
||||
export const SamplingMessageSchema = z.object({
|
||||
role: z.enum(["user", "assistant"]),
|
||||
content: z.union([TextContentSchema, ImageContentSchema]),
|
||||
});
|
||||
export const SamplingMessageSchema = z
|
||||
.object({
|
||||
role: z.enum(["user", "assistant"]),
|
||||
content: z.union([TextContentSchema, ImageContentSchema]),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Describes the name and version of an MCP implementation.
|
||||
*/
|
||||
export const ImplementationSchema = z.object({
|
||||
name: z.string(),
|
||||
version: z.string(),
|
||||
});
|
||||
export const ImplementationSchema = z
|
||||
.object({
|
||||
name: z.string(),
|
||||
version: z.string(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Capabilities a client may support. Known capabilities are defined here, in this schema, but this is not a closed set: any client can define its own, additional capabilities.
|
||||
*/
|
||||
export const ClientCapabilitiesSchema = z.object({
|
||||
/**
|
||||
* Experimental, non-standard capabilities that the client supports.
|
||||
*/
|
||||
experimental: z.optional(z.object({}).passthrough()),
|
||||
/**
|
||||
* Present if the client supports sampling from an LLM.
|
||||
*/
|
||||
sampling: z.optional(z.object({}).passthrough()),
|
||||
});
|
||||
export const ClientCapabilitiesSchema = z
|
||||
.object({
|
||||
/**
|
||||
* Experimental, non-standard capabilities that the client supports.
|
||||
*/
|
||||
experimental: z.optional(z.object({}).passthrough()),
|
||||
/**
|
||||
* Present if the client supports sampling from an LLM.
|
||||
*/
|
||||
sampling: z.optional(z.object({}).passthrough()),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* This request is sent from the client to the server when it first connects, asking it to begin initialization.
|
||||
|
|
@ -222,59 +232,61 @@ export const InitializeRequestSchema = RequestSchema.extend({
|
|||
/**
|
||||
* Capabilities that a server may support. Known capabilities are defined here, in this schema, but this is not a closed set: any server can define its own, additional capabilities.
|
||||
*/
|
||||
export const ServerCapabilitiesSchema = z.object({
|
||||
/**
|
||||
* Experimental, non-standard capabilities that the server supports.
|
||||
*/
|
||||
experimental: z.optional(z.object({}).passthrough()),
|
||||
/**
|
||||
* Present if the server supports sending log messages to the client.
|
||||
*/
|
||||
logging: z.optional(z.object({}).passthrough()),
|
||||
/**
|
||||
* Present if the server offers any prompt templates.
|
||||
*/
|
||||
prompts: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports notifications for changes to the prompt list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
),
|
||||
/**
|
||||
* Present if the server offers any resources to read.
|
||||
*/
|
||||
resources: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports subscribing to resource updates.
|
||||
*/
|
||||
subscribe: z.optional(z.boolean()),
|
||||
/**
|
||||
* Whether this server supports notifications for changes to the resource list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
),
|
||||
/**
|
||||
* Present if the server offers any tools to call.
|
||||
*/
|
||||
tools: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports notifications for changes to the tool list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
),
|
||||
});
|
||||
export const ServerCapabilitiesSchema = z
|
||||
.object({
|
||||
/**
|
||||
* Experimental, non-standard capabilities that the server supports.
|
||||
*/
|
||||
experimental: z.optional(z.object({}).passthrough()),
|
||||
/**
|
||||
* Present if the server supports sending log messages to the client.
|
||||
*/
|
||||
logging: z.optional(z.object({}).passthrough()),
|
||||
/**
|
||||
* Present if the server offers any prompt templates.
|
||||
*/
|
||||
prompts: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports notifications for changes to the prompt list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
),
|
||||
/**
|
||||
* Present if the server offers any resources to read.
|
||||
*/
|
||||
resources: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports subscribing to resource updates.
|
||||
*/
|
||||
subscribe: z.optional(z.boolean()),
|
||||
/**
|
||||
* Whether this server supports notifications for changes to the resource list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
),
|
||||
/**
|
||||
* Present if the server offers any tools to call.
|
||||
*/
|
||||
tools: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports notifications for changes to the tool list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* After receiving an initialize request from the client, the server sends this response.
|
||||
|
|
@ -304,16 +316,18 @@ export const PingRequestSchema = RequestSchema.extend({
|
|||
});
|
||||
|
||||
/* Progress notifications */
|
||||
export const ProgressSchema = z.object({
|
||||
/**
|
||||
* The progress thus far. This should increase every time progress is made, even if the total is unknown.
|
||||
*/
|
||||
progress: z.number(),
|
||||
/**
|
||||
* Total number of items to process (or total progress required), if known.
|
||||
*/
|
||||
total: z.optional(z.number()),
|
||||
});
|
||||
export const ProgressSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The progress thus far. This should increase every time progress is made, even if the total is unknown.
|
||||
*/
|
||||
progress: z.number(),
|
||||
/**
|
||||
* Total number of items to process (or total progress required), if known.
|
||||
*/
|
||||
total: z.optional(z.number()),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* An out-of-band notification used to inform the receiver of a progress update for a long-running request.
|
||||
|
|
@ -351,16 +365,18 @@ export const PaginatedResultSchema = ResultSchema.extend({
|
|||
/**
|
||||
* The contents of a specific resource or sub-resource.
|
||||
*/
|
||||
export const ResourceContentsSchema = z.object({
|
||||
/**
|
||||
* The URI of this resource.
|
||||
*/
|
||||
uri: z.string(),
|
||||
/**
|
||||
* The MIME type of this resource, if known.
|
||||
*/
|
||||
mimeType: z.optional(z.string()),
|
||||
});
|
||||
export const ResourceContentsSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The URI of this resource.
|
||||
*/
|
||||
uri: z.string(),
|
||||
/**
|
||||
* The MIME type of this resource, if known.
|
||||
*/
|
||||
mimeType: z.optional(z.string()),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
export const TextResourceContentsSchema = ResourceContentsSchema.extend({
|
||||
/**
|
||||
|
|
@ -379,60 +395,64 @@ export const BlobResourceContentsSchema = ResourceContentsSchema.extend({
|
|||
/**
|
||||
* A known resource that the server is capable of reading.
|
||||
*/
|
||||
export const ResourceSchema = z.object({
|
||||
/**
|
||||
* The URI of this resource.
|
||||
*/
|
||||
uri: z.string(),
|
||||
export const ResourceSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The URI of this resource.
|
||||
*/
|
||||
uri: z.string(),
|
||||
|
||||
/**
|
||||
* A human-readable name for this resource.
|
||||
*
|
||||
* This can be used by clients to populate UI elements.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* A human-readable name for this resource.
|
||||
*
|
||||
* This can be used by clients to populate UI elements.
|
||||
*/
|
||||
name: z.string(),
|
||||
|
||||
/**
|
||||
* A description of what this resource represents.
|
||||
*
|
||||
* This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* A description of what this resource represents.
|
||||
*
|
||||
* This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
|
||||
/**
|
||||
* The MIME type of this resource, if known.
|
||||
*/
|
||||
mimeType: z.optional(z.string()),
|
||||
});
|
||||
/**
|
||||
* The MIME type of this resource, if known.
|
||||
*/
|
||||
mimeType: z.optional(z.string()),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* A template description for resources available on the server.
|
||||
*/
|
||||
export const ResourceTemplateSchema = z.object({
|
||||
/**
|
||||
* A URI template (according to RFC 6570) that can be used to construct resource URIs.
|
||||
*/
|
||||
uriTemplate: z.string(),
|
||||
export const ResourceTemplateSchema = z
|
||||
.object({
|
||||
/**
|
||||
* A URI template (according to RFC 6570) that can be used to construct resource URIs.
|
||||
*/
|
||||
uriTemplate: z.string(),
|
||||
|
||||
/**
|
||||
* A human-readable name for the type of resource this template refers to.
|
||||
*
|
||||
* This can be used by clients to populate UI elements.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* A human-readable name for the type of resource this template refers to.
|
||||
*
|
||||
* This can be used by clients to populate UI elements.
|
||||
*/
|
||||
name: z.string(),
|
||||
|
||||
/**
|
||||
* A description of what this template is for.
|
||||
*
|
||||
* This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* A description of what this template is for.
|
||||
*
|
||||
* This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
|
||||
/**
|
||||
* The MIME type for all resources that match this template. This should only be included if all resources matching this template have the same type.
|
||||
*/
|
||||
mimeType: z.optional(z.string()),
|
||||
});
|
||||
/**
|
||||
* The MIME type for all resources that match this template. This should only be included if all resources matching this template have the same type.
|
||||
*/
|
||||
mimeType: z.optional(z.string()),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Sent from the client to request a list of resources the server has.
|
||||
|
|
@ -524,50 +544,56 @@ export const UnsubscribeRequestSchema = RequestSchema.extend({
|
|||
*/
|
||||
export const ResourceUpdatedNotificationSchema = NotificationSchema.extend({
|
||||
method: z.literal("notifications/resources/updated"),
|
||||
params: z.object({
|
||||
/**
|
||||
* The URI of the resource that has been updated. This might be a sub-resource of the one that the client actually subscribed to.
|
||||
*/
|
||||
uri: z.string(),
|
||||
}),
|
||||
params: z
|
||||
.object({
|
||||
/**
|
||||
* The URI of the resource that has been updated. This might be a sub-resource of the one that the client actually subscribed to.
|
||||
*/
|
||||
uri: z.string(),
|
||||
})
|
||||
.passthrough(),
|
||||
});
|
||||
|
||||
/* Prompts */
|
||||
/**
|
||||
* Describes an argument that a prompt can accept.
|
||||
*/
|
||||
export const PromptArgumentSchema = z.object({
|
||||
/**
|
||||
* The name of the argument.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* A human-readable description of the argument.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* Whether this argument must be provided.
|
||||
*/
|
||||
required: z.optional(z.boolean()),
|
||||
});
|
||||
export const PromptArgumentSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The name of the argument.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* A human-readable description of the argument.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* Whether this argument must be provided.
|
||||
*/
|
||||
required: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* A prompt or prompt template that the server offers.
|
||||
*/
|
||||
export const PromptSchema = z.object({
|
||||
/**
|
||||
* The name of the prompt or prompt template.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* An optional description of what this prompt provides
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* A list of arguments to use for templating the prompt.
|
||||
*/
|
||||
arguments: z.optional(z.array(PromptArgumentSchema)),
|
||||
});
|
||||
export const PromptSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The name of the prompt or prompt template.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* An optional description of what this prompt provides
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* A list of arguments to use for templating the prompt.
|
||||
*/
|
||||
arguments: z.optional(z.array(PromptArgumentSchema)),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Sent from the client to request a list of prompts and prompt templates the server has.
|
||||
|
|
@ -622,23 +648,27 @@ export const PromptListChangedNotificationSchema = NotificationSchema.extend({
|
|||
/**
|
||||
* Definition for a tool the client can call.
|
||||
*/
|
||||
export const ToolSchema = z.object({
|
||||
/**
|
||||
* The name of the tool.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* A human-readable description of the tool.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* A JSON Schema object defining the expected parameters for the tool.
|
||||
*/
|
||||
inputSchema: z.object({
|
||||
type: z.literal("object"),
|
||||
properties: z.optional(z.object({}).passthrough()),
|
||||
}),
|
||||
});
|
||||
export const ToolSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The name of the tool.
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* A human-readable description of the tool.
|
||||
*/
|
||||
description: z.optional(z.string()),
|
||||
/**
|
||||
* A JSON Schema object defining the expected parameters for the tool.
|
||||
*/
|
||||
inputSchema: z
|
||||
.object({
|
||||
type: z.literal("object"),
|
||||
properties: z.optional(z.object({}).passthrough()),
|
||||
})
|
||||
.passthrough(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Sent from the client to request a list of tools the server has.
|
||||
|
|
@ -703,20 +733,22 @@ export const SetLevelRequestSchema = RequestSchema.extend({
|
|||
*/
|
||||
export const LoggingMessageNotificationSchema = NotificationSchema.extend({
|
||||
method: z.literal("notifications/message"),
|
||||
params: z.object({
|
||||
/**
|
||||
* The severity of this log message.
|
||||
*/
|
||||
level: LoggingLevelSchema,
|
||||
/**
|
||||
* An optional name of the logger issuing this message.
|
||||
*/
|
||||
logger: z.optional(z.string()),
|
||||
/**
|
||||
* The data to be logged, such as a string message or an object. Any JSON serializable type is allowed here.
|
||||
*/
|
||||
data: z.unknown(),
|
||||
}),
|
||||
params: z
|
||||
.object({
|
||||
/**
|
||||
* The severity of this log message.
|
||||
*/
|
||||
level: LoggingLevelSchema,
|
||||
/**
|
||||
* An optional name of the logger issuing this message.
|
||||
*/
|
||||
logger: z.optional(z.string()),
|
||||
/**
|
||||
* The data to be logged, such as a string message or an object. Any JSON serializable type is allowed here.
|
||||
*/
|
||||
data: z.unknown(),
|
||||
})
|
||||
.passthrough(),
|
||||
});
|
||||
|
||||
/* Sampling */
|
||||
|
|
@ -771,24 +803,28 @@ export const CreateMessageResultSchema = ResultSchema.extend({
|
|||
/**
|
||||
* A reference to a resource or resource template definition.
|
||||
*/
|
||||
export const ResourceReferenceSchema = z.object({
|
||||
type: z.literal("ref/resource"),
|
||||
/**
|
||||
* The URI or URI template of the resource.
|
||||
*/
|
||||
uri: z.string(),
|
||||
});
|
||||
export const ResourceReferenceSchema = z
|
||||
.object({
|
||||
type: z.literal("ref/resource"),
|
||||
/**
|
||||
* The URI or URI template of the resource.
|
||||
*/
|
||||
uri: z.string(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* Identifies a prompt.
|
||||
*/
|
||||
export const PromptReferenceSchema = z.object({
|
||||
type: z.literal("ref/prompt"),
|
||||
/**
|
||||
* The name of the prompt or prompt template
|
||||
*/
|
||||
name: z.string(),
|
||||
});
|
||||
export const PromptReferenceSchema = z
|
||||
.object({
|
||||
type: z.literal("ref/prompt"),
|
||||
/**
|
||||
* The name of the prompt or prompt template
|
||||
*/
|
||||
name: z.string(),
|
||||
})
|
||||
.passthrough();
|
||||
|
||||
/**
|
||||
* A request from the client to the server, to ask for completion options.
|
||||
|
|
@ -800,16 +836,18 @@ export const CompleteRequestSchema = RequestSchema.extend({
|
|||
/**
|
||||
* The argument's information
|
||||
*/
|
||||
argument: z.object({
|
||||
/**
|
||||
* The name of the argument
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* The value of the argument to use for completion matching.
|
||||
*/
|
||||
value: z.string(),
|
||||
}),
|
||||
argument: z
|
||||
.object({
|
||||
/**
|
||||
* The name of the argument
|
||||
*/
|
||||
name: z.string(),
|
||||
/**
|
||||
* The value of the argument to use for completion matching.
|
||||
*/
|
||||
value: z.string(),
|
||||
})
|
||||
.passthrough(),
|
||||
}),
|
||||
});
|
||||
|
||||
|
|
@ -817,20 +855,22 @@ export const CompleteRequestSchema = RequestSchema.extend({
|
|||
* The server's response to a completion/complete request
|
||||
*/
|
||||
export const CompleteResultSchema = ResultSchema.extend({
|
||||
completion: z.object({
|
||||
/**
|
||||
* An array of completion values. Must not exceed 100 items.
|
||||
*/
|
||||
values: z.array(z.string()).max(100),
|
||||
/**
|
||||
* The total number of completion options available. This can exceed the number of values actually sent in the response.
|
||||
*/
|
||||
total: z.optional(z.number().int()),
|
||||
/**
|
||||
* Indicates whether there are additional completion options beyond those provided in the current response, even if the exact total is unknown.
|
||||
*/
|
||||
hasMore: z.optional(z.boolean()),
|
||||
}),
|
||||
completion: z
|
||||
.object({
|
||||
/**
|
||||
* An array of completion values. Must not exceed 100 items.
|
||||
*/
|
||||
values: z.array(z.string()).max(100),
|
||||
/**
|
||||
* The total number of completion options available. This can exceed the number of values actually sent in the response.
|
||||
*/
|
||||
total: z.optional(z.number().int()),
|
||||
/**
|
||||
* Indicates whether there are additional completion options beyond those provided in the current response, even if the exact total is unknown.
|
||||
*/
|
||||
hasMore: z.optional(z.boolean()),
|
||||
})
|
||||
.passthrough(),
|
||||
});
|
||||
|
||||
/* Client messages */
|
||||
|
|
|
|||
Loading…
Reference in a new issue