Skip to main content
Glama

LimeSurvey MCP Server

npm version CI License: MIT Node.js MCP

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 confirmations

  • Session 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 inspect

Quick 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@latest

The 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.

npx prefers an existing global installation over a registry download, even a broken or outdated one, so @latest does 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 test

Option 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 -d

Compose 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

LIMESURVEY_URL

Exact RemoteControl URL, for example https://survey.example.com/index.php/admin/remotecontrol

LIMESURVEY_USERNAME

LimeSurvey service account

LIMESURVEY_PASSWORD or LIMESURVEY_PASSWORD_FILE

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 LIMESURVEY_PASSWORD is ignored with a startup warning

Important optional variables:

Variable

Default

Description

LIMESURVEY_AUTH_PLUGIN

Authdb

LimeSurvey authentication plugin

LIMESURVEY_WRITE_SCOPE

unset (= outreach, everything allowed)

none, content, lifecycle, or outreach; blocks every tool above the chosen level before any file read or RPC call (see Write Safety)

LIMESURVEY_READ_ONLY

false

true equals LIMESURVEY_WRITE_SCOPE=none; when both are set the stricter level wins and a startup warning is printed

LIMESURVEY_TIMEOUT_MS

30000

RemoteControl request timeout

LIMESURVEY_MAX_RESPONSE_CHARS

50000

Maximum inline result size

LIMESURVEY_EXPORT_DIR

unset

Dedicated output directory for decoded exports

LIMESURVEY_MAX_EXPORT_BYTES

104857600

Maximum decoded export size

LIMESURVEY_IMPORT_DIR

unset (falls back to LIMESURVEY_EXPORT_DIR)

Dedicated input directory for import_data_path reads

LIMESURVEY_MAX_IMPORT_BYTES

52428800

Maximum file size accepted via import_data_path

LIMESURVEY_THEME_DIR

unset

Dedicated output directory for generated theme ZIPs

LIMESURVEY_MAX_THEME_ASSET_BYTES

5242880

Maximum logo and theme entry size

LIMESURVEY_ENABLE_EXPERIMENTAL_METHODS

false

Enable non-standard list_response_exports

MCP_TRANSPORT

stdio

stdio or http

MCP_HTTP_HOST

127.0.0.1

Streamable HTTP bind address

MCP_HTTP_PORT

3000

Streamable HTTP port

MCP_HTTP_PATH

/mcp

Streamable HTTP endpoint

MCP_HTTP_BEARER_TOKEN

unset

Required for every non-loopback HTTP binding

MCP_HTTP_ALLOWED_HOSTS

unset

Comma-separated exact Host allowlist

MCP_HTTP_ALLOWED_ORIGINS

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@latest

content 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 start
  • MCP endpoint: http://127.0.0.1:3000/mcp

  • Health 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 legacy READONLY_MODE=true) equals none.

  • 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, content is usually the right level.

Write scope

Tools

none (allowed under every scope)

limesurvey_get_session_key, limesurvey_release_session_key, limesurvey_get_available_site_settings, limesurvey_get_site_settings, limesurvey_get_survey_properties, limesurvey_export_statistics, limesurvey_export_timeline, limesurvey_get_summary, limesurvey_get_language_properties, limesurvey_get_group_properties, limesurvey_get_question_properties, limesurvey_get_participant_properties, limesurvey_list_participants, limesurvey_list_groups, limesurvey_list_questions, limesurvey_list_quotas, limesurvey_get_quota_properties, limesurvey_list_surveys, limesurvey_list_survey_groups, limesurvey_list_users, limesurvey_export_responses, limesurvey_export_responses_by_token, limesurvey_get_response_ids, limesurvey_get_uploaded_files, limesurvey_get_fieldmap, limesurvey_find_surveys, limesurvey_get_survey_languages, limesurvey_list_filtered_participants, limesurvey_get_participant_table_status, limesurvey_validate_participants, limesurvey_list_response_export_formats, limesurvey_get_instance_info, limesurvey_list_installed_themes, limesurvey_validate_spec, limesurvey_get_survey_spec; local-only tools that read the instance and write only into their configured directory: limesurvey_export_responses_to_file, limesurvey_export_responses_by_token_to_file, limesurvey_export_statistics_to_file, limesurvey_export_survey_to_file, limesurvey_verify_survey_against_lss, limesurvey_generate_survey_theme, limesurvey_validate_survey_theme, limesurvey_get_theme_publication_guide

content

