diff --git a/lib/mcp/backend_interface.v b/lib/mcp/backend_interface.v index 5a9195d0..82cd5a70 100644 --- a/lib/mcp/backend_interface.v +++ b/lib/mcp/backend_interface.v @@ -21,7 +21,7 @@ interface Backend { tool_exists(name string) !bool tool_get(name string) !Tool tool_list() ![]Tool - tool_call(name string, arguments map[string]string) !ToolCallResult + tool_call(name string, arguments map[string]Any) !ToolCallResult mut: resource_subscribe(uri string) ! resource_unsubscribe(uri string) ! diff --git a/lib/mcp/backend_memory.v b/lib/mcp/backend_memory.v index a3fef705..05d2396d 100644 --- a/lib/mcp/backend_memory.v +++ b/lib/mcp/backend_memory.v @@ -118,7 +118,7 @@ fn (b &MemoryBackend) tool_list() ![]Tool { return b.tools.values() } -fn (b &MemoryBackend) tool_call(name string, arguments map[string]string) !ToolCallResult { +fn (b &MemoryBackend) tool_call(name string, arguments map[string]Any) !ToolCallResult { // Get the tool handler handler := b.tool_handlers[name] or { return error("tool handler not found") } diff --git a/lib/mcp/developer/generate_mcp_tools.v b/lib/mcp/developer/generate_mcp_tools.v index ce945c1d..5f17f47e 100644 --- a/lib/mcp/developer/generate_mcp_tools.v +++ b/lib/mcp/developer/generate_mcp_tools.v @@ -19,3 +19,11 @@ const create_mcp_tool_tool = mcp.Tool{ required: ['function'] } } + +pub fn (d &Developer) create_mcp_tool_tool_handler(arguments map[string]string) !mcp.Tool { + json.decode(arguments) + // TODO: Implement the tool creation logic + return error('Not implemented') + + return mcp.tool_call_result(result) +} \ No newline at end of file diff --git a/lib/mcp/developer/mcp.v b/lib/mcp/developer/mcp.v index e69de29b..3e236856 100644 --- a/lib/mcp/developer/mcp.v +++ b/lib/mcp/developer/mcp.v @@ -0,0 +1,34 @@ +module developer + +import freeflowuniverse.herolib.mcp.logger +import freeflowuniverse.herolib.mcp +import freeflowuniverse.herolib.schemas.jsonrpc + +fn new_mcp_server() { + logger.info('Creating new Developer MCP server') + + // Initialize the server with the empty handlers map + mut server := mcp.new_server( + mcp.MemoryBackend{ + resources: map[string]mcp.Resource{}, + resource_contents: map[string][]mcp.ResourceContent{}, + resource_templates: map[string]mcp.ResourceTemplate{}, + prompts: map[string]mcp.Prompt{}, + prompt_messages: map[string][]mcp.PromptMessage{}, + tools: map[string]mcp.Tool{}, + tool_handlers: map[string]mcp.ToolHandler{}, + }, + mcp.ServerParams{ + config:mcp.ServerConfiguration{ + server_info: mcp.ServerInfo{ + name: 'developer' + version: '1.0.0' + } + }} + )! + + server.start() or { + logger.fatal('Error starting server: $err') + exit(1) + } +} diff --git a/lib/mcp/developer/vlang.v b/lib/mcp/developer/vlang.v index c65bdb49..7b9f663d 100644 --- a/lib/mcp/developer/vlang.v +++ b/lib/mcp/developer/vlang.v @@ -3,6 +3,8 @@ module developer import freeflowuniverse.herolib.mcp import os + + // list_v_files returns all .v files in a directory (non-recursive), excluding generated files ending with _.v fn list_v_files(dir string) ![]string { files := os.ls(dir) or { diff --git a/lib/mcp/generics.v b/lib/mcp/generics.v new file mode 100644 index 00000000..d8cc0750 --- /dev/null +++ b/lib/mcp/generics.v @@ -0,0 +1,7 @@ +module mcp + +pub type Any = []Any + | bool + | int + | map[string]Any + | string \ No newline at end of file diff --git a/lib/mcp/handler_tools.v b/lib/mcp/handler_tools.v index ad430bb4..bec77b6c 100644 --- a/lib/mcp/handler_tools.v +++ b/lib/mcp/handler_tools.v @@ -79,7 +79,7 @@ fn (mut s Server) tools_list_handler(data string) !string { pub struct ToolCallParams { pub: name string - arguments map[string]string + arguments map[string]Any } pub struct ToolCallResult { diff --git a/lib/mcp/tool_handler.v b/lib/mcp/tool_handler.v index 1eaab6b5..ca9eb626 100644 --- a/lib/mcp/tool_handler.v +++ b/lib/mcp/tool_handler.v @@ -3,4 +3,4 @@ module mcp import x.json2 // ToolHandler is a function type that handles tool calls -pub type ToolHandler = fn (arguments map[string]string) !ToolCallResult \ No newline at end of file +pub type ToolHandler = fn (arguments map[string]Any) !ToolCallResult \ No newline at end of file