Skip to content

NCP Advanced Usage Guide ​

This guide covers advanced patterns, optimization strategies, and techniques for power users.

Table of Contents ​

  1. Advanced Workflow Patterns
  2. Performance Optimization
  3. Troubleshooting
  4. Custom MCP Development
  5. Architecture Deep-Dive

Advanced Workflow Patterns ​

Multi-Step Orchestration ​

Combine multiple MCPs to create sophisticated workflows:

bash
# Example: Create GitHub issue from local file content
# 1. Read local file
ncp run filesystem:read_file path=/path/to/issue-template.md

# 2. Use content to create GitHub issue
ncp run github:create_issue \
  owner=myorg \
  repo=my-repo \
  title="New Feature Request" \
  body="<from previous response>"

# 3. Post notification to Slack
ncp run slack:send_message \
  channel=#notifications \
  text="Issue created: <issue-url>"

Conditional Execution Chains ​

Use scripting to create conditional MCP executions:

bash
#!/bin/bash
# Check if repository needs update
NEEDS_UPDATE=$(ncp run github:list_branches owner=myorg repo=my-repo | grep -c "feature-branch")

if [ $NEEDS_UPDATE -gt 0 ]; then
  echo "Found feature branches, creating PR"
  ncp run github:create_pull_request \
    owner=myorg \
    repo=my-repo \
    head=feature-branch \
    base=main
else
  echo "No feature branches found"
fi

Batch Operations ​

Process multiple items efficiently:

