@lelemon-ai / mcp
一个 MCP 的服务器 柠檬API v2. 它把API的每一个操作变成一个工具,所以克劳德,光标或任何MCP客户端可以管理代理,联系人,案例,消息和更多与您的API密钥。
每次服务器启动时,这些工具都是由API自己的OpenAPI契约生成的,因此它们总是与您指向的API相匹配。
安装
你需要Node.js 20或更新的版本和一个柠檬API密钥。从测试键开始(lel_test_...),直到你信任客户。
服务器通过studio与MCP对话,因此您不必手动运行它。将其添加到您的客户端 npx -y @lelemon-ai/mcp 作为命令。
克劳德桌面
编辑 claude_desktop_config.json (设置,开发人员,编辑配置):
{
"mcpServers": {
"lelemon": {
"command": "npx",
"args": ["-y", "@lelemon-ai/mcp"],
"env": {
"LELEMON_API_KEY": "lel_test_...",
"LELEMON_API_URL": "https://api.lelemon.cl"
}
}
}
}
光标
编辑 ~/.cursor/mcp.json (或 .cursor/mcp.json 在一个项目中)与相同的 mcpServers Block如上所述。
克劳德代码
claude mcp add lelemon \
-e LELEMON_API_KEY=lel_test_... \
-e LELEMON_API_URL=https://api.lelemon.cl \
-- npx -y @lelemon-ai/mcp
设置
所有设置都是MCP客户端条目的环境变量。
| 变量 | 描述 |
|---|---|
LELEMON_API_KEY | 必需的。工具使用的API密钥。 |
LELEMON_API_URL | 要对话的API。默认为 https://api.lelemon.cl. 在使用其他环境中的键时显式地设置它。一定是 https; http 只接受 localhost, 127.0.0.1 和 [::1]. |
LELEMON_SUBACCOUNT | 一、 sub_... id。除非调用传递自己的子帐户,否则每个调用都作用于该子帐户 subaccount 论点。仅用于平台密钥。 |
LELEMON_MCP_ALLOW | 打开隐藏组,以逗号分隔。见下文。 |
LELEMON_MCP_TOOLS | 只保留这些工具,用逗号分隔。见下文。 |
LELEMON_OPENAPI_FILE | 从文件读取合约,而不是下载。键的作用域仍然是从API中读取的。 |
它暴露了什么
只是工具。没有资源,也没有提示:API所能做的一切都是一个操作,而一个操作就是一个工具。
工具名称是API的操作id,比如 agents.list, cases.takeControl 或者 whatsapp.messages.create. 每个工具都将其操作的路径和查询值作为参数,JSON请求体作为参数 body,以及可选的 subaccount.
每个工具还声明一个 outputSchema,调用工作时API给出的答案的顶级属性(类型、enum和简短描述;嵌套对象只是) object,因此列表保持较小),并返回该答案为 structuredContent 在与文本相同的JSON旁边。答案没有主体(删除)的工具两者都没有。失败的调用返回一个错误,没有 structuredContent.
注释告诉客户端每个工具的功能: readOnlyHint 读, destructiveHint 对于删除和任何发送信息或花钱的东西,以及 openWorldHint 能够接触到外部人员或系统的工具。标记为破坏性或金钱的工具在运行前应与人员确认。
只有你的钥匙能做什么
在启动时,服务器询问API您的密钥具有哪些作用域(GET /v2/me),并只列出您的钥匙覆盖的工具。带 agents:read 和 cases:read 查看代理和案例读取,而不是整个API,这也保存了模型上下文。
自己筛选列表
LELEMON_MCP_TOOLS 进一步缩小列表范围。每个条目是一个操作id或以。结尾的前缀 .*:
LELEMON_MCP_TOOLS=cases.*,agents.list,agents.retrieve
与任何操作都不匹配的条目会在开始时停止服务器,这样就不会忽略键入错误。过滤器是该客户端的设置,而不是API的设置。
隐藏的组
有些工具是关闭的,直到你打开它们 LELEMON_MCP_ALLOW. 组隐藏更改其中某些内容或返回秘密的操作。无害的阅读,比如 apiKeys.list, approvals.list 或者 suppressions.retrieve,总是可见的。
| 集团 | 它隐藏了什么 |
|---|---|
keys | 创建,更改,旋转和删除API密钥,以及返回一个秘密的每个工具(签名秘密,webhook秘密,运行身份)。除非你把这个打开,否则模特是看不见秘密的。 |
approvals | 批准,拒绝或要求审查代理人想要做的事情,以及行动的批准范围。 |
suppression | 删除联系人,更改选择退出和编辑消息。 |
LELEMON_MCP_ALLOW=keys,approvals
上传和下载
只接受的操作 multipart/form-data (文件上传)或用二进制文件回答不能是工具,所以它们被忽略了。同时接受多部分和JSON的操作,例如使用 text,通过JSON公开。在开始时,服务器将打印遗漏的操作,以确定原因。
不做两次就重新尝试
每一个创造东西或有副作用的工具都需要一个 idempotencyKey. 发送消息或花钱的工具(效果) money)需要它:模型选择一个键并记住它。对于其他密钥,当您省略它时将生成一个密钥。
这些工具的每个结果和每个错误都返回它使用的键作为自己的键 idempotencyKey: <key> 块和错误内部。当调用失败或超时时,使用相同的键重试:如果第一次调用成功,API将使用原始结果进行应答,而不是再次执行。
错误
错误命名工具和参数,而不是路由或标头。
- 在调用API之前发现的错误将作为工具错误返回
code(unknown_argument,missing_argument,invalid_argument),参数的名称,以及有效参数列表。 api_unreachable和timeout(调用等待50秒,小于MCP客户端默认等待的60秒,因此客户端得到这个错误,而不是它自己的错误-32001)表示是否使用相同的重试idempotencyKey. 等待时间少于50秒的客户端首先放弃。invalid_response意味着API回答成功,但答案不是工具文档的JSON对象。电话通了。- 来自API的错误保留其
code,message和fix,fix.endpoint作为工具名称和fix.param作为参数名。
它一开始就下载了什么
每次启动时,服务器都会下载 GET <LELEMON_API_URL>/v2/openapi.json (15秒限制)和 GET <LELEMON_API_URL>/v2/me 用你的钥匙。如果其中一个失败,它将退出,代码为1,并在stderr上显示一条消息,说明它尝试了哪个URL以及要检查什么。当它启动时,它打印一行代码:名称和版本、公开的工具数量和子帐户。
它只发送你的密钥到 LELEMON_API_URL.
开发
pnpm --filter @lelemon-ai/mcp typecheck
pnpm --filter @lelemon-ai/mcp test
pnpm --filter @lelemon-ai/mcp build
读取实际合同使用的测试 apps/docs/api/openapi.v2.json. 点 LELEMON_OPENAPI_FILE 在另一个文件中进行测试。
许可证
麻省理工学院,莱蒙SpA。