skills-ws
Version:
87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.
49 lines (45 loc) • 1.46 kB
Markdown
## Appendix C: Tool Registration Helper
```typescript
// DRY helper for registering tools with consistent error handling and logging
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z, ZodRawShape } from "zod";
import { logger } from "./monitoring/logger.js";
import { AuthResult } from "./auth/middleware.js";
type ToolHandler<T> = (args: T) => Promise<{ content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> }>;
export function registerTool<T extends ZodRawShape>(
server: McpServer,
name: string,
description: string,
schema: T,
handler: ToolHandler<z.objectOutputType<z.ZodObject<T>, z.ZodTypeAny>>,
auth?: AuthResult
) {
server.registerTool(name, { description, inputSchema: schema }, async (args) => {
const start = Date.now();
try {
const result = await handler(args as any);
logger.log({
level: "info",
tier: auth?.tier || "free",
tool: name,
durationMs: Date.now() - start,
userId: auth?.userId,
});
return result;
} catch (err: any) {
logger.log({
level: "error",
tier: auth?.tier || "free",
tool: name,
durationMs: Date.now() - start,
userId: auth?.userId,
error: err.message,
});
return {
content: [{ type: "text" as const, text: `Error in ${name}: ${err.message}` }],
isError: true,
};
}
});
}
```