Deep patterns for @outfitter/mcp including tool registration, Zod schemas, resources, and server configuration. Use when building MCP servers, registering tools, defining resources, or when "MCP server", "MCP tool", "registerTool", or "@outfitter/mcp" are mentioned.
Deep patterns for @outfitter/mcp including tool registration, Zod schemas, resources, and server configuration. Use when building MCP servers, registering tools, defining resources, or when "MCP server", "MCP tool", "registerTool", or "@outfitter/mcp" are mentioned.
allowed-tools
Read Write Edit Glob Grep
MCP Server Patterns
Deep dive into @outfitter/mcp patterns.
Creating a Server
import { createMcpServer } from"@outfitter/mcp";
const server = createMcpServer({
name: "my-server",
version: "0.1.0",
description: "Server for AI agents",
});
// Register tools before start
server.registerTool(searchTool);
server.registerTool(createTool);
// Start server
server.start();
Tool Definition
Basic Tool
import { Result, ValidationError } from"@outfitter/contracts";
import { z } from"zod";
constInputSchema = z.object({
query: z.string().min(1).describe("Search query"),
limit: z.number().int().positive().default(10).describe("Max results"),
});
exportconst searchTool = {
name: "search",
description: "Search for items. Use when user asks to find or search.",
inputSchema: InputSchema,
handler: async (
input: z.infer<typeofInputSchema>
): Promise<Result<SearchOutput, ValidationError>> => {
const results = awaitperformSearch(input.query, input.limit);
returnResult.ok({ results, total: results.length });
},
};
Schema Best Practices
constInputSchema = z.object({
// Always use .describe() for AI understandingquery: z.string().describe("The search term to look for"),
// Provide defaults where sensiblelimit: z.number().default(10).describe("Maximum number of results"),
// Use enums for fixed choicessortBy: z
.enum(["name", "date", "relevance"])
.default("relevance")
.describe("Field to sort results by"),
// Mark optional fields explicitlytags: z.array(z.string()).optional().describe("Filter by tags"),
});