Learn how to define and validate your context schema for different use cases.
In MCP, a schema defines the structure and validation rules for your context. It specifies what components are available, their data types, and any constraints on their values.
A well-defined schema helps ensure consistency and makes it easier to maintain your AI application as it grows.
An MCP schema consists of a set of components, each with its own type and validation rules. Here's a basic example:
// Define your MCP schema
const mcpSchema = {
  version: "1.0",
  components: {
    systemInstruction: {
      type: "string",
      description: "High-level instruction for the LLM",
      required: true
    },
    userGoal: {
      type: "string",
      description: "Current user objective",
      required: true
    },
    memory: {
      type: "object",
      properties: {
        shortTerm: { type: "array" },
        longTerm: { type: "object" }
      }
    },
    tools: {
      type: "array",
      items: {
        type: "object",
        properties: {
          name: { type: "string", required: true },
          description: { type: "string" },
          parameters: { type: "object" }
        }
      }
    },
    retrievedDocuments: {
      type: "array",
      items: { type: "object" }
    }
  }
};Once you've defined your schema, you can use it to create a new MCP context:
import { MCPContext } from '@modl/mcp';
// Create a context with the schema
const assistant = new MCPContext({
  schema: mcpSchema,
  systemInstruction: "You are a helpful assistant.",
  userGoal: "Answer questions about programming",
  memory: {
    shortTerm: [],
    longTerm: {}
  },
  tools: [
    {
      name: "searchDocumentation",
      description: "Search programming documentation",
      parameters: {
        query: "string",
        language: "string"
      }
    }
  ]
});The schema will validate the initial context and any updates to ensure they conform to the defined structure.
MCP supports several data types for schema components:
const schema = {
  components: {
    // String type
    name: { 
      type: "string",
      minLength: 2,
      maxLength: 50
    },
    
    // Number type
    age: { 
      type: "number",
      minimum: 0,
      maximum: 120
    },
    
    // Boolean type
    isActive: { 
      type: "boolean",
      default: true
    },
    
    // Array type
    tags: { 
      type: "array",
      items: { type: "string" },
      minItems: 1
    },
    
    // Object type
    address: { 
      type: "object",
      properties: {
        street: { type: "string" },
        city: { type: "string" },
        zipCode: { type: "string" }
      },
      required: ["city"]
    },
    
    // Enum type
    role: { 
      type: "string",
      enum: ["user", "admin", "guest"]
    }
  }
};MCP automatically validates context updates against the schema. If an update violates the schema, an error will be thrown.
// This will throw an error if the schema requires userGoal to be a string
try {
  assistant.updateContext({
    userGoal: 123 // Error: userGoal must be a string
  });
} catch (error) {
  console.error("Validation error:", error.message);
}
// This will throw an error if a required field is missing
try {
  assistant.updateContext({
    systemInstruction: undefined // Error: systemInstruction is required
  });
} catch (error) {
  console.error("Validation error:", error.message);
}You can create custom schemas for different types of AI applications:
const ecommerceSchema = {
  components: {
    systemInstruction: { type: "string", required: true },
    userGoal: { type: "string", required: true },
    userProfile: {
      type: "object",
      properties: {
        name: { type: "string" },
        style: { type: "array", items: { type: "string" } },
        size: { type: "string" },
        pastPurchases: { type: "array", items: { type: "string" } },
        preferredPriceRange: { type: "string" }
      }
    },
    productCatalog: {
      type: "array",
      items: {
        type: "object",
        properties: {
          name: { type: "string" },
          price: { type: "string" },
          features: { type: "array", items: { type: "string" } }
        }
      }
    },
    tools: {
      type: "array",
      items: {
        type: "object",
        properties: {
          name: { type: "string" },
          description: { type: "string" },
          parameters: { type: "object" }
        }
      }
    }
  }
};const supportSchema = {
  components: {
    systemInstruction: { type: "string", required: true },
    userGoal: { type: "string", required: true },
    customerInfo: {
      type: "object",
      properties: {
        name: { type: "string" },
        email: { type: "string" },
        accountCreated: { type: "string" },
        previousTickets: { type: "array" }
      }
    },
    knowledgeBase: {
      type: "array",
      items: {
        type: "object",
        properties: {
          topic: { type: "string" },
          content: { type: "string" }
        }
      }
    },
    tools: {
      type: "array",
      items: {
        type: "object",
        properties: {
          name: { type: "string" },
          description: { type: "string" },
          parameters: { type: "object" }
        }
      }
    }
  }
};As your application evolves, you may need to update your schema. MCP supports schema versioning to help manage these changes:
const schemaV1 = {
  version: "1.0",
  components: {
    // Original components
  }
};
const schemaV2 = {
  version: "2.0",
  components: {
    // Updated components
  },
  migrations: {
    "1.0": (oldContext) => {
      // Convert from v1 to v2 format
      return {
        ...oldContext,
        // Add new fields or transform existing ones
      };
    }
  }
};Now that you understand how to define schemas, you can: