Creating a Plugin
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;Rules that bite
Section titled “Rules that bite”- Prefix tool names with
mm_, and don’t collide with a built-in — the registry refuses the plugin. - Take
project_pathin 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.
Running it
Section titled “Running it”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.