吉多。主控程序
jido_mcp 使用以下工具将MCP服务器集成到Jido生态系统中 anubis_mcp 直接。
特性
- 每个配置的端点共享池化MCP客户端
- 用于MCP工具/资源/提示的消费端API
- Jido动作+信号驱动使用的插件路由
- 吉多。AI运行时工具同步(MCP工具->代理
Jido.Actions - MCP服务器网桥(
use Jido.MCP.Server)与明确的排外主义者
安装
def deps do
[
{:jido_mcp, "~> 0.1"}
]
end端点配置
config :jido_mcp, :endpoints,
github: %{
transport: {:streamable_http, [base_url: "http://localhost:8080", mcp_path: "/mcp"]},
client_info: %{name: "my_app", version: "1.0.0"},
protocol_version: "2025-06-18",
capabilities: %{},
timeouts: %{request_ms: 30_000}
},
local_fs: %{
transport: {:stdio, [command: "uvx", args: ["mcp-server-filesystem"]]},
client_info: %{name: "my_app", version: "1.0.0"}
}v1中支持的传输:
{:stdio, keyword()}用于基于shell/命令的MCP服务器{:shell, keyword()}作为一个标准化的别名:stdio{:sse, keyword()}用于使用协议的传统HTTP+SSE服务器2024-11-05{:streamable_http, keyword()}对于MCP2025-03-26/2025-06-18,包括通过Anubis的可选SSE流媒体:enable_sse选项
对于流式HTTP, :url 或一个 :base_url 包含非根路径 标准化为阿努比斯 :base_url + :mcp_path 选项形状。
端点配置也可以通过MFA回调加载:
config :jido_mcp, :endpoints, {MyApp.MCPConfig, :endpoints, []}回调必须返回映射/关键字端点声明,或者 {:ok, endpoints}.
运行时终结点可以在应用程序启动后注册:
{:ok, endpoint} =
Jido.MCP.Endpoint.new(:github, %{
transport: {:streamable_http, [base_url: "http://localhost:8080", mcp_path: "/mcp"]},
client_info: %{name: "my_app", version: "1.0.0"}
})
{:ok, ^endpoint} = Jido.MCP.register_endpoint(endpoint)运行时注册是进程本地的,拒绝重复的端点ID,并启动MCP客户端 仅当首次使用端点时。
运行时端点生命周期
{:ok, endpoint} =
Jido.MCP.Endpoint.new(:runtime_demo, %{
transport: {:streamable_http, [base_url: "http://localhost:8080/mcp"]},
client_info: %{name: "my_app"}
})
{:ok, ^endpoint} = Jido.MCP.register_endpoint(endpoint)
{:ok, tools} = Jido.MCP.list_tools(:runtime_demo)
{:ok, _removed} = Jido.MCP.unregister_endpoint(:runtime_demo)对于运行时的配置更改,请注销,然后注册更新的端点。
使用MCP API
{:ok, tools} = Jido.MCP.list_tools(:github)
{:ok, called} = Jido.MCP.call_tool(:github, "search_issues", %{"query" => "label:bug"})
{:ok, resources} = Jido.MCP.list_resources(:github)
{:ok, content} = Jido.MCP.read_resource(:github, "repo://owner/name/README")
{:ok, prompts} = Jido.MCP.list_prompts(:github)
{:ok, prompt} = Jido.MCP.get_prompt(:github, "release_notes", %{"version" => "1.2.0"})所有通话均返回标准化信封:
- 成功:
%{status: :ok, endpoint: atom(), method: String.t(), data: map(), raw: ...} - 错误:
%{status: :error, endpoint: atom(), type: ..., message: String.t(), details: ...}
Jido操作+插件
行动
Jido.MCP.Actions.ListToolsJido.MCP.Actions.CallToolJido.MCP.Actions.ListResourcesJido.MCP.Actions.ListResourceTemplatesJido.MCP.Actions.ReadResourceJido.MCP.Actions.ListPromptsJido.MCP.Actions.GetPromptJido.MCP.Actions.RegisterEndpointJido.MCP.Actions.RefreshEndpointJido.MCP.Actions.UnregisterEndpointJido.MCP.Actions.SetDefaultEndpoint
插件
defmodule MyApp.Agent do
use Jido.Agent,
name: "assistant",
plugins: [
{Jido.MCP.Plugins.MCP,
%{
default_endpoint: :github,
allowed_endpoints: [:github, :local_fs]
# or allowed_endpoints: :all
}}
]
endallowed_endpoints 默认为 [] (否认所有)如果省略。 设置为 :all 以允许所有当前配置/运行时注册的端点。
信号路径:
mcp.tools.listmcp.tools.callmcp.resources.listmcp.resources.templates.listmcp.resources.readmcp.prompts.listmcp.prompts.getmcp.endpoint.registermcp.endpoint.refreshmcp.endpoint.unregistermcp.endpoint.default.set
要在运行时更新插件默认端点,请发出 mcp.endpoint.default.set 和 %{endpoint_id: "github"} (或 nil/省略以清除)。
吉多。好的,同步。
Jido.MCP.JidoAI.Actions.SyncToolsToAgent 发现远程工具并创建代理 Jido.Action 模块,然后在运行中注册它们 Jido.AI.Agent.
Jido.MCP.JidoAI.Actions.UnsyncToolsFromAgent 删除以前同步的代理。
工具同步使用确定性MCP就绪:端点调用等待 Anubis.Client.await_ready/2 在执行之前。
插件路由支持:
mcp.ai.sync_toolsmcp.ai.unsync_tools
主机运行时编排(信号)
宿主项目应协调运行时端点生命周期和工具同步 明确使用插件信号。
推荐信号序列:
- 注册端点,然后同步工具
1. mcp.endpoint.register 1. mcp.ai.sync_tools
- 刷新端点,然后重新同步工具
1. mcp.endpoint.refresh 1. mcp.ai.sync_tools (与 replace_existing: true)
- 在注销终结点之前取消同步工具
1. mcp.ai.unsync_tools 1. mcp.endpoint.unregister
信号有效载荷示例:
# mcp.endpoint.register
%{
endpoint_id: "runtime_demo",
endpoint: %{
transport: {:streamable_http, [base_url: "http://localhost:8080/mcp"]},
client_info: %{name: "my_app"}
}
}
# mcp.ai.sync_tools
%{
endpoint_id: "runtime_demo",
agent_server: :my_ai_agent,
replace_existing: true,
prefix: "mcp_"
}
# mcp.ai.unsync_tools
%{endpoint_id: "runtime_demo", agent_server: :my_ai_agent}
# mcp.endpoint.unregister
%{endpoint_id: "runtime_demo"}将Jido暴露为MCP服务器
服务器模块
defmodule MyApp.MCPServer do
use Jido.MCP.Server,
name: "my-app",
version: "1.0.0",
publish: %{
tools: [MyApp.Actions.SearchIssues],
resources: [MyApp.MCP.Resources.ReleaseNotes],
prompts: [MyApp.MCP.Prompts.CodeReview]
}
end该出版物仅明确表示反对。
监督
children =
Jido.MCP.Server.server_children(MyApp.MCPServer,
transport: :streamable_http
)路由器(可流式传输HTTP)
forward "/mcp", Anubis.Server.Transport.StreamableHTTP.Plug,
Jido.MCP.Server.plug_init_opts(MyApp.MCPServer)资源和快速行为
Jido.MCP.Server.ResourceJido.MCP.Server.Prompt
对中列出的项目实施这些行为 publish.resources 和 publish.prompts.
测试
mix test