动态工具生成服务器

Skillz是一个支持AI运行时动态创建和执行自定义工具(WASM/脚本)的MCP服务器,无需部署或重启,适用于AI辅助开发场景。

  • by Algiras
  • Rust
  • 本地部署
  • 33 星标
  • 更新于
在 GitHub 查看 Algiras/skillz

使用说明

🚀 Skillz-自扩展MCP服务器

在运行时构建和执行自定义工具。让你的AI创建自己的工具。

安装 • 配置 • 特性 • 例子 • 文档


🎯 为什么是斯基尔茨?

传统的MCP服务器有一套固定的工具。 Skillz让你的人工智能动态创建新工具。

❌ 传统MCP

🔒 固定工具集
写入服务器代码

⬆️ 部署并重新启动
重新启动编辑器

⏱️ 耗时的
人工处理

✅ 斯基尔茨

🔧 动态工具
AI编写代码

⚡ 瞬间
编译为WASM/脚本

🚀 零停机
无需重新启动

示例:“为我构建一个获取天气数据的工具”→ AI编写代码→ 工具立即可用。

没有部署。没有重新启动。问吧。


⚡ 安装

# Install WASM target (required for building tools)
rustup target add wasm32-wasip1

# Install Skillz from crates.io
cargo install skillz

⚠️ 重要:确保 ~/.cargo/bin 在您的PATH中,因此您的编辑器可以找到 skillz 可执行。

或者从源代码构建:

git clone https://github.com/Algiras/skillz.git
cd skillz/mcp-wasm-host
cargo install --path .

☕ 支持Skillz

如果您认为Skillz有用,请考虑支持其开发:

您的支持使新功能和改进成为可能!


🔧 编辑器配置

光标IDE

添加到 ~/.cursor/mcp.json:

{
  "mcpServers": {
    "skillz": {
      "command": "skillz"
    }
  }
}

2.配置MCP客户端

将以下内容添加到MCP设置文件中(例如。, ~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "skillz": {
      "command": "/Users/YOUR_USERNAME/.cargo/bin/skillz"
    }
  }
}

[!提示] 如果你遇到 spawn skillz ENOENT 错误,这意味着您的客户端找不到二进制文件。使用 绝对路径 (通常 ~/.cargo/bin/skillz)修复此问题!

备注:如果 skillz 不在您的PATH中,请使用: ~/.cargo/bin/skillz

HTTP服务器模式 (v0.4.0+)

将Skillz作为HTTP服务器运行以进行web集成:

# Start HTTP server on port 8080
skillz --transport http --port 8080

# Custom host binding
skillz --transport http --host 0.0.0.0 --port 3000

# Enable hot reload (watch tools directory for changes)
skillz --hot-reload

# HTTP server with hot reload
skillz --transport http --port 8080 --hot-reload

终点:

  • GET /sse -服务器发送事件流以进行实时更新
  • POST /message -发送JSON-RPC消息

使用curl连接:

# Establish SSE connection
curl -N http://localhost:8080/sse -H 'Accept: text/event-stream'

# Send a message (in another terminal)
curl -X POST http://localhost:8080/message \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

🎯 特性

🌟 核心能力

特性 描述
🦀 WASM工具 编译Rust→ 运行时的WebAssembly
📦 铁锈箱 将serde、regex、anyhow等添加到WASM工具中!
📜 脚本工具 Python、Node.js、Ruby、Bash或任何语言
🔌 MCP集成 导入外部stdio MCP服务器,在命名空间下公开工具
🏷️ 工具注释 客户端提示(只读、破坏性、幂等)
⚡ 代码执行 通过代码编写多个工具(节省98%的代币!)
📦 依赖项 每个工具自动安装pip/npm/cargo包
🐳 Docker服务 定义和管理Docker服务工具依赖于
💾 持久性 工具在服务器重启后仍然有效
🔒 沙盒 可选的气泡膜/防火墙/nsjail隔离
📂 可共享的 每个工具都有自己的manifest.json目录
📖 动态指南 内置 skillz://guide 资源自动更新
🌐 工具导入 从GitHub仓库或Gist导入工具
⛓️ 管道 以声明方式将工具链接在一起
🌍 HTTP传输 使用SSE作为HTTP服务器运行web应用程序
💬 引出 脚本可以通过MCP协议请求用户输入
🧠 记忆 支持TTL的持久键值存储
📦 资源 工具可以列出和读取服务器资源
🔐 秘密 转发 SKILLZ_* env变量到工具
🔗 工具/电话 工具可以调用其他已注册的工具
📡 流媒体 通过流块进行渐进式输出
📊 日志记录/进度 脚本可以发送日志和进度更新
🔥 热重新加载 监视工具目录,更改时自动重新加载
📦 版本控制 更新时自动备份,回滚到任何版本
🔔 订阅 订阅资源更新,收到更改通知
📋 列表已更改 热重载发出MCP列表更改通知
🎯 _元支持 从MCP请求转发的进度令牌
⛔ 取消 处理运行工具的取消请求
💡 内置提示 通过MCP协议创建工具的6个本地提示
🎭 渐进式披露 工具仅在技能激活时显示
📦 技能包 激活多种技能 @bundle-name
🔗 技能依赖性 技能可以声明依赖关系,自动激活
🤖 LLM发现 suggest_skill 使用抽样推荐技能
📚 Git技能库 从GitHub克隆技能仓库 add_skill_repo
🎓 知识技能 SKILL.md文件作为提示(兼容Claude Skills)

