Skip to main content
Glama

Context Pods

by conorluddy
schemas.tsโ€ข6.96 kB
/** * MCP Protocol schemas for validation */ import { z } from 'zod'; /** * JSON-RPC 2.0 base schemas */ export const JsonRpcIdSchema = z.union([z.string(), z.number(), z.null()]); export const JsonRpcRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.string(), params: z.unknown().optional(), id: JsonRpcIdSchema, }); export const JsonRpcResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.unknown().optional(), error: z .object({ code: z.number(), message: z.string(), data: z.unknown().optional(), }) .optional(), id: JsonRpcIdSchema, }); export const JsonRpcNotificationSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.string(), params: z.unknown().optional(), }); /** * MCP Protocol message schemas */ export const InitializeRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('initialize'), params: z.object({ protocolVersion: z.string(), capabilities: z .object({ tools: z.boolean().optional(), resources: z.boolean().optional(), prompts: z.boolean().optional(), logging: z.boolean().optional(), }) .optional(), clientInfo: z .object({ name: z.string(), version: z.string().optional(), }) .optional(), }), id: JsonRpcIdSchema, }); export const InitializeResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ protocolVersion: z.string(), capabilities: z.object({ tools: z .object({ listTools: z.boolean().optional(), callTool: z.boolean().optional(), }) .optional(), resources: z .object({ listResources: z.boolean().optional(), readResource: z.boolean().optional(), subscribeResource: z.boolean().optional(), }) .optional(), prompts: z .object({ listPrompts: z.boolean().optional(), getPrompt: z.boolean().optional(), }) .optional(), logging: z .object({ setLevel: z.boolean().optional(), }) .optional(), }), serverInfo: z.object({ name: z.string(), version: z.string().optional(), }), }), id: JsonRpcIdSchema, }); export const ListToolsRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('tools/list'), params: z.object({}).optional(), id: JsonRpcIdSchema, }); export const ListToolsResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ tools: z.array( z.object({ name: z.string(), description: z.string().optional(), inputSchema: z.object({ type: z.literal('object'), properties: z.record(z.string(), z.unknown()).optional(), required: z.array(z.string()).optional(), additionalProperties: z.boolean().optional(), }), }), ), }), id: JsonRpcIdSchema, }); export const CallToolRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('tools/call'), params: z.object({ name: z.string(), arguments: z.record(z.string(), z.unknown()).optional(), }), id: JsonRpcIdSchema, }); export const CallToolResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ content: z.array( z.object({ type: z.enum(['text', 'image', 'resource']), text: z.string().optional(), data: z.string().optional(), mimeType: z.string().optional(), resource: z .object({ uri: z.string(), text: z.string().optional(), mimeType: z.string().optional(), }) .optional(), }), ), isError: z.boolean().optional(), }), id: JsonRpcIdSchema, }); export const ListResourcesRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('resources/list'), params: z.object({}).optional(), id: JsonRpcIdSchema, }); export const ListResourcesResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ resources: z.array( z.object({ uri: z.string(), name: z.string(), description: z.string().optional(), mimeType: z.string().optional(), }), ), }), id: JsonRpcIdSchema, }); export const ReadResourceRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('resources/read'), params: z.object({ uri: z.string(), }), id: JsonRpcIdSchema, }); export const ReadResourceResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ contents: z.array( z.object({ uri: z.string(), mimeType: z.string().optional(), text: z.string().optional(), blob: z.string().optional(), }), ), }), id: JsonRpcIdSchema, }); export const ListPromptsRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('prompts/list'), params: z.object({}).optional(), id: JsonRpcIdSchema, }); export const ListPromptsResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ prompts: z.array( z.object({ name: z.string(), description: z.string().optional(), arguments: z .array( z.object({ name: z.string(), description: z.string().optional(), required: z.boolean().optional(), }), ) .optional(), }), ), }), id: JsonRpcIdSchema, }); export const GetPromptRequestSchema = z.object({ jsonrpc: z.literal('2.0'), method: z.literal('prompts/get'), params: z.object({ name: z.string(), arguments: z.record(z.string(), z.string()).optional(), }), id: JsonRpcIdSchema, }); export const GetPromptResponseSchema = z.object({ jsonrpc: z.literal('2.0'), result: z.object({ description: z.string().optional(), messages: z.array( z.object({ role: z.enum(['user', 'assistant']), content: z.object({ type: z.literal('text'), text: z.string(), }), }), ), }), id: JsonRpcIdSchema, }); /** * Error response schema */ export const ErrorResponseSchema = z.object({ jsonrpc: z.literal('2.0'), error: z.object({ code: z.number(), message: z.string(), data: z.unknown().optional(), }), id: JsonRpcIdSchema, }); /** * Complete message type union */ export const MCPMessageSchema = z.union([ InitializeRequestSchema, InitializeResponseSchema, ListToolsRequestSchema, ListToolsResponseSchema, CallToolRequestSchema, CallToolResponseSchema, ListResourcesRequestSchema, ListResourcesResponseSchema, ReadResourceRequestSchema, ReadResourceResponseSchema, ListPromptsRequestSchema, ListPromptsResponseSchema, GetPromptRequestSchema, GetPromptResponseSchema, ErrorResponseSchema, JsonRpcNotificationSchema, ]);

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/conorluddy/ContextPods'

If you have feedback or need assistance with the MCP directory API, please join our Discord server