limesurvey_import_survey, limesurvey_import_group, limesurvey_import_question, limesurvey_add_survey, limesurvey_copy_survey, limesurvey_add_group, limesurvey_add_language, limesurvey_add_quota, limesurvey_set_survey_properties, limesurvey_set_language_properties, limesurvey_set_group_properties, limesurvey_set_question_properties, limesurvey_set_quota_properties, limesurvey_assign_survey_theme, limesurvey_replace_question, limesurvey_create_survey_from_spec, limesurvey_add_question_from_spec, limesurvey_add_group_from_spec, limesurvey_update_question_from_spec, limesurvey_update_survey_texts

lifecycle

limesurvey_activate_survey, limesurvey_activate_tokens, limesurvey_delete_survey, limesurvey_delete_group, limesurvey_delete_question, limesurvey_delete_language, limesurvey_delete_quota

outreach

limesurvey_add_participant, limesurvey_add_participants, limesurvey_set_participant_properties, limesurvey_delete_participants, limesurvey_invite_participants, limesurvey_remind_participants, limesurvey_mail_registered_participants, limesurvey_cpd_importParticipants, limesurvey_add_response, limesurvey_update_response, limesurvey_delete_response, limesurvey_upload_file

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 delete_* tools

confirm_destructive_action=true

Participant email tools

confirm_send_email=true (not needed for limesurvey_invite_participants with dry_run=true)

Survey activation

confirm_activation=true

Replacing an export or theme ZIP

overwrite=true and confirm_overwrite=true

Assigning a survey theme

confirm_theme_assignment=true

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, and set_participant_properties. The error has code: "FIELD_NOT_WRITABLE" and, on the top level next to message, hint_code: "NOT_WRITABLE_VIA_REMOTECONTROL", a hint with 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), and writable_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 in warnings (ignored_fields, or failed_fields for fields LimeSurvey reported as not saved).

  • Localized texts are routed safely. question, help, and script (questions) and group_name and description (groups) are moved into questionl10ns[<language>] / questiongroupl10ns[<language>], using data.language (questions also the language parameter). Without a language the call fails with LANGUAGE_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, and ERR_NO_DATA carry hint_code NOT_WRITABLE_VIA_REMOTECONTROL (writes), NO_PARTICIPANT_TABLE / NO_RESPONSE_TABLE (get_summary), or NO_DATA (everything else) plus a method-specific hint.

  • More error shapes are detected. An object in status (set_participant_properties validation errors) and {success: false, message} (set_quota_properties) now raise errors; error_code is 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, optional details) with the reasons completed, missing_token, missing_email, already_invited (send_email=true, participant was invited) or not_invited_yet (send_email=false), emailstatus_not_ok (the value is in details), invalid_email_address, not_valid_yet (validfrom is after the server time), expired (validuntil is before it), not_selected (token_ids set, tid not in it; these participants are only counted, never listed one by one), and beyond_maxemails (only when maxemails could be read);

  • without continue_on_error: stops_at_tid, the first participant whose validity window fails (LimeSurvey stops sending there), and not_reached;

  • warnings (blanks at the edges, duplicate addresses among the recipients), limitations, time_basis, and borderline (validity limits within 60 minutes of the server time);

  • counts with 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

limesurvey_validate_spec

none

Checks a survey, group, or question description and reports every problem at once with path (for example groups[1].questions[3].answers[0].code), message, and fix. With survey_id it also reads the target survey (read methods only) and checks codes and languages against it.

limesurvey_get_survey_spec

none

Reads a survey, one group (group_id), or one question (question_id) as a description in the format the write tools take, with ids, position, a fingerprint, unreadable (what RemoteControl cannot read), and missing_translations.

limesurvey_create_survey_from_spec

content

Validates the description before any request, generates the .lss in memory, imports it with import_survey, reads the new survey back, and reports verification { ok, differences, differences_total, truncated }.

limesurvey_add_question_from_spec

content

Inserts one question into a group of an inactive survey at position (1-based index, { "before": "<code>" } or { "after": "<code>" }; default: at the end), then reads it back and compares it with the description. acknowledge: ["fill_translation_gaps"] allows LimeSurvey to fill missing translations of other questions.

limesurvey_add_group_from_spec

content

Inserts one group with its questions into an inactive survey at position (1-based index, { "before": <group_id> } or { "after": <group_id> }; default: at the end), then reads it back and compares it.

limesurvey_update_question_from_spec

content (none with dry_run)

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.

limesurvey_update_survey_texts

