Back
Glossary

MCP (Model Context Protocol)

VeloDB Engineering Team· 2025/09/09
Keywords:

What is MCP (Model Context Protocol)?

The Model Context Protocol (MCP) is an open standard that enables large language models (LLMs) to dynamically interact with external tools, databases, and APIs through a standardized interface. Introduced by Anthropic in November 2024 and later adopted by OpenAI, MCP provides a universal, open standard for connecting AI systems with data sources, replacing fragmented integrations with a single protocol that enables seamless, secure, and scalable AI workflows.

Why Do We Need MCP?

Integration Complexity Challenge

Modern AI applications require access to diverse external systems, APIs, and data sources. Without standardization, each integration requires custom implementation, leading to fragmented architectures and maintenance overhead.

Context Limitation Resolution

LLMs need dynamic access to current, domain-specific information beyond their training data. MCP enables real-time access to external context while maintaining security and performance standards.

Ecosystem Fragmentation

AI development suffers from incompatible integration patterns across platforms and tools. MCP establishes a unified protocol that works across different AI systems, development environments, and data sources.

Security and Scalability

Custom integrations often lack proper security controls and struggle to scale. MCP provides standardized security patterns and architectural guidelines for production-ready AI applications.

MCP Architecture

Client-Host-Server Architecture

MCP follows a three-tier architecture where AI applications (clients) connect through hosts to external services (servers):

Client Layer: AI applications, IDEs, and chat interfaces that need external context and capabilities.

Host Layer: Runtime environments that manage MCP connections, handle protocol negotiation, and provide security controls.

Server Layer: External services that expose resources, tools, and capabilities through the MCP protocol.

Resource Management System

MCP organizes external context through two primary abstractions:

Resources: Provide contextual data such as files, database schemas, documentation, and application-specific information, each uniquely identified by URI.

Tools: Enable action-oriented interactions including API calls, database queries, computations, and external system operations.

Protocol Standardization

JSON-RPC-based communication protocol ensures consistent message formatting, error handling, and capability negotiation across implementations and platforms.

Key Features of MCP

Universal Compatibility

Single protocol works across different programming languages, AI platforms, and external systems, reducing integration complexity and development overhead.

Dynamic Resource Discovery

Servers can dynamically expose available resources and tools, allowing AI systems to adapt to changing capabilities and data sources without code modifications.

Secure Communication

Built-in authentication, authorization, and sandboxing mechanisms ensure secure interactions between AI systems and external services with fine-grained access controls.

Modular Architecture

Plug-and-play design enables easy addition and removal of services without affecting core application functionality or requiring system-wide changes.

Bidirectional Communication

Protocol supports both AI-initiated requests and server-initiated updates, enabling real-time data synchronization and event-driven interactions.

Common Use Cases for MCP

AI-Powered Development Environments

Integrate code editors with version control, issue tracking, documentation systems, and deployment tools through standardized MCP connectors.

Enterprise AI Assistants

Connect AI systems with internal databases, CRM systems, documentation repositories, and business applications for intelligent workplace automation.

Data Analysis Platforms

Enable AI models to access databases, APIs, file systems, and analytical tools for comprehensive data processing and insights generation.

Customer Support Automation

Integrate AI systems with help desk software, knowledge bases, user databases, and communication platforms for enhanced customer service.

Content Management Systems

Connect AI tools with document repositories, media libraries, collaboration platforms, and publishing workflows for intelligent content operations.

Implementation Examples

Basic MCP Server Implementation (Python)

from mcp import Server, types
from mcp.server import stdio
import asyncio
import json

class DatabaseMCPServer:
    def __init__(self):
        self.server = Server("database-mcp")
        self.setup_handlers()
    
    def setup_handlers(self):
        @self.server.list_resources()
        async def list_resources() -> list[types.Resource]:
            return [
                types.Resource(
                    uri="db://users/schema",
                    name="Users Database Schema",
                    description="Schema information for users table",
                    mimeType="application/json"
                ),
                types.Resource(
                    uri="db://orders/recent",
                    name="Recent Orders",
                    description="Last 100 orders from the database",
                    mimeType="application/json"
                )
            ]
        
        @self.server.read_resource()
        async def read_resource(uri: str) -> str:
            if uri == "db://users/schema":
                return json.dumps({
                    "table": "users",
                    "columns": {
                        "id": "integer primary key",
                        "name": "varchar(255)",
                        "email": "varchar(255) unique",
                        "created_at": "timestamp"
                    }
                })
            elif uri == "db://orders/recent":
                # Simulate database query
                return json.dumps([
                    {"id": 1, "user_id": 123, "amount": 99.99, "status": "completed"},
                    {"id": 2, "user_id": 456, "amount": 149.99, "status": "pending"}
                ])
            else:
                raise ValueError(f"Unknown resource: {uri}")
        
        @self.server.list_tools()
        async def list_tools() -> list[types.Tool]:
            return [
                types.Tool(
                    name="execute_query",
                    description="Execute SQL query on the database",
                    inputSchema={
                        "type": "object",
                        "properties": {
                            "query": {"type": "string"},
                            "limit": {"type": "integer", "default": 100}
                        },
                        "required": ["query"]
                    }
                )
            ]
        
        @self.server.call_tool()
        async def call_tool(name: str, arguments: dict) -> list[types.TextContent]:
            if name == "execute_query":
                query = arguments["query"]
                limit = arguments.get("limit", 100)
                
                # Simulate query execution
                result = f"Executed: {query} (limit: {limit})"
                return [types.TextContent(
                    type="text",
                    text=f"Query result: {result}"
                )]
            else:
                raise ValueError(f"Unknown tool: {name}")

# Run the server
async def main():
    server_instance = DatabaseMCPServer()
    async with stdio.stdio_server() as (read_stream, write_stream):
        await server_instance.server.run(
            read_stream,
            write_stream,
            server_instance.server.create_initialization_options()
        )

if __name__ == "__main__":
    asyncio.run(main())

MCP Client Implementation (TypeScript)

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { spawn } from 'child_process';

class MCPClient {
  private client: Client;
  private transport: StdioClientTransport;

  async initialize(serverCommand: string, serverArgs: string[]) {
    // Spawn MCP server process
    const serverProcess = spawn(serverCommand, serverArgs);
    
    // Create transport
    this.transport = new StdioClientTransport({
      reader: serverProcess.stdout,
      writer: serverProcess.stdin
    });

    // Initialize client
    this.client = new Client({
      name: "example-client",
      version: "1.0.0"
    }, {
      capabilities: {}
    });

    // Connect to server
    await this.client.connect(this.transport);
  }

  async listResources() {
    const response = await this.client.listResources();
    return response.resources;
  }

  async readResource(uri: string) {
    const response = await this.client.readResource({ uri });
    return response.contents;
  }

  async listTools() {
    const response = await this.client.listTools();
    return response.tools;
  }

  async callTool(name: string, arguments: Record<string, any>) {
    const response = await this.client.callTool({
      name,
      arguments
    });
    return response.content;
  }

  async close() {
    await this.client.close();
  }
}

// Usage example
async function demonstrateMCP() {
  const client = new MCPClient();
  
  try {
    await client.initialize('python', ['database_server.py']);
    
    // List available resources
    const resources = await client.listResources();
    console.log('Available resources:', resources);
    
    // Read a specific resource
    const schema = await client.readResource('db://users/schema');
    console.log('Users schema:', schema);
    
    // List available tools
    const tools = await client.listTools();
    console.log('Available tools:', tools);
    
    // Execute a tool
    const result = await client.callTool('execute_query', {
      query: 'SELECT * FROM users WHERE created_at > NOW() - INTERVAL 7 DAY',
      limit: 50
    });
    console.log('Query result:', result);
    
  } catch (error) {
    console.error('MCP operation failed:', error);
  } finally {
    await client.close();
  }
}

demonstrateMCP();

Spring Boot MCP Integration

@RestController
@RequestMapping("/mcp")
public class MCPController {

    @Autowired
    private MCPClientService mcpClientService;

    @PostMapping("/query")
    public ResponseEntity<Object> executeQuery(@RequestBody QueryRequest request) {
        try {
            // Connect to MCP server
            MCPClient client = mcpClientService.getClient("database-server");
            
            // Call tool through MCP
            ToolResult result = client.callTool("execute_query", Map.of(
                "query", request.getQuery(),
                "limit", request.getLimit()
            ));
            
            return ResponseEntity.ok(result.getContent());
            
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Map.of("error", e.getMessage()));
        }
    }
    
    @GetMapping("/resources")
    public ResponseEntity<List<Resource>> listResources() {
        try {
            MCPClient client = mcpClientService.getClient("database-server");
            List<Resource> resources = client.listResources();
            return ResponseEntity.ok(resources);
            
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }
}

@Service
public class MCPClientService {
    
    private final Map<String, MCPClient> clients = new ConcurrentHashMap<>();
    
    public MCPClient getClient(String serverName) throws Exception {
        return clients.computeIfAbsent(serverName, name -> {
            try {
                MCPClient client = new MCPClient(name);
                client.connect();
                return client;
            } catch (Exception e) {
                throw new RuntimeException("Failed to create MCP client", e);
            }
        });
    }
    
    @PreDestroy
    public void cleanup() {
        clients.values().forEach(client -> {
            try {
                client.close();
            } catch (Exception e) {
                log.error("Error closing MCP client", e);
            }
        });
    }
}

Docker-Compose MCP Environment

version: '3.8'

services:
  mcp-host:
    image: anthropic/mcp-host:latest
    container_name: mcp-host
    environment:
      - MCP_HOST_CONFIG=/config/host-config.json
    volumes:
      - ./config:/config:ro
      - ./servers:/servers:ro
    ports:
      - "8080:8080"
    depends_on:
      - database-server
      - file-server

  database-server:
    build:
      context: ./servers/database
      dockerfile: Dockerfile
    container_name: mcp-database-server
    environment:
      - DATABASE_URL=postgresql://user:pass@postgres:5432/mcpdb
      - MCP_SERVER_NAME=database-mcp
    depends_on:
      - postgres

  file-server:
    build:
      context: ./servers/filesystem
      dockerfile: Dockerfile
    container_name: mcp-file-server
    environment:
      - ROOT_PATH=/data
      - MCP_SERVER_NAME=file-mcp
    volumes:
      - ./data:/data:ro

  postgres:
    image: postgres:15
    container_name: mcp-postgres
    environment:
      - POSTGRES_DB=mcpdb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

networks:
  default:
    name: mcp-network

Key Takeaways

The Model Context Protocol represents a fundamental shift toward standardized AI system integration, providing a universal framework for connecting language models with external resources and tools. By establishing common patterns for resource discovery, tool invocation, and secure communication, MCP reduces integration complexity while enabling more sophisticated AI applications. The protocol's adoption by major AI platforms and the growing ecosystem of connectors demonstrate its potential to become the standard for AI system integration. For developers building AI applications, MCP offers a future-proof approach to external system integration that scales with application complexity and evolves with the AI ecosystem.

Frequently Asked Questions

Q: How does MCP differ from traditional API integrations?

A: MCP provides a standardized protocol with built-in discovery, security, and capability negotiation, while traditional APIs require custom integration code. MCP enables dynamic resource discovery and standardized error handling across all integrations.

Q: Is MCP compatible with existing AI platforms?

A: Yes, MCP has been adopted by major platforms including Anthropic's Claude, OpenAI's systems, and various development environments. SDKs are available for Python, TypeScript, Java, and other languages.

Q: What security features does MCP provide?

A: MCP includes authentication mechanisms, permission-based access controls, resource sandboxing, and secure communication channels. Servers can implement fine-grained access controls for resources and tools.

Q: Can I use MCP with non-AI applications?

A: While designed for AI systems, MCP's resource and tool abstraction model can be used for any application needing standardized access to external services and data sources.

Q: How do I migrate existing integrations to MCP?

A: Migration involves wrapping existing APIs with MCP server implementations, updating client code to use MCP SDKs, and gradually replacing custom integration logic with standardized MCP patterns.