📖 可用工具(15芯)

工具 说明
build_tool 编译Rust代码→ WASM工具(具有机箱依赖关系)
register_script 使用deps注册脚本工具(Python、Node.js等)
call_tool 执行任何工具(WASM、脚本、管道或MCP)
list_tools 列出所有可用工具
delete_tool 取下工具并清理干净
import_tool 从Git仓库或GitHub Gists导入工具
import_mcp 在命名空间下注册外部MCP服务器
execute_code 运行组成多个工具的代码
pipeline 创建、列出、删除管道工具(基于操作)
memory 工具的持久存储(存储、获取、列表、删除、统计)
version 列出版本,回滚到以前,查看版本信息
services 为工具定义和管理Docker服务
activate_skill 启用技能(或 @bundle)使其工具可见
deactivate_skill 隐藏技能工具以减少噪音
suggest_skill LLM提供的技能建议
add_skill_repo 从Git(GitHub等)克隆技能库

📚 技能库

从Git仓库导入技能(与Claude skills格式兼容):

# First, activate dev tools
activate_skill(name="dev")

# Import a skill repository
add_skill_repo(url="https://github.com/kepano/obsidian-skills")
# → "Added repo 'obsidian-skills' with 3 skills: obsidian-markdown, obsidian-bases, json-canvas"

# Import awesome-claude-skills (23+ skills!)
add_skill_repo(url="https://github.com/ComposioHQ/awesome-claude-skills", branch="master")
# → "Added repo 'awesome-claude-skills' with 23 skills: mcp-builder, webapp-testing, ..."

支持的仓库布局:

  • skills/skill-name/SKILL.md (卡帕诺/黑曜石技能风格)
  • skill-name/SKILL.md 根(ComposioHQ/令人敬畏的克劳德技能风格)

技能显示为提示 -使用 prompts/get(name="skill-name") 检索知识。


🎭 渐进式披露

工具被组织成可以激活/停用的技能:

# See what's available
suggest_skill(context="I want to build an MCP server")
# → "Suggested skills: dev, mcp-builder"

# Activate skills
activate_skill(name="dev")        # Enable developer tools
activate_skill(name="@dev-full")  # Enable bundle: dev + sys + memory

# Create a tool (it's hidden by default)
register_script(name="my-tool", code="...")
activate_skill(name="my-tool")    # Now it's visible

# Hide when done
deactivate_skill(name="my-tool")

虚拟技能:

技能 工具
dev register_script, build_tool, import_mcp, add_skill_repo等等。
sys pipeline, services, call_tool_internal
memory memory

捆绑包 (~/.gemini/skills/bundles.json):

{
  "@dev-full": ["dev", "sys", "memory"],
  "@creators": ["dev"]
}

💡 快速示例

🔥 查看Skillz在行动

🦀 构建WASM工具(Rust)