content (none with dry_run)

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 P need subquestions and no answers; L ! O R need answers and no subquestions; F H need both; 1 : ; see the next point; all others need neither. other is allowed for L ! M P only.

  • Arrays with two scales: scale_id (0 or 1) marks the second scale. Type 1 (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_spec writes scale_id only 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 as SID); subquestion codes alphanumeric (at most 20, not time); 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 own relevance, on 6 such an item is rejected before anything is written. The tools tell the version with one read call (get_group_properties for 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, subquestion default) 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_headerA and 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 as bootstrap_buttons), encrypted, same_default, same_script, modulename, script, default, default_other, subquestion relevance and default, group randomization_group; the survey's yes/no settings and format also take "inherit"/"I".

  • default is allowed on question types without subquestions except R and |, subquestion default on types with subquestions except 1, : and ;, and default_other on L and ! with other; elsewhere LimeSurvey stores a default but never uses it.

  • mandatory is true, false, or "soft". expires is YYYY-MM-DD HH:MM:SS or YYYY-MM-DD (end of day).

  • Texts may use HTML entities; references that end with ; and do not stand for & < > " ' are decoded (&auml; 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 limesurvey Claude Code plugin's former Python generator; for every valid spec without language-dependent attributes the generated .lss is byte-identical (see test/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

none

The end state equals the question

Nothing is written.

texts

Only question, help, or subquestion texts change

set_question_properties with questionl10ns; also on active surveys.

columns

Only mandatory, relevance, preg, other, same_default, same_script, encrypted, question_theme_name, modulename, or the code change (inactive survey)

set_question_properties on the same question.

replace

Anything else: answers (including their texts), subquestions, attributes, default values, type, script (inactive survey)

