Skip to main content

๐Ÿงช MCP Foundation Testing Guide

โš ๏ธ PLANNED FEATURE: This documentation describes features that are planned but not yet implemented. The ContextManager class referenced in this guide does not currently exist in the codebase. The code examples are illustrative of the intended API design.

NeuroLink v1.3.0 MCP Foundation - Comprehensive guide for testing MCP functionality and adding custom MCP servers.


๐ŸŽฏ Current MCP Implementation Statusโ€‹

โœ… What's Already Workingโ€‹

  • ๐Ÿญ MCP Server Factory: createMCPServer() with full validation
  • ๐Ÿง  Context Management: Rich context system with 15+ fields
  • ๐Ÿ“‹ Tool Registry: Complete registration and execution system
  • ๐ŸŽผ Tool Orchestration: Pipeline execution with error handling
  • ๐Ÿค– AI Core Server: 3 production-ready AI tools

๐Ÿ”„ What Needs CLI Integrationโ€‹

The MCP Foundation is complete but not yet exposed via CLI commands. This guide shows both:

  1. Programmatic Testing (works now)
  2. CLI Integration (how to add it)

๐Ÿงช Testing MCP Foundation Programmaticallyโ€‹

1. Basic MCP Server Creationโ€‹

Create a test file to explore MCP functionality:

// test-mcp.ts (TypeScript; run with ts-node or compile first)
import { createMCPServer } from "@juspay/neurolink";
import {
NeuroLinkMCPTool,
NeuroLinkExecutionContext,
ToolResult,
} from "@juspay/neurolink";

// Create a custom MCP server
const testServer = createMCPServer({
id: "my-test-server",
title: "My Test Server",
description: "Testing custom MCP tools",
category: "custom",
visibility: "private",
});

// Add a simple tool
testServer.registerTool({
name: "hello-world",
description: "Simple hello world tool for testing",
execute: async (
params: any,
context: NeuroLinkExecutionContext,
): Promise<ToolResult> => {
console.log("Hello World tool executed!");
console.log("Context:", context.sessionId);

return {
success: true,
data: { message: `Hello, ${params.name || "World"}!` },
metadata: {
toolName: "hello-world",
timestamp: Date.now(),
},
};
},
});

console.log("Test server created:", testServer.id);
console.log("Available tools:", Object.keys(testServer.tools));

2. Testing with AI Core Serverโ€‹

// test-ai-core.ts
import { aiCoreServer } from "@juspay/neurolink";
import { ContextManager } from "@juspay/neurolink";

async function testAICoreServer() {
// Create execution context
const context = ContextManager.createExecutionContext({
sessionId: "test-session-123",
userId: "test-user",
aiProvider: "openai",
environmentType: "development",
});

console.log("๐Ÿงช Testing AI Core Server...");

// Test text generation tool
try {
const result = await aiCoreServer.tools["generate"].execute(
{
prompt: "Write a haiku about AI",
temperature: 0.7,
maxTokens: 100,
},
context,
);

console.log("โœ… Text Generation Result:", result);
} catch (error) {
console.error("โŒ Text Generation Error:", error);
}

// Test provider selection tool
try {
const providerResult = await aiCoreServer.tools["select-provider"].execute(
{
preferred: "openai",
requirements: {
streaming: true,
costEfficient: true,
},
},
context,
);

console.log("โœ… Provider Selection Result:", providerResult);
} catch (error) {
console.error("โŒ Provider Selection Error:", error);
}

// Test provider status tool
try {
const statusResult = await aiCoreServer.tools[
"check-provider-status"
].execute(
{
includeCapabilities: true,
},
context,
);

console.log("โœ… Provider Status Result:", statusResult);
} catch (error) {
console.error("โŒ Provider Status Error:", error);
}
}

testAICoreServer();

3. Testing Tool Registry and Orchestrationโ€‹

// test-orchestration.ts
import { MCPRegistry } from "@juspay/neurolink";
import { ToolOrchestrator } from "@juspay/neurolink";
import { ContextManager } from "@juspay/neurolink";
import { aiCoreServer } from "@juspay/neurolink";

