6.9 KiB
MCP Protocol Framework
The Model Context Protocol (MCP) provides a standardized way for AI models and agents to interact with various resources, tools, and services. This framework implements the core functionality of MCP in C++ with support for agent workflows.
Core Features
- HTTP-based Communication: RESTful API for client-server interaction
- Resource Abstraction: Standard interface for files, directories, APIs, and more
- Tool Registry: Register and invoke tools with structured parameters
- Agent Framework: Create agents that can process requests and use tools
- Workflow System: Define and execute sequences of tool calls
- Extensible Architecture: Easy to extend with new resource types and tools
Components
Core Protocol (mcp_protocol.h
, mcp_protocol.cpp
)
Defines the fundamental structures and types for MCP:
- Request/response handling
- Error codes
- Resource interfaces
- Tool definitions
Server (mcp_server.h
, mcp_server.cpp
)
Implements an HTTP server that exposes MCP resources and tools:
- Register resources at specific paths
- Register tools with handlers
- Process incoming HTTP requests
- Route requests to appropriate resources
Client (mcp_client.h
, mcp_client.cpp
)
Implements a client for connecting to MCP servers:
- Connect to servers
- Discover available resources and tools
- Make requests to resources
- Call tools with parameters
Resources (mcp_resource.h
)
Provides base implementations for common resource types:
- File resources
- Directory resources
- API resources
- Image resources
Tools (mcp_tools.h
, mcp_tools.cpp
)
Provides tool-related functionality and agent workflow support:
- Tool registry
- Tool builder (fluent API)
- Workflow definition and execution
- Agent base class
Workflow (mcp_workflow_resource.h
, mcp_workflow_resource.cpp
, mcp_agent_resource.cpp
)
Implements resources for workflow and agent management:
- Create and manage workflows
- Execute workflows
- Register and manage agents
- Process requests with agents
Examples
Custom Agents (examples/custom_agent.h
, examples/custom_agent.cpp
)
Examples of custom agent implementations:
- Echo agent: Simple agent that echoes back input with optional processing
- Workflow agent: An agent that executes pre-defined workflows
- Chain agent: An agent that chains multiple tools together
Server Example (examples/server_example.cpp
)
Example of an MCP server implementation with custom tools:
- Time tool: Get the current time
- Calculator tool: Perform mathematical operations
- Text processor tool: Process and analyze text
- Custom workflow and agent registration
Client Example (examples/client_example.cpp
)
Example of an MCP client connecting to a server:
- Get server information
- List available tools
- Call tools with parameters
- List and execute workflows
- Interact with agents
Host Example (examples/host_example.cpp
)
Example of a host that combines server and client functionality:
- Register local tools and resources
- Connect to other MCP servers
- Create workflows that combine local and remote tools
- Manage connections to other servers
How to Use
Setting Up a Server
// Create and configure the server
mcp::server server("localhost", 8080);
server.set_name("MCP Example Server");
// Register a tool
mcp::tool time_tool = mcp::tool_builder("get_time")
.with_description("Get the current time")
.build();
server.register_tool(time_tool, [](const mcp::json& params) {
// Tool implementation
return mcp::json::object();
});
// Register a resource
auto file_resource = std::make_shared<mcp::file_resource>("./files");
server.register_resource("/files", file_resource);
// Start the server
server.start(true); // Blocking mode
Creating a Client
// Connect to a server
mcp::client client("localhost", 8080);
// Get server information
mcp::json server_info = client.get_server_info();
// Call a tool
mcp::json params = {
{"key", "value"}
};
mcp::json result = client.call_tool("tool_name", params);
Defining a Workflow
// Create a workflow
mcp::workflow workflow("example_workflow", "Example workflow description");
// Add steps to the workflow
workflow.add_tool_call("get_time");
workflow.add_tool_call("text_processor", {
{"text", "Example text"},
{"to_uppercase", true}
});
// Execute the workflow
mcp::json context = workflow.execute();
Creating a Custom Agent
// Define a custom agent
class my_agent : public mcp::agent {
public:
my_agent() : mcp::agent("MyAgent") {}
void initialize(const mcp::json& config) override {
// Initialize from config
}
mcp::json process(const mcp::json& input) override {
// Process input
return mcp::json::object();
}
};
// Register the agent with a server
auto agent_ptr = std::make_shared<my_agent>();
agent_ptr->initialize({});
auto agent_resource = std::make_shared<mcp::agent_resource>();
agent_resource->register_agent(agent_ptr);
server.register_resource("/agents", agent_resource);
Building the Framework
The framework depends on the following libraries:
- httplib.h - HTTP server and client
- json.hpp - JSON parsing and generation
- base64.hpp - Base64 encoding/decoding
- stb_image.h - Image loading (for image resources)
All dependencies are included in the repository.
To build the examples:
g++ -std=c++17 examples/server_example.cpp mcp_protocol.cpp mcp_server.cpp mcp_tools.cpp mcp_workflow_resource.cpp mcp_agent_resource.cpp -pthread -o server_example
g++ -std=c++17 examples/client_example.cpp mcp_protocol.cpp mcp_client.cpp -pthread -o client_example
g++ -std=c++17 examples/host_example.cpp mcp_protocol.cpp mcp_server.cpp mcp_client.cpp mcp_tools.cpp mcp_workflow_resource.cpp mcp_agent_resource.cpp -pthread -o host_example
Extending the Framework
Adding New Resource Types
- Define a new class that inherits from
mcp::resource
- Implement the required methods:
resource_type type() const
json metadata() const
response handle_request(const request& req)
json schema() const
(optional)
Creating Custom Tools
Use the tool builder API:
// Create a tool definition
mcp::tool my_tool = mcp::tool_builder("my_tool")
.with_description("My custom tool")
.with_string_param("input", "Input parameter", true)
.with_number_param("count", "Count parameter", false)
.build();
// Register the tool handler
server.register_tool(my_tool, [](const mcp::json& params) {
// Tool implementation
return mcp::json::object();
});
Implementing Custom Agents
- Define a new class that inherits from
mcp::agent
- Implement the required methods:
void initialize(const mcp::json& config)
mcp::json process(const mcp::json& input)
- Register the agent with an agent resource
License
This framework is provided under the MIT License. See the LICENSE file for details.