🌐 Mcpixir 是一种开源方式,可以连接任意LLM到任意MCP服务器,并构建具有工具访问权限的自定义代理,无需使用闭源或应用程序客户端。
💡 让开发者轻松地将任意LLM连接到工具,如网络浏览、文件操作等。
| 功能 | 描述 |
|---|---|
| 🔄 易用性 | 创建你的第一个MCP代理只需6行代码 |
| 🤖 LLM灵活性 | 支持任何支持工具调用的LLM(OpenAI、Anthropic等) |
| 🌐 HTTP支持 | 直接连接到运行在特定HTTP端口上的MCP服务器 |
| ⚙️ 动态服务器选择 | 代理可以从可用池中动态选择最合适的MCP服务器来完成给定任务 |
| 🧩 多服务器支持 | 在单个代理中同时使用多个MCP服务器 |
| 🛡️ 工具限制 | 限制潜在危险的工具,如文件系统或网络访问 |
在mix.exs中的依赖项列表中添加mcpixir:
def deps do
[
{:mcpixir, "~> 0.1.0"}
]
end
或者从源码安装:
git clone https://github.com/yourusername/mcpixir.git
cd mcpixir
mix deps.get
mix compile
Mcpixir与各种LLM提供商兼容。你需要在应用中配置首选的LLM。将你要使用的提供商的API密钥添加到环境变量中:
export OPENAI_API_KEY=your_openai_key_here
export ANTHROPIC_API_KEY=your_anthropic_key_here
重要:只有支持工具调用能力的模型才能与Mcpixir一起使用。确保你选择的模型支持函数调用或工具使用。
# 创建配置字典
config = %{
mcpServers: %{
playwright: %{
command: "npx",
args: ["@playwright/mcp@latest"],
env: %{
DISPLAY: ":1"
}
}
}
}
# 从配置字典创建MCP客户端
client = Mcpixir.new_client(config)
# 配置LLM
llm_config = %{
provider: :openai,
model: "gpt-4o"
}
# 创建代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client
})
# 运行查询
{:ok, result, updated_agent} = Mcpixir.run(agent, "找到旧金山最好的餐厅")
IO.puts("\n结果: #{result}")
你也可以从配置文件中添加服务器配置,如下所示:
config_path = Path.join("path/to", "browser_mcp.json")
{:ok, config_data} = File.read(config_path)
{:ok, config} = Jason.decode(config_data)
client = Mcpixir.new_client(config)
示例配置文件(browser_mcp.json):
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"DISPLAY": ":1"
}
}
}
}
对于其他设置、模型等,请参阅文档。
# 创建配置
config = %{
mcpServers: %{
playwright: %{
command: "npx",
args: ["@playwright/mcp@latest"],
env: %{
DISPLAY: ":1"
}
}
}
}
# 创建MCP客户端
client = Mcpixir.new_client(config)
# 配置LLM
llm_config = %{
provider: :openai,
model: "gpt-4o"
# 其他模型:
# provider: :anthropic, model: "claude-3-5-sonnet"
# provider: :groq, model: "llama3-8b-8192"
}
# 创建代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client
})
# 运行查询
{:ok, result, updated_agent} = Mcpixir.run(agent, "找到旧金山最好的餐厅,使用谷歌搜索")
IO.puts("\n结果: #{result}")
# 确保正确清理资源
Mcpixir.Client.stop_all_sessions(client)
# 创建配置,包括Airbnb
config = %{
mcpServers: %{
airbnb: %{
command: "npx",
args: ["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"]
}
}
}
# 创建MCP客户端
client = Mcpixir.new_client(config)
# 配置LLM
llm_config = %{
provider: :anthropic,
model: "claude-3-5-sonnet"
}
# 创建代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client
})
# 运行查询以搜索住宿
query = """
为我找一个适合两个成人入住的地方,在巴塞罗那住一个星期,八月份。我更喜欢有游泳池且评价好的地方。显示前三选项。
"""
{:ok, result, updated_agent} = Mcpixir.run(agent, query)
IO.puts("\n结果: #{result}")
# 确保正确清理资源
Mcpixir.Client.stop_all_sessions(client)
示例配置文件(airbnb_mcp.json):
{
"mcpServers": {
"airbnb": {
"command": "npx",
"args": ["-y", "@openbnb/mcp-server-airbnb"]
}
}
}
# 创建配置,包括Blender
config = %{
mcpServers: %{
blender: %{
command: "uvx",
args: ["blender-mcp"]
}
}
}
# 创建MCP客户端
client = Mcpixir.new_client(config)
# 配置LLM
llm_config = %{
provider: :anthropic,
model: "claude-3-5-sonnet"
}
# 创建代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client
})
# 运行查询
{:ok, result, updated_agent} = Mcpixir.run(agent, "创建一个软材料的充气立方体,并有一个平面作为地面。")
IO.puts("\n结果: #{result}")
# 确保正确清理资源
Mcpixir.Client.stop_all_sessions(client)
MCP-Use支持从配置文件初始化,使管理和切换不同的MCP服务器设置变得容易:
# 从文件加载配置
config_path = Path.join("path/to", "mcp-config.json")
{:ok, config_data} = File.read(config_path)
{:ok, config} = Jason.decode(config_data)
# 从配置创建MCP客户端
client = Mcpixir.new_client(config)
# 创建会话
{:ok, client, session} = Mcpixir.Client.create_session(client, "http://localhost:8000")
# 使用会话...
# 完成后断开连接
Mcpixir.Client.stop_session(client, session.id)
Mcpixir支持HTTP连接,允许你连接到运行在特定HTTP端口上的MCP服务器。此功能特别适用于集成基于Web的MCP服务器。
这里是一个如何使用HTTP连接功能的例子:
# 配置HTTP连接
config = %{
mcpServers: %{
http: %{
url: "http://localhost:8931/sse"
}
}
}
# 创建MCP客户端
client = Mcpixir.new_client(config)
# 配置LLM
llm_config = %{
provider: :openai,
model: "gpt-4o"
}
# 创建代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client
})
# 运行查询
{:ok, result, updated_agent} = Mcpixir.run(agent, "找到旧金山最好的餐厅,使用谷歌搜索")
IO.puts("\n结果: #{result}")
这个例子演示了如何连接到运行在特定HTTP端口上的MCP服务器。确保在运行此示例之前启动你的MCP服务器。
Mcpixir允许配置和同时连接到多个MCP服务器,使用Mcpixir.Client。这使得需要来自不同服务器的工具的复杂工作流程成为可能,例如结合网络浏览和文件操作或3D建模。
你可以在配置文件中配置多个服务器:
{
"mcpServers": {
"airbnb": {
"command": "npx",
"args": ["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"DISPLAY": ":1"
}
}
}
}
Mcpixir.Client模块提供了管理连接到多个服务器的功能。在创建代理时,你可以提供配置了多个服务器的客户端。
默认情况下,代理将有权访问所有已配置服务器的工具。如果你需要针对特定任务指定特定服务器,可以在创建代理时指定服务器参数。
# 创建配置了多个服务器的客户端
config = load_multi_server_config()
client = Mcpixir.new_client(config)
# 示例:运行一个可能使用来自两个服务器的工具的查询
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client
})
# 结合不同能力的查询
query = """
在Airbnb上搜索巴塞罗那的好住处,
然后使用谷歌查找附近的餐馆和景点。
"""
{:ok, result, _updated_agent} = Mcpixir.run(agent, query)
为了提高效率并减少代理在处理来自不同服务器的许多工具时的混淆,你可以利用内置的服务器管理器功能。
启用后,代理将根据LLM为特定步骤选择的工具智能地选择正确的MCP服务器。这减少了不必要的连接,并确保代理使用适当的工具来完成任务。
# 创建配置了多个服务器的客户端
config = load_multi_server_config()
client = Mcpixir.new_client(config)
# 创建启用了服务器管理器的代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client,
use_server_manager: true # 启用服务器管理器
})
# 运行一个使用多个服务器工具的查询
{:ok, result, _updated_agent} = Mcpixir.run(agent, """
在Airbnb上搜索巴塞罗那的好住处,
然后使用谷歌查找附近的餐馆和景点。
""")
MCP-Use允许你限制代理可以访问的工具,提供更好的安全性和对代理能力的控制:
# 创建客户端
config = load_config()
client = Mcpixir.new_client(config)
# 创建具有受限工具的代理
{:ok, agent} = Mcpixir.new_agent(%{
llm: llm_config,
client: client,
disallowed_tools: ["file_system", "network"] # 限制潜在危险的工具
})
# 运行具有受限工具访问的查询
{:ok, result, _updated_agent} = Mcpixir.run(agent, "找到旧金山最好的餐厅")
我们提供了一组Mix任务来展示库的不同方面。这些任务使用真实的LLM和MCP服务器来展示全部功能。
运行mix mcp查看所有可用示例:
mix mcpixir
可用示例:
mix mcpixir.chat - 带有工具的简单聊天交互mix mcpixir.airbnb - 展示与Airbnb集成的示例mix mcpixir.blender - 控制Blender 3D软件的示例mix mcpixir.browser - 使用Playwright进行网络浏览mix mcpixir.filesystem - 操作文件系统mix mcpixir.http - 到MCP服务器的HTTP连接mix mcpixir.multi - 一起使用多个MCP服务器获取特定示例的帮助:
mix help mcpixir.chat
每个示例都可以按照以下模式运行:
# 基本用法
mix mcpixir.chat
# 带选项
mix mcpixir.browser --provider=anthropic --query="找到Hex.pm上排名前五的Elixir包"
大多数示例都支持这些常见选项:
--provider=[openai|anthropic] - 要使用的LLM提供商--model=MODEL - 要使用的特定LLM模型--query=QUERY - 发送到LLM的查询这些示例需要OpenAI或Anthropic的API密钥。在环境中设置它们:
# 对于OpenAI
export OPENAI_API_KEY=your-openai-key
# 对于Anthropic
export ANTHROPIC_API_KEY=your-anthropic-key
Mcpixir提供了内置的日志记录,有助于诊断代理实现中的问题。
有几种方法可以配置日志记录:
使用MCP_USE_LOG_LEVEL环境变量设置日志级别:
export MCP_USE_LOG_LEVEL=debug # 选项:debug, info, warn, error
你可以在代码中直接设置日志级别:
# 设置全局日志级别
Mcpixir.Logging.set_level(:debug) # 选项::debug, :info, :warning, :error
mix.exs或config.exs中配置# 在config/config.exs中
config :mcpixir,
log_level: :debug
我们热爱贡献!欢迎打开问题报告错误或功能请求。
我们欢迎贡献,让这个项目变得更好!以下是开始的一些步骤:
# 克隆仓库
git clone https://github.com/yourusername/mcp-use-elixir.git
cd mcp-use-elixir
# 安装依赖
mix deps.get
# 运行测试
mix test
# 运行代码格式化
mix format
# 运行代码检查
mix credo
该项目遵循语义版本控制,并使用结构化的发布过程。你可以通过以下任一方法发布新版本:
mix mcp.release 0.2.0
./bin/release.sh 0.2.0
两种方法都会:
mix.exs中的版本CHANGELOG.md中的新版本MIT