Desktop Extensions (DXT) 详解
什么是Desktop Extensions (DXT)?
Desktop Extensions (DXT,桌面扩展) 是一种用于打包和分发本地MCP (Model Context Protocol) 服务器的标准化格式。它类似于Chrome扩展(.crx)或VS Code扩展(.vsix),允许用户通过单次点击安装本地MCP服务器。
Desktop Extensionshttps://www.anthropic.com/engineering/desktop-extensions
DXT的核心是一个包含以下内容的ZIP压缩包: - 完整的本地MCP服务器代码/二进制文件 - 描述扩展功能和配置的manifest.json
文件 - 其他资源文件(如图标、配置文件等)
DXT的主要特点
特点 (Feature) | 描述 (Description) | 优势 (Advantage) |
---|---|---|
单文件分发 (Single-file distribution) | 所有内容打包在一个.dxt文件中 | 简化安装和分发过程 |
标准化配置 (Standardized configuration) | 通过manifest.json定义服务器配置 | 消除手动配置错误 |
跨平台支持 (Cross-platform support) | 支持Node.js、Python和二进制服务器 | 开发者可自由选择技术栈 |
用户配置集成 (User configuration integration) | 内置用户配置系统 | 提供统一的配置界面 |
自动更新 (Automatic updates) | 支持扩展版本管理和更新 | 确保用户使用最新版本 |
DXT使用方法
1. 安装CLI工具
npm install -g @anthropic-ai/dxt
2. 创建扩展
# 初始化新扩展
dxt init my-extension
cd my-extension
# 开发你的MCP服务器代码
# (根据选择的服务器类型创建相应文件)
# 打包扩展
dxt pack . my-extension.dxt
3. 签名扩展(可选)
# 自签名扩展(开发用途)
dxt sign my-extension.dxt --self-signed
# 使用正式证书签名
dxt sign my-extension.dxt --cert cert.pem --key key.pem
4. 安装使用
生成的.dxt文件可直接在支持DXT格式的应用程序中安装使用。由于所有文件已预先打包,安装过程仅需解压即可。
Manifest定义详解
基本结构
{
"dxt_version": "0.1",
"name": "my-extension",
"version": "1.0.0",
"description": "A simple MCP extension",
"author": {
"name": "Extension Author"
},
"server": {
"type": "node",
"entry_point": "server/index.js",
"mcp_config": {
"command": "node",
"args": ["${__dirname}/server/index.js"]
}
}
}
关键字段说明
1. 元数据部分 (Metadata)
字段 (Field) | 类型 (Type) | 必填 (Required) | 描述 (Description) |
---|---|---|---|
dxt_version | string | 是 | DXT规范版本 |
name | string | 是 | 扩展的唯一标识名称 |
version | string | 是 | 语义化版本号 |
description | string | 是 | 简短描述 |
author | object | 是 | 作者信息 |
2. 服务器配置 (Server Configuration)
"server": {
"type": "python",
"entry_point": "server/main.py",
"mcp_config": {
"command": "python",
"args": ["server/main.py"],
"env": {
"PYTHONPATH": "server/lib",
"API_KEY": "${user_config.api_key}"
},
"platform_overrides": {
"win32": {
"command": "python.exe"
}
}
}
}
这里定义了服务端的核心配置,其中mcp_config
部分是与 MCP 兼容的实际运行时配置,而外层的type
和entry_point
字段提供了更抽象的接口定义,为未来可能的扩展保留了灵活性。两者内容本质上是相关的,但外层配置提供了更高层次的抽象。
服务器类型支持:
node
: Node.js服务器python
: Python服务器binary
: 预编译二进制
3. 用户配置 (User Configuration)
"user_config": {
"api_key": {
"type": "string",
"title": "API Key",
"description": "Your API key for authentication",
"sensitive": true,
"required": true
},
"max_file_size": {
"type": "number",
"title": "Maximum File Size (MB)",
"description": "Maximum file size to process",
"default": 10,
"min": 1,
"max": 100
}
}
配置类型支持:
string
: 文本输入number
: 数字输入boolean
: 复选框/开关directory
: 目录选择器file
: 文件选择器
directory 和 file 在实际类型定义里,其实是 string | string[ ] 。所以可以通过 multiple 参数来控制配置一个或者多个可访问的路径或者文件。
4. 工具和提示定义 (Tools and Prompts)
"tools": [
{
"name": "search_files",
"description": "Search for files in a directory"
}
],
"prompts": [
{
"name": "explain_code",
"description": "Explain how code works",
"arguments": ["code", "language"],
"text": "Explain this ${arguments.language} code:\n${arguments.code}"
}
],
"tools_generated": true,
"prompts_generated": false
实际应用示例
文件搜索扩展示例
{
"dxt_version": "0.1",
"name": "file-search",
"display_name": "File Search Extension",
"version": "1.0.0",
"description": "Allows searching files in specified directories",
"author": {
"name": "Search Tools Inc.",
"email": "support@searchtools.com"
},
"server": {
"type": "node",
"entry_point": "server/index.js",
"mcp_config": {
"command": "node",
"args": ["${__dirname}/server/index.js"],
"env": {
"SEARCH_PATHS": "${user_config.search_dirs}"
}
}
},
"user_config": {
"search_dirs": {
"type": "directory",
"title": "Search Directories",
"description": "Directories to include in searches",
"multiple": true,
"required": true,
"default": ["${HOME}/Documents"]
},
"max_depth": {
"type": "number",
"title": "Maximum Search Depth",
"description": "How many subdirectory levels to search",
"default": 3,
"min": 1,
"max": 10
}
},
"tools": [
{
"name": "search_files",
"description": "Search for files by name or content"
},
{
"name": "get_file_info",
"description": "Get information about a file"
}
],
"compatibility": {
"claude_desktop": ">=1.2.0",
"platforms": ["darwin", "win32", "linux"],
"runtimes": {
"node": ">=16.0.0"
}
}
}
以上是一个 manifest.json 文件的完整配置示例,供大家参考。
总结
Desktop Extensions (DXT,桌面扩展) 是一种创新的本地MCP服务器打包和分发格式,具有以下核心优势:
- 简化分发:将复杂配置封装为单文件,实现一键安装
- 标准化接口:通过manifest.json明确定义服务器能力和配置需求
- 跨平台支持:兼容Node.js、Python和二进制等多种服务器类型
- 用户友好:内置配置系统提供统一的用户界面
- 生态系统集成:支持工具和提示的声明,便于AI应用集成
DXT特别适合需要与桌面AI应用集成的本地服务场景,如:
- 文件系统访问工具
- 本地数据库查询接口
- 专业软件集成插件
- 自定义自动化工具
通过标准化和简化本地MCP服务器的分发流程,DXT有望成为AI桌面应用生态系统中重要的组成部分。
上手开发 DXT
关于 DXT 的使用操作,网上已有大量演示。今天我们将重点讲解如何利用官方 GitHub 库进行开发。
Anthropics DXThttps://github.com/anthropics/dxt
DXT 库主要提供了用于创建和打包 DXT 文件的接口,并且提供解压缩已打包的 DXT 文件并转换为 MCP server 的功能。
现有的解压缩和转换接口
1. 核心配置转换接口
库中提供了 getMcpConfigForManifest
函数,这是将 DXT 扩展转换为 MCP server 配置的核心接口: config.ts:
export async function getMcpConfigForManifest(
options: GetMcpConfigForManifestOptions,
): Promise<McpServerConfig | undefined>
该函数的主要功能包括:
- 解析 DXT manifest 中的
mcp_config
配置:
const baseConfig = manifest.server?.mcp_config;
if (!baseConfig) {
return undefined;
}
- 处理平台特定的配置覆盖:
if (baseConfig.platform_overrides) {
if (process.platform in baseConfig.platform_overrides) {
const platformConfig = baseConfig.platform_overrides[process.platform];
result.command = platformConfig.command || result.command;
result.args = platformConfig.args || result.args;
result.env = platformConfig.env || result.env;
}
}
- 执行变量替换,包括
${__dirname}
、${user_config.*}
等:
const variables: Record<string, string | string[]> = {
__dirname: extensionPath,
pathSeparator,
"/": pathSeparator,
...systemDirs,
};
// Build merged configuration from defaults and user settings
const mergedConfig: Record<string, unknown> = {};
// First, add defaults from manifest
if (manifest.user_config) {
for (const [key, configOption] of Object.entries(manifest.user_config)) {
if (configOption.default !== undefined) {
mergedConfig[key] = configOption.default;
}
}
}
// Then, override with user settings
if (userConfig) {
Object.assign(mergedConfig, userConfig);
}
// Add merged configuration variables for substitution
for (const [key, value] of Object.entries(mergedConfig)) {
// Convert user config to the format expected by variable substitution
const userConfigKey = `user_config.${key}`;
if (Array.isArray(value)) {
// Keep arrays as arrays for proper expansion
variables[userConfigKey] = value.map(String);
} else if (typeof value === "boolean") {
// Convert booleans to "true"/"false" strings as per spec
variables[userConfigKey] = value ? "true" : "false";
} else {
// Convert other types to strings
variables[userConfigKey] = String(value);
}
}
2. 变量替换系统
DXT 系统支持多种变量替换,用于将打包的扩展适配到运行时环境: MANIFEST.md
支持的变量包括:
${__dirname}
: 扩展目录的绝对路径${HOME}
,${DESKTOP}
,${DOCUMENTS}
,${DOWNLOADS}
: 系统目录${user_config.*}
: 用户配置值${pathSeparator}
或${/}
: 路径分隔符
架构分析
DXT 到 MCP Server 的转换流程
所以对于一个Desktop MCP Client 应用,典型的实现流程应当包括:
- 接收 .dxt 文件
- 解压缩 ZIP 档案
- 验证数字签名
- 解析 manifest.json
- 使用
getMcpConfigForManifest
生成 MCP 配置 - 启动 MCP server 进程
开源实现
由于 Claude Desktop 本身是闭源的,所以无法获知它的实际实现方式,所以我在我自己的开源项目 TUUI 中完整实现了一遍,这里提供一下使用效果:
配置界面需要配置允许访问的目录
file-system-node 默认提供了一系列用于访问本地路径的工具
LLM 自动编排工具调用来完成文件夹的访问和文件的写入
最后保持好习惯,所有代码都开源到了github:
https://www.github.com/AI-QL/tuui
对于 Window 系统的小伙伴,可以安装 nodejs 之后,直接在最新 release 中下载 zip 免安装包和对应的两个 .dxt 文件示例来体验(注意:其中 file-system-node.dxt 这个官方包的 Allowed Directory 实际是个必须配置的参数。所以需要配置之后才能正常启动 MCP Server)
对于 MacOS 的小伙伴,就比较麻烦了,我在 README 中给出了一些 ISSUE 链接,需要魔改一下 node 的安装访问路径。由于对应的问题在开源社区还是 open 状态,所以我暂时也只能保持现状,等有了较为明确的结论再调试这部分。
好了,以上就是今天的内容,睡觉去了,又要秃了。。。。