Huginn
简洁、可组合,且足够有主见,足以惹恼某些人。
栈
| 项目 | 信息 |
|---|---|
| 语言 | TypeScript — 因为没有类型的JavaScript就是一场混乱。 |
| 运行时 | Bun — 更快、更轻量,而且没有 Node 的味道。 |
| 协议 | 模型上下文协议(通过 @modelcontextprotocol/sdk) |
| 许可证 | MIT —— 随便怎么做,别怪我。 |
Stack rationale
— click if you’re the type who reads EULAs
面包——因为启动时间不应该以咖啡休息的时间来衡量。
TypeScript —— 你未来的自己值得拥有更好的 undefined is not a function [object object]。
@modelcontextprotocol/sdk ——因为重新发明协议是那些讨厌完成项目的人才会做的事。
Huginn实际的功能
维护一个工具注册表(包含名称、模式、处理程序)。
让我们像在1980年代那样,通过标准输入输出(stdio)列出并调用工具,只不过这次是用JSON。
安全执行处理程序,支持超时、中止和结构化日志记录——让您在调试时既能保持专业,又不必因问题而抓狂。
《神圣工具合约》
一切围绕着这份简单的合同展开,一旦你把它搞砸了,Huginn 就会礼貌地什么都不做,并完全忽略你。
{
name: string,
description: string,
inputSchema: Record,
handler: async (args: Record, signal: AbortSignal) => {
content: Array,
isError?: boolean
}
}可以把它看作是OpenAPI的内向表亲——简洁,却又出奇地独特。
入门指南 - 让我们先看看它是否能运行
bun install
bun install-plugins # discover and install plugin dependencies
bun start # starts the MCP server (stdio transport)
# dev: bun dev
# tests: bun test && bun typecheck按压 Ctrl+C 要像文明的人类一样停止它,而不是通过关闭终端窗口。
Available scripts
# Install dependencies
bun install
# Start the MCP server
bun start
# Development with watch mode
bun dev
# Run tests
bun test
bun test:watch # watch mode
bun coverage # with coverage
# Type checking
bun typecheck
# Linting & formatting
bun lint
bun lint:fix
bun format
bun format:write
# Install MCP plugins
bun install-plugins正确添加工具的方法
编辑 src/tools/registry.ts 并放入一个遵循上述契约的对象。
如果你的工具执行时间可能会超过一条推文的长度(即较长时间),请使用提供的 AbortSignal 并用……把它包起来 safeToolExecution。
Example
// src/tools/registry.ts
{
name: 'my_tool',
description: 'Echo text back',
inputSchema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] },
handler: async (args, signal) => ({
content: [{ type: 'text', text: `You sent: ${String(args.text)}` }]
})
}编写一个测试(在……中) test/,因为未来的你会忘记这个工具的作用。
插件系统——为模块化思维者设计
Huginn 支持插件架构,以便将工具组织成独立的模块。
安装插件依赖项
# Interactive plugin selection (default)
bun install-plugins
# Install all plugins automatically
bun install-plugins --all
# Auto-confirm dependency installation
bun install-plugins --yes
# Combine options
bun install-plugins --all --yes交互模式(默认):
- 显示所有可用插件及其描述
- 允许您选择要安装的插件
- 输入数字(例如,“1 3”)、“全部”或“无”
命令选项:
--all或者-a安装所有插件,不进行提示--yes或者-y自动确认bun install步骤
这将会:
- 在(指定路径/位置)发现插件文件夹
src/plugins/*/index.ts - 让您选择要安装哪些插件文件夹(交互模式)
- 添加该文件夹中声明的缺失包
requiredPackages致你的package.json - 可选择运行
bun install实际安装它们 - 生成一个清单文件
out/plugins-manifest.json带有文件夹名称和工具列表
创建一个插件
在(某个位置)下创建一个目录 src/plugins/your-plugin-name/ 带着一个 index.ts 文件:
// src/plugins/my-plugin/index.ts
export const myTool = {
name: 'my_tool',
description: 'Does something useful',
inputSchema: {
type: 'object',
properties: { text: { type: 'string' } },
required: ['text']
},
handler: async (args, signal) => ({
content: [{ type: 'text', text: `Processed: ${args.text}` }]
})
};
export const anotherTool = {
name: 'another_tool',
description: 'Does something else useful',
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
handler: async (_args, _signal) => ({
content: [{ type: 'text', text: 'All good.' }]
})
};
// The only thing the loader cares about
export const tools = [myTool, anotherTool];
// Optional: per-plugin dependencies (installed via `bun install-plugins`)
export const requiredPackages = {
'some-package': '^1.0.0'
};然后跑 bun install-plugins 注册整个文件夹并安装其依赖项。
生成的工具(提升生活质量,非魔法手段)
create_mcp_tool创建一个带有正确标签工具名称的新插件文件夹generated_), 安全路径写入,可选依赖添加,可选安装(需您确认),以及自动刷新。remove_generated_tool仅删除已生成的工具(头部+generated_(前缀)并刷新注册表。rename_generated_tool重命名一个生成的工具(文件夹+工具名称),并进行安全检查,然后刷新。edit_generated_tool更新描述、输入模式、处理程序代码以及可选的必需包;不安全代码通过一个标志控制,并附有明确警告。
规则很简单:你提供逻辑,Huginn提供界限。保持在界限之内 src/plugins/,出口 tools = [...],剩下的我们来做。
包含的插件
代码截图
从代码字符串中渲染一个带有语法高亮、行号和可选行高亮的样式化PNG图像。
参数:
- 代码(字符串,必填)
- 语言(字符串,默认值:"plaintext")
- 透明(布尔值,默认:false)
- 高亮显示(字符串,行范围如“3,5-7,10”)
- 比例(数字,默认值:2)
- 标题覆盖(字符串)
注释:
- 固定行高(18像素)并保留缩进;空行保持行高。
- Highlight 使用嵌入的左侧栏(无布局偏移)并避免了首个字符的重叠。
- 支持非常长的行;视口会自动扩展以捕捉完整宽度。
- 透明模式:圆角设计,标题更小,边距+阴影以实现区分。
- 当Iosevka字体可用时,将嵌入使用;否则回退到系统默认的等宽字体。
可视化差异图像
从统一差异文件生成HTML或PNG。
参数:
- diff(字符串,必填)
- 格式 ("html" | "image",默认值: "html")
- 输出类型("并排" | "逐行",默认:并排)
内置管理工具
刷新插件
无需重启服务器即可重新加载插件。
模式:
- 插件(字符串,可选):工具名称或仅刷新该插件的插件目录。
示例:
{ "name": "refresh_plugins", "arguments": {} }{ "name": "refresh_plugins", "arguments": { "plugin": "code_screenshot" } }日志记录与配置 - 为极度谨慎者设计
日志: logs/mcp-tools.log(JSON-lines)。用以下内容覆盖 MCP_TOOL_LOG_FILE。
超时: MCP_TOOL_TIMEOUT_MS (毫秒)。 — 是的,你可以把它设置为无限大,但别这么做。
路线图——亦称“进步的幻觉”
Planned items
最小化示例MCP客户端(标准输入输出),展示ListTools + CallTool工作流。
更多示例工具,以及为实际运行这些工具的人员提供的端到端测试。
许可证
麻省理工——去创造些有用的东西吧。或者,去创造出些深陷诅咒的东西也行。 Huginn不会评判,但他确实知晓一切。
