Livebook工具
Livebook Tools是一个CLI工具,在使用时为您提供超能力 .livemd 文件夹。\ 其主要特征是:
- BYOE(自带编辑器) -同步您的
.livemd将文件添加到打开的Livebook会话中,以便您可以在AI驱动的代码编辑器(如Cursor)中编辑它们。 - MCP服务器 -一个简单的模型上下文协议服务器,用于将AI编码代理连接到您的Livebook会话。下文将对此进行详细介绍。
- 从CLI运行Livebooks -转换您的
.livemd将文件复制到Elixir脚本中,并将其从上到下运行,就像它们是一个.exs脚本。如果你想把livebook变成cron作业,这很有用。
安装
Livebook Tools是一个Elixir脚本。\ 要安装它,您可以使用 mix escript.install 命令。
mix escript.install github thmsmlr/livebook_tools安装后,确保escript目录在您的路径上。
# for normal elixir users
export PATH="$HOME/.mix/escripts:$PATH"
# for asdf elixir users
for escripts_dir in $(find "${ASDF_DATA_DIR:-$HOME/.asdf}/installs/elixir" -type d -name "escripts" 2>/dev/null); do
export PATH="$escripts_dir:$PATH"
done运行Livebook
为了使Livebook工具正常工作,它需要能够使用分布式Elixir连接到正在运行的Livebook服务器。\ 这取决于你如何运行Livebook。\ 在最简单的形式中,您需要做的就是将两个环境变量添加到您的 ~/.bashrc 或 ~/.zshrc 文件。
export LIVEBOOK_NODE="livebook@127.0.0.1"
export LIVEBOOK_COOKIE="secret"然后,当您运行Livebook工具或Livebook时,这两个程序都会发现这些值,并确保它们可以相互连接。 如果您使用Livebook Desktop运行,则可能需要将这些值添加到 ~/.livebookdesktop.sh 文件也是。 有关Livebook Desktop的更多信息,请查看 Livebook HexDocs.
设置MCP服务器
MCP服务器是一个简单的 模型上下文协议 服务器,允许您将AI编码代理连接到您的Livebook会话。\ 我亲自测试了实现 光标,尽管它应该与支持MCP协议的任何AI代码编辑器一起使用。 MCP服务器通过STDIO运行,因此您所要做的就是告诉Cursor通过命令连接,它将自动发现工具并将其连接到其编码代理。 有关MCP与Cursor配合使用的更多信息,请查看 光标MCP文档.
Cursor Create MCP Server Cursor MCP Server Connected
有用的提示
有时,您希望自定义代码的运行方式,无论是在Livebook中运行还是通过命令行运行 livebook_tools run . 您可以使用一些简单的代码片段来检测您是在实时书籍中运行还是在命令行上运行,
# Detect if we're running in a livebook
is_livebook = !String.ends_with?(__ENV__.file, ".exs")
# If we're running in a livebook, argv doesn't really make sense, so we'll just return an empty list
argv = if is_livebook, do: [], else: System.argv()
# Parse command line arguments
# We'll use OptionParser to handle both flags and positional arguments
{parsed_opts, positional_args, invalid_opts} =
OptionParser.parse(
argv,
strict: [
dry_run: :boolean,
limit: :integer
],
aliases: [
d: :dry_run,
l: :limit
]
)
# Extract options with default values, in livebook it'll just use the default values
dry_run = Keyword.get(parsed_opts, :dry_run, false)
limit = Keyword.get(parsed_opts, :limit, 10)