Skip to main content

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 release
  • 1.2.0 - New features added
  • 1.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:

  1. Increment version following semver rules
  2. Add new permissions if functionality expands
  3. Update minSystemVersion if using new APIs
  4. Maintain backward compatibility in configuration

The manifest is your plugin's contract with the MuluTime system—keep it accurate and up-to-date!