03. 工具、权限、Skills 与 MCP
这一章会把 clean SDK 里“真正干活”的能力讲清楚:工具怎么接、权限怎么管、skills 怎么用、MCP 又处在什么位置。
1. 先分清:工具和 Skill 不是一回事
- 工具:负责直接执行动作,比如读写文件、搜索、委派任务、操作浏览器或桌面。
- Skill:更像一套预设工作方式,用来组织模型如何思考、如何执行、什么时候调用工具。
你可以把它理解成:
- 工具决定“能做什么”
- Skill 决定“怎么做这件事更稳、更像一个固定工作流”
2. clean SDK 里有哪些工具
clean SDK 当前可以组合这些工具来源:
- 你自己用
tool(...)定义的本地工具 createActoviqFileTools(...)生成的文件工具createActoviqComputerUseToolkit(...)生成的 computer-use 工具- 注册 named agents 后自动出现的
Task委派工具 - 通过 MCP 挂进来的外部工具
最常见的内置 clean 工具面包括:
ReadWriteEditGlobGrepTaskcomputer_*一组桌面/浏览器替代工具
3. 如何查看当前有哪些工具
ts
const tools = await sdk.tools.listMetadata();
const catalog = await sdk.tools.getCatalog();
console.log(tools);
console.log(catalog.byCategory.file);
console.log(catalog.byCategory.computer);每个工具元数据会告诉你:
namedescriptionprovidercategoryreadOnlymutating
仓库示例:
4. 自定义本地工具
ts
import { z } from 'zod';
import { createAgentSdk, tool } from 'actoviq-agent-sdk';
const addNumbers = tool(
{
name: 'add_numbers',
description: 'Add two numbers together.',
inputSchema: z.object({
a: z.number(),
b: z.number(),
}),
},
async ({ a, b }) => ({ sum: a + b }),
);
const sdk = await createAgentSdk({
tools: [addNumbers],
});5. Skills:clean SDK 现在已经可以直接用
当前 clean SDK 已经支持:
- bundled skills
- 自定义 skills
- 从
~/.actoviq/skills、.actoviq/skills自动加载 skills inline/fork两种运行模式
常用入口:
ts
console.log(sdk.skills.listMetadata());
const debugResult = await sdk.runSkill(
'debug',
'请分析这个仓库在发布前最应该优先验证哪些内容。',
);
const session = await sdk.createSession({ title: 'Skill Demo' });
const rememberResult = await session.runSkill(
'remember',
'记住:发版前必须等待 CI 和 npm pack --dry-run 都通过。',
);注册自定义 skill:
ts
import { createAgentSdk, skill } from 'actoviq-agent-sdk';
const sdk = await createAgentSdk({
skills: [
skill({
name: 'release-check',
description: '检查发布准备情况并总结阻塞项。',
prompt: 'You are executing the /release-check skill.\\n\\nTask:\\n$ARGUMENTS',
}),
],
});仓库示例:
6. Dream:长期记忆整合
clean SDK 现在也已经有独立的 dream 能力,用来对最近若干会话做一次记忆整合。
常用入口:
ts
const state = await sdk.dreamState();
console.log(state);
const session = await sdk.createSession({ title: 'Dream Demo' });
const dreamResult = await session.dream({
extraContext: '把最近关于发布流程、工具使用方式和稳定约束整理成长期记忆。',
});
console.log(dreamResult.result?.text);自动 dream 入口:
ts
await sdk.memory.updateSettings({ autoDreamEnabled: true });
await sdk.maybeAutoDream({
currentSessionId: session.id,
background: true,
});仓库示例:
7. 权限、classifier、approver
如果你不希望 agent 任意调用工具,可以配权限层。
直接给规则
ts
const sdk = await createAgentSdk({
permissions: [
{ toolName: 'Read', behavior: 'allow' },
{ toolName: 'Write', behavior: 'ask' },
],
});用 classifier 做自动判断
ts
const sdk = await createAgentSdk({
classifier: ({ publicName, input }) => {
if (publicName === 'Write') {
return {
behavior: 'ask',
reason: `Write needs manual review: ${JSON.stringify(input)}`,
};
}
},
});用 approver 接管 ask
ts
const sdk = await createAgentSdk({
approver: ({ publicName }) => {
if (publicName === 'Write') {
return { behavior: 'allow', reason: 'Approved for this run.' };
}
return { behavior: 'deny', reason: 'Unexpected tool.' };
},
});8. MCP 是干嘛的
MCP 的作用是把“外部工具服务器”接进 SDK。
例如:
ts
import {
createAgentSdk,
stdioMcpServer,
} from 'actoviq-agent-sdk';
const sdk = await createAgentSdk({
mcpServers: [
stdioMcpServer({
name: 'filesystem',
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-filesystem', '.'],
}),
],
});9. clean 命令式 helper
clean SDK 现在也有不依赖 bridge 的命令式 helper:
ts
console.log(sdk.slashCommands.listMetadata());
const contextResult = await sdk.slashCommands.run('context');
const memoryResult = await sdk.slashCommands.run('memory', {
sessionId: 'your-session-id',
});
const dreamResult = await sdk.slashCommands.run('dream', {
sessionId: 'your-session-id',
args: '把最近稳定的项目约束整理进长期记忆。',
});当前可用的 clean 命令替代包括:
contextcompactmemorydreamtoolsskillsagents
下一章: