Cybersecurity

What Is MCP?

Python RAG MCP AI Agents Authentication JWT CI/CD Git GitHub Cloud Microservices REST API Databases SQL Rust Credentials
2,084 words Includes Code

Key Takeaway: The Model Context Protocol (MCP) is a standardized way for AI applications to connect to external data, tools, and systems. Instead of building custom integrations for every AI app, MCP provides a universal connector layer — and you can build your own MCP server in under 30 lines of Python.

⚠️ Security Notice: MCP servers can give AI applications access to real data and tools. Start with read-only, least-privilege access and never expose credentials, private keys, sensitive files, or unrestricted system access.

Every time you use an AI coding agent, chatbot, or assistant, there's a fundamental challenge: how does the AI access the external context it needs? Your files, your APIs, your databases, your documentation — none of that is natively available to the model.

Without a standard approach, every integration is custom. App A builds its own file connector. App B builds its own database connector. App C builds its own API connector. The result is fragmented, duplicated effort with no interoperability.

The Model Context Protocol (MCP) solves this by defining a standardized protocol for connecting AI applications to external systems. Think of it like a USB-C port for AI: one standard connector that works across many devices.

What Is MCP?

MCP is an open protocol that defines how AI applications discover and use external tools, resources, and data. It's maintained by an open-source community and supported by major AI companies including Anthropic, OpenAI, Google, Microsoft, and others.

The core idea: instead of each AI application building its own integrations, MCP provides a shared protocol that works across compatible clients and servers. Build an MCP server once, and any MCP-compatible AI application can use it.

Why MCP Matters

The problem MCP addresses isn't just convenience — it's about standardized access to context and capabilities. Modern AI tools need access to:

  • Project files and documentation
  • External APIs and services
  • Databases and data stores
  • Development tools (Git, CI/CD, issue trackers)
  • Enterprise systems and internal tools
  • Cloud services and infrastructure

MCP doesn't just give AI "more data." It provides a structured, discoverable, and secure way for AI applications to interact with external systems. Servers declare what they can do (tools), what they can provide (resources), and how to interact with them (prompts). Clients can discover these capabilities automatically.

MCP Architecture

MCP architecture diagram showing Host, Client, and Server layers with resources, tools, and prompts
MCP follows a client-server architecture with three key participants

MCP defines three key participants:

  • MCP Host: The AI application (e.g., Claude Code, Cursor, VS Code) that coordinates MCP clients
  • MCP Client: A component that maintains a connection to one MCP server and obtains context for the host
  • MCP Server: A program that provides context — tools, resources, and prompts — to MCP clients

A single host can connect to multiple servers simultaneously. For example, VS Code might connect to a filesystem server, a Sentry server, and a database server — each through its own client instance.

MCP servers expose three types of capabilities:

  • Resources: Data the AI can read (files, database rows, API responses)
  • Tools: Actions the AI can perform (run commands, send requests, modify data)
  • Prompts: Pre-defined interaction templates for common tasks

Communication uses JSON-RPC 2.0 over one of two transports: stdio (for local servers) or Streamable HTTP (for remote servers).

MCP vs REST API

FeatureREST APIMCP
Primary purposeGeneral-purpose web communicationAI-specific context and tool integration
ConsumerAny HTTP clientAI applications and agents
DiscoveryDocumentation (OpenAPI, etc.)Built-in capability discovery
ToolsEndpoints (manual mapping)Declared tools (automatic discovery)
ResourcesResponse dataStructured context feeds
StandardizationPer-API conventionsUniversal protocol
Typical useWeb services, microservicesAI agent integrations

MCP doesn't replace REST APIs. An MCP server can wrap existing REST APIs to provide a standardized AI-facing interface. The two are complementary.

How MCP Works in Practice

Practical MCP workflow showing developer question flowing through AI agent, MCP client, MCP server, to documentation and back
A developer question flows through MCP layers to reach real project data

Consider a real scenario. A developer asks their AI coding agent: "How does authentication work in this project?"

  1. The AI agent recognizes it needs project context
  2. The MCP client sends a request to the connected MCP server
  3. The MCP server reads the relevant documentation files
  4. The server returns the content as structured context
  5. The agent uses this context to generate an accurate, project-specific answer

Without MCP, the agent would either need custom file-reading code or would answer from general knowledge — missing project-specific details.

Build Your First Local MCP Server

Let's build a practical MCP server that exposes local project documentation to AI agents. This tutorial uses the official Python SDK (v2) and requires Python 3.10+.

Prerequisites

  • Python 3.10 or later
  • uv (recommended) or pip
  • An MCP-compatible client (Claude Desktop, VS Code with Copilot, or Cursor)

Step 1: Create the Project

mkdir bestwordz-mcp-demo
cd bestwordz-mcp-demo
uv init
uv add "mcp[cli]"

The mcp[cli] extra installs the SDK plus the mcp CLI tool for development and testing.

Step 2: Create Sample Documentation

mkdir docs

Create a few sample markdown files in the docs/ directory:

# docs/introduction.md
# Project Introduction

This is a sample project demonstrating MCP server integration.
The project uses Python 3.10+ and follows a modular architecture.

## Getting Started
1. Clone the repository
2. Install dependencies: pip install -r requirements.txt
3. Run the development server: python app.py
# docs/architecture.md
# Architecture

## Components
- **API Layer**: FastAPI endpoints handling HTTP requests
- **Service Layer**: Business logic and data processing
- **Data Layer**: SQLAlchemy ORM with PostgreSQL

## Authentication
JWT tokens with RS256 signing. Tokens expire after 24 hours.
Refresh tokens are stored in HTTP-only cookies.
# docs/api.md
# API Reference

## Endpoints
- GET /api/users - List all users
- POST /api/users - Create a user
- GET /api/users/{id} - Get user by ID
- PUT /api/users/{id} - Update user
- DELETE /api/users/{id} - Delete user

## Authentication
All endpoints require Authorization: Bearer {token} header.

Step 3: Build the MCP Server

Create server.py:

"""Simple MCP server that exposes local project documentation."""

from pathlib import Path
from mcp.server import MCPServer

mcp = MCPServer("BestWordz Docs Server")

# Security: restrict to this directory only
BASE_DIR = Path(__file__).parent / "docs"


def safe_path(filename: str) -> Path | None:
    """Resolve and validate that the path stays within BASE_DIR."""
    target = (BASE_DIR / filename).resolve()
    if not target.is_relative_to(BASE_DIR.resolve()):
        return None
    if not target.suffix == ".md":
        return None
    return target


@mcp.resource("docs://list")
def list_documents() -> str:
    """List all available documentation files."""
    files = sorted(f.name for f in BASE_DIR.glob("*.md"))
    return "\n".join(files) if files else "No documents found."


@mcp.resource("docs://{filename}")
def read_document(filename: str) -> str:
    """Read a specific documentation file by name."""
    path = safe_path(filename)
    if path is None:
        return "Error: Access denied or file not found."
    if not path.exists():
        return f"Error: {filename} not found."
    return path.read_text(encoding="utf-8")


@mcp.tool()
def search_docs(query: str) -> str:
    """Search documentation for a query string."""
    results = []
    for f in sorted(BASE_DIR.glob("*.md")):
        content = f.read_text(encoding="utf-8")
        if query.lower() in content.lower():
            # Return matching lines
            for i, line in enumerate(content.splitlines(), 1):
                if query.lower() in line.lower():
                    results.append(f"{f.name}:{i}: {line.strip()}")
    return "\n".join(results) if results else f"No matches for '{query}'."


if __name__ == "__main__":
    mcp.run(transport="stdio")

Key security features in this server:

  • safe_path() validates that all file access stays within docs/
  • Only .md files are accessible
  • Path traversal attempts (../) are rejected
  • No unrestricted filesystem access

Step 4: Test with MCP Inspector

The MCP SDK includes a visual inspector for testing:

uv run mcp dev server.py

This opens the MCP Inspector in your browser. You can:

  • See available tools and resources
  • Call list_documents to see your docs
  • Call read_document with a filename to read content
  • Call search_docs with a query to search
  • Verify that path traversal is blocked

Step 5: Configure Your MCP Client

To use this server with Claude Desktop, add to your MCP configuration:

{
  "mcpServers": {
    "bestwordz-docs": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/bestwordz-mcp-demo", "mcp", "run", "server.py"]
    }
  }
}

