Skip to main content

Tool Blocking Feature Example

This example demonstrates how to use the blockedTools feature to prevent specific tools from being executed on external MCP servers.

Example Configuration​

Create or update your .mcp-config.json file:

{
"mcpServers": {
"filesystem": {
"name": "filesystem",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
"transport": "stdio",
"blockedTools": ["move_file", "delete_file", "remove_directory"]
},
"github": {
"name": "github",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"transport": "stdio",
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your_token_here"
},
"blockedTools": ["delete_repository", "transfer_repository"]
},
"bitbucket": {
"name": "bitbucket",
"command": "npx",
"args": ["-y", "@nexus2520/bitbucket-mcp-server"],
"transport": "stdio",
"env": {
"BITBUCKET_USERNAME": "your-bitbucket-username",
"BITBUCKET_APP_PASSWORD": "your-app-password"
},
"blockedTools": ["delete_repository", "delete_branch"]
}
}
}

Testing the Feature​

1. Load the Configuration​

import { NeuroLink } from "@juspay/neurolink";

const neurolink = new NeuroLink();

// Load external servers from configuration
await neurolink.loadExternalMCPServers("./.mcp-config.json");

2. List Available Tools​

// Get MCP status to see loaded servers
const status = await neurolink.getMCPStatus();
console.log(`Loaded ${status.totalServers} servers`);

// List all available tools (blocked tools won't appear here)
const tools = await neurolink.listMCPTools();
console.log(
"Available tools:",
tools.map((t) => t.name),
);

3. Attempt to Execute a Blocked Tool​

try {
// This will fail because 'delete_file' is blocked
await neurolink.executeMCPTool("filesystem.delete_file", {
path: "/some/file.txt",
});
} catch (error) {
console.error("Expected error:", error.message);
// Output: "Tool 'delete_file' is blocked on server 'filesystem' by configuration"
}

4. Execute an Allowed Tool​

// This will succeed because 'read_file' is not blocked
const content = await neurolink.executeMCPTool("filesystem.read_file", {
path: "/some/file.txt",
});
console.log("File content:", content);

Use Cases​

1. Production Safety​

Block destructive operations in production:

{
"mcpServers": {
"filesystem-prod": {
"blockedTools": [
"delete_file",
"remove_directory",
"move_file",
"write_file"
]
}
}
}

2. Read-Only GitHub Access​

Allow read operations but block writes:

{
"mcpServers": {
"github-readonly": {
"blockedTools": [
"create_repository",
"delete_repository",
"create_issue",
"close_issue",
"create_pull_request",
"merge_pull_request"
]
}
}
}

3. Compliance and Audit​

Block sensitive operations that require audit trails:

{
"mcpServers": {
"database": {
"blockedTools": [
"drop_table",
"truncate_table",
"delete_all_records",
"update_schema"
]
}
}
}

Verification​

Run tests to verify the feature works correctly:

# Run the blocklist tests
pnpm test test/unit/mcp/externalServerBlocklist.test.ts

# Or run all tests
pnpm test

Notes​

  • Blocked tools are filtered during discovery, so they won't appear in the list of available tools
  • Attempts to execute blocked tools will throw an error with a clear message
  • The blockedTools array can be empty or omitted if no tools need to be blocked
  • Tool names are case-sensitive and must match exactly