A new question is imported from a generated .lsq at the same place, read back and compared in full; only then the old question is deleted. Any difference rolls back: the new question is deleted and the old one keeps its code. The question gets a new ID.

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 vanilla core theme instead of copying it — vanilla is the minimal official base theme shipped and installed with every LimeSurvey instance, so generated themes no longer depend on fruity_twentythree being 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:

  1. limesurvey_generate_survey_theme

  2. limesurvey_validate_survey_theme; continue only with valid=true after reviewing every policy: warning (JavaScript, @import, and external or data URLs in CSS are served to every participant)

  3. limesurvey_get_theme_publication_guide using the installed version shown in LimeSurvey

  4. Import the unrenamed ZIP with Upload & install in the theme list under Configuration > Advanced > Themes > Survey themes

  5. Test an inactive survey on phone, tablet, desktop, keyboard, zoom, RTL, and print

  6. limesurvey_assign_survey_theme with installed_theme_name and confirm_theme_assignment=true; it reads the current theme first (previous_theme), reads the template back, and fails with THEME_NOT_APPLIED when LimeSurvey kept another theme (THEME_NOT_VERIFIED when only the read-back fails, THEME_PREVIOUS_UNKNOWN without 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, and emailstatus.

  • No list of the survey's uploaded files (attachments, images). get_uploaded_files only returns files that respondents uploaded in file upload questions. get_language_properties shows which server paths the mail attachments reference.

  • No clock method. The server time is only available from the HTTP Date header (get_instance_info with probe_instance=true). The server's PHP time zone is not readable through RemoteControl. Only the timeadjust offset (hours between web server time and local time) is readable, and only by superadmins through get_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-run

The 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_path for survey, group, and question tools

  • environment preflight warnings (envPreflightWarnings)

  • capability detection (get_instance_info with and without probe_instance, list_installed_themes) and the experimental, permission-degrading export_survey_to_file tool

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:live

It 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 documentation

Compatibility

  • 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 tools
limesurvey_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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_activationYesRequired acknowledgement that survey activation changes its structure and behavior.
activation_settingsNoOptional activation settings such as anonymized, datestamp, ipaddr, ipanonymize, refurl, and savetimings.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
attribute_fieldsNoAdditional participant attribute field numbers.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
titleYesQuestion-group title.
survey_idYesNumeric LimeSurvey survey ID.
descriptionNoQuestion-group description.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
groupYesThe new group as a group spec { title, description, relevance, randomization_group, questions }.
positionNo1-based place among the groups, { before: group_id } or { after: group_id }; default: the end.
survey_idYesNumeric LimeSurvey survey ID.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
languageYesLanguage code to add.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
participantYesParticipant fields such as email, firstname, lastname, token, and attributes.
create_tokenNo

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
create_tokenNoGenerate missing participant tokens.
participantsYesParticipant records.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
group_idYesID of the group of this survey that gets the question.
positionNo1-based place in the group, { before: code } or { after: code }; default: the end of the group.
questionYesThe new question as a question spec, for example the spec of limesurvey_get_survey_spec at level question with a new code.
survey_idYesNumeric LimeSurvey survey ID.
acknowledgeNoConfirmed 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

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
urlNoQuota redirect URL.
nameYesQuota name.
limitYesMaximum responses allowed.
actionNoQuota action.
activeNoActivate the quota immediately.
messageNoQuota message.
survey_idYesNumeric LimeSurvey survey ID.
autoload_urlNoAutomatically load the quota URL.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
url_descriptionNoQuota URL label.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

B3.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
responseYesResponse fields mapped to values.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
titleYesTitle of the new survey.
formatNoQuestion display format: all, group-by-group, or single question.
languageYesBase language code for the survey.
survey_idYesDesired survey ID. Use 0 to let LimeSurvey choose.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 surveyA
Idempotent

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.

NameRequiredDescriptionDefault
survey_idYes
theme_nameYesInstalled 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_assignmentYesRequired acknowledgement that the survey appearance will change.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
new_nameYesName for the copied survey.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
source_survey_idYesID of the survey to copy.
destination_survey_idNoOptional desired ID for the copy.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
participantsYesCentral participant records.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
update_existingNoUpdate matching existing records.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
specYesThe survey description. Its fields depend on kind; unknown fields are reported by the check, not rejected.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 groupA
Destructive

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.

NameRequiredDescriptionDefault
group_idYesNumeric question-group ID.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 languageA
Destructive

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.

NameRequiredDescriptionDefault
languageYesLanguage code to remove.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 participantsA
Destructive

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
token_idsYesParticipant token-table row IDs.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 questionA
Destructive

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.

NameRequiredDescriptionDefault
question_idYesNumeric question ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 quotaA
Destructive

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.

NameRequiredDescriptionDefault
quota_idYesNumeric quota ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 responseA
Destructive

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
response_idYesNumeric response ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 surveyA
Destructive

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_destructive_actionYesRequired acknowledgement of the permanent deletion.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 responsesA
Read-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.

NameRequiredDescriptionDefault
fieldsNoOptional response fields to export.
survey_idYesNumeric LimeSurvey survey ID.
heading_typeNoColumn heading style.
document_typeYesExport type such as csv, html, pdf, xls, or json.
language_codeNoLimeSurvey language code; null uses the survey default.
response_typeNoAnswer text format.
to_response_idNoOptional last response ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
from_response_idNoOptional first response ID.
completion_statusNoCompletion filter.
additional_optionsNo

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 tokenA
Read-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.

NameRequiredDescriptionDefault
fieldsNoOptional response fields to export.
tokensYesOne participant token or a list of tokens to export.
survey_idYesNumeric LimeSurvey survey ID.
heading_typeNoColumn heading style.
document_typeYesExport type such as csv, html, pdf, xls, or json.
language_codeNoLimeSurvey language code; null uses the survey default.
response_typeNoAnswer text format.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
completion_statusNoCompletion filter.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
fieldsNo
tokensYes
file_nameNoOptional output file name without a directory.
overwriteNoAllow replacing an existing file.
survey_idYesNumeric LimeSurvey survey ID.
heading_typeNocode
document_typeYes
language_codeNoOptional LimeSurvey language code.
response_typeNoshort
completion_statusNoall
confirm_overwriteNoRequired acknowledgement when overwrite is true.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
fieldsNo
file_nameNoOptional output file name without a directory.
overwriteNoAllow replacing an existing file.
survey_idYesNumeric LimeSurvey survey ID.
heading_typeNocode
document_typeYes
language_codeNoOptional LimeSurvey language code.
response_typeNoshort
to_response_idNo
from_response_idNo
completion_statusNoall
confirm_overwriteNoRequired acknowledgement when overwrite is true.
additional_optionsNo

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 statisticsA
Read-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.

NameRequiredDescriptionDefault
languageNoLimeSurvey language code; null uses the survey default.
group_idsNoOptional group ID or list of group IDs.
survey_idYesNumeric LimeSurvey survey ID.
document_typeNoStatistics document type.
include_graphsNoWhether to include graphs.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
languageNoOptional LimeSurvey language code.
file_nameNoOptional output file name without a directory.
group_idsNo
overwriteNoAllow replacing an existing file.
survey_idYesNumeric LimeSurvey survey ID.
document_typeNopdf
include_graphsNo0
confirm_overwriteNoRequired acknowledgement when overwrite is true.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
file_nameNoOptional output file name without a directory.
overwriteNoAllow replacing an existing file.
survey_idYesNumeric LimeSurvey survey ID.
document_typeNoStructure export format.lss
confirm_overwriteNoRequired acknowledgement when overwrite is true.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 timelineA
Read-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.

NameRequiredDescriptionDefault
endYesEnd date/time accepted by LimeSurvey.
startYesStart date/time accepted by LimeSurvey.
periodYesTimeline aggregation period.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 surveysA
Read-onlyIdempotent

Find visible surveys by ID or title with bounded client-side pagination.

NameRequiredDescriptionDefault
limitNo
queryNoCase-insensitive survey ID or title fragment.
offsetNo

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
titleYesHuman-readable title shown in LimeSurvey.
authorNoLimeSurvey MCP user
densityNocomfortable
overwriteNo
author_urlNo
font_styleNosystem
text_colorNo#1F2933
theme_nameYesBase 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.
descriptionNoResponsive survey theme generated with LimeSurvey MCP.
focus_colorNo#005FCC
logo_base64NoOptional base64 PNG or JPEG logo without a data URL prefix.
accent_colorNo#C84B31
author_emailNo
primary_colorNo#0B6B57
surface_colorNo#FFFFFF
theme_versionNo1.0.0
logo_file_typeNo
background_colorNo#F5F7F6
corner_radius_pxNo
muted_text_colorNo#52606D
confirm_overwriteNo
content_max_width_pxNo
target_limesurvey_majorNo7

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 settingsA
Read-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.

NameRequiredDescriptionDefault
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 mapA
Read-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.

NameRequiredDescriptionDefault
languageNoLimeSurvey language code; null uses the survey default.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 propertiesA
Read-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.

NameRequiredDescriptionDefault
group_idYesNumeric question-group ID.
languageNoLimeSurvey language code; null uses the survey default.
survey_idNoOptional 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.
propertiesNoProperties to return for the question group; null returns all available properties.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 infoA
Read-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.

NameRequiredDescriptionDefault
probe_instanceNoAlso call list_surveys and get_site_settings to probe live connectivity, auth, and version/permission level.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 propertiesA
Read-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.

NameRequiredDescriptionDefault
languageNoLimeSurvey language code; null uses the survey default.
survey_idYesNumeric LimeSurvey survey ID.
propertiesNoProperties to return for the survey language; null returns all available properties.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 propertiesA
Read-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.

NameRequiredDescriptionDefault
queryYesParticipant lookup properties, such as token or tid.
survey_idYesNumeric LimeSurvey survey ID.
propertiesNoProperties to return for the participant; null returns all available properties.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 statusA
Read-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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 propertiesA
Read-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.

NameRequiredDescriptionDefault
languageNoLimeSurvey language code; null uses the survey default.
survey_idNoOptional 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.
propertiesNoProperties to return for the question; null returns all available properties.
question_idYesNumeric question ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 propertiesA
Read-onlyIdempotent

Read selected quota properties.

Calls LimeSurvey RemoteControl method get_quota_properties. Authentication uses the configured service account; do not provide a session key.

NameRequiredDescriptionDefault
languageNoLimeSurvey language code; null uses the survey default.
quota_idYesNumeric quota ID.
propertiesNoProperties to return for the quota; null returns all available properties.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 IDsA
Read-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.

NameRequiredDescriptionDefault
tokenYesParticipant token.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 settingB
Read-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.

NameRequiredDescriptionDefault
setting_nameYesGlobal setting name.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

B3.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 summaryA
Read-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.

NameRequiredDescriptionDefault
statisticNoSummary statistic to return.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 languagesA
Read-onlyIdempotent

Return the base and additional language codes configured for a survey.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 propertiesA
Read-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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
propertiesNoProperties to return for the survey; null returns all available properties.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 descriptionA
Read-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.

NameRequiredDescriptionDefault
group_idNoOptional ID of a group of this survey: read this group only.
survey_idYesNumeric LimeSurvey survey ID.
question_idNoOptional ID of a main question of this survey: read this question only.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 instructionsA
Read-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.

NameRequiredDescriptionDefault
hostingYes
theme_nameYesBase 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_nameYesGenerated ZIP file name.
publication_scopeNoinstance
installed_limesurvey_versionYesVersion shown in the LimeSurvey administration footer.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 filesA
Read-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.

NameRequiredDescriptionDefault
tokenYesParticipant token.
survey_idYesNumeric LimeSurvey survey ID.
response_idNoOptional response ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
import_dataNoBase64-encoded group file contents; omit when using import_data_path.
new_group_nameNoOptional replacement group name.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
import_data_pathNoLocal 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_typeYesImport type supported by the LimeSurvey instance, normally lsg.
new_group_descriptionNoOptional replacement group description.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
group_idYesNumeric question-group ID.
mandatoryNoWhether the imported question is mandatory.
survey_idYesNumeric LimeSurvey survey ID.
import_dataNoBase64-encoded question file contents; omit when using import_data_path.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
import_data_pathNoLocal 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_typeYesImport type supported by the LimeSurvey instance, normally lsq.
new_question_helpNoOptional replacement help text.
new_question_textNoOptional replacement question text.
new_question_titleNoOptional replacement question code/title.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
import_dataNoBase64-encoded survey file contents; omit when using import_data_path.
new_survey_nameNoOptional replacement survey name.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
import_data_pathNoLocal 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_typeYesImport file type.
destination_survey_idNoOptional desired ID for the imported survey.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dry_runNoMCP-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_idYesNumeric LimeSurvey survey ID.
token_idsNoOptional participant row IDs; null (or an empty list) selects eligible participants.
send_emailNoWhich 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_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
continue_on_errorNoContinue after a participant whose validity window (validfrom/validuntil) fails; by default LimeSurvey stops at the first one.
confirm_send_emailNoRequired acknowledgement that email may be sent to participants; not needed with dry_run=true.
server_utc_offset_minutesNoMCP-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

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 participantsB
Read-onlyIdempotent

List participant rows with explicit filters, selected fields, and bounded pagination.

NameRequiredDescriptionDefault
limitNo
offsetNoPassed 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.
unusedNo
survey_idYesNumeric LimeSurvey survey ID.
attributesNo
conditionsNo

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 groupsA
Read-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.

NameRequiredDescriptionDefault
languageNoLimeSurvey language code; null uses the survey default.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)A
Read-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.