bash
# Process multiple files across an MCP
for file in /data/*.json; do
  echo "Processing $file"
  ncp run custom-processor:process_file path="$file"
done

Performance Optimization ​

Caching Strategy ​

NCP implements intelligent caching for frequently accessed data:

  • Prompts/Resources Caching: 60-second TTL for list operations
  • Tool Discovery: Results cached during tool lookup phase
  • Connection Pooling: Reuses MCP connections with configurable limits

To maximize caching benefits:

  • Batch multiple find/list operations within 60 seconds
  • Avoid frequent profile switching (invalidates caches)
  • Monitor cache hits via debug logging: ncp config debugLogging true

Connection Pool Management ​

NCP maintains a connection pool with these limits:

  • MAX_CONNECTIONS: Maximum simultaneous MCP connections (default: 50)
  • MAX_EXECUTIONS_PER_CONNECTION: Executions before reconnection (default: 1000)
  • LRU Eviction: Least recently used connections removed when limit exceeded

Optimize for your workload:

bash
# For high-frequency operations, ensure pool size is adequate
# Monitor connection reuse: check logs for "Reusing connection" messages

# For long-running sessions, monitor execution counts
# to detect forced reconnections

Query Optimization ​

When using find, optimize your queries:

bash
# ✅ Good: Specific, natural language
ncp find "read file from filesystem"

# ✅ Good: Tool name prefix
ncp find "filesystem:read"

# ⚠️ Inefficient: Too broad
ncp find "data"

# Use depth control to reduce data transfer
ncp find "file operations" --depth 0  # Names only
ncp find "file operations" --depth 1  # Names + descriptions
ncp find "file operations" --depth 2  # Full details (default)

Troubleshooting ​

Debug Logging ​

Enable comprehensive debugging:

bash
ncp config debugLogging true

# Or via environment variable
export NCP_DEBUG=true
ncp run github:list_issues owner=anthropic repo=claude-code

Debug logs include:

  • MCP connection establishment
  • Tool discovery process
  • Parameter validation
  • Cache hits/misses
  • Performance metrics

Connection Issues ​

Symptom: "Failed to connect to MCP"

bash
# Check MCP health
ncp doctor

# Verify configuration
ncp config location  # Check where configs are stored

# Test with explicit profile
ncp list --profile all

Symptom: "Tool not found"

bash
# Search across all MCPs
ncp find "operation description"

# List specific MCP tools
ncp list | grep "mcp-name"

# Verify MCP is loaded
ncp doctor

Symptom: "Command execution timeout"

bash
# Check if MCP is responsive
ncp run mcp-name:simple_tool

# Enable debug logs to see where timeout occurred
ncp config debugLogging true

# Try with dry-run to verify parameters
ncp run mcp-name:tool_name param1=value --dry-run

Performance Issues ​

Symptom: Slow find operations

bash
# Use more specific queries
ncp find "database query operations" --depth 1  # Reduce data
ncp find "postgres" --depth 2  # Be specific

# Check cache effectiveness
ncp config debugLogging true
# Look for "Using cached" messages

Symptom: Slow tool execution

bash
# Profile the execution
time ncp run mcp:tool param=value

# Check connection pool status
ncp config debugLogging true
# Monitor "Reusing connection" vs "Creating new connection"

# Consider connection pool limits
# If many connections are created, increase MAX_CONNECTIONS

Custom MCP Development ​

Building a Custom MCP ​

Create an MCP for your specific needs:

typescript
// src/my-custom-mcp.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = new Server({
  name: 'my-custom-mcp',
  version: '1.0.0'
});

// Define tools
server.setRequestHandler('tools/list', () => ({
  tools: [
    {
      name: 'process_data',
      description: 'Process data from custom source',
      inputSchema: {
        type: 'object',
        properties: {
          data: { type: 'string', description: 'Data to process' }
        },
        required: ['data']
      }
    }
  ]
}));

server.setRequestHandler('tools/call', async (request) => {
  if (request.params.name === 'process_data') {
    // Implementation
    return {
      content: [{ type: 'text', text: 'Processed result' }]
    };
  }
});

// Start server
const transport = new StdioServerTransport();
await server.connect(transport);

Integrating Custom MCPs ​

Add your custom MCP to NCP:

bash
# Option 1: Direct command
ncp add my-custom-mcp node /path/to/my-custom-mcp.js

# Option 2: Via profile configuration
ncp config location  # Find config file
# Edit ~/.ncp/profiles/all.json and add:
# {
#   "mcpServers": {
#     "my-custom-mcp": {
#       "command": "node",
#       "args": ["/path/to/my-custom-mcp.js"]
#     }
#   }
# }

# Verify
ncp list | grep my-custom-mcp

Architecture Deep-Dive ​

Request Processing Pipeline ​

User Input
    ↓
Command Parser
    ↓
Tool Discovery (ToolFinder)
    ↓
Parameter Validation (ToolSchemaParser)
    ↓
Context Resolution (ToolContextResolver)
    ↓
MCP Connection Pool
    ↓
Tool Execution (with error handling)
    ↓
Result Formatting & Output

MCP Connection Lifecycle ​

1. Initial Request to MCP
   ├─ Check connection pool
   ├─ If exists: Reuse (increment executionCount)
   └─ If not: Create new connection

2. Tool Execution
   ├─ Validate parameters
   ├─ Call MCP tool
   └─ Capture response

3. Connection Management
   ├─ Track lastUsed timestamp
   ├─ Update executionCount
   └─ Check for LRU eviction

4. Cleanup
   ├─ Cache results (if applicable)
   └─ Return to pool (don't close)

Tool Discovery Mechanism ​

ToolFinder.findTools(query)
    ↓
DiscoveryEngine.findRelevantTools(query)
    ↓
Vector Similarity Search
    ├─ Convert query to embedding
    ├─ Search against indexed tools
    └─ Return sorted by relevance

Results
    ├─ Full tool schemas (if depth >= 2)
    ├─ Names + descriptions (if depth >= 1)
    └─ Names only (if depth = 0)

Internal MCP Architecture ​

NCPManagementMCP (Bundled)
├─ add: Add new MCPs to profile
├─ remove: Remove MCPs from profile
├─ list: List configured MCPs
├─ import: Import configs
└─ export: Export configs

NCPSchedulerMCP (Bundled)
├─ create: Create scheduled jobs
├─ retrieve: Get job status
├─ update: Modify job settings
└─ delete: Remove jobs

Advanced Configuration ​

Environment Variables ​

bash
# Debugging
NCP_DEBUG=true              # Enable debug logging
DEBUG=true                  # Alternative debug flag

# Auto-import control
NCP_SKIP_AUTO_IMPORT=true   # Disable Claude Desktop sync

# Scheduler
NCP_ENABLE_SCHEDULER=true   # Enable built-in scheduler

# Confirmation
NCP_CONFIRM_BEFORE_RUN=true # Always show confirmation

Profile-Specific Optimization ​

bash
# Create a high-performance profile
ncp config --profile performance

# Add only essential MCPs
ncp add github --profile performance
ncp add filesystem --profile performance

# Use it for critical operations
ncp run --profile performance github:get_issues owner=myorg

Best Practices ​

1. Use Profiles for Different Contexts ​

bash
# Development profile (many MCPs)
ncp list --profile dev | wc -l

# Production profile (essential only)
ncp list --profile prod | wc -l

2. Monitor Resource Usage ​

bash
# Check connection count
ncp config debugLogging true
# Look for active connections in logs

# Monitor cache effectiveness
# Expect 70%+ cache hits for typical workflows

3. Implement Graceful Degradation ​

bash
# Always handle tool-not-found errors
ncp run github:get_organization owner=myorg || \
  echo "GitHub MCP unavailable, using fallback"

# Use dry-run for validation
ncp run mcp:tool param=value --dry-run && \
  ncp run mcp:tool param=value || \
  echo "Validation failed"

4. Batch Operations Strategically ​

bash
# Good: Batch related operations
for repo in repo1 repo2 repo3; do
  ncp run github:create_issue owner=org repo=$repo title="Bug"
done

# Better: Use multi-argument tools when available
ncp run github:bulk_create_issues owner=org repos="repo1,repo2,repo3" titles="Bug"

5. Schedule Repetitive Tasks ​

bash
# Schedule daily health checks
ncp schedule create \
  --name "health-check" \
  --tool github:check_status \
  --schedule "0 9 * * *" \
  --timezone "America/New_York"

# Monitor scheduled job execution
ncp schedule retrieve --job health-check --executions

Performance Benchmarks ​

Typical performance metrics on a modern system:

  • Tool Discovery: 50-200ms (cached: 1-5ms)
  • Tool Execution: 100-2000ms (depends on MCP)
  • Connection Reuse: 5-10x faster than new connections
  • Cache Hit: 95%+ after initial discovery

Getting Help ​

  • Check debug logs: ncp config debugLogging true
  • Review MCP status: ncp doctor
  • Consult test-drive guide: ncp resources read ncp:test-drive
  • Review docs: ncp resources read ncp:help/getting-started

Released under the Elastic License 2.0.