mirror of
https://github.com/ruvnet/RuView
synced 2026-08-09 20:21:43 +00:00
407b46b206
Add ruvnet/midstream (AIMDS real-time inference) and ruvnet/sublinear-time-solver (sublinear optimization algorithms) as vendored dependencies under vendor/.
302 lines
9.5 KiB
JavaScript
302 lines
9.5 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* MCP Integration Example - Psycho-Symbolic Reasoner
|
|
*
|
|
* This example demonstrates how to integrate the psycho-symbolic reasoner
|
|
* with the Model Context Protocol (MCP) for use with AI agents.
|
|
*/
|
|
|
|
import { FastMCP } from 'fastmcp';
|
|
import { createPsychoSymbolicTools } from '../dist/mcp/index.js';
|
|
|
|
async function main() {
|
|
console.log('🔌 Psycho-Symbolic Reasoner - MCP Integration Example\n');
|
|
|
|
try {
|
|
// Create MCP server
|
|
console.log('🚀 Creating FastMCP server...');
|
|
const server = new FastMCP({
|
|
name: "PsychoSymbolicReasoner",
|
|
version: "1.0.0",
|
|
description: "Psycho-symbolic reasoning tools for AI agents"
|
|
});
|
|
|
|
// Create and register psycho-symbolic tools
|
|
console.log('🛠️ Registering psycho-symbolic tools...');
|
|
const tools = await createPsychoSymbolicTools({
|
|
knowledgeBasePath: './examples/knowledge-base.json',
|
|
enableLogging: true
|
|
});
|
|
|
|
tools.forEach(tool => {
|
|
server.addTool(tool);
|
|
console.log(` ✅ Registered tool: ${tool.name}`);
|
|
});
|
|
|
|
console.log(`\n📋 Available MCP Tools:`);
|
|
console.log('─'.repeat(40));
|
|
|
|
// List all available tools
|
|
const toolList = [
|
|
{
|
|
name: 'queryGraph',
|
|
description: 'Perform symbolic graph reasoning queries',
|
|
example: 'find relaxation techniques for stressed users'
|
|
},
|
|
{
|
|
name: 'extractSentiment',
|
|
description: 'Analyze sentiment and emotional context',
|
|
example: 'I\'m feeling overwhelmed with deadlines'
|
|
},
|
|
{
|
|
name: 'extractPreferences',
|
|
description: 'Extract user preferences from text',
|
|
example: 'I prefer working in quiet environments'
|
|
},
|
|
{
|
|
name: 'createPlan',
|
|
description: 'Generate goal-oriented action plans',
|
|
example: 'Goal: reduce stress, State: tired and anxious'
|
|
},
|
|
{
|
|
name: 'analyzeContext',
|
|
description: 'Comprehensive psycho-symbolic analysis',
|
|
example: 'User seems frustrated with current workflow'
|
|
}
|
|
];
|
|
|
|
toolList.forEach((tool, index) => {
|
|
console.log(`${index + 1}. ${tool.name}`);
|
|
console.log(` Description: ${tool.description}`);
|
|
console.log(` Example: "${tool.example}"`);
|
|
console.log('');
|
|
});
|
|
|
|
// Example of testing tools programmatically
|
|
console.log('🧪 Testing MCP Tools');
|
|
console.log('─'.repeat(25));
|
|
|
|
// Test sentiment extraction
|
|
console.log('1. Testing sentiment extraction...');
|
|
try {
|
|
const sentimentResult = await server.callTool('extractSentiment', {
|
|
text: "I'm excited about this new project but worried about the tight deadline",
|
|
includeEmotions: true
|
|
});
|
|
console.log(` Result: ${sentimentResult.score} (${sentimentResult.primaryEmotion})`);
|
|
} catch (error) {
|
|
console.log(` Simulated result: Mixed emotions detected (excitement + worry)`);
|
|
}
|
|
|
|
// Test preference extraction
|
|
console.log('\n2. Testing preference extraction...');
|
|
try {
|
|
const prefResult = await server.callTool('extractPreferences', {
|
|
text: "I like collaborative work but need quiet time for deep thinking",
|
|
domain: "work_environment"
|
|
});
|
|
console.log(` Found ${prefResult.preferences?.length || 2} preferences`);
|
|
} catch (error) {
|
|
console.log(` Simulated result: 2 preferences detected (likes collaboration, needs quiet)`);
|
|
}
|
|
|
|
// Test planning
|
|
console.log('\n3. Testing planning...');
|
|
try {
|
|
const planResult = await server.callTool('createPlan', {
|
|
goal: "improve work-life balance",
|
|
currentState: {
|
|
stress: "high",
|
|
workload: "overwhelming",
|
|
timeAvailable: "limited"
|
|
},
|
|
preferences: [
|
|
{ type: 'like', object: 'short_breaks' }
|
|
]
|
|
});
|
|
console.log(` Generated plan with ${planResult.plan?.length || 3} steps`);
|
|
} catch (error) {
|
|
console.log(` Simulated result: 3-step plan generated`);
|
|
}
|
|
|
|
// MCP Server Configuration Examples
|
|
console.log('\n⚙️ MCP Server Configuration Examples');
|
|
console.log('─'.repeat(45));
|
|
|
|
console.log('For Claude Desktop (claude_desktop_config.json):');
|
|
console.log(JSON.stringify({
|
|
"mcpServers": {
|
|
"psycho-reasoner": {
|
|
"command": "npx",
|
|
"args": ["psycho-symbolic-reasoner", "serve", "--transport", "stdio"],
|
|
"env": {
|
|
"PSR_LOG_LEVEL": "info"
|
|
}
|
|
}
|
|
}
|
|
}, null, 2));
|
|
|
|
console.log('\nFor VS Code MCP Extension:');
|
|
console.log(JSON.stringify({
|
|
"name": "Psycho-Symbolic Reasoner",
|
|
"command": ["npx", "psycho-symbolic-reasoner", "serve"],
|
|
"args": ["--transport", "stdio"],
|
|
"description": "Psycho-symbolic reasoning for AI agents"
|
|
}, null, 2));
|
|
|
|
// Usage examples for AI agents
|
|
console.log('\n🤖 AI Agent Usage Examples');
|
|
console.log('─'.repeat(35));
|
|
|
|
const usageExamples = [
|
|
{
|
|
scenario: "Therapy Assistant",
|
|
prompt: "A user says: 'I've been feeling anxious lately about work deadlines.'",
|
|
steps: [
|
|
"1. Use extractSentiment to analyze emotional state",
|
|
"2. Use queryGraph to find anxiety management techniques",
|
|
"3. Use createPlan to generate coping strategies",
|
|
"4. Provide personalized recommendations"
|
|
]
|
|
},
|
|
{
|
|
scenario: "Personal Productivity Coach",
|
|
prompt: "User: 'I'm struggling to focus during long work sessions.'",
|
|
steps: [
|
|
"1. Use extractPreferences to understand work style",
|
|
"2. Use queryGraph to find focus enhancement techniques",
|
|
"3. Use createPlan to design productivity workflow",
|
|
"4. Monitor progress and adapt recommendations"
|
|
]
|
|
},
|
|
{
|
|
scenario: "Educational Assistant",
|
|
prompt: "Student: 'I get overwhelmed studying for multiple exams.'",
|
|
steps: [
|
|
"1. Use extractSentiment to assess stress levels",
|
|
"2. Use extractPreferences to identify learning preferences",
|
|
"3. Use createPlan to organize study schedule",
|
|
"4. Provide stress management techniques"
|
|
]
|
|
}
|
|
];
|
|
|
|
usageExamples.forEach((example, index) => {
|
|
console.log(`${index + 1}. ${example.scenario}`);
|
|
console.log(` Scenario: ${example.prompt}`);
|
|
console.log(` Workflow:`);
|
|
example.steps.forEach(step => console.log(` ${step}`));
|
|
console.log('');
|
|
});
|
|
|
|
// Start the MCP server
|
|
console.log('🎯 Starting MCP Server');
|
|
console.log('─'.repeat(25));
|
|
console.log('Server will start on stdio transport...');
|
|
console.log('Use Ctrl+C to stop the server\n');
|
|
|
|
// Add signal handling for graceful shutdown
|
|
process.on('SIGINT', async () => {
|
|
console.log('\n🛑 Shutting down MCP server...');
|
|
await server.stop();
|
|
console.log('✅ Server stopped gracefully');
|
|
process.exit(0);
|
|
});
|
|
|
|
// Start server (this will block)
|
|
if (!process.argv.includes('--demo')) {
|
|
await server.start({ transportType: "stdio" });
|
|
} else {
|
|
console.log('🚧 Demo mode - server not actually started');
|
|
console.log('✅ MCP integration example completed!');
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error:', error.message);
|
|
console.error('Stack:', error.stack);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// Simulated MCP tools for demonstration
|
|
function createSimulatedMCPTools() {
|
|
return [
|
|
{
|
|
name: 'extractSentiment',
|
|
description: 'Analyze sentiment and emotional context from text',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
text: { type: 'string' },
|
|
includeEmotions: { type: 'boolean' }
|
|
},
|
|
required: ['text']
|
|
},
|
|
execute: async ({ text, includeEmotions }) => {
|
|
return {
|
|
score: Math.random() * 2 - 1,
|
|
primaryEmotion: ['joy', 'sadness', 'anger', 'fear'][Math.floor(Math.random() * 4)],
|
|
confidence: 0.8,
|
|
emotions: includeEmotions ? [
|
|
{ emotion: 'neutral', score: 0.1 }
|
|
] : undefined
|
|
};
|
|
}
|
|
},
|
|
{
|
|
name: 'createPlan',
|
|
description: 'Generate goal-oriented action plans',
|
|
parameters: {
|
|
type: 'object',
|
|
properties: {
|
|
goal: { type: 'string' },
|
|
currentState: { type: 'object' },
|
|
preferences: { type: 'array' }
|
|
},
|
|
required: ['goal']
|
|
},
|
|
execute: async ({ goal, currentState, preferences }) => {
|
|
return {
|
|
plan: [
|
|
{ name: 'Take a break', duration: 10 },
|
|
{ name: 'Practice mindfulness', duration: 15 },
|
|
{ name: 'Review priorities', duration: 20 }
|
|
],
|
|
confidence: 0.85
|
|
};
|
|
}
|
|
}
|
|
];
|
|
}
|
|
|
|
// Use simulated tools if in demo mode
|
|
if (process.argv.includes('--demo')) {
|
|
console.log('🚧 Running in demo mode with simulated MCP tools\n');
|
|
global.createPsychoSymbolicTools = async () => createSimulatedMCPTools();
|
|
global.FastMCP = class {
|
|
constructor(config) {
|
|
this.config = config;
|
|
this.tools = [];
|
|
}
|
|
addTool(tool) {
|
|
this.tools.push(tool);
|
|
}
|
|
async callTool(name, params) {
|
|
const tool = this.tools.find(t => t.name === name);
|
|
return tool ? await tool.execute(params) : { error: 'Tool not found' };
|
|
}
|
|
async start() {
|
|
console.log('Demo server started');
|
|
}
|
|
async stop() {
|
|
console.log('Demo server stopped');
|
|
}
|
|
};
|
|
}
|
|
|
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
main().catch(console.error);
|
|
}
|
|
|
|
export { main as mcpIntegrationExample }; |