We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AndersHsueh/Ax-LocalTools-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MCP 跨平台兼容性测试报告</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; line-height: 1.6; }
.header { background: #f4f4f4; padding: 20px; border-radius: 5px; margin-bottom: 20px; }
.summary { display: flex; gap: 20px; margin-bottom: 20px; }
.metric { background: white; padding: 15px; border-radius: 5px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); flex: 1; }
.metric h3 { margin: 0 0 10px 0; color: #333; }
.metric .value { font-size: 2em; font-weight: bold; }
.passed { color: #28a745; }
.failed { color: #dc3545; }
.skipped { color: #ffc107; }
.test-results { margin-top: 20px; }
.test-category { margin-bottom: 20px; background: white; padding: 15px; border-radius: 5px; }
.test-item { padding: 10px; margin: 5px 0; border-left: 4px solid #ddd; }
.test-item.passed { border-left-color: #28a745; background: #f8fff9; }
.test-item.failed { border-left-color: #dc3545; background: #fff8f8; }
.test-item.skipped { border-left-color: #ffc107; background: #fffdf7; }
.details { font-size: 0.9em; color: #666; margin-top: 5px; }
.platform-info { background: #e9ecef; padding: 10px; border-radius: 3px; margin: 10px 0; }
</style>
</head>
<body>
<div class="header">
<h1>MCP 跨平台兼容性测试报告</h1>
<div class="platform-info">
<strong>平台:</strong> darwin |
<strong>架构:</strong> arm64 |
<strong>Node.js:</strong> v22.16.0 |
<strong>测试时间:</strong> 2025/10/6 19:03:35
</div>
</div>
<div class="summary">
<div class="metric">
<h3>总测试数</h3>
<div class="value">20</div>
</div>
<div class="metric">
<h3>通过率</h3>
<div class="value passed">90%</div>
</div>
<div class="metric">
<h3>失败数</h3>
<div class="value failed">2</div>
</div>
<div class="metric">
<h3>耗时</h3>
<div class="value">11ms</div>
</div>
</div>
<div class="test-results">
<div class="test-category">
<h3>基础设施 (2/2)</h3>
<div class="test-item passed">
<strong>环境设置</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"tempDir": "/var/folders/dz/dyhjdr_d5rzdpvwwt7cnrk780000gn/T/mcp-test-O5DLRW",
"filesCreated": 4
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>环境清理</strong>
<span class="status passed">PASSED</span>
</div>
</div>
<div class="test-category">
<h3>平台检测 (3/3)</h3>
<div class="test-item passed">
<strong>平台信息检测</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"platformInfo": {
"platform": "darwin",
"isWindows": false,
"isMacOS": true,
"isLinux": false,
"isUnix": true,
"nodeVersion": "v22.16.0",
"architecture": "arm64"
}
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>路径配置检测</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"pathConfig": {
"separator": "/",
"delimiter": ":",
"maxLength": 4096,
"caseSensitive": true,
"supportedFeatures": {
"longPaths": false,
"uncPaths": false,
"symbolicLinks": true,
"hiddenFiles": true,
"fileAttributes": false
}
}
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>递归监控支持检测</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"recursiveSupport": true,
"expectedSupport": true
}</pre>
</div>
</div>
</div>
<div class="test-category">
<h3>路径处理 (1/3)</h3>
<div class="test-item passed">
<strong>基本路径解析</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"input": "/var/folders/dz/dyhjdr_d5rzdpvwwt7cnrk780000gn/T/mcp-test-O5DLRW/test-file.txt",
"output": "/var/folders/dz/dyhjdr_d5rzdpvwwt7cnrk780000gn/T/mcp-test-O5DLRW/test-file.txt"
}</pre>
</div>
</div>
<div class="test-item failed">
<strong>家目录验证</strong>
<span class="status failed">FAILED</span>
<div class="details" style="display: none;">
<pre>{
"error": "路径不允许"
}</pre>
</div>
</div>
<div class="test-item failed">
<strong>路径安全验证</strong>
<span class="status failed">FAILED</span>
<div class="details" style="display: none;">
<pre>{
"safe": false,
"warnings": [],
"errors": [
"路径不允许"
],
"normalizedPath": null
}</pre>
</div>
</div>
</div>
<div class="test-category">
<h3>Unix路径 (1/1)</h3>
<div class="test-item passed">
<strong>隐藏文件检测</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"path": "/var/folders/dz/dyhjdr_d5rzdpvwwt7cnrk780000gn/T/mcp-test-O5DLRW/.hidden-file",
"detected": true
}</pre>
</div>
</div>
</div>
<div class="test-category">
<h3>命令策略 (2/2)</h3>
<div class="test-item passed">
<strong>安全命令检测</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"command": "ls -la",
"result": {
"level": "allow",
"reason": null,
"platform": "unix",
"commandType": "shell",
"suggestions": [],
"sudoInfo": null
}
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>危险命令检测</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"command": "rm -rf /",
"result": {
"level": "warn",
"reason": "高风险命令",
"platform": "unix",
"commandType": "shell",
"suggestions": [],
"sudoInfo": null
}
}</pre>
</div>
</div>
</div>
<div class="test-category">
<h3>Unix命令 (3/3)</h3>
<div class="test-item passed">
<strong>Unix命令: sudo systemctl stop nginx</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"command": "sudo systemctl stop nginx",
"expected": "warn",
"actual": "warn"
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>Unix命令: chmod 777 file.txt</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"command": "chmod 777 file.txt",
"expected": "warn",
"actual": "warn"
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>Unix命令: cat file.txt</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"command": "cat file.txt",
"expected": "allow",
"actual": "allow"
}</pre>
</div>
</div>
</div>
<div class="test-category">
<h3>文件权限 (2/2)</h3>
<div class="test-item passed">
<strong>权限读取</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"file": "/var/folders/dz/dyhjdr_d5rzdpvwwt7cnrk780000gn/T/mcp-test-O5DLRW/test-file.txt",
"permissions": {
"platform": "unix",
"mode": 33188,
"octal": "644",
"symbolic": "rw-r--r--",
"owner": {
"read": true,
"write": true,
"execute": false
},
"group": {
"read": true,
"write": false,
"execute": false
},
"others": {
"read": true,
"write": false,
"execute": false
},
"specialBits": {
"sticky": false,
"setgid": false,
"setuid": false
}
}
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>Unix权限设置</strong>
<span class="status passed">PASSED</span>
</div>
</div>
<div class="test-category">
<h3>文件监控 (2/2)</h3>
<div class="test-item passed">
<strong>文件监控递归支持</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"recursiveSupport": true,
"expectedSupport": true
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>文件监控接口</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"note": "接口可用,实际监控功能需要集成测试验证"
}</pre>
</div>
</div>
</div>
<div class="test-category">
<h3>性能测试 (2/2)</h3>
<div class="test-item passed">
<strong>路径解析性能</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"operations": 1000,
"duration": 3,
"opsPerSecond": 333333
}</pre>
</div>
</div>
<div class="test-item passed">
<strong>命令评估性能</strong>
<span class="status passed">PASSED</span>
<div class="details" style="display: none;">
<pre>{
"operations": 500,
"duration": 1,
"opsPerSecond": 500000
}</pre>
</div>
</div>
</div>
</div>
<script>
// 添加交互功能
document.querySelectorAll('.test-item').forEach(item => {
item.addEventListener('click', function() {
const details = this.querySelector('.details');
if (details) {
details.style.display = details.style.display === 'none' ? 'block' : 'none';
}
});
});
</script>
</body>
</html>