Skip to main content
Glama
fadlee

PocketBase MCP Server

by fadlee

generate_pb_schema

Convert TypeScript interfaces or database diagrams into PocketBase schema definitions to streamline database setup and ensure structural consistency.

Instructions

Generate a PocketBase schema based on TypeScript interfaces or database diagram

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
optionsNoGeneration options
sourceCodeYesTypeScript interface or database diagram to convert to PocketBase schema

Implementation Reference

  • The main handler function createGeneratePbSchemaHandler that analyzes TypeScript code, generates PocketBase collections from interfaces, adds auth and timestamps as needed, and returns the schema as JSON.
    export function createGeneratePbSchemaHandler(pb: PocketBase): ToolHandler { return async (args: GeneratePbSchemaArgs) => { try { const { sourceCode, options = {} } = args; const includeAuth = options.includeAuthentication ?? true; const includeTimestamps = options.includeTimestamps ?? true; // Analyze TypeScript source code const interfaces = analyzeTypeScriptForSchema(sourceCode, options); if (interfaces.length === 0) { return createTextResponse("No TypeScript interfaces found in the provided source code."); } const collections = []; // Generate collections from interfaces for (const iface of interfaces) { const fields = []; // Add standard fields if requested if (includeTimestamps) { fields.push( { name: "created", type: "autodate", required: false, system: true, onCreate: true, onUpdate: false, }, { name: "updated", type: "autodate", required: false, system: true, onCreate: true, onUpdate: true, } ); } // Convert interface properties to PocketBase fields for (const prop of iface.properties) { const field: any = { name: prop.name, type: mapTypeScriptToPocketBase(prop.type), required: !prop.optional, }; // Add type-specific options if (field.type === "text" && prop.type.includes("email")) { field.type = "email"; } else if (field.type === "text" && prop.type.includes("url")) { field.type = "url"; } else if (field.type === "text" && prop.type.includes("Date")) { field.type = "date"; } fields.push(field); } const collection = { name: iface.name.toLowerCase(), type: "base" as const, fields, listRule: "", viewRule: "", createRule: "", updateRule: "", deleteRule: "", }; collections.push(collection); } // Add authentication collection if requested if (includeAuth) { const authCollection = { name: "users", type: "auth" as const, fields: [ { name: "name", type: "text", required: false, }, { name: "avatar", type: "file", required: false, options: { maxSelect: 1, maxSize: 5242880, mimeTypes: ["image/jpeg", "image/png", "image/svg+xml", "image/gif"], }, }, ], listRule: "id = @request.auth.id", viewRule: "id = @request.auth.id", createRule: "", updateRule: "id = @request.auth.id", deleteRule: "id = @request.auth.id", }; collections.unshift(authCollection); } const schema = { collections, generatedAt: new Date().toISOString(), source: "TypeScript interfaces", }; return createJsonResponse(schema); } catch (error: unknown) { throw handlePocketBaseError("generate PocketBase schema", error); } }; }
  • Input schema validation for the generate_pb_schema tool, defining sourceCode as required and options for authentication and timestamps.
    export const generatePbSchemaSchema = { type: "object", properties: { sourceCode: { type: "string", description: "TypeScript interface or database diagram to convert to PocketBase schema", }, options: { type: "object", description: "Generation options", properties: { includeAuthentication: { type: "boolean", description: "Whether to include authentication related collections", }, includeTimestamps: { type: "boolean", description: "Whether to include created/updated timestamps", }, }, }, }, required: ["sourceCode"], };
  • src/server.ts:206-210 (registration)
    Tool registration in the MCP server, specifying name, description, input schema, and handler.
    name: "generate_pb_schema", description: "Generate a PocketBase schema based on TypeScript interfaces or database diagram", inputSchema: generatePbSchemaSchema, handler: createGeneratePbSchemaHandler(pb), },
  • TypeScript interface defining the arguments for the generate_pb_schema handler.
    export interface GeneratePbSchemaArgs { sourceCode: string; options?: { includeAuthentication?: boolean; includeTimestamps?: boolean; }; }
  • Helper function to map TypeScript types to corresponding PocketBase field types.
    function mapTypeScriptToPocketBase(tsType: string): string { const type = tsType.toLowerCase(); if (type.includes("string")) return "text"; if (type.includes("number")) return "number"; if (type.includes("boolean")) return "bool"; if (type.includes("date")) return "date"; if (type.includes("email")) return "email"; if (type.includes("url")) return "url"; if (type.includes("[]")) return "json"; if (type.includes("object") || type.includes("{")) return "json"; return "text"; // Default fallback }

Latest Blog Posts

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/fadlee/pocketbase-mcp'

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