Enterprise agent workflows in 2026 need unified search across internal docs (Confluence, SharePoint, Notion) and the external web. This tutorial registers Scavio MCP next to your internal KB MCP so Claude Code runs federated search from one prompt.
Prerequisites
- Claude Code latest
- A Scavio API key
- Your enterprise KB MCP (e.g. @confluence/mcp, @notion/mcp)
- Node.js 20+
Walkthrough
Step 1: Install both MCPs
Scavio plus your KB MCP.
npm install -g @scavio/mcp @confluence/mcpStep 2: Register both in .mcp.json
Claude Code discovers tools from all registered servers.
{
"mcpServers": {
"scavio": { "command": "scavio-mcp", "env": { "SCAVIO_API_KEY": "..." } },
"confluence": { "command": "confluence-mcp", "env": { "CONFLUENCE_TOKEN": "..." } }
}
}Step 3: Write a federated search skill
Claude Code searches KB first, falls back to Scavio.
// ~/.claude/skills/federated-search.md
For every question:
1. Call confluence.search with the query.
2. If fewer than 3 results, call scavio.search for external web results.
3. Combine and cite sources inline.Step 4: Control precedence with tags
Internal-only queries skip Scavio. Public-research queries skip KB.
// Prompt pattern
[internal]: only search Confluence
[public]: only search Scavio
[any]: search bothStep 5: Verify with a test prompt
Test that federated search returns blended results.
> [any] What is our pricing compared to competitors?Python Example
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
def federated(query, internal_first=True):
# internal search stub
internal = search_confluence(query) if internal_first else []
if len(internal) >= 3: return internal
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': query})
return internal + r.json().get('organic_results', [])[:5]
def search_confluence(q):
return [] # wire your own Confluence API client
print(federated('quarterly roadmap'))JavaScript Example
const API_KEY = process.env.SCAVIO_API_KEY;
export async function federated(query) {
const internal = await searchConfluence(query);
if (internal.length >= 3) return internal;
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();
return [...internal, ...(d.organic_results || []).slice(0, 5)];
}
async function searchConfluence(q) { return []; }Expected Output
Claude Code answers cite both Confluence pages and external sources inline. Internal hits prioritized, external fills gaps.