thoughtSpace
TwitterGithubRSS Feed

Note Space

Hints, cheat sheets and notes on code.

← Home

Model Context Protocols(MCPs)

Posted on jULY 14, 2025

Model Context Protocols(MCPs)

MCPs: Model Context Protocols for AI Integration

What are MCPs?

Model Context Protocols (MCPs) are standardized interfaces and communication protocols that enable AI models to interact with external tools, data sources, and systems. MCPs provide a framework for creating extensible AI applications that can access real-time information, perform actions, and integrate with various services and APIs. They serve as the bridge between AI models and the broader digital ecosystem.

Core Concepts

1. Protocol Standards

MCPs define standardized ways for AI models to:

  • Request Information: Query databases, APIs, and services
  • Perform Actions: Execute commands and trigger processes
  • Access Tools: Use specialized software and utilities
  • Manage Context: Maintain state and memory across interactions

2. Tool Integration

MCPs enable AI models to use external tools such as:

  • Web Browsers: Access current information from the internet
  • File Systems: Read, write, and manage files
  • Databases: Query and manipulate data
  • APIs: Interact with third-party services
  • Code Execution: Run scripts and programs

3. Context Management

  • Session Persistence: Maintain conversation context
  • Memory Management: Store and retrieve relevant information
  • State Tracking: Keep track of ongoing processes
  • History Management: Access previous interactions

Popular MCP Implementations

OpenAI Function Calling

import openai
import json

def create_function_schema():
    """
    Define function schemas for OpenAI API
    """
    functions = [
        {
            "name": "get_weather",
            "description": "Get current weather information",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "City name or coordinates"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "Temperature unit"
                    }
                },
                "required": ["location"]
            }
        },
        {
            "name": "search_web",
            "description": "Search the internet for current information",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "Search query"
                    }
                },
                "required": ["query"]
            }
        }
    ]
    return functions

def call_ai_with_functions(prompt, functions):
    """
    Call OpenAI API with function calling
    """
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        functions=functions,
        function_call="auto"
    )
    
    return response.choices[0].message

# Example usage
functions = create_function_schema()
prompt = "What's the weather like in New York?"
response = call_ai_with_functions(prompt, functions)
print(response)

LangChain Tools

from langchain.agents import initialize_agent, Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.llms import OpenAI

def create_langchain_agent():
    """
    Create a LangChain agent with tools
    """
    # Initialize tools
    search = DuckDuckGoSearchRun()
    
    tools = [
        Tool(
            name="Search",
            func=search.run,
            description="Useful for searching the internet for current information"
        )
    ]
    
    # Initialize agent
    llm = OpenAI(temperature=0)
    agent = initialize_agent(
        tools, 
        llm, 
        agent="zero-shot-react-description",
        verbose=True
    )
    
    return agent

# Example usage
agent = create_langchain_agent()
response = agent.run("What are the latest developments in AI?")
print(response)

Custom MCP Implementation

import asyncio
import json
from typing import Dict, Any, List

class MCPHandler:
    """
    Custom MCP handler for tool integration
    """
    
    def __init__(self):
        self.tools = {}
        self.context = {}
    
    def register_tool(self, name: str, function: callable, description: str):
        """
        Register a new tool with the MCP
        """
        self.tools[name] = {
            "function": function,
            "description": description
        }
    
    async def execute_tool(self, tool_name: str, parameters: Dict[str, Any]):
        """
        Execute a registered tool
        """
        if tool_name not in self.tools:
            raise ValueError(f"Tool '{tool_name}' not found")
        
        tool = self.tools[tool_name]
        result = await tool["function"](**parameters)
        return result
    
    def get_tool_schemas(self) -> List[Dict[str, Any]]:
        """
        Get schemas for all registered tools
        """
        schemas = []
        for name, tool in self.tools.items():
            schemas.append({
                "name": name,
                "description": tool["description"]
            })
        return schemas

# Example usage
async def weather_function(location: str, unit: str = "celsius"):
    # Simulate weather API call
    return f"Weather in {location}: 22°{unit}, sunny"

async def search_function(query: str):
    # Simulate web search
    return f"Search results for '{query}': [results...]"

# Initialize MCP handler
mcp = MCPHandler()
mcp.register_tool("get_weather", weather_function, "Get weather information")
mcp.register_tool("search_web", search_function, "Search the internet")

# Execute tools
async def main():
    weather = await mcp.execute_tool("get_weather", {"location": "London"})
    search = await mcp.execute_tool("search_web", {"query": "AI news"})
    print(weather)
    print(search)

asyncio.run(main())

MCP Architecture

1. Protocol Layer

class MCPProtocol:
    """
    Base protocol for MCP communication
    """
    
    def __init__(self):
        self.version = "1.0"
        self.supported_methods = []
    
    async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:
        """
        Handle incoming MCP requests
        """
        method = request.get("method")
        params = request.get("params", {})
        
        if method in self.supported_methods:
            return await self.execute_method(method, params)
        else:
            return {"error": f"Method '{method}' not supported"}
    
    async def execute_method(self, method: str, params: Dict[str, Any]):
        """
        Execute a specific method
        """
        raise NotImplementedError

