20250503jupyter-mcp-server自动化

背景

20250131jupyter自动修改IDEA项目SDK、获取GIT信息

20230429 IaC之IDE,也许是下一个ChatIDE?

在我尝试将jupyter kotlin kernel 内嵌到IDEA的JVM后,用jupyter控制IDEA用了很长时间,但除了utils工具类之外IDEA的openapi和公开的方法基本都是为了UI而编写的异步代码,这在自动化过程中获取返回值非常不方便。我预期的是直接复制粘贴官方源码稍微改改就能用,不想对官方代码做大的结构修改。

继IDEA官方编写MCP后,我发现二月份的时候jupyter也有MCP server了。

datalayer在尝试用ai把jupyter自动化,使用自然语言描述数据处理的请求然后生成notebook并执行python代码,我一看这不正好是我想要的么。

如果我人工能操作jupyterlab完成结果,相比调整kotlin脚本的控制流,我只需要糊一点python代码就能代替我手工操作的部分

原理

jupyter mcp server的代码非常的少,我想要的其实是排除mcp的部分,去掉注解改一改直接就能用

本质上是直接调用了jupyter lab的接口获取websocket,通过jupyter lab的collaboration扩展通道操作notebook

过程记录

安装jupyter lab,注意这里新增了jupyter-collaboration

实测发现之前的安装命令不好使了,日志报错如下

很明显kernel接到了jupyterlab的请求但反序列化失败了,注意到jupyterlab没指定版本

根据上一次安装记录对比版本号可发现,是最近jupyterlab的更新4.4.0时header新增了一个字段,而kotlin kernel反序列化不接受未定义的字段导致,因此降级到4.3的最后一个版本4.3.6

还是记录下版本号方便后续对比

降级后测试原来的功能正常

第一次先使用再建一个独立virtualenv防止破坏环境

按官方文档安装依赖,修改官方的源码作为测试脚本。因为官方是使用独立进程的python kernel运行脚本,而我是要让一个已经运行了的内嵌kernel执行,所以需要指定下当前的kernel_id复用。否则代码会启动一个新的python kernel执行kotlin脚本就和我的预期不符了

既然python文件单独执行是能成功的,也就意味着python kernel也能执行相同的代码,而一个jupyterlab可以同时开启notebook分配不同的kernel。既然如此已经有一个现成的python环境了为什么不直接用呢?因此续尝试合并这个独立的python环境到jupyterlab的python环境

为了防止安装新的依赖破坏现有版本,pip list记录下当前的依赖版本后再安装新的依赖,通过对比安装前后差异可以发现都是datalayer实现的库,这些库用于和jupyterserver交互并且除了websocket没有什么额外的垃圾依赖进来

合并后的安装命令

 

然后就可以尝试将脚本放入另一个notebook中了,kernel如下

执行效果如下

到此为止用python半自动的控制IDEA的目标达成,python代码可以控制IDEA并且能调用IDEA JVM的所有代码,同时执行过程全部可见、可追溯、可重放。这样后续就可以看实际情况逐渐把这个过程的控制权交给AI。
但我没想好的是:当一个程序有能力对自身进行修正的时候,让AI有这么强大的行动能力会不会带来额外的安全问题

后续计划

jupyterlab的启动内置到idea插件中,全自动化整个初始化流程
升级embedded kotlin jupyter core兼容最新的jupyterlab的header字段

参考

https://github.com/dev-assistant/skykoma-plugin-idea

https://github.com/datalayer/jupyter-mcp-server/tree/main/jupyter_mcp_server 

 

0 Comments
Leave a Reply