Plugin Manifest
The plugin manifest is a crucial configuration file that defines your plugin's identity, capabilities, and requirements.
Overview
Every MuluTime plugin must include a manifest that describes:
- Plugin metadata (name, version, author)
- Required permissions and capabilities
- Integration types and categories
- Configuration schema for user settings
- Dependencies and system requirements
Basic Structure
import {
PluginManifest,
PluginCategory,
IntegrationType,
PluginPermission
} from '@mulutime/plugin-sdk';
const manifest: PluginManifest = {
// Required fields
id: 'com.yourcompany.plugin-name',
name: 'Your Plugin Name',
version: '1.0.0',
description: 'What your plugin does',
author: {
name: 'Your Name',
email: 'your.email@company.com'
},
// Plugin classification
category: PluginCategory.INTEGRATION,
type: [IntegrationType.CALENDAR, IntegrationType.NOTIFICATION],
// Security and permissions
permissions: [
PluginPermission.READ_BOOKING_DATA,
PluginPermission.EXTERNAL_API_ACCESS
],
// System compatibility
apiVersion: '1.0.0',
minSystemVersion: '1.0.0',
main: 'dist/index.js'
};
Required Fields
id
id: string
Unique identifier for your plugin. Use reverse domain notation.
Format: com.company.plugin-name
Examples:
com.google.calendar-sync
com.stripe.payment-processor
com.zapier.webhook-integration
name
name: string
Human-readable name displayed in the plugin store and admin interface.
Guidelines:
- Keep it concise but descriptive
- Use title case
- Avoid generic terms like "Plugin" or "Integration"
version
version: string
Semantic version following semver format (MAJOR.MINOR.PATCH
).
Examples:
1.0.0
- Initial release1.2.0
- New features added1.2.1
- Bug fixes
description
description: string
Brief description of what your plugin does (1-2 sentences).
author
author: {
name: string;
email: string;
url?: string;
}
Author information for support and attribution.
Classification Fields
category
category: PluginCategory
Primary category for plugin organization.
Available categories:
enum PluginCategory {
CALENDAR = 'CALENDAR',
NOTIFICATION = 'NOTIFICATION',
PAYMENT = 'PAYMENT',
INTEGRATION = 'INTEGRATION',
AUTOMATION = 'AUTOMATION',
ANALYTICS = 'ANALYTICS',
COMMUNICATION = 'COMMUNICATION',
UTILITY = 'UTILITY'
}
type
type: IntegrationType[]
Integration types that your plugin provides.
Available types:
enum IntegrationType {
CALENDAR = 'CALENDAR',
EMAIL = 'EMAIL',
SMS = 'SMS',
WEBHOOK = 'WEBHOOK',
API = 'API',
DATABASE = 'DATABASE',
FILE_STORAGE = 'FILE_STORAGE',
PAYMENT = 'PAYMENT',
ANALYTICS = 'ANALYTICS',
CRM = 'CRM',
AUTOMATION = 'AUTOMATION'
}
Security & Permissions
permissions
permissions: PluginPermission[]
Required permissions for your plugin to function.
Available permissions:
enum PluginPermission {
READ_USER_DATA = 'READ_USER_DATA',
WRITE_USER_DATA = 'WRITE_USER_DATA',
READ_BOOKING_DATA = 'READ_BOOKING_DATA',
WRITE_BOOKING_DATA = 'WRITE_BOOKING_DATA',
READ_ORGANIZATION_DATA = 'READ_ORGANIZATION_DATA',
WRITE_ORGANIZATION_DATA = 'WRITE_ORGANIZATION_DATA',
EXTERNAL_API_ACCESS = 'EXTERNAL_API_ACCESS',
SEND_NOTIFICATIONS = 'SEND_NOTIFICATIONS',
ACCESS_PAYMENT_DATA = 'ACCESS_PAYMENT_DATA',
MANAGE_WEBHOOKS = 'MANAGE_WEBHOOKS'
}
Best practices:
- Only request permissions you actually need
- Be specific about data access requirements
- Document why each permission is needed
System Compatibility
apiVersion
apiVersion: string
MuluTime API version your plugin is built for.
minSystemVersion
minSystemVersion: string
Minimum MuluTime system version required.
main
main: string
Entry point file (usually the compiled JavaScript).
Optional Fields
license
license?: string
Software license (e.g., 'MIT', 'Apache-2.0', 'proprietary').
homepage
homepage?: string
Plugin homepage or documentation URL.
repository
repository?: {
type: string;
url: string;
}
Source code repository information.
keywords
keywords?: string[]
Search keywords for the plugin store.
icon
icon?: string
Path to plugin icon file.
configSchema
configSchema?: JSONSchema7
JSON Schema defining user configuration options.
Example:
configSchema: {
type: 'object',
properties: {
apiKey: {
type: 'string',
title: 'API Key',
description: 'Your service API key'
},
webhookUrl: {
type: 'string',
format: 'uri',
title: 'Webhook URL',
description: 'URL to receive notifications'
},
enableLogging: {
type: 'boolean',
title: 'Enable Debug Logging',
default: false
}
},
required: ['apiKey']
}
Complete Example
import {
PluginManifest,
PluginCategory,
IntegrationType,
PluginPermission
} from '@mulutime/plugin-sdk';
export const manifest: PluginManifest = {
// Identity
id: 'com.acme.calendar-sync',
name: 'ACME Calendar Sync',
version: '2.1.0',
description: 'Synchronize bookings with Google Calendar and Outlook in real-time',
// Author information
author: {
name: 'ACME Corporation',
email: 'support@acme.com',
url: 'https://acme.com'
},
// Licensing and links
license: 'MIT',
homepage: 'https://acme.com/plugins/calendar-sync',
repository: {
type: 'git',
url: 'https://github.com/acme/calendar-sync-plugin'
},
// Classification
category: PluginCategory.CALENDAR,
type: [
IntegrationType.CALENDAR,
IntegrationType.WEBHOOK,
IntegrationType.API
],
keywords: ['calendar', 'sync', 'google', 'outlook', 'automation'],
// Security
permissions: [
PluginPermission.READ_BOOKING_DATA,
PluginPermission.WRITE_BOOKING_DATA,
PluginPermission.EXTERNAL_API_ACCESS,
PluginPermission.SEND_NOTIFICATIONS
],
// System requirements
apiVersion: '1.0.0',
minSystemVersion: '1.2.0',
// Build artifacts
main: 'dist/index.js',
icon: 'assets/calendar-icon.png',
// User configuration
configSchema: {
type: 'object',
properties: {
googleApiKey: {
type: 'string',
title: 'Google Calendar API Key',
description: 'API key for Google Calendar integration'
},
outlookClientId: {
type: 'string',
title: 'Outlook Client ID',
description: 'Microsoft Graph API client ID'
},
syncDirection: {
type: 'string',
title: 'Sync Direction',
enum: ['bidirectional', 'to-external', 'from-external'],
default: 'bidirectional',
description: 'Direction of calendar synchronization'
},
syncInterval: {
type: 'number',
title: 'Sync Interval (minutes)',
minimum: 5,
maximum: 1440,
default: 15,
description: 'How often to sync calendars'
},
enableConflictDetection: {
type: 'boolean',
title: 'Enable Conflict Detection',
default: true,
description: 'Detect and handle scheduling conflicts'
}
},
required: ['googleApiKey', 'outlookClientId']
}
};
Validation
The SDK automatically validates your manifest:
import { createManifest } from '@mulutime/plugin-sdk';
// This will throw an error if the manifest is invalid
const validatedManifest = createManifest(manifest);
Best Practices
✅ Do's
- Use descriptive, unique plugin IDs
- Follow semantic versioning
- Request only necessary permissions
- Provide comprehensive configuration schemas
- Include helpful descriptions and documentation links
❌ Don'ts
- Don't use generic names or IDs
- Don't request excessive permissions
- Don't skip version updates
- Don't omit required fields
- Don't use conflicting integration types
Manifest Evolution
When updating your plugin:
- Increment version following semver rules
- Add new permissions if functionality expands
- Update minSystemVersion if using new APIs
- Maintain backward compatibility in configuration
The manifest is your plugin's contract with the MuluTime system—keep it accurate and up-to-date!