Focus Data
STDIONatural language to SQL conversion with two-step verification to control hallucinations
Natural language to SQL conversion with two-step verification to control hallucinations
A Model Context Protocol (MCP) server enables artificial intelligence assistants to convert natural language into SQL statements.
In simple terms, focus_mcp_sql adopts a two-step SQL generation solution, which enables control over the hallucinations of LLM and truly builds the trust of non-technical users in the generated SQL results.
Below is the comparison table between focus_mcp_sql and others:
Here’s a side-by-side comparison of focus_mcp_sql with other LLM-based frameworks:
| Feature | Traditional LLM Frameworks | focus_mcp_sql | 
|---|---|---|
| Generation Process | Black box, direct SQL generation | Transparent, two-step (keywords + SQL) | 
| Hallucination Risk | High, depends on model quality | Low, controllable (keyword verification) | 
| Speed | Slow, relies on large model inference | Fast, deterministic keyword-to-SQL | 
| Cost | High, requires advanced models | Low, reduces reliance on large models | 
| Non-Technical User Friendliness | Low, hard to verify results | High, easy keyword checking | 
-Initialize the model -Convert natural language to SQL statements

git clone https://github.com/FocusSearch/focus_mcp_sql.git cd focus_mcp_sql
gradle clean gradle bootJar The jar path: build/libs/focus_mcp_sql.jar
Add the server to your MCP settings file:
{ "mcpServers": { "focus_mcp_data": { "command": "java", "args": [ "-jar", "path/to/focus_mcp_sql/focus_mcp_sql.jar" ], "autoApprove": [ "gptText2sqlStart", "gptText2sqlChat" ] } } }
initial model.
Parameters:
model (required): table modelbearer (required): bearer tokenlanguage (optional): language ['english','chinese']Example:
{ "model": { "tables": [ { "columns": [ { "columnDisplayName": "name", "dataType": "string", "aggregation": "", "columnName": "name" }, { "columnDisplayName": "address", "dataType": "string", "aggregation": "", "columnName": "address" }, { "columnDisplayName": "age", "dataType": "int", "aggregation": "SUM", "columnName": "age" }, { "columnDisplayName": "date", "dataType": "timestamp", "aggregation": "", "columnName": "date" } ], "tableDisplayName": "test", "tableName": "test" } ], "relations": [ ], "type": "mysql", "version": "8.0" }, "bearer": "ZTllYzAzZjM2YzA3NDA0ZGE3ZjguNDJhNDjNGU4NzkyYjY1OTY0YzUxYWU5NmU=" }
model 参数说明:
| 名称 | 位置 | 类型 | 必选 | 说明 | 
|---|---|---|---|---|
| model | body | object | 是 | none | 
| » type | body | string | 是 | 数据库类型 | 
| » version | body | string | 是 | 数据库版本 | 
| » tables | body | [object] | 是 | 表结构列表 | 
| »» tableDisplayName | body | string | 否 | 表显示名 | 
| »» tableName | body | string | 否 | 表原始名 | 
| »» columns | body | [object] | 否 | 表列列表 | 
| »»» columnDisplayName | body | string | 是 | 列显示名 | 
| »»» columnName | body | string | 是 | 列原始名 | 
| »»» dataType | body | string | 是 | 列数据类型 | 
| »»» aggregation | body | string | 是 | 列聚合方式 | 
| » relations | body | [object] | 是 | 表关联关系列表 | 
| »» conditions | body | [object] | 否 | 关联条件 | 
| »»» dstColName | body | string | 否 | dimension 表关联列原始名 | 
| »»» srcColName | body | string | 否 | fact 表关联列原始名 | 
| »» dimensionTable | body | string | 否 | dimension 表原始名 | 
| »» factTable | body | string | 否 | fact 表原始名 | 
| »» joinType | body | string | 否 | 关联类型 | 
Convert natural language to SQL.
Parameters:
chatId (required): chat idinput (required): Natural languagebearer (required): bearer tokenExample:
{ "chatId": "03975af5de4b4562938a985403f206d4", "input": "what is the max age", "bearer": "ZTllYzAzZjM2YzA3NDA0ZGE3ZjguNDJhNDjNGU4NzkyYjY1OTY0YzUxYWU5NmU=" }
All tools return responses in the following format:
{ "errCode": 0, "exception": "", "msgParams": null, "promptMsg": null, "success": true, "data": { } }


