Tool Filtering
Control which tools are available per request
DeepIntShield can act as an MCP server, exposing all your connected MCP tools to external MCP clients like Claude Desktop, Cursor, or any other MCP-compatible application.
This enables a powerful pattern:
graph TD Clients["<b>External MCP Clients</b><br/>Claude Desktop, Cursor<br/>Custom Apps"]
Gateway["<b>DeepIntShield Gateway</b>"] Endpoints["<b>Endpoints</b><br/>POST /mcp: JSON-RPC<br/>GET /mcp: SSE Stream"] Registry["<b>Aggregated Tool Registry</b><br/>filesystem • web search<br/>databases • custom tools"]
Servers["<b>External MCP Servers</b><br/>filesystem • web-search<br/>databases • custom"]
Clients -->|MCP Protocol<br/>HTTP/SSE| Gateway Gateway --> Endpoints Gateway --> Registry Gateway -->|MCP Protocol| Servers
style Clients fill:#F3E5F5,stroke:#4A148C,stroke-width:2.5px,color:#1A1A1A style Gateway fill:#E8F5E9,stroke:#1B5E20,stroke-width:2.5px,color:#1A1A1A style Endpoints fill:#E3F2FD,stroke:#0D47A1,stroke-width:2.5px,color:#1A1A1A style Registry fill:#FFF3E0,stroke:#BF360C,stroke-width:2.5px,color:#1A1A1A style Servers fill:#FFFDE7,stroke:#F57F17,stroke-width:2.5px,color:#1A1A1A| Endpoint | Method | Purpose |
|---|---|---|
/mcp | POST | JSON-RPC 2.0 messages for tool discovery and execution |
/mcp | GET | Server-Sent Events (SSE) for persistent connections |
Handle JSON-RPC 2.0 messages for tool listing and execution:
# List available toolscurl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'
# Call a toolcurl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "filesystem_read_file", "arguments": { "path": "/tmp/test.txt" } } }'Establish a persistent SSE connection for real-time communication:
curl -N http://localhost:8080/mcp \ -H "Accept: text/event-stream"The SSE endpoint sends:
connection/opened message on connectThe /mcp endpoint supports any MCP-compatible client that can communicate via HTTP or SSE:
To connect an external MCP client, configure it to connect to:
http://your-deepintshield-gateway/mcpInclude any required Virtual Key authentication headers if governance is enabled.
DeepIntShield supports per-Virtual Key MCP servers, allowing you to expose different tools to different clients.
When enforce_governance_header is false, requests without a Virtual Key use the global MCP server with all available tools.
When using Virtual Keys, each VK gets its own MCP server with filtered tools based on its configuration.
Authenticate with Virtual Key:
# Via Authorization headercurl -X POST http://localhost:8080/mcp \ -H "Authorization: Bearer vk_your_virtual_key" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'
# Via X-Api-Key headercurl -X POST http://localhost:8080/mcp \ -H "X-Api-Key: vk_your_virtual_key" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'
# Via x-bf-virtual-key headercurl -X POST http://localhost:8080/mcp \ -H "x-bf-virtual-key: vk_your_virtual_key" \ -H "Content-Type: application/json" \ -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'Claude Desktop with Virtual Key:
{ "mcpServers": { "deepintshield-production": { "url": "http://localhost:8080/mcp", "headers": { "Authorization": "Bearer vk_your_production_key" } }, "deepintshield-development": { "url": "http://localhost:8080/mcp", "headers": { "Authorization": "Bearer vk_your_development_key" } } }}Control which tools are exposed to MCP clients using Virtual Keys:
Configure which tools each Virtual Key can access:
{ "governance": { "virtual_keys": [ { "name": "production-key", "mcp_configs": [ { "mcp_client_name": "filesystem", "tools_to_execute": ["read_file", "list_directory"] }, { "mcp_client_name": "web_search", "tools_to_execute": ["*"] } ] }, { "name": "admin-key", "mcp_configs": [ { "mcp_client_name": "filesystem", "tools_to_execute": ["*"] }, { "mcp_client_name": "database", "tools_to_execute": ["*"] } ] } ] }}Learn more about Virtual Key tool filtering in MCP Tool Filtering.
DeepIntShield automatically monitors the health of connected MCP clients:
How it works:
disconnectedConfiguration:
{ "mcp": { "health_monitor_config": { "check_interval": "10s", "check_timeout": "5s", "max_consecutive_failures": 5 } }}When a client is disconnected after 5 consecutive failed health checks, tools from that client become unavailable. You can manually reconnect using the API or Go SDK:
Gateway API:
POST /api/mcp/client/{id}/reconnectGo SDK:
// Reconnect a disconnected MCP clienterr := client.ReconnectMCPClient(context.Background(), clientID)if err != nil { // Handle reconnection error log.Printf("Failed to reconnect client: %v", err)}For Agent Mode operations, DeepIntShield can track intermediate tool executions:
mcpConfig := &schemas.MCPConfig{ FetchNewRequestIDFunc: func(ctx context.Context) string { // Generate unique ID per agent iteration return fmt.Sprintf("agent-%s-%d", ctx.Value("original-id"), time.Now().UnixMilli()) },}This enables detailed audit trails for autonomous tool execution.
Tools are discovered from MCP servers during:
The MCP Server dynamically updates its tool registry from the tool manager.
Always enable enforce_governance_header in production:
{ "client": { "enforce_governance_header": true }}This ensures all MCP requests require a valid Virtual Key.
Deploy DeepIntShield behind a reverse proxy (nginx, Cloudflare, etc.) with TLS enabled:
MCP Client → HTTPS → Reverse Proxy → HTTP → DeepIntShield GatewayUse Virtual Keys to limit which tools each client can access. Follow the principle of least privilege.
Consider network-level restrictions to limit which IPs can access the MCP endpoint.
tools_to_execute includes the expected toolsenforce_governance_header setting matches your setup