Holaspirit MCP Server

# MCP Extension for SillyTavern This extension adds WebSocket-based tool execution support to SillyTavern, allowing external tools to be registered and executed through a standardized interface. ## Features - WebSocket server for real-time communication - Tool registration and execution system - JSON Schema validation for tool definitions - Real-time execution status updates - Configurable logging and WebSocket settings - Web-based settings UI integrated into SillyTavern ## Installation ### Method 1: Web Interface (Recommended) See [INSTRUCTIONS.md](INSTRUCTIONS.md) for step-by-step instructions on installing through SillyTavern's web interface. ### Method 2: Manual Installation 1. Clone this repository into your SillyTavern plugins directory: ```bash cd /path/to/SillyTavern/plugins git clone https://github.com/CG-Labs/SillyTavern-MCP-Extension.git mcp-extension ``` 2. Install dependencies: ```bash cd mcp-extension npm install ``` 3. Restart SillyTavern ## Configuration The extension can be configured through the SillyTavern UI under Settings > Extensions > MCP Extension. ### Available Settings - **WebSocket Port**: The port number for the WebSocket server (default: 5005) - **Log Level**: Logging verbosity level (debug, info, warn, error) ## Usage ### Registering a Tool To register a tool, send a WebSocket message with the following format: ```json { "type": "register_tool", "data": { "name": "example_tool", "schema": { "type": "object", "properties": { "param1": { "type": "string", "description": "First parameter" }, "param2": { "type": "number", "description": "Second parameter" } }, "required": ["param1"] } } } ``` ### Executing a Tool To execute a registered tool, send a WebSocket message with the following format: ```json { "type": "execute_tool", "data": { "executionId": "unique_execution_id", "name": "example_tool", "args": { "param1": "value1", "param2": 42 } } } ``` ### Execution Status Updates The extension broadcasts execution status updates to all connected clients: #### Execution Started ```json { "type": "tool_execution_started", "data": { "executionId": "unique_execution_id", "name": "example_tool", "args": { "param1": "value1", "param2": 42 } } } ``` #### Execution Completed ```json { "type": "tool_execution_completed", "data": { "executionId": "unique_execution_id", "result": { // Tool-specific result data } } } ``` #### Execution Failed ```json { "type": "tool_execution_failed", "data": { "executionId": "unique_execution_id", "error": { "code": "ERROR_CODE", "message": "Error message" } } } ``` ## Error Codes - `INVALID_NAME`: Invalid tool name - `INVALID_SCHEMA`: Invalid tool schema - `INVALID_URI`: Invalid resource URI - `INVALID_HANDLER`: Invalid handler implementation - `INVALID_ARGUMENTS`: Invalid tool arguments - `TOOL_EXISTS`: Tool already registered - `TOOL_NOT_FOUND`: Tool not found - `TOOL_EXECUTION_FAILED`: Tool execution failed - `SERVER_ERROR`: Internal server error ## Development ### Project Structure ``` mcp-extension/ ├── index.js # Main plugin entry point ├── manifest.json # Plugin manifest ├── package.json # Dependencies and scripts ├── public/ # Public assets │ ├── script.js # Client-side JavaScript │ ├── style.css # Client-side styles │ └── templates/ # HTML templates ├── utils/ # Utility modules │ ├── errors.js # Error handling │ ├── logger.js # Logging utility │ └── validation.js # Input validation └── README.md # This documentation ``` ### Adding New Tools To add a new tool: 1. Connect to the WebSocket server 2. Register your tool with a schema 3. Listen for execution requests 4. Handle execution and return results Example tool implementation: ```javascript const ws = new WebSocket('ws://localhost:5005'); ws.onopen = () => { // Register tool ws.send(JSON.stringify({ type: 'register_tool', data: { name: 'example_tool', schema: { type: 'object', properties: { input: { type: 'string' } }, required: ['input'] } } })); }; ws.onmessage = (event) => { const message = JSON.parse(event.data); if (message.type === 'execute_tool' && message.data.name === 'example_tool') { // Handle execution const result = doSomething(message.data.args.input); // Send result ws.send(JSON.stringify({ type: 'tool_execution_completed', data: { executionId: message.data.executionId, result } })); } }; ``` ## Contributing 1. Fork the repository 2. Create a feature branch 3. Commit your changes 4. Push to the branch 5. Create a Pull Request ## Support If you encounter any issues or have questions: 1. Check the [GitHub Issues](https://github.com/CG-Labs/SillyTavern-MCP-Extension/issues) for existing problems 2. Create a new issue if your problem hasn't been reported 3. Join the SillyTavern Discord community for support ## License MIT License - see LICENSE file for details