Skip to content
⌘K

Creating a Plugin

~/.monday-morning/plugins/my-plugin/index.ts
import { z } from 'zod';
import type { MondayMorningPlugin, PluginContext } from '@monday-morning/mcp/plugin-types';
let ctx: PluginContext;
const plugin: MondayMorningPlugin = {
id: 'my-plugin',
name: 'My Plugin',
description: 'What it does, in one line.',
version: '1.0.0',
category: 'integration',
tools: [
{
name: 'mm_my_thing',
description: 'What an agent gets from calling this.',
inputSchema: z.object({
project_path: z.string().describe('Absolute path to the project root'),
query: z.string().describe('What to look for')
}),
handler: async (args) => {
const { query } = args as { query: string };
ctx.logger.info(`searching for ${query}`);
return { content: [{ type: 'text', text: `Found nothing for ${query}` }] };
}
}
],
async register(context) {
ctx = context;
}
};
export default plugin;
  • Prefix tool names with mm_, and don’t collide with a built-in — the registry refuses the plugin.
  • Take project_path in every tool: plugins serve whichever project is open.
  • Describe every field. The description is what the agent reads to decide how to call you.
  • Return MCP content, not a bare object.

Compile to index.js, put the folder in ~/.monday-morning/plugins/{id}/ with a package.json marking "type": "module", and restart the server. mm_reload_plugins reloads without a restart; it’s in the opt-in workflow tool group.