云雀MCP
Starlark驱动的MCP(模型上下文协议)服务器,通过Starlark脚本实现动态工具加载。
概述
为什么是星雀?
- 无汇编:用Python编写工具,如Starlark,不需要Rust/Go/TypeScript
- 热重新加载:自动检测并重新加载扩展名的更改
- 丰富的运行时间:内置HTTP、数据库、系统命令等模块
- 安全:使用显式命令白名单进行沙盒执行
- 可测试的:包括基于公约的测试框架
- 生产就绪:单一二进制、最小依赖、跨平台
建筑一瞥
MCP Client (Claude Desktop, Zed, etc.)
↓ stdio (JSON-RPC)
MCP Server Layer (rmcp)
↓
Starlark Engine (loads & executes .star files)
↓
Extensions (.star files in extensions/)
↓ via modules
Built-in Capabilities (http, exec, sqlite, postgres, etc.)看 docs/ARCHITECTURE.md 获取详细的架构文档。
主要特点
动态拉伸加载
- 掉落
.star文件进入extensions/目录 - 无需编译或重新启动服务器
- 热重新加载自动检测更改
丰富的模块系统
- 超文本传输协议:REST API集成(
http.get(),http.post()) - 执行:带白名单的CLI工具包装器(
exec.run()) - sqlite/postgres:数据库集成
- 数学:数学运算
- 时间:时间戳
- 环境:环境变量访问
看 docs/MODULES.md 以获取完整的模块参考。
内置测试框架
- 在中编写测试
*_test.star文件 - 基于惯例的测试发现
- 包含断言库
- 与一起跑步
starlark-mcp --test
看 docs/TEST.md 用于测试指南。
安全
- 云雀沙盒:默认情况下没有文件I/O或网络访问
- 高管白名单:扩展必须声明允许的命令
- 进程隔离:将流程与MCP客户端分开
快速开始
安装
npm(推荐)
# Run directly with npx (no install needed)
npx starlark-mcp
# Or install globally
npm install -g starlark-mcp来源
# Clone repository
git clone https://github.com/connyay/starlark-mcp.git
cd starlark-mcp
# Build release binary
cargo build --release
# Binary will be at: target/release/starlark-mcp预构建二进制文件
下载自 对于您的平台:
- Linux(x86_64,ARM64)
- macOS(x86_64,ARM64)
- Windows(x86_64)
运行服务器
# Start server with default extensions directory
starlark-mcp
# Use custom extensions directory
starlark-mcp --extensions-dir /path/to/extensions
# Run tests
starlark-mcp --test启动服务器时会发生什么:
- 全部加载
.star扩展自./extensions/目录 - 启动MCP服务器侦听stdin
- 监视扩展文件更改(启用热重新加载)
- 记录到stderr
看 docs/CLI_REFERENCE.md 获取完整的CLI文档。
与MCP客户端集成
克劳德桌面版
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"starlark": {
"command": "/path/to/starlark-mcp",
"args": ["--extensions-dir", "/path/to/extensions"],
"env": {
"MY_API_KEY": "your-api-key-here"
}
}
}
}Zed编辑
添加到Zed配置:
{
"context_servers": {
"starlark-mcp": {
"command": {
"path": "/path/to/starlark-mcp",
"args": ["--extensions-dir", "/path/to/extensions"]
}
}
}
}您的第一次延期
创建 extensions/hello.star:
def say_hello(params):
"""Say hello to someone"""
name = params.get("name", "World")
return {
"content": [{"type": "text", "text": "Hello, {}!".format(name)}],
}
def describe_extension():
return Extension(
name = "hello",
version = "1.0.0",
description = "Simple greeting extension",
tools = [
Tool(
name = "say_hello",
description = "Say hello to someone",
parameters = [
ToolParameter(
name = "name",
param_type = "string",
required = False,
default = "World",
description = "Name to greet",
),
],
handler = say_hello,
),
],
)服务器将自动检测并加载新扩展(热重新加载)。无需重新启动!
扩展示例
简单扩展(无依赖关系)
包括 cat_facts.star 演示了一个基本扩展:
def get_cat_fact(params):
"""Returns a random cat fact"""
facts = [
"Cats sleep 12-16 hours a day.",
"A group of cats is called a 'clowder'.",
"Cats have over 30 muscles in each ear.",
]
index = time.now() % len(facts)
return {
"content": [{"type": "text", "text": facts[index]}],
}
def describe_extension():
return Extension(
name = "cat_facts",
version = "1.0.0",
description = "Fun facts about cats",
tools = [
Tool(
name = "get_cat_fact",
description = "Get a random fact about cats",
handler = get_cat_fact,
),
],
)HTTP API集成
def get_weather(params):
"""Get weather from an API"""
city = params.get("city", "")
if not city:
return error_response("city parameter is required")
response = http.get(
url = "https://api.weather.gov/...",
headers = {"User-Agent": "starlark-mcp"}
)
if response.get("status_code", 0) != 200:
return error_response("API request failed")
data = response.get("json", {})
# Format and return data...CLI工具包装器
def list_repos(params):
"""List GitHub repositories using gh CLI"""
org = params.get("org", "")
if not org:
return error_response("org parameter is required")
result = exec.run("gh", ["repo", "list", org, "--json", "name"])
if not result["success"]:
return error_response(result["stderr"])
repos = json.decode(result["stdout"])
# Format and return repos...
def describe_extension():
return Extension(
name = "github",
allowed_exec = ["gh"], # Required for exec.run()
tools = [...],
)数据库集成
def query_users(params):
"""Query SQLite database"""
db_path = params.get("db_path", "")
query = "SELECT * FROM users WHERE active = ?"
results = sqlite.query(db_path, query, [True])
# Format and return results...看 docs/EXTENSION_DEVELOPMENT.md 获取包含模式、最佳实践和反模式的全面扩展开发指南。
示例扩展
该存储库包括11个示例扩展:
- cat_fact:简单事实(无依赖关系)
- 天气:美国国家气象局API集成
- GitHub:GitHub CLI包装器
- 码头工人:Docker CLI包装器
- kubectl 的:Kubernetes CLI包装器
- Postgres:PostgreSQL数据库工具
- SQLite:SQLite数据库工具
- 飞机:Plane.so API集成
- 还有更多。..
探索 extensions/ 完整示例的目录。
文档
核心文件
- README.md -此文件(概述和快速入门)
- docs/ARCHITECTURE.md -系统架构与设计
- docs/CLI_REFERENCE.md -完整的CLI文档
扩展开发
- docs/EXTENSION_DEVELOPMENT.md -扩展开发指南
- docs/MODULES.md -内置模块参考
- docs/TEST.md -测试框架指南
Claude代码集成
- .claude/技能/创建扩展/SKILL.md -人工智能辅助扩展创建
开发工作流程
1.写入扩展名
# Create new extension
vim extensions/my_extension.star
# Extension is automatically loaded (hot reload)2.测试扩展
# Write tests
vim extensions/my_extension_test.star
# Run tests
starlark-mcp --test3.在MCP客户端中使用
将您的MCP客户端(Claude Desktop、Zed等)配置为使用starlark MCP,然后在对话中自然地使用您的工具。
贡献
欢迎投稿!拜托:
- 阅读 docs/EXTENSION_DEVELOPMENT.md 发展模式
- 为新功能编写测试
- 遵循现有代码样式
MCP协议支持
支持的MCP协议版本:
- 2024-11-05
- 2025-03-26
- 2025-06-18
支持的功能:
tools随着listChanged: true(热重载支持)
支持的MCP方法:
initialize-服务器初始化和能力协商initialized-初始化确认tools/list-列出可用工具tools/call-执行工具
许可证
麻省理工学院