NameRequiredDescriptionDefault
survey_scan_limitNoMaximum number of visible surveys to inspect for their assigned theme.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 participantsA
Read-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.

NameRequiredDescriptionDefault
limitNoMaximum participants to return.
startNoLower 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.
unusedNoReturn only unused participants.
survey_idYesNumeric LimeSurvey survey ID.
attributesNoFields to return, or false for defaults.
conditionsNoParticipant filter conditions as an object or positional condition list.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 questionsA
Read-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.

NameRequiredDescriptionDefault
group_idNoOptional question-group ID.
languageNoLimeSurvey language code; null uses the survey default.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 quotasA
Read-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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 formatsA
Read-onlyIdempotent

Call the optional list_response_exports LimeSurvey extension to discover plugin-aware export formats.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 groupsA
Read-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.

NameRequiredDescriptionDefault
usernameNoOptional administration username; null uses the current service account.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 surveysA
Read-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.

NameRequiredDescriptionDefault
usernameNoOptional administration username; null uses the current service account.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
survey_group_idNoOptional survey-group ID.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 usersA
Read-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.

NameRequiredDescriptionDefault
user_idNoOptional administration user ID.
usernameNoOptional administration username.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
confirm_send_emailYesRequired acknowledgement that email may be sent to participants.
override_conditionsNoReplacement email conditions as an object or positional condition list.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
token_idsNoParticipant row IDs, or false for eligible participants.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json
continue_on_errorNoContinue after individual email errors.
maximum_remindersNoMaximum reminders per participant.
confirm_send_emailYesRequired acknowledgement that email may be sent to participants.
minimum_days_betweenNoMinimum days since the previous reminder.

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 fileA
Destructive

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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
import_dataNoBase64-encoded .lsq file contents for small files; omit when using import_data_path.
question_idYesID of the main question to replace; it must belong to survey_id.
import_data_pathNoPath of the .lsq file inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR as a fallback).
import_data_typeNoImport type; only lsq.lsq
confirm_destructive_actionYesRequired acknowledgement that the old question is deleted permanently.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
dataYesGroup property names mapped to new values.
group_idYesNumeric question-group ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataYesLocalized property names mapped to new values.
languageNoLimeSurvey language code; null uses the survey default.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataYesParticipant properties to update.
queryYesParticipant lookup properties.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataYesQuestion property names mapped to new values.
languageNoLimeSurvey language code; null uses the survey default.
question_idYesNumeric question ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
dataYesQuota properties to update.
quota_idYesNumeric quota ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataYesSurvey property names mapped to new values.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 stateA
Destructive

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).