async function testOrchestration() {
// Initialize registry and orchestrator
const registry = new MCPRegistry();
const orchestrator = new ToolOrchestrator(registry);

// Register AI Core Server
registry.registerServer(aiCoreServer);

// Create execution context
const context = ContextManager.createExecutionContext({
sessionId: "orchestration-test",
environmentType: "development",
});

console.log("๐ŸŽผ Testing Tool Orchestration...");

// Execute single tool
try {
const result = await orchestrator.executeTool(
"neurolink-ai-core",
"generate",
{ prompt: "Explain quantum computing in one sentence", maxTokens: 50 },
context,
);

console.log("โœ… Single Tool Execution:", result);
} catch (error) {
console.error("โŒ Single Tool Error:", error);
}

// Execute pipeline (sequential tools)
try {
const pipelineResult = await orchestrator.executePipeline(
[
{
serverId: "neurolink-ai-core",
toolName: "select-provider",
params: { preferred: "openai" },
},
{
serverId: "neurolink-ai-core",
toolName: "generate",
params: { prompt: "Write a technical joke", maxTokens: 100 },
},
],
context,
);

console.log("โœ… Pipeline Execution:", pipelineResult);
} catch (error) {
console.error("โŒ Pipeline Error:", error);
}

// Get orchestrator statistics
const stats = orchestrator.getStatistics();
console.log("๐Ÿ“Š Orchestrator Statistics:", stats);
}

testOrchestration();

๐Ÿ”จ Adding Custom MCP Serversโ€‹

1. Creating a Development Tools Serverโ€‹

// servers/dev-tools-server.ts
import { createMCPServer } from "@juspay/neurolink";
import { z } from "zod";
import type { NeuroLinkExecutionContext, ToolResult } from "@juspay/neurolink";

// Create development tools server
export const devToolsServer = createMCPServer({
id: "neurolink-dev-tools",
title: "NeuroLink Development Tools",
description: "Code generation, testing, and development utilities",
category: "development",
version: "1.0.0",
capabilities: [
"code-generation",
"test-creation",
"documentation",
"refactoring",
],
});

// Code Generation Tool
devToolsServer.registerTool({
name: "generate-component",
description: "Generate React/Vue/Svelte components with TypeScript",
inputSchema: z.object({
framework: z.enum(["react", "vue", "svelte"]),
componentName: z.string(),
props: z
.array(
z.object({
name: z.string(),
type: z.string(),
required: z.boolean().default(false),
}),
)
.optional(),
styling: z
.enum(["css", "scss", "styled-components", "tailwind"])
.optional(),
}),
execute: async (
params: any,
context: NeuroLinkExecutionContext,
): Promise<ToolResult> => {
const { framework, componentName, props = [], styling = "css" } = params;

// Generate component code based on framework
let componentCode = "";

if (framework === "react") {
const propsInterface =
props.length > 0
? `interface ${componentName}Props {\n${props.map((p) => ` ${p.name}${p.required ? "" : "?"}: ${p.type};`).join("\n")}\n}\n\n`
: "";

componentCode = `${propsInterface}export function ${componentName}(${props.length > 0 ? `props: ${componentName}Props` : ""}) {
return (
<div className="${componentName.toLowerCase()}">
<h1>${componentName} Component</h1>
{/* Add your component logic here */}
</div>
);
}`;
} else if (framework === "svelte") {
const scriptProps =
props.length > 0
? `<script lang="ts">\n${props.map((p) => ` export let ${p.name}: ${p.type}${p.required ? "" : " | undefined"};`).join("\n")}\n</script>\n\n`
: "";

componentCode = `${scriptProps}<div class="${componentName.toLowerCase()}">
<h1>${componentName} Component</h1>
<!-- Add your component markup here -->
</div>

<style>
.${componentName.toLowerCase()} {
/* Add your styles here */
}
</style>`;
}

return {
success: true,
data: {
code: componentCode,
framework,
componentName,
propsCount: props.length,
styling,
},
metadata: {
toolName: "generate-component",
serverId: "neurolink-dev-tools",
timestamp: Date.now(),
},
};
},
});

// Test Generation Tool
devToolsServer.registerTool({
name: "generate-tests",
description: "Generate unit tests for components or functions",
inputSchema: z.object({
testFramework: z.enum(["vitest", "jest", "playwright"]),
targetFile: z.string(),
functions: z.array(z.string()),
coverage: z.enum(["basic", "comprehensive"]).default("basic"),
}),
execute: async (
params: any,
context: NeuroLinkExecutionContext,
): Promise<ToolResult> => {
const { testFramework, targetFile, functions, coverage } = params;

const testTemplate = `import { describe, it, expect } from '${testFramework}';
import { ${functions.join(", ")} } from '${targetFile}';

${functions
.map(
(fn) => `describe('${fn}', () => {
it('should ${coverage === "comprehensive" ? "handle all edge cases" : "work correctly"}', () => {
// Test implementation for ${fn}
expect(${fn}).toBeDefined();
});
});`,
)
.join("\n\n")}`;

return {
success: true,
data: {
testCode: testTemplate,
testFramework,
functionsCount: functions.length,
coverage,
},
metadata: {
toolName: "generate-tests",
serverId: "neurolink-dev-tools",
timestamp: Date.now(),
},
};
},
});

