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: