这是一个从TypeScript/JavaScript源代码中提取嵌入数据(如i18n翻译或键值配置)到结构化JSON配置文件的Model Context Protocol服务器。
<a href="https://glama.ai/mcp/servers/40c3iyazm5"><img width="380" height="200" src="https://gips1.baidu.com/it/u=2229072912,1733937357&fm=3081&app=3081&f=PNG?w=760&h=400" alt="MCP Data Extractor MCP服务器" /></a>
数据提取:
Hello, {{name}}!)SVG提取:
添加到您的MCP客户端配置:
{
"mcpServers": {
"data-extractor": {
"command": "npx",
"args": [
"-y",
"mcp-data-extractor"
],
"disabled": false,
"autoApprove": [
"extract_data",
"extract_svg"
]
}
}
}
该服务器提供两个工具:
使用extract_data从源文件中提取数据(如i18n翻译):
<use_mcp_tool>
<server_name>data-extractor</server_name>
<tool_name>extract_data</tool_name>
<arguments>
{
"sourcePath": "src/translations.ts",
"targetPath": "src/translations.json"
}
</arguments>
</use_mcp_tool>
使用extract_svg将SVG组件提取到单独的文件中:
<use_mcp_tool>
<server_name>data-extractor</server_name>
<tool_name>extract_svg</tool_name>
<arguments>
{
"sourcePath": "src/components/icons/InspectionIcon.tsx",
"targetDir": "src/assets/icons"
}
</arguments>
</use_mcp_tool>
默认情况下,成功提取后,服务器会用以下内容替换源文件内容:
这有助于追踪哪些文件已被处理并防止重复提取。它还使LLMs和开发者在遇到源文件时容易看到提取的数据现在位于何处。
要禁用此行为,在您的MCP配置中设置DISABLE_SOURCE_REPLACEMENT环境变量为true:
{
"mcpServers": {
"data-extractor": {
"command": "npx",
"args": [
"-y",
"mcp-data-extractor"
],
"env": {
"DISABLE_SOURCE_REPLACEMENT": "true"
},
"disabled": false,
"autoApprove": [
"extract_data",
"extract_svg"
]
}
}
}
数据提取器支持TypeScript/JavaScript应用程序中常用的多种模式:
export default {
welcome: "欢迎来到我们的应用",
greeting: "你好,{name}!",
submit: "提交表单"
};
export default {
header: {
title: "预订航班",
subtitle: "找到最佳交易"
},
footer: {
content: [
"请参阅{{privacyPolicyUrl}}了解详情",
"© {{year}} {{companyName}}"
]
}
};
export default {
faq: {
heading: "常见问题",
content: [
{
heading: "如果我需要更改我的航班怎么办?",
content: "如果您可以在线更改航班,则需要:",
list: [
"您有灵活的票价类型",
"您的航班距离现在超过24小时"
]
}
]
}
};
export default {
greeting: `你好,{{username}}!`,
message: `欢迎来到{{appName}}`
};
提取的数据保存为JSON文件,使用点符号表示法表示嵌套结构:
{
"welcome": "欢迎来到我们的应用",
"header.title": "预订航班",
"footer.content.0": "请参阅{{privacyPolicyUrl}}了解详情",
"footer.content.1": "© {{year}} {{companyName}}",
"faq.content.0.heading": "如果我需要更改我的航班怎么办?"
}
SVG组件被提取到单独的.svg文件中,并移除了React特定代码。例如:
输入(React组件):
const InspectionIcon: React.FC<InspectionIconProps> = ({ title }) => (
<svg className="c-tab__icon" width="40px" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<title>{title}</title>
<path className="cls-1" d="M18.89,12.74a3.18,3.18,0,0,1-3.24-3.11..." />
</svg>
);
输出(InspectionIcon.svg):
<svg width="40px" id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<path class="cls-1" d="M18.89,12.74a3.18,3.18,0,0,1-3.24-3.11..." />
</svg>
提取器使用Babel解析并遍历源文件的AST(抽象语法树)。通过修改源代码来扩展支持模式:
src/index.ts中的extractStringValue方法处理不同类型的字符串值。扩展它以支持新的节点类型:private extractStringValue(node: t.Node): string | null {
if (t.isStringLiteral(node)) {
return node.value;
} else if (t.isTemplateLiteral(node)) {
return node.quasis.map(quasi => quasi.value.raw).join('{{}}');
}
// 在这里添加对新节点类型的支撑
return null;
}
processValue方法处理不同的值类型(字符串、数组、对象)。扩展它以支持新的值类型或自定义处理:private processValue(value: t.Node, currentPath: string[]): void {
if (t.isStringLiteral(value) || t.isTemplateLiteral(value)) {
// 处理字符串值
} else if (t.isArrayExpression(value)) {
// 处理数组
} else if (t.isObjectExpression(value)) {
// 处理对象
}
// 在这里添加对新值类型的支撑
}
traverse(ast, {
ExportDefaultDeclaration(path: NodePath<t.ExportDefaultDeclaration>) {
// 处理默认导出
},
// 在这里添加新的访问者
});
安装依赖项:
npm install
构建服务器:
npm run build
开发时自动重建:
npm run watch
由于MCP服务器通过stdio通信,调试可能具有挑战性。我们推荐使用MCP Inspector,它作为包脚本可用:
npm run inspector
Inspector将提供一个URL,以便在浏览器中访问调试工具。
该项目根据MIT许可证发布 - 查看LICENSE文件获取详细信息。