Skip to main content
Glama

Model Context Protocol (MCP) Server

by infinyte
ToolDefinition.js3.6 kB
const mongoose = require('mongoose'); const Schema = mongoose.Schema; /** * Schema for tool parameter properties */ const ParameterPropertySchema = new Schema({ type: { type: String, required: true, enum: ['string', 'number', 'boolean', 'integer', 'array', 'object', 'null'] }, description: { type: String, required: true }, default: { type: Schema.Types.Mixed }, enum: { type: [Schema.Types.Mixed] }, format: { type: String }, minimum: { type: Number }, maximum: { type: Number }, minLength: { type: Number }, maxLength: { type: Number }, pattern: { type: String }, items: { type: Schema.Types.Mixed }, // For array types additionalProperties: { type: Schema.Types.Mixed }, properties: { type: Map, of: Schema.Types.Mixed }, // Nested properties for objects required: { type: [String] } // For object types, list of required properties }, { _id: false }); /** * Schema for tool parameters */ const ParameterSchema = new Schema({ type: { type: String, required: true, enum: ['object'] }, properties: { type: Map, of: ParameterPropertySchema, required: true }, required: { type: [String], default: [] }, additionalProperties: { type: Boolean, default: false } }, { _id: false }); /** * Schema for tool definitions */ const ToolDefinitionSchema = new Schema({ name: { type: String, required: true, unique: true, trim: true, index: true }, description: { type: String, required: true }, version: { type: String, default: '1.0.0' }, category: { type: String, enum: ['web', 'image', 'file', 'data', 'utility', 'custom'], default: 'custom' }, tags: { type: [String], default: [] }, parameters: { type: ParameterSchema, required: true }, implementation: { type: String, enum: ['internal', 'external', 'plugin'], default: 'internal' }, implementationPath: { type: String }, enabled: { type: Boolean, default: true }, security: { requiresAuth: { type: Boolean, default: false }, rateLimit: { type: Number, default: 0 } // 0 means no limit }, metadata: { createdBy: { type: String }, createdAt: { type: Date, default: Date.now }, updatedAt: { type: Date, default: Date.now }, lastUsed: { type: Date }, usageCount: { type: Number, default: 0 } } }, { timestamps: true }); // Pre-save hook to update the updatedAt timestamp ToolDefinitionSchema.pre('save', function(next) { this.metadata.updatedAt = Date.now(); next(); }); // Index for efficient searching ToolDefinitionSchema.index({ name: 1, version: 1 }, { unique: true }); ToolDefinitionSchema.index({ category: 1 }); ToolDefinitionSchema.index({ tags: 1 }); ToolDefinitionSchema.index({ 'metadata.createdAt': -1 }); ToolDefinitionSchema.index({ 'metadata.usageCount': -1 }); // Method to increment usage count ToolDefinitionSchema.methods.incrementUsage = async function() { this.metadata.lastUsed = Date.now(); this.metadata.usageCount += 1; return this.save(); }; // Static method to get all tools by category ToolDefinitionSchema.statics.getAllByCategory = function(category) { return this.find({ category, enabled: true }).sort({ 'metadata.usageCount': -1 }); }; // Static method to get all enabled tools ToolDefinitionSchema.statics.getAllEnabled = function() { return this.find({ enabled: true }).sort({ name: 1 }); }; // Create the model const ToolDefinition = mongoose.model('ToolDefinition', ToolDefinitionSchema); module.exports = ToolDefinition;

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

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