MCP 工具调用是一种新的数据输出向量。到 2026 年,安全团队需要对每个工具调用进行 DLP 控制:清理出站查询、编辑响应中的敏感模式以及确定每个代理的工具访问范围。本教程将 DLP 应用于 Scavio MCP。
前置条件
- 克劳德·代码最新
- Scavio API 密钥
- Node.js 20+
- DLP 规则列表
操作指南
步骤 1: 分叉 Scavio MCP
使用 DLP 中间件包装上游 MCP。
Bash
git clone https://github.com/scavio/scavio-mcp scavio-mcp-dlp
cd scavio-mcp-dlp && npm install步骤 2: 清理出站查询
阻止包含机密或 PII 的查询。
JavaScript
const DLP_PATTERNS = [
/\b\d{3}-\d{2}-\d{4}\b/, // SSN
/sk_live_[A-Za-z0-9]+/, // API keys
/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\b/ // emails
];
function scrub(query) {
for (const p of DLP_PATTERNS) if (p.test(query)) throw new Error('DLP block');
return query;
}步骤 3: 编辑回复
返回之前从搜索结果中删除匹配模式。
JavaScript
function redact(text) {
for (const p of DLP_PATTERNS) text = text.replace(p, '[REDACTED]');
return text;
}步骤 4: 代理至 Scavio
转发已清理的查询,编辑响应。
JavaScript
export async function search({ query }) {
scrub(query);
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query })
});
const d = await r.json();
d.organic_results = d.organic_results.map(r => ({ ...r, snippet: redact(r.snippet || '') }));
return d;
}步骤 5: 每个代理的范围
将哪些代理可以访问哪些 Scavio 平台列入白名单。
JavaScript
const SCOPE = { 'agent-sdr': ['search', 'reddit'], 'agent-legal': ['search'] };
function enforce(agentId, platform) {
if (!SCOPE[agentId]?.includes(platform)) throw new Error('scope');
}Python 示例
Python
import os, re, requests
API_KEY = os.environ['SCAVIO_API_KEY']
DLP = [re.compile(r'\d{3}-\d{2}-\d{4}'), re.compile(r'sk_live_[A-Za-z0-9]+')]
def safe_search(query):
for p in DLP:
if p.search(query): raise ValueError('DLP block')
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json={'query': query})
d = r.json()
for res in d.get('organic_results', []):
for p in DLP: res['snippet'] = p.sub('[REDACTED]', res.get('snippet', ''))
return d
print(safe_search('best serp api 2026'))JavaScript 示例
JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const DLP = [/\d{3}-\d{2}-\d{4}/, /sk_live_[A-Za-z0-9]+/];
export async function safeSearch(query) {
if (DLP.some(p => p.test(query))) throw new Error('DLP block');
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query })
});
const d = await r.json();
d.organic_results = (d.organic_results || []).map(x => ({ ...x, snippet: DLP.reduce((s, p) => s.replace(p, '[REDACTED]'), x.snippet || '') }));
return d;
}预期输出
JSON
Queries with PII/secrets blocked before hitting Scavio. Results with matching patterns redacted. Audit log shows per-agent scope enforcement.