NameRequiredDescriptionDefault
dry_runNotrue: only show mode, changes, risks and plan; nothing is written (default false).
questionYesThe end state of the question as a question spec, for example the spec of limesurvey_get_survey_spec at level question, changed.
survey_idYesNumeric LimeSurvey survey ID.
acknowledgeNoConfirmed 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_idYesID of the main question of this survey to change.
expected_fingerprintNoThe fingerprint of the question as read (limesurvey_get_survey_spec or a dry run); required unless dry_run is true.
confirm_destructive_actionNoMust be true for a real run (dry_run not true): a replacement deletes the old question.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
responseYesResponse fields, including the response ID, mapped to new values.
survey_idYesNumeric LimeSurvey survey ID.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 surveyA
DestructiveIdempotent

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).

NameRequiredDescriptionDefault
textsYesThe texts to set.
dry_runNotrue: only show the changes; nothing is written (default false).
survey_idYesNumeric LimeSurvey survey ID.
expected_fingerprintNoThe fingerprint of a dry run: the call stops with STALE_SPEC if a text changed since.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
file_nameYesOriginal file name.
survey_idYesNumeric LimeSurvey survey ID.
field_nameYesSurvey response field name.
file_contentYesBase64-encoded file contents.
response_formatNoOutput format. JSON preserves the complete structured result; Markdown is optimized for reading.json

