# Dingo MCP Server
## Overview
Dingo provides a built-in Model Context Protocol (MCP) server, powered by [FastMCP](https://github.com/modelcontextprotocol/fastmcp). This allows MCP clients, such as Cursor, to interact with Dingo's data evaluation capabilities programmatically.
## Features
* Exposes Dingo's evaluation logic via MCP.
* Provides tools for:
* `run_dingo_evaluation`: Executes rule-based or LLM-based evaluations on specified data.
* `list_dingo_components`: Lists available rule groups and registered LLM models within Dingo.
* `get_rule_details`: Gets detailed information about a specific rule.
* `get_llm_details`: Gets detailed information about a specific LLM.
* `get_prompt_details`: Gets detailed information about a specific prompt.
* `run_quick_evaluation`: Runs a simplified evaluation based on a high-level goal.
* Enables interaction through MCP clients like Cursor.
## Installation
```bash
pip install dingo-python
```
This installs the `dingo` CLI command which includes the MCP server. No need to clone the repository.
For development or to customize `mcp_server.py` directly:
```bash
git clone https://github.com/MigoXLab/dingo.git
cd dingo
pip install -e .
```
## Running the Server
### Using the CLI (recommended)
```bash
# SSE transport (default) on port 8000
dingo serve
# Custom host and port
dingo serve --host 127.0.0.1 --port 9000
# stdio transport (for Claude Desktop or local agent spawn)
dingo serve --transport stdio
```
### Using mcp_server.py directly (legacy)
If you cloned the repository, you can also run the server script directly:
```bash
python mcp_server.py
```
### Transmission Modes
| Mode | Use Case | How to Start |
|------|----------|-------------|
| **SSE** (default) | Network service, Cursor integration | `dingo serve` or `dingo serve --port 9000` |
| **stdio** | Claude Desktop, local agent spawn | `dingo serve --transport stdio` |
## Integration with Cursor
### Configuration
To connect Cursor to your running Dingo MCP server, you need to edit Cursor's MCP configuration file (`mcp.json`). This file is typically located in Cursor's user configuration directory (e.g., `~/.cursor/` or `%USERPROFILE%\.cursor\`).
Add or modify the entry for your Dingo server within the `mcpServers` object.
**Example 1: SSE Mode** (run `dingo serve` first, then configure):
```json
{
"mcpServers": {
"dingo": {
"url": "http://localhost:8000/sse"
}
}
}
```
**Example 2: stdio Mode** (Cursor spawns the process automatically):
```json
{
"mcpServers": {
"dingo": {
"command": "dingo",
"args": ["serve", "--transport", "stdio"],
"env": {
"OPENAI_API_KEY": "your-api-key",
"OPENAI_BASE_URL": "https://api.openai.com/v1",
"OPENAI_MODEL": "gpt-4"
}
}
}
}
```
* For SSE mode: Start `dingo serve` first, then the `url` must match the host and port. Default is `http://localhost:8000/sse`.
* For stdio mode: Cursor spawns the `dingo serve --transport stdio` process automatically. No need to start the server manually.
* Restart Cursor after saving changes to `mcp.json`.
### Usage in Cursor
Once configured, you can invoke the Dingo tools within Cursor:
* **List Components**: "Use the dingo_evaluator tool to list available Dingo components."
* **Run Evaluation**: "Use the dingo_evaluator tool to run a rule evaluation..." or "Use the dingo_evaluator tool to run an LLM evaluation..."
* **Get Details**: "Use the dingo_evaluator tool to get details about a specific rule/LLM/prompt..."
* **Quick Evaluation**: "Use the dingo_evaluator tool to quickly evaluate a file for..."
Cursor will prompt you for the necessary arguments.
## Tool Reference
### `list_dingo_components()`
Lists available Dingo rule groups, registered LLM model identifiers, and prompt definitions.
* **Arguments**:
* `component_type` (Literal["rule_groups", "llm_models", "prompts", "all"]): Type of components to list. Default: "all".
* `include_details` (bool): Whether to include detailed descriptions and metadata for each component. Default: false.
* **Returns**: `Dict[str, List[str]]` - A dictionary containing `rule_groups`, `llm_models`, `prompts`, and/or `llm_prompt_mappings` based on component_type.
**Example Cursor Usage**:
> Use the dingo_evaluator tool to list dingo components.
### `get_rule_details()`
Get detailed information about a specific Dingo rule.
* **Arguments**:
* `rule_name` (str): The name of the rule to get details for.
* **Returns**: A dictionary containing details about the rule, including its description, parameters, and evaluation characteristics.
**Example Cursor Usage**:
> Use the Dingo Evaluator tool to get details about the 'default' rule group.
*(Cursor should propose a tool call like below)*
```xml
dingo_evaluator
get_rule_details
{
"rule_name": "default"
}
```
### `get_llm_details()`
Get detailed information about a specific Dingo LLM.
* **Arguments**:
* `llm_name` (str): The name of the LLM to get details for.
* **Returns**: A dictionary containing details about the LLM, including its description, capabilities, and configuration parameters.
**Example Cursor Usage**:
> Use the Dingo Evaluator tool to get details about the 'LLMTextQualityModelBase' LLM.
*(Cursor should propose a tool call like below)*
```xml
dingo_evaluator
get_llm_details
{
"llm_name": "LLMTextQualityModelBase"
}
```
### `get_prompt_details()`
Get detailed information about a specific Dingo prompt.
* **Arguments**:
* `prompt_name` (str): The name of the prompt to get details for.
* **Returns**: A dictionary containing details about the prompt, including its description, associated metric type, and which groups it belongs to.
**Example Cursor Usage**:
> Use the Dingo Evaluator tool to get details about the 'PromptTextQuality' prompt.
*(Cursor should propose a tool call like below)*
```xml
dingo_evaluator
get_prompt_details
{
"prompt_name": "PromptTextQuality"
}
```
### `run_quick_evaluation()`
Run a simplified Dingo evaluation based on a high-level goal.
* **Arguments**:
* `input_path` (str): Path to the file to evaluate.
* `evaluation_goal` (str): Description of what to evaluate (e.g., 'check for inappropriate content', 'evaluate text quality', 'assess helpfulness').
* **Returns**: A summary of the evaluation results or a path to the detailed results.
**Example Cursor Usage**:
> Use the Dingo Evaluator tool to quickly evaluate text quality in the file 'test/data/test_local_jsonl.jsonl'.
*(Cursor should propose a tool call like below)*
```xml
dingo_evaluator
run_quick_evaluation
{
"input_path": "test/data/test_local_jsonl.jsonl",
"evaluation_goal": "evaluate text quality and check for any issues"
}
```
### `run_dingo_evaluation(...)`
Runs a Dingo evaluation (rule-based or LLM-based).
* **Arguments**:
* `input_path` (str): Path to the input file or directory. Supports:
* **Relative paths** (recommended): Resolved relative to the current working directory (CWD), e.g., `test_data.jsonl`
* **Absolute paths**: Used directly if the file exists
* **Project-relative paths** (legacy): Falls back to project root if not found in CWD
* `evaluation_type` (Literal["rule", "llm"]): Type of evaluation.
* `eval_group_name` (str): Rule group name for `rule` type (default: `""` which uses 'default'). Valid rule groups are dynamically loaded from Dingo's Model registry. Use `list_dingo_components(component_type="rule_groups")` to see available groups. Ignored for `llm` type.
* `output_dir` (Optional[str]): Directory to save outputs. Defaults to a `dingo_output_*` subdirectory within the parent directory of `input_path`.
* `task_name` (Optional[str]): Name for the task (used in output path generation). Defaults to `mcp_eval_`.
* `save_data` (bool): Whether to save detailed JSONL output (default: True).
* `save_correct` (bool): Whether to save correct data (default: True).
* `kwargs` (dict): Dictionary for additional `dingo.io.InputArgs`. Common uses:
* `dataset` (str): Dataset type (e.g., 'local', 'hugging_face'). Defaults to 'local' if `input_path` is given.
* `data_format` (str): Input data format (e.g., 'json', 'jsonl', 'plaintext'). Inferred from `input_path` extension if possible.
* `column_content` (str): **Required** for formats like JSON/JSONL - specifies the key containing the text to evaluate.
* `column_id`, `column_prompt`, `column_image`: Other column mappings.
* `custom_config` (str | dict): Path to a JSON config file, a JSON string, or a dictionary for LLM evaluation or custom rule settings. API keys for LLMs **must** be provided here.
* `max_workers`, `batch_size`: Dingo execution parameters (default to 1 in MCP for stability).
* **Returns**: `str` - The absolute path to the primary output file (e.g., `summary.json`).
**Example Cursor Usage (Rule-based):**
> Use the Dingo Evaluator tool to run the default rule evaluation on `test/data/test_local_jsonl.jsonl`. Make sure to use the 'content' column.
*(Cursor should propose a tool call like below)*
```xml
dingo_evaluator
run_dingo_evaluation
{
"input_path": "test/data/test_local_jsonl.jsonl",
"evaluation_type": "rule",
"eval_group_name": "default",
"kwargs": {
"column_content": "content"
// data_format="jsonl" and dataset="local" will be inferred
}
}
```
**Example Cursor Usage (LLM-based):**
> Use the Dingo Evaluator tool to perform an LLM evaluation on `test/data/test_local_jsonl.jsonl`. Use the 'content' column. Configure it using the file `examples/mcp/config_self_deployed_llm.json`.
*(Cursor should propose a tool call like below. Note `eval_group_name` can be omitted or set when using `custom_config` for LLM evals)*
```xml
dingo_evaluator
run_dingo_evaluation
{
"input_path": "test/data/test_local_jsonl.jsonl",
"evaluation_type": "llm",
"kwargs": {
"column_content": "content",
"custom_config": "examples/mcp/config_self_deployed_llm.json"
// data_format="jsonl" and dataset="local" will be inferred
}
}
```
Refer to `examples/mcp/config_api_llm.json` (for API-based LLMs) and `examples/mcp/config_self_deployed_llm.json` (for self-hosted LLMs) for the structure of the `custom_config` file, including where to place API keys or URLs.