Skip to main content
Glama
README.md10.7 kB
# Trace MCP > Static analysis engine for detecting schema mismatches between data producers and consumers. ## What It Does Trace MCP finds mismatches between: - Backend API responses and frontend expectations - MCP tool outputs and client code that uses them - Service A's events and Service B's handlers ``` Producer returns: { characterClass: "Fighter", hitPoints: 45 } Consumer expects: { class: "Fighter", hp: 45 } Result: ❌ Mismatch detected before runtime ``` ## Installation ```bash # Clone the repository git clone https://github.com/Mnehmos/trace-mcp.git # Navigate to the directory cd trace-mcp # Install dependencies npm install # Build the project npm run build ``` ## Configuration Add to your MCP client configuration (e.g., `claude_desktop_config.json` or Roo-Code settings): ```json { "mcpServers": { "trace-mcp": { "command": "node", "args": ["/path/to/trace-mcp/dist/index.js"], "env": {} } } } ``` ## Tools Reference Trace MCP provides 11 tools organized into three categories: ### Core Analysis Tools | Tool | Description | | ----------------- | ---------------------------------------------------- | | `extract_schemas` | Extract MCP tool definitions from server source code | | `extract_file` | Extract schemas from a single file | | `trace_usage` | Trace how client code uses MCP tools | | `trace_file` | Trace tool usage in a single file | | `compare` | Full pipeline: extract → trace → compare → report | ### Code Generation Tools | Tool | Description | | ------------------- | ----------------------------------------------- | | `scaffold_consumer` | Generate client code from producer schema | | `scaffold_producer` | Generate server stub from client usage | | `comment_contract` | Add cross-reference comments to validated pairs | ### Project Management Tools | Tool | Description | | -------------------- | ------------------------------------------------------- | | `init_project` | Initialize a trace project with `.trace-mcp` config | | `watch` | Watch files for changes and auto-revalidate | | `get_project_status` | Get project config, cache state, and validation results | --- ## Tool Details ### `extract_schemas` Extract MCP tool definitions (ProducerSchemas) from server source code. Scans for `server.tool()` calls and parses their Zod schemas. **Parameters:** - `rootDir` (required): Root directory of MCP server source code - `include`: Glob patterns to include (default: `**/*.ts`) - `exclude`: Glob patterns to exclude (default: `node_modules`, `dist`) **Example:** ```typescript const result = await client.callTool("extract_schemas", { rootDir: "./backend/src", }); // Returns: { success: true, count: 12, schemas: [...] } ``` --- ### `extract_file` Extract MCP tool definitions from a single TypeScript file. **Parameters:** - `filePath` (required): Path to a TypeScript file --- ### `trace_usage` Trace how client code uses MCP tools. Finds `callTool()` invocations and tracks which properties are accessed on results. **Parameters:** - `rootDir` (required): Root directory of consumer source code - `include`: Glob patterns to include - `exclude`: Glob patterns to exclude --- ### `trace_file` Trace MCP tool usage in a single TypeScript file. **Parameters:** - `filePath` (required): Path to a TypeScript file --- ### `compare` Full analysis pipeline: extract producer schemas, trace consumer usage, and compare them to find mismatches. **Parameters:** - `producerDir` (required): Path to MCP server source directory - `consumerDir` (required): Path to consumer/client source directory - `format`: Output format (`json`, `markdown`, `summary`) - `strict`: Strict mode - treat missing optional properties as warnings - `direction`: Data flow direction (`producer_to_consumer`, `consumer_to_producer`, `bidirectional`) **Example Output (Markdown):** ```markdown # Trace MCP Analysis Report **Generated**: 2025-12-11T02:11:48.624Z ## Summary | Metric | Count | | ----------- | ----- | | Total Tools | 12 | | Total Calls | 34 | | Matches | 31 | | Mismatches | 3 | ## Mismatches ### get_character - **Type**: MISSING_PROPERTY - **Description**: Consumer expects "characterClass" but producer has "class" - **Consumer**: ./components/CharacterSheet.tsx:45 - **Producer**: ./tools/character.ts:23 ``` --- ### `scaffold_consumer` Generate consumer code from a producer schema. Creates TypeScript functions, React hooks, or Zustand actions that correctly call MCP tools. **Parameters:** - `producerDir` (required): Path to MCP server source directory - `toolName` (required): Name of the tool to scaffold - `target`: Output format (`typescript`, `javascript`, `react-hook`, `zustand-action`) - `includeErrorHandling`: Include try/catch error handling (default: true) - `includeTypes`: Include TypeScript type definitions (default: true) **Example Output:** ```typescript /** * Get character data * @trace-contract CONSUMER * Producer: ./server/character-tools.ts:23 */ export async function getCharacter( client: McpClient, args: GetCharacterArgs ): Promise<GetCharacterResult> { try { const result = await client.callTool("get_character", args); return JSON.parse(result.content[0].text); } catch (error) { console.error("Error calling get_character:", error); throw error; } } ``` --- ### `scaffold_producer` Generate producer schema stub from consumer usage. Creates MCP tool definition based on how client code calls it. **Parameters:** - `consumerDir` (required): Path to consumer source directory - `toolName` (required): Name of the tool to scaffold - `includeHandler`: Include handler stub (default: true) **Example Output:** ```typescript import { z } from "zod"; // Tool: get_character // Scaffolded from consumer at ./components/CharacterSheet.tsx:14 // @trace-contract PRODUCER (scaffolded) server.tool( "get_character", "TODO: Add description", { characterId: z.string(), }, async (args) => { // TODO: Implement handler // Consumer expects: name, race, level, stats, characterClass return { content: [ { type: "text", text: JSON.stringify({ name: null, // TODO race: null, // TODO level: null, // TODO }), }, ], }; } ); ``` --- ### `comment_contract` Add cross-reference comments to validated producer/consumer pairs. Documents the contract relationship in both files. **Parameters:** - `producerDir` (required): Path to MCP server source directory - `consumerDir` (required): Path to consumer source directory - `toolName` (required): Name of the validated tool - `dryRun`: Preview without writing (default: true) - `style`: Comment style (`jsdoc`, `inline`, `block`) **Example Preview:** ```javascript // Producer comment: /* * @trace-contract PRODUCER * Tool: get_character * Consumer: ./components/CharacterSheet.tsx:14 * Args: characterId * Validated: 2025-12-11 */ // Consumer comment: /* * @trace-contract CONSUMER * Tool: get_character * Producer: ./server/character-tools.ts:23 * Required Args: characterId * Validated: 2025-12-11 */ ``` --- ### `init_project` Initialize a trace project with `.trace-mcp` config directory for watch mode and caching. **Parameters:** - `projectDir` (required): Root directory for the trace project - `producerPath` (required): Relative path to producer/server code - `consumerPath` (required): Relative path to consumer/client code - `producerLanguage`: Language (`typescript`, `python`, `go`, `rust`, `json_schema`) - `consumerLanguage`: Language (`typescript`, `python`, `go`, `rust`, `json_schema`) **Example:** ```typescript const result = await client.callTool("init_project", { projectDir: "./my-app", producerPath: "./backend/src", consumerPath: "./frontend/src", }); // Creates: ./my-app/.trace-mcp/config.json ``` --- ### `watch` Watch project files for changes and auto-revalidate contracts. **Parameters:** - `projectDir` (required): Root directory with `.trace-mcp` config - `action`: `start`, `stop`, `status`, or `poll` **Actions:** - `start`: Begin watching for file changes - `stop`: Stop watching - `status`: Check current watcher state - `poll`: Get pending events and last validation result --- ### `get_project_status` Get the status of a trace project including config, cache state, and last validation result. **Parameters:** - `projectDir` (required): Root directory with `.trace-mcp` config **Example Output:** ```json { "success": true, "exists": true, "projectDir": "/path/to/project", "config": { "producer": { "path": "./server", "language": "typescript" }, "consumer": { "path": "./client", "language": "typescript" } }, "isWatching": true, "watcherStatus": { "running": true, "pendingChanges": 0 } } ``` --- ## Typical Workflow ### 1. Quick One-Off Analysis ```typescript // Compare backend vs frontend, get markdown report const result = await client.callTool("compare", { producerDir: "./backend/src", consumerDir: "./frontend/src", format: "markdown", }); ``` ### 2. Continuous Validation (Watch Mode) ```typescript // Initialize project await client.callTool("init_project", { projectDir: ".", producerPath: "./server", consumerPath: "./client", }); // Start watching await client.callTool("watch", { projectDir: ".", action: "start", }); // Later: poll for results const status = await client.callTool("watch", { projectDir: ".", action: "poll", }); ``` ### 3. Generate Missing Code ```typescript // Generate client code from server schema const consumer = await client.callTool("scaffold_consumer", { producerDir: "./server", toolName: "get_character", target: "react-hook", }); // Or generate server stub from client usage const producer = await client.callTool("scaffold_producer", { consumerDir: "./client", toolName: "save_settings", }); ``` --- ## Roadmap - [x] MCP tool schema extraction - [x] Consumer usage tracing - [x] Basic mismatch detection - [x] Code scaffolding (consumer & producer) - [x] Contract comments - [x] Watch mode with auto-revalidation - [ ] Enhanced TypeScript interface extraction (beyond Zod) - [ ] OpenAPI/GraphQL adapter support - [ ] Python/Go/Rust language support (partial) ## License MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mnehmos/trace-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server