Output Schema

NameRequiredDescription
methodYes
resultYes
warningsNo
truncatedNo
truncation_messageNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 participantsA
Read-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.

NameRequiredDescriptionDefault
survey_idYesNumeric LimeSurvey survey ID.
server_utc_offset_minutesNoMCP-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

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 descriptionA
Read-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.

NameRequiredDescriptionDefault
kindNoWhat the spec describes: survey (default), group or question.survey
specYesThe survey description. Its fields depend on kind; unknown fields are reported by the check, not rejected.
survey_idNoOptional ID of an existing survey; for kind group and question its existing question codes are checked as well.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 themeA
Read-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.

NameRequiredDescriptionDefault
file_nameYes

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 fileA
Read-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.

NameRequiredDescriptionDefault
languageNoLanguage code to compare; default: base language of the live survey.
lss_pathYesPath of the .lss file inside LIMESURVEY_IMPORT_DIR (or LIMESURVEY_EXPORT_DIR).
survey_idYesNumeric LimeSurvey survey ID.

Output Schema

NameRequiredDescription
resultYes
workflowYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 71 tool updatesv1.6.0
    • Changedlimesurvey_activate_survey1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_activate_tokens1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_add_group1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_add_group_from_spec
    • Changedlimesurvey_add_language1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_add_participants1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_add_question_from_spec
    • Changedlimesurvey_add_quota1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_add_response1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_add_survey1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_assign_survey_theme2 fields changed
      • changedInput schema / properties / theme_name / description
        Previous 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."
      • changedInput schema / properties / theme_name / pattern
        Previous value: -"^[a-z][a-z0-9_]{2,63}$"New value: +"^[A-Za-z0-9][A-Za-z0-9_-]{0,44}$"
    • Changedlimesurvey_copy_survey1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_cpd_importParticipants1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_create_survey_from_spec
    • Changedlimesurvey_delete_group1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_delete_language1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_delete_participants1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_delete_question1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_delete_quota1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_delete_response1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_delete_survey1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_export_responses1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_export_responses_by_token1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_export_statistics1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_export_timeline1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_generate_survey_theme2 fields changed
      • changedInput schema / properties / author_email / pattern
        Previous 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,}$"
      • changedInput schema / properties / theme_name / description
        Previous 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."
    • Changedlimesurvey_get_available_site_settings1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_fieldmap1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_group_properties2 fields changed
      • addedInput schema / properties / survey_id
        Added 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"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_language_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_participant_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_get_participant_table_status
    • Changedlimesurvey_get_question_properties2 fields changed
      • addedInput schema / properties / survey_id
        Added 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"
        +}
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_quota_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_response_ids1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_session_key1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_site_settings1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_summary1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_get_survey_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_get_survey_spec
    • Changedlimesurvey_get_theme_publication_guide1 field changed
      • changedInput schema / properties / theme_name / description
        Previous 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."
    • Changedlimesurvey_get_uploaded_files1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_import_group1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_import_question1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_import_survey1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_invite_participants8 fields changed
      • changedInput schema / properties / confirm_send_email / description
        Previous 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."
      • changedInput schema / properties / continue_on_error / description
        Previous 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."
      • addedInput schema / properties / dry_run
        Added 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"
        +}
      • changedInput schema / properties / send_email / description
        Previous 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."
      • addedInput schema / properties / server_utc_offset_minutes
        Added 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"
        +}
      • changedInput schema / properties / token_ids / description
        Previous value: -"Optional participant row IDs; null selects eligible participants."New value: +"Optional participant row IDs; null (or an empty list) selects eligible participants."
      • changedInput schema / required
        Previous value: -[
        -  "survey_id",
        -  "confirm_send_email"
        -]New value: +[
        +  "survey_id"
        +]
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_filtered_participants1 field changed
      • addedInput schema / properties / offset / description
        Added 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."
    • Changedlimesurvey_list_groups1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_participants2 fields changed
      • changedInput schema / properties / start / description
        Previous 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."
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_questions1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_quotas1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_survey_groups1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_surveys1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_list_users1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_mail_registered_participants1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_release_session_key1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_remind_participants1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_replace_question
    • Changedlimesurvey_set_group_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_set_language_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_set_participant_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_set_question_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_set_quota_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Changedlimesurvey_set_survey_properties1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_update_question_from_spec
    • Changedlimesurvey_update_response1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_update_survey_texts
    • Changedlimesurvey_upload_file1 field changed
      • addedOutput schema / properties / warnings
        Added value: +{
        +  "items": {
        +    "$ref": "#/definitions/__schema0"
        +  },
        +  "type": "array"
        +}
    • Addedlimesurvey_validate_participants
    • Addedlimesurvey_validate_spec
    • Addedlimesurvey_verify_survey_against_lss
  2. 71 tool updatesv1.3.1
    • First observedlimesurvey_activate_survey
    • First observedlimesurvey_activate_tokens
    • First observedlimesurvey_add_group
    • First observedlimesurvey_add_language
    • First observedlimesurvey_add_participant
    • First observedlimesurvey_add_participants
    • First observedlimesurvey_add_quota
    • First observedlimesurvey_add_response
    • First observedlimesurvey_add_survey
    • First observedlimesurvey_assign_survey_theme
    • First observedlimesurvey_copy_survey
    • First observedlimesurvey_cpd_importParticipants
    • First observedlimesurvey_delete_group
    • First observedlimesurvey_delete_language
    • First observedlimesurvey_delete_participants
    • First observedlimesurvey_delete_question
    • First observedlimesurvey_delete_quota
    • First observedlimesurvey_delete_response
    • First observedlimesurvey_delete_survey
    • First observedlimesurvey_export_responses
    • First observedlimesurvey_export_responses_by_token
    • First observedlimesurvey_export_responses_by_token_to_file
    • First observedlimesurvey_export_responses_to_file
    • First observedlimesurvey_export_statistics
    • First observedlimesurvey_export_statistics_to_file
    • First observedlimesurvey_export_survey_to_file
    • First observedlimesurvey_export_timeline
    • First observedlimesurvey_find_surveys
    • First observedlimesurvey_generate_survey_theme
    • First observedlimesurvey_get_available_site_settings
    • First observedlimesurvey_get_fieldmap
    • First observedlimesurvey_get_group_properties
    • First observedlimesurvey_get_instance_info
    • First observedlimesurvey_get_language_properties
    • First observedlimesurvey_get_participant_properties
    • First observedlimesurvey_get_question_properties
    • First observedlimesurvey_get_quota_properties
    • First observedlimesurvey_get_response_ids
    • First observedlimesurvey_get_session_key
    • First observedlimesurvey_get_site_settings
    • First observedlimesurvey_get_summary
    • First observedlimesurvey_get_survey_languages
    • First observedlimesurvey_get_survey_properties
    • First observedlimesurvey_get_theme_publication_guide
    • First observedlimesurvey_get_uploaded_files
    • First observedlimesurvey_import_group
    • First observedlimesurvey_import_question
    • First observedlimesurvey_import_survey
    • First observedlimesurvey_invite_participants
    • First observedlimesurvey_list_filtered_participants
    • First observedlimesurvey_list_groups
    • First observedlimesurvey_list_installed_themes
    • First observedlimesurvey_list_participants
    • First observedlimesurvey_list_questions
    • First observedlimesurvey_list_quotas
    • First observedlimesurvey_list_response_export_formats
    • First observedlimesurvey_list_survey_groups
    • First observedlimesurvey_list_surveys
    • First observedlimesurvey_list_users
    • First observedlimesurvey_mail_registered_participants
    • First observedlimesurvey_release_session_key
    • First observedlimesurvey_remind_participants
    • First observedlimesurvey_set_group_properties
    • First observedlimesurvey_set_language_properties
    • First observedlimesurvey_set_participant_properties
    • First observedlimesurvey_set_question_properties
    • First observedlimesurvey_set_quota_properties
    • First observedlimesurvey_set_survey_properties
    • First observedlimesurvey_update_response
    • First observedlimesurvey_upload_file
    • First observedlimesurvey_validate_survey_theme

TDQS

B3.3/5.0

Scored across 82 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count1/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables interaction with LimeSurvey API to create and manage surveys, questions, question groups, activate surveys, and export responses through standardized MCP endpoints.
    -
  • A
    license
    Not graded
    quality
    F
    maintenance
    Comprehensive MCP server for the Mautic marketing automation API, providing 203 tools for managing contacts, campaigns, emails, segments, and more.
    2
    ISC
  • A
    license
    B
    quality
    D
    maintenance
    MCP server that exposes LimeSurvey's RemoteControl 2 JSON-RPC API as tools, enabling survey creation, activation, response export, and participant management through natural language.
    55
    MIT