使用说明
技能编排器MCP服务器
一个自我进化的MCP(模型上下文协议)服务器,使AI代理能够动态创建、管理和执行可重用的技能。实现Anthropic的“使用MCP执行代码”模式,以实现上下文高效的代理工具交互。
目录
- 愿景:与你共同成长的人工智能
- 关键能力
- 为什么这很重要:令牌效率和上下文管理
- AI代理如何利用该系统
- 可用工具
- 技能构成体系
- 调试与开发
- 配置
- 存储体系结构
- 技能类别
- 快速开始
- 使用示例
- 建筑
- 安全注意事项
- 未来路线图
- 背景与灵感
- 贡献
- 许可证
愿景:与你共同成长的人工智能
传统的人工智能交互是无状态的——每次对话都是从头开始的,复杂的操作会用中间数据淹没上下文窗口。技能编排者改变了这一基本限制:
之前: 人工智能在上下文中处理一切,在会话之间丢失工作,反复重新发现解决方案。
之后: 人工智能创造了积累知识的持久、可组合的技能。它减轻了繁重的计算负担,跨会话维护内存,并随着时间的推移构建领域专业知识。
这不仅仅是一个工具服务器,它还是 人工智能自我提升 和 上下文高效操作.
关键能力
动态技能注册表
- 创建 在对话过程中实时可重用的代码模式
- 商店 在整个课程中持续使用的技能
- 搜索 按名称、描述、类别或标签列出的技能(渐进式发现)
- 调用 参数技能
- 编排 通过调用其他技能(技能链)来获取技能
- 版本 更新时自动技能
代码执行引擎
- 执行 孤立子流程环境中的Python代码
- 注入 将上下文变量放入执行命名空间
- 捕捉 stdout、stderr和返回值
- 超时 具有真实进程边界的保护
- 调试助手 内置(debug_context、pretty_print)
状态持久性
- 商店 使用点符号键进行对话状态
- 组织 为不同的项目/域提供命名空间
- 轨道 工作流进度、偏好和决策
- 分享 技能和会话之间的状态
伪影系统(带外存储)
- 商店 无洪泛上下文的大输出
- 检索 根据需要分块显示内容
- 基于TTL 自动清理到期
- 基于手柄 参考文献
artifact://...)为了提高效率
渐进式发现
- 搜索 不加载代码的元数据技能
- 过滤器 按类别、标签或文本查询
- 分页 大型技能库的结果
- 负载 仅在需要检查时提供完整定义
为什么这很重要:令牌效率和上下文管理
传统的MCP用法通过上下文窗口传递工具定义和结果,消耗了过多的令牌。代码执行模式解决了这个问题:
| 问题 | 解决方案 |
|---|---|
| 大数据洪流背景 | 本地处理 execute_code,仅返回结果 |
| 重复复杂的逻辑 | 创建一项技能,永远按名称调用 |
| 中间结果 | 存储为工件,根据需要检索块 |
| 会话状态丢失 | 保留状态命名空间,调用下一个会话 |
| 工具定义膨胀 | 渐进式披露-搜索元数据,按需加载代码 |
| 重新发现解决方案 | 技能积累-一次构建,随处使用 |
现实世界影响: Anthropic的研究表明,对于数据量大的操作,这种模式可以将上下文使用率降低98%以上。
AI代理如何利用该系统
1.上下文卸载
与其在对话上下文中处理大型数据集:
# DON'T: Pass 10MB CSV through context
# DO: Process locally, return summary
await execute_code({
"code": """
import pandas as pd
df = pd.read_csv('/path/to/large.csv')
summary = {
'rows': len(df),
'columns': list(df.columns),
'sample': df.head(3).to_dict()
}
__result__ = summary
""",
"return_mode": "summary" # Returns preview + artifact handle
})
2.通过技能创造实现自我提升
当发现一个有用的模式时,将其编码为一种技能:
# Discovered a good codebase mapping approach? Save it:
await create_skill({
"name": "context_efficient_codebase_mapper",
"description": "Maps unfamiliar codebases without flooding context",
"code": "...", # The pattern you discovered
"tags": ["codebase", "analysis", "context-efficiency"]
})
# Now available in all future conversations!
3.建立领域专业知识
为不同领域创造专业技能:
- 游戏开发: 决策记录、资产管道、设计模式助手
- 数据科学: 处理管道、可视化生成器、报表生成器
- 写作: 风格一致的生成器、编辑工作流程、研究组织者
- DevOps: 部署自动机、监控分析器、事件响应者
4.记忆与连续性
状态系统启用持久内存:
# End of session - save context
await set_state({
"key": "session.last_task",
"value": {"file": "server.py", "line": 450, "task": "implementing composition"},
"namespace": "project_x"
})
# Next session - recall context
state = await get_state("session.last_task", "project_x")
# AI knows exactly where you left off
5.复杂工作流程的技能构成
从简单的原语构建复杂的管道:
# A parent skill that orchestrates multiple child skills
comprehension = invoke_skill('domain_context_switcher', {'action': 'detect', 'message': user_input})
session_data = invoke_skill('persistent_session_context', {'action': 'recall', 'domain': comprehension['domain']})
tasks = invoke_skill('omni_task_manager', {'action': 'list', 'domain': comprehension['domain']})
# Combine results into intelligent response
__result__ = {
'context': comprehension,
'session': session_data,
'relevant_tasks': tasks,
'call_depth': __call_depth__
}
可用工具(15个MCP工具)
技能管理
| 工具 | 说明 |
|---|---|
create_skill |
使用代码、元数据和示例创建新的可重用技能 |
invoke_skill |
使用参数和上下文执行存储的技能 |
get_skill |
获取完整的技能细节,包括代码 |
update_skill |
更新现有技能的代码、描述或标签 |
delete_skill |
永久删除技能 |
search_skills |
分页搜索和过滤技能 |
代码执行
| 工具 | 说明 |
|---|---|
execute_code |
在隔离的子流程环境中执行Python代码 |
工件管理
| 工具 | 说明 |
|---|---|
store_artifact |
带外存储大量内容,退货 artifact://... 手柄 |
get_artifact |
以块的形式检索工件内容(防止上下文泛滥) |
状态管理
| 工具 | 说明 |
|---|---|
set_state |
以持久状态存储值(支持点表示法) |
get_state |
从状态检索值 |
list_state |
使用分页列出命名空间中的所有键 |
公用事业
| 工具 | 说明 |
|---|---|
list_categories |
列出可用技能类别 |
get_orchestrator_status |
获取服务器状态、统计信息和存储信息 |
MCP资源
| 资源 | 描述 |
|---|---|
skills://list |
按用法列出前200项技能 |
skills://{name} |
按名称获取特定技能 |
技能构成体系
技能可以调用其他技能,实现强大的组合模式。这将孤立的实用程序转换为可组合的构建块。
组合功能(所有技能都有)
# Call another skill and get its __result__
result = invoke_skill('child_skill', {'param': 'value'}, {'context': 'data'})
# List all available skills (name -> description dict)
skills = list_available_skills()
# Get metadata about a skill without invoking it
info = get_skill_info('some_skill')
# Context variables available in all skills:
# __call_depth__ - Current nesting depth (1 for top-level, 2 for first child, etc.)
# __parent_skill__ - Name of the calling skill (None for top-level)
# __skill_name__ - Current skill's name
安全功能
| 特性 | 描述 |
|---|---|
| 递归检测 | 通过清晰的堆栈跟踪检测并阻止循环调用 |
| 深度限制 | 最多10层深度(可配置) |
| 错误信息 | 当出现“未找到”错误时显示可用技能 |
| 堆栈跟踪 | 错误中可见完整的呼叫链 |
示例:编写工作流
# Parent skill that orchestrates multiple children
await create_skill({
"name": "smart_assistant",
"description": "Context-aware assistant using skill composition",
"code": """
message = params.get('message', '')
# 1. Understand the domain context
context = invoke_skill('domain_context_switcher', {
'action': 'detect',
'message': message
})
# 2. Load session history
session = invoke_skill('persistent_session_context', {
'action': 'recall',
'domain': context.get('primary_domain')
})
# 3. Get relevant tasks
tasks = invoke_skill('omni_task_manager', {
'action': 'list',
'filters': {'domain': context.get('primary_domain')}
})
__result__ = {
'response': f'Processed: {message}',
'domain_context': context,
'session_history': session,
'relevant_tasks': tasks,
'composition_depth': __call_depth__
}
""",
"category": "workflow",
"tags": ["assistant", "composition", "context-aware"]
})
调试与开发
内置调试助手
所有技能执行都可以访问调试实用程序:
# Inspect all available variables in execution context
debug_context(**locals())
# Output:
# === Execution Context Debug ===
# params: dict = {'file': 'data.csv'}
# context: dict = {'env': 'production'}
# __call_depth__: int = 1
# ===============================
# Pretty-print JSON-serializable objects
pretty_print({"users": [{"name": "Alice"}, {"name": "Bob"}]})
# Output:
# {
# "users": [
# {"name": "Alice"},
# {"name": "Bob"}
# ]
# }
增强的错误消息
当技能失败时,错误消息包括:
- 带有行号的完整回溯
- 可用上下文变量列表
- 使用提示
debug_context()供检查
**Error:** name 'undefined_var' is not defined
```traceback...```
**Available context variables:** params, context, __call_depth__, custom_var
**Tip:** Use `debug_context(**locals())` in your skill code to inspect available variables.
配置
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
SKILL_ORCHESTRATOR_DEFAULT_EXECUTION_TIME_SECONDS |
30 | 代码执行的默认超时 |
SKILL_ORCHESTRATOR_MAX_EXECUTION_TIME_SECONDS |
180 | 允许的最大超时时间 |
SKILL_ORCHESTRATOR_TERMINATION_GRACE_SECONDS |
5 | 强制杀人前的宽限期 |
SKILL_ORCHESTRATOR_MAX_CALL_DEPTH |
10 | 最大技能嵌套深度 |
SKILL_ORCHESTRATOR_EXEC_MODE |
子进程 | 执行模式(子进程或进程内) |
超时配置
# Per-call timeout (up to max)
await invoke_skill({
"skill_name": "long_running_skill",
"timeout": 150, # seconds
"return_mode": "full"
})
存储体系结构
~/.skill_orchestrator/
├── skills/
│ ├── skill_name.json # Full skill definition (name, code, metadata)
│ ├── .skill_index.json # Metadata-only index (fast search, excludes code)
│ └── .skill_usage.json # Invocation counts (write-light tracking)
├── state/
│ └── namespace_name.json # Key-value pairs for each namespace
├── sessions/ # Reserved for future use
└── artifacts/
├── {id}.meta.json # Artifact metadata (MIME type, size, TTL)
└── {id}.data # Artifact binary content
存储设计原则
- 渐进式披露: 技能指数仅在需要时排除代码加载
- 写灯: 使用情况统计在单独的文件中,以避免每次调用时重写技能
- 原子操作: 临时文件+重命名模式以确保数据完整性
- 线程安全: 锁定所有共享状态(索引、使用情况、工件)
技能类别
| 类别 | 描述 | 示例用例 |
|---|---|---|
data_processing |
数据转换和分析 | CSV处理、JSON转换 |
file_operations |
文件系统操作 | 批量重命名、目录组织 |
api_integration |
外部API连接 | REST客户端、webhook处理程序 |
text_analysis |
文本处理和NLP | 摘要、提取、格式化 |
automation |
工作流自动化 | 构建管道、部署脚本 |
visualization |
图表和视觉输出 | 数据图、图表 |
computation |
数学和科学计算 | 计算、模拟 |
workflow |
多步骤流水线 | 编排、链接 |
utility |
通用工具 | 助手、转换器 |
custom |
未分类 | 特定领域技能 |
快速开始
安装
# Clone the repository
git clone https://github.com/your-username/skill-orchestrator-mcp
cd skill-orchestrator-mcp
# Install with uv (recommended)
uv venv
source .venv/bin/activate # or .venv\Scripts\activate on Windows
uv sync
运行服务器
# Using the CLI
skill-orchestrator-mcp
# Or directly with Python
python -m skill_orchestrator_mcp.server
# With uvx for development
uvx --from . skill-orchestrator-mcp
为Claude桌面配置
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"skill-orchestrator": {
"command": "path/to/.venv/bin/skill-orchestrator-mcp"
}
}
}
或者使用uvx:
{
"mcpServers": {
"skill-orchestrator": {
"command": "uvx",
"args": ["--from", "/path/to/skill-orchestrator-mcp", "skill-orchestrator-mcp"]
}
}
}
使用示例
培养数据处理技能
await create_skill({
"name": "process_csv_summary",
"description": "Load a CSV and return summary statistics without flooding context",
"code": """
import csv
from pathlib import Path
file_path = params.get('file_path')
sample_rows = params.get('sample_rows', 5)
with open(file_path, 'r') as f:
reader = csv.DictReader(f)
rows = list(reader)
__result__ = {
"file": Path(file_path).name,
"row_count": len(rows),
"columns": list(rows[0].keys()) if rows else [],
"sample": rows[:sample_rows]
}
""",
"category": "data_processing",
"tags": ["csv", "data", "summary"],
"examples": ["Summarize the sales.csv file", "Show me what's in data.csv"]
})
搜索技巧(渐进式发现)
# Search by metadata - doesn't load code (context efficient)
await search_skills({
"query": "csv",
"category": "data_processing",
"limit": 10,
"response_format": "json",
"fields": ["name", "description", "tags"]
})
# Only load code when you need to inspect/modify
await get_skill("process_csv_summary")
调用技能
await invoke_skill({
"skill_name": "process_csv_summary",
"parameters": {
"file_path": "/path/to/data.csv",
"sample_rows": 3
},
"return_mode": "summary", # preview + artifact handle (default)
"timeout": 60
})
直接代码执行
await execute_code({
"code": """
# Process data without passing through context
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtered = [x for x in data if x > 5]
total = sum(filtered)
print(f"Filtered: {filtered}")
print(f"Sum: {total}")
__result__ = {"filtered": filtered, "sum": total}
""",
"timeout": 10,
"return_mode": "summary"
})
状态管理
# Store workflow progress
await set_state({
"key": "workflow.current_step",
"value": {"step": 3, "status": "processing", "started": "2025-01-16T10:00:00Z"},
"namespace": "my_project"
})
# Retrieve later (even in a different conversation)
state = await get_state("workflow.current_step", "my_project")
# List all keys in a namespace
await list_state({
"namespace": "my_project",
"response_format": "json"
})
建筑
┌─────────────────────────────────────────────────────────────────┐
│ Claude / AI Agent │
├─────────────────────────────────────────────────────────────────┤
│ MCP Protocol Layer │
├─────────────────────────────────────────────────────────────────┤
│ Skill Orchestrator MCP Server │
├────────────┬────────────┬────────────┬────────────┬────────────┤
│ Skill │ Code │ State │ Artifact │ Usage │
│ Registry │ Executor │ Manager │ Store │ Tracker │
│ │ (subprocess)│ │ (chunked) │ (batched) │
├────────────┴────────────┴────────────┴────────────┴────────────┤
│ Skill Index │
│ (metadata-only, progressive disclosure) │
├─────────────────────────────────────────────────────────────────┤
│ File System Storage │
│ ~/.skill_orchestrator/{skills,state,artifacts} │
└─────────────────────────────────────────────────────────────────┘
执行流程
- 子进程模式(默认): 使用运行器脚本和有效负载创建临时目录,生成子进程,通过进程边界强制执行真正的超时
- 技能构成: 传递给子流程的所有技能的注册表,启用
invoke_skill()技能范围内的呼叫 - 工件处理: 将大量输出存储到磁盘,返回轻量级句柄
- 渐进式发现: 搜索索引时不加载代码,按需加载完整定义
安全注意事项
- 代码使用单独的Python解释器在隔离的子进程中运行
- 通过进程边界强制执行超时(不能绕过)
- 标准库访问(网络/文件操作时请谨慎使用)
- 输出截断可防止内存问题
- 具有可配置宽限期的优雅终止
# Use subprocess mode (default, recommended)
# SKILL_ORCHESTRATOR_EXEC_MODE=subprocess
# Legacy in-process mode (not recommended - no timeout guarantee)
# SKILL_ORCHESTRATOR_EXEC_MODE=inprocess
未来路线图
- []基于Docker的沙盒执行,增强安全性
- [x] 技能组合和链接(已实现!)
- []常见模式的内置技能模板
- []远程技能分享和发现
- []执行分析和性能跟踪
- []用于API连接技能的OAuth集成
- []用于流输出的WebSocket传输
- []语义技能发现(基于嵌入的搜索)
- []支持回滚的技能版本控制
- []技能测试框架
背景与灵感
此服务器实现了以下模式:
- Anthropic的“MCP代码执行” -大幅减少上下文使用
- Docker MCP网关 -协调多个MCP服务器
- Cloudflare的“代码模式” -TypeScript沙盒执行
贡献
欢迎投稿!请随时提交拉取请求。
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
致谢
- MCP规范和代码执行模式的拟人化
- Docker对MCP网关的启示
- Cloudflare用于代码模式洞察
- FastMCP社区
