Building a Personal MCP Server for Claude
Stop copy-pasting your bio. Build a custom Model Context Protocol (MCP) server in TypeScript to give Claude native access to your projects, resume, and personal context.

I’m tired of pasting my "about me" blurb every time I start a new chat with Claude. If you’re a developer using Claude for Desktop, you should be using the Model Context Protocol (MCP). It’s an open standard that lets AI models interact with your local data and tools through a unified interface.
Instead of generic context, we’re going to build a personal MCP server in TypeScript. This server will act as a dedicated knowledge base for your bio, active projects, and technical stack. When you ask Claude "What should I work on next?", it will actually know what's in your active_projects.json.
The Stack
We’re keeping this lean. No databases, no complex auth. Just a local Node.js process talking to Claude over stdio.
- Language: TypeScript
- Runtime: Node.js (v18+)
- SDK:
@modelcontextprotocol/sdk - Validation:
zod
1. Project Setup
Start by initializing a new TypeScript project. The MCP SDK uses ESM, so make sure your package.json reflects that.
mkdir my-personal-mcp && cd my-personal-mcp
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx
Update your package.json to include "type": "module" and a build script. Your tsconfig.json should target ES2022 or higher.
2. Define Your Data
Create a data.json file. This is where your personal context lives. Storing it as JSON makes it trivial for the MCP server to parse and serve to the LLM.
{
"bio": "Full-stack developer focused on SaaS and open-source tools.",
"tech_stack": ["TypeScript", "Next.js", "PostgreSQL", "FastAPI"],
"projects": [
{
"name": "ArbindBuilds",
"status": "active",
"description": "A content system for indie makers."
}
]
}
3. The Server Implementation
The core logic happens in src/index.ts. We use McpServer to register a tool. This tool will read our JSON file and return the contents to Claude.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { readFileSync } from "fs";
import { resolve } from "path";
// 1. Initialize the server
const server = new McpServer({
name: "personal-context-server",
version: "1.0.0",
});
// 2. Register the tool
server.tool(
"get_personal_info",
"Retrieves bio, projects, and tech stack information about Arbind",
{}, // No arguments needed for this basic call
async () => {
try {
const dataPath = resolve(process.cwd(), "data.json");
const data = JSON.parse(readFileSync(dataPath, "utf-8"));
return {
content: [
{
type: "text",
text: JSON.stringify(data, null, 2),
},
],
};
} catch (error) {
return {
content: [{ type: "text", text: "Error: Could not read personal data." }],
isError: true,
};
}
}
);
// 3. Connect using stdio transport
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Personal MCP server running on stdio");
}
main().catch((err) => {
console.error("Fatal error:", err);
process.exit(1);
});
4. Integration with Claude Desktop
Claude Desktop looks for a configuration file to know which MCP servers to launch.
Path (macOS): ~/Library/Application Support/Claude/claude_desktop_config.json
Path (Windows): %APPDATA%\Claude\claude_desktop_config.json
Add your server to the mcpServers object. Use npx tsx to run your source file directly during development.
{
"mcpServers": {
"personal-context": {
"command": "npx",
"args": [
"-y",
"tsx",
"/absolute/path/to/your/project/src/index.ts"
]
}
}
}
Restart Claude Desktop. You should see a small hammer icon or an MCP notification.
Why this matters
The "Personal Assistant" era isn't about better prompting. It's about data locality. By moving your context into an MCP server, you've created a single source of truth that you can update once and use across any MCP-compliant client (Cursor, Windsurf, Claude).
If you want to take this further, add a update_project_status tool to the server. You can then tell Claude, "I just finished the landing page for project X," and Claude will call your tool to update data.json for you.
Don't build features. Build systems that let the AI build features for you.
Ship it.
Comments
Leave a comment
Lovable Leaks Source Code: The $6.6B BOLA Vulnerability
An 8 million user platform ignored a critical BOLA vulnerability for 48 days. How a $6.6B AI app builder leaked source code, credentials, and user data.
How 84 Malicious TanStack Packages Hit npm in 6 Minutes
On May 11, 2026, an attacker published 84 malicious versions across 42 @tanstack/* packages in under 6 minutes. Not a typo. Here is the exact chain that made it possible. 42 @tanstack packages compromised via GitHub Actions cache poisoning and OIDC token extraction
Tagged