NLQ MCP 本地服务部署向导
1.目标
在已经部署好的NLQ 服务器(包含权限控制)上添加MCP 服务,让办公电脑上的 AI 助手 WorkBuddy 能通过 MCP 连上 NLQ 服务。需要查询的最终用户就可以在WorkBuddy 上用自然语言查数据、取结果。
如需了解NLQ 服务器的部署(包含权限控制),请参考:
WorkBuddy 自动化实施润乾 NLQ 向导 - 以保险主题为例
2.MCP 的工作过程
动手操作之前先了解MCP 工作过程原理。
2.1.登录过程
MCP 工作过程中涉及两种用户,要注意区分:
名称 |
说明 |
DQL 用户 |
是指MCP 服务连接 DQL 服务的用户。 相当于数据库用户,DQL 服务可以控制每个用户的数据权限。 每个DQL 用户可以对应多个 MCP 用户。 |
MCP 用户 |
是指使用WorkBuddy 查询的最终用户,用于登录 MCP。 每个MCP 用户对应一个 DQL 用户。 |
登录过程:
1.WorkBuddy访问 MCP服务
2.MCP服务返回:未登录/ 鉴权失败
3.WorkBuddy 打开登录页面,最终用户输入、提交MCP用户名密码
4.服务器校验账号密码,确定用哪个DQL 用户,把这个DQL 用户返回给WorkBuddy
5.WorkBuddy后续查询就用这个DQL 用户连接DQL 服务,DQL 服务根据权限返回结果
其中第4 步是可编程的,可以根据实际应用的需要,编码实现用户名密码的校验、确定对应的 DQL 用户,具体编程方法在后面的实操中。
实际应用中登录校验的方式多种多样,例如:数据库用户表、LDAP/AD 域账号、统一认证平台 /SSO、短信验证码、企业微信 / 钉钉 / 微信扫码等。MCP 服务不可能把所有登录方式都写死,所以提供了这种可编程入口。
2.2.查询过程
1.WorkBuddy 收到用户的自然语言提问,例如 "查询每个客户的保单数"
2.WorkBuddy 按 nlq SKILL 的规则,把自然语言转成的 NLQ 语句,例如 查询 "客户,保单 数"
3.WorkBuddy 通过 MCP 把这段 NLQ 语句提交给服务器
4.服务器用登录时确定的 DQL 用户连库执行,把结果集返回给 WorkBuddy
5.WorkBuddy 把结果整理成表格,呈现给用户
3.实际操作
3.1.需求简述
一家保险公司,客服分三个权限组:北京客服只能查北京保单、上海客服只能查上海保单、管理员查全部保单。
服务器上已经部署了NLQ保单查询系统,现在要接上 MCP,让客服用自然语言问数,同时保证数据权限隔离。
管理员:Tom
北京客户服务:Sam、Jack
上海客户服务:Rose
为了测试简单,所有密码和用户名相同。
3.2.环境
服务器:
NLQ 应用的访问地址http://192.168.1.8:6868/demo
NLQ 数据源名称:NLQ4insurance
其中DQL 已经实现配置了三个用户(密码和用户名相同):
"DQLroot" 管理员,查全部保单
"DQLuserBeijing" 北京客服,查北京保单
"DQLuserShanghai" 上海客服,查上海保单
办公电脑:
已经安装好WorkBuddy
3.3.服务器实操
3.3.1.配置 MCP 服务
在 C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF中找到web.xml,增加与 MCP 相关的配置:
① 服务对外基址(nlqcr.publicBaseUrl,用于拼接登录页 /authorize等 URL,写成你的服务器实际地址,不带尾部斜杠、不带 /mcp):
<context-param>
<param-name>nlqcr.publicBaseUrl</param-name>
<param-value>http://192.168.1.8:6868/demo</param-value>
</context-param>
② 是否要求登录(nlqcr.requireLogin,保持 true):
<context-param>
<param-name>nlqcr.requireLogin</param-name>
<param-value>true</param-value>
</context-param>
③ 注册 MCP 端点(把 /mcp路径绑定到 McpServlet,这就是 MCP 服务的入口):
<servlet>
<servlet-name>mcp</servlet-name>
<servlet-class>com.raqsoft.mcp.McpServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>mcp</servlet-name>
<url-pattern>/mcp</url-pattern>
</servlet-mapping>
④ 注册认证端点(把 /authorize、/token绑定到登录程序 LoginServlet):
<servlet>
<servlet-name>auth</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>auth</servlet-name>
<url-pattern>/authorize</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>auth</servlet-name>
<url-pattern>/token</url-pattern>
</servlet-mapping>
3.3.2.实现登录管理
⚫️增加文件mcp.cfg
编辑一个文本文件mcp.cfg,放到服务器 class 目录
C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes
这个文件用来存储NLQ 数据源的名称和 DQL 用户的用户名、密码:
NLQ4insurance
DQLroot,DQLroot
DQLuserBeijing,DQLuserBeijing
DQLuserShanghai,DQLuserShanghai
说明:第一行是NLQ 数据源的名称。第二行开始是 DQL 用户名和密码。
⚫️增加LoginServlet.java并编程
放 在服务器 这个位置:
C:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\LoginServlet.java
修改方法 authenticate,编程实现校验MCP用户、返回DQL 用户。简单示例代码:
private String authenticate(String username, String password) {
if ("Tom".equals(username) && "Tom".equals(password)) {
return "DQLroot"; // 管理员,查全部保单
} else if ("Sam".equals(username) && "Sam".equals(password)) {
return "DQLuserBeijing"; // 北京客服,查北京保单
} else if ("Jack".equals(username) && "Jack".equals(password)) {
return "DQLuserBeijing"; // 北京客服,查北京保单
} else if ("Rose".equals(username) && "Rose".equals(password)) {
return "DQLuserShanghai"; // 上海客服,查上海保单
}
return null; // 账号或密码不对,登录失败
}
编译后,class 文件也放到用 classes 目录下。
在实际项目中,可以根据情况,把示例代码改成需要的用户密码校验和用户映射代码。
3.4.办公电脑实操
3.4.1.安装 nlq SKILL
从润乾 NLQ 查询演示页 http://query.raqsoft.com.cn:6999/nlq4tpch.html点击“下载 MCP SKILL”按钮,下载 SKILL 压缩包 nlqdemoskill.zip,解压后是一个 nlq目录:
文件 |
作用 |
SKILL.md |
主技能文件:触发词、处理流程、MCP 调用方式 |
references/grammar-spec.md |
NLQ/NSPL 语法规则、查询范式 |
references/field-dictionary.md |
表/ 字段 / 维词 / 常数词 / 指标词典 |
scripts/nlq_login.py |
OAuth 登录辅助脚本 |
注意:这个 zip 默认是用来连润乾公网演示服务器的,用之前要修改references/field-dictionary.md,文件内容换成保险数据集的词典信息,包括表名、字段名、维词和指标等。
词典信息从NLQ 的 IDE- 菜单 - 工具 - 词典信息中获取:

安装方式一:压缩包安装
把改好的 nlq目录打包成zip 文件,在 WorkBuddy 侧边栏中选择「专家·技能·连接器」→「技能」,在右上角选择「添加技能」→「上传技能」:

在导入技能窗口的左下角,点击「选择ZIP 文件」:

如果zip 文件中的 nlq 技能当前不存在,WorkBuddy 将从技能文件中识别出技能介绍,可以继续安装:

安装成功后,在列表中,即可看到导入的技能:

方式二:复制文件安装
把改好的 nlq目录复制到项目根目录 .workbuddy/skills/下(项目级,团队共用),或 ~/.workbuddy/skills/(用户全局),WorkBuddy 会自动识别。
3.4.2.配置 mcp.json
①在 WorkBuddy 侧边栏点击「专家·技能·连接器」→「连接器」:

②在右上角点击「自定义连接器」→「配置 MCP」:

③编辑 mcp.json(项目级或用户级),添加 MCP 服务配置,名称用 NLQ-MCP:
{
"mcpServers": {
"NLQ-MCP": {
"url": "http://192.168.1.8:6868/demo/mcp",
"disabled": false,
"description": "NLQ 保单查询服务"
}
}
}
④保存后,在我的 MCP 中找到 NLQ-MCP,点击「信任 / 启用」,状态变为绿色即连接成功。


3.5.查询验证
①查询:查询 "客户,保单 数"。
②首次登录或者登录查实:WorkBuddy 打开浏览器:

③用 MCP 账号(Tom / Sam / Jack / Rose)登录,不要用 DQL 账号。


④重启NLQ 服务,换MCP 用户登录验证权限隔离:Sam 登录查不到上海保单,Rose 查不到北京保单,Tom 查全部。
