LimeSurvey MCP服务器
模型上下文协议(MCP)服务器,将LimeSurvey Remote API功能公开为MCP工具。该服务器提供了一种标准化的方式,通过MCP客户端与LimeSurvey强大的调查管理功能进行交互。
目录
- 调查管理 - 问题管理 - 响应管理 - 参与管理 - 统计管理
安装
# Clone the repository
git clone https://github.com/TonisOrmisson/limesurvey-mcp.git
cd limesurvey-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Start the server
npm start配置
创建一个 .env 根目录中的文件,包含以下变量:
# LimeSurvey Remote API Settings
LIMESURVEY_API_URL=https://your-limesurvey-instance.com/admin/remotecontrol
LIMESURVEY_USERNAME=your_username
LIMESURVEY_PASSWORD=your_password
# Server settings
PORT=3000
ENABLE_SSE=false
# Optional: run in read‑only mode
# When true, all write tools short‑circuit and return an error message
# instead of calling LimeSurvey.
READONLY_MODE=false用法
服务器运行后,您可以使用任何MCP客户端连接到它并访问LimeSurvey功能。
默认情况下,服务器以以下方式启动 stdio 只有。集 ENABLE_SSE=true 当您需要HTTP/SSE传输时 /sse 和 /messages例如,当MCP服务器远程运行而不是由客户端在本地生成时。
无头测量施工(addSurvey→ 群组→ 问题)
您可以通过组合编写工具,在没有LimeSurvey管理UI的情况下构建调查:
addSurvey--创建一个不活跃的调查;记下返回的调查ID(sid).addGroup--创建一个或多个问题组;每次呼叫返回一个组ID(gid)下一步。importQuestion--对于每个问题,通过 base64编码.lsq内容(从UI导出一次原型问题或生成兼容的XML)。使用importDataType: lsq.setSurveyProperties--欢迎文本、描述、结束URL等。activateSurvey--当结构准备就绪时。
临时重建: 使用 deleteQuestion (每 qid,与 confirmDeletion: true)以及 deleteGroup (每次调查+ gid)在重新导入之前删除一组或单个问题 .lsq 模板。删除组会删除该组的内容;首先在开发调查中确认您的LimeSurvey版本的行为。
参与者链接模式: https:///index.php/ (使用 sid 从 addSurvey 或 listSurveys).令牌化访问使用您现有的参与者工具。
示例MCP客户端代码段(伪YAML)用于列出调查:
tool: listSurveys
args: {}API 参考
遥控2覆盖范围
下表显示了LimeSurvey RemoteControl2方法如何作为MCP工具公开 在这个服务器上。此处未实现的方法在中也不可用 目标LimeSurvey实例或故意跳过(例如不稳定或 未记录的端点)。
| 域 | RemoteControl2方法 | MCP工具名称 | 注释 |
|---|---|---|---|
| 调查 | list_surveys | listSurveys | 只读 |
| 调查 | get_survey_properties | getSurveyProperties | 只读 |
| 调查 | activate_survey | activateSurvey | 写(由 READONLY_MODE) |
| 调查 | get_language_properties | getSurveyLanguageProperties | 只读 |
| 调查 | get_site_settings | getAvailableLanguages | 阅读 availablelanguages 设置 |
| 调查 | --(衍生) | getSurveyLanguages | 来源于调查属性 |
| 调查 | get_fieldmap | getFieldMap | 只读 |
| 调查生命周期 | add_survey | addSurvey | 写(保护) |
| 调查生命周期 | import_survey | importSurvey | 写(保护) |
| 调查生命周期 | copy_survey | copySurvey | 写(保护) |
| 调查生命周期 | delete_survey | deleteSurvey | 写(有保护,需要确认) |
| 调查生命周期 | activate_tokens | activateTokens | 写(保护) |
| 调查生命周期 | set_survey_properties | setSurveyProperties | 写(保护) |
| 问题组 | list_groups | listQuestionGroups | 只读 |
| 问题组 | get_group_properties | getGroupProperties | 只读 |
| 问题组 | add_group | addGroup | 写(有保护);返回新 gid |
| 问题组 | delete_group | deleteGroup | 写(有保护,需要确认) |
| 问题组 | set_group_properties | setGroupProperties | 写(保护) |
| 提问 | list_questions | listQuestions | 只读 |
| 提问 | get_question_properties | getQuestionProperties | 只读 |
| 提问 | import_question | importQuestion | 写(有保护);base64 .lsq |
| 提问 | delete_question | deleteQuestion | 写(有保护,需要确认) |
| 提问 | set_question_properties | setQuestionProperties | 写(保护) |
| 答复 | get_summary | getResponseSummary | 只读 |
| 答复 | list_response_exports | listResponseExportFormats | 只读发现(支持插件) |
| 答复 | export_responses | exportResponses | 只读导出 |
| 答复 | add_response | addResponse | 写(保护) |
| 答复 | update_response | updateResponse | 写(保护) |
| 答复 | delete_response | deleteResponse | 写(有保护,需要确认) |
| 答复 | get_response_ids | getResponseIds | 只读 |
| 答复 | export_responses_by_token | exportResponsesByToken | 只读导出 |
| 答复 | export_timeline | exportTimeline | 只读聚合计数 |
| 文件 | upload_file | uploadFile | 写(保护) |
| 文件 | get_uploaded_files | listUploadedFiles | 只读 |
| 参与者/代币 | add_participants | addParticipant, addMultipleParticipants | 写(保护) |
| 参与者/代币 | list_participants | listParticipants, listFilteredParticipants | 只读 |
| 参与者/代币 | get_participant_properties | getParticipantProperties | 只读 |
| 参与者/代币 | delete_participants | deleteParticipants | 写(有保护,需要确认) |
| 参与者/代币 | invite_participants | inviteParticipants | 写(有保护,电子邮件/通知) |
| 参与者/代币 | remind_participants | remindParticipants | 写(有保护,电子邮件/通知) |
| 配额 | get_quota_properties | getQuotaProperties | 只读;无列表-所有包装 |
| 配额 | add_quota | addQuota | 写(保护) |
| 配额 | set_quota_properties | setQuotaProperties | 写(保护) |
| 配额 | delete_quota | deleteQuota | 写(有保护,需要确认) |
| 语言 | add_language | addSurveyLanguage | 写(保护) |
| 语言 | delete_language | deleteSurveyLanguage | 写(有保护,需要确认) |
| 语言 | set_language_properties | setSurveyLanguageProperties | 写(保护) |
| 站点设置 | get_site_settings | getAvailableLanguages | 只读 |
当 READONLY_MODE=true 在环境中设置,所有工具都标记为“写入” 上面的“(防护)”将在不调用LimeSurvey的情况下返回明确的错误消息。
调查管理
列表调查
列出经过身份验证的用户有权访问的所有调查。
参数:无
退货:
- 具有属性的测量对象数组:
- sid:调查ID - surveyls_title:调查标题 - active:调查是否处于活动状态(“Y”或“N”) - expires:到期日期(如果已设置) - startdate:开始日期(如果已设置) - 以及其他调查元数据
示例响应:
[
{
"sid": "123456",
"surveyls_title": "Customer Satisfaction Survey",
"active": "Y",
"expires": null,
"startdate": "2023-01-01 00:00:00"
},
{
"sid": "789012",
"surveyls_title": "Employee Feedback",
"active": "N",
"expires": "2023-12-31 23:59:59",
"startdate": "2023-06-01 00:00:00"
}
]获取调查属性
获取特定调查的详细属性。
参数:
surveyId:用于获取房产的调查ID
退货:
- 包含测量属性的对象,包括设置、配置和元数据
激活调查
激活当前处于非活动状态的调查。
参数:
surveyId:要激活的调查的ID
退货:
- 激活过程的结果
getSurvey语言属性
获取调查的特定语言属性。
参数:
surveyId:调查的IDlanguage:语言代码
退货:
- 包含调查语言特定属性的对象
获取可用语言
获取LimeSurvey安装中的可用语言。
参数:无
退货:
- 可用语言代码及其名称列表
getSurvey语言
获取特定调查的可用语言。
参数:
surveyId:调查的ID
退货:
- 可用于调查的语言代码数组
getQuotaProperties
获取特定配额的属性。
此工具包装 get_quota_properties 远程控制方法: get_quota_properties($sessionKey, $iQuotaId, $aQuotaSettings = null, $sLanguage = null). 此MCP服务器不支持列出调查的所有配额。
参数:
quotaId:特定配额ID(必填)language(可选):配额描述语言
退货:
- 给定配额ID的配额信息
添加配额
向调查添加新配额。
参数:
surveyId:调查的IDname:配额名称limit:配额的最大响应数
退货:
- LimeSurvey的结果对象,其中包含创建的配额数据
setQuotaProperties
更新现有配额的属性。
参数:
quotaId:要更新的配额的IDproperties:具有要更新的配额字段的对象(例如name,limit,active,action,message,url)
退货:
- 描述更新配额的结果对象
deleteQuota
删除现有配额。
参数:
quotaId:要删除的配额的ID
退货:
- 结果对象,指示配额是否已成功删除
添加调查语言
在调查中添加新语言。
参数:
surveyId:调查的IDlanguage:要添加的语言代码(例如"de","fr")
退货:
- 来自LimeSurvey的语言添加结果对象
deleteSurvey语言
从调查中删除语言。
参数:
surveyId:调查的IDlanguage:要删除的语言代码
退货:
- 结果对象,指示语言是否已删除
setSurvey语言属性
为调查语言设置特定于语言的属性。
参数:
surveyId:调查的IDlanguage(可选):语言代码;省略以基础语言为目标localeData:具有要更新的区域设置字段的对象(例如surveyls_title,surveyls_description,surveyls_welcometext)
退货:
- 描述更新的语言属性的结果对象
设置调查属性
设置测量的属性。
此工具包装 set_survey_properties 远程控制方法: set_survey_properties($sessionKey, $iSurveyID, $aSurveyData).一些字段 (例如 sid, active, language, additional_languages,和几个 活动调查中的字段)不能更改,LimeSurvey将忽略这些字段。
参数:
surveyId:调查的IDproperties:要更新的调查字段对象
退货:
- 描述哪些字段已成功更新的结果对象
问题管理
问题列表
列出特定调查的所有问题。
参数:
surveyId:调查的IDgroupId(可选):仅获取此组的问题language(可选):问题文本的语言
退货:
- 具有ID、文本、类型和其他设置等属性的问题对象数组
list问题组
列出特定调查的所有问题组。
参数:
surveyId:调查的IDlanguage(可选):小组文本的语言
退货:
- 具有ID、标题、描述和顺序等属性的问题组对象数组
addGroup
创建一个 空的 调查问题小组。包裹远程控制 add_group 并返回新的组ID(成功时为整数),将其传递给 importQuestion 作为 groupId.
参数:
surveyId:调查IDtitle:组标题description(可选):组描述;默认空字符串
重要问题
从导入问题 base64编码 .lsq 将数据分组。想法与 importSurvey 随着 .lss:准备模板(例如,从LimeSurvey中为每种类型导出一个问题),然后使用不同的有效载荷重复调用此工具。
参数:
surveyId,groupId:目标调查和小组importData:Base64编码.lsq内容importDataType:必须是lsq(默认)mandatory:Y或N(默认值N)newQuestionTitle,newQuestionText,newQuestionHelp(可选):导入后覆盖匹配RemoteControl可选参数
退货:成功时的新问题ID(整数),或失败时LimeSurvey的错误结构。
deleteGroup
从调查中删除问题组。包裹远程控制 delete_group通常也会删除组内的问题;验证您的实例。
参数:
surveyId,groupId:要删除的调查和分组confirmDeletion:必须是true(安全防护装置)
删除问题
删除一个问题 qid.包装远程控制 delete_question复杂类型(如排名)可能会在中使用额外的行 listQuestions (子问题);根据导出/导入周期生成的内容进行删除或重建。
参数:
questionId:要删除的问题IDconfirmDeletion:必须是true
获取问题属性
获取特定问题的属性。
参数:
questionId:问题的IDlanguage(可选):问题文本的语言properties(可选):要检索的属性名数组
退货:
- 包含问题所请求属性的对象
setQuestion属性
通过遥控器更新问题的可写字段 set_question_properties. 先发现: 呼叫 getQuestionProperties (可选地带有设置名称列表),因此您只发送LimeSurvey接受的密钥。API阻止对结构字段的更改,例如 qid, gid, sid, parent_qid, type,以及 language.
常见编辑
question:词干文本(通常是HTML)。help:茎下的帮助文本。- 通过
language当更新非基础调查语言时。
排名问题(R类)\ 面对排名标签的参与者通常会继续生活 子问题 行(parent_qid 指向父母)。更新每个子问题 question 文本与 setQuestionProperties 在那一排 qid,或调整 .lsq 模板并重新导入。
列表/带注释类型的列表\ 主要提示仍然是 question / help 在父母身上。答案标签可以是单独的答案记录;如果RemoteControl没有公开您需要的内容,请选择编辑 .lsq 模板和使用 importQuestion (或管理员UI),并使用此工具对API允许的措辞进行调整。
响应管理
getResponseSummary
获取有关调查收集到的答复的摘要信息。
参数:
surveyId:调查的ID
退货:
- 包含响应计数和状态信息的摘要对象
list响应导出格式
列出全球可用的响应导出格式,包括插件提供的类型。
参数:
- 无
退货:
- 导出格式对象列表,包括:
- type - pluginClass - label (可空) - tooltip (可空) - onclick (可空) - isDefault (布尔值)
导出响应
以指定格式导出调查的响应。
参数:
surveyId:调查的IDdocumentType:导出格式类型(动态/插件感知)。呼叫listResponseExportFormats第一个-默认值:“csv”language(可选):用于导出响应的语言completionStatus:按完成状态(“完成”、“不完整”、“全部”)筛选-默认值:“全部”headingType:标题类型(“代码”、“完整”、“缩写”)-默认值:“代码”responseType:响应类型(“短”或“长”)-默认值:“短”fields(可选):要导出的字段名数组
退货:
- 成功总结加上原始出口有效载荷
- 对于具有以下内容的文本格式
decodeOutput: true,还包括解码预览
发现优先导出工作流
- 呼叫
listResponseExportFormats发现有效type当前LimeSurvey实例暴露的值。 - 选择一个返回
type(例如csv,json,或自定义插件格式)。 - 呼叫
exportResponses说完这个documentType.
示例:
tool: listResponseExportFormats
args: {}
---
tool: exportResponses
args:
surveyId: "123456"
documentType: "csv"listResponses
列出特定调查的响应ID。
参数:
surveyId:调查的IDstart:启动响应索引-默认值:0limit:返回的响应数-默认值:10attributes(可选):要包含的属性名称数组
退货:
- 响应ID和请求属性的数组
参与管理
可寻址
将参与者添加到调查中。
参数:
surveyId:调查的IDemail:参与者电子邮件地址firstName(可选):名字lastName(可选):姓氏language(可选):语言代码usesLeft:参与者可以访问调查的次数-默认值:1validFrom(可选):生效日期(YYYY-MM-DD HH:MM:ss)validUntil(可选):有效期至日期(YYYY-MM-DD HH:MM:ss)
退货:
- 参与者数据,包括生成的令牌
列表参与者
列出特定调查的参与者。
参数:
surveyId:调查的IDstart:起始参与者索引-默认值:0limit:要返回的参与者数量-默认值:10unused:仅显示未使用的令牌-默认值:falseattributes(可选):要包含的属性名称数组
退货:
- 具有请求属性的参与者对象数组
获取参与者属性
获取特定参与者/令牌的属性。
参数:
surveyId:调查的IDtokenId:令牌IDattributes(可选):要包含的属性名称数组
退货:
- 包含指定参与者属性的对象
统计管理
出口统计
以PDF、Excel或HTML格式导出调查统计数据,并附带可选图形。
参数:
surveyId:用于导出统计数据的调查IDdocumentType:导出格式:pdf、xls或html-默认:pdflanguage(可选):统计导出语言(默认:调查的默认语言)includeGraphs:是否在导出中包含图形(仅适用于PDF)-默认值:falsegroupIds(可选):要包含在统计数据中的特定问题组ID,可以是单个ID或ID数组
退货:
- Base64编码字符串,包含请求格式的统计文件
示例用法:
exportStatistics:
surveyId: "123456"
documentType: "pdf"
includeGraphs: true发展
本项目使用以下方式构建:
- @模型上下文协议/sdk -MCP服务器SDK
- TypeScript -用于类型安全和现代JavaScript功能
- Dotenv。 -用于环境变量管理
- 阿西奥斯 -对于LimeSurvey Remote API的HTTP请求
建筑
npm run build开发模式
npm run dev