Skip to main content
Glama

Glif

Official
by glifxyz
types.ts6.41 kB
import { z } from "zod"; // Bot related schemas export const SimplifiedGlifSchema = z.strictObject({ id: z.string(), name: z.string(), description: z.string().nullable().optional(), user: z .strictObject({ id: z.string(), name: z.string(), username: z.string(), image: z.url().nullable().optional(), isSubscriber: z.boolean().optional(), }) .optional(), averageDuration: z.number().nullable().optional(), inputs: z.record(z.string(), z.string()).optional(), }); export const BotSkillSchema = z.strictObject({ id: z.string(), name: z.string(), displayName: z.string().optional(), description: z.string().nullable().optional(), customName: z.string().nullable().optional(), customDescription: z.string().nullable().optional(), usageInstructions: z.string().nullable().optional(), type: z.string().optional(), // Usually "skillGlif" spell: SimplifiedGlifSchema.optional(), }); export const BotSchema = z.strictObject({ id: z.string(), name: z.string(), username: z.string(), bio: z.string().nullable().optional(), userId: z.string().optional(), image: z.union([z.url(), z.string(), z.null()]).optional(), memory: z.string().nullable().optional(), personality: z.string().nullable().optional(), deployedAt: z.union([z.iso.datetime(), z.string(), z.null()]).optional(), chatResponseGlifId: z.string().nullable().optional(), messageCount: z.number().nullable().optional(), conversationStarters: z.array(z.unknown()).nullable().optional(), createdAt: z.union([z.iso.datetime(), z.string()]).optional(), updatedAt: z.union([z.iso.datetime(), z.string()]).optional(), themeCss: z.string().nullable().optional(), user: z .strictObject({ id: z.string(), name: z.string(), username: z.string(), image: z.union([z.url(), z.string(), z.null()]).optional(), }) .optional(), spellsForBot: z .array( z.strictObject({ spell: z.strictObject({ id: z.string(), name: z.string(), }), spellId: z.string().optional(), customName: z.string().nullable().optional(), customDescription: z.string().nullable().optional(), usageInstructions: z.string().nullable().optional(), nativeToolName: z.string().nullable().optional(), }) ) .nullable() .optional(), }); // Direct bot response schema (for single bot) export const BotResponseSchema = BotSchema; // Array of bots schema (for listing bots) export const BotsListSchema = z.array(BotSchema); // User schema export const UserSchema = z.object({ id: z.string(), name: z.string(), image: z.url().nullable(), username: z.string(), bio: z.string().optional(), website: z.string().optional(), location: z.string().optional(), banned: z.boolean().optional(), bannedAt: z.iso.datetime().nullable().optional(), rateLimitClass: z.string().optional(), staff: z.boolean().optional(), isSubscriber: z.boolean().optional(), }); // Glif schema export const GlifSchema = z.object({ id: z.string(), name: z.string(), imageUrl: z.url().nullable(), description: z.string().nullable(), createdAt: z.iso.datetime(), updatedAt: z.iso.datetime(), publishedAt: z.iso.datetime().nullable(), output: z.string().nullable(), outputType: z.string().nullable(), forkedFromId: z.string().nullable(), featuredAt: z.iso.datetime().nullable(), userId: z.string(), completedSpellRunCount: z.number().optional(), averageDuration: z.number().nullable(), likeCount: z.number().optional(), commentCount: z.number().optional(), user: UserSchema, spellTags: z.array(z.unknown()).optional(), spheres: z.array(z.unknown()).optional(), data: z .object({ nodes: z.array( z.object({ name: z.string(), type: z.string(), params: z .object({ label: z.string().nullable().optional(), }) .and(z.record(z.string(), z.unknown())), }) ), }) .optional(), }); // Glif run schema export const GlifRunSchema = z.object({ id: z.string(), createdAt: z.iso.datetime(), updatedAt: z.iso.datetime(), output: z.string().nullable(), outputType: z.string().nullable(), userId: z.string(), startedAt: z.iso.datetime(), completedAt: z.iso.datetime().nullable(), totalDuration: z.number().nullable(), public: z.boolean().optional(), clientType: z.string().optional(), inputs: z.record(z.string(), z.unknown()).optional(), spellId: z.string(), outputImageWidth: z.number().nullable(), outputImageHeight: z.number().nullable(), deletionReason: z.string().nullable().optional(), deleted: z.boolean().optional(), totalSellingPriceCredits: z.string().nullable().optional(), likeCount: z.number().optional(), commentCount: z.number().optional(), visibility: z.string().optional(), user: UserSchema, spell: z.object({ id: z.string(), name: z.string(), output: z.string().nullable(), outputType: z.string().nullable(), user: UserSchema.optional(), }), }); // Glif run response schema export const GlifRunResponseSchema = z.object({ id: z.string(), inputs: z.record(z.string(), z.string()), output: z.string().nullable(), // Allow null values for output outputFull: z .object({ type: z.string(), }) .and(z.record(z.string(), z.unknown())) .optional(), // Make outputFull optional }); // Export types export type User = z.infer<typeof UserSchema>; export type Glif = z.infer<typeof GlifSchema>; export type GlifRun = z.infer<typeof GlifRunSchema>; export type GlifRunResponse = z.infer<typeof GlifRunResponseSchema>; // Search params schema export const SearchParamsSchema = z.object({ q: z.string().optional(), featured: z.boolean().optional(), id: z.string().optional(), }); // Me response schema export const MeResponseSchema = z.object({ user: UserSchema, credits: z.object({ remaining: z.number(), limit: z.number(), label: z.string(), }), }); export type SearchParams = z.infer<typeof SearchParamsSchema>; export type MeResponse = z.infer<typeof MeResponseSchema>; // Bot types export type Bot = z.infer<typeof BotSchema>; export type BotSkill = z.infer<typeof BotSkillSchema>; export type BotResponse = z.infer<typeof BotResponseSchema>; export type BotsList = z.infer<typeof BotsListSchema>;

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/glifxyz/glif-mcp-server'

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