waifuai/mcp-waifu-chat
If you are the rightful owner of mcp-waifu-chat and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
MCP Waifu Chat Server is a conversational AI server using the Model Context Protocol for a 'waifu' character, leveraging the Google Gemini API.
MCP Waifu Chat Server
This project implements a basic MCP (Model Context Protocol) server for a conversational AI "waifu" character. It uses the mcp
library for Python to handle the protocol details and FastMCP
for easy server setup.
Features
- User management (create, check existence, delete, count)
- Dialog history storage (get, set, reset)
- Basic chat functionality (using Google GenAI SDK Client)
- Modular design for easy extension
- Configuration via environment variables and API key file
- SQLite database for persistence
- Comprehensive unit tests
Requirements
- Python 3.10+
uv
- An OpenRouter API Key or a Google Gemini API Key
Installation
-
Clone the repository:
git clone <repository_url> cd mcp-waifu-chat
-
Install uv (if not installed) With curl:
curl -LsSf https://astral.sh/uv/install.sh | sh
Or with powershell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
-
Create the virtual environment and ensure tooling inside:
python -m uv venv .venv .venv/Scripts/python.exe -m ensurepip .venv/Scripts/python.exe -m pip install uv
-
Install dependencies:
.venv/Scripts/python.exe -m uv pip install -e .[test]
Configuration
The server uses a combination of a file for the API key and environment variables (or a .env
file) for other configurations.
API Keys: You can use either OpenRouter (default) or Gemini.
OpenRouter (default):
- Preferred via environment variable:
OPENROUTER_API_KEY
- Fallback: single-line key file
~/.api-openrouter
- Model resolution precedence:
OPENROUTER_MODEL_NAME
~/.model-openrouter
openrouter/horizon-beta
Gemini:
- Preferred via environment variables:
GEMINI_API_KEY
orGOOGLE_API_KEY
- Fallback: single-line key file
~/.api-gemini
- Model resolution precedence:
GEMINI_MODEL_NAME
~/.model-gemini
gemini-2.5-pro
You can obtain a key from Google AI Studio.
Other Configuration (.env
file or environment variables):
An example .env.example
file is provided for other settings:
DATABASE_FILE=dialogs.db
DEFAULT_RESPONSE="I'm sorry, I'm having trouble connecting to the AI model."
DEFAULT_GENRE="Fantasy"
FLASK_PORT=5000
GEMINI_MODEL_NAME=gemini-2.5-pro
DATABASE_FILE
: Path to the SQLite database file (default:dialogs.db
).DEFAULT_RESPONSE
: The default response to send when the AI model is unavailable (default: "The AI model is currently unavailable. Please try again later.").DEFAULT_GENRE
: The default conversation genre (default: "Romance").FLASK_PORT
: The port the server will listen on (default: 5000).GEMINI_MODEL_NAME
: The specific Gemini model to use (default:gemini-2.5-pro
).
Copy .env.example
to .env
and customize the values as needed (except for the API key, which is read from ~/.api-gemini
).
Running the Server
Ensure your ~/.api-gemini
file is set up correctly. Then, to run the server, use:
uv run mcp-waifu-chat
This runs the mcp_waifu_chat/api.py
file (since that's where the FastMCP
instance is defined) and starts up the server.
Running Tests
To run the unit tests:
uv run pytest
This will execute all tests in the tests/
directory using pytest
. The tests include database tests and API endpoint tests. Note: API tests currently do not cover the live Gemini interaction and may need adaptation for mocking.
API Endpoints
The server provides the following MCP-compliant endpoints (using FastMCP
's automatic routing):
Server Status
/v1/server/status
(GET): Checks the server status. Returns{"status": "ok"}
. This is a standard MCP endpoint.
User Management Tools
These are implemented as MCP tools.
create_user
(user_id: str): Creates a new user.check_user
(user_id: str): Checks if a user exists. Returns{"user_id": str, "exists": bool}
.delete_user
(user_id: str): Deletes a user.user_count
: returns the number of users in the database for the current user.
Dialog Management Tools
reset_dialog
(user_id: str)
Resources
/v1/user/dialog/json/{user_id}
: Dynamic resource to return dialogs as JSON./v1/user/dialog/str/{user_id}
: Dynamic resource to return dialogs as a string
Chat Tool
chat
(message: str, user_id: str): Sends a chat message and gets a response generated by the selected provider (OpenRouter by default or Google GenAI).
LLM Integration (Providers: OpenRouter default, Gemini supported)
The dispatcher in selects a provider and generates responses.
Default provider: openrouter
Provider selection:
- Config field
default_provider
(env:DEFAULT_PROVIDER
) chooses "openrouter" or "gemini" (defaults to "openrouter").
Model resolution precedence:
- OpenRouter model name:
OPENROUTER_MODEL_NAME
env; else~/.model-openrouter
; elseopenrouter/horizon-beta
. - Gemini model name:
GEMINI_MODEL_NAME
env; else~/.model-gemini
; elsegemini-2.5-pro
.
Credentials:
- OpenRouter:
OPENROUTER_API_KEY
env; else~/.api-openrouter
. - Gemini:
GEMINI_API_KEY
env; elseGOOGLE_API_KEY
env; else~/.api-gemini
.
Call patterns:
- OpenRouter: HTTPS POST to https://openrouter.ai/api/v1/chat/completions with a single user message.
- Gemini:
client.models.generate_content(model=..., contents=...)
via .
Both paths include defensive parsing and error handling, returning config.default_response
when unavailable.
Deploying to Production
For a production deployment, you should:
-
Use a production-ready WSGI/ASGI server: Gunicorn is recommended and included in the
pyproject.toml
. Example command:gunicorn --workers 4 --bind 0.0.0.0:8000 mcp_waifu_chat.api:app -k uvicorn.workers.UvicornWorker
This runs the
app
object (ourFastMCP
instance) frommcp_waifu_chat/api.py
using 4 Uvicorn workers managed by Gunicorn, listening on port 8000. Adjust the number of workers and the port as needed. -
Use a robust database: Consider PostgreSQL or MySQL instead of SQLite for higher concurrency and scalability.
-
Implement proper logging: Configure logging to write to files, a centralized logging service, or a monitoring system.
-
Secure your server: Use HTTPS, implement authentication/authorization, and follow security best practices for web applications.
-
Consider a reverse proxy: Use a reverse proxy like Nginx or Apache to handle TLS termination, load balancing, and static file serving.
-
Containerize Use Docker to simplify deployment.
Project Structure Explanation
mcp_waifu_chat/
(Main Package):__init__.py
: Makes the directory a Python package.api.py
: The core FastMCP application, tool/resource definitions, and request handling logic.config.py
: Handles loading and validating configuration settings.db.py
: All database interaction logic (creating tables, querying, updating).models.py
: Pydantic models for request/response data validation and serialization.utils.py
: Helper functions, likedialog_to_json
andjson_to_dialog
.ai.py
: This module is responsible for interacting with the Google Gemini AI model.
tests/
(Test Suite):conftest.py
: pytest configuration, including fixtures for the test database and test client.test_db.py
: Unit tests for thedb.py
module.test_api.py
: Unit tests for the API endpoints inapi.py
.
run.py
:: Simple file to run the server (Note:uv run mcp-waifu-chat
is preferred).
This structure promotes modularity, testability, and maintainability. Each module has a specific responsibility, making it easier to understand, modify, and extend the codebase.