2. Tool Registry

class ToolRegistry:
    """
    Registry for managing available tools
    """
    
    def __init__(self):
        self.tools = {}
        self.categories = {}
    
    def register_tool(self, tool_id: str, tool_info: Dict[str, Any]):
        """
        Register a new tool
        """
        self.tools[tool_id] = tool_info
        category = tool_info.get("category", "general")
        
        if category not in self.categories:
            self.categories[category] = []
        self.categories[category].append(tool_id)
    
    def get_tool(self, tool_id: str) -> Dict[str, Any]:
        """
        Get tool information
        """
        return self.tools.get(tool_id)
    
    def list_tools(self, category: str = None) -> List[str]:
        """
        List available tools
        """
        if category:
            return self.categories.get(category, [])
        return list(self.tools.keys())

3. Context Manager

class ContextManager:
    """
    Manage conversation and session context
    """
    
    def __init__(self):
        self.sessions = {}
        self.global_context = {}
    
    def create_session(self, session_id: str) -> Dict[str, Any]:
        """
        Create a new session
        """
        self.sessions[session_id] = {
            "messages": [],
            "variables": {},
            "tools_used": [],
            "created_at": datetime.now()
        }
        return self.sessions[session_id]
    
    def add_message(self, session_id: str, message: Dict[str, Any]):
        """
        Add a message to session history
        """
        if session_id not in self.sessions:
            self.create_session(session_id)
        
        self.sessions[session_id]["messages"].append(message)
    
    def get_context(self, session_id: str) -> Dict[str, Any]:
        """
        Get session context
        """
        return self.sessions.get(session_id, {})

Common MCP Use Cases

1. Web Search and Information Retrieval

import requests
from bs4 import BeautifulSoup

class WebSearchTool:
    """
    Tool for web search and information retrieval
    """
    
    def __init__(self):
        self.search_engines = {
            "google": "https://www.google.com/search",
            "bing": "https://www.bing.com/search",
            "duckduckgo": "https://duckduckgo.com/"
        }
    
    async def search(self, query: str, engine: str = "duckduckgo") -> str:
        """
        Perform web search
        """
        # Implementation would use appropriate search API
        # This is a simplified example
        return f"Search results for '{query}' from {engine}"
    
    async def scrape_webpage(self, url: str) -> str:
        """
        Scrape content from a webpage
        """
        try:
            response = requests.get(url)
            soup = BeautifulSoup(response.content, 'html.parser')
            return soup.get_text()
        except Exception as e:
            return f"Error scraping {url}: {str(e)}"

2. File System Operations

import os
import json
from pathlib import Path

class FileSystemTool:
    """
    Tool for file system operations
    """
    
    def __init__(self, base_path: str = "."):
        self.base_path = Path(base_path)
    
    async def read_file(self, file_path: str) -> str:
        """
        Read file contents
        """
        full_path = self.base_path / file_path
        try:
            with open(full_path, 'r', encoding='utf-8') as f:
                return f.read()
        except Exception as e:
            return f"Error reading file: {str(e)}"
    
    async def write_file(self, file_path: str, content: str) -> str:
        """
        Write content to file
        """
        full_path = self.base_path / file_path
        try:
            full_path.parent.mkdir(parents=True, exist_ok=True)
            with open(full_path, 'w', encoding='utf-8') as f:
                f.write(content)
            return f"Successfully wrote to {file_path}"
        except Exception as e:
            return f"Error writing file: {str(e)}"
    
    async def list_directory(self, dir_path: str = ".") -> List[str]:
        """
        List directory contents
        """
        full_path = self.base_path / dir_path
        try:
            return [item.name for item in full_path.iterdir()]
        except Exception as e:
            return [f"Error listing directory: {str(e)}"]

3. Database Operations

import sqlite3
import asyncio
from typing import List, Dict, Any

class DatabaseTool:
    """
    Tool for database operations
    """
    
    def __init__(self, db_path: str):
        self.db_path = db_path
    
    async def execute_query(self, query: str, params: tuple = ()) -> List[Dict[str, Any]]:
        """
        Execute SQL query
        """
        def _execute():
            conn = sqlite3.connect(self.db_path)
            cursor = conn.cursor()
            cursor.execute(query, params)
            
            if query.strip().upper().startswith('SELECT'):
                columns = [description[0] for description in cursor.description]
                results = [dict(zip(columns, row)) for row in cursor.fetchall()]
            else:
                conn.commit()
                results = [{"affected_rows": cursor.rowcount}]
            
            conn.close()
            return results
        
        return await asyncio.get_event_loop().run_in_executor(None, _execute)
    
    async def create_table(self, table_name: str, columns: Dict[str, str]) -> str:
        """
        Create a new table
        """
        column_defs = ", ".join([f"{name} {type_def}" for name, type_def in columns.items()])
        query = f"CREATE TABLE IF NOT EXISTS {table_name} ({column_defs})"
        
        await self.execute_query(query)
        return f"Table '{table_name}' created successfully"

