Harrison MCP Server
A real MCP server — install in Claude Desktop, ask Claude about my portfolio
6 Zod-validated tools
stdio transport (Claude Desktop)
Real @modelcontextprotocol/sdk
JSON-RPC 2.0 compliant
01The Problem
The MCP Server Demo shows what the protocol looks like via a web UI. But can I actually implement a working MCP server from scratch — one that connects to real clients via stdio, responds to tool calls, and could be dropped into Claude Desktop right now? Building a real server (rather than simulating it) requires understanding the JSON-RPC 2.0 message framing, the initialize/tools-list handshake, and the exact wire format for tool results.
02The Approach
Used the official @modelcontextprotocol/sdk (v1.27.1) with StdioServerTransport and the McpServer high-level API. Six tools expose a curated knowledge base about my background: get_profile, search_knowledge_base, get_project_details, list_projects, get_research, and get_job_targets. Each tool uses Zod for input validation and returns structured JSON.
03Architecture Decisions
StdioServerTransport — the Claude Desktop transport
MCP servers connect to clients (Claude Desktop, Claude Code, other agents) via stdio: the server reads newline-delimited JSON-RPC messages from stdin and writes responses to stdout. StdioServerTransport handles framing and buffering. The server process is spawned by the client, not the other way around — the client provides the command to run in the config file.
McpServer + Zod tool schemas
Each tool is registered with registerTool(name, config, handler). The config includes a description (what the model uses to decide when to call the tool) and an inputSchema (Zod shape that validates arguments before the handler runs). The SDK handles schema conversion to JSON Schema for the tools/list response automatically.
Knowledge base with real data
The 6 tools serve real information: 3 peer-reviewed publications with DOIs, 15 specific projects with GitHub links and live URLs, target job companies with fit scores, and a tech skills inventory. The search_knowledge_base tool uses keyword-based relevance scoring across sections. This makes the server genuinely useful — not just a 'hello world' MCP demo.
04Key Insight
The difference between simulating MCP and implementing it is significant in practice. A simulation can emit protocol-shaped messages over HTTP. A real MCP server runs as a process, handles stdio framing, responds to the full initialize→tools/list→tools/call lifecycle, and works inside real clients like Claude Desktop. The same conceptual tool definitions produce very different implementations depending on the transport. stdio is simpler than HTTP in one sense (no network stack) but more rigid (the process lifecycle is managed by the client, not by you).
05Why It Matters
The most direct demonstration of MCP server implementation in the portfolio. Clio's Enterprise AI team builds MCP servers to connect Claude to legal databases, matter management systems, and billing APIs — the exact transport (stdio), protocol (MCP JSON-RPC 2.0), and SDK (@modelcontextprotocol/sdk) used here. This server is runnable by an interviewer right now: add one line to claude_desktop_config.json and ask Claude about my portfolio.