feat(mcp): add ponytail-mcp, an MCP server for the ruleset (#91)
* feat(mcp): add ponytail-mcp server (prompt + tool) * test(mcp): cover mode resolution and instruction text * Report resolved MCP mode
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env node
|
||||
// Ponytail MCP server: serves the lazy-senior-dev ruleset over stdio as a
|
||||
// prompt (user-invoked) and a tool (for hosts that pull context via tools).
|
||||
// It does NOT replace the always-on adapters; it's the clean option for hosts
|
||||
// whose only injection point is the prompt menu (see #70).
|
||||
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||||
import { z } from "zod";
|
||||
|
||||
import { MODES, buildInstructions, resolveMode } from "./instructions.js";
|
||||
|
||||
const server = new McpServer({ name: "ponytail", version: "0.1.0" });
|
||||
|
||||
const modeArg = z
|
||||
.enum(MODES)
|
||||
.optional()
|
||||
.describe("Ponytail intensity: lite, full, or ultra. Omit for the configured default.");
|
||||
|
||||
server.registerPrompt(
|
||||
"ponytail",
|
||||
{
|
||||
title: "Ponytail mode",
|
||||
description: "Lazy senior dev instructions: YAGNI, stdlib first, the smallest correct change.",
|
||||
argsSchema: { mode: modeArg },
|
||||
},
|
||||
({ mode }) => ({
|
||||
messages: [{ role: "user", content: { type: "text", text: buildInstructions(mode) } }],
|
||||
}),
|
||||
);
|
||||
|
||||
server.registerTool(
|
||||
"ponytail_instructions",
|
||||
{
|
||||
title: "Ponytail instructions",
|
||||
description: "Return the Ponytail ruleset for the given intensity (lite, full, or ultra).",
|
||||
inputSchema: { mode: modeArg },
|
||||
outputSchema: { mode: z.string(), instructions: z.string() },
|
||||
annotations: { readOnlyHint: true, openWorldHint: false },
|
||||
},
|
||||
({ mode }) => {
|
||||
const resolvedMode = resolveMode(mode);
|
||||
const instructions = buildInstructions(resolvedMode);
|
||||
const structuredContent = { mode: resolvedMode, instructions };
|
||||
return { content: [{ type: "text", text: instructions }], structuredContent };
|
||||
},
|
||||
);
|
||||
|
||||
await server.connect(new StdioServerTransport());
|
||||
Reference in New Issue
Block a user