MCP 工具使您的 IDE 代理能够访问外部 API、数据库和服务。未经审核的配置可能会暴露 API 密钥、允许意外写入或收取费用。本教程将逐步介绍审核连接的 MCP 工具、按风险级别对它们进行分类、检查明文 API 密钥以及监控使用情况。
前置条件
- 支持 MCP 的 IDE(光标、VS Code、Windsurf)
- 至少配置一台 MCP 服务器
- MCP的基本了解
操作指南
步骤 1: 列出所有已配置的 MCP 服务器
读取 IDE 配置文件以查看连接的服务器。
Python
import json, os
def list_mcp():
for path in ['.mcp.json', os.path.expanduser('~/.cursor/mcp.json')]:
if os.path.exists(path):
config = json.load(open(path))
servers = config.get('mcpServers', config.get('servers', {}))
print(f'\n{path}:')
for name, srv in servers.items():
url = srv.get('url', srv.get('command', '?'))
print(f' {name}: {url}')
for k in srv.get('env', {}):
safe = '***' if any(s in k.lower() for s in ['key', 'secret', 'token']) else srv['env'][k]
print(f' {k}: {safe}')
list_mcp()步骤 2: 按风险对工具进行分类
将每个工具分类为只读、写入或破坏性。
Python
def classify(tool_name):
t = tool_name.lower()
if any(w in t for w in ['delete', 'remove', 'drop']): return 'HIGH'
if any(w in t for w in ['create', 'update', 'send', 'write']): return 'MEDIUM'
if any(w in t for w in ['search', 'get', 'list', 'fetch', 'read']): return 'LOW'
return 'REVIEW'
for tool in ['scavio_search', 'gmail_send_email', 'db_delete_record', 'list_files']:
print(f' [{classify(tool):6}] {tool}')步骤 3: 检查明文 API 密钥
验证密钥使用环境变量,而不是原始值。
Python
def audit_keys(path='.mcp.json'):
config = json.load(open(path))
issues = []
for name, srv in config.get('mcpServers', {}).items():
for k, v in srv.get('env', {}).items():
if any(s in k.lower() for s in ['key', 'secret', 'token']):
if not v.startswith('$') and len(v) > 10:
issues.append(f'{name}.{k}: plaintext key detected')
if issues:
for i in issues: print(f' WARNING: {i}')
else:
print(' No plaintext keys found.')
audit_keys()步骤 4: 监控 MCP 使用情况
跟踪您的代理调用了哪些工具。
Python
from collections import Counter
class MCPMonitor:
def __init__(self): self.calls = Counter()
def log(self, tool): self.calls[tool] += 1
def report(self):
for tool, count in self.calls.most_common():
print(f' {tool:30} {count:4} calls [{classify(tool)}]')
m = MCPMonitor()
m.log('scavio_search'); m.log('scavio_search'); m.log('gmail_send_email')
m.report()Python 示例
Python
import json, os
def audit(path='.mcp.json'):
if not os.path.exists(path): print('Not found'); return
for name, srv in json.load(open(path)).get('mcpServers', {}).items():
url = srv.get('url', srv.get('command', '?'))
print(f'{name}: {url}')
for k, v in srv.get('env', {}).items():
print(f' {k}: {"***" if "key" in k.lower() else v}')
audit()JavaScript 示例
JavaScript
const fs = require('fs');
function audit(path = '.mcp.json') {
if (!fs.existsSync(path)) return console.log('Not found');
const config = JSON.parse(fs.readFileSync(path, 'utf8'));
for (const [name, srv] of Object.entries(config.mcpServers || {})) {
console.log(`${name}: ${srv.url || srv.command || '?'}`);
for (const [k, v] of Object.entries(srv.env || {}))
console.log(` ${k}: ${/key|secret|token/i.test(k) ? '***' : v}`);
}
}
audit();预期输出
JSON
.mcp.json:
scavio: https://mcp.scavio.dev/mcp
SCAVIO_API_KEY: ***
[LOW ] scavio_search
[MEDIUM] gmail_send_email
[HIGH ] db_delete_record
No plaintext keys found.