console.log(
"[DevTools] Development Tools Server created with tools:",
Object.keys(devToolsServer.tools),
);

2. Creating a Content Creation Serverโ€‹

// servers/content-server.ts
import { createMCPServer } from "@juspay/neurolink";
import { z } from "zod";
import type { NeuroLinkExecutionContext, ToolResult } from "@juspay/neurolink";

export const contentServer = createMCPServer({
id: "neurolink-content",
title: "NeuroLink Content Creation",
description: "Blog posts, documentation, and marketing content generation",
category: "content",
version: "1.0.0",
});

// Blog Post Generation Tool
contentServer.registerTool({
name: "generate-blog-post",
description: "Generate blog posts with SEO optimization",
inputSchema: z.object({
topic: z.string(),
audience: z.enum(["technical", "business", "general"]),
length: z.enum(["short", "medium", "long"]),
tone: z.enum(["professional", "casual", "educational"]),
includeSEO: z.boolean().default(true),
}),
execute: async (
params: any,
context: NeuroLinkExecutionContext,
): Promise<ToolResult> => {
// Use AI Core Server for content generation
const aiResult = (await context.toolChain?.includes("neurolink-ai-core"))
? { content: `Generated blog post about ${params.topic}...` }
: {
content: `Mock blog post about ${params.topic} for ${params.audience} audience`,
};

const metadata = {
wordCount:
params.length === "short"
? 500
: params.length === "medium"
? 1000
: 2000,
readingTime:
params.length === "short" ? 2 : params.length === "medium" ? 5 : 8,
seoOptimized: params.includeSEO,
};

return {
success: true,
data: {
content: aiResult.content,
...metadata,
topic: params.topic,
audience: params.audience,
},
metadata: {
toolName: "generate-blog-post",
serverId: "neurolink-content",
timestamp: Date.now(),
},
};
},
});

console.log(
"[Content] Content Creation Server created with tools:",
Object.keys(contentServer.tools),
);

๐Ÿ–ฅ๏ธ Adding MCP Commands to CLIโ€‹

To integrate MCP functionality into the CLI, add these commands to src/cli/index.ts:

1. MCP Server Management Commandsโ€‹

// Add to CLI (src/cli/index.ts)

.command('mcp <subcommand>', 'Manage MCP servers and tools',
(yargsMCP) => {
yargsMCP
.usage('Usage: $0 mcp <subcommand> [options]')
.command('list-servers', 'List all registered MCP servers',
() => {},
async (argv) => {
const registry = new MCPRegistry();
// Register default servers
registry.registerServer(aiCoreServer);

const servers = registry.listServers();
console.log(chalk.blue('๐Ÿ“‹ Registered MCP Servers:'));
servers.forEach(server => {
console.log(` โ€ข ${chalk.green(server.id)} - ${server.title}`);
console.log(` Category: ${server.category}, Tools: ${server.toolCount}`);
});
}
)
.command('list-tools [serverId]', 'List tools for all servers or specific server',
(y) => y.positional('serverId', {
type: 'string',
description: 'Optional server ID to filter tools'
}),
async (argv) => {
const registry = new MCPRegistry();
registry.registerServer(aiCoreServer);

const tools = argv.serverId
? registry.getServerTools(argv.serverId)
: registry.listAllTools();

console.log(chalk.blue('๐Ÿ”ง Available MCP Tools:'));
tools.forEach(tool => {
console.log(` โ€ข ${chalk.green(tool.name)} (${tool.serverId})`);
console.log(` ${tool.description}`);
});
}
)
.command('execute <serverId> <toolName>', 'Execute an MCP tool',
(y) => y
.positional('serverId', { type: 'string', demandOption: true })
.positional('toolName', { type: 'string', demandOption: true })
.option('params', { type: 'string', description: 'JSON parameters for the tool' })
.option('session', { type: 'string', default: 'cli-session', description: 'Session ID' }),
async (argv) => {
const registry = new MCPRegistry();
const orchestrator = new ToolOrchestrator(registry);

// Register servers
registry.registerServer(aiCoreServer);

const context = ContextManager.createExecutionContext({
sessionId: argv.session,
environmentType: 'development',
aiProvider: 'auto'
});

try {
const params = argv.params ? JSON.parse(argv.params) : {};
const result = await orchestrator.executeTool(
argv.serverId,
argv.toolName,
params,
context
);

console.log(chalk.green('โœ… Tool execution successful:'));
console.log(JSON.stringify(result, null, 2));
} catch (error) {
console.error(chalk.red('โŒ Tool execution failed:'), error);
}
}
)
.demandCommand(1, 'Please specify an MCP subcommand');
}
)