build_tool(
  name: "fibonacci",
  description: "Generates Fibonacci numbers",
  code: "fn main() { 
    let (mut a, mut b) = (0u64, 1); 
    for _ in 0..20 { print!(\"{} \", a); (a, b) = (b, a + b); } 
  }",
  annotations: {"readOnlyHint": true}
)

🔌 导入外部MCP服务器

# Register a stdio MCP server - all its tools become available under a namespace
import_mcp(
  name: "time",
  command: "uvx",
  args: ["mcp-server-time"],
  description: "Time utilities from MCP server"
)

# Now use its tools with the namespace prefix
call_tool(tool_name: "time_get_current_time", arguments: {"timezone": "UTC"})

# Use MCP tools in pipelines!
pipeline(
  action: "create",
  name: "world_clock",
  steps: [
    { name: "ny", tool: "time_get_current_time", args: { timezone: "America/New_York" } },
    { name: "london", tool: "time_get_current_time", args: { timezone: "Europe/London" } },
    { tool: "word_counter", args: { text: "NY: $ny.datetime, London: $london.datetime" } }
  ]
)

备注:只有 标准 支持MCP服务器(命令+参数)。HTTP/SSE服务器尚不受支持。


> **🤖 For LLMs & Advanced Users**  
> See [docs/LLM_GUIDE.md](docs/LLM_GUIDE.md) for detailed technical specifications, JSON-RPC protocols, script templates, and advanced usage examples.

---

## 🔧 Environment Variables

| Variable | Description | Example |
|----------|-------------|---------|
| `TOOLS_DIR` | Where tools are stored | `~/.skillz/tools` |
| `SKILLZ_ROOTS` | Workspace roots (colon-separated) | `/home/user/project:/data` |
| `SKILLZ_SANDBOX` | Sandbox mode | `bubblewrap`, `firejail`, `nsjail` |
| `SKILLZ_SANDBOX_NETWORK` | Allow network in sandbox | `1` |
| `SKILLZ_*` | **Forwarded to tools** (for secrets) | `SKILLZ_OPENAI_KEY=sk-...` |

**Root Priority:** MCP client roots > `SKILLZ_ROOTS` env > cwd

### 🔐 Secrets via Environment Variables

All `SKILLZ_*` prefixed env vars are forwarded to script tools:

```bash
# Set secrets in your shell
export SKILLZ_OPENAI_KEY="sk-..."
export SKILLZ_API_TOKEN="your-secret"
export SKILLZ_DEBUG="1"

通过以下方式访问工具 context.environment:

env = request["params"]["context"]["environment"]
api_key = env.get("SKILLZ_OPENAI_KEY")

注: 仅 SKILLZ_* var被转发。其他环境变量不会暴露给安全工具。


🐳 Docker服务

工具可以声明对Docker服务(数据库、缓存等)的依赖关系。当工具运行时,Skillz会检查所需的服务是否正在运行,并注入连接环境变量。

定义服务

services(
  action: "define",
  name: "postgres",
  image: "postgres:15",
  ports: ["5432"],
  env: {"POSTGRES_PASSWORD": "dev"},
  volumes: ["data:/var/lib/postgresql/data"],
  healthcheck: {
    cmd: "pg_isready -U postgres",
    interval: "2s",
    retries: 15
  }
)

管理服务

# List all defined services
services(action: "list")

# Start a service
services(action: "start", name: "postgres")

# Check status (running, ports, health)
services(action: "status", name: "postgres")

# View logs
services(action: "logs", name: "postgres", tail: 100)

# Stop/remove services
services(action: "stop", name: "postgres")
services(action: "remove", name: "postgres")

# Cleanup unused services
services(action: "prune")

具有服务依赖关系的工具

注册需要服务的工具:

register_script(
  name: "user_manager",
  description: "Manage users in PostgreSQL",
  interpreter: "python3",
  requires_services: ["postgres"],  # Tool requires postgres to be running
  dependencies: ["psycopg2-binary"],
  code: """
import json, sys, os
import psycopg2

request = json.loads(sys.stdin.readline())
args = request["params"]["arguments"]

# Connection details injected by Skillz
conn = psycopg2.connect(
    host=os.environ["POSTGRES_HOST"],  # Auto-injected
    port=os.environ["POSTGRES_PORT"],  # Auto-injected
    user="postgres",
    password="dev",
    dbname="postgres"
)
# ... your code
"""
)

通话时 user_managerSkillz将:

  1. 检查是否 postgres 服务正在运行
  2. 如果未运行,请使用fix命令返回一个有用的错误
  3. 如果正在运行,请注射 POSTGRES_HOST 和 POSTGRES_PORT 环境变量

卷类型

类型 语法 描述
命名 data:/path Docker管理的卷,前缀为 skillz_
绑定 /host/path:/container/path 将主机目录装载到容器中

🔒 安全

平台支持

🛡️ 沙盒模式(仅限Linux)

通过环境变量启用沙盒:

Sandbox Security Level Features
🟢 bubblewrap Medium Namespace isolation
🟡 firejail High seccomp + namespaces
🔴 nsjail Very High Most restrictive

配置:

# Bubblewrap (namespace isolation)
export SKILLZ_SANDBOX=bubblewrap

# Firejail (seccomp + namespaces)
export SKILLZ_SANDBOX=firejail

# nsjail (most restrictive)
export SKILLZ_SANDBOX=nsjail

# Allow network in sandbox
export SKILLZ_SANDBOX_NETWORK=1

📖 看 安全.md 了解全部细节。


🛠️ 发展

git clone https://github.com/Algiras/skillz.git
cd skillz
cargo build --release
cargo test

🤝 贡献

看 贡献.md 作为指导方针。


📄 许可证

MIT许可证-请参阅 许可证


🔗 链接

资源 链接
📦 板条箱.io crates.io/crates/skillz
📖 文档 阿尔及尔.伊苏布.io/killz
💻 GitHub github/Algiras/skillz
📋 MCP规范 模型上下文协议.io

建于❤️ 用于人工智能驱动的开发