kobotoolbox-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kobotoolbox-mcp-serverAnalyse les réponses du formulaire et génère un rapport Word et Excel."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kobotoolbox-mcp-server
Serveur MCP pour KoboToolbox : crée des formulaires, analyse les données collectées selon un objectif donné, et produit des livrables finis — classeur Excel analytique avec graphiques natifs, rapport Word, PDF — le tout piloté depuis une conversation Claude.
Ce que ça permet concrètement
« Analyse mon formulaire de suivi des parcelles pour identifier les régions à appuyer en priorité, et fais-moi un rapport Word et un Excel. »
Claude charge les données, les nettoie, calcule les statistiques et les croisements, rédige l'analyse, et écrit les fichiers sur ton disque.
Related MCP server: Talk2Data InsightGenius
Outils disponibles
Analyse et rapports
Outil | Description |
| Charge toutes les soumissions, les nettoie (codes → libellés, groupes aplatis, types convertis) et renvoie la liste des questions analysables + un rapport qualité |
| Statistiques descriptives par question (fréquences, moyenne, médiane, écart-type, quartiles…) |
| Tableau croisé entre deux questions (effectifs, % ligne/colonne, moyenne ou somme d'une variable numérique) |
| Lit les lignes nettoyées (utile pour les réponses en texte libre) |
| Génère les livrables : .xlsx analytique, .docx, .pdf |
Gestion des formulaires
Outil | Description |
| Liste tes formulaires |
| Détail d'un formulaire : arborescence des sections, sauts conditionnels, contraintes, langues |
| Crée un formulaire (XLSForm complet) et le déploie |
| Modification ciblée : renommer un libellé, ajouter un choix, poser un saut conditionnel — sans renvoyer tout le questionnaire |
| Remplace l'intégralité des questions (garde-fou si des données existent déjà) |
| Déploie ou redéploie un formulaire |
| Arrête la collecte sans rien supprimer (ou réactive) |
| Duplique un questionnaire pour une nouvelle vague/zone |
| Historique des versions déployées et retour arrière vers l'une d'elles |
| Télécharge le formulaire au format XLSForm |
| Téléverse un XLSForm existant (nouveau formulaire ou écrasement) |
| Suppression définitive (exige |
Diffusion et partage
Outil | Description |
| Les liens de collecte (hors ligne, en ligne, usage unique, aperçu, iframe), un QR code imprimable, et si le formulaire est réellement public |
| Active/révoque les soumissions anonymes (= rendre le lien public), et gère les collaborateurs ( |
Données collectées
Outil | Description |
| Liste brute d'une page de soumissions |
| Détail d'une soumission |
| Marque des réponses approuvées / rejetées / en attente (non destructif) |
| Supprime des réponses précises (tests, doublons, retrait demandé) |
| Récupère les photos, audios et fichiers joints aux réponses |
| Envoie une réponse par API (tester un formulaire, migrer des données papier) |
| Export Excel/CSV brut généré par Kobo |
Diagnostic
Outil | Description |
| Vérifie la connexion, le token, l'environnement Python et le dossier de sortie |
Construire un bon questionnaire
kobo_create_form expose l'essentiel de XLSForm. La liste de questions est plate : l'imbrication passe par des lignes begin_group / end_group et begin_repeat / end_repeat, qui doivent être équilibrées.
Colonne | À quoi ça sert |
| Saut conditionnel — la question n'apparaît que si l'expression est vraie : |
| Validation de la réponse : |
| Sections ; avec |
| Données répétées (une ligne par plat, par parcelle…) |
| Valeur calculée (type |
|
|
|
|
| Partager une même liste de choix entre plusieurs questions |
types | Métadonnées d'entretien (durée réelle, appareil) |
⚠️ Le type téléphone s'écrit phonenumber, pas phone_number : cette seconde orthographe fait répondre au serveur Kobo une erreur HTTP 500 sans message. Le serveur corrige l'alias automatiquement et valide toute la liste avant d'appeler Kobo — types inconnus, noms en double, groupes non fermés et listes de choix manquantes sont signalés d'un coup, avec le numéro de la question fautive.
Déployé ≠ public
Un formulaire déployé possède un lien Enketo, mais celui-ci exige une connexion Kobo tant que les soumissions anonymes ne sont pas activées :
kobo_set_sharing uid=<...> anonymous_submissions=trueLe public peut alors répondre, jamais lire les réponses déjà collectées. kobo_get_collect_links avec include_qr=true renvoie en prime le QR code à imprimer.
Ce que contient le classeur Excel généré
Synthèse — objectif, résumé exécutif, constats, recommandations, limites des données
Une feuille par section d'analyse — tableaux + graphiques Excel natifs et éditables (pas des images)
Tableaux croisés — croisements calculés avec totaux
Données nettoyées — toutes les réponses, libellées, sous forme de Tableau Excel nommé
DonneesKoboQualité des données — complétude question par question
À propos des TCD
Les croisements sont livrés sous forme de tableaux calculés, pas d'objets TableauCroiséDynamique vivants : aucune librairie open source (JS comme Python) ne sait en créer. C'est précisément pourquoi les données nettoyées sont formatées en Tableau Excel nommé — clique dedans, puis Insertion → Tableau croisé dynamique, et tu as ton TCD natif en deux clics.
Installation
1. Prérequis
Le serveur tourne sur Linux, macOS et Windows. Il lui faut trois choses :
Linux (Debian/Ubuntu) | macOS | Windows | |
Node.js ≥ 18 |
|
| |
Python 3 |
|
| python.org — coche « Add python.exe to PATH » à l'installation |
LibreOffice (export PDF uniquement) |
|
|
Puis les librairies Python du moteur de rendu :
python3 -m pip install -r requirements.txt # Linux / macOS
py -m pip install -r requirements.txt # Windowsxlsxwriter et matplotlib sont requis ; python-docx ne l'est que pour les sorties Word et PDF. L'outil kobo_doctor te dit exactement ce qui manque.
Deux pièges hors Linux, que le serveur gère seul mais qu'il vaut mieux connaître :
Sur Windows, la commande s'appelle
python, paspython3— ce dernier nom y est réservé à un raccourci qui ouvre le Microsoft Store. Le serveur choisit doncpythonpar défaut sur Windows etpython3ailleurs ;PYTHON_BINn'est à renseigner que si ton interpréteur est ailleurs (Anaconda, venv).Sur macOS et Windows, l'installeur LibreOffice ne met rien dans le
PATH. Le serveur va donc le chercher à son emplacement standard (/Applications/LibreOffice.app/…,C:\Program Files\LibreOffice\…). S'il est installé ailleurs, renseigneSOFFICE_BIN.
2. Récupérer ton token API Kobo
Connecte-toi sur https://kf.kobotoolbox.org (ou ton serveur Kobo)
Paramètres du compte → Sécurité → clé API
Copie le token
3. Configurer
npm install
npm run build
cp .env.example .env # puis renseigne KOBO_API_TOKENSous Windows,
cpexiste dans PowerShell ; dans l'invite de commandes classique, écriscopy .env.example .env.
Variables du .env :
Variable | Rôle |
| Requis. Ton token API Kobo |
|
|
| Dossier où sont écrits les rapports. Par défaut |
| Interpréteur Python qui possède les librairies. Par défaut |
| Binaire LibreOffice pour l'export PDF. Détecté automatiquement ; à renseigner seulement s'il est installé hors des emplacements standards |
| Uniquement pour le transport HTTP |
| Hôte KoboCAT pour l'envoi de données. Déduit automatiquement ; à renseigner sur une instance auto-hébergée |
| Nombre de tentatives sur throttling/erreur serveur (défaut |
| Délai initial du backoff exponentiel (défaut |
4. Brancher à Claude Code
# Linux / macOS
claude mcp add kobotoolbox --scope user -- node /chemin/absolu/vers/kobotoolbox-mcp-server/dist/index.js
# Windows (PowerShell) — chemin absolu lui aussi, avec la lettre de lecteur
claude mcp add kobotoolbox --scope user -- node C:\Users\moi\kobotoolbox-mcp-server\dist\index.jsLe chemin doit être absolu : --scope user enregistre le serveur pour tout le compte, donc Claude Code peut ensuite être lancé depuis n'importe quel dossier — sans jamais revenir dans celui du projet. Le serveur lit son .env à côté de son propre code, pas dans le répertoire courant.
Vérifie avec claude mcp list. Après toute modification du code : npm run build, puis relance Claude Code.
Utilisation
Une session d'analyse typique :
« Liste mes formulaires Kobo »
« Charge les données du formulaire X » → Claude voit les questions et la qualité des données
« Quelles régions ont le plus de parcelles en mauvais état ? » → croisements
« Fais-moi un rapport Word et Excel sur l'état sanitaire par région, avec des recommandations »
Les fichiers atterrissent dans KOBO_OUTPUT_DIR et Claude t'en donne le chemin complet.
Filtrer les données : la plupart des outils acceptent un query au format Mongo, par exemple {"region":"so"} ou {"_submission_time":{"$gte":"2026-01-01"}}.
Architecture
Le serveur ne « devine » pas l'analyse : Claude rédige le contenu (objectif, commentaires, constats, recommandations) et déclare quelles tables et quels graphiques produire ; le serveur calcule tous les chiffres depuis les soumissions réelles. Les nombres du rapport ne peuvent donc pas diverger des données.
kobotoolbox-mcp-server/
├── src/
│ ├── index.ts # point d'entrée (stdio par défaut, HTTP en option)
│ ├── constants.ts # configuration (.env résolu depuis la racine du projet)
│ ├── services/
│ │ ├── koboClient.ts # client API Kobo (retry, erreurs lisibles, pagination)
│ │ ├── formBuilder.ts # génération et validation XLSForm
│ │ ├── codebook.ts # structure du formulaire : libellés, choix, groupes
│ │ ├── dataset.ts # nettoyage, libellisation, rapport qualité
│ │ ├── analyze.ts # statistiques descriptives et tableaux croisés
│ │ ├── store.ts # cache des données (15 min) partagé entre outils
│ │ ├── reportBuilder.ts # directives du modèle -> spécification de rapport
│ │ └── renderer.ts # appel du moteur Python
│ ├── tools/ # définitions des outils MCP
│ └── schemas/ # validation Zod des entrées
├── scripts/
│ └── render_report.py # génération xlsx / docx / pdf
├── tests/ # tests unitaires (vitest)
├── requirements.txt # dépendances Python du moteur de rendu
└── out/ # livrables générés (git-ignoré)Développement
npm run build # compile TypeScript -> dist/
npm run typecheck # vérification des types sans émission
npm test # tests unitaires (vitest)
npm run test:watchNotes de sécurité
Le token API Kobo donne accès à tous tes formulaires et données. Il vit dans
.env, qui est git-ignoré — ne le committe jamais.kobo_delete_formest irréversible : il exigeconfirm: trueet, si le formulaire contient des données, le nombre exact de soumissions. Pour simplement arrêter une collecte, utilisekobo_archive_form.kobo_set_sharingavecanonymous_submissions=truerend le formulaire remplissable par quiconque possède le lien. Confirme-le avec l'utilisateur avant de l'activer.Le serveur ne conserve rien sur disque hormis les rapports que tu demandes ; les données en mémoire expirent après 15 minutes.
Partager ce serveur
Je l'ai conçu pour tourner en local, une instance par personne. Le token Kobo est lu une seule fois au démarrage (KOBO_API_TOKEN dans .env) et vaut pour tout le serveur : il n'y a pas de token par utilisateur ni par requête. Chacun installe donc sa propre copie avec son propre token, et ne voit que ses propres formulaires.
⚠️ Ne copie jamais le dossier tel quel (cp -r, clé USB, Drive, Slack) : il contient .env, donc mon token, donc l'accès à l'ensemble de mes données Kobo.
Par dépôt git — ce que je recommande
git pushLe dépôt est publié ici : https://github.com/OuattaraTech/kobotoolbox-mcp-server. Un collaborateur n'a plus qu'à le cloner.
Le .gitignore exclut .env, node_modules/, dist/ et out/ : ni le token ni les rapports déjà générés ne partent avec le code.
Par archive, sans passer par GitHub
tar --exclude=node_modules --exclude=dist --exclude=.env --exclude=out --exclude=.git \
-czf ~/kobo-mcp.tar.gz -C ~/Documents kobotoolbox-mcp-server(tar est présent d'origine sur Windows 10+ ; il suffit d'y adapter les chemins.)
Ce que la personne fait de son côté
Elle suit Installation, avec son token Kobo :
git clone https://github.com/OuattaraTech/kobotoolbox-mcp-server.git && cd kobotoolbox-mcp-server
npm install && npm run build
python3 -m pip install -r requirements.txt # "py -m pip" sous Windows
cp .env.example .env # puis y mettre son propre KOBO_API_TOKEN
claude mcp add kobotoolbox --scope user -- node /chemin/absolu/vers/dist/index.jsÇa marche sur les trois systèmes ; les seules différences (nom de l'interpréteur Python, installation de LibreOffice, forme du chemin absolu) sont détaillées dans les Prérequis.
Premier test à lui indiquer : demander à Claude de lancer kobo_doctor, qui vérifie d'un coup la connexion, le token, les librairies Python et le dossier de sortie.
Par npm
Le package.json est déjà prêt pour la publication (bin, files, prepublishOnly), et l'installation tiendrait alors en une commande, sans clone ni build :
claude mcp add kobotoolbox --scope user --env KOBO_API_TOKEN=xxx -- npx -y @ouattaratech/kobotoolbox-mcp-serverDeux choses à régler avant de publier : le nom kobotoolbox-mcp-server est déjà pris sur npm par un autre projet, il faut donc un nom scopé (@ouattaratech/kobotoolbox-mcp-server) ; et repository.url pointe vers un dépôt qui n'existe pas encore.
Une seule instance pour toute une équipe
C'est le transport HTTP ci-dessous, mais je ne le conseille que sur un réseau interne de confiance, pour trois raisons :
Compte Kobo unique — tout le monde agit avec mon token, sur mes formulaires. Ça ne convient qu'à une équipe qui travaille déjà sur le même compte Kobo.
Les rapports restent sur le serveur — ils sont écrits dans le
KOBO_OUTPUT_DIRde la machine hôte, et il n'existe pas d'endpoint de téléchargement pour les récupérer.MCP_ACCESS_KEYest une clé unique partagée, pas une authentification par utilisateur — et sans reverse proxy HTTPS devant, elle circule en clair.
Transport HTTP (optionnel)
Pour partager le serveur sur le réseau plutôt que de l'exécuter en local :
# Linux / macOS
TRANSPORT=http PORT=3000 MCP_ACCESS_KEY=$(openssl rand -hex 32) npm start# Windows (PowerShell) — openssl n'y est pas livré d'office
$env:TRANSPORT="http"; $env:PORT="3000"
$env:MCP_ACCESS_KEY=-join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Max 256) })
npm startL'endpoint est alors http://<hôte>:3000/mcp, protégé par Authorization: Bearer <MCP_ACCESS_KEY>. Dans ce mode, les rapports sont écrits sur le serveur, pas sur la machine du client — il faudrait ajouter un endpoint de téléchargement pour les récupérer.
Available Tools
27 toolskobo_analyzeDescriptive Statistics of KoboToolbox DataARead-onlyIdempotent
Compute descriptive statistics for every question (or a chosen subset) of a form.
For each question it returns the statistics that fit its type:
categorical: counts and percentages per answer option (multi-select handled correctly — percentages are of respondents, so they can exceed 100%)
numeric: n, mean, median, standard deviation, min, max, quartiles, sum
date: earliest and latest
free text: number of distinct answers plus examples
Args:
uid (string): the form's asset uid
columns (array, optional): restrict to these questions (field name or question label)
query (string, optional): Mongo-style filter
response_format ('markdown' | 'json')
Loads the data automatically if it isn't cached yet.
Examples:
Use when: "What do the responses to my cocoa form look like?" -> uid=...
Use when: "What's the average plot size?" -> columns=["plot_size"]
Don't use when: you need two questions crossed (use kobo_crosstab)
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| query | No | Optional Mongo-style filter applied server-side, e.g. '{"region":"Sud-Ouest"}' or '{"_submission_time":{"$gte":"2026-01-01"}}' | |
| columns | No | Restrict the profile to these questions (field name or question label). Omit for all. | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the read-only/idempotent annotations by explaining what statistics are returned per question type, that multi-select percentages are of respondents and can exceed 100%, and that data is loaded automatically if not cached. These are meaningful behavioral details not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with purpose, followed by useful output-type details and usage examples. The 'Args' section repeats schema information, adding some length, but the overall structure remains efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by detailing what is returned for categorical, numeric, date, and free-text questions. It also covers parameters, the optional restriction to chosen questions, the filter option, output formats, and the caching behavior, making it sufficiently complete for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents uid, columns, query, and response_format. The description restates the args without adding significant new parameter-level meaning, though the response_format enum is reinforced by the markdown/json mention.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Compute descriptive statistics for every question (or a chosen subset) of a form.' It lists the per-type outputs and explicitly contrasts with kobo_crosstab, making the tool's purpose distinguishable from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete 'Use when' examples, such as 'What do the responses to my cocoa form look like?' and 'What's the average plot size?', and an explicit 'Don't use when' case referencing kobo_crosstab. This gives an agent clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_archive_formArchive or Reactivate a KoboToolbox FormAIdempotent
Stop a form from accepting new submissions without deleting anything, or bring an archived form back.
This is the correct way to end a data collection round: every response is kept and stays exportable. Use it instead of kobo_delete_form, which destroys the data.
Args:
uid (string): asset uid of the deployed form
active (boolean): false to archive, true to reactivate
Returns: the resulting deployment status.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the deployed form | |
| active | Yes | false to archive (stop accepting submissions, keeping every response), true to reactivate a previously archived form |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which already indicate not read-only, not destructive, and idempotent), the description adds useful behavioral context: responses are kept, remain exportable, and archived forms can be reactivated. It also states the return value as deployment status. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and efficient: it front-loads the core action and safety property, gives a clear usage directive with the alternative, then lists parameters and return value. Every sentence earns its place without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with full schema coverage and no output schema, the description is complete: it explains the effect, the alternative, the parameters, and the return value. The safety profile is also covered by annotations, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's Args section largely repeats the schema's parameter documentation. The active parameter's meaning is fully covered in the schema, so the description adds no significant new semantic value beyond what is already structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('archive or reactivate') and resource ('KoboToolBox form'), and clearly states what the tool does: stops new submissions without deleting data or brings an archived form back. It also explicitly differentiates from kobo_delete_form, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct when-to-use guidance: it is 'the correct way to end a data collection round' and should be used 'instead of kobo_delete_form, which destroys the data.' This explicitly names the alternative and the reason for preferring this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_build_reportGenerate Excel / Word / PDF Analysis ReportA
Produce finished deliverables from a form's data: an analytical Excel workbook, a written Word report, and/or a PDF — saved to disk.
YOU write the analysis (objective, summary, findings, section commentary, recommendations); the server computes every figure from the real submissions, so the numbers in the deliverable always match the data. Never type counts or percentages into 'custom' tables that the server can compute for you — use the directives below instead.
Each section carries your prose plus 'visuals', declared as directives:
{source:"frequencies", column:"crop_health", chart_kind:"pie"} — counts/% per answer, as table and chart
{source:"numeric_summary", column:"plot_size"} — mean/median/std/quartiles table
{source:"crosstab", row_column:"region", col_column:"crop_health", metric:"count"} — contingency table + grouped chart
{source:"custom", columns:[...], rows:[[...]]} — only for figures the server cannot derive Each accepts: show ('table'|'chart'|'both'), chart_kind, title, note (a "how to read this" caption), top_n.
What the Excel workbook contains: a summary sheet (objective, executive summary, findings, recommendations), one sheet per section with tables and NATIVE, editable Excel charts, a cross-tab sheet, the cleaned data as a real Excel Table named 'DonneesKobo' (select it, then Insert > PivotTable to build your own pivot in two clicks), and a data-quality sheet.
Note on pivot tables: cross-tabs are delivered as computed tables, not as live PivotTable objects — no open-source library can create those. The named Excel Table above is there precisely so you can add one yourself instantly.
Args:
uid (string): the form's asset uid
objective (string): the analytical question this report answers
formats (array): any of 'xlsx', 'docx', 'pdf'
title, methodology, summary, findings[], recommendations[]: your written content
sections[]: {heading, text, visuals[]}
file_name (string, optional): base name without extension
query (string, optional): Mongo-style filter restricting the analysis
Returns: the full path of each generated file.
Run kobo_load_data first so you know which questions exist and what shape the data is in.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| query | No | Optional Mongo-style filter applied server-side, e.g. '{"region":"Sud-Ouest"}' or '{"_submission_time":{"$gte":"2026-01-01"}}' | |
| title | No | Report title. Defaults to 'Analyse — <form name>'. | |
| formats | No | Deliverables to produce: 'xlsx' analytical workbook, 'docx' written report, 'pdf' of that report | |
| summary | No | Executive summary: the headline answer to the objective | |
| findings | No | Key findings, one per bullet, each citing a figure | |
| max_rows | No | How many submissions to pull. Defaults to 50000, which protects against dragging a huge project into memory; pass a higher value explicitly to analyse a project larger than that. | |
| sections | Yes | Body of the report: your analysis, section by section, with the tables and charts to compute | |
| file_name | No | Base file name without extension. Defaults to a slug of the form name and date. | |
| objective | Yes | The analytical objective this report answers, in the user's own terms | |
| methodology | No | How the analysis was conducted, including any filters applied | |
| recommendations | No | Actionable recommendations that follow from the findings |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behaviors far beyond annotations: files are saved to disk, every figure is computed server-side from real submissions, cross-tabs are delivered as computed tables rather than live PivotTable objects, and the 'custom' source must not be used for figures the server can derive. It even explains the named Excel Table's purpose for enabling user-created pivots. This is unusually transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the tool is complex and the length is earned: purpose is front-loaded, then directive syntax, workbook contents, pivot limitation, and a clear 'Run kobo_load_data first' instruction. It is well-structured and every section serves a practical purpose, though a slightly tighter phrasing would improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter report builder with no output schema, the description covers the critical operational details: what the workbook contains, how visuals are declared, the custom-table restriction, the pivot-table limitation, the max_rows memory protection, and the return value (full path of each generated file). Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful guidance beyond the schema: the visual directive format with examples, the rule that 'custom' is only for figures the server cannot derive, and the warning never to type counts or percentages into custom tables. This supplements the already-complete schema effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Produce finished deliverables from a form's data: an analytical Excel workbook, a written Word report, and/or a PDF — saved to disk.' It clearly distinguishes this tool from sibling raw-data/export/analysis tools by emphasizing finished deliverables with written analysis plus server-computed visuals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool ('Produce finished deliverables') and an explicit workflow prerequisite: 'Run kobo_load_data first so you know which questions exist and what shape the data is in.' It does not explicitly name alternatives or exclusions, but the context is strong enough that an agent can identify the right situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_clone_formClone a KoboToolbox FormA
Copy an existing form's structure into a brand-new project, without its submissions.
Useful to reuse a questionnaire for a new round, region or season, or to experiment on a copy instead of a live form.
Args:
uid (string): asset uid of the form to copy
name (string, optional): name for the copy (default ' (copie)')
deploy (boolean, default false): deploy the copy immediately
Returns: the new form's uid and status.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to copy | |
| name | No | Name for the copy (default: '<original> (copie)') | |
| deploy | No | Deploy the copy immediately |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the mutation (readOnlyHint=false) and non-destructive nature (destructiveHint=false). The description adds useful context: it creates a new project, omits submissions, and supports optional immediate deployment via the deploy param. This goes beyond the bare annotation flags and clarifies the tool's side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior, followed by usage guidance, parameters, and return info. Each sentence adds value, with no filler. The structure makes it easy for an agent to scan and extract the key facts quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple tool with three flat params and no output schema, the description covers the essential behavior, the return value (uid and status), and the optional deploy action. It doesn't address edge cases like whether the original form is ever modified or what 'status' means exactly, but those are minor gaps given the annotations and simple parameter surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents all three parameters. The description's Args section repeats the schema rather than adding new semantic details. It does, however, reinforce the default for name and the boolean meaning of deploy, but that's marginal beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (copy) and resource (existing form's structure) with an explicit outcome (brand-new project, no submissions). It clearly distinguishes this from siblings like kobo_create_form (create from scratch) and kobo_import_xlsform (import) by describing the clone behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases ('reuse a questionnaire for a new round, region or season', 'experiment on a copy instead of a live form'), which clearly imply when to choose this tool. It does not name specific alternatives or state when not to use it, but the context is strong enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_create_formCreate KoboToolbox FormA
Create a new form (survey) from a list of questions, and optionally deploy it immediately so it can start collecting submissions.
The question list is FLAT: sections and repeats are expressed with begin_group/end_group and begin_repeat/end_repeat rows, which must be balanced.
Args:
name (string): form/project title
description (string, optional): short description
questions (array): ordered list of questions. Each has:
type: see the type enum. Use 'phonenumber' (NOT 'phone_number') for a phone field.
name: internal field name, unique across the whole form
label: question text (string, or {language: text} for a multilingual form)
required, hint, choices, relevant, constraint, constraint_message, calculation, default, appearance, read_only, parameters
deploy (boolean, default true): deploy immediately vs. leave as draft
Returns: the new form's uid, deployment status, and — once deployed — the public collect links.
Examples:
Sections and skip logic: questions=[ {type:"begin_group",name:"identification",label:"Identification",appearance:"field-list"}, {type:"text",name:"nom",label:"Nom de l'établissement",required:true}, {type:"select_one",name:"categorie",label:"Catégorie",choices:[{name:"maquis",label:"Maquis"},{name:"autre",label:"Autre"}]}, {type:"text",name:"categorie_autre",label:"Précisez",relevant:"${categorie} = 'autre'"}, {type:"integer",name:"annee",label:"Année",constraint:". >= 1950 and . <= 2030",constraint_message:"Année invalide"}, {type:"end_group",name:"identification"} ]
Repeating data: begin_repeat "plats" ... end_repeat, one row per dish.
Don't use when: you want to change an existing form (use kobo_patch_form for a targeted edit, kobo_update_form to replace everything)
Error Handling:
The question list is validated locally first: unknown types, duplicate names, unbalanced groups, selects without choices and bad choice codes are reported precisely, before any request reaches Kobo.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Title of the form/project (e.g. 'Suivi des parcelles de cacao') | |
| deploy | No | If true, immediately deploy the form so it can start collecting submissions | |
| questions | Yes | Ordered, flat list of questions. Nesting is expressed with begin_group/end_group and begin_repeat/end_repeat rows, which must be balanced. | |
| description | No | Optional short description of the form's purpose |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the operation as non-read-only and non-idempotent, and the description adds concrete behavioral context: creating versus deploying, the flat-list balance requirement, local validation before any request reaches Kobo, and the return value (uid, deployment status, public collect links). No annotation contradiction is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose, flat-list warning, condensed args, return values, concrete examples, explicit alternative routing, and error handling. It is front-loaded with the core action and uses headers and lists so an agent can scan it quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex form-creation tool with no output schema, the description provides the essential missing pieces: return shape, deployment behavior, local validation semantics, and representative usage. The rich input schema handles the per-field details, and the description fills the operational context around it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries most parameter definitions; the description adds value by showing complete question examples (grouping, relevant skip logic, constraint messages, repeat rows), the multilingual label form, and the explicit phonenumber spelling warning. This goes beyond a bare schema listing, though it does repeat several schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action ('Create a new form (survey)') on a specific resource, with a precise input ('from a list of questions') and an optional behavioral toggle ('optionally deploy it immediately'). It later explicitly routes edits to kobo_patch_form and kobo_update_form, so it is clearly distinguished from the update siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit 'Don't use when' section: if the goal is to change an existing form, use kobo_patch_form for targeted edits or kobo_update_form to replace everything. It also clarifies the deploy flag choice between immediate collection and leaving a draft, giving the agent a clear decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_crosstabCross-tabulate Two KoboToolbox QuestionsARead-onlyIdempotent
Cross two questions to see how answers to one vary with the other — the core of comparative analysis.
Args:
uid (string): the form's asset uid
row_column (string): question forming the rows (field name or label)
col_column (string): question forming the columns
metric: 'count' (default), 'row_pct', 'col_pct', 'mean' or 'sum'
value_column (string): numeric question to average/sum — required for 'mean' and 'sum'
query (string, optional): Mongo-style filter
response_format ('markdown' | 'json')
Returns: the contingency table with row, column and grand totals, and how many submissions were excluded for missing either answer.
Examples:
Use when: "Is crop health worse in some regions?" -> row_column="region", col_column="crop_health"
Use when: "Share of each health status within each region" -> ..., metric="row_pct"
Use when: "Average plot size by region and crop" -> row_column="region", col_column="crop", metric="mean", value_column="plot_size"
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| query | No | Optional Mongo-style filter applied server-side, e.g. '{"region":"Sud-Ouest"}' or '{"_submission_time":{"$gte":"2026-01-01"}}' | |
| metric | No | count = number of submissions; row_pct/col_pct = percentages; mean/sum = aggregate value_column inside each cell | count |
| col_column | Yes | Question forming the columns of the table | |
| row_column | Yes | Question forming the rows of the table (field name or label) | |
| value_column | No | Numeric question to average or sum. Required when metric is 'mean' or 'sum'. | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, open-world, and non-destructive behavior, so the description does not need to repeat those. It adds useful behavioral context by stating that the return includes row, column, and grand totals plus the count of submissions excluded for missing either answer. No contradictions with the annotations are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an intro, Args list, Returns, and Use-when examples, and the key purpose is front-loaded. Some parameter details in the Args list duplicate the schema, but the examples and returns keep the description from feeling padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, seven parameters, and no output schema, the description provides enough context: return shape, exclusion behavior, metric meanings, and realistic examples. It could be more explicit about how percentages are calculated or how missing-answer submissions affect totals, but the core information an agent needs to invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all seven parameters at 100% coverage, setting a baseline of 3. The description adds value with concrete example parameter combinations and clarifies how metrics like row_pct and mean are used in practice. It does not dramatically enrich every parameter, but the examples improve selection confidence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: “Cross two questions to see how answers to one vary with the other.” This clearly identifies a cross-tabulation operation on KoboToolbox questionnaire data and is distinct from the sibling tools, none of which describe this analytic operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The “Use when” examples map natural-language analytical questions to concrete parameter choices, such as row_column, col_column, metric, and value_column. This gives clear contextual guidance, though it does not explicitly say when NOT to use this tool or name an alternative to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_delete_formDelete KoboToolbox FormADestructiveIdempotent
Permanently delete a form AND ALL ITS SUBMISSIONS. THIS CANNOT BE UNDONE.
Args:
uid (string): asset uid of the form to delete
confirm (true): must be explicitly set to true
confirm_submission_count (number): required when the form has submissions — pass the exact count, to prove the data loss is intended
Don't use when: you just want to stop collecting data. Use kobo_archive_form instead — it keeps every response.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to permanently delete | |
| confirm | Yes | Must be explicitly set to true to confirm this irreversible deletion | |
| confirm_submission_count | No | Required when the form has submissions: pass the exact number reported by kobo_list_forms, to prove the data loss is intended. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the permanent, destructive nature of the operation, including that submissions are deleted too and that the action cannot be undone. This goes beyond the destructiveHint annotation by specifying the exact data-loss scope and the confirmation safeguard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loads the critical warning, uses a clear argument list, and ends with a practical alternative. Every sentence earns its place without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no output schema, the description fully covers the operation's consequences, the required confirmation parameters, the submission-count safeguard, and the appropriate alternative. An agent has enough context to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% description coverage for all parameters, so the baseline is 3. The tool description mostly restates the schema's parameter explanations without adding new semantic detail or clarifying constraints beyond what is already present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('delete'), names the resource ('form'), and explicitly includes all submissions with irreversible consequences. It also distinguishes itself from the sibling kobo_archive_form, so the agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-not-to-use rule: 'Don't use when: you just want to stop collecting data. Use kobo_archive_form instead — it keeps every response.' This clearly routes agents away from destructive deletion when archiving is the intended behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_delete_submissionsDelete KoboToolbox SubmissionsADestructiveIdempotent
Permanently delete specific submissions from a form. THIS CANNOT BE UNDONE.
Use it to remove test entries, duplicates, or a response a respondent asked to withdraw.
Args:
uid (string): asset uid of the form
submission_ids (array of strings): the "_id" values from kobo_list_submissions
confirm (true): must be explicitly set to true
Don't use when: you want to discard a whole form's data — that is kobo_delete_form. To merely flag bad rows while keeping them, use kobo_validate_submissions with 'not approved' instead.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form | |
| confirm | Yes | Must be true — deleted submissions cannot be recovered | |
| submission_ids | Yes | Ids of the submissions to permanently delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and readOnlyHint=false; the description adds the irreversible nature ('THIS CANNOT BE UNDONE') and clarifies exactly what is destroyed (specific submissions, not the whole form). This adds useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded with the critical warning, then use cases, parameters, and exclusions. Every sentence earns its place and the description is compact without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, the description covers purpose, parameter provenance, required confirm flag, alternatives, and destructive consequences. Nothing essential for an agent to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds extra meaning by telling the agent that submission_ids should be the '_id' values from kobo_list_submissions and that confirm must be explicitly true, going beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: 'Permanently delete specific submissions from a form.' It clearly distinguishes itself from sibling kobo_delete_form (whole form deletion) and kobo_validate_submissions (flagging instead of deleting), so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use it: remove test entries, duplicates, or a withdrawal request. It also gives explicit 'Don't use when' conditions with named alternatives, leaving no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_deploy_formDeploy KoboToolbox FormAIdempotent
Deploy a draft form (or redeploy a changed one) so it becomes active and can collect submissions.
Args:
uid (string): asset uid of the form to deploy
Returns: the new deployment status and the collect links.
Note: deploying makes the form live but NOT public — the Enketo link still asks for a Kobo login until anonymous submissions are enabled with kobo_set_sharing.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to deploy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, and the description adds meaningful behavioral context beyond that: deploying makes the form live but NOT public, and the Enketo link requires a Kobo login until sharing is enabled. This clarifies side effects and access behavior without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with clear sections for behavior, arguments, return value, and a relevant caveat. It is front-loaded with the main purpose and every sentence adds useful information without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one simple parameter, no output schema, and annotations already covering safety, the description is nearly complete. It explains the return value (deployment status and collect links) and the important privacy/auth caveat. It could add slightly more detail on what deployment statuses look like, but nothing critical is missing for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, uid, and the input schema already describes it as the asset uid of the form to deploy. The description repeats this in the Args section but adds no new semantic detail, so with 100% schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: deploy a draft form or redeploy a changed one so it becomes active and can collect submissions. It names the specific resource type (KoboToolbox form) and the action (deploy), which distinguishes it from siblings like kobo_update_form, kobo_archive_form, and kobo_get_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when a draft or changed form needs to be made active. It also gives a practical exclusion note, directing users to kobo_set_sharing when anonymous submissions are needed. However, it does not explicitly describe when not to deploy or contrast with all alternatives, 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.
kobo_doctorCheck the KoboToolbox MCP Server SetupARead-onlyIdempotent
Diagnose this server's configuration: the Kobo connection, the API token, the output directory and the Python report renderer.
Run it first when a tool fails for an unclear reason, or right after installing the server.
Returns: a pass/fail line per check, with the exact command to fix anything broken.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive. The description adds that it only returns pass/fail lines and exact fix commands, not performing fixes itself, which is useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences front-load the purpose, then give usage timing and return format. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple diagnostic tool with one optional parameter, the description covers what it checks, when to run it, and what it returns. Annotations cover safety, and the parameter is fully specified by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not mention the response_format parameter at all. While the schema's enum and default make the parameter self-documenting, the low coverage means the description was expected to compensate and doesn't.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Diagnose' and names concrete configuration items: Kobo connection, API token, output directory, and Python report renderer. This clearly distinguishes the tool from sibling form/submission operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use instructions: run it first when a tool fails for an unclear reason or right after installing the server. It doesn't state when not to use it or name alternatives, but as a dedicated diagnostic tool this is clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_download_attachmentsDownload KoboToolbox AttachmentsARead-onlyIdempotent
Download the photos, audio, video and files attached to submissions.
A form with an 'image' question (a shopfront photo, a signed consent form, a damaged crop) stores its files on Kobo, and nothing in an Excel export contains them — only file names. This fetches the actual files to disk, organised one folder per submission.
Args:
uid (string): asset uid of the form
submission_ids (array, optional): limit to these submissions; omit for all
output_dir (string, optional): where to write (default: /_attachments)
max_files (number, default 200): safety cap
Returns: the directory written, the number of files and their total size.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form | |
| max_files | No | Safety cap on how many files to pull | |
| output_dir | No | Directory to write the files into (default: <output dir>/<form>_attachments) | |
| submission_ids | No | Limit to these submissions. Omit to fetch attachments from all of them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description is not required to repeat those. It adds useful behavioral context: files are fetched to disk organized per submission, there is a safety cap (max_files), and the return includes the directory written, file count, and total size. This goes beyond the schema by describing the operational outcome. It doesn't discuss error handling or edge cases, but given annotation coverage, a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: a one-sentence purpose, a motivational paragraph, and an Args/Returns breakdown. Every sentence is informative, with no fluff or redundancy. The default output directory is explained clearly, and the overall length is appropriate for the tool's complexity. The structure is front-loaded with the essential purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex (4 parameters, multiple behaviors), but the description, together with the schema and annotations, provides everything an agent needs: clear purpose, parameter semantics, default behaviors, return values, and safety hints. The absence of an output schema is compensated by the explicit Returns line. No critical information is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, with each parameter described (e.g., 'Asset uid of the form', 'Directory to write the files into'). The description mirrors these descriptions without adding new semantic details; it restates defaults and the output directory pattern that are already in the schema. It does not, for example, clarify format of submission IDs or interactions between params. With high schema coverage, the baseline of 3 applies, and the description adds little beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Download the photos, audio, video and files attached to submissions.' It clearly identifies the resource (KoboToolbox attachments) and distinguishes itself from siblings like kobo_export_submissions_excel (which exports Excel, not files) and kobo_list_submissions (which lists metadata). The motivation ('nothing in an Excel export contains them — only file names') further clarifies what this tool uniquely does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear rationale for when to use this tool: when you need actual attachment files, not just names from an Excel export. It implicitly contrasts with the Excel export sibling. However, it does not explicitly name alternative tools or state when NOT to use it, though the context makes the intended use obvious. This earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_export_submissions_excelExport KoboToolbox Submissions to ExcelARead-only
Generate a downloadable Excel (.xlsx) or CSV export of all submissions for a form, and return the file itself (base64-encoded) plus a direct download link.
This triggers a fresh export on the Kobo server, waits (up to ~90s) for it to finish, downloads the result, and returns it as an embedded file the calling app can save to disk.
Args:
uid (string): the form's asset uid (from kobo_list_forms)
format ('xlsx' | 'csv', default 'xlsx')
language (string, optional): label language for the column headers on a multilingual form
Returns: the file as an embedded resource (base64), its size, and a direct download URL as a fallback.
Examples:
Use when: "Give me an Excel file of all responses to my cocoa form" -> uid=..., format="xlsx"
Don't use when: you just want to read a few submissions in chat (use kobo_list_submissions instead — much faster)
Error Handling:
Returns "Error: ... did not complete within 90s" for very large forms — the export may still finish server-side; check the Kobo web UI's export history
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to export submissions from | |
| format | No | Export file format | xlsx |
| language | No | Label language for the column headers on a multilingual form (default: the stored codes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and destructiveHint, and the description adds meaningful operational context: it triggers a fresh export server-side, waits up to ~90s, downloads the result, and returns it in an embeddable base64 form. The 90s timeout behavior is a key non-obvious trait that the agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear opening summary followed by Args, Returns, usage examples, and Error Handling. Every section earns its place, the main behavior is front-loaded, and no filler or redundant restatement of the title is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description fully explains the return value: embedded base64 file, size, and download URL. It also covers the failure mode for large forms and advises checking the Kobo web UI, so an agent can set expectations and recover from timeouts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds extra value by telling the agent where to get the uid ('from kobo_list_forms') and clarifying the optional language parameter's effect on multilingual form column headers. These are small but genuinely useful additions beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Generate... export') and a concrete resource ('all submissions for a form'), with both supported formats named. It also distinguishes the tool from the submission-reading sibling by explicitly saying when not to use it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases with a concrete example ('Give me an Excel file...') and a clear exclusion ('Don't use when... use kobo_list_submissions instead'). The agent is told both when and when not to invoke this tool, and which alternative to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_export_xlsformDownload a Form as XLSFormARead-onlyIdempotent
Download a form as a real XLSForm .xlsx workbook — the standard exchange format for ODK/Kobo questionnaires.
Use it to hand the questionnaire to someone else, keep it under version control, edit it in Excel, or re-import it elsewhere with kobo_import_xlsform.
Args:
uid (string): asset uid of the form
output_path (string, optional): where to write the file
Returns: the path written and its size.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to download as XLSForm | |
| output_path | No | Where to write the .xlsx (default: the server's output directory) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral context beyond that: the output is a real .xlsx workbook in the standard exchange format, and the function returns the written path and its size. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: purpose first, then usage context, then arguments and return value. Every sentence contributes meaningful information, and there is no fluff or repetition beyond an acceptable argument summary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter export tool with rich annotations, the description is complete: it explains what is produced, why to use it, which sibling tool handles the reverse operation, what the arguments mean, and what is returned. No critical operational information appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both uid and output_path are already documented. The description restates their meaning but adds little beyond the schema; it does clarify the return value, but that is output behavior rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool downloads a form as a real XLSForm .xlsx workbook, the standard ODK/Kobo exchange format. It uses a specific verb and resource and distinguishes itself from siblings by emphasizing the XLSForm deliverable and by mentioning re-import with kobo_import_xlsform.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases: sharing the questionnaire, version control, Excel editing, and re-importing elsewhere. It names kobo_import_xlsform as the complementary tool, which provides useful routing context, though it does not explicitly state when not to use it or compare it to kobo_get_form.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_form_versionsKoboToolbox Form Version HistoryADestructiveIdempotent
List a form's deployed versions, and roll back to one of them.
Kobo keeps every version that was ever deployed. This is the way back when a change breaks a live form: redeploying a past version restores the old structure without touching the submissions already collected.
Args:
uid (string): asset uid of the form
rollback_to (string, optional): version uid to redeploy. Omit to only list the history.
limit (number, default 30): how many versions to list
response_format ('markdown' | 'json')
Returns: the version history (newest first) with deployment dates, and the resulting status after a rollback.
Notes:
Rolling back changes the form structure only. Answers collected under the newer version stay in the database, but fields that no longer exist drop out of exports.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form | |
| limit | No | How many versions to list | |
| rollback_to | No | Version uid to redeploy. Omit to only list the version history. | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read/write safety and destructiveness, and the description adds valuable behavioral detail beyond them: rollback changes form structure only, collected submissions remain, and fields that no longer exist drop out of exports. This is exactly the kind of side-effect disclosure that lets an agent reason about consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured and front-loaded with the core purpose. The use-case explanation and notes earn their place, and the Args/Returns/Notes sections are scannable. The Args list is slightly redundant with the schema but remains compact and helpful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the return format, ordering ('newest first'), deployment dates, and post-rollback status. It also covers the main side effect and the optional-parameter behavior. The only things not spelled out, such as error conditions, are minor given the annotation coverage and schema richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all four parameters with 100% coverage)Skip, so the description's Args section mostly repeats structured information. It adds minimal extra meaning beyond the schema, such as the implication that omitting rollback_to lists history, which the schema itself already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with two concrete verbs and a specific resource: 'List a form's deployed versions, and roll back to one of them.' This clearly distinguishes it from sibling functions that manage forms generically, and the rollback capability is unique among the listed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit, scenario-based 'when to use' instruction: 'the way back when a change breaks a live form.' It explains how it differs from a plain update by restoring old structure without touching collected submissions. It stops short of naming specific alternative tools or stating when not to use it, so it does not fully earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_get_collect_linksGet KoboToolbox Collect LinksARead-onlyIdempotent
Get the shareable links of a deployed form — the actual deliverable once a form is built.
Returns every Enketo URL Kobo publishes:
offline: caches in the browser and works without a connection, syncing later. The one to give field teams.
online: plain web form
single: submits once and closes, for one-response-per-person links
preview: renders the form without saving anything, for internal review
iframe: to embed the form in a web page
It also reports whether the form is genuinely PUBLIC. A deployed form's link still asks for a Kobo login until anonymous submissions are enabled — use kobo_set_sharing for that.
Args:
uid (string): asset uid of the deployed form
include_qr (boolean, default false): also return a QR code image of the offline link, to print on a flyer, a poster or a table card
response_format ('markdown' | 'json')
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the deployed form | |
| include_qr | No | Also return a QR code image of the offline collect link, to print on a flyer or a table card | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavior beyond that by enumerating every returned link type (offline, online, single, preview, iframe) and revealing that the tool also reports the form's public-facing login requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, and bullet lists make the five return variants and the QR/format arguments easy to scan. The Args section partially duplicates the schema, so not every line earns its place, but the size is still reasonable for a tool with no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description fully carries the responsibility of describing return content. It explains the five URL types, the public/login caveat, the optional QR image, and the response_format choices, which is sufficient for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the description only needs to add marginal value. It repeats the uid, include_qr, and response_format details almost exactly as the schema does, with only a small addition like printing the QR code on a flyer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Get the shareable links of a deployed form') and clarifies this is the final deliverable once a form is built. It enumerates all five Enketo URL variants so there is no confusion about what the tool produces, and it explicitly points to kobo_set_sharing for the related but different task of enabling anonymous access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent this is the tool to use after a form is deployed and for distributing links to field teams, while also giving one explicit alternative: use kobo_set_sharing to make a form genuinely public. It lacks a broader when-not-to-use statement against all sibling tools, so it is not a full routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_get_data_sampleRead Cleaned KoboToolbox RowsARead-onlyIdempotent
Return actual cleaned rows of the dataset, with labels rather than codes.
Use this to read open-ended answers, sanity-check the data before drawing conclusions, or inspect specific records. For aggregate figures prefer kobo_analyze or kobo_crosstab — they are far more compact.
Args:
uid (string): the form's asset uid
limit (number): rows to return, 1-200 (default 20)
offset (number): rows to skip (default 0)
columns (array, optional): only these questions
query (string, optional): Mongo-style filter
response_format ('markdown' | 'json')
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| limit | No | How many cleaned rows to return | |
| query | No | Optional Mongo-style filter applied server-side, e.g. '{"region":"Sud-Ouest"}' or '{"_submission_time":{"$gte":"2026-01-01"}}' | |
| offset | No | Rows to skip, for paging through the data | |
| columns | No | Only return these questions. Omit for all columns. | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavior beyond those: rows are cleaned, labels replace codes, the query is a Mongo-style server-side filter, and output can be markdown or JSON. It doesn't cover auth or error behavior, but the annotation base makes that a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-ordered: purpose first, then usage guidance, then a concise Args list. Every sentence earns its place and no filler or repetition of annotations is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only sampling tool with full schema coverage, the description covers the purpose, use cases, alternatives, parameter constraints, and output format. The only real gap is the absence of a return-structure definition or error conditions, but 'cleaned rows' plus response_format gives enough for a competent agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter clearly, including examples for query. The Args section in the description mostly restates the schema without adding new semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Return actual cleaned rows of the dataset, with labels rather than codes.' It also names concrete use cases (reading open-ended answers, sanity-checking, inspecting records) and explicitly distinguishes itself from kobo_analyze/kobo_crosstab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('read open-ended answers, sanity-check the data before drawing conclusions, or inspect specific records') and when-not-to-use guidance ('For aggregate figures prefer kobo_analyze or kobo_crosstab'). This leaves little ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_get_formGet KoboToolbox Form DetailsARead-onlyIdempotent
Get full details of a single form: its question structure, section nesting, skip logic and validation rules.
Args:
uid (string): the form's asset uid (from kobo_list_forms)
language (string, optional): which language's labels to show on a multilingual form (e.g. 'fr')
response_format ('markdown' | 'json')
Returns: name, deployment status, submission count, available languages, and the question outline — groups and repeats shown as indented sections, with required, skip logic and constraints annotated.
Error Handling:
Returns "Error: ... not found" if the uid doesn't exist or isn't accessible with this token
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| language | No | For a multilingual form, which language's labels to show (e.g. 'fr'). Defaults to the first. | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it details what is returned (deployment status, submission count, available languages, annotated question outline) and documents the not-found error condition, including the token-access caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then organized into Args, Returns, and Error Handling sections. Every sentence adds useful information and there is no filler or redundancy with the annotations. The length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with no output schema, the description covers invocation inputs, the shape of the response, and the primary error case. It also explains how multilingual forms and response formats behave, which is enough for an agent to call the tool correctly and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains all three parameters. The description largely restates the schema's parameter meanings rather than adding new semantic depth, though it does reinforce the 'from kobo_list_forms' provenance and the markdown/json distinction. This matches the baseline for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Get full details of a single form', and enumerates its distinctive content (question structure, section nesting, skip logic, validation rules). This is clearly not a list-forms operation, but it does not explicitly differentiate itself from closely related siblings such as kobo_export_xlsform or kobo_form_versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied through the return-value description and the hint that the uid should come from kobo_list_forms, so an agent can infer it is for inspecting a single form's detailed structure. However, the description gives no explicit when-to-use guidance, exclusions, or alternatives, leaving the choice against sibling tools like kobo_export_xlsform to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_get_submissionGet a Single KoboToolbox SubmissionARead-onlyIdempotent
Get the full detail of one submission by its id.
Args:
uid (string): the form's asset uid
submission_id (string): the submission id (the "_id" field from kobo_list_submissions)
response_format ('markdown' | 'json')
Returns: every field and value recorded in that submission.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form | |
| submission_id | Yes | Submission id (from kobo_list_submissions) | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, read-only operation. The description adds that it returns 'every field and value recorded,' which is useful but not rich detail about potential errors, response format behavior, or prerequisite authentication. Since annotations cover safety, a 3 reflects that the description adds only modest behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: one purpose sentence, a brief parameter list, and a return statement. It's front-loaded with the primary purpose and uses clear structure. No filler or redundant elaboration exists, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-submission getter with read-only annotations and 100% schema coverage, the description provides enough to call it correctly: it explains the return content, the source of submission_id, and the response_format options. It doesn't mention error cases or output structure, but given the simplicity and prior tool usage hint, it's adequately complete. A 4 reflects that minor gaps like error handling are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of the parameters, each with clear explanations (e.g., uid is 'Asset uid of the form', submission_id is 'Submission id (from kobo_list_submissions)'). The description restates these in an 'Args' list but adds no new semantic meaning beyond what the schema already provides. With full schema coverage, the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get the full detail of one submission by its id,' which is a specific verb–resource pairing that clearly distinguishes it from sibling tools like kobo_list_submissions (which lists many submissions). It also states the expected return ('every field and value recorded'), making the tool's exact purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description references that submission_id comes from kobo_list_submissions, implicitly guiding the agent to first list submissions and then fetch one by its '_id'. However, it does not explicitly state when to prefer this tool over alternatives like kobo_export_submissions_excel or kobo_get_data_sample. This is clear context but lacks explicit exclusions, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_import_xlsformImport an XLSFormADestructive
Upload an XLSForm .xlsx workbook to Kobo, either as a new form or to overwrite an existing one.
Use it when a questionnaire already exists as a spreadsheet, or to round-trip a form edited in Excel.
Args:
file_path (string): path to the .xlsx on disk
name (string, optional): name for the imported form
uid (string, optional): asset uid to overwrite; omit to create a new form
deploy (boolean, default false): deploy once the import finishes
Returns: the resulting form uid and import status.
Error Handling:
Kobo validates the workbook server-side; a malformed XLSForm comes back with the specific row/column it rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | Asset uid to overwrite with this file. Omit to create a new form. | |
| name | No | Name for the imported form (default: the file name) | |
| deploy | No | Deploy once the import finishes | |
| file_path | Yes | Path to the XLSForm .xlsx file on disk |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-read-only. The description adds value by clarifying the overwrite behavior, the deploy option, and server-side XLSForm validation with row/column error reporting. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear intro, usage guidance, args, returns, and error handling. Every section contributes useful information and the key purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the return value (form uid and import status) and error behavior. It is sufficient for invoking the tool, though the exact shape of 'import status' and any deploy side effects are not detailed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description's Args section largely restates the schema rather than adding extra examples, types, or edge-case details, so it adds minimal value beyond the structured definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Upload an XLSForm .xlsx workbook to Kobo'. It also distinguishes two clear modes (new form vs overwrite existing), which separates it from siblings like export_xlsform, create_form, and deploy_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use when a questionnaire already exists as a spreadsheet or to round-trip a form edited in Excel. However, it does not explicitly name alternatives or state when not to use this tool versus the other form-creation siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_list_formsList KoboToolbox FormsARead-onlyIdempotent
List forms/projects (surveys) accessible with the configured API token.
Does NOT return submission data — use kobo_list_submissions for that.
Args:
search (string, optional): filter forms whose name contains this text
limit (number): max forms to return, 1-100 (default 30)
offset (number): pagination offset (default 0)
response_format ('markdown' | 'json')
Returns: form uid, name, deployment status, and submission count for each form.
Examples:
Use when: "What forms do I have on Kobo?" -> no params
Use when: "Find my cocoa tracking form" -> search="cocoa"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of forms to return | |
| offset | No | Number of forms to skip, for pagination | |
| search | No | Optional text to filter forms by name | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: the tool only returns forms accessible with the configured token, never submission data, and returns specific fields (uid, name, deployment status, submission count). This goes beyond the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line purpose, a critical exclusion, a brief Args list, a Returns summary, and practical examples. It is front-loaded with the most important semantic distinction and contains minimal redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with no output schema, the description is complete: it covers auth scope, parameter behavior, output fields, exclusions, and example invocations. Pagination and limits are documented in the schema, and the description tells the agent what output to expect. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters and their constraints. The description's Args section adds no meaning beyond what the schema provides, though the 'search' example in the usage section does illustrate how to apply the filter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List forms/projects (surveys) accessible with the configured API token.' It clearly separates this from kobo_get_form (single form) and kobo_list_submissions (submission data), so an agent can tell exactly what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states what the tool is NOT for and names the alternative: 'Does NOT return submission data — use kobo_list_submissions for that.' It also provides concrete use-case examples such as 'What forms do I have on Kobo?' and 'Find my cocoa tracking form', which map directly to parameter usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_list_submissionsList KoboToolbox Form SubmissionsARead-onlyIdempotent
List submitted responses for a form, most recent first.
Args:
uid (string): the form's asset uid (from kobo_list_forms)
limit (number): max submissions to return, 1-100 (default 30)
offset (number): pagination offset (default 0)
query (string, optional): Mongo-style JSON filter, e.g. '{"crop_health":"poor"}'
response_format ('markdown' | 'json')
Returns: submission id, submission time, and answered fields for each submission.
Examples:
Use when: "Show me the latest 10 responses to my cocoa form" -> uid=..., limit=10
Use when: "Which submissions reported poor crop health?" -> query='{"crop_health":"poor"}'
Don't use when: you want a downloadable Excel file (use kobo_export_submissions_excel instead)
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| limit | No | Maximum number of submissions to return | |
| query | No | Optional Mongo-style filter query, e.g. '{"farmer_name":"Kouassi"}' | |
| offset | No | Number of submissions to skip, for pagination | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: most-recent-first ordering, optional Mongo-style query filtering, pagination via offset, and the return shape (submission id, submission time, answered fields). These go beyond the annotations and schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, and Examples sections, and the purpose is front-loaded in the first sentence. It is somewhat longer than necessary because the Args block repeats schema descriptions, but the examples and explicit usage guidance earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return fields. It also covers ordering, query filtering, pagination, response format, and the main alternative tool. For a read-only list operation with rich annotations, nothing essential is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all five parameters. The description largely duplicates schema information in the Args block, but it adds a practical example for the query parameter ('crop_health':'poor') and the 'latest 10 responses' use case. This gives a baseline-appropriate 3 with only modest added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List submitted responses for a form, most recent first.' It distinguishes itself from siblings by being a plural list operation versus kobo_get_submission, and by explicitly contrasting with kobo_export_submissions_excel for downloadable output. The scope is immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'Use when' examples for two common agent intents and an explicit 'Don't use when' case that names the correct alternative tool. This gives clear selection criteria relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_load_dataLoad and Clean KoboToolbox DataARead-onlyIdempotent
Download ALL submissions of a form and prepare them for analysis. Start every analysis here.
Unlike kobo_list_submissions (one page of raw records), this pulls the whole dataset, replaces stored choice codes with their labels, converts numbers and dates, flattens groups, and reports data quality. The cleaned snapshot is cached for 15 minutes and reused by kobo_analyze, kobo_crosstab, kobo_get_data_sample and kobo_build_report.
Args:
uid (string): the form's asset uid
query (string, optional): Mongo-style server-side filter, e.g. '{"region":"Sud-Ouest"}'
max_rows (number): safety cap (default: everything, up to 50000)
language (string, optional): label language for multilingual forms
refresh (boolean): re-download instead of using the cache
response_format ('markdown' | 'json')
Returns: the list of analysable questions with their measurement type (categorical / numeric / datetime / text) and answer options, the number of submissions, and a data-quality summary (missing values, duplicates, skipped repeat groups).
Use the returned question list to decide what to analyse — its "field" values are what you pass to the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form (from kobo_list_forms) | |
| query | No | Optional Mongo-style filter applied server-side, e.g. '{"region":"Sud-Ouest"}' or '{"_submission_time":{"$gte":"2026-01-01"}}' | |
| refresh | No | Force a fresh download instead of reusing the cached snapshot (cache lasts 15 min) | |
| language | No | Preferred label language for multilingual forms, e.g. 'Français' or 'fr' | |
| max_rows | No | How many submissions to pull. Defaults to 50000, which protects against dragging a huge project into memory; pass a higher value explicitly to analyse a project larger than that. | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: it downloads all submissions, applies transformations (choice labels, number/date conversion, group flattening), caches the result for 15 minutes, and reports data quality. It also explains that the cache is reused by other tools and that refresh forces a re-download. No contradiction with the readOnly/idempotent annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-structured: purpose is front-loaded, the sibling distinction comes second, then args, then return value and usage hint. The Args list duplicates some schema information, but it interleaves practical context that helps an agent, so the length is mostly earned and not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains the return shape: analysable questions with measurement types and answer options, submission count, and a data-quality summary. It also tells the agent how to use the returned 'field' values with other tools, which is exactly the guidance needed for correct follow-up calls. Nothing essential is missing for a read-only cached data-loading tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents all six parameters. The description adds modest context such as max_rows being a 'safety cap' and the returned field values being what to pass to other tools, but it largely restates the schema rather than adding substantial new parameter meaning. The phrase 'default: everything, up to 50000' is also slightly ambiguous compared to the schema's explicit default of 50000.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Download ALL submissions of a form and prepare them for analysis.' It clearly distinguishes this from kobo_list_submissions by contrasting 'one page of raw records' with the full cleaned dataset, and it names the exact downstream tools that consume the result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Start every analysis here,' which is a strong directive for when to use the tool. It also names kobo_list_submissions as the alternative for single-page raw records and lists which sibling tools consume the cached snapshot, making the surrounding workflow unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_patch_formPatch KoboToolbox FormADestructiveIdempotent
Make targeted changes to an existing form without resending the whole question list.
This is the safe way to fix a typo, add a choice, or attach skip logic to a form that is already collecting data — everything not named is left exactly as it is.
Args (all optional, combine freely):
uid (string): the form to patch
set_label: [{name, label}] — relabel existing questions
set_hint: [{name, hint}]
set_required: [{name, required}]
set_relevant: [{name, relevant}] — set skip logic; empty string clears it
set_constraint: [{name, constraint, constraint_message}] — empty constraint clears it
add_choices: [{name, choices:[{name,label}]}] — append options to a select question
remove_questions: [names] — delete questions; removing a group removes its contents
redeploy (boolean, default true)
Returns: a per-change report of what was applied and what could not be found.
Examples:
Fix one label: set_label=[{name:"nom_etablissement", label:"Nom de l'établissement"}]
Add skip logic after the fact: set_relevant=[{name:"type_autre", relevant:"${type} = 'autre'"}]
Add a payment option: add_choices=[{name:"moyens_paiement", choices:[{name:"wave",label:"Wave"}]}]
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to patch | |
| redeploy | No | Redeploy so the change goes live | |
| set_hint | No | Change question hints in place | |
| set_label | No | Change question labels in place | |
| add_choices | No | Append options to an existing select question's choice list | |
| set_relevant | No | Set or replace skip logic on existing questions. Pass an empty string to clear it. | |
| set_required | No | Toggle whether questions are mandatory | |
| set_constraint | No | Set or replace a validation rule. Pass an empty constraint to clear it. | |
| remove_questions | No | Names of questions to delete. Removing a group also removes everything inside it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already marking the tool as destructive and non-read-only, the description adds valuable nuance: 'everything not named is left exactly as it is', removing a group removes its contents, empty strings clear skip logic/constraints, and redeploy defaults to true. It also discloses that a per-change report of applied and unfound changes is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a brief purpose statement, a safety guarantee, a compact bullet list of all nine parameters with inline semantics, a return-value note, and three practical examples. There is no filler, and the length is justified by the number of parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nine-parameter tool with no output schema, this is unusually complete: every operation is explained, return behavior is summarized, and examples show exact usage. It falls just short of excellent by mislabeling uid as optional and by not explicitly naming the full-update sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful semantics like empty-string clearing, append-only choices, and group-removal behavior, plus concrete examples. However, the header 'Args (all optional, combine freely)' is inaccurate because uid is required by the schema, which prevents a higher score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Make targeted changes to an existing form') and immediately differentiates from a full resend of the question list. It clearly names concrete use cases like fixing a typo, adding a choice, or attaching skip logic, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool: targeted changes to a form that is already collecting data, without resending the whole question list. However, it does not explicitly name kobo_update_form as the alternative for wholesale form updates, so the exclusion 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.
kobo_set_sharingSet KoboToolbox Form SharingADestructiveIdempotent
Control who can fill in a form and who can work on it.
Two independent things:
anonymous_submissions: makes the collect link usable by ANYONE who has it, with no Kobo account. This is what turns a deployed form into a genuinely public link. It never lets the public read the responses already collected — only submit new ones.
share_with / revoke_from: give or remove named collaborators' access to the form and its data.
Roles:
view: see the form and read its submissions
edit: also add and change submissions, and edit the form
manage: full control, including sharing it further
Args:
uid (string): asset uid of the form
anonymous_submissions (boolean, optional): true to publish, false to revoke
share_with: [{username, role}]
revoke_from: [usernames] — removes every permission that user holds
response_format ('markdown' | 'json')
Returns: the resulting access list, and the collect links when the form becomes public.
Examples:
"Make my form publicly fillable" -> anonymous_submissions=true
"Let Awa edit the data" -> share_with=[{username:"awa", role:"edit"}]
Notes:
Publishing a form is outward-facing: anyone with the URL can then submit. Confirm with the user before enabling it unless they asked.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form | |
| share_with | No | Grant collaborators access to the form | |
| revoke_from | No | Kobo usernames whose access should be removed entirely | |
| response_format | No | Output format: 'markdown' for human-readable or 'json' for machine-readable | markdown |
| anonymous_submissions | No | true makes the Enketo collect link usable by anyone without a Kobo account — this is what turns a deployed form into a genuinely public link. false revokes it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already covering destructiveHint and readOnlyHint, the description adds valuable behavioral context: anonymous_submissions never exposes existing responses to the public, only allows new submissions; revoke_from removes every permission a user holds; and publishing is outward-facing and should be confirmed with the user. These details go beyond the annotations and give an agent a solid mental model of the tool's side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (purpose, mechanisms, roles, args, returns, examples, notes) and front-loads the core purpose. It is somewhat long, and the Args section largely repeats the input schema's descriptions, which is redundant. Overall, the organization earns its place, but tightening the redundant parts would make it stronger.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description explicitly states what it returns (the resulting access list and collect links when public), making agent expectations clear. It covers all five parameters, gives role semantics, includes examples, and highlights the one risky behavior (public publishing) with a confirmation note. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, which sets the baseline at 3. The description still adds meaningful semantics: it explains that anonymous_submissions is what turns a deployed form into a genuinely public link, clarifies the role hierarchy, and provides concrete examples that map user intents to specific parameter values. This goes beyond simply restating the schema, though the Args section does partially duplicate schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Control who can fill in a form and who can work on it.' It then breaks the purpose into two concrete, distinct mechanisms (anonymous_submissions vs. share_with/revoke_from), which clearly separates it from siblings like kobo_update_form (editing form content) or kobo_deploy_form (deployment). This is an unambiguous, well-differentiated statement of what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear through the two-mechanism breakdown, role definitions, and concrete examples mapping natural-language requests to argument values. It also includes an important caution to confirm before enabling public submissions. However, it does not explicitly name alternatives or state when not to use this tool versus related ones, so it falls just short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_submit_dataSubmit Data to a KoboToolbox FormA
Send a response to a deployed form through the API, without going through the web form.
Use it to test a form end-to-end before sending enumerators out, or to migrate answers already collected on paper or in a spreadsheet.
Args:
uid (string): asset uid of the DEPLOYED form
answers (object): values keyed by the question's submission path, exactly as kobo_get_form reports it. A question inside a group is "group_name/question_name". select_multiple values are space-separated codes: "especes mobile_money". Dates are ISO: "2026-09-16". geopoint is "lat lon altitude accuracy".
count (number, default 1): submit the same answers several times, for load-testing only
Returns: the instance id Kobo assigned.
Notes:
Submitted rows are real data and count towards the form's submission total. Delete test rows with kobo_delete_submissions.
Attachments (photos, audio) cannot be sent this way — use the web form for those.
Error Handling:
A rejected submission almost always means a field name that does not exist in the form; check the exact paths with kobo_get_form.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the deployed form to submit to | |
| count | No | Submit the same answers this many times — for load-testing a form, not for real data | |
| answers | Yes | Answers keyed by the question's submission path, exactly as kobo_get_form reports it. A question inside a group is 'group_name/question_name'. select_multiple values are space-separated codes, e.g. 'especes mobile_money'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false), but the description adds critical behavioral context: submitted rows are real data and count toward the form's submission total, repeated submissions create duplicates, attachments cannot be sent, and rejected submissions usually indicate invalid field paths. This goes well beyond the annotation signals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into Args, Returns, Notes, and Error Handling, with the primary purpose front-loaded. Every section earns its place: parameter formats, side effects, exclusions, and failure diagnosis are all actionable and non-redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return value ('the instance id Kobo assigned'). It also covers the most likely failure mode, the real-data consequence, and the unsupported attachment case. For a mutation tool with nested parameters and side effects, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning the schema lacks: exact answer-path conventions for nested groups, space-separated select_multiple codes, ISO date format, geopoint format, and the explicit use of count for load-testing only. These practical examples help an agent construct valid parameter values more reliably than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Send a response to a deployed form through the API, without going through the web form.' This clearly distinguishes the tool from web-form submission and from sibling read/export tools like kobo_get_form, kobo_list_submissions, and kobo_get_submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: test a form end-to-end before sending enumerators, or migrate paper/spreadsheet answers. It also states exclusions and alternatives: attachments must use the web form, and test rows should be deleted with kobo_delete_submissions. This fully routes an agent to the correct tool and follow-up actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_update_formReplace KoboToolbox Form QuestionsADestructiveIdempotent
Replace the ENTIRE question list of an existing form with a new one.
Prefer kobo_patch_form for targeted edits (relabelling, adding choices, changing skip logic) — it leaves the rest of the form untouched and cannot accidentally drop questions.
Args:
uid (string): asset uid of the form to update
questions (array): FULL replacement list — any question left out is REMOVED from the form
redeploy (boolean, default true): redeploy so the new version goes live
confirm_replace (boolean): must be true when the form already has submissions
Notes:
Existing submissions are preserved, but answers to removed questions become orphaned and stop appearing in exports.
The question list is validated locally before anything is sent to Kobo.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form to update (from kobo_list_forms) | |
| redeploy | No | If true, redeploy the form after updating so the new version goes live | |
| questions | Yes | FULL replacement list of questions — any question left out is deleted from the form. | |
| confirm_replace | No | Required (true) when the form already has submissions: replacing the structure can orphan collected data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds concrete consequences: submissions are preserved while answers to removed questions become orphaned and disappear from exports, and validation happens locally. This goes beyond the structured hints, though it doesn't cover authentication or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core action and the sibling differentiation, then uses a clean Args/Notes structure. It is somewhat lengthy, but each section earns its place by communicating destructive behavior, safety conditions, and alternative routing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 4-parameter tool with a fully detailed input schema, the description covers high-level behavior, data consequences, and tool selection guidance. There is no output schema, so return values needn't be described; an agent has everything needed to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is already thoroughly documented in the schema. The description reinforces the critical 'left-out questions are removed' semantics but adds no new meaning beyond the property descriptions, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'Replace the ENTIRE question list of an existing form with a new one.' The explicit emphasis on 'ENTIRE' and the contrast with kobo_patch_form immediately distinguish this destructive full-replacement tool from its sibling for targeted edits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Guidance is explicit: 'Prefer kobo_patch_form for targeted edits... it leaves the rest of the form untouched and cannot accidentally drop questions.' It also explains when confirm_replace is required and what redeploy does, so an agent knows both when to use this tool and when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kobo_validate_submissionsSet Validation Status on SubmissionsAIdempotent
Mark submissions as approved, not approved, or on hold — Kobo's data-cleaning workflow.
This is the non-destructive way to handle suspect responses: the row stays in the database and in exports, carrying its status, instead of being deleted.
Args:
uid (string): asset uid of the form
submission_ids (array of strings): the "_id" values to mark
status: 'validation_status_approved' | 'validation_status_not_approved' | 'validation_status_on_hold'
Returns: how many submissions were updated.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Asset uid of the form | |
| status | Yes | Validation status to apply, as shown in Kobo's data table | |
| submission_ids | Yes | Ids of the submissions to mark |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=false and idempotentHint=true, and the description adds valuable non-destructive behavioral detail: the row remains in the database and exports with its status rather than being removed. It also discloses the return value (count of updated submissions), which the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line purpose, a one-sentence behavioral clarification, a concise Args list, and a Returns note. No filler or redundant restatement of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward 3-parameter mutation tool with no output schema, the description is complete: it explains what the tool does, why it exists, how to supply parameters, and what the caller receives in return. The annotations cover idempotency and non-destructiveness, so no critical operational context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful clarification beyond the schema by specifying submission_ids are the '_id' values to mark and enumerating the exact allowed status strings. This helps the agent construct the correct request without needing to infer semantics from the generic schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Mark submissions as approved, not approved, or on hold.' It clearly identifies the operation (setting validation status) and distinguishes it from sibling tools like kobo_delete_submissions by noting this is non-destructive and preserves the row in the database and exports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames the tool as the non-destructive way to handle suspect responses and contrasts it with deletion: 'the row stays in the database and in exports, carrying its status, instead of being deleted.' This gives the agent a clear when-to-use and when-not-to-use signal relative to destructive alternatives.
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.
27 tool updates
v1.0.0- First observed
kobo_analyze - First observed
kobo_archive_form - First observed
kobo_build_report - First observed
kobo_clone_form - First observed
kobo_create_form - First observed
kobo_crosstab - First observed
kobo_delete_form - First observed
kobo_delete_submissions - First observed
kobo_deploy_form - First observed
kobo_doctor - First observed
kobo_download_attachments - First observed
kobo_export_submissions_excel - First observed
kobo_export_xlsform - First observed
kobo_form_versions - First observed
kobo_get_collect_links - First observed
kobo_get_data_sample - First observed
kobo_get_form - First observed
kobo_get_submission - First observed
kobo_import_xlsform - First observed
kobo_list_forms - First observed
kobo_list_submissions - First observed
kobo_load_data - First observed
kobo_patch_form - First observed
kobo_set_sharing - First observed
kobo_submit_data - First observed
kobo_update_form - First observed
kobo_validate_submissions
TDQS
Scored across 27 tools
Every tool targets a distinct resource+action, with cross-references clarifying adjacent purposes. kobo_list_submissions, kobo_get_data_sample, and kobo_export_submissions_excel are clearly separated as raw paged, cleaned sample, and file export; kobo_patch_form vs kobo_update_form explicitly explain targeted vs full replacement. No two tools could reasonably be confused.
The overwhelming majority follow kobo_<verb>_<object> (kobo_create_form, kobo_list_submissions, kobo_delete_submissions). Minor deviations exist: kobo_form_versions is a noun phrase, and kobo_analyze, kobo_crosstab, kobo_doctor lack the standard verb+object structure. These are still readable and predictable within the overall convention.
At 27 tools, the server lands in the 'too many' band, especially since it bundles three distinct domains: form design/deployment, submission management, and analysis/reporting. While each tool has a distinct role, the surface is heavy for agent selection and would benefit from splitting into focused form, data, and reporting servers.
The surface covers the full form lifecycle (create/read/update/patch/deploy/archive/clone/import/delete/versions), submission workflows (list/get/submit/validate/delete/attachments/export), and analysis (load/analyze/crosstab/data sample/report). Minor gaps include no way to update a form's name/description after creation and no submission answer editing beyond validation status, but these are generally workable around.
Maintenance
Related MCP Connectors
Create forms, read submissions, and build invitations from Claude, ChatGPT, or any MCP client.
AI-native form builder: create, publish & read responses from Claude, ChatGPT & MCP.
Create and edit surveys, read responses, and reply to users — from your AI assistant.
AI-native survey & form builder. Manage surveys, responses, analytics, and webhooks.
Related MCP Servers
- -licenseBqualityNot gradedmaintenanceA comprehensive Model Context Protocol server that enables Claude Desktop users to manage Tally forms with 23 powerful tools for creating, editing, and analyzing forms, submissions, questions, webhooks, and conditional logic.231-
- FlicenseNot gradedqualityNot gradedmaintenanceAnalyze survey data (.sav, .csv, .xlsx) through Claude — crosstabs with significance testing, ANOVA, correlation, gap analysis, and publication-ready Excel exports. Upload once, analyze unlimited.-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to create, manage, and analyze Google Forms with all question types, sections, quiz mode, and Google Drive/Sheets integration.11MIT
- FlicenseNot gradedqualityCmaintenanceGives Claude deep tool-level control over Microsoft Excel files (.xlsx, .xlsm, .csv, .tsv) with 164 tools across 24 modules for reading, writing, formatting, formulas, charts, data analysis, and more.-