Core types and utilities for MCP (Model Context Protocol) integration. Converts Zod schemas and procedures to MCP-compatible formats.
- Overview
- Installation
- Architecture
- Quick Start
- API Reference
- Tool Filtering
- Integration
- Requirements
- License
mcp provides the foundation for MCP integration:
- Schema Conversion - Convert Zod schemas to JSON Schema format
- Procedure Mapping - Transform procedures to MCP tool definitions
- Filtering - Control which procedures become MCP tools
- Type Definitions - TypeScript types for MCP tools and filters
npm install @mark1russell7/mcpgraph LR
subgraph "Input"
Proc[Procedure]
Zod[Zod Schema]
end
subgraph "mcp Package"
Z2J[zodToJsonSchema]
P2T[procedureToMcpTool]
end
subgraph "Output"
JSON[JSON Schema]
Tool[MCP Tool]
end
Zod --> Z2J
Z2J --> JSON
Proc --> P2T
JSON --> P2T
P2T --> Tool
graph TB
subgraph "Procedure"
Path[path: string[]]
Meta[metadata.description]
Input[input: ZodSchema]
Handler[handler: Function]
end
subgraph "MCP Tool"
Name[name: string]
Desc[description: string]
Schema[inputSchema: JSONSchema]
end
Path -->|"join('.')"| Name
Meta --> Desc
Input -->|zodToJsonSchema| Schema
graph TB
subgraph "Procedure Registry"
R1[fs.read]
R2[git.commit]
R3[shell.run]
R4[...]
end
subgraph "mcp"
Convert[proceduresToMcpTools]
Filter[McpToolFilter]
end
subgraph "client-mcp"
Transport[McpServerTransport]
end
subgraph "Claude"
Tools[MCP Tools]
end
R1 --> Convert
R2 --> Convert
R3 --> Convert
R4 --> Convert
Filter --> Convert
Convert --> Transport
Transport --> Tools
import { proceduresToMcpTools, zodToJsonSchema } from "@mark1russell7/mcp";
import { PROCEDURE_REGISTRY } from "@mark1russell7/client";
// Convert all registered procedures to MCP tools
const tools = proceduresToMcpTools(PROCEDURE_REGISTRY.getAll());
// Convert a Zod schema to JSON Schema
const jsonSchema = zodToJsonSchema(myZodSchema);Converts a Zod schema to JSON Schema format for MCP tool input definitions.
function zodToJsonSchema(schema: ZodType): JsonSchema;Supported Zod Types:
| Zod Type | JSON Schema |
|---|---|
z.string() |
{ type: "string" } |
z.number() |
{ type: "number" } |
z.boolean() |
{ type: "boolean" } |
z.array() |
{ type: "array", items: ... } |
z.object() |
{ type: "object", properties: ... } |
z.enum() |
{ type: "string", enum: [...] } |
z.optional() |
Removes from required |
z.default() |
Adds default value |
z.describe() |
Adds description |
Example:
import { z } from "zod";
import { zodToJsonSchema } from "@mark1russell7/mcp";
const schema = z.object({
path: z.string().describe("File path"),
encoding: z.enum(["utf8", "base64"]).default("utf8"),
});
const jsonSchema = zodToJsonSchema(schema);
// {
// type: "object",
// properties: {
// path: { type: "string", description: "File path" },
// encoding: { type: "string", enum: ["utf8", "base64"], default: "utf8" }
// },
// required: ["path"]
// }Converts a single procedure to an MCP tool definition.
function procedureToMcpTool(procedure: Procedure): McpTool;
interface McpTool {
name: string; // Dot-joined path: "fs.read"
description: string; // From procedure metadata
inputSchema: JsonSchema; // Converted from Zod
}Example:
const tool = procedureToMcpTool(fsReadProcedure);
// {
// name: "fs.read",
// description: "Read file contents",
// inputSchema: { type: "object", properties: { path: ... } }
// }Converts multiple procedures to MCP tools with optional filtering.
function proceduresToMcpTools(
procedures: Procedure[],
filter?: McpToolFilter
): McpTool[];Example:
// Convert all procedures
const allTools = proceduresToMcpTools(PROCEDURE_REGISTRY.getAll());
// Convert with filtering
const filteredTools = proceduresToMcpTools(procedures, {
includeTags: ["fs", "git"],
excludeInternal: true,
});Control which procedures are exposed as MCP tools:
interface McpToolFilter {
includeTags?: string[]; // Only include procedures with these tags
excludeTags?: string[]; // Exclude procedures with these tags
excludeInternal?: boolean; // Exclude procedures starting with _
pathPrefix?: string[]; // Only include procedures with this path prefix
}graph TB
subgraph "Original (10 procedures)"
All[fs.read, fs.write, git.commit,<br/>_internal.debug, api.users, ...]
end
subgraph "excludeInternal: true"
NoInt[fs.read, fs.write, git.commit,<br/>api.users, ...]
end
subgraph "pathPrefix: ['fs']"
FSOnly[fs.read, fs.write]
end
subgraph "includeTags: ['public']"
Public[Tagged as public only]
end
All --> NoInt
All --> FSOnly
All --> Public
Usage:
import { proceduresToMcpTools, type McpToolFilter } from "@mark1russell7/mcp";
const filter: McpToolFilter = {
includeTags: ["fs", "git"], // Only these namespaces
excludeTags: ["internal"], // Exclude internal
excludeInternal: true, // Exclude _prefixed
pathPrefix: ["fs"], // Only fs.* procedures
};
const tools = proceduresToMcpTools(procedures, filter);import { McpServerTransport } from "@mark1russell7/client-mcp";
import { proceduresToMcpTools } from "@mark1russell7/mcp";
// client-mcp uses mcp internally
const transport = new McpServerTransport(server, {
transport: "stdio",
// Filter uses McpToolFilter from mcp package
filter: {
excludeInternal: true,
},
});graph BT
subgraph "Implementation"
Impl[impl-mcp-dev]
end
subgraph "Transport"
ClientMCP[client-mcp]
end
subgraph "Core"
MCP[mcp]
Client[client]
end
subgraph "External"
SDK[@modelcontextprotocol/sdk]
end
Impl --> ClientMCP
ClientMCP --> MCP
ClientMCP --> Client
MCP --> Client
ClientMCP --> SDK
- Node.js >= 20
- Dependencies:
@mark1russell7/clientzod
MIT