注:此分支目前尚不稳定,不支持自动启动 容器。这个问题将会得到修正, 但就目前而言,更可靠的 启动一个容器化的Lisply-MCP环境的方式是通过 “集装箱化运行”部分 “skewed-emacs” 可以翻译为“倾斜的Emacs”或“扭曲的Emacs”,具体取决于上下文和想要传达的精确含义。在这里,“skewed”通常表示某种形式的倾斜、扭曲或偏差,而“Emacs”是一个著名的文本编辑器和开发环境。所以,这个短语可能指的是某种对Emacs的修改、变体或特定配置,使其呈现出不同于原版的“倾斜”或“扭曲”特性 README(文件/说明). 在……之后 容器启动后,Claude Desktop 将连接到它们 根据以下示例配置。
基于Lisp及类似Lisp环境的模型上下文协议(MCP)中间件
这个项目是一个 模型上下文协议 (MCP) 使(某功能或系统)得以实现的中间件 大型语言模型 (大型语言模型) 到 与……互动 基于Lisp的 发展和 使用一种称为(此处可添加具体协议名称,原文未给出)的轻量级协议来创建运行时环境 _Lisply(这个词汇本身可能是一个特定领域或创造性的词汇,直接翻译可能无对应中文,但根据音译和可能的语境,可以尝试翻译为“利斯普利”或保持原样,若需具体含义需更多上下文)_。
这是为谁准备的?
- 对Lisp感兴趣的AI从业者
- 对人工智能感兴趣的Lisp开发者
- 对神经符号编程感兴趣的人
- 对CAD感兴趣的机械/土木工程师及设计师
自动化与知识工程
- 各行各业的捣鼓者、爱管闲事者和擅改者
它的用途是什么?
Lisply-MCP中间件实现连接 支持MCP(多路复用器/控制器接口等,具体含义根据上下文确定) 人工智能代理程序,或 _MCP 客户端_,例如 ClaudeDesktop(可译为“克劳德桌面版”或根据具体语境简化为“克劳德桌面”,但通常保持原名以体现品牌特色)基于Lisp的 支持REPL(Read-Eval-Print Loop,即读取-求值-打印循环)的系统。该连接 旨在有时辅助人工智能进行符号编程 被称为 _神经符号编程_我们创造了这个术语 “Lisply”指的是一个轻量级协议,该协议适用于大多数类似Lisp的语言 系统可以实现以使其与这种Lisply-MCP兼容 中间件。
这个想法是,大型语言模型(LLM)将能够生成并评估 任意的Lisp表达式,包括创建、编译、加载, 以及对整个文件和项目进行测试。
快速启动(额外版/加强版)
这将为您配置一个包含预设的Docker Compose环境 Lisply-MCP的容器化版本。
快速入门
以下内容将帮助您快速上手,只需最少的步骤即可开始操作 默认配置和基于公共Lisp的默认后端 作为Docker容器运行。更多内容请参见下面的主要目录 背景和详细配置选项。
1. 安装
- 安装 Node.js(推荐版本18+)。如果是在 Windows 系统上,可以
直接安装在Windows或WSL中。
- 安装 (20+
建议在安装了 Node.js 的同一主机上进行(安装/配置)。
- 克隆这个
lisply-mcp将仓库放到一个您
支持MCP的AI代理(例如Claude Desktop)可以访问它。
2. 配置您的MCP兼容AI代理
编辑或创建您的AI代理的配置文件,如下所示。在 在Claude Desktop的情况下,配置文件通常是:
/mnt/c/Users//AppData/Roaming/Claude/claude_desktop_config.json或者
c:\Users\\AppData\Roaming\Claude\claude_desktop_config.json在下面的例子中,替换 /path/to/cloned/ 带有正确的路径 到……的 ./scripts/mcp-wrapper.js 从克隆的仓库中获取文件:
{
"mcpServers": {
"gendl-ccl": {
"command": "node",
"args": [
"/path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js",
"--server-name", "gendl-ccl",
"--http-port", "9080"
]
}
},
{
"gendl-sbcl": {
"command": "node",
"args": [
"/path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js",
"--server-name", "gendl-sbcl",
"--http-port", "9090"
]
}
},
{
"skewed-emacs": {
"command": "node",
"args": [
"/path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js",
"--server-name", "skewed-emacs",
"--http-port", "7080"
]
}
}
}或者在WSL(Windows Subsystem for Linux)场景中(其中Claude桌面版在WSL中运行) Windows 主机):
{
"mcpServers": {
"gendl-ccl": {
"command": "wsl",
"args": [
"node /path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js",
"--server-name", "gendl-ccl",
"--http-port", "9080"
]
}
},
{
"gendl-sbcl": {
"command": "wsl",
"args": [
"node /path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js",
"--server-name", "gendl-sbcl",
"--http-port", "9090"
]
}
},
{
"skewed-emacs": {
"command": "wsl",
"args": [
"node /path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js",
"--server-name", "skewed-emacs",
"--http-port", "7080"
]
}
}
}请参阅下方的主要内容以获取更多配置选项,以便 示例:如何拥有你的(某物/某种状态) ~/projects/ 文件系统目录可共享 从您的主机“挂载”到默认的Lisply后端,或者如何 指定一个替代的Lisply后端容器或服务主机/端口。
每个服务器独立运行,使您能够同时处理多个任务 在不产生工具名称冲突的情况下,同时运行多个Lisp环境。
3. 重启您的AI代理并进行测试
完成上述配置后,您新重启的AI代理 现在将能够访问一个名为……的MCP服务器 lisply-gendl,带有 gendl__lisp_eval MCP工具(以及在正文中讨论的其他几个工具之一) (以下内容)。请注意,工具会自动以服务器为前缀 命名以避免在运行多个Lisply服务器时发生冲突。
为了测试你的设置,你可以按以下方式提示你的大型语言模型(LLM):
评估 (+ 1 2 3) 使用gendl\_\_lisp_eval工具,并让我知道(结果/情况) 结果。大型语言模型(LLM)应调用所请求的评估并作出回应: 6 as 预期如此。在之前,请随意尝试更复杂的表达式 进行中。
默认最小配置是如何工作的?
上述快速入门中描述的最小默认配置 将会拉动并运行一个 Gendl(根据上下文,这个词汇可能是一个专有名词或特定领域的术语,直接翻译为中文可能无具体含义,但可音译为“根德尔”或保持原样,具体需结合上下文确定) Docker 容器 它包含一个带有标准REPL(读取-求值-打印循环)的Common Lisp超集 (Read-Eval-Print Loop,即读-求值-打印循环)。注意,这是第二个Lisp风格的后端实现 对于Emacs Lisp来说,它也存在,位于其中 偏斜的;有偏差的 Emacs(一个高度可定制的文本编辑器) 项目。
系统概述
Lisply MCP中间件被实现为一个JavaScript程序,旨在 在Node.js中运行,并在您的AI代理和任何(系统/服务)之间提供桥梁 符合规范的Lisply后端系统这个包装/外壳 使人工智能代理能够:
- 在Lisply后端评估Lisp代码并接收结果。
- 向后端实现的任何网页端点发送HTTP请求。
- 访问负载均衡器中的内省和文档查询功能
使用Lisp评估。
- 创建、操作、编译、加载和分析文件,再次使用(相应的工具或软件)
Lisp 评估。
- 与本地运行的后端交互,使用Lisp调试器。
Lisply(注:此词并非一个常见的英文单词或术语,可能是特定语境下的创造词或品牌名等,因此直接音译为中文,实际含义需根据具体语境确定。) 是一种轻量级协议,规定了 一套简洁而灵活的HTTP及标准输入/输出接口, 一套标准的环境变量,Docker容器镜像命名 公约,以及多项可选功能以促进人工智能代理的运作 控制你正在运行的Lisp系统。
建筑
下面的图表大致展示了各组件之间的交互方式:
flowchart TB
User("User") Claude("Claude Desktop")
User Emacs("Emacs Text Editor (Optional)")
Claude MCP("MCP Protocol")
MCP Wrapper("Node.js MCP Wrapper")
Wrapper --> LisplyHttp("Lisply HTTP Server")
subgraph Docker ["Docker Container"]
subgraph LisplyExec["Lisply Executable"]
LisplyHttp
LisplySwank("Lisply SWANK Server (for Emacs connection)")
end
end
Wrapper Docker
Emacs LisplySwank
KB[("Lisply Knowledge Base")] Wrapper
LisplyHttp --> Endpoints("RESTful Endpoints")
LisplyHttp --> LispEval("Lisp Evaluation")
style User fill:#ff9,stroke:#333,stroke-width:2px
style Claude fill:#f9f,stroke:#333,stroke-width:2px
style Emacs fill:#9ff,stroke:#333,stroke-width:2px,stroke-dasharray:5
style Wrapper fill:#bbf,stroke:#333,stroke-width:2px
style MCP fill:#bbf,stroke:#333,stroke-width:1px
style Docker fill:#bfb,stroke:#333,stroke-width:2px
style LisplyExec fill:#8f8,stroke:#333,stroke-width:2px
style LisplyHttp fill:#bfb,stroke:#333,stroke-width:1px
style LisplySwank fill:#bfb,stroke:#333,stroke-width:1px
style KB fill:#bfb,stroke:#333,stroke-width:1px
style Endpoints fill:#bfb,stroke:#333,stroke-width:1px
style LispEval fill:#bfb,stroke:#333,stroke-width:1px中间件处理:
- 如需启动和管理一个符合Lisply规范的Docker容器
- 在MCP协议与(其他系统/协议)之间翻译Lisp评估请求
后端 Lisply API
- 错误处理、Lisp 调试器交互以及日志记录
安全考虑事项
因为Lisply-MCP允许对任意Lisp代码进行评估 一个基于Lisp运行的后端,存在一定的风险,以防大型语言模型(LLM) 可能会“失控”。因此,最佳实践是:
- 允许包装器仅连接到容器化版本的
Lisp 后端。如果要覆盖默认主机/端口,包装器将会 愉快地连接到任何符合Lisply标准的实时HTTP端口。避免 允许这种情况发生在任何由程序服务的HTTP端口上 直接在您的主机上运行。
- 确保不要将任何非易失性目录挂载到那里
容器(请参阅下面的目录挂载配置说明)
- 考虑采取措施 [限制RAM和CPU
使用](https://docs.docker.com/engine/containers/resource_constraints/) (位于)集装箱的。
代码模块/文件
- lib/config.js 翻译成中文为:“lib/配置文件.js” 或者 “lib/配置.js”(根据上下文,有时“config.js”可简化为“配置.js”,表示这是一个配置文件)配置加载和环境处理
- lib/logger.js 翻译成中文为:lib/日志记录器.js(或更简洁地译为:lib/日志模块.js,具体翻译可能根据上下文有所调整)日志记录功能
- lib/docker.js 翻译成中文是:lib/(库文件夹)下的 docker.js 文件Docker 容器管理
- lib/server.js 翻译为中文是:“lib 目录下的 server.js 文件”HTTP服务器和MCP封装实现
- lib/utils.js 翻译成中文为:“lib/实用工具文件.js” 或者更简洁地表达为 “lib/工具文件.js”,具体翻译可能根据上下文或项目命名习惯有所调整用于响应处理的实用函数
- 处理程序/特定工具的请求处理程序
- initialize.js 翻译为中文是“初始化.js”初始化处理程序 - toolsList.js 翻译成中文是:“工具列表.js” 或 “工具清单.js”工具列表处理器 - toolCall.js主要工具调用分发器 - httpRequest.js(注:这个名称本身在中文中并没有直接的翻译意义,它是一个文件名,表示这是一个JavaScript文件,用于处理HTTP请求。所以,直接保留原名或解释其用途即可,如“用于处理HTTP请求的JavaScript文件:httpRequest.js”)HTTP请求处理器 - ping.js(注:这里的“ping.js”通常指的是一个用于模拟ping操作的JavaScript库或脚本,但直接翻译时,我们保持其原名,因为这是一个特定的文件名或库名,没有直接的中文对应。)Ping 处理程序 - lispEval.js(可译为“Lisp评估器.js”,但通常直接保留原名以体现其特定用途或项目命名)Lisp 评估处理程序
- mcp-wrapper.js 翻译为中文是:“MCP 封装器.js” 或者 “MCP 包装脚本.js”。这里,“MCP”可能代表某个特定的模块、组件或系统(具体含义需根据上下文确定),“wrapper”或“包装”表示这是一个用于封装或包装该 MCP 的 JavaScript 文件\ Lisply server host (default: 127.0.0.1)
--swank-host-port SWANK port on host system (external) (default: 4201) --http-host-port HTTP port on host system (external) (default: 9081) --https-host-port HTTPS port on host system (external) (default: 9444) --telnet-host-port TELNET port on host system (external) (default: 4024) --http-port HTTP port inside container (internal) (default: 9080) --https-port HTTPS port inside container (internal) (default: 9443) --swank-port SWANK port inside container (internal) (default: 4200) --telnet-port TELNET port inside container (internal) (default: 4023) --image-base-name Base name for Docker image (default: dcooper8/gendl) --image-branch Branch to use for Docker image (default: auto-detected) --docker-image Full Docker image for backend (overrides base name and branch) --lisp-impl Lisp implementation to use, ccl or sbcl (default: ccl) --no-auto-start Do not auto-start backend Docker container if not running --docker-socket Path to Docker socket (default: /var/run/docker.sock) --log-file Path to log file (default: /tmp/lisply-mcp-wrapper.log) --debug Enable debug logging --mount Mount volumes in format "src:dst" (can specify multiple times) --start-http Start HTTP service in backend container (default: true) --start-https Start HTTPS service in backend container (default: false) --start-swank Start SWANK service in backend container (default: true) --start-telnet Start TELNET service in backend container (default: false) --no-use-stdio Disable stdio capability for local containers (default: false) --repl-prompt REPL prompt pattern to detect Lisp evaluation completion (default: ?) --eval-timeout Timeout for Lisp evaluation in milliseconds (default: 30000) --endpoint-prefix Prefix for all endpoints (default: lisply) --lisp-eval-endpoint Endpoint name for Lisp evaluation (default: lisp-eval) --http-request-endpoint Endpoint name for HTTP requests (default: http-request) --ping-endpoint Endpoint name for ping (default: ping-lisp) --server-name MCP server name for tool prefixing (default: lisply-mcp) -h, --help Display help for command
### 环境变量
该脚本还支持通过环境变量进行配置。您
可以指定带有“LISPLY\_”前缀或无前缀的变量:
**注:** 重要的是要明确区分主机(或东道主)与……之间的区别
端口(主机系统上监听且可从主机系统访问的)和容器
端口(容器内部,对Lisply后端可见)
服务流程):
| 环境变量 | 描述 | 默认值 |
|----------------------|-------------|---------|
| `BACKEND_HOST` 或者 `LISPLY_BACKEND_HOST` | Lisply服务器主机 | 127.0.0.1 |
| `SWANK_HOST_PORT` 或者 `LISPLY_SWANK_HOST_PORT` | 主机系统上的SWANK端口(外部) | 4201 |
| `HTTP_HOST_PORT` 或者 `LISPLY_HTTP_HOST_PORT` | 主机系统(外部)上的HTTP端口 | 9081 |
| `HTTPS_HOST_PORT` 或者 `LISPLY_HTTPS_HOST_PORT` | 主机系统(外部)上的HTTPS端口 | 9444 |
| `TELNET_HOST_PORT` 或者 `LISPLY_TELNET_HOST_PORT` | 主机系统上的TELNET端口(外部) | 4024 |
| `HTTP_PORT` 或者 `LISPLY_HTTP_PORT` | 容器内部的HTTP端口(内部) | 9080 |
| `HTTPS_PORT` 或者 `LISPLY_HTTPS_PORT` | 容器内部的HTTPS端口(内部) | 9443 |
| `SWANK_PORT` 或者 `LISPLY_SWANK_PORT` | 容器内部SWANK端口(内部) | 4200 |
| `TELNET_PORT` 或者 `LISPLY_TELNET_PORT` | 容器内部的TELNET端口(内部) | 4023 |
| `START_HTTP` 或者 `LISPLY_START_HTTP` | 启动HTTP服务 | true |
| `START_HTTPS` 或者 `LISPLY_START_HTTPS` | 启动HTTPS服务 | false |
| `START_SWANK` 或者 `LISPLY_START_SWANK` | 启动SWANK服务 | 真 |
| `START_TELNET` 或者 `LISPLY_START_TELNET` | 启动TELNET服务 | false |
| `DOCKER_IMAGE` 或者 `LISPLY_DOCKER_IMAGE` | 后端的Docker镜像 | (自动检测) |
| `IMAGE_BASE` 或者 `LISPLY_IMAGE_BASE` | Docker 镜像的基准名称 | genworks/gendl |
| `IMAGE_BRANCH` 或者 `LISPLY_IMAGE_BRANCH` | Docker 镜像分支 | (自动检测) |
| `LISP_IMPL` 或者 `LISPLY_LISP_IMPL` | 要使用的Lisp实现 | ccl |
| `AUTO_START` 或者 `LISPLY_AUTO_START` | 启用容器自动启动 | true |
| `DOCKER_SOCKET` 或者 `LISPLY_DOCKER_SOCKET` | Docker 套接字路径 | /var/run/docker.sock |
| `LOG_FILE` 或者 `LISPLY_LOG_FILE` | 日志文件路径 | /tmp/lisply-mcp-wrapper.log |
| `DEBUG_MODE` 或者 `LISPLY_DEBUG_MODE` | 启用调试日志记录 | false |
| `MOUNTS` 或者 `LISPLY_MOUNTS` | 逗号分隔的挂载点 | (无) |
| `NO_USE_STDIO` 或者 `LISPLY_NO_USE_STDIO` | 禁用标准I/O功能 | false |
| `REPL_PROMPT` 或者 `LISPLY_REPL_PROMPT` | REPL 提示符模式 | ?(取决于实现) |
| `EVAL_TIMEOUT` 或者 `LISPLY_EVAL_TIMEOUT` | Lisp 评估超时时间(毫秒) | 30000 |
| `ENDPOINT_PREFIX` 或者 `LISPLY_ENDPOINT_PREFIX` | 所有端点的前缀 | lisply |
| `LISP_EVAL_ENDPOINT` 或者 `LISPLY_LISP_EVAL_ENDPOINT` | 用于Lisp评估的终端点名称 | lisp-eval |
| `HTTP_REQUEST_ENDPOINT` 或者 `LISPLY_HTTP_REQUEST_ENDPOINT` | HTTP请求的端点名称 | http-request |
| `PING_ENDPOINT` 或者 `LISPLY_PING_ENDPOINT` | 用于ping的端点名称 | ping-lisp |
| `SERVER_NAME` 或者 `LISPLY_SERVER_NAME` | 用于工具前缀的MCP服务器名称 | lisply-mcp |
## Docker 集成
Lisply-MCP可以与本地和远程的Lisply进行交互
后端。对于本地情况,中间件可以自动运行
用于拉取和管理相应Lisply后端的Docker命令
容器。
### Docker镜像选择
中间件根据(相关信息)选择一个默认的Docker镜像名称
检测到您的 Lisply-MCP 仓库中的当前 Git 分支:
1. Lisply Docker镜像的命名约定遵循以下模式:
`${DOCKER_USER}/${IMAGE_BASE}:${IMAGE_BRANCH}-${LISP_IMPL}`
- `${DOCKER_USER}` 在 hub.docker.com 上的用户名,默认为 `genworks`.
- `${IMAGE_BASE}` Lisply 后端的主要名称。默认值为 `gendl`。
- `${IMAGE_BRANCH}` 默认为当前所在 git 分支的名称,其中
包装脚本位于(任何斜杠(`/`) 转换后的
变成双连字符(`--`)
- 例如, `release/1598` 变成;成为 `release--1598` 在图像标签中
- `devo` 分支将使用镜像标签 `devo`
- 如果未检测到Git分支,则默认为 `master`.
- `${LISP_IMPL}` 这是在基础Lisp语言层面上的Lisp实现
后端支持多种可用的Lisp版本(例如,ccl、sbcl)
(可用于当前公开的Gendl构建版本)。
1. 如果存在更新的镜像,中间件将尝试拉取:
- 首先尝试从 Docker Hub 拉取一个更新的镜像。
- 如果拉取失败或本地已是最新版本,则使用本地版本。
1. 你可以通过以下方式覆盖自动选择:
- 这个(或“该”) `--docker-image` 命令行参数(覆盖
`--image-base-name` 和 `--image-branch` (完全地)
- 这个 `--image-base-name` 和/或 `--image-branch` 论点;论据;参数
- 该 `LISPLY_DOCKER_IMAGE` 环境变量
- 这个 `LISPLY_IMAGE_BASE` 并且 `LISPLY_IMAGE_BRANCH` 环境
变量
1. 对于Lisp语言的实现:
- 用……来指定 `--lisp-impl` (对于当前的gendl构建,使用ccl或sbcl)
- 或者使用 `LISPLY_LISP_IMPL` 环境变量
- 默认设置为 `ccl` 如未指明, `sbcl` 也是一个不错的选择
对于默认的Gendl图像。
### DockerHub 认证
包装器将尝试使用存储的凭据登录到DockerHub
凭据。然而,默认的容器镜像都是公开的,并且
应可匿名获取,无需(提供额外信息/满足特定条件等,根据上下文补充完整) `docker login`.
### 卷挂载
你可以将主机目录挂载到后端的Lisply容器中以
在你的主机系统和容器之间共享文件(注意,多个
(可以指定挂载点):
{ "mcpServers": { "lisply-gendl-4": { "command": "node", "args": [ "/path/to/cloned/lisply-mcp/scripts/mcp-wrapper.js", "--mount", "/home/user/projects:/projects", "--mount", "/home/user/data:/data" ] } } }
或者使用环境变量:
LISPLY_MOUNTS=/home/user/projects:/projects,/home/user/data:/data node mcp-wrapper.js
注意,容器是以某个特定的用户ID(UID)运行的,通常默认为
到1000。这可能会导致文件所有权出现意外情况,如果Lisply(这里假设Lisply是一个特定的系统或程序名,但直接翻译可能不常见,若它是特定技术或软件名,应根据实际情况翻译或保留原样)
后端正在向已挂载的目录写入数据。这可以通过
`docker exec` 通过向容器发送命令来更改UID
运行容器中服务的用户(的行为)。这种行为是
预计在该项目的未来版本中将实现自动化。A.
可能的命令示例如下:
docker exec lisply-mcp- usermod -u 1001 lisply-user
### 现有服务检测
封装程序将检查是否已经在(某处)运行着一个Lisply服务
指定HTTP主机和端口,并在之前(或在)存在时使用它们
尝试拉取和/或启动一个容器。
#### 现有服务覆盖本地容器设置
当在指定的主机和端口上检测到现有服务时,
所有与 Docker 相关的设置都将被忽略:
- `--docker-image`, `--image-base-name`, `--image-branch`,以及 `--lisp-impl`
- `--mount` 音量选项
- `--start-*` 服务标志
- `--*-port` 内部容器端口设置
- `--docker-socket` 路径
- `--no-auto-start` 旗帜
在这种情况下,包装器将记录有关哪些设置的信息
被忽视。
## 通信模式
这个中间件支持两种主要的通信模式:
配置的Lisply后端:HTTP模式和stdio(标准输入输出)
输入/输出(Input/Output)模式。
### HTTP 模式
HTTP模式是默认的通信方法,且与两者均兼容工作
本地和远程Lisply后端。此模式使用标准HTTP
所有Lisply后端都必须实现的端点。
**特点:**
- 结构化响应,包含独立的结果、标准输出和错误字段
- 适用于大多数非正式使用场景
- 响应格式: `{Result: , Stdout: , Error: }`
**HTTP模式下的示例响应:**
{"Result": "6", "Stdout": "This is a message to standard output"}
### Stdio 模式
Stdio模式为大型语言模型(LLM)提供了更原始的REPL(读取-求值-打印循环)体验
使大型语言模型(LLM)能够进行交互式调试。此模式期望
利用后端的原生REPL接口以及任何包含的(功能/模块)
命令驱动的调试器。
**特点:**
- 未经结构化格式处理的原始REPL式输出
- 在发生错误时支持交互式调试器
- 仅适用于由本中间件启动的本地容器
- 非常适合开发、调试和复杂交互
- 捕获标准输出,随后捕获评估后的返回值
在同一流中的表达,因此LLM(大型语言模型)将不得不进行区分
这些就像人类用户所做的那样
**调试器支持:** 当在stdio模式下发生错误时,Lisp
调试器可以进行交互。包装器检测调试器提示
并向AI代理提供有关调试器状态的元数据。这
功能依赖于封装代码中的硬编码提示模式
这需要进行增强,以支持新的Lisp后端
不同的REPL和调试器提示符(欢迎提交补丁)。
**模式选择:**
- 默认模式是HTTP。
- 要为特定的工具调用使用stdio模式,请指示LLM(大型语言模型)进行指定
`mode: "stdio"` 在……中 `lisp_eval` 工具参数。
- 可以通过配置在本次会话中禁用Stdio模式
`--no-use-stdio` 旗帜或 `LISPLY_NO_USE_STDIO=true`。
如果请求使用stdio模式但被禁止或不可用,则
包装器将回退到HTTP模式。使用stdio模式的LLM调用者需要
要意识到这一点,因为HTTP回退的响应会
以JSON格式打包,而非原始格式。
## 使用示例
以下所有示例都可以在命令行中进行测试,并用于
`claude_desktop_config.json` 配置(见 [Claude Desktop(可译为“Claude桌面版”或保持原样,根据上下文决定是否需要具体化为“Claude桌面应用程序”等)
配置](#claude-desktop-configuration))。
### 在容器中运行
如果在容器内运行封装程序本身,请确保挂载
Docker 套接字(可能还需要一些其他端口技巧):
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/scripts:/app node:18 node /app/mcp-wrapper.js
## 添加一个独立且兼容的文件系统MCP服务器
以下是 `claude_desktop_config.json` 这建立了文件系统MCP(多协议转换器/多协议通信协议,具体含义根据上下文确定)
服务器以及我们的 `lisply-mcp-1` 服务器,带通用挂载点
在两个MCP服务器之间共享:
{ "mcpServers": { "filesystem": { "command": "wsl", "args": [ "docker", "run", "-i", "--rm", "-u", "1000:1000", "--mount", "type=bind,src=/home/user/projects,dst=/projects", "mcp/filesystem", "/projects" ] }, "lisply-gendl": { "command": "wsl", "args": [ "node", "/home/user/projects/lisply-mcp/scripts/mcp-wrapper.js", "--server-name", "gendl", "--mount", "/home/user/projects:/projects" ] } }, "globalShortcut": "" }
### Claude的工具详情
#### Lisp 评估工具 (`__lisp_eval`)
这个(或“它”) `lisp_eval` 工具(前面加上服务器名称,例如。, `gendl__lisp_eval`)
允许克劳德直接在Lisply环境中评估Lisp代码
带有以下参数:
- `code` (必需):要评估的Lisp代码
- `package` (可选):用于评估的软件包
- `mode` (可选):用于与Lisply通信的模式
- `http` (默认):使用HTTP通信进行结构化响应
- `stdio`使用标准输入/输出通信以实现原始REPL(读-求值-打印循环)体验
**模式对比:**
| 特性 | HTTP 模式 | STDIO 模式 |
|---------|-----------|------------|
| 响应格式 | 以结构化形式展示,包含独立的Result和Stdout字段 | 原始REPL(读-求值-打印循环)样式的输出 |
| 错误处理 | 捕获错误并将其作为字符串返回 | 可以进入交互式调试器 |
| 调试器支持 | 不支持交互式调试 | 支持交互式调试器 |
| 兼容性 | 与本地和远程服务器兼容 | 仅适用于由MCP启动的本地容器 |
| 使用场景 | 清晰集成,简单查询 | 开发、调试、复杂交互 |
#### HTTP请求工具(`__http_request`)
这个(或:那个,具体根据上下文确定) `http_request` 工具(前面加上服务器名称,例如。, `gendl__http_request`)
使AI代理能够与Lisply暴露的任何HTTP端点进行交互
后端(以下示例适用于我们的默认后端,该后端具有
内置的 `/color-map` HTTP 端点):
{ "path": "/color-map", "method": "GET", "headers": { "Accept": "application/json" } }
#### Ping 工具(`__ping_lisp`)
该 `ping_lisp` 工具(前面加上服务器名称,例如。, `gendl__ping_lisp`)
让我们让克劳德确认一下Lisply服务器是否正在运行:
__ping_lisp()
## 现实世界中的例子
### 示例1:创建参数化盒子
在这个例子中,克劳德在Lisply中创建了一个参数化盒子
环境,然后根据用户(的需求)修改其属性
要求。
**用户**“你能创建一个宽度为10,高度为5,深度为3的盒子吗?”?
然后告诉我如何将高度改为8英寸
**克劳德**:
我将使用lisp_eval工具创建一个参数化盒子,然后展示给你看
如何调整其高度。
首先,让我们按照指定的尺寸创建这个盒子:
(in-package :gdl-user)
;; First, create a box with the specified dimensions (defparameter *my-box* (make-object 'box :width 10 :height 5 :length 3))
;; Let's verify the dimensions (list (theo *my-box* width) (theo *my-box* height) (theo *my-box* length))
现在,让我们把高度从5改成8:
;; Change the height using setf with accessor (theo *my-box* (set-slot! :height 8))
;; Alternatively, we could create a new box (defparameter *new-box* (make-object 'box :width 10 :height 8 ;; Updated height :length 3))
;; Verify the new dimensions of original box (list (theo *my-box* width) (theo *my-box* height) (theo *my-box* length))
这个盒子可以通过创建一个网页界面或使用(某种工具/方法)来可视化
内置的Gendl可视化工具,如 `geysr`. 查看 [Gendl(注:此词可能为特定领域或虚构名称,无直接对应中文翻译,故保留原样)
文档](https://gornschool.com) 详情如下。
### 示例2:展示HTTP模式与Stdio模式之间的区别
**用户**“你能向我展示一下HTTP模式和stdio模式之间的区别吗
通过评估一个简单的表达式,该表达式会向标准输出打印某些内容
输出并返回一个值?“
**人工智能代理**:
我将通过演示来展示HTTP模式和stdio模式之间的区别
评估一个简单的Lisp表达式,该表达式既打印输出又
返回一个值。
首先,让我们使用HTTP模式(默认模式):
(progn (format t "This is a message to standard output~%") (+ 1 2 3))
HTTP模式下的响应:
{"Result": "6", "Stdout": "This is a message to standard output"}
现在,让我们对同一个表达式使用stdio模式:
;; Using mode: stdio (progn (format t "This is a message to standard output~%") (+ 1 2 3))
在标准I/O模式下的响应:
This is a message to standard output 6
注意区别:HTTP模式提供的是结构化的响应,其中
标记为“结果”和“标准输出”部分,而stdio模式则提供原始数据
REPL 的输出与 Lisp REPL 中显示的完全一致。
标准I/O模式在调试时特别有用,因为它可以显示
您交互式调试器的提示。例如,如果我们引入一个
错误:
;; Using mode: stdio (progn (format t "About to generate an error~%") (/ 1 0))
在stdio模式下,你可能会看到类似这样的内容:
About to generate an error
Error: Division by zero While executing: / Type :help for debugging options
这使得大型语言模型(LLM)能够直接与调试器进行交互。在HTTP中
模式,你只会收到一条错误信息,而不会有交互式提示
能力。
## 故障排除
### 常见问题及解决方案
#### 容器无法启动
如果Lisply容器无法启动:
1. 检查Docker是否正在运行:
docker info
2. 检查端口是否已被占用:
sudo lsof -i :4201 sudo lsof -i :9081
3. 验证Docker镜像是否存在:
docker images | grep genworks
4. 尝试手动拉取镜像:
docker pull genworks/gendl:master-ccl
#### 连接错误
如果LLM代理/MCP客户端无法连接到配置的Lisply
后端:
1. 检查Lisply服务器是否正在运行:
docker ps | grep lisply
2. 检查包装器的日志文件:
tail -f /tmp/lisply-mcp-wrapper.log
3. 使用Windows工具检查Claude Desktop的日志文件
例如:记事本。它通常位于这样的位置:
WSL/Linux:
/mnt/c/Users//AppData/Roaming/Claude/logs/mcp-server-lisply.log
Windows:
c:\Users\\AppData\Roaming\Claude\logs\mcp-server-lisply.log
5. 尝试向Lisply HTTP服务器发送curl请求:
curl http://localhost:9081/lisply/ping-lisp
6. 尝试连接到 Lisply SWANK 服务器(默认端口 4201):
M-x slime-connect ;; from emacs
请注意,设置(或建立)
[“Skewed-Emacs”可以翻译为“倾斜的Emacs”或“扭曲的Emacs”,具体取决于上下文和语境中想要表达的含义。不过,通常“Emacs”是一个特定的软件名称,即一个高度可定制的文本编辑器和开发环境,因此“Skewed-Emacs”可能是一个特定项目、变体或定制版本的名称,具体翻译时可能需要结合具体语境来确定最准确的译法。如果这是一个项目或变体的名称,且没有特定的语境指向,那么“倾斜的Emacs”或“扭曲的Emacs”作为直译是可行的](https://github.com/gornskew/skewed-emacs) 配置
将使能够 `M-x slime-connect` 在你的 Emacs 中。
#### 权限问题
如果您遇到权限错误:
1. 检查Docker套接字权限:
ls -l /var/run/docker.sock
2. 确保您的用户有权访问 Docker:
sudo usermod -aG docker $USER
3. 检查挂载目录的权限:
ls -l /path/to/mounted/directory
### 诊断命令
使用这些命令来诊断常见问题:
1. 检查中间件日志:
tail -f /tmp/lisply-mcp-wrapper.log
2. 检查Docker容器日志:
docker logs $(docker ps --filter "name=lisply-mcp" --format "{{.ID}}")
3. 检查Lisply服务状态:
curl http://localhost:9081/lisply/ping-lisp
4. 验证Docker环境:
docker system info
## 许可证
这款软件根据GNU Affero通用公共许可证进行授权
v3.0(AGPL-3.0),与Gendl使用的相同许可证。
### 许可影响
只需使用这个MCP服务器与Lisply后端进行交互
获取输出并不触发AGPL(GNU Affero通用公共许可证)的要求,例如,你
可以使用这个包装器来与Gendl进行交互,而无需
分享你的代码。
然而,如果你修改或扩展了这个包装器,或者一个与该许可证兼容的(包装器)
像Gendl这样的Lisp后端,以及希望分发和/或托管一个
基于该结果提供的服务(无论是否为商业用途),那么AGPL(GNU Affero General Public License,即GNU Affero通用公共许可证)将会
要求您与下游接收者共享您的修改内容
或者用户。
对于需要保持其源代码封闭的应用程序,Genworks
已开始提供一种“豁免条款”,允许用户以5%的费用规避AGPL(GNU Affero General Public License,GNU Affero通用公共许可证)的限制
自我报告的季度收入版税。更多信息及一个(此处“a”可能指代某个具体项目或链接,但原文未给出具体信息,故保留“a”以提示需根据上下文补充)
支付网关可在以下位置使用
[royalties.genworks.com 翻译为中文可以是“版税.genworks.com”。不过,通常在这种情况下,我们不会将“.genworks.com”这样的域名直接翻译,因为它是一个特定的网络域名,而不是一个需要翻译的普通词汇。所以,最准确的翻译就是保留原域名不变,即“royalties.genworks.com”,或者简单地解释为“版税相关网站(genworks.com)”。但如果非要给出一个类似翻译的表达,可以是“版税服务.genworks.com”或“版税管理.genworks.com”,具体取决于该网站的具体功能。在这里,为了简洁明了,直接使用“royalties.genworks.com”作为翻译结果是合适的](https://royalties.genworks.com)。
许可证的全文可以在 COPYING.txt 文件中找到
这个目录。
## MCP服务器注册表
- [MCPHub(注:MCPHub可能是一个特定名称或品牌,直接翻译为“MCP中心”或保持原样“MCPHub”均可,具体取决于上下文和该名称的用途)](https://mcphub.com/mcp-servers/gornskew/lisply-mcp)