2. Quick MCP Testing Commandsโ€‹

// Add convenience commands
.command('mcp-generate <prompt>', 'Quick AI text generation via MCP',
(y) => y
.positional('prompt', { type: 'string', demandOption: true })
.option('provider', { type: 'string', description: 'Preferred AI provider' }),
async (argv) => {
const registry = new MCPRegistry();
const orchestrator = new ToolOrchestrator(registry);
registry.registerServer(aiCoreServer);

const context = ContextManager.createExecutionContext({
sessionId: 'mcp-cli-' + Date.now(),
aiProvider: argv.provider
});

try {
const result = await orchestrator.executeTool(
'neurolink-ai-core',
'generate',
{ prompt: argv.prompt, maxTokens: 200 },
context
);

if (result.success) {
console.log('\n' + result.data.text + '\n');
console.log(chalk.blue(`Provider: ${result.data.provider}`));
} else {
console.error(chalk.red('Generation failed:'), result.error);
}
} catch (error) {
console.error(chalk.red('MCP execution error:'), error);
}
}
)

๐Ÿงช Running MCP Testsโ€‹

1. Run Existing Test Suiteโ€‹

# Run comprehensive MCP tests
pnpm run test:run

# Run specific MCP tests
npx vitest run test/mcp-comprehensive.test.ts

2. Test Custom MCP Serverโ€‹

Create and run a test file:

# Create test file
cat > test-custom-mcp.ts << 'EOF'
import { createMCPServer } from '@juspay/neurolink';

const myServer = createMCPServer({
id: 'test-server',
title: 'Test Server'
});

myServer.registerTool({
name: 'test-tool',
description: 'Test tool',
execute: async () => ({ success: true, data: 'Hello from MCP!' })
});

console.log('Server created:', myServer.id);
console.log('Tools:', Object.keys(myServer.tools));
EOF

# Install ts-node if not available
npm install -g ts-node typescript
# Or use npx for one-time execution without global install

# Run test
npx ts-node test-custom-mcp.ts

3. Test MCP via Node.js REPLโ€‹

# Start Node.js REPL with NeuroLink
node -r ts-node/register

# In REPL:
> const { createMCPServer } = require('@juspay/neurolink');
> const server = createMCPServer({ id: 'repl-test', title: 'REPL Test' });
> console.log('Server created:', server.id);

๐Ÿ“Š MCP Development Workflowโ€‹

1. Development Cycleโ€‹

  1. Create MCP Server - Use createMCPServer()
  2. Add Tools - Register tools with validation
  3. Test Tools - Use registry and orchestrator
  4. Integrate with CLI - Add CLI commands
  5. Run Tests - Validate functionality

2. Best Practicesโ€‹

  • Use TypeScript for full type safety
  • Validate inputs with Zod schemas
  • Handle errors gracefully in tools
  • Log execution for debugging
  • Test thoroughly before deployment

3. Performance Monitoringโ€‹

// Monitor tool performance
const stats = orchestrator.getStatistics();
console.log("Tool execution stats:", stats);

// Track context usage
const contextStats = ContextManager.getStatistics();
console.log("Context management stats:", contextStats);

๐Ÿš€ Next Stepsโ€‹

  1. โœ… Test Current Implementation - Use programmatic testing examples
  2. ๐Ÿ”ง Add CLI Integration - Implement MCP CLI commands
  3. ๐Ÿ—๏ธ Create Custom Servers - Build domain-specific tool servers
  4. ๐Ÿ“Š Monitor Performance - Track tool execution and usage
  5. ๐Ÿ”„ Iterate and Improve - Enhance based on real usage

MCP Foundation is production-ready and waiting for your custom tools! ๐ŸŽ‰