For VS Code or Cursor, consult their MCP configuration documentation — the format varies by client.

Step 6: Verify

Once configured, ask your AI agent questions about your project documentation. The agent should be able to:

  • List available documents
  • Read specific documentation files
  • Search across all documentation
  • Answer project-specific questions using real documentation

Security Considerations

MCP servers grant AI applications access to real resources. This creates real security risks that must be addressed.

Security Checklist

  • Minimal permissions — only expose what the AI actually needs
  • Restricted directories — never expose the entire filesystem
  • No secrets in code — use environment variables for credentials
  • Input validation — validate and sanitize all inputs
  • Path containment — verify all file paths stay within allowed directories
  • Authentication — require auth for remote servers
  • Logging — log access for audit purposes
  • Sandboxing — run servers in restricted environments
  • Trusted servers only — don't connect to unverified MCP servers
  • Review tool permissions — understand what each tool can do

Never connect an AI agent to sensitive systems simply because an MCP server makes the connection easy. The ease of integration doesn't reduce the risk — it just makes the risk more accessible.

MCP Use Cases for Developers

Practical applications where MCP adds genuine value:

  • Project documentation — expose README, architecture docs, and API references
  • Git repositories — let agents access commit history, branches, and diffs
  • Issue trackers — connect to GitHub Issues, Jira, or Linear
  • Databases — provide read-only access to schemas and query results
  • Internal APIs — wrap existing REST APIs with MCP for AI access
  • Monitoring systems — expose logs, metrics, and alerts
  • Knowledge bases — connect to wikis, Confluence, or documentation sites
  • Testing systems — let agents run and interpret test suites

MCP and Coding Agents

MCP makes coding agents more useful by giving them standardized access to external context. A coding agent connected via MCP can:

  • Read project documentation without custom file-reading code
  • Query databases for schema information
  • Access issue trackers for task context
  • Use external tools through declared MCP tools

Claude Code, Cursor, VS Code, and other MCP-compatible clients can connect to any MCP server. The same server works across all compatible clients — build once, use everywhere.

It's important to note that MCP is an integration protocol, not an agent framework. MCP itself doesn't make an application "agentic" — it provides the standardized connection layer that agentic systems can use to access external resources.

Troubleshooting

ProblemLikely CauseSolution
Server won't startMissing dependencies or wrong Python versionRun uv sync and verify Python 3.10+
Client can't connectWrong transport or configurationCheck config uses stdio for local servers
Tools not appearingServer not exposing capabilitiesTest with mcp dev first
Permission errorsPath outside allowed directoryCheck safe_path() validation
Import errorsSDK not installed correctlyReinstall: uv add "mcp[cli]"
No output in inspectorServer crashing silentlyCheck terminal output for errors

When Should You Use MCP?

Use MCP when:

  • Multiple AI applications need the same integration
  • An AI agent needs structured access to external tools and data
  • You want standardized, reusable AI-facing integrations
  • You want to build once and work across compatible clients

MCP may not be necessary when:

  • A simple direct API call is sufficient
  • The integration is only used by one small application
  • Security requirements prohibit exposing the resource
  • The added protocol complexity isn't justified

Conclusion

MCP is becoming an important integration layer for connecting AI applications with external context and capabilities. It's not just another API framework — it's a protocol designed specifically for how AI systems need to discover and use external tools and data.

But the value of MCP depends on good architecture, least-privilege security, reliable tools, trustworthy data, and appropriate human oversight. The protocol makes integration easy — but easy integration doesn't mean you should integrate blindly.

Start small. Build a local server that exposes read-only documentation. Test it. Understand how the protocol works. Then expand to more complex integrations — always with security as a first-class concern.

Key Takeaways

  • MCP is a standardized protocol for connecting AI applications to external tools, data, and systems
  • It follows a Host → Client → Server architecture with JSON-RPC 2.0 communication
  • Servers expose Resources (data), Tools (actions), and Prompts (templates)
  • You can build a functional MCP server in under 30 lines of Python using the official SDK
  • Security is critical: always use least-privilege access, restricted directories, and input validation
  • MCP complements REST APIs — it doesn't replace them
  • Build once with MCP, use across any compatible AI client

Further Reading

Official Resources