mcp-provider 导出和 mcp 宿主接口(mcp.wit,API 1.4)。
声明工具
find-notes.schema.json:
Schema 会在安装时和
openidea-plugin check 时校验。带工具的插件需要代码(wasm)。
实现调用
实现openidea_plugin::McpProvider 并注册 mcp 导出:
serde_json,需要把它加进 Cargo.toml。
tool是本地工具名(find_notes),arguments是输入的 JSON 文本,已按 Schema 校验过(最大 1 MiB)。ctx是该项目的调用上下文。- 返回文本;需要结构化结果时,把 JSON 编码成文本返回。结果最大 4 MiB。
- WIT 导出为
mcp-provider.call(tool, arguments, ctx);worldplugin-mcp包含基础插件 world, 只含导出的mcp-toolsworld 与之组合。
调用如何执行
- 每次请求都会列出已启用的工具,所以禁用或卸载插件会立即撤回它们。
- 调用在插件自己的实例中执行,使用插件自己的授权、CPU 燃料和 5 秒命令预算。MCP 客户端不会带来额外权限:
插件没有权限的宿主函数照样返回
Error::Denied。 - 工具拥有项目的调用上下文,但不算用户命令或事件:仅限命令和事件使用的 API(对话框、
start_run、打开标签页等) 会返回invalid。 destructive调用如果被用户拒绝、取消,或者没有可以询问的窗口,都会失败。- 如果两个已启用插件的工具名规范化后相同,两个工具都不会提供。
- 内置服务器目前只服务本地项目;远程项目的工具调用会得到“not supported for remote projects yet”的响应。
让代理连接服务器
host::mcp_stdio_command()(WIT mcp.stdio-command,无需权限)返回发起调用项目的 stdio 桥接命令行,例如
["/path/openidea", "--mcp-stdio", "--project", "/project"]。启动或配置代理的插件可以把它传过去。
服务器关闭、没有项目窗口,或远程宿主上没有自己运行的服务器时返回 None。它永远不会暴露服务器的 HTTP 地址或令牌。
测试
在cargo test 中针对 SDK 的模拟宿主直接调用 McpProvider::call 即可。
data-tools 测试插件
声明了只读、写入和破坏性工具,宿主的测试会用到它。