feat: mcp server first take
This commit is contained in:
54
lib/bds/mcp/agent_config.ex
Normal file
54
lib/bds/mcp/agent_config.ex
Normal file
@@ -0,0 +1,54 @@
|
||||
defmodule BDS.MCP.AgentConfig do
|
||||
@moduledoc false
|
||||
|
||||
@server_name "bDS"
|
||||
|
||||
def add_to_config(agent, opts \\ []) when is_atom(agent) and is_list(opts) do
|
||||
home_dir = Keyword.get(opts, :home_dir, System.user_home!())
|
||||
config_path = config_path(agent, home_dir)
|
||||
command = Keyword.get(opts, :command, default_command(opts))
|
||||
args = Keyword.get(opts, :args, default_args(opts))
|
||||
|
||||
File.mkdir_p!(Path.dirname(config_path))
|
||||
|
||||
config = read_config(config_path)
|
||||
updated = merge_config(agent, config, command, args)
|
||||
File.write!(config_path, Jason.encode!(updated, pretty: true))
|
||||
|
||||
{:ok, %{config_path: config_path, server_name: @server_name}}
|
||||
end
|
||||
|
||||
def config_path(:claude_code, home_dir), do: Path.join(home_dir, ".claude.json")
|
||||
def config_path(:github_copilot, home_dir), do: Path.join([home_dir, "Library", "Application Support", "Code", "User", "mcp.json"])
|
||||
|
||||
defp default_command(opts) do
|
||||
Keyword.get(opts, :script_path, repo_script_path())
|
||||
end
|
||||
|
||||
defp default_args(_opts), do: []
|
||||
|
||||
defp repo_script_path do
|
||||
Path.expand("../../../bin/bds-mcp", __DIR__)
|
||||
end
|
||||
|
||||
defp read_config(path) do
|
||||
if File.exists?(path) do
|
||||
path
|
||||
|> File.read!()
|
||||
|> Jason.decode!()
|
||||
else
|
||||
%{}
|
||||
end
|
||||
end
|
||||
|
||||
defp merge_config(:github_copilot, config, command, args) do
|
||||
servers = Map.get(config, "servers", %{})
|
||||
|
||||
Map.put(config, "servers", Map.put(servers, @server_name, %{"type" => "stdio", "command" => command, "args" => args}))
|
||||
end
|
||||
|
||||
defp merge_config(:claude_code, config, command, args) do
|
||||
servers = Map.get(config, "mcpServers", %{})
|
||||
Map.put(config, "mcpServers", Map.put(servers, @server_name, %{"command" => command, "args" => args}))
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user