Skip to content

AI

Writing My First MCP Server with Claude Code

Building my first Model Context Protocol (MCP) server was an exciting journey into extending Claude's capabilities. The MCP Memory Server allows Claude to store, retrieve, and manage memories across conversations, creating a persistent memory layer that enhances AI interactions.


What is MCP?

The Model Context Protocol (MCP) is an open standard that enables AI assistants like Claude to connect with external tools and data sources securely. It provides a standardized way to extend AI capabilities beyond their built-in knowledge, allowing for real-time data access and tool integration.

MCP enables: - Secure connections to external systems - Real-time data retrieval - Tool invocation and management - Standardized communication protocols


Project Overview

The MCP Memory Server is a lightweight Node.js application that provides Claude with persistent memory capabilities. Unlike traditional conversations that lose context when they end, this server allows Claude to:

  • Store important information for later retrieval
  • Tag memories for better organization
  • Search through stored memories
  • Maintain context across multiple conversations

Key Features

Memory Management Tools

The server implements five core tools that Claude can use:

Tool Description Input Parameters
store_memory Save new memories with optional tags content (string): Memory content
tags (array): Optional categorization labels
retrieve_memories Search and filter stored memories Search criteria and filters
list_memories View all stored memories None
delete_memory Remove specific memories by ID id (string): Memory identifier
clear_memories Delete all stored memories None

Memory Structure

Each memory includes:

  • Unique ID: Auto-generated identifier
  • Content: The actual memory text
  • Tags: Optional categorization labels
  • Timestamp: Creation date and time
{
  "id": "unique-memory-id",
  "content": "The actual memory content",
  "tags": ["tag1", "tag2"],
  "timestamp": "2025-01-12T09:10:00Z"
}

Configuration and Setup

Server Configuration

The MCP Memory Server runs as a standalone Node.js application with configurable options:

// Environment Variables
const PORT = process.env.PORT || 3000;
const LOG_LEVEL = process.env.LOG_LEVEL || 'info';

// Server initialization
const server = new Server({
  name: 'memory-server',
  version: '1.0.0'
});

Claude Integration

Connecting the server to Claude Code is straightforward using the MCP HTTP transport:

# Option 1: Run locally
npm start

# Option 2: Run with Docker
docker build -t mcp-memory-server .
docker run -d -p 3000:3000 mcp-memory-server

# Connect to Claude
claude mcp add memory http://localhost:3000/message --transport http

Development Workflow

For development, the server supports hot reloading:

# Development mode with auto-restart
npm run dev

# Build and test
npm run build
npm test

How It Works

Server Architecture

The MCP Memory Server implements the MCP specification with these core components:

  1. Tool Registry: Defines available memory operations
  2. Message Handler: Processes incoming requests from Claude
  3. Memory Store: In-memory storage for demonstration (extensible to databases)
  4. Response Formatter: Structures responses according to MCP standards

Request Flow

sequenceDiagram
    participant Claude
    participant MCP Server
    participant Memory Store

    Claude->>MCP Server: store_memory request
    MCP Server->>Memory Store: Save memory
    Memory Store-->>MCP Server: Confirmation
    MCP Server-->>Claude: Success response

Memory Persistence

Currently, the server uses in-memory storage for simplicity, but it's designed for easy extension to persistent databases:

// Current implementation (in-memory)
const memories = new Map();

// Future extensions could use:
// - SQLite for local persistence
// - PostgreSQL for production
// - Redis for caching

Implementation Details

Tool Registration

Each tool is registered with the MCP server following the protocol specification:

server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "store_memory",
        description: "Store a new memory with optional tags",
        inputSchema: {
          type: "object",
          properties: {
            content: { type: "string" },
            tags: { type: "array", items: { type: "string" } }
          },
          required: ["content"]
        }
      }
      // ... other tools
    ]
  };
});

Error Handling

The server implements comprehensive error handling:

try {
  // Tool execution logic
  const result = await executeMemoryOperation(args);
  return { content: [{ type: "text", text: result }] };
} catch (error) {
  return {
    content: [{
      type: "text",
      text: `Error: ${error.message}`
    }],
    isError: true
  };
}

Docker Deployment

For production deployment, the project includes Docker support:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Deploy with:

docker build -t mcp-memory-server .
docker run -d -p 3000:3000 mcp-memory-server


Future Enhancements

The current implementation serves as a foundation for more advanced features:

Planned Improvements

  • Database Integration: PostgreSQL or MongoDB for persistent storage
  • Advanced Search: Full-text search and semantic similarity
  • Memory Categories: Hierarchical organization system
  • Web Interface: Browser-based memory management
  • Authentication: Secure multi-user support
  • Memory Expiration: Automatic cleanup of old memories
  • Export/Import: Backup and migration capabilities

Scalability Considerations

  • Horizontal scaling with load balancers
  • Memory partitioning for large datasets
  • Caching layers for improved performance
  • Rate limiting and resource management

Lessons Learned

Building this MCP server taught me several valuable lessons:

MCP Protocol Benefits

  • Standardization: Consistent interface across different tools
  • Security: Built-in authentication and authorization
  • Flexibility: Easy to extend with new capabilities

Development Best Practices

  • Start Simple: Begin with core functionality before adding complexity
  • Error Handling: Robust error management is crucial for reliability
  • Documentation: Clear API documentation improves usability
  • Testing: Comprehensive tests ensure stability

Integration Challenges

  • Protocol Compliance: Strict adherence to MCP specifications
  • Performance: Balancing features with response times
  • User Experience: Making tools intuitive for Claude to use

Conclusion

Creating the MCP Memory Server was an excellent introduction to extending AI capabilities through the Model Context Protocol. The project demonstrates how developers can build powerful tools that enhance AI interactions while maintaining security and standardization.

The server successfully bridges the gap between Claude's conversational abilities and persistent data storage, opening up possibilities for more sophisticated AI workflows. Whether you're building internal tools or exploring AI extensibility, MCP provides a robust foundation for innovation.

For developers interested in MCP development, I encourage exploring the repository and experimenting with your own extensions. The future of AI tooling lies in these kinds of modular, interoperable systems.


Ready to build your own MCP server? Check out the complete source code and start extending Claude Code's capabilities today!