A Model Context Protocol (MCP) server library for C3. Build MCP tool servers that integrate with Claude Code, Claude Desktop, and other MCP clients.
Add mcp.c3l to your project's dependency search path:
{
"dependency-search-paths": ["dependencies"],
"dependencies": ["mcp"]
}module my_server;
import mcp;
fn ToolResult handle_greet(String tool_name, String args, void* user_data)
{
return mcp::text_result("Hello from C3!");
}
fn void main()
{
Server s = mcp::new_server({
.name = "my-server",
.version = "1.0.0",
});
s.add_tool({
.name = "greet",
.description = "Say hello",
.input_schema = `{"type":"object","properties":{}}`,
.handler = &handle_greet,
});
s.serve();
}Build and run:
c3c buildmcp::new_server(ServerInfo{...})-- Create a new serverServer.add_tool(ToolDef{...})-- Register a tool (max 32)Server.serve()-- Start the stdio event loop
ToolDef {
String name; // Tool name
String description; // Shown to the LLM
String input_schema; // JSON Schema for parameters
ToolHandlerFn handler; // fn ToolResult(String tool_name, String args, void* user_data)
void* user_data; // Optional context pointer
}mcp::text_result(String text)-- Return text contentmcp::error_result(String message)-- Return an errormcp::image_result(String base64_data, String mime_type)-- Return an image
The library includes lightweight JSON helpers for parsing tool arguments:
mcp::extract_string_value(String s)-- Extract a quoted string valuemcp::extract_object_value(String s)-- Extract a{...}objectmcp::extract_array_value(String s)-- Extract a[...]arraymcp::skip_whitespace(String s)-- Skip leading whitespacemcp::json_escape_into(DString* out, String s)-- Escape a string for JSON output
The library implements MCP over stdio using newline-delimited JSON-RPC 2.0. It handles initialize, tools/list, and tools/call messages automatically.