LimeSurvey MCP Server
This server wraps the LimeSurvey RemoteControl 2 API, providing tools for managing surveys, participants, responses, quotas, themes, and more. It includes all 56 official API methods plus 15 additional workflow tools, with robust safety features.
Session Management: Connect and disconnect via
get_session_keyandrelease_session_key.Survey Management: Create, delete, import, copy, activate, list, find, and set properties for surveys; manage survey languages.
Question Groups & Questions: Add, delete, import, list, and modify groups and questions; get field maps.
Participants: Activate token tables; add, delete, list, update, and filter participants; send invitation/reminder emails.
Responses: Add, update, delete responses; export in various formats (inline or to file); export by token; retrieve uploaded files.
Quotas: Add, delete, list, get, and set quota properties.
Statistics & Timeline: Export survey statistics and response timelines.
File Operations: Securely import surveys, groups, and questions from files; export data to dedicated directories with size limits and digests.
Themes: Generate, validate, and assign responsive, WCAG-compliant survey themes.
Capability Detection: Get instance info, list installed themes, discover export formats, and optionally probe live connectivity.
Users: List administration users.
Safety: Read-only mode; explicit confirmations for destructive actions (delete, activation, emails, theme assignment, file overwrite); secure credential handling; sanitized errors.
Additional: Supports stdio and authenticated HTTP transports; Docker deployment; session caching with retry; and experimental features like survey structure export.
Provides tools for interacting with the LimeSurvey RemoteControl 2 API, enabling management of surveys, participants, responses, quotas, themes, and exports in a LimeSurvey instance.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LimeSurvey MCP Serverlist all surveys"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LimeSurvey MCP Server
A production-oriented Model Context Protocol server for the LimeSurvey RemoteControl 2 API. It exposes all 56 documented RemoteControl methods plus guarded workflow tools for discovery, participants, exports, capability detection, building surveys from a JSON description, and responsive survey themes.
This community project is not affiliated with or endorsed by LimeSurvey GmbH.
Features
Complete RemoteControl coverage: all 56 documented JSON-RPC methods
82 MCP tools: official methods plus focused workflow, survey description, and theme tools
Surveys from a description: validate a JSON survey description, create the survey from it, and read any survey, group, or question back as such a description, without any local file
Modern MCP contracts: strict Zod schemas, structured output, and annotations
Safe write access: server-enforced write scopes (
none,content,lifecycle, outreach), a legacy read-only switch, and explicit confirmationsSession management: cached credentials, one retry after an invalid session, graceful release, timeouts, and sanitized errors
Two transports: stdio for local clients and authenticated Streamable HTTP
Secure exports: bounded base64 decoding into a dedicated directory
Survey theme workflow: generate, validate, publish, and assign responsive themes
Deployment ready: Docker, Compose, healthcheck, CI, and Dependabot
Related MCP server: MCP Server for LimeSurvey
Tool Catalog
Area | Tools | Count |
Official RemoteControl 2 API | Sessions, settings, surveys, languages, groups, questions, participants, quotas, users, responses, files, exports | 56 |
Workflow helpers | Survey search, language normalization, participant helpers, export format discovery, secure file exports, experimental survey-structure export, capability/instance info, participant table status, participant validation, survey-vs-.lss verification, question replacement | 14 |
Survey descriptions (spec) | Validate a description, read a survey, group, or question as a description, create a survey, insert a question or a group at a given position, change a question, change texts per language | 7 |
Survey themes | Generate, validate, publication guide, assign to survey, best-effort theme listing | 5 |
Total | 82 |
Official tools are named limesurvey_<remotecontrol_method>. Run the MCP
Inspector to view every current schema:
npm run inspectQuick Start
Prerequisites
Node.js 20 or newer, or Docker
A reachable LimeSurvey instance
A dedicated LimeSurvey service account with only the required permissions
In LimeSurvey: enable the API and select JSON-RPC under Configuration > Global settings > Interfaces
Option A: npm
npx -y limesurvey-mcp-server@latestThe server uses stdio by default. Supply credentials through the MCP client
configuration shown below. @latest receives the newest release whenever the
MCP process starts; pin an exact version (for example
limesurvey-mcp-server@1.4.0) for reproducible deployments.
npxprefers an existing global installation over a registry download, even a broken or outdated one, so@latestdoes not update a machine that also has the package installed globally. If the server fails to start, see Troubleshooting.
Option B: from source
git clone https://github.com/Wagner-Emden-IT-Services/limesurvey-mcp-server.git
cd limesurvey-mcp-server
npm ci
npm testOption C: Docker
git clone https://github.com/Wagner-Emden-IT-Services/limesurvey-mcp-server.git
cd limesurvey-mcp-server
cp .env.example .env
# Edit .env and use a long random MCP_HTTP_BEARER_TOKEN.
docker compose up --build -dCompose binds 127.0.0.1:3000, starts in read-only mode, and stores exports and
theme packages in separate named volumes.
See Installation and Updates for Codex CLI, Claude Desktop, global npm, source, Docker, verification, update, and removal steps.
Configuration
Required:
Variable | Description |
| Exact RemoteControl URL, for example |
| LimeSurvey service account |
| Service account password, or the path to a file that holds only the password (UTF-8 without BOM). If both are set, the file wins and |
Important optional variables:
Variable | Default | Description |
|
| LimeSurvey authentication plugin |
| unset (= |
|
|
|
|
|
| RemoteControl request timeout |
|
| Maximum inline result size |
| unset | Dedicated output directory for decoded exports |
|
| Maximum decoded export size |
| unset (falls back to | Dedicated input directory for |
|
| Maximum file size accepted via |
| unset | Dedicated output directory for generated theme ZIPs |
|
| Maximum logo and theme entry size |
|
| Enable non-standard |
|
|
|
|
| Streamable HTTP bind address |
|
| Streamable HTTP port |
|
| Streamable HTTP endpoint |
| unset | Required for every non-loopback HTTP binding |
| unset | Comma-separated exact Host allowlist |
| unset | Comma-separated exact browser Origin allowlist |
The server intentionally does not load .env itself. The MCP client, process
manager, or container runtime owns secret injection.
Keeping the password out of the client configuration
With LIMESURVEY_PASSWORD_FILE the password lives in a file that only your own
account can read, instead of in the MCP client configuration (which is often a
readable JSON file or a shell command that ends up in the history). The server
reads the file once at start-up, removes a UTF-8 BOM and the trailing line
ending, and rejects an empty file, invalid UTF-8, and UTF-16 (what Windows
PowerShell 5.1 writes with > or Out-File). It never prints the password or
any part of it: error messages name only the variable and the path, and
limesurvey_get_instance_info reports just password_source (file or
env). On POSIX systems a start-up warning appears when the file is readable
by group or others (chmod 600); on Windows restrict the file with icacls.
Step-by-step commands that never put the password into a command line:
Store the password in a file.
After switching, remove LIMESURVEY_PASSWORD from the client configuration.
MCP Client Setup
Codex CLI:
codex mcp add limesurvey `
--env "LIMESURVEY_URL=https://survey.example.com/index.php/admin/remotecontrol" `
--env "LIMESURVEY_USERNAME=rpc-user" `
--env "LIMESURVEY_PASSWORD=replace-me" `
--env "LIMESURVEY_WRITE_SCOPE=content" `
-- npx -y limesurvey-mcp-server@latestcontent lets an assistant build and correct surveys; use none for read-only
access (see Write Safety).
Example for clients that support mcpServers configuration:
{
"mcpServers": {
"limesurvey": {
"command": "npx",
"args": ["-y", "limesurvey-mcp-server@latest"],
"env": {
"LIMESURVEY_URL": "https://survey.example.com/index.php/admin/remotecontrol",
"LIMESURVEY_USERNAME": "rpc-user",
"LIMESURVEY_PASSWORD": "replace-me",
"LIMESURVEY_WRITE_SCOPE": "content",
"LIMESURVEY_THEME_DIR": "C:/limesurvey-mcp/themes"
}
}
}
}For a local build, replace npx with node and use the absolute path to
dist/src/index.js as the first argument.
Restart the MCP client after changing its configuration. Then call
limesurvey_get_session_key and limesurvey_list_surveys to verify
authentication and read access before enabling writes.
Streamable HTTP
MCP_TRANSPORT=http \
MCP_HTTP_HOST=127.0.0.1 \
MCP_HTTP_PORT=3000 \
MCP_HTTP_BEARER_TOKEN='replace-with-a-long-random-token' \
npm startMCP endpoint:
http://127.0.0.1:3000/mcpHealth endpoint:
http://127.0.0.1:3000/health
Non-loopback bindings fail fast without a bearer token. Use a reverse proxy for TLS and configure Host and Origin allowlists when exposing the server remotely.
Write Safety
LIMESURVEY_WRITE_SCOPE limits what the server may change. The scopes are
cumulative, from narrowest to widest: none < content < lifecycle <
outreach. A tool runs only when the configured scope is at least the tool's
minimum scope. The check is enforced by the server before any file is read or
any RemoteControl request is sent, and it cannot be bypassed through MCP tool
arguments. A blocked call fails with the error code WRITE_SCOPE_INSUFFICIENT
and names the current scope, the required scope, and which variable set it.
Raise the scope deliberately and restart the MCP client completely; do not work
around a block by calling the RemoteControl API directly.
Unset: everything is allowed (effective scope
outreach, the historical default).LIMESURVEY_READ_ONLY=true(or the legacyREADONLY_MODE=true) equalsnone.If both variables are set, the stricter level wins and the server prints a startup warning naming both variables and the effective scope.
For building and correcting surveys,
contentis usually the right level.
Write scope | Tools |
|
|
|
|
|
|
|
|
All 82 tools are listed (43 + 20 + 7 + 12). A tool that is missing from the
server's scope table is treated as outreach. Some calls are argument-dependent:
limesurvey_import_survey with import_data_type=lsa requires outreach,
because a .lsa archive activates the survey and imports participants and
responses; lss, csv, and txt imports stay at content. And
limesurvey_invite_participants with dry_run=true needs only none, because
it sends nothing and never calls invite_participants (see
Checking an invitation run first). The same
holds for limesurvey_update_question_from_spec and
limesurvey_update_survey_texts with dry_run=true: they read only.
content covers every survey setting that LimeSurvey lets
set_survey_properties change, including start and expiry dates, notification
and administrator addresses, and public registration. Choose none when an
assistant should only read.
Additional confirmation literals are required for high-impact actions:
Action | Required argument |
All |
|
Participant email tools |
|
Survey activation |
|
Replacing an export or theme ZIP |
|
Assigning a survey theme |
|
These MCP-only confirmation fields are never forwarded to LimeSurvey.
Error Hints and Write Limits
LimeSurvey's set_*_properties methods silently drop every key they cannot
write, and error_code does not exist in LimeSurvey 6.17.11. The server
therefore checks and explains instead of passing the silence through (all
lists were verified against the LimeSurvey 6.17.11 source; older releases may
differ):
Known non-writable keys are rejected before any request is sent by
set_question_properties,set_group_properties,set_survey_properties,set_language_properties,set_quota_properties, andset_participant_properties. The error hascode: "FIELD_NOT_WRITABLE"and, on the top level next tomessage,hint_code: "NOT_WRITABLE_VIA_REMOTECONTROL", ahintwith the way around it (for example: question attributes, answer options, and subquestions can only be changed by re-importing the question or in the admin UI), andwritable_fields. Unknown keys that are not on the list are not blocked, because releases may add columns; keys the answer does not contain are returned afterwards inwarnings(ignored_fields, orfailed_fieldsfor fields LimeSurvey reported as not saved).Localized texts are routed safely.
question,help, andscript(questions) andgroup_nameanddescription(groups) are moved intoquestionl10ns[<language>]/questiongroupl10ns[<language>], usingdata.language(questions also thelanguageparameter). Without a language the call fails withLANGUAGE_REQUIRED. This avoids LimeSurvey's legacy form, which resets the text field you did not send to an empty string."No data" answers are interpreted.
No valid Data,No available data, andERR_NO_DATAcarryhint_codeNOT_WRITABLE_VIA_REMOTECONTROL(writes),NO_PARTICIPANT_TABLE/NO_RESPONSE_TABLE(get_summary), orNO_DATA(everything else) plus a method-specifichint.More error shapes are detected. An object in
status(set_participant_propertiesvalidation errors) and{success: false, message}(set_quota_properties) now raise errors;error_codeis still honored for newer LimeSurvey versions.
Each set_*_properties tool description lists its writable and non-writable
fields.
Argument errors are explicit: an unknown argument fails with
Unknown argument: <names>. This tool accepts: <parameters>. for every tool.
limesurvey_get_group_properties and limesurvey_get_question_properties
accept an optional MCP-only survey_id (never sent to LimeSurvey, whose
methods take no survey ID): the result's sid must match, otherwise the call
fails with GROUP_SURVEY_MISMATCH or QUESTION_SURVEY_MISMATCH instead of
silently returning another survey's object.
limesurvey_get_language_properties returns the attachments field exactly as
LimeSurvey stores it (keep it unchanged for a round trip to
set_language_properties) and, when attachments is part of the answer, adds
attachments_parsed: { <mail type>: [ { file_name, url, size, relevance } ] }.
LimeSurvey stores a JSON string since DB version 647; older instances hold a PHP
serialize string; both are parsed. An empty value gives {}, an unparsable one
null plus the warning ATTACHMENTS_UNPARSEABLE. Requested property names that
are not a column are dropped silently by LimeSurvey; the server lists them in the
warning UNKNOWN_FIELDS (unknown_fields).
limesurvey_get_participant_table_status answers "does this survey have a
participant table, and is access closed?" without guessing: exists and
participant_count come from get_summary(token_count), and
survey_is_closed_access follows the survey property access_mode (C) where
the release has it, otherwise the participant table
(closed_access_basis names which). The survey property usetokens is not
evaluated by LimeSurvey 6.17.11 and says nothing about either. A get_summary
answer "No available data" is reported as NO_PARTICIPANT_TABLE (no participant
table; access follows access_mode) or NO_RESPONSE_TABLE (survey not active:
never activated or deactivated).
An empty list is not an error: when list_surveys, list_survey_groups,
list_users, list_groups, list_questions, list_quotas, or
list_participants find nothing, LimeSurvey answers with a status text such as
No surveys found; the server returns [] for exactly these methods and
texts. Other statuses, such as Error: No survey participant list (no
participant table), stay errors.
Checking an invitation run first
limesurvey_invite_participants with dry_run=true sends nothing and never
calls invite_participants. It reads the participants (list_participants) and
simulates the selection of LimeSurvey 6.17.11, so you see before the real run who
would be mailed and why the others would not. send_email=false is not a
preview: in LimeSurvey it means "resend the invitation only to participants who
were already invited" and mails them. confirm_send_email is not needed for a
dry run, and a dry run is allowed under every write scope.
The report contains:
would_receive(tid,email,firstname,lastname) in sending order;would_not_receive(tid,email,reasons, optionaldetails) with the reasonscompleted,missing_token,missing_email,already_invited(send_email=true, participant was invited) ornot_invited_yet(send_email=false),emailstatus_not_ok(the value is indetails),invalid_email_address,not_valid_yet(validfromis after the server time),expired(validuntilis before it),not_selected(token_idsset,tidnot in it; these participants are only counted, never listed one by one), andbeyond_maxemails(only whenmaxemailscould be read);without
continue_on_error:stops_at_tid, the first participant whose validity window fails (LimeSurvey stops sending there), andnot_reached;warnings(blanks at the edges, duplicate addresses among the recipients),limitations,time_basis, andborderline(validity limits within 60 minutes of the server time);countswith the full numbers (would_receive,would_not_receive,not_reached,not_selected,by_reason).
The report stays within LIMESURVEY_MAX_RESPONSE_CHARS whatever the table size:
would_receive, would_not_receive and not_reached list at most 100 entries
each, warnings and borderline at most 25. When a list is cut,
truncated_lists names it with returned and total; counts always holds
the complete numbers. Use token_ids to check specific participants.
Known limits, also listed in limitations: the block list of the central
participant database cannot be read through RemoteControl; maxemails (default
50 emails per call) is readable only by super administrators; the address check
is a port of LimeSurvey's own pattern and an approximation of PHP's result; mail
transport errors cannot be simulated. RemoteControl has no clock method, so the
server time is the HTTP Date header of the last answer. validfrom and
validuntil are stored without a zone in the local time of the LimeSurvey
server: pass server_utc_offset_minutes (for example 120 for UTC+2), otherwise
the timezone of the machine running the MCP server is assumed (time_basis
reports the source).
limesurvey_validate_participants checks the whole participant table with the
same code before you invite: whitespace at the edges (WHITESPACE), duplicate
addresses (DUPLICATE_EMAIL, trimmed and case-insensitive) and tokens
(DUPLICATE_TOKEN), address format (INVALID_EMAIL), NOT_YET_VALID,
EXPIRED, INVALID_VALIDITY_RANGE, EMAILSTATUS_NOT_OK, MISSING_EMAIL, and
MISSING_TOKEN. It returns issues (tid, field, code, detail) and
counts_by_code. The answer is bound to LIMESURVEY_MAX_RESPONSE_CHARS: when
there are too many issues, issues and borderline are cut to fit and marked
with issues_truncated, issues_total, issues_returned and a
truncation_note; counts_by_code, participant_count and time_basis are
always complete.
Building Surveys from a Description
The spec tools build and check surveys from a JSON description (the spec), so no
.lss file has to be written or uploaded. The description goes in as a tool
argument and comes back as a tool result; none of these tools needs a local file
path, which keeps them usable from remote MCP clients.
Tool | Write scope | Purpose |
|
| Checks a survey, group, or question description and reports every problem at once with |
|
| Reads a survey, one group ( |
|
| Validates the description before any request, generates the |
|
| Inserts one question into a group of an inactive survey at |
|
| Inserts one group with its questions into an inactive survey at |
|
| Changes one question to the given end state: a dry run shows changes, mode, and risks; the real run writes texts, columns, or replaces the question at the same place, then compares. |
|
| Changes texts of the survey, groups, questions, and subquestions per language, also on active surveys, and reads them back. |
Spec format
{
"survey": {
"title": "Seminar feedback",
"language": "en",
"additional_languages": ["de"],
"description": "", "welcometext": "", "endtext": "",
"anonymized": true, "datestamp": false, "ipaddr": false, "savetimings": false,
"format": "G", "adminemail": "", "showprogress": true,
"expires": "2026-12-31", "template": "vanilla", "showqnumcode": "X"
},
"groups": [
{
"title": "Content",
"description": "",
"relevance": "1",
"questions": [
{
"code": "A01", "type": "F", "text": "How do you rate the following aspects?",
"help": "", "mandatory": false, "relevance": "1", "other": false,
"attributes": {},
"subquestions": [{ "code": "SQ001", "text": "Clarity of the goals" }],
"answers": [
{ "code": "1", "text": "poor", "assessment_value": 1 },
{ "code": "2", "text": "good", "assessment_value": 2 }
]
}
]
}
]
}Question types: all 29 core types,
X L ! O M Y N S T Q 5 F A R K B C E H P D G U I * | 1 : ;.M Q A K B C E Pneed subquestions and no answers;L ! O Rneed answers and no subquestions;F Hneed both;1 : ;see the next point; all others need neither.otheris allowed forL ! M Ponly.Arrays with two scales:
scale_id(0 or 1) marks the second scale. Type1(array dual scale) takes subquestions on scale 0 and answers on scale 0 and 1; types:(array numbers) and;(array texts) take subquestions on scale 0 (rows) and 1 (columns) and no answers. Codes must be unique per scale, so the same code may appear on both scales.get_survey_specwritesscale_idonly for scale 1 and sorts entries by scale.Codes: question codes
^[A-Za-z][A-Za-z0-9]*$(at most 20 characters, unique in the survey without regard to case, not a reserved word such asSID); subquestion codes alphanumeric (at most 20, nottime); answer codes alphanumeric with at most 5 characters (LimeSurvey drops longer codes without a message). Ranking (R) items are answers on LimeSurvey 6 and subquestions on LimeSurvey 7; on 7 an item may have a code of up to 20 characters and its ownrelevance, on 6 such an item is rejected before anything is written. The tools tell the version with one read call (get_group_propertiesfor the group 0).Texts: every text field (survey title, description, welcome and end text, group title and description, question text, help and script, subquestion and answer texts) is a string, which applies to every survey language, or a map per language such as
{"de": "Frage", "en": "Question"}. A map must cover exactly the survey languages; a missing translation is an error with its path, never a silent copy. Default values (default,default_other, subquestiondefault) may cover only some languages. Survey and group titles must not be empty; an empty question, subquestion, or answer text is only a warning.Language-dependent attributes (
prefix,suffix,em_validation_q_tip,other_replace_text,dualscale_headerAand the other ten of LimeSurvey's list) take a string or a map and are written once per language, as are attributes that LimeSurvey stores per language for plugins or custom question themes; the attributes of the core themes that do not depend on the language take one value.Optional fields for round trips of surveys built in the admin UI:
preg,question_theme_name(extended themes such asbootstrap_buttons),encrypted,same_default,same_script,modulename,script,default,default_other, subquestionrelevanceanddefault, grouprandomization_group; the survey's yes/no settings andformatalso take"inherit"/"I".defaultis allowed on question types without subquestions exceptRand|, subquestiondefaulton types with subquestions except1,:and;, anddefault_otheronLand!withother; elsewhere LimeSurvey stores a default but never uses it.mandatoryistrue,false, or"soft".expiresisYYYY-MM-DD HH:MM:SSorYYYY-MM-DD(end of day).Texts may use HTML entities; references that end with
;and do not stand for& < > " 'are decoded (äbecomesä), all others stay as written.Unknown keys, control characters that XML 1.0 forbids, and embedded
data:URIs (which LimeSurvey removes on save) are rejected with their path.The format is backward compatible with the JSON spec of the
limesurveyClaude Code plugin's former Python generator; for every valid spec without language-dependent attributes the generated.lssis byte-identical (seetest/fixtures/lss-parity). Language-dependent attributes are written once per language, because LimeSurvey ignores the rows without a language that the Python generator wrote.
Reading a survey back
limesurvey_get_survey_spec returns the description of a survey, a group, or a
question; its spec can be passed unchanged to limesurvey_create_survey_from_spec
(a survey) and to the group and question tools. Texts always come as maps per
language. Attribute values equal to the theme default are left out, default
values come from get_fieldmap, and Ranking items come back as answers on
LimeSurvey 6 and 7 alike. Texts keep their leading and trailing spaces, script
and preg come back with LF line endings (as LimeSurvey stores them after an
import), and the theme core of old imports counts as the base theme.
unreadable lists what RemoteControl cannot read and a later replacement would
therefore lose: legacy conditions (their logic stays in the stored relevance),
quota members, URL parameter assignments, stored attributes that the question
type or theme does not define, archived responses, and on survey level the
settings outside the spec (navigation, participant and assessment settings,
email templates, URL, privacy texts, date and number format); plus the "other"
default of multiple choice questions. Entries tied to an element carry path
and language. missing_translations lists every text field without a row in a
survey language. When the result would exceed
LIMESURVEY_MAX_RESPONSE_CHARS, the tool answers SPEC_TOO_LARGE with an
outline (group_id, title, number of questions, estimated size) to read group
by group.
Adding a question or a group
limesurvey_add_question_from_spec and limesurvey_add_group_from_spec take the
description of one question or one group, in the same format as inside a survey
spec (a spec from limesurvey_get_survey_spec works unchanged). They check it
against the live survey first: texts in exactly the survey languages, codes that
are free in the survey without regard to case (CODE_CONFLICT otherwise, because
LimeSurvey would rename them silently), an inactive survey (SURVEY_ACTIVE),
the group of the survey (GROUP_SURVEY_MISMATCH), and a valid position
(POSITION_INVALID); none of these errors writes anything. LimeSurvey imports a
question or group at the end; the tools then write order values only for the new
element. LimeSurvey renumbers the order values of the group's questions (or of
the survey's groups) after that, but their sequence stays the same. If a step
after the import fails, the new element is deleted again by the id from the import
answer, and the error reports failed_step, rolled_back, manual_cleanup, and
cause_code. When the outcome of the import itself is unclear (a transport error,
an error after LimeSurvey created the question, an unknown answer), nothing is
deleted: the error reports created: "unknown", the read-only candidates, and a
cleanup_hint.
Importing a question makes LimeSurvey fill missing translations of other
questions in the survey with the base-language text. If the survey has such gaps,
limesurvey_add_question_from_spec refuses with TRANSLATION_GAPS (listing them)
unless acknowledge: ["fill_translation_gaps"] is given; the filled texts are
then listed under side_effects. Importing a group fills nothing.
Changing a question
limesurvey_update_question_from_spec takes the desired end state of one
question, typically the spec of limesurvey_get_survey_spec with the change
applied. Run it first with dry_run: true (write scope none, read methods
only): the result lists changes (path, kind, current, desired), the
mode, the risks (code, blocking, acknowledgeable, detail), the plan,
and the fingerprint of the current question. The real run needs
expected_fingerprint (from the dry run or the read; otherwise STALE_SPEC, nothing
written), confirm_destructive_action: true, and acknowledge for every blocking,
acknowledgeable risk (qid_bound_links, quota_members, other_default,
removals, fill_translation_gaps, answer_code_references; otherwise
UPDATE_QUESTION_BLOCKED, nothing written).
Mode | When | How |
| The end state equals the question | Nothing is written. |
| Only question, help, or subquestion texts change |
|
| Only |
|
| Anything else: answers (including their texts), subquestions, attributes, default values, type, script (inactive survey) | A new question is imported from a generated |
Unchanged texts are written back as LimeSurvey stored them. On an active survey
every change other than texts answers SURVEY_ACTIVE without writing; answer
texts cannot be written on active surveys at all. References from other
questions to the code (code_references), SGQA references, and embedded data URIs
block a run that would break them and cannot be acknowledged; the check reads
relevance, attributes, scripts, default values, and answer texts of every question
(in free texts only expressions in {...}) and also finds removed comment,
other, and array column variables. Texts the question has no row for in a
language count as unchanged; a replacement reports them as unreadable_texts
(acknowledged with fill_translation_gaps). Attributes the new type or theme does
not define, and a question_theme_name of another question type, are errors
before anything is written. Long lists of locations are capped (locations_total).
If only the read-back after a successful write fails, the error is
VERIFY_READ_FAILED with written: true: the change is stored, read the question
again before retrying.
Changing texts
limesurvey_update_survey_texts changes texts of the survey (title,
description, welcometext, endtext), of groups (by group_id), of questions
(text, help, by code), and of subquestions (by code and scale_id), per
language, also on active surveys. Every text is a string for all survey
languages or a map with some of them. Answers and attributes in texts answer
TEXT_NOT_WRITABLE (on an inactive survey use
limesurvey_update_question_from_spec); a group of another survey, an unknown
code, a language the survey does not have, and an embedded data URI in the
affected row are refused before anything is written. dry_run: true lists the
changes under write scope none; expected_fingerprint guards against changes in
between. If a write step fails, the texts already written are set back
(TEXT_UPDATE_FAILED with rolled_back).
Verification
After the import the survey is read back with read methods only and compared
with the description. Question attributes are compared without values that equal
LimeSurvey's default for the question theme (the defaults are generated from the
theme definitions of LimeSurvey 6.17.11 and 7.5.1 by
tools/build-attribute-defaults.mjs). Differences are reported, not hidden; the
created survey stays in place (deleting needs the lifecycle scope).
Responsive Survey Themes
The theme generator was last verified on 2026-10-14 against LimeSurvey CE 7.5.1 (import with Upload & install, installed name, assignment with read-back, rendering). Earlier checks: 2026-07-22 against the then current LimeSurvey CE 7.0.5 release, and 2026-07-24 against the official vanilla 3.0.1 ("Bootstrap Vanilla") manifest. LimeSurvey 7 is the default target; LimeSurvey 6 can be selected explicitly.
Generated themes:
inherit the installed
vanillacore theme instead of copying it —vanillais the minimal official base theme shipped and installed with every LimeSurvey instance, so generated themes no longer depend onfruity_twentythreebeing present;contain responsive CSS, fixed mobile breakpoints, print styles, visible focus, reduced-motion support, and minimum 44 px controls;
validate WCAG contrast for body, muted, focus, and primary-button colors;
use local system font stacks with no third-party font requests;
contain no JavaScript, tracking, remote CSS imports, or data URLs;
optionally include a signature-checked PNG or JPEG logo;
are licensed GPL-2.0-or-later, matching the inherited LimeSurvey theme.
LimeSurvey installs an uploaded theme under the ZIP file name without .zip and
without dots, not under theme_name: weit_feedback-1.0.0-ls7.zip becomes
weit_feedback-100-ls7 (at most 45 characters). The generator, the validator,
and the publication guide return this as installed_theme_name, and
limesurvey_assign_survey_theme takes it. Versions with the same digits
(1.10.0, 11.0.0) give the same installed name; the generator warns about
them. The validator follows the LimeSurvey 7.5.1 import: errors are limited to
archive safety and what LimeSurvey would refuse, skip, or not use, while
warnings starting with policy: mark what LimeSurvey accepts but the generator
never produces (for example JavaScript, another parent theme, a missing
LICENSE.txt, or external URLs in CSS).
Recommended tool sequence:
limesurvey_generate_survey_themelimesurvey_validate_survey_theme; continue only withvalid=trueafter reviewing everypolicy:warning (JavaScript,@import, and external or data URLs in CSS are served to every participant)limesurvey_get_theme_publication_guideusing the installed version shown in LimeSurveyImport the unrenamed ZIP with Upload & install in the theme list under Configuration > Advanced > Themes > Survey themes
Test an inactive survey on phone, tablet, desktop, keyboard, zoom, RTL, and print
limesurvey_assign_survey_themewithinstalled_theme_nameandconfirm_theme_assignment=true; it reads the current theme first (previous_theme), reads the template back, and fails withTHEME_NOT_APPLIEDwhen LimeSurvey kept another theme (THEME_NOT_VERIFIEDwhen only the read-back fails,THEME_PREVIOUS_UNKNOWNwithout writing when the current theme cannot be read)
See Survey Theme Guide for complete examples, acceptance criteria, Cloud restrictions, community publication, and rollback.
Secure File Exports
File export tools require LIMESURVEY_EXPORT_DIR. File names cannot contain
directories, traversal segments, or null bytes. The server enforces decoded size
limits, creates restrictive files, refuses replacement by default, and returns
the path, size, MIME type, and SHA-256 digest instead of base64 content.
The original RemoteControl export methods remain available for compatibility. Oversized inline responses are replaced by a marked preview that is not a valid export file.
Secure File Imports
limesurvey_import_survey, limesurvey_import_group, and
limesurvey_import_question accept an import_data_path argument as an
alternative to inline import_data. Set exactly one of the two; the server
reads the file at import_data_path from LIMESURVEY_IMPORT_DIR (falling
back to LIMESURVEY_EXPORT_DIR when unset) and base64-encodes it itself, so a
survey file of any size can be imported with a single tool call instead of an
inline base64 payload. Use import_data_path for files at or above roughly
50 KB; reserve inline import_data for small files under 200,000 characters
of base64 text.
The path is resolved and checked the same way as export file names: it must
stay inside the configured import directory. Oversized files, missing files,
paths outside the directory, and conflicting/missing parameters all fail with
a distinct error code (IMPORT_FILE_TOO_LARGE, IMPORT_FILE_NOT_FOUND,
IMPORT_PATH_OUTSIDE_DIR, IMPORT_PARAM_CONFLICT,
IMPORT_PAYLOAD_TOO_LARGE, IMPORT_DIR_NOT_CONFIGURED) plus a recovery
hint. Changing LIMESURVEY_IMPORT_DIR or LIMESURVEY_MAX_IMPORT_BYTES
requires a full restart of the MCP client process; reconnecting alone does not
reload environment variables.
import_survey returns the survey ID LimeSurvey actually used: it keeps the
ID embedded in the file when that ID is free, destination_survey_id
overrides it when set, and on an ID collision LimeSurvey silently assigns a
random 6-digit sid instead of failing.
Replacing a Question
set_question_properties cannot write question attributes, answer options, or
subquestions. limesurvey_replace_question (write scope content) swaps one
main question of an inactive survey for the question in a .lsq file, in
the same group and at the same position. Arguments: survey_id, question_id,
import_data or import_data_path (same rules as the imports above),
import_data_type (lsq), and confirm_destructive_action=true (required: the
old question is deleted). The code, type, texts, attributes, answer options,
and subquestions come from the file; the mandatory flag is read from the file
and passed on, because import_question always overwrites it.
The tool uses only official RemoteControl methods, in this order:
get_survey_properties (active must be N, otherwise SURVEY_ACTIVE),
get_question_properties (the question must belong to survey_id, otherwise
QUESTION_SURVEY_MISMATCH, and be a main question, otherwise
NOT_A_MAIN_QUESTION), list_questions, then the local parse of the file;
if the file has the same code, a temporary code for the old question
(set_question_properties), import_question, set_question_properties
(question_order of the old question), a read-back of the old question,
delete_question, and a verification (get_question_properties,
list_questions). The only question that can be deleted is question_id.
Every failure after the first write is rolled back: the question this call
imported is deleted and the old code is restored. The error
(REPLACE_QUESTION_FAILED) names the failed step and the rollback steps; if a
rollback step failed too, details.manual_cleanup lists what to fix by hand.
delete_question refuses a question that other questions depend on through
legacy conditions, which also rolls the replacement back. The result has
survey_id, group_id, old_question_id, new_question_id, title,
question_order, steps, verification, and notes. Question IDs change;
references by code (relevance expressions) keep working; legacy conditions that
reference the old question ID are not migrated.
Capability Detection
The server prints a startup preflight to stderr for every optional directory
(LIMESURVEY_EXPORT_DIR/LIMESURVEY_IMPORT_DIR/LIMESURVEY_THEME_DIR) that
is not configured, naming the tools that stay disabled until it is set and
that changing it requires a full restart.
limesurvey_get_instance_info makes no RemoteControl call by default: it
reports server_version, instance_host (host only, never credentials),
password_source (file or env; never the path or the content),
transport, read_only (true only for write scope none), write_scope and
write_scope_source (default, LIMESURVEY_WRITE_SCOPE or
LIMESURVEY_READ_ONLY), experimental_methods_enabled, per-directory
{configured, path, exists, writable} checks, and a capabilities summary.
capabilities stays a map of booleans (import_via_path,
export_survey_to_file, list_installed_themes, theme_generation,
theme_assignment, content_changes, lifecycle_changes,
participant_outreach, file_exports), computed after the write scope and
the configured directories. capability_blocked_by has exactly the same keys
and holds null when a capability is available, otherwise the reason (the
required and current write scope with its source, and/or the missing environment
variable; several reasons are joined with ; ).
Set probe_instance=true to additionally call list_surveys (connectivity/
auth proof, count only) and get_site_settings("versionnumber"), which
requires a superadmin service account and degrades to
permission_level: "standard" with instance_version: null otherwise. The
probe also fills server_time (ISO-8601 UTC) and server_time_source
("http_date_header"); without it both are null and server_time_hint says to
use probe_instance=true. server_time_note states that this is the web
server's clock in UTC, not a time zone (the PHP time zone is not readable
through RemoteControl). Call this before relying on
file export/import or theming tools.
Limits of RemoteControl
These gaps are in LimeSurvey 6.17.11 itself (verified against its source), not in this server:
No mail send log. The delivery state is only visible in the participant fields
sent,remindersent,remindercount, andemailstatus.No list of the survey's uploaded files (attachments, images).
get_uploaded_filesonly returns files that respondents uploaded in file upload questions.get_language_propertiesshows which server paths the mail attachments reference.No clock method. The server time is only available from the HTTP
Dateheader (get_instance_infowithprobe_instance=true). The server's PHP time zone is not readable through RemoteControl. Only thetimeadjustoffset (hours between web server time and local time) is readable, and only by superadmins throughget_site_settings('timeadjust').
limesurvey_list_installed_themes combines two best-effort signals, since
RemoteControl2 has no official method to enumerate installed themes:
generated_packages lists ZIPs/folders already generated locally in
LIMESURVEY_THEME_DIR, and themes_in_use lists the distinct template
values actually assigned to up to survey_scan_limit visible surveys (via
list_surveys + get_survey_properties), which works without a superadmin
account — "inherit" is tracked separately as inherit_count, not as a
theme. The response always includes the documented admin-UI fallback
(Configuration > Themes) for the complete list.
Experimental Extension
list_response_exports is not part of the official RemoteControl method list.
Its workflow tool is disabled unless the matching LimeSurvey extension is
installed and LIMESURVEY_ENABLE_EXPERIMENTAL_METHODS=true is set.
limesurvey_export_survey_to_file is likewise experimental: core LimeSurvey 6
RemoteControl has neither export_survey nor export_survey_structure
(verified against the LimeSurvey 6.17.11 source). The tool requires
LIMESURVEY_ENABLE_EXPERIMENTAL_METHODS=true, asks
export_survey_structure first and export_survey second, and only succeeds if
a plugin on the LimeSurvey side serves one of them; otherwise it fails with a
structured EXPORT_UNSUPPORTED error that lists why each method failed.
State of the art as of 2026-10-11 (research, see the CHANGELOG): there is no
verified LimeSurvey 6.x plugin that exports a .lss over RemoteControl. The
extendRemoteControl plugin only offers demo functions and declares LimeSurvey
3/4; RemoteManageResponse and rcAddReponseCode only handle responses; the
REST API (survey-detail) returns the editor's JSON model, not an .lss. The
RemoteControl handler class itself cannot be extended by a plugin, but a plugin
can answer additional methods on the core URL (the replaceDefaultLink pattern
of RemoteManageResponse), so an own small plugin offering
export_survey_structure(sessionKey, surveyId) returning the base64 .lss
works with this tool. Upstream, LimeSurvey pull request #5384 (bug #17747, open,
targeting the 7.x line) adds exactly that method.
Without an export, use limesurvey_verify_survey_against_lss (next section).
Comparing a Survey with a .lss File
limesurvey_verify_survey_against_lss(survey_id, lss_path[, language]) is a
read-only tool (write scope none) for checking an import or a hand-edited
survey against its source file. lss_path must point to a file inside
LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR as a fallback; same path
check and size limit as import_data_path). The file is read locally; the live
survey is read with list_groups, list_questions, and
get_question_properties only, so read access to the survey content is enough
(get_survey_properties and its separate survey-settings permission are not
used). Without language, the base language is taken from the language field
of the list_groups rows. Answer options of dual-scale questions (type 1)
are requested as answeroptions_multiscale, which is the only name LimeSurvey
accepts for them, and compared per scale.
Groups (name and order), questions (code, type, mandatory, relevance, other,
text, help, position), subquestions, answer options, and question attributes
are matched by code, never by ID, because IDs change on import. The result has
summary (counts per area and attributes.missing_in_live, extra_in_live,
changed), differences (kind, group, question, item, field, lss,
live), differences_total, truncated (at most 500 differences are listed,
never cut silently), and limitations (conditions, quotas, assessments, default
values, and survey settings are not compared). language defaults to the base
language of the live survey. Both the LimeSurvey 6 file layout and older
exports with the texts in the entity rows are read.
Development
npm ci
npm test
npm run inspect
npm pack --dry-runThe 39 automated tests use mocked LimeSurvey JSON-RPC responses and cover:
JSON-RPC 1.0 ordering, session reuse, renewal, and secret handling
MCP handshake, schemas, annotations, confirmations, and read-only enforcement
Streamable HTTP bearer authentication and session isolation
workflow filtering and secure export files
survey theme ZIP generation, validation, publication guidance, and assignment
secure file imports via
import_data_pathfor survey, group, and question toolsenvironment preflight warnings (
envPreflightWarnings)capability detection (
get_instance_infowith and withoutprobe_instance,list_installed_themes) and the experimental, permission-degradingexport_survey_to_filetool
No live LimeSurvey credentials are required. Content evaluations must be created against a stable test instance; see evaluations/README.md.
An opt-in live integration runner exercises all 82 tools against disposable, prefixed test records:
npm run test:liveIt requires explicit environment confirmation and an external official
LimeSurvey fixture checkout. Never run it against a production instance.
cpd_importParticipants has no matching RemoteControl delete method, so the
runner reports the uniquely named central participant for manual removal. See
Live Integration Testing.
Project Structure
src/
client.ts JSON-RPC client and session handling
config.ts environment validation and secure defaults
tool-definitions.ts 56 official RemoteControl tools
workflow-tools.ts survey, participant, and export workflows
theme-tools.ts theme generator, validator, guide, and assignment
spec-tools.ts survey description (spec) tools
spec-generate.ts .lss generator (port of the plugin's Python generator)
spec-validate.ts spec validation with path, message, and fix
spec-read.ts reads a survey back as a spec (read methods only)
spec-compare.ts spec normal form, differences, fingerprint
scoped-client.ts per-call RemoteControl client limited to the write scope
attribute-defaults.ts question attribute defaults (generated, see tools/)
html-unescape.ts HTML entity decoding (port of Python's html.unescape)
server.ts MCP registration and central safety enforcement
http-server.ts authenticated Streamable HTTP transport
index.ts stdio/HTTP entry point
test/ mocked unit, protocol, transport, workflow, and theme tests
scripts/ opt-in guarded live integration test
tools/ generators for src/attribute-defaults.ts and src/html-entities.ts (not published)
docs/ detailed operational documentationCompatibility
Node.js 20, 22, and 24 are tested in CI.
RemoteControl uses JSON-RPC 1.0 positional parameters as required by LimeSurvey.
Theme generation supports LimeSurvey 7.x and 6.x with
vanilla; always validate against the exact installed patch release.LimeSurvey Cloud may restrict custom theme import by account or plan. The MCP server does not attempt unsupported filesystem installation.
Security
Read SECURITY.md before remote deployment. Report vulnerabilities privately via GitHub private vulnerability reporting, not through public issues.
Contributing
Contributions are welcome. See CONTRIBUTING.md and CHANGELOG.md.
License
The MCP server source code is licensed under the MIT License, Copyright (c) 2026 Wagner-Emden IT Services.
Survey theme ZIPs generated by the server are separately marked and licensed
under GPL-2.0-or-later because they are designed to inherit LimeSurvey's GPL
vanilla theme. Customer logos and other supplied assets retain their
own applicable rights and must not be redistributed without permission.
References
Available Tools
82 toolslimesurvey_activate_surveyActivate surveyA
Activate a survey after LimeSurvey consistency checks. Requires confirm_activation=true.
Calls LimeSurvey RemoteControl method activate_survey. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_activation | Yes | Required acknowledgement that survey activation changes its structure and behavior. | |
| activation_settings | No | Optional activation settings such as anonymized, datestamp, ipaddr, ipanonymize, refurl, and savetimings. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true. The description adds useful behavioral context beyond annotations: activation occurs after consistency checks, explicit confirmation is required, the underlying RemoteControl method is named, and session-key authentication is explicitly excluded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight paragraphs. The first front-loads the purpose and the required confirmation; the second adds implementation and authentication details. Every sentence contributes directly to correct invocation without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation tool with 4 parameters, an output schema, and annotations covering safety, the description covers purpose, required confirmation, consistency-check sequencing, authentication constraints, and the RemoteControl method. It could say more about failure modes if consistency checks fail, but it is largely complete given the structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents survey_id, confirm_activation, response_format, and activation_settings in detail. The description repeats the confirm_activation=true requirement but adds no syntax, format, or default information beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Activate a survey'. It also adds the precondition 'after LimeSurvey consistency checks'. However, it does not distinguish this tool from the sibling limesurvey_activate_tokens beyond the resource name, so sibling differentiation is absent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an implied usage context ('after LimeSurvey consistency checks') and notes the required confirm_activation=true acknowledgement. It does not state when not to use this tool or name alternatives such as limesurvey_activate_tokens or limesurvey_add_survey, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_activate_tokensActivate participant tableA
Create the survey participant table and optional custom attributes.
Calls LimeSurvey RemoteControl method activate_tokens. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| attribute_fields | No | Additional participant attribute field numbers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully adds auth context beyond annotations ('uses the configured service account; do not provide a session key') and names the underlying RemoteControl method. However, with idempotentHint=false it does not explain what happens on repeated activation, nor does it disclose side effects such as replacing/locking participant data — meaningful gaps for a table-creating mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the action front-loaded and the auth constraint placed second. No filler; every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations carry the safety profile. Still, for a mutation that creates the participant table, the description omits prerequisites and the consequence of re-running, leaving the definition only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents survey_id, response_format, and attribute_fields. The description's mention of 'optional custom attributes' loosely maps to attribute_fields but adds no syntax or format detail beyond the schema, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create the survey participant table and optional custom attributes.' An agent can distinguish this from sibling operations like get_participant_table_status or add_participants, though it never explicitly contrasts with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the purpose ('create the table'). There is no explicit when-to-use guidance, no mention of preconditions (e.g. that the survey must exist or that the table must not already be active), and no reference to the related sibling limesurvey_get_participant_table_status that would help an agent decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_groupCreate question groupB
Add an empty question group to a survey.
Calls LimeSurvey RemoteControl method add_group. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Question-group title. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| description | No | Question-group description. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write behavior (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds genuinely useful non-obvious context about authentication (service account, no session key), but says nothing about side effects such as duplicate titles or what happens to an existing survey structure. With annotations carrying the safety profile, this is a modest but real addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first sentence and only two short sentences total. The RemoteControl method reference is marginal but compact; nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. However, for a 4-parameter mutation tool with many create-group siblings, the description omits any differentiation from import_group/add_group_from_spec and any note on duplicate handling or ordering, leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (survey_id, title, description, response_format) is already documented in the schema with types and constraints. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Add an empty question group to a survey'), and the 'empty' qualifier meaningfully scopes the operation. It is clearly distinct from delete/import/set siblings by implication, though it never names an alternative to differentiate against explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'empty' suggests this is for creating a fresh group to be populated later, in contrast to import_group or add_group_from_spec, but no when-to-use, when-not-to-use, or alternative is stated. An agent must infer the routing from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_group_from_specAdd a group from a descriptionA
Insert one new group with its questions into an inactive survey, described as a group spec (the format limesurvey_get_survey_spec returns at level group; every text is one string for all survey languages or a map per language). position is the 1-based place among the groups, { before: group_id } or { after: group_id }; without it the group goes to the end. The spec is checked against the survey first (its languages; every question code must be free in the whole survey, case ignored, because the import would rename it silently): SPEC_INVALID, CODE_CONFLICT, SURVEY_ACTIVE and POSITION_INVALID write nothing. The group is imported (import_group) with exactly the survey languages and only the new group is moved to its place; no other group is changed. It is then read back and compared with the spec. Returns { survey_id, group_id, position { index }, questions [{ code, question_id }], verification { ok, differences, differences_total, truncated }, side_effects, warnings }; a difference is a finding, not an error. If a step after the import fails, the new group is deleted again (nothing else) and ADD_GROUP_FAILED reports failed_step, rolled_back, manual_cleanup and cause_code. If the outcome of the import itself is unknown (lost answer, an unexpected answer), nothing is deleted: created is "unknown" and candidates and cleanup_hint say what to check. The .lsg import fills no translation gaps. An active survey is refused. A single question goes with limesurvey_add_question_from_spec. A Ranking question makes the tool read the LimeSurvey generation once (entries as subquestions on 7, as answers on 6). Needs the write scope content.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | The new group as a group spec { title, description, relevance, randomization_group, questions }. | |
| position | No | 1-based place among the groups, { before: group_id } or { after: group_id }; default: the end. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering the safety profile, the description carries rich behavioral context: pre-import validation (languages, free question codes, case-insensitive) with named failures that write nothing, exactly what gets moved (only the new group), a read-back verification step, rollback behavior when a later step fails and the distinct no-delete path when the import outcome is unknown. That is far beyond what the annotations declare.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action and its constraints are front-loaded in the first sentence, and given the tool's failure modes most sentences earn their place. It is, however, a single dense paragraph with no visual separation between mechanics, errors, and return shape, which makes it harder to scan than its content warrants.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive-capable spec import with nested objects, this is essentially complete: preconditions, validation and error codes, rollback semantics, unknown-outcome handling, scope requirement, and an unusual Ranking-question quirk. The return shape is also described even though an output schema exists, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema cannot: it identifies the group spec as the exact format limesurvey_get_survey_spec emits at level group, explains the one-string-or-language-map convention for every text, and clarifies that position without a value defaults to the end. These are cross-tool format contracts, not restatements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Insert one new group with its questions into an inactive survey, described as a group spec.' It scopes the operation (one group, its questions, inactive survey only) and explicitly names the sibling boundary ('A single question goes with limesurvey_add_question_from_spec'), so an agent can distinguish it from add_question_from_spec and create_survey_from_spec without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear preconditions and routing: an active survey is refused, the spec must come from limesurvey_get_survey_spec at level group, and single questions belong to the sibling tool. It also states the required write scope. It does not, however, contrast itself with the non-spec sibling limesurvey_add_group, which is the most obvious alternative for adding a group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_languageAdd survey languageB
Add a language to a survey.
Calls LimeSurvey RemoteControl method add_language. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | Language code to add. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered by structured data. The description adds a genuinely useful operational detail — authentication uses the configured service account and no session key should be supplied — but says nothing about what happens when the language already exists, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the action front-loaded, and each clause carries distinct information (purpose, underlying RemoteControl method, auth expectation). No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the mutation/safety profile, the description need not explain return values, and it supplies the auth detail that would otherwise be missing. The one gap is duplicate-language behavior, which the agent cannot derive from annotations or schema given idempotentHint=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so survey_id, language, and response_format are already documented in the schema; the description adds no format hints or constraints (e.g., which ISO codes are accepted). This is the baseline case where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a language to a survey'), which is unambiguous about the action taken. It does not, however, distinguish itself from nearby siblings such as limesurvey_delete_language, limesurvey_set_language_properties, or limesurvey_get_survey_languages, so the agent must infer the boundary from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but gives no when-to-use, when-not-to-use, or alternative routing. It never mentions that get_survey_languages is the read counterpart or that set_language_properties handles modifications to an existing language, which is exactly the ambiguity an agent faces in this large sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_participantAdd one survey participantC
Add one participant using a simple participant object.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| participant | Yes | Participant fields such as email, firstname, lastname, token, and attributes. | |
| create_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) indicate mutation but non-destructive behavior. The description adds no further behavioral context such as what happens if a participant already exists, validation rules, or side effects. Minimal transparency beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with verb and resource. Concise, but could be slightly more informative without losing brevity. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 3 parameters, nested objects, and an output schema, the description is too brief. It doesn't mention return values, required session key, or that the survey must exist. Incomplete for effective tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so baseline is 3. The description 'simple participant object' hints at the nature of the participant parameter but adds little beyond the schema's own description. No extra meaning for survey_id or create_token.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Add one participant using a simple participant object' clearly states the action and differentiates from the sibling limesurvey_add_participants (plural) by specifying 'one'. However, it does not explicitly mention that the participant is added to a survey, though the survey_id parameter implies it. Slightly vague but sufficient.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives like limesurvey_add_participants for batch adds. No prerequisites, no mention of token creation default or when to set create_token to false. Lacks contextual usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_participantsAdd survey participantsA
Add one or more participants to a survey.
Calls LimeSurvey RemoteControl method add_participants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| create_token | No | Generate missing participant tokens. | |
| participants | Yes | Participant records. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false and openWorld=true, so the safety profile is covered. The description usefully adds auth behavior ('uses the configured service account; do not provide a session key') and names the underlying RemoteControl method, which prevents a common invocation error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; the purpose leads and the auth constraint follows. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and parameters are documented. But the participants array is loosely typed (anyOf over all types) with only 'Participant records.', and the description does not compensate by indicating the expected record shape, which is the main thing an agent could get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented structurally. The description adds nothing about survey_id, create_token, participants, or response_format, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource (add participants to a survey) and the plural 'one or more' hints at a bulk operation. However, it never distinguishes itself from the closely-named singular sibling limesurvey_add_participant, nor from limesurvey_cpd_importParticipants, so an agent could still pick the wrong add variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, or alternative routing is given. With siblings like add_participant, invite_participants, and cpd_importParticipants, the description provides no guidance on which add path applies to which situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_question_from_specAdd a question from a descriptionA
Insert one new question into a group of an inactive survey, described as a question spec (the format limesurvey_get_survey_spec returns at level question; every text is one string for all survey languages or a map per language). position is the 1-based place in the group, { before: code } or { after: code }; without it the question goes to the end. The spec is checked against the survey first (its languages; the code must be free in the whole survey, case ignored): SPEC_INVALID, CODE_CONFLICT, SURVEY_ACTIVE, GROUP_SURVEY_MISMATCH and POSITION_INVALID write nothing. The question is imported (import_question) and only the new question is moved to its place; no other question is changed. It is then read back and compared with the spec. Returns { survey_id, group_id, question_id, code, position { index }, verification { ok, differences, differences_total, truncated }, side_effects, warnings }; a difference is a finding, not an error. import_question fills every text of the survey that has no row in an additional language with the base-language text, which cannot be undone: if the survey has such gaps, the tool answers TRANSLATION_GAPS (the gaps with path, language and question or group) and writes nothing, unless acknowledge contains fill_translation_gaps; side_effects then lists the filled gaps (paths as after the insertion). If a step after the import fails, the new question is deleted again (nothing else) and ADD_QUESTION_FAILED reports failed_step, rolled_back, manual_cleanup and cause_code. If the outcome of the import itself is unknown (lost answer, an error after the creation), nothing is deleted: created is "unknown" and candidates and cleanup_hint say what to check. An active survey is refused. A whole group goes with limesurvey_add_group_from_spec. A Ranking question makes the tool read the LimeSurvey generation once (entries as subquestions on 7, as answers on 6). Needs the write scope content.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ID of the group of this survey that gets the question. | |
| position | No | 1-based place in the group, { before: code } or { after: code }; default: the end of the group. | |
| question | Yes | The new question as a question spec, for example the spec of limesurvey_get_survey_spec at level question with a new code. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| acknowledge | No | Confirmed risks. fill_translation_gaps: the import may fill texts of the survey that have no row in an additional language with the base-language text (otherwise such gaps answer TRANSLATION_GAPS). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false): it enumerates validation codes that write nothing (SPEC_INVALID, CODE_CONFLICT, SURVEY_ACTIVE, etc.), the import_question side effect on translation gaps that 'cannot be undone', the rollback behavior on post-import failure (delete-and-report), and the unknown-outcome path where nothing is deleted. It also names the required write scope, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the remainder is a dense, comma-chained wall of edge cases and error codes with little structural separation. Every clause is informative, yet the run-on delivery makes it hard for an agent to parse; bullets or grouping of the failure paths would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with nested spec objects, validation, rollback, and irreversible side effects, the description is thorough. Return-shape detail is somewhat redundant given the output schema exists, but completeness for correct invocation is not in question.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description nonetheless adds meaning the schema lacks: the code must be free across the whole survey case-insensitively, the spec is one string or a per-language map, and the acknowledge/fill_translation_gaps semantics. This is above the baseline but position formatting largely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource+constraint: 'Insert one new question into a group of an inactive survey, described as a question spec.' It also distinguishes itself from the relevant sibling by noting 'A whole group goes with limesurvey_add_group_from_spec,' so an agent can separate this from add_group_from_spec and update_question_from_spec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and routing: 'an inactive survey' is required, 'An active survey is refused,' the spec must come from limesurvey_get_survey_spec at level question, and whole-group insertion is redirected to limesurvey_add_group_from_spec. The acknowledge flag is also tied to a specific risky condition, making the when-to-use conditions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_quotaCreate quotaB
Create a quota with minimum details.
Calls LimeSurvey RemoteControl method add_quota. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Quota redirect URL. | |
| name | Yes | Quota name. | |
| limit | Yes | Maximum responses allowed. | |
| action | No | Quota action. | |
| active | No | Activate the quota immediately. | |
| message | No | Quota message. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| autoload_url | No | Automatically load the quota URL. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| url_description | No | Quota URL label. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the mutation profile is covered. The description adds genuinely useful context the annotations do not: authentication uses the configured service account and no session key should be supplied. It stops short of describing persistence or side effects on existing surveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded and the auth note clearly separated. No filler, though the second sentence could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the auth prerequisite is covered. For a 10-parameter mutation tool, however, the absence of any when-to-use routing relative to the other quota tools leaves a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 10 parameters are already documented in the schema. The phrase 'with minimum details' hints that only the 3 required fields are needed, but adds little semantic detail beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a quota') and even names the underlying RemoteControl method, so an agent knows exactly what it does. It does not explicitly differentiate from siblings like set_quota_properties or list_quotas, but the create-vs-modify distinction is inferable from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says only 'with minimum details' and gives no guidance on when to use this versus set_quota_properties, get_quota_properties, or list_quotas. There are no exclusions or alternative routing, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_responseAdd survey responseA
Insert a response into a survey response table.
Calls LimeSurvey RemoteControl method add_response. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| response | Yes | Response fields mapped to values. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false, openWorld=true, so the safety profile is covered. The description adds genuinely new operational context: the underlying RemoteControl method name and the fact that authentication is handled by a configured service account so no session key is passed. It stops short of saying what happens to duplicate submissions or how failures surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the action front-loaded and no filler; the auth caveat is placed last where it belongs. It is efficient, though the RemoteControl method-name sentence is only marginally useful to an agent making a selection call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the 100%-covered schema handles the parameters. The one thing an agent could easily get wrong in this tool family – passing a session key – is explicitly addressed, so the definition is nearly complete for a 3-param write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (survey_id, response, response_format are all documented in the schema, including the json/markdown trade-off), so the baseline of 3 applies. The description adds no syntax, format, or field-mapping detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Insert a response into a survey response table'), which pairs with the title 'Add survey response' to make the operation unambiguous. It does not, however, distinguish itself from the adjacent limesurvey_update_response or limesurvey_delete_response siblings, which share the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'insert' – there is no explicit when-to-use vs. update_response/delete_response guidance or stated prerequisites (e.g. survey must be active, tokens required). The auth note ('do not provide a session key') is a partial guideline, but it is framed as a usage constraint rather than a scenario selector.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_add_surveyCreate surveyA
Create an empty survey with minimum settings.
Calls LimeSurvey RemoteControl method add_survey. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the new survey. | |
| format | No | Question display format: all, group-by-group, or single question. | |
| language | Yes | Base language code for the survey. | |
| survey_id | Yes | Desired survey ID. Use 0 to let LimeSurvey choose. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true), so the bar is lower. The description adds genuinely useful behavioral context: auth is via the configured service account and no session key should be supplied. The only weakness is the somewhat filler note about the underlying RemoteControl method name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with the core purpose first and an operational note second. Little waste, though the RemoteControl method-name detail is marginally low-value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers purpose and the authentication prerequisite, which is what an agent needs to call it correctly; it could say a bit more about what 'minimum settings' defaults to, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (including the survey_id=0 convention and response_format enum) are fully documented in the schema. The description adds no parameter-level meaning, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an empty survey with minimum settings'), and the 'empty'/'minimum settings' qualifier subtly separates it from import_survey, copy_survey, and create_survey_from_spec. It does not name those siblings explicitly, so differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'empty survey with minimum settings' but there is no explicit when-to-use or when-not-to guidance. With several survey-creation siblings (import, copy, from_spec), the description never routes the agent between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_assign_survey_themeAssign an installed theme to a surveyAIdempotent
Assign an already imported LimeSurvey survey theme: read the current template (previous_theme), set the new one through set_survey_properties, and read it back with get_survey_properties. theme_name is the installed name (for a generated package its installed_theme_name, such as acme_feedback-100-ls7). LimeSurvey answers {"template": true} even when it keeps another theme; a different read-back value, or a refused save ({"template": false}), fails with THEME_NOT_APPLIED; a failed or empty read-back with THEME_NOT_VERIFIED (written: true); an unreadable previous theme with THEME_PREVIOUS_UNKNOWN (written: false). Results and THEME_NOT_APPLIED name previous_theme and changed. inherit is refused; set it with limesurvey_set_survey_properties or in the admin interface. This does not upload or install the theme package.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | ||
| theme_name | Yes | Installed LimeSurvey theme name as shown in the theme list, for example acme_feedback-100-ls7 (installed_theme_name of limesurvey_generate_survey_theme) or a core theme such as vanilla. | |
| confirm_theme_assignment | Yes | Required acknowledgement that the survey appearance will change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring the safety profile, the description carries the real behavioral burden and delivers: it discloses the LimeSurvey quirk that the API answers {"template": true} even when it keeps another theme, and defines three distinct failure modes (THEME_NOT_APPLIED, THEME_NOT_VERIFIED with written: true, THEME_PREVIOUS_UNKNOWN with written: false). This is exactly the kind of non-obvious behavior annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and workflow are front-loaded, then error semantics, then the exclusion note. Every sentence is load-bearing given the error codes, but the error paragraph is dense and could be grouped more readably. Appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still covers the critical read-back semantics and error taxonomy an agent needs to interpret results. Combined with the mechanism steps and the inherit exclusion, nothing required to call and interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the schema documents theme_name and confirm_theme_assignment but not survey_id. The description adds real value for theme_name by cross-referencing its source ('installed_theme_name of limesurvey_generate_survey_theme') and the name pattern example. It leaves confirm_theme_assignment and survey_id to the schema, so it adds meaning but not full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Assign an already imported LimeSurvey survey theme') and spells out the actual mechanism (read previous_theme, set via set_survey_properties, read back). It distinguishes itself from siblings by explicitly excluding theme upload/install and routing the 'inherit' case to limesurvey_set_survey_properties. An agent can tell this apart from generate/validate theme or generic set_survey_properties without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when/when-not guidance: 'inherit is refused; set it with limesurvey_set_survey_properties or in the admin interface' and 'This does not upload or install the theme package.' These exclusions route the agent correctly. It stops short of a full decision map to other theme siblings (e.g. list_installed_themes as a prerequisite), so not quite a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_copy_surveyCopy surveyA
Copy an existing survey under a new name.
Calls LimeSurvey RemoteControl method copy_survey. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| new_name | Yes | Name for the copied survey. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| source_survey_id | Yes | ID of the survey to copy. | |
| destination_survey_id | No | Optional desired ID for the copy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description still adds value annotations do not carry: it names the underlying LimeSurvey RemoteControl method `copy_survey` and states the authentication model (service account, no session key supplied by the caller). It does not say what else is duplicated (groups, questions, settings) or that repeated calls create additional copies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded and zero filler. The authentication caveat is the only addition and it earns its place by preventing an incorrect session-key argument.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation; the schema documents the parameters, and the annotations carry the safety semantics. What remains—purpose, invocation mechanics, auth model—is covered, making this complete for a simple copy operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (including the optional `destination_survey_id` and the enum-backed `response_format`) are documented in the schema itself, making 3 the baseline. The description only echoes the `new_name` concept and adds no syntax, constraints, or meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Copy an existing survey") plus the resulting scope ("under a new name"), so the action is unambiguous. It does not, however, explicitly differentiate itself from nearby siblings like limesurvey_add_survey, limesurvey_import_survey, or limesurvey_create_survey_from_spec, which an agent might also reach for when duplicating survey content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use statement and no named alternatives; the only explicit guidance is operational ("Authentication uses the configured service account; do not provide a session key"). The use case (duplicating an existing survey) is implied by the verb but not contrasted with import/create alternatives, so the agent must infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_cpd_importParticipantsImport central participantsA
Import records into the central participant database.
Calls LimeSurvey RemoteControl method cpd_importParticipants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| participants | Yes | Central participant records. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| update_existing | No | Update matching existing records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true), so the bar is lower. The description adds genuinely useful operational context the annotations do not: authentication uses the configured service account and the caller must not supply a session key. It still does not explain dedupe/matching behavior or interaction with update_existing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences; the purpose is front-loaded and the auth constraint follows immediately. Nothing is wasted and there is no boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description covers purpose and the non-obvious auth model. It leaves minor gaps: what key is used to match existing records, and what happens on duplicate/partial imports when update_existing is false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (participants, response_format, update_existing) are already documented in the schema. The description adds no format, matching, or syntax detail beyond what the schema provides, which is the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Import records into the central participant database', which distinguishes the central participant database from survey-level token tables. It does not explicitly name the nearest sibling (limesurvey_add_participants) or state how this differs from it, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'central participant database' but the description never says when to choose this over limesurvey_add_participants, limesurvey_add_participant, or limesurvey_validate_participants, and gives no prerequisites. No explicit when/when-not guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_create_survey_from_specCreate a survey from a descriptionA
Create a new survey from a survey description (spec { survey, groups }). The spec is checked first: an invalid spec answers SPEC_INVALID with errors [{ path, message, fix }] and sends nothing to LimeSurvey. A valid spec becomes a LimeSurvey structure file (.lss) that import_survey imports; the new survey stays inactive and is not activated. The tool then reads the survey back (read methods only) and compares it with the spec. Returns { survey_id, title, languages, groups, questions, active, verification { ok, differences [{ path, expected, actual, and for a subquestion or answer its code and, on scale 1, scale_id }], differences_total, truncated }, truncated }, plus warnings, missing_translations and unreadable (each with a _total) when there are any. A list shows at most 200 entries and is cut further to stay within LIMESURVEY_MAX_RESPONSE_CHARS; the _total fields hold the full numbers and truncated says whether a list was cut. A difference is a finding of the comparison, not an error of the call. If LimeSurvey answers the import with an error, the tool answers CREATE_SURVEY_FAILED with LimeSurvey's message and details.created false (nothing was created). If the import call itself fails (transport or JSON-RPC error, or no survey ID in the answer), details.created is "unknown" with manual_cleanup, the title and a recovery that names limesurvey_find_surveys: look for the survey before calling again. If only the read-back fails, CREATE_SURVEY_FAILED names the created survey_id. The tool takes no file path, adds nothing to existing surveys, activates nothing and deletes nothing. A spec can be checked beforehand with limesurvey_validate_spec; limesurvey_get_survey_spec returns the spec of an existing survey in this format. A text is one string (for every language) or a map per language. A spec with a Ranking question makes the tool read the generation of the instance once (get_group_properties for group 0): on LimeSurvey 7 the entries are written as subquestions of type R (code up to 20 characters, with relevance), on LimeSurvey 6 as answers (code up to 5 characters, no relevance). The second scale of the types 1 (answers) and : and ; (subquestions, the columns) is given with scale_id 1. Needs the write scope content.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | The survey description. Its fields depend on kind; unknown fields are reported by the check, not rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond what the annotations declare, the description discloses the full behavioral contract: the spec is validated before anything is sent, the created survey 'stays inactive and is not activated,' the tool reads the survey back with read methods only, and it details error codes (SPEC_INVALID, CREATE_SURVEY_FAILED), details.created=false/'unknown' with manual_cleanup and a named recovery path, plus response truncation rules (200 entries, LIMESURVEY_MAX_RESPONSE_CHARS) and the write-scope requirement. Annotations only cover the safety profile, which matches (non-destructive, not idempotent, no contradiction).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose, but the body is an extremely dense, run-on paragraph mixing validation, error codes, return shape, truncation, and version-specific quirks with little formatting. Much of it earns its place, yet the lack of structure makes it hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity, nested-spec creation tool, the description covers success, validation failure, import failure, partial failure, truncation, and version-specific edge cases. It even restates the return shape (redundant given the output schema) but nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds real semantics beyond it: language handling ('one string for every language or a map per language'), the scale_id convention for the second scale of types 1, : and ;, and the Ranking-question read-back behavior that differs across LimeSurvey 6 and 7. This clarifies cross-field relationships the flat schema cannot.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Create a new survey from a survey description') and immediately scopes it with '(spec { survey, groups })'. It actively distinguishes itself from siblings: import_survey consumes the generated .lss, validate_spec pre-checks, get_survey_spec reads an existing spec, and it explicitly states it 'takes no file path, adds nothing to existing surveys, activates nothing and deletes nothing.' An agent can place this among add/import/activate without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is given: use this when you have a spec, check it first with limesurvey_validate_spec, and use limesurvey_get_survey_spec to obtain a spec for an existing survey. The negative scoping ('adds nothing to existing surveys, activates nothing, deletes nothing') further routes the agent away from sibling mutation tools. It stops short of an explicit when-not-to-use statement for add_survey vs this tool, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_groupDelete question groupADestructive
Delete a question group from a survey. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_group. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Numeric question-group ID. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds real value beyond that: it names the underlying RemoteControl method and clarifies that auth uses the configured service account with no session key supplied, which is non-obvious given the sibling session-key tools. It omits whether contained questions are cascaded/removed with the group, the one notable behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a short auth note, with the action and precondition front-loaded and zero filler. Every sentence carries information the agent cannot get elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations plus the auth/method notes cover the operational essentials. The gap is that a destructive group deletion does not mention the fate of questions inside the group, which an agent might reasonably need before confirming.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so survey_id, group_id, response_format, and the confirm flag are all documented in the schema itself. The description only restates the confirm flag requirement, adding no syntax or constraint detail beyond what the structured fields provide; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a question group from a survey), which cleanly distinguishes it from siblings like limesurvey_delete_survey, limesurvey_delete_question, and limesurvey_set_group_properties. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the precondition that confirm_destructive_action=true is required, which is useful gating context. However, it gives no guidance on when to choose this over alternatives (e.g., set_group_properties to modify rather than remove) and no exclusions or consequences of proceeding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_languageDelete survey languageADestructive
Remove a non-base language from a survey. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_language. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | Language code to remove. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotency, but the description adds real value beyond them: the mandatory destructive-acknowledgement flag and the authentication model ('configured service account; do not provide a session key'). It could go further by stating that removal is irreversible and what happens to translations tied to that language.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose and the blocking prerequisite, with no redundant restatement of the tool name. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive four-parameter tool with an output schema and rich annotations, the description covers purpose, the safety gate, and the auth expectation. Return values are handled by the output schema, so nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so survey_id, language, response_format, and confirm_destructive_action are all documented in the schema itself. The description only restates the confirm flag requirement and adds no semantics for the other parameters, matching the baseline for a fully-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a ... language from a survey') and narrows the scope with 'non-base', which separates it from limesurvey_add_language and limesurvey_set_language_properties. An agent can identify the operation without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('Requires confirm_destructive_action=true') and an implicit exclusion via 'non-base language', so the agent knows base languages are out of scope. It stops short of explicitly routing to a sibling (e.g. set_language_properties for edits), so it is not a full when/when-not/alternative statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_participantsDelete survey participantsADestructive
Delete participants by token-table row IDs. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_participants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| token_ids | Yes | Participant token-table row IDs. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely new context: the confirmation gate and the authentication model (configured service account, no session key), which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the action and target, followed by invocation and auth notes. Every sentence carries information an agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers targeting, confirmation, and auth adequately; it stops short of noting whether deletion cascades to associated responses or how partial failures among multiple token IDs are handled for this irreversible operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so survey_id, token_ids, and confirm_destructive_action are already documented. The description only restates the token-table row ID meaning, adding no syntax or constraints beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
State a precise verb+resource and scope: 'Delete participants by token-table row IDs.' This is immediately distinguishable from delete_survey, delete_response, and delete_group, and the ID-based targeting is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the mandatory prerequisite (confirm_destructive_action=true) but gives no guidance on when to choose this over related operations, nor does it mention that token IDs typically come from list_participants. Usage is implied rather than framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_questionDelete questionADestructive
Delete a question from its survey. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_question. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| question_id | Yes | Numeric question ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds useful operational context beyond annotations: it requires explicit confirmation and states that authentication uses the configured service account, with no session key needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the destructive action, and every sentence adds operational value. There is no wasted wording or redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, full schema coverage, and an output schema, the description is complete enough for correct invocation. It covers the destructive nature, confirmation requirement, and authentication approach, though it could mention irreversible effects more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents question_id, confirm_destructive_action, and response_format. The description mainly repeats the confirmation requirement and adds authentication guidance rather than adding parameter-specific syntax or semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: delete a question from its survey. It is distinct from sibling tools like replace_question or update_question_from_spec, though it does not explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a required precondition (confirm_destructive_action=true) but does not explain when to choose deletion over alternatives such as replacing or updating a question. Usage is implied by the tool name and purpose, which is the minimum viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_quotaDelete quotaADestructive
Delete a survey quota. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_quota. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| quota_id | Yes | Numeric quota ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered structurally. The description adds useful non-annotation context: the confirmation requirement, the backing RemoteControl method, and the authentication expectation that no session key should be provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and required confirmation, followed by implementation and authentication notes. Every sentence earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is complete enough to invoke safely: it identifies the destructive action, requires explicit confirmation, notes authentication expectations, and an output schema exists so return values need not be described. It could add more about downstream effects of deleting a quota, but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents quota_id, response_format, and confirm_destructive_action. The description adds no parameter meaning beyond what is in the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Delete a survey quota.' This clearly distinguishes the tool from sibling quota operations such as list_quotas, add_quota, get_quota_properties, and set_quota_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a required precondition ('Requires confirm_destructive_action=true'), which helps invocation, but it does not explicitly say when to use this tool versus alternatives like set_quota_properties or list_quotas. Usage is implied by the destructive delete verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_responseDelete survey responseADestructive
Permanently delete a response. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_response. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_id | Yes | Numeric response ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnly=false, and idempotent=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the deletion is "Permanent," it requires `confirm_destructive_action=true` as a gate, and authentication uses the configured service account so no session key should be supplied. The auth note is real operational value the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the destructive action and its gate, followed by implementation/auth detail. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values need not be explained since an output schema exists, and the description covers the destructive nature, the confirmation gate, and authentication behavior. It is nearly complete; only the absence of any failure/error context (e.g., what happens on a missing or already-deleted response) keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (including survey_id, response_id, response_format, confirm_destructive_action) are already documented. The description restates the confirm flag requirement, which is already encoded as `const: true` in the schema, adding little beyond the structured data. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a concrete verb+resource ("Permanently delete a response"), which is unambiguous and matches the tool title. It does not, however, explicitly distinguish itself from the many other delete siblings (delete_survey, delete_participants, delete_group, delete_question), so an agent must rely on the resource noun alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the confirmation precondition but gives no when-to-use framing, no alternatives, and no warnings about when deletion is inappropriate (e.g., versus update_response or deactivating a survey). The agent gets a prerequisite, not guidance on when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_delete_surveyDelete surveyADestructive
Permanently delete a survey. Requires confirm_destructive_action=true.
Calls LimeSurvey RemoteControl method delete_survey. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_destructive_action | Yes | Required acknowledgement of the permanent deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description still adds useful non-annotation context: the deletion is permanent, and authentication uses a configured service account rather than a caller-supplied session key (relevant given the get_session_key/release_session_key siblings). It stops short of saying what else is destroyed alongside the survey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, the destructive nature is front-loaded, and the confirmation precondition and auth note follow in order of importance. Nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description does not need to explain return values, and the auth clarification is a valuable addition. It is slightly incomplete in not warning that deleting a survey also removes its groups, questions, and responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so survey_id, response_format, and confirm_destructive_action are all already documented in the schema. The description only restates the confirmation requirement, adding no syntax or format detail beyond the schema, which makes 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Permanently delete a survey'), and the resource is enough to separate it from the many sibling delete tools (delete_group, delete_question, delete_response, delete_participants, delete_quota). An agent can identify the target of the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete precondition ('Requires confirm_destructive_action=true'), which is real usage guidance, but there is no when-to-use vs when-not framing and no mention of alternatives or irreversibility tradeoffs relative to sibling operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_responsesExport survey responsesARead-onlyIdempotent
Export responses as a base64-encoded document.
Calls LimeSurvey RemoteControl method export_responses. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional response fields to export. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| heading_type | No | Column heading style. | |
| document_type | Yes | Export type such as csv, html, pdf, xls, or json. | |
| language_code | No | LimeSurvey language code; null uses the survey default. | |
| response_type | No | Answer text format. | |
| to_response_id | No | Optional last response ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| from_response_id | No | Optional first response ID. | |
| completion_status | No | Completion filter. | |
| additional_options | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only, idempotent profile, and the description adds real context on top: the response is base64-encoded (not raw content), it maps to the RemoteControl `export_responses` method, and it authenticates via a configured service account so no session key should be supplied. It omits any note about export size limits, timeouts, or long-running behavior, which is a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the most differentiating fact — the base64-encoded output — front-loaded. The second sentence is slightly lower value but ties the tool to the upstream RemoteControl method name, which is useful for disambiguation; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and 91% schema description coverage carries the parameter burden. The remaining gap is the absence of any export-scoping or size guidance for a tool that can pull an entire response set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 91%, so the schema already documents nearly every one of the 11 parameters including the four enums. The description adds nothing about parameter syntax or interactions (e.g. how document_type relates to the base64 payload), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export responses') and pins down the output artifact as 'a base64-encoded document', which implicitly separates it from the limesurvey_export_responses_to_file sibling. It never names that sibling explicitly, so an agent must infer the inline-vs-file distinction rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no mention of the by-token or to-file alternatives among the many export siblings. The usage is only implied by the output form (base64 payload returned inline rather than written to a file), which is thin for a fleet of near-duplicate export tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_responses_by_tokenExport responses by tokenARead-onlyIdempotent
Export responses for selected participant tokens as a base64-encoded document.
Calls LimeSurvey RemoteControl method export_responses_by_token. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Optional response fields to export. | |
| tokens | Yes | One participant token or a list of tokens to export. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| heading_type | No | Column heading style. | |
| document_type | Yes | Export type such as csv, html, pdf, xls, or json. | |
| language_code | No | LimeSurvey language code; null uses the survey default. | |
| response_type | No | Answer text format. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| completion_status | No | Completion filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the burden is lower. The description adds real value beyond them: the result is a base64-encoded document, and authentication uses the configured service account with no session key required. It does not, however, note size or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and followed by the auth constraint. Efficient with no filler, though the second sentence is slightly process-oriented rather than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is not needed, and the auth note plus encoding note cover the key invocation concerns. Only the relationship to the _to_file and unfiltered siblings is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all nine parameters, including enum options, are documented in the schema itself. The description adds no parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Export), resource (responses), and a scope qualifier (by participant token), plus the output encoding (base64-encoded document). This clearly differentiates it from the unfiltered limesurvey_export_responses, though it does not explicitly name the sibling it differs from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one actionable constraint ('do not provide a session key'), which is useful invocation guidance, but it never states when to choose this over limesurvey_export_responses or the sibling limesurvey_export_responses_by_token_to_file. Usage is implied by the 'by token' scoping rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_responses_by_token_to_fileExport token responses to a fileB
Export responses for selected tokens and securely decode the result inside LIMESURVEY_EXPORT_DIR.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| tokens | Yes | ||
| file_name | No | Optional output file name without a directory. | |
| overwrite | No | Allow replacing an existing file. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| heading_type | No | code | |
| document_type | Yes | ||
| language_code | No | Optional LimeSurvey language code. | |
| response_type | No | short | |
| completion_status | No | all | |
| confirm_overwrite | No | Required acknowledgement when overwrite is true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (write operation) and destructiveHint=false. The description adds 'securely decode the result inside LIMESURVEY_EXPORT_DIR' but doesn't explain error handling, overwrite behavior, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 18-word sentence is efficient but lacks important details; it is more under-specified than concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description fails to explain the file format, the meaning of 'securely decode', or the effect of many optional parameters (e.g., completion_status, response_type). Incomplete for a tool with 11 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 45%, but the description adds no extra meaning beyond parameter names and schema descriptions. It does not clarify how fields, heading_type, response_type, etc., affect output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'export' and resource 'responses for selected tokens', clearly distinguishing from siblings like limesurvey_export_responses (no file output) and limesurvey_export_responses_to_file (all responses).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives (e.g., limesurvey_export_responses_by_token for in-memory results), nor prerequisites or when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_responses_to_fileExport responses to a fileC
Export responses and securely decode the base64 result inside LIMESURVEY_EXPORT_DIR.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| file_name | No | Optional output file name without a directory. | |
| overwrite | No | Allow replacing an existing file. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| heading_type | No | code | |
| document_type | Yes | ||
| language_code | No | Optional LimeSurvey language code. | |
| response_type | No | short | |
| to_response_id | No | ||
| from_response_id | No | ||
| completion_status | No | all | |
| confirm_overwrite | No | Required acknowledgement when overwrite is true. | |
| additional_options | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-read-only, non-idempotent, non-destructive behavior. The description adds minimal detail: it writes to LIMESURVEY_EXPORT_DIR and decodes base64, but does not disclose file creation, overwrite handling, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, but it is poorly structured and vague. It includes an oddly specific detail about decoding base64 without explaining why, and fails to convey the core functionality clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (13 parameters, 2 required), the description is severely incomplete. It does not explain return values, output format, or the purpose of key parameters, leaving the agent ill-equipped to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (38%), and the description adds no parameter explanations. Many important parameters like document_type, response_type, and completion_status are left unexplained, forcing reliance on the sparse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool exports responses, but does not distinguish it from sibling export tools like export_responses or export_responses_by_token_to_file. The mention of decoding base64 inside a specific directory adds specificity but is secondary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. Sibling tools have similar names and purposes, but the description lacks any comparative context or usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_statisticsExport survey statisticsARead-onlyIdempotent
Export survey statistics as a base64-encoded PDF, XLS, or HTML document.
Calls LimeSurvey RemoteControl method export_statistics. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | LimeSurvey language code; null uses the survey default. | |
| group_ids | No | Optional group ID or list of group IDs. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| document_type | No | Statistics document type. | |
| include_graphs | No | Whether to include graphs. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is real: it discloses that the payload comes back base64-encoded rather than as a file, and that auth flows through the configured service account with no session key required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load the purpose and then give the behavioral/auth note. No filler, though it stops just short of the routing detail that would make it maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description still conveys the result encoding (base64 PDF/XLS/HTML). Auth behavior is covered. Only the sibling-routing context is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the description does not elaborate on any parameter beyond the document types already enumerated in the schema. Per the baseline rule, a 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export survey statistics') plus the output encodings ('base64-encoded PDF, XLS, or HTML document'). The 'base64-encoded' qualifier implicitly separates it from the sibling 'export_statistics_to_file', but that sibling is never named outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the tool name; there is no explicit when-to-use statement or exclusion. It does supply one prerequisite ('do not provide a session key'), which nudges it above a bare 2, but the obvious alternative (limesurvey_export_statistics_to_file) is left unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_statistics_to_fileExport statistics to a fileB
Export survey statistics and securely decode the result inside LIMESURVEY_EXPORT_DIR.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Optional LimeSurvey language code. | |
| file_name | No | Optional output file name without a directory. | |
| group_ids | No | ||
| overwrite | No | Allow replacing an existing file. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| document_type | No | ||
| include_graphs | No | 0 | |
| confirm_overwrite | No | Required acknowledgement when overwrite is true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a write operation with no idempotency and no destruction. The description adds one behavioral detail: 'securely decode the result inside LIMESURVEY_EXPORT_DIR.' However, it does not disclose potential side effects like file overwriting (though the parameters overwrite and confirm_overwrite suggest this). The description adds some context beyond annotations but is still limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the core action. No redundant words. While it is efficient, it sacrifices necessary detail for brevity, which slightly lowers the score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 8 parameters, a write operation, an output schema, and annotations, the description is too minimal. It does not explain the output, the meaning of 'securely decode', or how parameters like overwrite interact. The description is not sufficient for an agent to use this tool reliably without additional schema parsing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 63%, meaning several parameters (e.g., group_ids) lack descriptions. The tool description does not mention any parameter meaning or usage, thus adding no value beyond the schema. With moderate coverage, the description should compensate but fails to do so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Export survey statistics and securely decode the result inside LIMESURVEY_EXPORT_DIR.' It uses a specific verb (Export) and resource (statistics to file), and the mention of a secured directory distinguishes it from sibling tools like limesurvey_export_statistics which likely returns data directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, limitations, or contrast with similar tools (e.g., export_statistics for direct output). The agent is left to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_survey_to_fileExport survey structure to a file (experimental)A
Attempt to export a survey's structure as .lss and write it inside LIMESURVEY_EXPORT_DIR, returning a path instead of base64. Core LimeSurvey 6 RemoteControl has neither export_survey nor export_survey_structure (verified against the LimeSurvey 6.17.11 source). The tool asks export_survey_structure(sessionKey, surveyId) first and export_survey(sessionKey, surveyId) second, so it only works if a plugin on the LimeSurvey side serves one of them; it requires LIMESURVEY_ENABLE_EXPERIMENTAL_METHODS=true and otherwise fails with EXPORT_UNSUPPORTED. Facts (checked 2026-10-11): no known 6.x plugin offers a structure export over RemoteControl (no verified plugin known); the RemoteControl handler class itself cannot be extended by a plugin, but a plugin can answer additional methods on the core URL (see LimeSurvey 6.17.11 source). Upstream, LimeSurvey pull request #5384 adds export_survey_structure for the 7.x line (open, not in any release); an own small plugin with that method works with this tool. Without an export, limesurvey_verify_survey_against_lss compares a .lss file with the live survey using read-only calls only.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | No | Optional output file name without a directory. | |
| overwrite | No | Allow replacing an existing file. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| document_type | No | Structure export format. | lss |
| confirm_overwrite | No | Required acknowledgement when overwrite is true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true), and the description adds real context beyond them: it writes a file to disk rather than returning base64, the internal method fallback order, the exact error code on failure, and the plugin/upstream availability situation. It does not describe overwrite collision behavior beyond the schema's own flags, so a 4 is fair.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is correctly front-loaded, but the body is dense with internal sourcing detail (LimeSurvey 6.17.11, handler-class extensibility, PR #5384, a checked-on date) that goes beyond what an agent needs to select and call the tool. Much of it is informative for a human maintainer but inflates the definition for selection purposes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and return values need not be explained, the description covers everything an agent needs: prerequisites, fallback mechanics, failure code, and the related verification tool. For an explicitly experimental capability, the incompleteness is disclosed rather than hidden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so file_name, overwrite, confirm_overwrite, document_type, and survey_id are already fully documented in the schema. The description adds only the implicit .lss format and the export-directory location; the baseline 3 applies when structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (export), resource (a survey's structure), format (.lss), destination (LIMESURVEY_EXPORT_DIR), and output shape (a path rather than base64). It is clearly distinguishable from the response-export siblings and from limesurvey_verify_survey_against_lss.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the preconditions (LIMESURVEY_ENABLE_EXPERIMENTAL_METHODS=true, a plugin serving export_survey_structure/export_survey), the failure mode when unmet (EXPORT_UNSUPPORTED), and the alternative path (verify_survey_against_lss for read-only comparison). When-to-use, when-it-will-fail, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_export_timelineExport response timelineARead-onlyIdempotent
Return response counts by day or hour for a date range.
Calls LimeSurvey RemoteControl method export_timeline. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | End date/time accepted by LimeSurvey. | |
| start | Yes | Start date/time accepted by LimeSurvey. | |
| period | Yes | Timeline aggregation period. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered externally. The description adds genuinely non-redundant behavior: it names the underlying RemoteControl method and specifies that the configured service account handles auth so no session key should be passed — useful given sibling get_session_key/release_session_key exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, purpose front-loaded first, then implementation/auth detail. Every sentence conveys distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description correctly avoids it. It covers purpose, method provenance, and auth expectations for a 5-param read tool. It could add a note on what date formats are accepted (schema defers to 'accepted by LimeSurvey' vaguely), leaving a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and 2 of 5 parameters are enums with documented values, so the schema carries the parameter semantics. The description restates only the period (day/hour) already encoded in the enum and adds no format or syntax detail beyond it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return response counts by day or hour for a date range.' An agent can distinguish this from sibling export tools like export_statistics and get_summary by the day/hour aggregation framing. It does not name those siblings explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'date range plus day/hour period' framing, but the description names no alternatives and gives no explicit when-to-use or when-not-to-use condition. The one actionable directive is negative-auth ('do not provide a session key'), which is guidance but not tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_find_surveysFind surveysARead-onlyIdempotent
Find visible surveys by ID or title with bounded client-side pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | Case-insensitive survey ID or title fragment. | |
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true; the description adds 'bounded client-side pagination', which is useful but minimal. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the core purpose efficiently. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with output schema, the description covers basic functionality but does not clarify what the output contains (e.g., list of survey objects) or the behavior of client-side pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only query has a description). The description mentions 'by ID or title' but does not explain limit/offset semantics beyond the schema. With low schema coverage, more compensation was needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds visible surveys by ID or title with pagination, distinguishing it from the sibling 'list_surveys' which lists all surveys without search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for search (by ID or title) but does not explicitly state when to use this over alternatives like 'list_surveys' or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_generate_survey_themeGenerate a responsive LimeSurvey survey themeA
Create a validated GPL-2.0-or-later ZIP theme that inherits the official Bootstrap 5 vanilla theme for LimeSurvey 7 or 6. LimeSurvey installs the theme under the ZIP file name without .zip and dots: the result's installed_theme_name (for example acme_feedback-100-ls7), at most 45 characters. Upload the ZIP unrenamed and assign that name.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Human-readable title shown in LimeSurvey. | |
| author | No | LimeSurvey MCP user | |
| density | No | comfortable | |
| overwrite | No | ||
| author_url | No | ||
| font_style | No | system | |
| text_color | No | #1F2933 | |
| theme_name | Yes | Base name of the theme package, for example acme_feedback. LimeSurvey installs the package as installed_theme_name: <theme_name>-<theme_version without dots>-ls<major>, at most 45 characters. | |
| description | No | Responsive survey theme generated with LimeSurvey MCP. | |
| focus_color | No | #005FCC | |
| logo_base64 | No | Optional base64 PNG or JPEG logo without a data URL prefix. | |
| accent_color | No | #C84B31 | |
| author_email | No | ||
| primary_color | No | #0B6B57 | |
| surface_color | No | #FFFFFF | |
| theme_version | No | 1.0.0 | |
| logo_file_type | No | ||
| background_color | No | #F5F7F6 | |
| corner_radius_px | No | ||
| muted_text_color | No | #52606D | |
| confirm_overwrite | No | ||
| content_max_width_px | No | ||
| target_limesurvey_major | No | 7 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-read-only, non-destructive, non-idempotent, closed-world), so the bar is lower. The description still adds real behavioral context: the ZIP is validated, it inherits the official Bootstrap 5 vanilla theme, and critically that the installed name is derived from the ZIP filename (dots stripped, 45-char cap), which an agent must know before uploading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the deliverable and its version scope, followed by the naming rule and the upload instruction. No filler, though the installed-name formula appears twice (description and theme_name schema) without adding new information the second time.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description covers the artifact, naming derivation, and upload step. However, for a 23-parameter mutation tool with 13% schema coverage, it omits the overwrite/confirm_overwrite safety pairing and version-targeting semantics, leaving notable gaps for the caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 13% across 23 parameters, so the description must compensate. It clarifies the two trickiest inputs, spelling out how theme_name plus theme_version map to installed_theme_name and citing the 45-character ceiling, but leaves overwrite/confirm_overwrite, target_limesurvey_major, and the styling parameters unexplained beyond their self-documenting defaults and patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and artifact ('Create a validated GPL-2.0-or-later ZIP theme') plus its inheritance basis (Bootstrap 5 vanilla theme) and target versions (LimeSurvey 7 or 6). This clearly separates it from siblings like limesurvey_validate_survey_theme and limesurvey_assign_survey_theme, which operate on themes rather than generating them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies a downstream workflow ('Upload the ZIP unrenamed and assign that name'), which points an agent toward the upload and theme-assignment tools, but it never states when to choose this tool over validate_survey_theme or how it relates to the publication guide. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_available_site_settingsList available site settingsARead-onlyIdempotent
List global setting names available to a super administrator.
Calls LimeSurvey RemoteControl method get_available_site_settings. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds useful auth context: it uses the configured service account and explicitly says not to provide a session key, which is valuable behavioral information beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, followed by method name and auth constraint. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple read-only tool with full schema coverage, rich annotations, and an output schema, the description covers purpose, method, and auth adequately. The main gap is not clarifying how this differs from the sibling 'limesurvey_get_site_settings', which could cause confusion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter (response_format) is fully documented with an enum and default. The description adds no additional parameter meaning, so the baseline of 3 applies per the rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('global setting names available to a super administrator'), and clarifies that it returns names, not values. However, it does not explicitly differentiate from the sibling 'limesurvey_get_site_settings', which likely returns actual settings, so an agent must infer the distinction from the word 'available'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes the tool is for super administrators and lists available setting names, which implies usage for discovery before setting values. But it provides no explicit when-to-use, when-not-to-use, or alternative tool guidance (e.g., versus get_site_settings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_fieldmapGet survey field mapARead-onlyIdempotent
Return the survey response field map.
Calls LimeSurvey RemoteControl method get_fieldmap. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuine value beyond that by disclosing the RemoteControl method name and the service-account auth model with no session key required, which an agent needs to call it correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loading the purpose before the method and auth notes. Every sentence earns its place, though there is minor redundancy between 'Return the ... field map' and the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations cover safety. The description covers purpose, method, and auth, making it essentially complete, with only the lack of sibling routing as a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters (survey_id, language, response_format) are fully documented in the schema. The description adds no parameter-level meaning beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the survey response field map'), which is clear and distinct from property getters like get_survey_properties. However, it does not explicitly differentiate itself from sibling read tools, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an authentication guideline ('do not provide a session key') which is useful context. But it gives no guidance on when to use this over alternatives like get_survey_properties or get_response_ids, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_group_propertiesGet group propertiesARead-onlyIdempotent
Read selected question-group properties. LimeSurvey identifies the group by group_id alone, so a wrong ID reads another survey's group. Pass the optional survey_id to cross-check: the result's sid must match, otherwise the call fails with GROUP_SURVEY_MISMATCH (survey_id is never sent to LimeSurvey).
Calls LimeSurvey RemoteControl method get_group_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Numeric question-group ID. | |
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | No | Optional survey ID the group is expected to belong to. MCP-only: it is never sent to LimeSurvey; the server compares it with the sid of the result (reading sid with one extra request when the result has none) and fails with a *_SURVEY_MISMATCH error when they differ. | |
| properties | No | Properties to return for the question group; null returns all available properties. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses the failure mode (GROUP_SURVEY_MISMATCH), that survey_id is never transmitted to LimeSurvey, that verifying sid may trigger one extra request, and that auth uses a configured service account with no session key. That is substantial behavior an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the ID/survey_id caveat, then auth. Dense but well organized; the nested parenthetical about reading sid adds length that could be trimmed, though each clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation. The description covers the read semantics, the ID ambiguity, the survey_id safeguard, the error contract, and authentication — everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: the cross-check purpose of survey_id, its MCP-only nature, the resulting error name, and the extra-request cost. group_id's ambiguity risk is also stated in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('question-group properties'), clearly distinct from get_question_properties, set_group_properties, and list_groups in the sibling set. An agent can identify the right tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear contextual guidance: it explains that LimeSurvey resolves the group by group_id alone and that passing survey_id cross-checks ownership. It does not explicitly name alternative tools (e.g. get_question_properties) or when not to use this tool, but the selection context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_instance_infoGet MCP server and LimeSurvey capability infoARead-onlyIdempotent
Report server-side configuration without any RemoteControl call by default: server_version, instance_host, password_source (file or env, never the path or the content), transport, read_only (true only for write scope none), write_scope and write_scope_source, experimental_methods_enabled, configured export/import/theme directories (each with a local exists/writable check), and a capabilities summary. capabilities are booleans computed after the write scope and the configuration; capability_blocked_by has the same keys and holds null (available) or the reason a capability is unavailable. Set probe_instance=true to additionally call list_surveys (connectivity/auth proof, count only) and get_site_settings("versionnumber") — the latter requires a superadmin service account and degrades to permission_level="standard" with instance_version=null otherwise. The probe also fills server_time (ISO-8601 UTC) and server_time_source ("http_date_header"): RemoteControl has no clock method, so the time comes from the HTTP Date header of the answer; without the probe both are null and server_time_hint says so. server_time_note explains that this is the web server's UTC clock, not the LimeSurvey time zone. Call this before relying on file export/import or theming tools.
| Name | Required | Description | Default |
|---|---|---|---|
| probe_instance | No | Also call list_surveys and get_site_settings to probe live connectivity, auth, and version/permission level. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial behavioral context beyond them: the default makes zero RemoteControl calls, the probe calls list_surveys and get_site_settings, get_site_settings requires a superadmin service account and degrades to permission_level='standard', and server_time is derived from the HTTP Date header (null without the probe). It even clarifies password_source never exposes the path or content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The default (no-call) behavior is front-loaded before the probe option, which is the right ordering, and each clause conveys a distinct behavior rather than filler. It is dense and somewhat run-on, but the information density is high and little could be cut without losing behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param introspection tool with an output schema present, the description is thorough: it covers defaults, the opt-in probe, auth requirements, degradation behavior, time-source caveats, and the 'never the path or content' secrecy guarantee. An agent has everything needed to invoke it correctly and interpret the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage the baseline is 3, but the description meaningfully expands on probe_instance: it explains the two RemoteControl calls it triggers, the superadmin dependency, the degradation path, and that it populates server_time/server_time_source. That is real semantic value beyond the schema's one-line description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: report server-side configuration without a RemoteControl call by default, and it enumerates exactly which fields are returned (server_version, instance_host, password_source, transport, read_only, write_scope, etc.). It is clearly distinguishable from sibling getters like get_site_settings or get_language_properties because it describes an MCP-server/capability introspection surface rather than a LimeSurvey data read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit call condition: 'Call this before relying on file export/import or theming tools,' and explains that probe_instance=true is needed to prove connectivity/auth. It does not name alternative tools (e.g., get_site_settings, get_available_site_settings) or state when NOT to use it, so it falls short of a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_language_propertiesGet language propertiesARead-onlyIdempotent
Read localized survey properties. The attachments field is returned exactly as LimeSurvey stores it (a JSON string since DB version 647, a PHP serialize string on older instances; keep it unchanged for a round trip to set_language_properties). When it is part of the answer, attachments_parsed is added: { : [ { file_name, url, size, relevance } ] } with the mail types invitation, reminder, registration, confirmation, admin_notification and admin_detailed_notification; an empty value gives {} and an unparsable one gives null plus a warning. LimeSurvey drops requested property names that are not a column of the survey language settings without saying so: such names are listed in the warning unknown_fields (if every name is unknown the call fails with the no-data hint). An unknown or missing language silently falls back to the base language. RemoteControl has no method that lists the uploaded survey files themselves; attachments only references them by server path.
Calls LimeSurvey RemoteControl method get_language_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| properties | No | Properties to return for the survey language; null returns all available properties. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering read-only/idempotent/open-world, the description still adds substantial behavior: the attachments JSON-string vs PHP-serialize version split, the attachments_parsed shape and mail types, empty vs unparsable handling (with warning), the unknown_fields warning and no-data failure hint, and the silent language fallback. This is exactly the extra context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense but front-loaded with the core purpose, then proceeds to caveats. Every sentence carries non-redundant information, though a few clauses (e.g., the file-listing aside) are run-on and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with an output schema, the description need not restate return values, yet it still covers the tricky parts an agent would otherwise miss: version-dependent serialization, parsed-attachment structure, warning semantics, and language fallback. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: what a null/unknown language resolves to (base language) and what happens to requested property names that are not real columns (silently dropped, surfaced in unknown_fields).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Read localized survey properties,' which cleanly separates it from limesurvey_get_survey_properties and the write-side limesurvey_set_language_properties. It does not explicitly name the sibling it differs from, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear contextual guidance: attachments must be kept unchanged for a round trip to set_language_properties, unknown/missing language falls back to the base language, and it notes RemoteControl offers no file-listing method. It stops short of explicit when-to-use-vs-alternative routing, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_participant_propertiesGet participant propertiesARead-onlyIdempotent
Read selected properties for a participant matched by token or token-table ID.
Calls LimeSurvey RemoteControl method get_participant_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Participant lookup properties, such as token or tid. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| properties | No | Properties to return for the participant; null returns all available properties. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds real behavioral context beyond that: authentication uses the configured service account and the caller must not pass a session key, which is operationally useful and not derivable from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the purpose front-loaded and no filler. The second sentence's reference to the underlying RemoteControl method is mildly boilerplate, but the auth constraint it carries earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies purpose, lookup key, and auth behavior, leaving little an agent needs but doesn't have; only alternative-tool routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents query, survey_id, properties, and response_format. The description adds only the token/tid hint for the query lookup and 'selected properties' framing, which is marginal over the schema's own documentation. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (properties for a participant) plus the matching key (token or token-table ID), which clearly separates it from list_participants and set_participant_properties. It stops short of naming those siblings explicitly, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'matched by token or token-table ID' implies the usage context (you already know the participant's token/tid), but there is no explicit when-to-use vs alternatives guidance, nor exclusions against list_participants or list_filtered_participants. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_participant_table_statusGet participant table statusARead-onlyIdempotent
Report whether a survey has a participant table, how many participants it holds, and whether the survey is closed-access. Read-only: get_summary(token_count) decides existence (a number means the table exists, the answer "No available data" means it does not), get_survey_properties adds access_mode, active, and allowregister on a best-effort basis. Closed access follows access_mode ("C") on LimeSurvey versions that have it; otherwise the existence of the participant table decides (closed_access_basis names which). The survey property usetokens is NOT evaluated by LimeSurvey 6.17.11 and is not used here. Without access_mode, a survey without a participant table has open access. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the existence signal ('No available data' string vs a number), best-effort access_mode retrieval, access_mode 'C' semantics, the closed_access_basis field, that usetokens is not evaluated on LimeSurvey 6.17.11, and that behavior is version-dependent. This far exceeds what readOnlyHint/idempotentHint already convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first clause, followed by mechanism and edge-case detail. It is dense and version-specific, bordering on verbose, but nearly every sentence carries behavioral information relevant to correct interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated. The description nonetheless covers existence semantics, access-mode determination, fallback behavior, and version caveats, leaving no correctness-critical gap for an agent invoking this read-only status tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single survey_id parameter, so the schema already documents the parameter fully. The description adds no additional syntax or format detail about survey_id, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reports whether a survey has a participant table, participant count, and closed-access status. This scope is distinct from siblings like get_summary or get_survey_properties, and the description explicitly names those tools as internal mechanisms, letting an agent tell this tool apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the internal mechanism (get_summary decides existence, get_survey_properties adds access_mode) but never states when an agent should call this tool versus alternatives such as limesurvey_list_participants or limesurvey_get_survey_properties. Usage is implied by the purpose rather than explicitly routed, so it is minimum viable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_question_propertiesGet question propertiesARead-onlyIdempotent
Read selected question properties. LimeSurvey identifies the question by question_id alone, so a wrong ID reads another survey's question. Pass the optional survey_id to cross-check: the result's sid must match, otherwise the call fails with QUESTION_SURVEY_MISMATCH (survey_id is never sent to LimeSurvey).
Calls LimeSurvey RemoteControl method get_question_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | No | Optional survey ID the question is expected to belong to. MCP-only: it is never sent to LimeSurvey; the server compares it with the sid of the result (reading sid with one extra request when the result has none) and fails with a *_SURVEY_MISMATCH error when they differ. | |
| properties | No | Properties to return for the question; null returns all available properties. | |
| question_id | Yes | Numeric question ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, yet the description adds real behavior: the QUESTION_SURVEY_MISMATCH failure, the extra sid read when the result lacks one, that survey_id is never forwarded to LimeSurvey, and that auth uses the service account with no session key. That is meaningful disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the core action and the most important gotcha first. The auth sentence is slightly tangential but earns its place by preventing a wrong invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary; the description instead covers the non-obvious elements an agent needs (ID ambiguity, cross-check semantics, error code, auth model). Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics for survey_id (MCP-only cross-check, not sent upstream) and flags the question_id ambiguity that the schema merely calls 'Numeric question ID'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (selected question properties), and the scope word 'selected' signals it returns a subset rather than the whole survey. It is clearly distinguishable from siblings like set_question_properties and list_questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational context: warns that question_id alone is ambiguous and prescribes passing survey_id to cross-check, with the exact failure mode. It does not, however, name alternative tools (e.g. list_questions) or state when not to use this one, so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_quota_propertiesGet quota propertiesARead-onlyIdempotent
Read selected quota properties.
Calls LimeSurvey RemoteControl method get_quota_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | LimeSurvey language code; null uses the survey default. | |
| quota_id | Yes | Numeric quota ID. | |
| properties | No | Properties to return for the quota; null returns all available properties. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds real behavioral context beyond that: it is a passthrough to the RemoteControl method and, notably, that auth uses the configured service account and no session key should be supplied — a concrete invocation requirement an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose first, then the method/auth note — no filler and properly front-loaded. Slightly terse rather than maximally information-dense, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the schema fully documents inputs. The description supplies purpose and the key auth constraint, leaving it complete enough for correct invocation; only cross-sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with quota_id, language, properties and response_format all documented in the schema, so the schema carries the semantics. The description adds nothing about parameters, which is the correct baseline of 3 when the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read selected quota properties") and names the underlying RemoteControl method, which is enough to distinguish it from mutation siblings like set_quota_properties, add_quota, and delete_quota. It does not explicitly contrast itself with read siblings such as list_quotas or get_survey_properties, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when to prefer list_quotas over this, and no stated prerequisites. Usage is only inferable from the verb 'Read', which is the minimum for implied understanding rather than clear routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_response_idsFind response IDsARead-onlyIdempotent
Find response IDs for a participant token.
Calls LimeSurvey RemoteControl method get_response_ids. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Participant token. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely useful non-annotation context: it names the underlying RemoteControl method and states that authentication uses a configured service account with no session key supplied, which prevents a common misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, with the action and scope front-loaded and the auth caveat following the method reference. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers purpose, transport method, and auth. The remaining gap is the absence of guidance on when to prefer this over the token-based export siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so token, survey_id and response_format are all documented in the schema and the baseline is 3. The description only echoes 'participant token' and adds no format, validation, or default semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find response IDs') and narrows the scope to a single participant token, which is enough to separate it from bulk siblings like export_responses or list_participants. It does not explicitly name a sibling or draw a contrast, so it falls just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the purpose statement: an agent can infer this is for resolving which response(s) belong to a token. There is no explicit when-to-use, no when-not-to-use, and no pointer to the closest alternative (export_responses_by_token), which is the main ambiguity an agent would face.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_session_keyConnect to LimeSurveyA
Open and cache an authenticated RemoteControl session without exposing its key.
Calls LimeSurvey RemoteControl method get_session_key. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present (readOnlyHint=false, idempotentHint=false, openWorldHint=true), the bar is lower, and the description earns credit by explaining why: it opens and caches a session, a state-creating side effect that justifies the non-read-only, non-idempotent profile. It also clarifies that the session key is never exposed to the caller, which is useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core behavior front-loaded and no wasted prose. The sentence restating the RPC method name is marginally redundant with the tool name but aids mapping to LimeSurvey's API.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies the caching/auth context. The only real gap is sequencing guidance relative to the other authenticated tools, which is minor for a connect operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single `response_format` parameter, so the schema already documents it fully. The description adds no syntax or format detail for that parameter; its only parameter-adjacent value is clarifying that no session-key argument is required, which is mildly useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Open and cache an authenticated RemoteControl session,' and maps it to the underlying `get_session_key` RPC method. It is clearly distinct from the many survey/participant tools in the sibling list, though it does not explicitly name `limesurvey_release_session_key` as the counterpart operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a concrete directive ('do not provide a session key') and states the authentication source (configured service account), which is real usage guidance. However, it never says when to invoke this relative to other tools or that it is a prerequisite for authenticated operations, leaving sequencing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_site_settingsGet site settingBRead-onlyIdempotent
Read one global LimeSurvey setting.
Calls LimeSurvey RemoteControl method get_site_settings. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| setting_name | Yes | Global setting name. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful non-annotation context: it names the underlying RemoteControl method and states that authentication uses the configured service account with no session key, which prevents an agent from passing one. It does not describe error behavior for unknown settings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the operation, followed by backend method mapping and auth constraint. Every sentence carries information, though the RemoteControl method name is marginally more useful for debugging than for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the annotations cover safety. The main gap is discovery: an agent cannot tell how to learn valid setting_name values, and the sibling limesurvey_get_available_site_settings that would answer this is never referenced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema, including the response_format enum tradeoff, so the baseline is 3. The description adds nothing about setting_name semantics — notably it does not tell the agent where valid names come from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Read one global LimeSurvey setting' — with the word 'one' implicitly distinguishing it from the sibling limesurvey_get_available_site_settings. It is clear what the tool does, though it never names the sibling that enumerates valid settings, so differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given: nothing explains the relationship to limesurvey_get_available_site_settings (which presumably supplies valid setting names) or when this tool should be preferred over reading settings another way. The only instruction concerns credentials, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_summaryGet survey summaryARead-onlyIdempotent
Read response and participant summary counters. The answer "No available data" is not a call error: for token_* statistics it means the survey has no participant table (no participant statistics; error hint_code NO_PARTICIPANT_TABLE; access is decided by access_mode, check limesurvey_get_participant_table_status), for response statistics it means the survey has no response table: never activated or deactivated (hint_code NO_RESPONSE_TABLE). With statistic=all only the available parts are returned.
Calls LimeSurvey RemoteControl method get_summary. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| statistic | No | Summary statistic to return. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/non-destructive, and the description goes well beyond them: it explains that 'No available data' is a normal result rather than a call error, gives the hint codes NO_PARTICIPANT_TABLE and NO_RESPONSE_TABLE with their causes, and notes that statistic=all returns only the available parts. It also states that the configured service account is used and no session key should be supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the dense error-semantics passage that follows is directly load-bearing for interpreting results. It is somewhat wordy, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described. For a 3-parameter read tool with full schema coverage, the description covers the main pitfall (the 'No available data' response), the auth model, and the access_mode dependency — nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both enums are documented, so the baseline is 3. The description adds meaning on top of the enum list by explaining the semantic split between the token_* statistics and the response statistics, which helps the agent choose a value rather than just see the options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read response and participant summary counters') and names the underlying RemoteControl method `get_summary`, which is enough to distinguish it from export_statistics or export_timeline. It does not explicitly contrast itself with those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real context for when results are meaningful: it distinguishes token_* statistics (needs a participant table) from response statistics (needs a response table), and points the agent to limesurvey_get_participant_table_status and access_mode when participant stats are in question. It does not state when to prefer this over export_statistics, so no exclusions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_survey_languagesGet survey languagesARead-onlyIdempotent
Return the base and additional language codes configured for a survey.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds context by specifying that both base and additional language codes are returned, which provides behavioral clarity beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of 12 words, front-loaded with verb and resource, no redundancy. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and an output schema, the description fully defines the purpose. No additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with adequate description for survey_id. The tool description does not add any additional parameter meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verb 'return' and resource 'base and additional language codes configured for a survey', clearly distinguishing it from sibling tools like add_language or delete_language.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when or when not to use this tool. However, the purpose is clear and siblings are distinct, so usage is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_survey_propertiesGet survey propertiesARead-onlyIdempotent
Read selected survey properties (any column of the surveys table; unknown names are dropped silently). usetokens is only a stored column in LimeSurvey 6.17.11: the core never evaluates it, so it neither tells whether a participant table exists nor whether the survey is closed. Closed access follows access_mode ("C" closed, "O" open) and the participant table; use limesurvey_get_participant_table_status for a ready-made answer. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method get_survey_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| properties | No | Properties to return for the survey; null returns all available properties. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read profile (readOnly, idempotent, non-destructive), and the description adds substantial context beyond them: unknown property names are silently dropped, `usetokens` is a stored-only column the core never evaluates, closed access actually follows `access_mode` ('C'/'O') plus the participant table, and auth uses the configured service account with no session key. The version-verification note ('Verified against LimeSurvey 6.17.11 source; older releases may differ') is also honest about applicability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The read purpose is front-loaded in the first clause, and the caveat/alternative routing follows. The `usetokens`/`access_mode` passage is dense and longer than a general reader strictly needs, but each sentence carries actionable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the return shape need not be described, and annotations cover the safety profile. The description nonetheless supplies auth behavior, silent-drop semantics, version caveats, and a pointer to the right alternative, leaving nothing an agent needs in order to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: the `properties` values are columns of the surveys table and unrecognized names are discarded silently rather than erroring. That changes how an agent should construct the argument, exceeding the schema's generic 'Properties to return for the survey'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Read selected survey properties') and pins down the scope ('any column of the surveys table'), which cleanly separates it from the sibling setter limesurvey_set_survey_properties and the property readers for other entities (questions, groups, quotas). It also flags the exact RemoteControl method it wraps, so an agent knows precisely what is being called.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent away from a tempting misuse (reading `usetokens` to infer participant-table existence or closure) and names the correct alternative, limesurvey_get_participant_table_status, with the condition that selects it. It does not, however, give broader when-to-use guidance versus siblings such as limesurvey_get_survey_spec or limesurvey_list_surveys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_survey_specRead a survey, group or question as a descriptionARead-onlyIdempotent
Read a survey, one group or one question as a survey description (spec), with read methods only. With survey_id alone the whole survey is read (level survey); with group_id one group (level group); with question_id one question (level question); group_id and question_id exclude each other. Returns { level, survey_id, group_id (level group), question_id (level question), languages, active, spec, ids, position, fingerprint, unreadable [{ code, detail }], missing_translations [{ path, language }] }. spec has the format of limesurvey_create_survey_from_spec: level survey { survey, groups }, level group one group, level question one question; every text is a map per language, line breaks are \n and HTML entities are decoded except the markup characters; attribute values equal to the default of the question theme are left out; subquestions and answers come ordered by scale, and scale_id appears only for scale 1 (the columns of : and ;, the second answer scale of 1). spec holds no IDs: ids lists them by path (level survey: groups [{ path, group_id }] and questions [{ path, code, question_id }]; level group: group_id and questions; level question: question_id and group_id) and position gives the 1-based place of a group in the survey or of a question in its group. fingerprint is the SHA-256 of the spec. unreadable lists what RemoteControl cannot read and the spec therefore lacks (conditions of the old condition table, quota members, URL parameter assignments, stored attributes that the type, theme or a plugin does not define, archived response columns, at level survey the survey settings outside the spec, the default of the "Other" option of M and P questions, texts of a question that has no text row in a language); an entry that belongs to an element also has path and language. missing_translations lists the texts that have no row in a survey language, which the map then lacks. The spec can be checked with limesurvey_validate_spec and, at level survey, creates a copy with limesurvey_create_survey_from_spec. The tool never shortens the answer: if it would exceed LIMESURVEY_MAX_RESPONSE_CHARS it answers SPEC_TOO_LARGE with an outline (level survey: group_id, title, questions and estimated_chars per group) so that groups can be read one by one. An ID of another survey answers GROUP_SURVEY_MISMATCH or QUESTION_SURVEY_MISMATCH. The tool changes nothing and needs no write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Optional ID of a group of this survey: read this group only. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| question_id | No | Optional ID of a main question of this survey: read this question only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses the exact response shape, the SHA-256 fingerprint, the SPEC_TOO_LARGE fallback with group outline instead of silent truncation, the mismatch error codes for foreign IDs, and an exhaustive list of what 'unreadable' excludes from the spec. It also affirms the tool changes nothing and needs no write scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, but then delivers everything as one very dense run-on paragraph mixing response shape, spec formatting rules, unreadable causes, and error codes. Much of it earns its place for a complex tool, yet the lack of scannable structure and the deep spec-internals detail make it heavier than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity read tool it covers the modes, the return contract, the size ceiling and its fallback, and the error conditions, so an agent can call it correctly without trial and error. The detailed return enumeration is redundant against the output schema but harmless and adds clarity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond it: the mutual exclusivity of group_id and question_id, and the level (survey/group/question) each parameter combination selects. It does not add format or validation detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Read a survey, one group or one question as a survey description (spec)') and immediately maps each ID combination to a distinct level, so the agent knows exactly which mode it is invoking. It distinguishes itself from read siblings such as get_survey_properties or list_questions by framing output as a spec with a fingerprint rather than raw properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to pass survey_id alone vs group_id vs question_id, notes group_id and question_id are mutually exclusive, and points to limesurvey_validate_spec and limesurvey_create_survey_from_spec as follow-ups. It does not, however, say when to prefer this over limesurvey_get_survey_properties / get_group_properties / get_question_properties, which cover overlapping read territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_theme_publication_guideGet LimeSurvey theme publication instructionsARead-onlyIdempotent
Return version-aware installation, preview, assignment, accessibility, rollback, and optional community-publication steps for a survey theme, including installed_theme_name, the name LimeSurvey gives the package on import.
| Name | Required | Description | Default |
|---|---|---|---|
| hosting | Yes | ||
| theme_name | Yes | Base name of the theme package, for example acme_feedback. LimeSurvey installs the package as installed_theme_name: <theme_name>-<theme_version without dots>-ls<major>, at most 45 characters. | |
| package_file_name | Yes | Generated ZIP file name. | |
| publication_scope | No | instance | |
| installed_limesurvey_version | Yes | Version shown in the LimeSurvey administration footer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and closed-world behavior, lowering the bar. The description adds genuinely useful context beyond that: the output is version-aware (depends on installed version) and community publication is only included as an optional branch. It also discloses the key derived value (installed_theme_name) the caller will receive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the verb and the enumerated content covered. The trailing installed_theme_name clause is somewhat tacked on, but no sentence is wasted. Slightly heavy enumeration keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, and annotations cover the safety profile. For a 5-parameter tool the description adequately conveys scope and version-dependence, with the only gap being the lack of routing guidance against sibling theme tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%, so the schema does most of the heavy lifting. The description adds meaning for a few params: 'version-aware' maps to installed_limesurvey_version, 'optional community-publication' maps to publication_scope, and the installed_theme_name clause relates to theme_name. It explains nothing about hosting or package_file_name, so it remains a baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and a well-defined resource: version-aware installation, preview, assignment, accessibility, rollback, and publication steps for a survey theme. This distinguishes it from siblings like generate_survey_theme, validate_survey_theme, and assign_survey_theme, which perform actions rather than return guidance. It does not name any sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to call this tool versus the sibling theme tools (generate/validate/assign/list_installed_themes) or any prerequisites. A 'publication guide' implies a prep/documentation use case, but the agent must infer it. No when-not-to-use or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_get_uploaded_filesGet uploaded response filesARead-onlyIdempotent
Return uploaded file metadata and base64 content for a token or response.
Calls LimeSurvey RemoteControl method get_uploaded_files. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Participant token. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_id | No | Optional response ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnly, idempotent, non-destructive), but the description adds genuinely new behavioral context: authentication runs through the configured service account and no session key should be supplied. It also reveals that the payload contains base64 file content, hinting at potentially large responses, though it never states size or count limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome and kept to three short sentences with minimal waste. The middle sentence restating the underlying RemoteControl method name largely duplicates the tool name, which is the one mildly redundant element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the auth model is covered explicitly. For a read-only lookup tool of this complexity the description is nearly sufficient, with only edge behavior (empty results, payload size) left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters (token, survey_id, response_id, response_format) are already fully documented and the baseline is 3. The description only loosely maps to the token/response distinction and adds no format or value-semantics detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return uploaded file metadata and base64 content") with the scope "for a token or response," which distinguishes it from the write-side sibling limesurvey_upload_file and the export tools. It does not explicitly name a sibling it is not, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "for a token or response" implies the two lookup modes, giving an inferred sense of when each parameter applies. However, there is no explicit when-to-use guidance, no exclusions, and no pointer to alternatives such as limesurvey_export_responses_by_token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_import_groupImport question groupB
Import a question group into a survey. Use import_data_path for files at or above roughly 50 KB instead of inline import_data.
Calls LimeSurvey RemoteControl method import_group. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| import_data | No | Base64-encoded group file contents; omit when using import_data_path. | |
| new_group_name | No | Optional replacement group name. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| import_data_path | No | Local file path to a question group file. The server reads and base64-encodes it, so use this instead of inline import_data for files at or above roughly 50 KB. The file must live inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR as a fallback). Exactly one of import_data or import_data_path must be set. | |
| import_data_type | Yes | Import type supported by the LimeSurvey instance, normally lsg. | |
| new_group_description | No | Optional replacement group description. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=false, openWorld=true, so the safety profile is provided. The description adds genuine value beyond annotations: it names the underlying RemoteControl method and states the auth model (configured service account, no session key). It does not disclose the side effect of creating a new group inside the survey or the non-idempotency implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler. The file-size tip is actionable and the auth note prevents an obvious mistake (passing a session key).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 7-param schema at full coverage, an output schema present, and annotations covering the safety profile, the description does enough: it states purpose, the file-vs-inline routing, and the auth mode. The main missing element is differentiation from sibling group/import tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the import_data_path size/directory rule. The description's file-size guidance largely repeats the schema's own wording on import_data_path, adding little beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Import a question group into a survey'), but does not distinguish itself from the many siblings that could touch groups or question imports (e.g. add_group, add_group_from_spec, import_question). No note that import_group operates on an external file whereas add_group creates inline, so an agent could easily pick the wrong tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers one routing hint (use import_data_path for files ≥ ~50 KB), which is really a parameter mechanic rather than a when-to-use-this-tool rule. It does not contrast with add_group or import_question, nor say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_import_questionImport questionA
Import a question into a survey group. Use import_data_path for files at or above roughly 50 KB instead of inline import_data.
Calls LimeSurvey RemoteControl method import_question. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | Numeric question-group ID. | |
| mandatory | No | Whether the imported question is mandatory. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| import_data | No | Base64-encoded question file contents; omit when using import_data_path. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| import_data_path | No | Local file path to a question file. The server reads and base64-encodes it, so use this instead of inline import_data for files at or above roughly 50 KB. The file must live inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR as a fallback). Exactly one of import_data or import_data_path must be set. | |
| import_data_type | Yes | Import type supported by the LimeSurvey instance, normally lsq. | |
| new_question_help | No | Optional replacement help text. | |
| new_question_text | No | Optional replacement question text. | |
| new_question_title | No | Optional replacement question code/title. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds useful context beyond them: it runs via the configured service account with no session key required, and discloses the file-size threshold behavior for path-based import. Minor gaps remain on failure/overwrite semantics, but it is a solid addition to annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and then the key routing caveat and auth note. Each sentence carries information, though the auth line is somewhat tangential to invocation mechanics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description needn't explain return values, and it correctly focuses on the operational gotchas (path vs inline, service-account auth). It is adequately complete for a 10-param import tool, though it could say more about how an imported question interacts with existing questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters, including the import_data/import_data_path mutual-exclusion and the 50 KB threshold. The description largely restates the path-vs-inline guidance without adding syntax or format detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (import), resource (question), and target scope (into a survey group). This cleanly distinguishes it from siblings like import_group, import_survey, and replace_question without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one concrete routing rule (use import_data_path for files ≥~50 KB instead of import_data) and an auth note. However, it never distinguishes this tool from plausible alternatives such as replace_question or add_question_from_spec, leaving the when-to-use-vs-alternatives question largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_import_surveyImport surveyA
Import an LSA, CSV, TXT, or LSS survey. Use import_data_path for files at or above roughly 50 KB so the server reads and base64-encodes them itself; reserve inline import_data for small files under 200,000 characters of base64 text. The returned sid is the survey ID LimeSurvey actually used: it keeps the ID embedded in the file when that ID is free, destination_survey_id overrides it when set, and on an ID collision LimeSurvey silently assigns a random 6-digit sid instead of failing (verified against the LimeSurvey XMLImportSurvey/insertNewSurvey source).
Calls LimeSurvey RemoteControl method import_survey. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| import_data | No | Base64-encoded survey file contents; omit when using import_data_path. | |
| new_survey_name | No | Optional replacement survey name. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| import_data_path | No | Local file path to a survey file. The server reads and base64-encodes it, so use this instead of inline import_data for files at or above roughly 50 KB. The file must live inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR as a fallback). Exactly one of import_data or import_data_path must be set. | |
| import_data_type | Yes | Import file type. | |
| destination_survey_id | No | Optional desired ID for the imported survey. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already cover the safety profile, the description adds substantial non-obvious behavior: the sid retention/override/collision rules (including silent random 6-digit reassignment instead of failure) and the auth model contrasted with limesurvey_get_session_key. This is context an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the most decision-relevant guidance; the sid paragraph is dense but earns its length. Slightly verbose for a section that could be tightened, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still covers inputs, size tradeoffs, ID behavior, and auth. An agent has everything needed to call it correctly, including the edge case on ID collision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the path-vs-inline tradeoff with a size heuristic and the precedence of destination_survey_id over the embedded ID, which the terse schema descriptions do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Import) and resource (survey) plus the accepted formats (LSA, CSV, TXT, LSS), which is distinctive versus the group/question import siblings. It does not, however, explicitly differentiate from related siblings like limesurvey_add_survey or limesurvey_create_survey_from_spec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance on the two data-input paths (path for >=50KB, inline for small files) and states the auth context (service account, no session key). It stops short of saying when to choose import over the alternative add/create-from-spec tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_invite_participantsInvite survey participantsA
Send survey invitation emails to selected or eligible participants. Preview first with dry_run=true: it sends nothing and never calls invite_participants, it simulates the selection from the participant list and reports would_receive and would_not_receive with a reason for every participant who is skipped (completed, already_invited, emailstatus_not_ok, invalid_email_address, not_valid_yet, expired, ...). Without continue_on_error LimeSurvey stops at the first participant whose validity window fails; the preview names that participant as stops_at_tid. The report stays within LIMESURVEY_MAX_RESPONSE_CHARS regardless of the table size: unselected participants (token_ids) are only counted as not_selected, and would_receive, would_not_receive and not_reached list at most 100 entries each (truncated_lists says which were cut, counts hold the full numbers). send_email=false is NOT a dry run: it resends the invitation to those who were already invited. Verified against the LimeSurvey 6.17.11 source; older releases may differ. Requires confirm_send_email=true unless dry_run=true.
Calls LimeSurvey RemoteControl method invite_participants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | MCP-only, never sent to LimeSurvey. true: send nothing and do not call invite_participants; read the participants (list_participants) and report who would receive an invitation and why the others would not. Allowed under every write scope; confirm_send_email is not needed. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| token_ids | No | Optional participant row IDs; null (or an empty list) selects eligible participants. | |
| send_email | No | Which participants get an email. true (default): invite only participants who were not invited yet (sent = N or empty). false: resend the invitation ONLY to participants who are already invited (sent holds a date) - it does not turn the sending off. Emails are sent in both cases. To see who would be mailed without sending, use dry_run=true. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| continue_on_error | No | Continue after a participant whose validity window (validfrom/validuntil) fails; by default LimeSurvey stops at the first one. | |
| confirm_send_email | No | Required acknowledgement that email may be sent to participants; not needed with dry_run=true. | |
| server_utc_offset_minutes | No | MCP-only, never sent to LimeSurvey. UTC offset of the LimeSurvey server's local time in minutes (for example 120 for UTC+2). validfrom and validuntil are stored without a zone in that local time; without this value the timezone of the MCP host is assumed (reported as time_basis.offset_source). |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: stops at the first participant whose validity window fails (named as stops_at_tid unless continue_on_error), response truncation rules (LIMESURVEY_MAX_RESPONSE_CHARS, 100-entry lists, truncated_lists), the confirm_send_email gate, service-account auth, and the version-verification caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the dry_run preview workflow, and every sentence carries information. However, it is a dense block that restates several schema-level details, adding length without new value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a non-idempotent emailing tool: safety gate, dry-run behavior, error-continuation, timezone handling, and auth are all covered, and an output schema exists so return-format explanation is not needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds cross-parameter semantics the schema does not: 'send_email=false is NOT a dry run: it resends the invitation to those who were already invited' and the interaction of confirm_send_email with dry_run. Some of this duplicates the schema text, capping it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Send survey invitation emails to selected or eligible participants.' Scope (selected vs eligible) is stated, but no sibling is named (e.g. remind_participants, mail_registered_participants), so the agent must infer the distinction from tool names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational routing with 'Preview first with dry_run=true' and 'Use dry_run=true to see who would be mailed without sending,' plus the confirm_send_email prerequisite. Guidance is all within-tool (dry_run vs. real send); it never routes to sibling tools like remind_participants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_filtered_participantsList filtered participantsBRead-onlyIdempotent
List participant rows with explicit filters, selected fields, and bounded pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | Passed to LimeSurvey as list_participants start: a lower bound for the participant row ID (tid >= offset), not a row offset. Page with the last tid + 1. | |
| unused | No | ||
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| attributes | No | ||
| conditions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds that pagination is bounded and that filters/field selection are explicit, which is mild extra context, but it does not disclose return shape, filter semantics, or the tid-based paging caveat that matters behaviorally. With annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is efficient. It is arguably too terse for a six-parameter tool with 33% schema coverage, but structurally it is clean and wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and rich annotations exist, so the description need not restate return values or safety. Still, the tool has six parameters including a free-form nested conditions object and a paging parameter with non-obvious semantics, and the description addresses none of these, leaving the agent dependent on a 33%-covered schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description should compensate, but 'explicit filters, selected fields, and bounded pagination' only loosely labels conditions/attributes/limit/offset without explaining the conditions object's shape, what 'attributes' selects, or the tid-based meaning of offset. The one critical semantic (offset is a lower bound on tid, not a row offset) lives only in the schema, leaving the description thin where coverage is lowest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource (list participant rows) and names the three distinguishing capabilities (explicit filters, selected fields, bounded pagination), so an agent knows roughly what the tool returns. However, it never contrasts itself with the sibling limesurvey_list_participants, so the agent must infer that 'filtered' is the differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus limesurvey_list_participants, get_participant_properties, or the various export/mail participant tools. The word 'filtered' implies a condition, but no prerequisites, exclusions, or alternative-selection guidance are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_groupsList question groupsARead-onlyIdempotent
List question groups in a survey.
Calls LimeSurvey RemoteControl method list_groups. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive operation, so the safety profile is covered. The description adds genuinely non-obvious operational context: it uses the configured service account and explicitly tells the caller not to supply a session key, which prevents a common misuse given the sibling get_session_key tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the purpose is front-loaded and the auth note follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with a fully documented schema, an output schema, and annotations covering safety, the description is nearly sufficient. Only the routing question against similarly named group-related siblings remains unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with survey_id, language (null uses survey default) and the response_format enum all documented in the schema itself. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (question groups) scoped to a survey, and names the underlying RemoteControl method, so the agent knows exactly what it retrieves. It does not differentiate itself from the nearby sibling limesurvey_list_survey_groups or limesurvey_get_group_properties, leaving a small risk of confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to choose this tool over alternatives such as limesurvey_get_group_properties or limesurvey_list_survey_groups, nor does it state prerequisites beyond the survey_id requirement. Usage is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_installed_themesList installed LimeSurvey themes (best effort)ARead-onlyIdempotent
LimeSurvey RemoteControl2 has no official method to enumerate installed survey themes (verified 2026-07-24 against api.limesurvey.org and the LimeSurvey source). This tool combines two best-effort signals instead: generated_packages lists ZIPs/folders already generated locally in LIMESURVEY_THEME_DIR, and themes_in_use lists the distinct template names actually assigned to surveys visible to this account (via list_surveys + get_survey_properties), which works without a superadmin account. Always includes the documented admin-UI fallback for the complete installed-theme list.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_scan_limit | No | Maximum number of visible surveys to inspect for their assigned theme. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds value by explaining the tool uses two non-official signals (generated_packages, themes_in_use) and warns about incomplete data. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and uses two sentences to explain the signals and fallback. It is concise enough but could be slightly tighter; however, it earns its length by providing essential context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (no official method) and the presence of an output schema (mentioned), the description does not need to explain return values. It covers the two data sources and the admin-UI fallback, making it complete for an agent to understand what the tool does and its limitations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter (survey_scan_limit) has 100% schema description coverage, including default, min, max, and description. The tool description does not add further semantics for this parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists installed LimeSurvey themes using best-effort signals, with a specific verb ('list') and resource ('installed themes'). It distinguishes itself from sibling tools (none of which list themes) and includes the 'best effort' qualifier to set expectations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool (when you need to enumerate installed survey themes) and mentions a fallback (admin-UI). It implies that this is a workaround due to lack of official method, but does not explicitly state when not to use or name alternatives beyond the fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_participantsList survey participantsARead-onlyIdempotent
List and filter survey participants with server-side pagination.
Calls LimeSurvey RemoteControl method list_participants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum participants to return. | |
| start | No | Lower bound for the participant row ID (tid): LimeSurvey returns rows with tid >= start, ordered by tid. It is not a row offset; page with the last tid + 1. | |
| unused | No | Return only unused participants. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| attributes | No | Fields to return, or false for defaults. | |
| conditions | No | Participant filter conditions as an object or positional condition list. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, but the description adds genuinely new behavior: server-side pagination, that auth uses the configured service account, and that no session key should be supplied. It also identifies the underlying RemoteControl method, which helps agents reason about semantics. It stops short of any guidance on volume, rate limits, or partial-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action and scope front-loaded ahead of the implementation and auth notes. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter list tool with full schema coverage and an output schema (so return values need not be explained), the description covers the essentials: pagination model, auth expectation, and backing API. The one meaningful omission is disambiguation from limesurvey_list_filtered_participants.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself carefully documents the non-obvious `start` tid semantics, `conditions` shapes, and `response_format`. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (list/filter survey participants) and adds the pagination scope, which is clear on its own. However, it does not differentiate itself from the very similarly named sibling limesurvey_list_filtered_participants, leaving an agent unable to tell the two apart from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives, despite siblings like limesurvey_list_filtered_participants, limesurvey_get_participant_properties and limesurvey_get_participant_table_status that overlap in purpose. The only invocation guidance is the auth note (no session key), which does not help selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_questionsList questionsARead-onlyIdempotent
List questions and subquestions in a survey or group.
Calls LimeSurvey RemoteControl method list_questions. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | No | Optional question-group ID. | |
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds a genuinely useful operational detail — that auth uses the configured service account and no session key should be passed — but says nothing about result size, pagination, or ordering for a listing call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the purpose is front-loaded and the auth caveat follows. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with a fully described schema, complete annotations, and an output schema covering return values, the definition is nearly sufficient. The only gap is the absence of any note about ordering or result volume for potentially large question lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and documents all four parameters (group_id, language, survey_id, response_format) with enums and nullability. The description only restates the survey/group scoping already in the schema, adding no format or semantics beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List questions and subquestions') plus the scoping dimensions (survey or group). It is clearly distinguishable from mutation siblings like delete_question or set_question_properties, but it does not explicitly contrast itself with the closest read sibling, get_question_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of 'in a survey or group' implies when the tool is applicable and which identifier to supply, but there is no explicit guidance on when to choose this over get_question_properties or get_fieldmap, and no prerequisites are stated beyond the auth note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_quotasList quotasARead-onlyIdempotent
List quotas configured for a survey.
Calls LimeSurvey RemoteControl method list_quotas. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: authentication is handled by the configured service account and no session key should be supplied, and it names the backing RemoteControl method.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler: purpose first, then implementation/auth detail. Every sentence carries information the agent cannot get from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with full parameter documentation, an output schema, and annotations covering the safety profile, the description is nearly complete. It could still note behavior on an invalid or non-existent survey_id, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (survey_id, response_format) are fully documented in the schema, so the description need not repeat them. It adds no syntax or filtering nuance beyond what the schema provides, making the 3 baseline appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List quotas configured for a survey') and names the underlying RemoteControl method, so the operation is unambiguous. It does not differentiate itself from nearby siblings such as get_quota_properties, which an agent may conflate with this listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus get_quota_properties, add_quota, or delete_quota; the listing intent is only implied by the word 'List'. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_response_export_formatsList response export formatsARead-onlyIdempotent
Call the optional list_response_exports LimeSurvey extension to discover plugin-aware export formats.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, etc. The description adds context that this is an optional extension and plugin-aware, which is consistent and adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that clearly states the purpose. It is not overly terse but could benefit from slightly more detail about the optional extension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and an output schema present, the description is complete. It adequately conveys that the tool lists available export formats from plugins, which is all that is needed for this discovery tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so schema coverage is 100%. Description does not need to add parameter semantics; baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state that the tool lists response export formats, specifically from plugins. The verb 'list' and resource 'response export formats' are precise, and it differentiates from sibling tools which involve actual exporting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates this tool is used to discover plugin-aware export formats, implying it should be called before exporting to know available formats. It could explicitly state 'use before export_responses' but current wording is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_survey_groupsList survey groupsARead-onlyIdempotent
List survey groups visible to a user.
Calls LimeSurvey RemoteControl method list_survey_groups. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| username | No | Optional administration username; null uses the current service account. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely non-redundant behavior: it resolves the authentication model (configured service account rather than an explicit session key), which is exactly the kind of operational detail annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste: the operation and its scope come first, the RemoteControl method name and auth constraint follow. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be explained, and annotations plus the auth sentence cover the safety and access model. The only minor gap is the lack of any disambiguation from the near-identically named list_groups sibling, which would help in a toolset this large.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (username, response_format) are fully documented in the schema. The description's phrase 'visible to a user' loosely gestures at the username parameter's effect but adds no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List survey groups') plus a scope qualifier ('visible to a user'), which is enough to identify the operation. It does not, however, explicitly differentiate itself from the similarly named sibling limesurvey_list_groups, so an agent must infer the distinction (survey-organizing groups vs. question groups).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context ('visible to a user') and an auth directive ('do not provide a session key'), which indirectly tells the agent how to call it. But it never states when to choose this tool over alternatives such as limesurvey_list_groups or limesurvey_list_surveys, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_surveysList surveysARead-onlyIdempotent
List surveys visible to a user, optionally filtered by survey group.
Calls LimeSurvey RemoteControl method list_surveys. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| username | No | Optional administration username; null uses the current service account. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| survey_group_id | No | Optional survey-group ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered structurally. The description adds genuinely useful behavioral context beyond that: it states that the call hits LimeSurvey RemoteControl method `list_surveys` and that authentication uses the configured service account with no session key required, which pre-empts a real misuse pattern given the get_session_key/release_session_key siblings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and filter, followed by the one piece of context an agent cannot get from structured fields (the auth model). Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the annotations cover the safety profile. The description supplies purpose, filter, and auth behavior, so an agent has enough to invoke it correctly; only the relationship to the sibling search tool (find_surveys) is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (username, response_format, survey_group_id) are already documented in the schema, and the description's survey-group mention duplicates that. The service-account note implicitly clarifies the username parameter's default behavior, but no additional syntax or format detail is added over the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List surveys') plus the scope ('visible to a user') and an optional narrowing filter ('filtered by survey group'). It is clearly distinct from mutation siblings like add_survey or delete_survey, though it never names the closest read alternative, limesurvey_find_surveys, leaving that differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one clear usage condition (optionally filter by survey group) and an operational instruction about authentication, but it offers no when-to-use/when-not guidance and does not point to limesurvey_find_surveys for searching versus listing. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_list_usersList administration usersARead-onlyIdempotent
List administration users, optionally filtered by ID or username.
Calls LimeSurvey RemoteControl method list_users. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No | Optional administration user ID. | |
| username | No | Optional administration username. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond them: it names the underlying RemoteControl method and states that authentication comes from the configured service account with no session key required. It does not discuss result size or return handling, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core capability front-loaded in the first few words. The second sentence is implementation/auth detail that has some value but is slightly meta relative to pure usage selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, 100% schema coverage, and an output schema, the remaining burden is light and this description covers the auth model that the structured fields do not. Nothing essential to invoking it correctly is missing, though a note on result volume or ordering would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the response_format enum is already documented with its default and effect. The description's "optionally filtered by ID or username" merely restates the schema without adding format, matching, or precedence rules, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List administration users") plus the optional filter dimensions, so an agent can distinguish it from limesurvey_list_participants and the other list_* siblings. It stops short of explicitly naming a contrasting sibling, but the resource is precise enough to be unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys that filtering is optional, implying "use with no params for all users, or narrow by ID/username," which is usable guidance. However, it never states when to prefer this over an alternative lookup path or any prerequisites, so guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_mail_registered_participantsEmail registered participantsA
Send registration emails to survey participants. Requires confirm_send_email=true.
Calls LimeSurvey RemoteControl method mail_registered_participants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| confirm_send_email | Yes | Required acknowledgement that email may be sent to participants. | |
| override_conditions | No | Replacement email conditions as an object or positional condition list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false, so the safety profile is partly covered. The description adds real value beyond them: it discloses that emails are actually sent to participants, names the underlying RemoteControl method, and specifies that auth uses the configured service account with no session key. It stops short of stating failure behavior or per-invocation side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that front-load the action and the hard prerequisite, followed by the method/auth note. No filler, and the most decision-relevant fact (requires confirm_send_email=true) comes early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available, return values need not be explained, and the annotations cover the mutation profile. The description covers purpose, prerequisite, and auth, leaving only sibling differentiation and failure/repeat-send behavior unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented. The description only restates the confirm_send_email requirement and adds nothing about survey_id semantics or the override_conditions parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Send) and resource (registration emails to survey participants), so the action is unambiguous. It does not, however, distinguish itself from close siblings like limesurvey_invite_participants and limesurvey_remind_participants, which all appear to send participant email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one prerequisite (confirm_send_email=true), which is genuine usage context. But it offers no when-to-use guidance relative to the obvious alternatives (invite_participants, remind_participants, add_participants), leaving selection between the mail-related tools to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_release_session_keyDisconnect from LimeSurveyA
Release the cached RemoteControl session.
Calls LimeSurvey RemoteControl method release_session_key. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), and the description adds real context beyond them: the session is 'cached', it is keyed to a configured service account, and no session key parameter should be passed despite the RemoteControl method normally requiring one. Return behavior is not described, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the action leads, the auth/call-shape caveat follows. Every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple session-teardown tool with an output schema already documenting returns, the description covers what it does, how it authenticates, and what not to pass — enough for correct invocation. A note on what happens if no cached session exists would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter (response_format) is fully documented with its enum, so the schema does the work. The description's only parameter-related statement is the warning not to supply a session key, which is a call-shape hint rather than meaning added to an actual schema field — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Release the cached RemoteControl session') and names the underlying LimeSurvey method, so the action is unambiguous and implicitly distinguished from the sibling limesurvey_get_session_key. It stops short of explicitly contrasting itself with that sibling, which keeps it out of 5 territory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent how to authenticate ('configured service account; do not provide a session key') but never states when to release the session versus when to leave it alone, nor does it reference the sibling get_session_key as the counterpart. Usage is implied by the name rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_remind_participantsRemind survey participantsA
Send reminder emails to selected or eligible participants. Requires confirm_send_email=true.
Calls LimeSurvey RemoteControl method remind_participants. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| token_ids | No | Participant row IDs, or false for eligible participants. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
| continue_on_error | No | Continue after individual email errors. | |
| maximum_reminders | No | Maximum reminders per participant. | |
| confirm_send_email | Yes | Required acknowledgement that email may be sent to participants. | |
| minimum_days_between | No | Minimum days since the previous reminder. |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-read-only, non-idempotent, open-world), and the description adds genuinely useful auth context: it names the RemoteControl method and states that a configured service account is used and no session key should be supplied. It stops short of describing recipient side effects such as how reminder counts are tracked or what happens on partial failures (continue_on_error).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the action and the mandatory acknowledgement front-loaded before the auth mechanics. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description need not explain return values. It adequately covers purpose, confirmation requirement, and auth model, though a note on interaction with sibling email tools would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only restates the confirm_send_email requirement already encoded as const: true in the schema and adds no semantics for token_ids, maximum_reminders, or minimum_days_between.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Send reminder emails to ... participants') with explicit scope ('selected or eligible'). It is distinguishable from sibling tools like invite_participants and mail_registered_participants by the 'reminder' framing, though it does not name them to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one hard prerequisite (confirm_send_email=true) but offers no guidance on when to prefer this over limesurvey_invite_participants or limesurvey_mail_registered_participants, even though those siblings overlap heavily. Usage is implied by the tool's purpose rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_replace_questionReplace a question with a .lsq fileADestructive
Replace one main question of an INACTIVE survey by the question in a .lsq file, in the same group and at the same position, using only official RemoteControl methods. This is how question attributes, answer options and subquestions are changed, because set_question_properties cannot write them. Steps: check that the survey is inactive (get_survey_properties); read the old question (get_question_properties; it must belong to survey_id and have parent_qid 0); read the group (list_questions); parse the file; if the file has the same code, give the old question a temporary code (set_question_properties); import_question (the new question goes to the end of the group; its mandatory flag is taken from the file because import_question always overwrites it); set_question_properties question_order to the old position; read the old question back and delete_question exactly that question; verify the result. The code, type, texts, attributes, answer options and subquestions come from the file (new_question_title is not offered). Any failure after the first write is rolled back (the question this call imported is deleted, the old code is restored); the error says which step failed and, if a rollback step failed too, lists manual_cleanup. The only question that can be deleted is question_id. Requires confirm_destructive_action=true and the write scope content. Question IDs change; references by code (relevance expressions) keep working; legacy conditions that reference the old question ID are not migrated, and delete_question refuses a question that other questions depend on through legacy conditions (the replacement is then rolled back). Exactly one of import_data (small base64 payload) or import_data_path (file inside LIMESURVEY_IMPORT_DIR) must be set.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| import_data | No | Base64-encoded .lsq file contents for small files; omit when using import_data_path. | |
| question_id | Yes | ID of the main question to replace; it must belong to survey_id. | |
| import_data_path | No | Path of the .lsq file inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR as a fallback). | |
| import_data_type | No | Import type; only lsq. | lsq |
| confirm_destructive_action | Yes | Required acknowledgement that the old question is deleted permanently. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-idempotent/openWorld, but the description goes far beyond them: it documents rollback semantics ('Any failure after the first write is rolled back'), the manual_cleanup error field, that question IDs change while code references keep working, that legacy conditions are not migrated, and that delete_question refuses dependencies. This is unusually thorough behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then side effects, then constraints. The 'Steps:' enumeration of internal implementation (temporary code, import to end, reorder) is arguably more than an agent needs to invoke the tool, making it dense, but nearly every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-step replace operation with a rollback path, the description covers preconditions, alternatives, side effects, failure modes, and parameter constraints; with an output schema present, return values need not be restated. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine meaning the schema lacks: the mutual exclusivity rule ('Exactly one of import_data or import_data_path must be set'), that new_question_title is deliberately not offered, that question_id must have parent_qid 0 and is the only deletable question. Only the trivial import_data_type/confirm nuances are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Replace one main question of an INACTIVE survey by the question in a .lsq file, in the same group and at the same position'. It also names what it is not — distinguishing itself from set_question_properties and import_question, both of which are siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to reach for this tool and why: 'This is how question attributes, answer options and subquestions are changed, because set_question_properties cannot write them.' It also states the precondition (survey must be inactive) and the required confirm/write-scope, leaving no routing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_set_group_propertiesSet group propertiesA
Update question-group properties. Writable fields: group_order, randomization_group, grelevance, group_name, description. NOT writable through RemoteControl (the call is rejected before any request is sent): sid, gid, group_l10ns. A group cannot be moved to another survey or restructured through RemoteControl; re-import it (limesurvey_import_group with import_data_path) or use the LimeSurvey admin UI. Localized texts (group_name, description) need a language: {"language": "de", "group_name": "..."}. group_name and description are localized: pass them with data.language (this tool has no language parameter); the server moves them into questiongroupl10ns[language], so the other text field is never blanked. Keys LimeSurvey does not report back are returned in warnings. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method set_group_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Group property names mapped to new values. | |
| group_id | Yes | Numeric question-group ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: rejected fields are 'rejected before any request is sent', writable vs non-writable fields are enumerated, localization semantics are explained (server moves texts into questiongroupl10ns[language], 'the other text field is never blanked'), unreported keys surface in warnings, and auth uses the service account with no session key. This is far richer than the readOnly/destructive/openWorld hints alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and writable fields, and most sentences carry distinct information. There is mild redundancy (the localized-text rule is restated twice) but the version caveat and warnings note both earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with an output schema present and openWorld/idempotent/destructive annotations, the description covers constraint reversibility implications (text not blanked), failure modes (rejected fields, warnings), auth, and version scope. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description materially improves on the opaque 'Group property names mapped to new values' by naming writable keys and the data.language convention for localized fields. It does not add anything for group_id or response_format, keeping it out of the top band.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Update question-group properties') and enumerates the writable fields (group_order, randomization_group, grelevance, group_name, description). This clearly distinguishes it from siblings like get_group_properties, add_group, and import_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states unsupported operations and names the alternatives ('A group cannot be moved to another survey... re-import it (limesurvey_import_group) or use the LimeSurvey admin UI'), which is strong when-not guidance. It does not, however, explicitly route the agent to get_group_properties for reading, so it falls just short of full alternative mapping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_set_language_propertiesSet language propertiesA
Update localized survey properties. Writable fields: surveyls_title, surveyls_description, surveyls_welcometext, surveyls_endtext, surveyls_policy_notice, surveyls_policy_error, surveyls_policy_notice_label, surveyls_url, surveyls_urldescription, surveyls_email_invite_subj, surveyls_email_invite, surveyls_email_remind_subj, surveyls_email_remind, surveyls_email_register_subj, surveyls_email_register, surveyls_email_confirm_subj, surveyls_email_confirm, surveyls_dateformat, surveyls_attributecaptions, surveyls_alias, email_admin_notification_subj, email_admin_notification, email_admin_responses_subj, email_admin_responses, surveyls_numberformat, attachments. NOT writable through RemoteControl (the call is rejected before any request is sent): surveyls_language, surveyls_survey_id. Select the language row with the language parameter and send only the localized settings. LimeSurvey answers status OK even when single fields could not be saved; such fields are reported in warnings. Keys LimeSurvey does not report back are returned in warnings. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method set_language_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Localized property names mapped to new values. | |
| language | No | LimeSurvey language code; null uses the survey default. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing that surveyls_language and surveyls_survey_id are rejected before any request is sent, that status OK can mask per-field failures reported in warnings, that unknown keys come back in warnings, and that no session key is needed. These are exactly the runtime behaviors an agent cannot infer from readOnlyHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The long field list is dense but load-bearing, and the operational caveats are front-loaded after the one-line purpose statement. Minor redundancy in re-stating the method name and auth boilerplate, but nothing that meaningfully dilutes the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema covering return shape, the description supplies the remaining needed context: auth model, writable/forbidden key sets, partial-failure semantics, and version caveat. An agent has everything required to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the schema types the data object only as a generic key/value bag; the description enumerates the actual writable keys and explicitly names the two keys that are not writable, which is substantive meaning the schema does not carry. The language parameter's role is also restated helpfully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update localized survey properties"), which lets an agent separate it from the read-side sibling limesurvey_get_language_properties. It does not, however, explicitly distinguish itself from limesurvey_set_survey_properties or limesurvey_update_survey_texts, which cover adjacent mutation surfaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Select the language row with the language parameter and send only the localized settings" gives concrete invocation context and a scoping rule. It stops short of stating when to prefer this over set_survey_properties (non-localized fields) or update_survey_texts, so the routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_set_participant_propertiesSet participant propertiesA
Update a participant matched by token or token-table ID. Writable fields: participant_id, firstname, lastname, email, emailstatus, token, language, blacklisted, sent, remindersent, remindercount, completed, usesleft, validfrom, validuntil, mpid, attribute_N. NOT writable through RemoteControl (the call is rejected before any request is sent): tid. Participant rows are changed by token or tid in query; the participant table must exist (check limesurvey_get_participant_table_status). attribute_N stands for the custom attribute columns of the participant table (attribute_1, attribute_2, ...). Validation errors (for example an invalid email) are returned as an error. Keys LimeSurvey does not report back are returned in warnings. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method set_participant_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Participant properties to update. | |
| query | Yes | Participant lookup properties. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it as a non-idempotent, non-read-only mutation, and the description goes well beyond that: it discloses the pre-send rejection of tid, that validation errors surface as errors while unreported keys come back as warnings, the auth model (service account, no session key), and version-verification scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core action and writable field set come first, followed by constraints and caveats. The long field enumeration and version note are justified by the free-form data map, though the prose runs slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description covers matching keys, field constraints, error/warning behavior, and prerequisites. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds real meaning the schema lacks: the full writable-field list, the attribute_N convention for custom columns, and the fact that query can match by token or tid. The schema itself places no enum or per-key constraints on the free-form maps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update a participant matched by token or token-table ID') and immediately names the writable field set, which distinguishes it from the read-only sibling limesurvey_get_participant_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ('the participant table must exist') and routes the agent to limesurvey_get_participant_table_status for that check, plus an explicit exclusion (tid is not writable). It does not spell out when to prefer this over add/delete participants, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_set_question_propertiesSet question propertiesA
Update question properties. Writable fields: title, preg, other, mandatory, encrypted, question_order, scale_id, same_default, relevance, question_theme_name, modulename, same_script, question, help, script. NOT writable through RemoteControl (the call is rejected before any request is sent): attributes, question_attributes, questionattributes, answers, answeroptions, answer_options, subquestions, defaultvalues, default_values, conditions, qid, gid, sid, parent_qid, type, question_l10ns. Question attributes, answer options and subquestions can only be changed by re-importing the question (limesurvey_import_question, or limesurvey_import_group / limesurvey_import_survey, all with import_data_path) or in the LimeSurvey admin UI; limesurvey_replace_question swaps a question of an inactive survey for the question in a .lsq file (inactive surveys only). Localized texts (question, help, script) are written with a language: {"language": "de", "question": "..."} or {"questionl10ns": {"de": {"question": "..."}}}. question, help and script are localized: pass them with data.language (or the language parameter); the server moves them into questionl10ns[language], so the other text fields are never blanked (LimeSurvey's legacy form would reset a field you did not send to an empty string). question_order is refused for questions that have legacy condition dependencies, and the group is renumbered after each change. Keys LimeSurvey does not report back are returned in warnings. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method set_question_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Question property names mapped to new values. | |
| language | No | LimeSurvey language code; null uses the survey default. | |
| question_id | Yes | Numeric question ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: names the rejected-before-send behavior, the question_order refusal for legacy condition dependencies, group renumbering after each change, warnings for unreported keys, the legacy-form field-blanking risk for localized texts, and a source-version caveat (6.17.11). Idempotency is declared false in annotations but the description adds the mutation consequences that matter for invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the writable list precedes the non-writable list, then the alternative paths. It is long, but nearly every sentence carries operational detail; only minor tightening (e.g. repeated field aliases like attributes/question_attributes and answers/answeroptions) could shrink it without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description completes the remaining picture: auth uses the configured service account with no session key, the underlying RemoteControl method, mutation side effects, and version sensitivity. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the schema itself is an opaque generically-typed object; the description compensates by enumerating the writable keys, spelling out the localized-text shapes ({"language":"de","question":"..."} vs questionl10ns), and noting the language parameter moves text into questionl10ns[language].
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Update question properties') and immediately bounds the scope with an explicit writable-field list. It is clearly distinguishable from its sibling limesurvey_get_question_properties and from the import/replace tools it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states what CANNOT be written via this call and routes the agent to concrete alternatives (limesurvey_import_question, limesurvey_import_group/survey with import_data_path, admin UI, limesurvey_replace_question with the inactive-survey caveat). It also tells the agent the call is rejected before any request is sent, which is actionable when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_set_quota_propertiesSet quota propertiesA
Update quota properties. Writable fields: name, qlimit, action, active, autoload_url. NOT writable through RemoteControl (the call is rejected before any request is sent): id, sid, limit, quotals_message, quotals_url, quotals_urldescrip. Localized quota texts (message, URL, URL description) can only be edited in the LimeSurvey admin UI. Unknown keys are ignored silently by LimeSurvey; the server reports them in warnings. Keys LimeSurvey does not report back are returned in warnings. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method set_quota_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Quota properties to update. | |
| quota_id | Yes | Numeric quota ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only flag non-read-only, non-idempotent, open-world, non-destructive), the description discloses that unknown keys are ignored silently, that rejected calls fail before any request is sent, that unreported keys come back in warnings, and that auth uses the configured service account with no session key. It also pins the behavior to a verified LimeSurvey version. This is unusually rich disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the writable/not-writable split before any meta detail, and no sentence is pure filler. The field lists are dense and the trailing RemoteControl/version sentences are low-priority, but each carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it covers everything else an agent needs: the writable key set, the rejected keys, silent-ignore behavior, warning reporting, auth model, and version scope. Nothing material to a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema covers all three parameters, the `data` object is an untyped anyOf blob with no field names; the description supplies the missing semantics by whitelisting writable keys (name, qlimit, action, active, autoload_url) and blacklisting the rejected ones. That meaning exists nowhere in the schema and is essential to calling the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update quota properties') and immediately enumerates the writable fields, which pins down exactly which slice of quota data this tool mutates versus reading tools like limesurvey_get_quota_properties. An agent can distinguish it from the many sibling set_*_properties tools by the 'quota' resource alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-not guidance: localized quota texts (message/URL/URL description) can only be edited in the admin UI, and a set of keys is rejected outright. It does not, however, name the read-side alternative (limesurvey_get_quota_properties) or state prerequisites such as survey activation state, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_set_survey_propertiesSet survey propertiesA
Update editable survey properties. Writable fields: owner_id, gsid, admin, expires, startdate, adminemail, anonymized, format, savetimings, template, datestamp, usecookie, allowregister, allowsave, autonumber_start, autoredirect, allowprev, printanswers, ipaddr, ipanonymize, refurl, datecreated, showsurveypolicynotice, showregisterpolicy, showtokenpolicy, publicstatistics, publicgraphs, listpublic, htmlemail, sendconfirmation, tokenanswerspersistence, assessments, usecaptcha, usetokens, bounce_email, attributedescriptions, emailresponseto, emailnotificationto, tokenlength, showxquestions, showgroupinfo, shownoanswer, showqnumcode, bouncetime, bounceprocessing, bounceaccounttype, bounceaccounthost, bounceaccountpass, bounceaccountencryption, bounceaccountuser, showwelcome, showprogress, questionindex, navigationdelay, nokeyboard, alloweditaftercompletion, googleanalyticsstyle, googleanalyticsapikey, tokenencryptionoptions, access_mode, lastmodified. NOT writable through RemoteControl (the call is rejected before any request is sent): sid, active, language, additional_languages. Titles, descriptions and texts are per-language settings: use limesurvey_set_language_properties. Activation: limesurvey_activate_survey. Languages: limesurvey_add_language / limesurvey_delete_language. While the survey is active, anonymized, datestamp, savetimings, ipaddr and refurl are refused. access_mode and usetokens are plain column writes: they do not create or remove the participant table. Keys LimeSurvey does not report back are returned in warnings. Verified against the LimeSurvey 6.17.11 source; older releases may differ.
Calls LimeSurvey RemoteControl method set_survey_properties. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Survey property names mapped to new values. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the safety profile is covered; the description adds substantial context beyond that: pre-request key rejection, active-survey field refusals, the warning channel for keys LimeSurvey does not echo back, and the caveat that access_mode/usetokens are plain column writes with no participant-table side effect. It even discloses the auth model (configured service account, no session key) and a version caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then constraints, then routing, then the method/auth note — a sensible order. The 60-plus field enumeration is dense prose rather than a formatted list and dominates the text, but nearly every clause carries actionable information and the length is justified by the tool's surface area.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Combined with the annotations and the description's coverage of exclusions, conditional refusals, warnings, auth, and version drift, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the schema describes `data` only as 'Survey property names mapped to new values' with no key enumeration; the description is the sole source of the allowed key set and the explicit exclusions. It stops short of per-field value semantics (e.g., valid values for format, template, bounceprocessing, access_mode), so it adds strong but not complete meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update editable survey properties') and immediately enumerates the writable field set, which is the tool's actual scope. It explicitly carves itself away from the sibling setters (set_language_properties for per-language texts, set_group_properties/set_question_properties/set_participant_properties by naming the language-specific boundary). An agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: titles/descriptions/texts go to limesurvey_set_language_properties, activation to limesurvey_activate_survey, languages to add/delete_language. It also states when-not conditions (sid, active, language, additional_languages are rejected before any request is sent) and conditional refusals while the survey is active (anonymized, datestamp, savetimings, ipaddr, refurl).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_update_question_from_specChange a question to a described end stateADestructive
Change one existing question to the end state given as a question spec (typically the spec of limesurvey_get_survey_spec at level question, changed). The tool compares the end state with the question and picks the mode: none (nothing differs, nothing is written); texts (only question, help and subquestion texts: written in place with set_question_properties questionl10ns, also at an active survey); columns (code, mandatory, relevance, preg, other, same_default, same_script, encrypted, question_theme_name, modulename, inactive survey only: written in place, the question ID stays); replace (anything else: subquestions, answers and answer texts, attributes, defaults, type, script; inactive survey only): the end state is imported as a new question, moved to the place of the old one and read back completely; only if it matches is the old question deleted, otherwise the new one is deleted again and the old one keeps everything. Texts the end state does not change are written back as LimeSurvey stores them. dry_run true only reads (write scope none) and returns { survey_id, question_id, survey_active, mode (none, texts, columns, replace, or rejected when an active survey would need more than texts), changes [{ path, kind (text, column, structure), current, desired, and for a subquestion or answer its code and, on scale 1, scale_id }], changes_total, risks [{ code, blocking, acknowledgeable, detail, locations }], plan, fingerprint }. The real run needs expected_fingerprint (of get_survey_spec or the dry run; STALE_SPEC if the question changed since) and confirm_destructive_action true, and returns the same plus applied, verification { ok, differences } and, after a replacement, the new question_id and old_question_id. Blocking risks stop the call with UPDATE_QUESTION_BLOCKED before anything is written: qid_bound_links (every replacement: URL parameters, archived responses, quota memberships of the old ID), quota_members, other_default, removals, translation_gaps (import_question fills missing translations of the survey) and unreadable_texts (texts of the question that cannot be read in a language get the base-language text; both acknowledged with fill_translation_gaps) and answer_code_references can be acknowledged; code_references (the old code or removed fields such as CODE_SQ, CODE_SQcomment, CODE_other named anywhere, the end state of the question included; free texts are searched inside {...} only), sgqa_references and data_uri cannot. Each risk lists at most a part of its locations (locations_total). Errors: SPEC_INVALID, STALE_SPEC, SURVEY_ACTIVE (with the changes that need an inactive survey), UPDATE_QUESTION_BLOCKED, QUESTION_SURVEY_MISMATCH, REPLACE_QUESTION_FAILED (failed_step, rolled_back, manual_cleanup, differences), UPDATE_QUESTION_FAILED (texts and columns; the old values are written back and read back, manual_cleanup names what is not back), VERIFY_READ_FAILED (written: true; only the read-back failed). Texts of the survey, groups and questions alone go with limesurvey_update_survey_texts; a new question with limesurvey_add_question_from_spec. Needs the write scope content (dry run: none).
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | true: only show mode, changes, risks and plan; nothing is written (default false). | |
| question | Yes | The end state of the question as a question spec, for example the spec of limesurvey_get_survey_spec at level question, changed. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| acknowledge | No | Confirmed risks of the dry run: qid_bound_links, quota_members, other_default, removals, fill_translation_gaps (for the risks translation_gaps and unreadable_texts) and answer_code_references. | |
| question_id | Yes | ID of the main question of this survey to change. | |
| expected_fingerprint | No | The fingerprint of the question as read (limesurvey_get_survey_spec or a dry run); required unless dry_run is true. | |
| confirm_destructive_action | No | Must be true for a real run (dry_run not true): a replacement deletes the old question. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description goes far beyond them: it discloses the transactional replace semantics (import new, move, read back, delete old only on match), which risks block vs. can be acknowledged, the dry-run write scope of none, and the full error taxonomy. It also states the write-scope requirement and fingerprint/confirmation preconditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the rest is a single dense paragraph packing modes, risk codes, and every error string into one block. The content is largely necessary for a tool this complex, yet the wall-of-text structure makes selective reading hard and could be broken into scannable sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, transactional, multi-mode tool with nested spec objects, the description covers preconditions, modes, risks, error handling, and recovery behavior. An output schema exists, so the return-value narrative is redundant but ensures nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for expected_fingerprint (source and STALE_SPEC behavior), confirm_destructive_action, and acknowledge (which risk codes map to which risks, e.g. fill_translation_gaps). The question spec itself is not re-explained, which is correct since the schema fully documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change one existing question to the end state given as a question spec') and immediately frames the spec as the get_survey_spec question-level object. It is clearly distinguishable from add_question_from_spec (new question) and update_survey_texts (texts only), which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: 'Texts of the survey, groups and questions alone go with limesurvey_update_survey_texts; a new question with limesurvey_add_question_from_spec.' It also explains when each internal mode (none/texts/columns/replace) is chosen based on what differs, so the agent knows when the tool is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_update_responseUpdate survey responseB
Update a response; include its response ID in the data.
Calls LimeSurvey RemoteControl method update_response. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| response | Yes | Response fields, including the response ID, mapped to new values. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is largely covered. The description adds genuinely useful operational context about service-account authentication and not supplying a session key, but it never says whether this is a partial merge or full replace of the response, which matters for a non-idempotent update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded and no wasted phrasing. The authentication caveat is tacked on as a compact second sentence and earns its place by preventing a common misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations plus 100% schema coverage handle most of the burden. The remaining gap is the update semantics (merge vs replace) for a non-idempotent write, which the description does not address.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema's response property already states that the response ID is included in the fields, so the description's "include its response ID in the data" largely restates structured data. Baseline 3 is appropriate when the schema carries the parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Update a response") and names the underlying RemoteControl method, so the operation is unambiguous. It does not explicitly distinguish itself from sibling write tools like limesurvey_add_response or limesurvey_delete_response, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use/when-not-to-use guidance and no alternatives named among the many sibling response tools. The only procedural hint is the requirement to include the response ID in the data, which is closer to a parameter note than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_update_survey_textsChange texts of a surveyADestructiveIdempotent
Change texts of a survey by code, also at an active survey: survey title, description, welcometext and endtext (set_language_properties per language), group title and description by group_id (set_group_properties with questiongroupl10ns) and question, help and subquestion texts by question code (set_question_properties with questionl10ns on the question or subquestion). Every text is one string for every survey language or a map with some of them. Before anything is written the tool refuses: answers or attributes in texts (TEXT_NOT_WRITABLE: RemoteControl cannot write them; at an inactive survey use limesurvey_update_question_from_spec), an unknown code or a language the survey lacks (SPEC_INVALID with the path), a group of another survey (GROUP_SURVEY_MISMATCH), a row that holds an embedded data URI in any field, which LimeSurvey would remove on saving (DATA_URI_PRESENT), and an expected_fingerprint that does not match (STALE_SPEC). Returns { survey_id, survey_active, changes [{ path, language, current, desired }], changes_total, applied, verification { ok, differences }, side_effects (for example empty mail templates LimeSurvey fills on saving), collateral_changes (other fields of the saved rows that changed), fingerprint }. dry_run true only reads (write scope none) and shows the changes; its fingerprint can be passed as expected_fingerprint. If a write fails, every text the call wrote is reset and read back (TEXT_UPDATE_FAILED with rolled_back; manual_cleanup names the old values that are not back); if only the read-back after the writes fails, VERIFY_READ_FAILED says written: true. A subquestion, question or group named twice answers SPEC_INVALID. Needs the write scope content (dry run: none).
| Name | Required | Description | Default |
|---|---|---|---|
| texts | Yes | The texts to set. | |
| dry_run | No | true: only show the changes; nothing is written (default false). | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| expected_fingerprint | No | The fingerprint of a dry run: the call stops with STALE_SPEC if a text changed since. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what the annotations carry: it enumerates every refusal precondition with its error code (TEXT_NOT_WRITABLE, SPEC_INVALID, GROUP_SURVEY_MISMATCH, DATA_URI_PRESENT, STALE_SPEC), the rollback contract (TEXT_UPDATE_FAILED with rolled_back and manual_cleanup), the read-back failure case (VERIFY_READ_FAILED with written: true), and reports side_effects and collateral_changes. It also clarifies the scope requirement (write scope content; none for dry run).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence is load-bearing, but it is delivered as one dense run-on paragraph with error codes and clauses stacked together, which hurts scannability for such a complex tool. Information is roughly front-loaded (what it changes first, refusals second, failure handling last), but structure is poor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deeply nested mutation tool it covers everything an agent needs: scope requirements, dry-run semantics, fingerprint-based staleness protection, refusal conditions, rollback guarantees, and error codes, even though an output schema already exists so return values need not be explained. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the string-or-map text format, group_id, code, and scale_id semantics, so the schema does the heavy lifting. The description adds the dry_run/expected_fingerprint interplay ('its fingerprint can be passed as expected_fingerprint') but little else about individual parameters, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (change a survey's texts) and enumerates the exact surface: survey title/description/welcometext/endtext, group title/description by group_id, and question/help/subquestion texts by code. It names the underlying operations (set_language_properties, set_group_properties, set_question_properties) and cross-references the sibling limesurvey_update_question_from_spec, so an agent can distinguish it from neighbors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (works on active surveys, one string per language or a partial map, dry_run for read-only preview, write scope content required) and an explicit routing rule away from itself for answers/attributes at an inactive survey. It does not explicitly contrast itself against limesurvey_set_survey_properties or limesurvey_set_language_properties, which also mutate similar fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_upload_fileUpload response fileA
Upload a base64-encoded file for a file-upload question.
Calls LimeSurvey RemoteControl method upload_file. Authentication uses the configured service account; do not provide a session key.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | Yes | Original file name. | |
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| field_name | Yes | Survey response field name. | |
| file_content | Yes | Base64-encoded file contents. | |
| response_format | No | Output format. JSON preserves the complete structured result; Markdown is optimized for reading. | json |
Output Schema
| Name | Required | Description |
|---|---|---|
| method | Yes | |
| result | Yes | |
| warnings | No | |
| truncated | No | |
| truncation_message | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds meaningful context by naming the underlying RemoteControl method and specifying that authentication uses the configured service account and that no session key should be supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core action, and every sentence carries useful information. There is no wasted text or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and annotations, the description provides enough context to invoke the tool correctly, including the key authentication detail. It could still be slightly more complete by clarifying when this is preferred over related upload/retrieval siblings, but overall it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all five parameters thoroughly. The description mentions base64 encoding for file_content, but adds no further parameter semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: uploads a base64-encoded file for a file-upload question. The title and description together make it immediately distinguishable from sibling read tools such as limesurvey_get_uploaded_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives context that this is for a file-upload question, but does not explicitly say when to use this tool versus alternatives or state any exclusions. Usage is implied rather than fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_validate_participantsValidate survey participantsARead-onlyIdempotent
Read-only check of the whole participant table before an invitation run: leading/trailing whitespace (email, firstname, lastname, token), duplicate email addresses (trimmed, case-insensitive) and tokens, address format (every address of a comma/semicolon list, with the pattern LimeSurvey's invite_participants uses), validfrom/validuntil against the server time, validfrom after validuntil, emailstatus other than OK, and missing email or token. Returns issues [{tid, field, code, detail}] and counts_by_code (codes WHITESPACE, DUPLICATE_EMAIL, DUPLICATE_TOKEN, INVALID_EMAIL, NOT_YET_VALID, EXPIRED, INVALID_VALIDITY_RANGE, EMAILSTATUS_NOT_OK, MISSING_EMAIL, MISSING_TOKEN). The server time is the HTTP Date header of the LimeSurvey answer; validfrom/validuntil are read in the server's local time, whose UTC offset is server_utc_offset_minutes or, without it, the timezone of the MCP host (time_basis says which). Entries within 60 minutes of the current time are listed under borderline. Uses only list_participants. The answer stays within LIMESURVEY_MAX_RESPONSE_CHARS: with too many issues, issues and borderline are cut (issues_truncated, issues_total) while counts_by_code stays complete.
| Name | Required | Description | Default |
|---|---|---|---|
| survey_id | Yes | Numeric LimeSurvey survey ID. | |
| server_utc_offset_minutes | No | MCP-only, never sent to LimeSurvey. UTC offset of the LimeSurvey server's local time in minutes (for example 120 for UTC+2). validfrom and validuntil are stored without a zone in that local time; without this value the timezone of the MCP host is assumed (reported as time_basis.offset_source). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantial behavioral context: the exact validation categories performed, the returned issue codes, the server-time basis (HTTP Date header, server_utc_offset_minutes, timezone fallback), the 60-minute borderline window, and truncation behavior under LIMESURVEY_MAX_RESPONSE_CHARS.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is essentially two enormous sentences packed with nested parentheses and code lists. Almost all content is relevant for a tool this complex, yet the near-total absence of sentence breaks makes it hard to scan, which costs it delineation points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a validation tool operating over an entire participant table with no annotation-level detail, the description covers inputs, semantics, return shape, edge cases (borderline timestamps, truncation) and the timezone model comprehensively. An output schema exists, so explaining return codes is arguably redundant but it leaves no correctness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by explaining how validfrom/validuntil are interpreted against server_utc_offset_minutes, how the offset is inferred when omitted, and that time_basis reports the source. This adds real meaning for the offset parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('read-only check of the whole participant table') and pins the moment of use ('before an invitation run'). It is clearly distinguishable from siblings like invite_participants, list_participants, and get_participant_table_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage context ('before an invitation run') and notes it 'Uses only list_participants', which signals it is a pure analysis pass. It does not, however, explicitly route the agent to an alternative (e.g. list_participants or get_participant_table_status) or state when-not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_validate_specValidate a survey descriptionARead-onlyIdempotent
Check a survey description (spec) and report every problem at once. kind says what the spec is: survey ({ survey, groups }), group (one group with its questions) or question (one question). Returns { valid, kind, errors [{ path, message, fix }], errors_total, warnings [{ path, message }], warnings_total, truncated, summary, checked_against_survey, skipped_checks }. errors and warnings show at most 200 entries and are cut further to stay within LIMESURVEY_MAX_RESPONSE_CHARS; errors_total and warnings_total hold the full numbers and truncated says whether a list was cut. Paths are 0-based, for example groups[1].questions[3].answers[0].code; for kind group and question they are relative to the checked object (for example code). The check covers keys, question codes (pattern, length, reserved words, duplicates), question types and the subquestions and answers each type needs, answer and subquestion codes, attribute names, attributes that some question theme defines but the theme of the question does not (plugin attributes and unknown themes are not checked), a question_theme_name of another question type, language codes (each once, none equal to the base language), survey.format, survey.expires (a real date and time), XML-forbidden characters and embedded data URIs. A text is one string (for every language) or a map per language; the map must name exactly the languages of the survey (a default value may name fewer); an empty question, subquestion or answer text is a warning. An attribute takes a map when it is stored per language (prefix, suffix, ...) or when no question theme lists it (a plugin attribute), not when it is known to be language independent. default is refused on questions with subquestions and on types R and |. An entry of a Ranking question may have a code of up to 20 characters and a relevance only on LimeSurvey 7: without survey_id this is a warning, with survey_id and kind group or question the version of the instance decides. Without survey_id nothing is sent to LimeSurvey and skipped_checks lists the checks that need the survey (for kind survey the languages come from the spec itself); with survey_id the tool reads the survey (read methods only) and also reports question codes that already exist in it and holds language maps to its languages. The types with a second scale are checked with their scale_id: type 1 needs subquestions (scale 0) and answers on scale 0 and 1, the types : and ; need subquestions on scale 0 (rows) and 1 (columns) and take no answers; codes are unique per scale; scale_id 1 elsewhere and default values on these three types are errors. The tool does not create or change anything; limesurvey_create_survey_from_spec creates a survey from a valid survey spec and limesurvey_get_survey_spec reads a survey, group or question as a spec.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | What the spec describes: survey (default), group or question. | survey |
| spec | Yes | The survey description. Its fields depend on kind; unknown fields are reported by the check, not rejected. | |
| survey_id | No | Optional ID of an existing survey; for kind group and question its existing question codes are checked as well. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/non-destructive, but the description adds substantial context beyond them: it never creates or changes anything, reads via read methods only when survey_id is given, truncates errors/warnings at 200 entries and further to LIMESURVEY_MAX_RESPONSE_CHARS with truncated/errors_total flags, and lists what skipped_checks reports. This is rich behavioral detail not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose, and most sentences carry genuine validation rules, but the bulk is a single dense paragraph with no visual structure, making it hard to scan. For a tool this complex, more chunking would help, but nothing is obviously expendable filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested schema, output schema, and the intricate validation scope, the description covers the operating modes, truncation behavior, path conventions, and check coverage thoroughly. An agent has everything needed to call it correctly for any kind value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real semantic depth beyond the schema: the meaning of kind values, the map-vs-string language rules, default restrictions on subquestion/R/| types, and scale_id semantics (types 1, :, ; and their scale 0/1 requirements). It goes past restating field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Check a survey description (spec) and report every problem at once.' It explicitly distinguishes itself from siblings, naming limesurvey_create_survey_from_spec (which creates a survey from a valid spec) and limesurvey_get_survey_spec (which reads a spec), and clarifies it creates or changes nothing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance and alternatives: use this to validate before creating, use create_survey_from_spec to create, use get_survey_spec to read. It also details the survey_id conditional behavior (with survey_id it reads the survey and checks existing codes; without it, nothing is sent and skipped_checks lists deferred checks), so the agent knows the two operating modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_validate_survey_themeValidate a generated LimeSurvey survey themeARead-onlyIdempotent
Validate a ZIP inside LIMESURVEY_THEME_DIR against the LimeSurvey 7.5.1 import: valid=true means LimeSurvey imports and uses the package. errors cover archive safety (more than 1000 entries, unsafe paths, size limits, CRC-32 mismatches, content signatures of images and fonts; the archive checks stop before anything is decompressed) and real import obstacles (installed name from the ZIP file name over 45 characters or with other characters, files the import would silently skip, a config.xml that is not well-formed or not at the root, a missing metadata/title or views/ directory). Warnings starting with "policy:" mark what LimeSurvey accepts but the generator does not produce, for example JavaScript, Twig templates, a parent other than vanilla, a missing css/mcp-theme.css, LICENSE.txt or GPL license, more than 50 entries, or external URLs in CSS; review them before the import. Returns installed_theme_name.
| Name | Required | Description | Default |
|---|---|---|---|
| file_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent read, and the description adds substantial value beyond them: what valid=true means, the exact error families (archive safety, oversized names, malformed config.xml, missing metadata/views), the fact that archive checks stop before decompression, and the semantics of 'policy:'-prefixed warnings. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the pass/fail contract before the long catalogue of checks, and every clause carries distinct information. The single dense paragraph is information-rich but would scan better as a short list; no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a validator whose annotations cover safety and whose output schema covers return shape, the description supplies everything else an agent needs: what 'valid' means, the classes of failure, which conditions are fatal vs policy warnings, and the supplementary returned field. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 0% schema description coverage, the description compensates by locating the input ('a ZIP inside LIMESURVEY_THEME_DIR'), which is the key semantic the bare schema string 'file_name' lacks. It stops short of stating the extension or naming conventions expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (a generated LimeSurvey survey theme ZIP in LIMESURVEY_THEME_DIR), and immediately defines the output semantics (valid=true means LimeSurvey imports and uses the package). This clearly separates it from generate_survey_theme, which produces the package, and assign_survey_theme, which applies it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes context and sequencing — it is the pre-import gate, and warnings should be 'reviewed before the import.' It does not explicitly name generate_survey_theme/assign_survey_theme as the alternatives, so the routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
limesurvey_verify_survey_against_lssCompare a survey with a .lss fileARead-onlyIdempotent
Read-only comparison of the live survey with a LimeSurvey structure file (.lss). The file must be inside LIMESURVEY_IMPORT_DIR (LIMESURVEY_EXPORT_DIR as a fallback; same path check and size limit as import_data_path). The live survey is read with list_groups, list_questions and get_question_properties only, so read access to the survey content is enough; without a language the base language is taken from list_groups. Groups (name and order), questions (code, type, mandatory, relevance, other, text, help, position), subquestions, answer options and question attributes are matched by code, never by ID, because IDs change on import. Returns { survey_id, lss_file, language, summary { groups, questions, subquestions, answers, attributes { missing_in_live, extra_in_live, changed } }, differences [{ kind, group, question, item, field, lss, live }], differences_total, truncated, limitations }. At most 500 differences are listed; truncated=true says more exist and differences_total holds the full number. limitations names what is not compared (conditions, quotas, assessments, ...). language defaults to the base language of the live survey. Use it to check an import or a hand-edited survey against its source file.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language code to compare; default: base language of the live survey. | |
| lss_path | Yes | Path of the .lss file inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR). | |
| survey_id | Yes | Numeric LimeSurvey survey ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| workflow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/non-destructive), it discloses that the survey is read only via list_groups/list_questions/get_question_properties, that read access suffices, that matching is by code never ID, that only 500 differences are listed with truncated/differences_total semantics, and that limitations names what is not compared. This is rich behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and preconditions, then structured constraints. It is dense but every clause carries information. The full return-value enumeration is somewhat redundant given an output schema exists, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema already present, the description still supplies the path constraints, comparison basis (by code), truncation behavior, and limitation disclosure. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: the same path check and size limit as import_data_path for lss_path, and the base-language fallback behavior for language. It enriches parameter interpretation rather than merely repeating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare/verify) and two resources (the live survey and a .lss structure file). It is clearly distinguishable from siblings like validate_spec, get_survey_spec, or import_survey, which operate on different artifacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case: 'Use it to check an import or a hand-edited survey against its source file.' It also specifies the file-location precondition. It stops short of naming an alternative tool or stating when NOT to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
71 tool updates
v1.6.0- Changed
limesurvey_activate_survey1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_activate_tokens1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_add_group1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_add_group_from_spec - Changed
limesurvey_add_language1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_add_participants1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_add_question_from_spec - Changed
limesurvey_add_quota1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_add_response1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_add_survey1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_assign_survey_theme2 fields changed- changed
Input schema / properties / theme_name / descriptionPrevious value: -"Unique LimeSurvey theme and folder name, for example acme_feedback."New value: +"Installed LimeSurvey theme name as shown in the theme list, for example acme_feedback-100-ls7 (installed_theme_name of limesurvey_generate_survey_theme) or a core theme such as vanilla." - changed
Input schema / properties / theme_name / patternPrevious value: -"^[a-z][a-z0-9_]{2,63}$"New value: +"^[A-Za-z0-9][A-Za-z0-9_-]{0,44}$"
- Changed
limesurvey_copy_survey1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_cpd_importParticipants1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_create_survey_from_spec - Changed
limesurvey_delete_group1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_delete_language1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_delete_participants1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_delete_question1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_delete_quota1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_delete_response1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_delete_survey1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_export_responses1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_export_responses_by_token1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_export_statistics1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_export_timeline1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_generate_survey_theme2 fields changed- changed
Input schema / properties / author_email / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - changed
Input schema / properties / theme_name / descriptionPrevious value: -"Unique LimeSurvey theme and folder name, for example acme_feedback."New value: +"Base name of the theme package, for example acme_feedback. LimeSurvey installs the package as installed_theme_name: <theme_name>-<theme_version without dots>-ls<major>, at most 45 characters."
- Changed
limesurvey_get_available_site_settings1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_fieldmap1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_group_properties2 fields changed- added
Input schema / properties / survey_idAdded value: +{ + "description": "Optional survey ID the group is expected to belong to. MCP-only: it is never sent to LimeSurvey; the server compares it with the sid of the result (reading sid with one extra request when the result has none) and fails with a *_SURVEY_MISMATCH error when they differ.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_language_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_participant_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_get_participant_table_status - Changed
limesurvey_get_question_properties2 fields changed- added
Input schema / properties / survey_idAdded value: +{ + "description": "Optional survey ID the question is expected to belong to. MCP-only: it is never sent to LimeSurvey; the server compares it with the sid of the result (reading sid with one extra request when the result has none) and fails with a *_SURVEY_MISMATCH error when they differ.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_quota_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_response_ids1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_session_key1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_site_settings1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_summary1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_get_survey_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_get_survey_spec - Changed
limesurvey_get_theme_publication_guide1 field changed- changed
Input schema / properties / theme_name / descriptionPrevious value: -"Unique LimeSurvey theme and folder name, for example acme_feedback."New value: +"Base name of the theme package, for example acme_feedback. LimeSurvey installs the package as installed_theme_name: <theme_name>-<theme_version without dots>-ls<major>, at most 45 characters."
- Changed
limesurvey_get_uploaded_files1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_import_group1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_import_question1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_import_survey1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_invite_participants8 fields changed- changed
Input schema / properties / confirm_send_email / descriptionPrevious value: -"Required acknowledgement that email may be sent to participants."New value: +"Required acknowledgement that email may be sent to participants; not needed with dry_run=true." - changed
Input schema / properties / continue_on_error / descriptionPrevious value: -"Continue after individual email errors."New value: +"Continue after a participant whose validity window (validfrom/validuntil) fails; by default LimeSurvey stops at the first one." - added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "description": "MCP-only, never sent to LimeSurvey. true: send nothing and do not call invite_participants; read the participants (list_participants) and report who would receive an invitation and why the others would not. Allowed under every write scope; confirm_send_email is not needed.", + "type": "boolean" +} - changed
Input schema / properties / send_email / descriptionPrevious value: -"Actually send invitation emails."New value: +"Which participants get an email. true (default): invite only participants who were not invited yet (sent = N or empty). false: resend the invitation ONLY to participants who are already invited (sent holds a date) - it does not turn the sending off. Emails are sent in both cases. To see who would be mailed without sending, use dry_run=true." - added
Input schema / properties / server_utc_offset_minutesAdded value: +{ + "description": "MCP-only, never sent to LimeSurvey. UTC offset of the LimeSurvey server's local time in minutes (for example 120 for UTC+2). validfrom and validuntil are stored without a zone in that local time; without this value the timezone of the MCP host is assumed (reported as time_basis.offset_source).", + "maximum": 840, + "minimum": -840, + "type": "integer" +} - changed
Input schema / properties / token_ids / descriptionPrevious value: -"Optional participant row IDs; null selects eligible participants."New value: +"Optional participant row IDs; null (or an empty list) selects eligible participants." - changed
Input schema / requiredPrevious value: -[ - "survey_id", - "confirm_send_email" -]New value: +[ + "survey_id" +] - added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_filtered_participants1 field changed- added
Input schema / properties / offset / descriptionAdded value: +"Passed to LimeSurvey as list_participants start: a lower bound for the participant row ID (tid >= offset), not a row offset. Page with the last tid + 1."
- Changed
limesurvey_list_groups1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_participants2 fields changed- changed
Input schema / properties / start / descriptionPrevious value: -"Zero-based result offset."New value: +"Lower bound for the participant row ID (tid): LimeSurvey returns rows with tid >= start, ordered by tid. It is not a row offset; page with the last tid + 1." - added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_questions1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_quotas1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_survey_groups1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_surveys1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_list_users1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_mail_registered_participants1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_release_session_key1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_remind_participants1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_replace_question - Changed
limesurvey_set_group_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_set_language_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_set_participant_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_set_question_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_set_quota_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Changed
limesurvey_set_survey_properties1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_update_question_from_spec - Changed
limesurvey_update_response1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_update_survey_texts - Changed
limesurvey_upload_file1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "$ref": "#/definitions/__schema0" + }, + "type": "array" +}
- Added
limesurvey_validate_participants - Added
limesurvey_validate_spec - Added
limesurvey_verify_survey_against_lss
71 tool updates
v1.3.1- First observed
limesurvey_activate_survey - First observed
limesurvey_activate_tokens - First observed
limesurvey_add_group - First observed
limesurvey_add_language - First observed
limesurvey_add_participant - First observed
limesurvey_add_participants - First observed
limesurvey_add_quota - First observed
limesurvey_add_response - First observed
limesurvey_add_survey - First observed
limesurvey_assign_survey_theme - First observed
limesurvey_copy_survey - First observed
limesurvey_cpd_importParticipants - First observed
limesurvey_delete_group - First observed
limesurvey_delete_language - First observed
limesurvey_delete_participants - First observed
limesurvey_delete_question - First observed
limesurvey_delete_quota - First observed
limesurvey_delete_response - First observed
limesurvey_delete_survey - First observed
limesurvey_export_responses - First observed
limesurvey_export_responses_by_token - First observed
limesurvey_export_responses_by_token_to_file - First observed
limesurvey_export_responses_to_file - First observed
limesurvey_export_statistics - First observed
limesurvey_export_statistics_to_file - First observed
limesurvey_export_survey_to_file - First observed
limesurvey_export_timeline - First observed
limesurvey_find_surveys - First observed
limesurvey_generate_survey_theme - First observed
limesurvey_get_available_site_settings - First observed
limesurvey_get_fieldmap - First observed
limesurvey_get_group_properties - First observed
limesurvey_get_instance_info - First observed
limesurvey_get_language_properties - First observed
limesurvey_get_participant_properties - First observed
limesurvey_get_question_properties - First observed
limesurvey_get_quota_properties - First observed
limesurvey_get_response_ids - First observed
limesurvey_get_session_key - First observed
limesurvey_get_site_settings - First observed
limesurvey_get_summary - First observed
limesurvey_get_survey_languages - First observed
limesurvey_get_survey_properties - First observed
limesurvey_get_theme_publication_guide - First observed
limesurvey_get_uploaded_files - First observed
limesurvey_import_group - First observed
limesurvey_import_question - First observed
limesurvey_import_survey - First observed
limesurvey_invite_participants - First observed
limesurvey_list_filtered_participants - First observed
limesurvey_list_groups - First observed
limesurvey_list_installed_themes - First observed
limesurvey_list_participants - First observed
limesurvey_list_questions - First observed
limesurvey_list_quotas - First observed
limesurvey_list_response_export_formats - First observed
limesurvey_list_survey_groups - First observed
limesurvey_list_surveys - First observed
limesurvey_list_users - First observed
limesurvey_mail_registered_participants - First observed
limesurvey_release_session_key - First observed
limesurvey_remind_participants - First observed
limesurvey_set_group_properties - First observed
limesurvey_set_language_properties - First observed
limesurvey_set_participant_properties - First observed
limesurvey_set_question_properties - First observed
limesurvey_set_quota_properties - First observed
limesurvey_set_survey_properties - First observed
limesurvey_update_response - First observed
limesurvey_upload_file - First observed
limesurvey_validate_survey_theme
TDQS
Scored across 82 tools
The 82 tools cover many distinct operations, but several groups overlap heavily: export_responses vs export_responses_to_file, export_responses_by_token variants, add_participants vs add_participant, list_participants vs list_filtered_participants, list_surveys vs find_surveys, and multiple text-update tools (set_language_properties, update_survey_texts, update_question_from_spec). Detailed descriptions help, but the sheer number and similarity make misselection likely.
Almost all tools follow the limesurvey_ prefix and snake_case verb_noun pattern. The main deviation is limesurvey_cpd_importParticipants (camelCase) and a few compound names like get_fieldmap, but these are minor.
82 tools is far beyond the 3–15 well-scoped range and exceeds even the 50+ extreme mismatch threshold. While LimeSurvey is complex and many operations map to RemoteControl methods, the count is unwieldy for an agent and suggests insufficient consolidation.
The surface covers CRUD for surveys, groups, questions, participants, responses, and quotas, plus import/export, spec-based creation/validation, themes, and instance info. Some gaps remain (e.g., direct condition/assessment management, single-response retrieval, user/permission CRUD), but workarounds exist via spec and replace tools.
Maintenance
Related MCP Connectors
MCP server for managing FormDesigner forms, fields, logic rules, themes, and entries
MCP server for the Seline Analytics API
MCP server for lacita - appointment management software
Related MCP Servers
- AlicenseBqualityDmaintenanceA simple server that enables management of LimeSurvey surveys and responses through MCP client integration.355Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables interaction with LimeSurvey API to create and manage surveys, questions, question groups, activate surveys, and export responses through standardized MCP endpoints.-
- AlicenseNot gradedqualityFmaintenanceComprehensive MCP server for the Mautic marketing automation API, providing 203 tools for managing contacts, campaigns, emails, segments, and more.2ISC
- AlicenseBqualityDmaintenanceMCP server that exposes LimeSurvey's RemoteControl 2 JSON-RPC API as tools, enabling survey creation, activation, response export, and participant management through natural language.55MIT