Security and Best Practices

1. Authentication and Authorization

import jwt
from datetime import datetime, timedelta

class MCPAuth:
    """
    Authentication and authorization for MCP
    """
    
    def __init__(self, secret_key: str):
        self.secret_key = secret_key
        self.permissions = {}
    
    def generate_token(self, user_id: str, permissions: List[str]) -> str:
        """
        Generate JWT token for user
        """
        payload = {
            "user_id": user_id,
            "permissions": permissions,
            "exp": datetime.utcnow() + timedelta(hours=24)
        }
        return jwt.encode(payload, self.secret_key, algorithm="HS256")
    
    def verify_token(self, token: str) -> Dict[str, Any]:
        """
        Verify JWT token
        """
        try:
            payload = jwt.decode(token, self.secret_key, algorithms=["HS256"])
            return payload
        except jwt.ExpiredSignatureError:
            raise ValueError("Token has expired")
        except jwt.InvalidTokenError:
            raise ValueError("Invalid token")
    
    def check_permission(self, user_permissions: List[str], required_permission: str) -> bool:
        """
        Check if user has required permission
        """
        return required_permission in user_permissions

2. Rate Limiting

import time
from collections import defaultdict

class RateLimiter:
    """
    Rate limiting for MCP requests
    """
    
    def __init__(self, max_requests: int = 100, window_seconds: int = 3600):
        self.max_requests = max_requests
        self.window_seconds = window_seconds
        self.requests = defaultdict(list)
    
    def is_allowed(self, user_id: str) -> bool:
        """
        Check if request is allowed
        """
        now = time.time()
        user_requests = self.requests[user_id]
        
        # Remove old requests outside the window
        user_requests[:] = [req_time for req_time in user_requests 
                           if now - req_time < self.window_seconds]
        
        # Check if under limit
        if len(user_requests) < self.max_requests:
            user_requests.append(now)
            return True
        
        return False

Learning Resources

Documentation and Guides

Online Courses

  • Coursera: Building AI Applications
  • edX: AI Integration and APIs
  • Udacity: AI Programming with Python
  • Fast.ai: Practical Deep Learning

Books

  • "Building AI Applications" by various authors
  • "API Design Patterns" by JJ Geewax
  • "Microservices Patterns" by Chris Richardson
  • "Designing Data-Intensive Applications" by Martin Kleppmann

YouTube Channels

  • OpenAI: Official tutorials and updates
  • LangChain: Tool integration tutorials
  • Two Minute Papers: Latest AI research
  • Computerphile: Computer science concepts

Practical Projects

Beginner Projects

  1. Weather Bot: Create an AI that can check weather
  2. File Manager: Build an AI file management system
  3. Search Assistant: Create an AI web search tool
  4. Calculator: Build an AI with mathematical capabilities

Intermediate Projects

  1. Database Assistant: AI for database operations
  2. Email Manager: AI email processing and management
  3. Calendar Integration: AI calendar and scheduling
  4. Code Assistant: AI with code execution capabilities

Advanced Projects

  1. Multi-Service Integration: AI connecting multiple APIs
  2. Real-time Data Processing: AI with streaming data access
  3. Automated Workflows: AI orchestrating complex processes
  4. Custom MCP Framework: Build your own MCP implementation

Conclusion

Model Context Protocols represent a crucial advancement in AI capabilities, enabling models to interact with the real world through standardized interfaces. By providing access to external tools, data sources, and services, MCPs transform AI from isolated language models into powerful, integrated systems that can perform meaningful actions and access current information.

As AI technology continues to evolve, MCPs will play an increasingly important role in creating more capable and useful AI applications. Whether you're building chatbots, automation systems, or intelligent assistants, understanding and implementing MCPs can significantly enhance your AI applications' capabilities.

The future of AI is not just about better language models—it's about creating AI systems that can seamlessly integrate with our digital world and perform meaningful tasks that enhance human productivity and capabilities.

Additional Resources

Communities and Forums

  • Reddit: r/MachineLearning, r/OpenAI, r/LangChain
  • Discord: AI development communities
  • GitHub: Open-source MCP implementations
  • Stack Overflow: AI and API integration tags

Conferences and Events

  • NeurIPS: Neural Information Processing Systems
  • ICML: International Conference on Machine Learning
  • AAAI: Association for the Advancement of Artificial Intelligence
  • API World: API development and integration

"The best way to predict the future is to invent it." - Alan Kay

Note Space © 2022 — Published with Nextjs

HomeTopicsLinksDefinitionsCommandsSnippetsMy works