Skip to main content
Glama
Inistate

Inistate MCP Server

Official
by Inistate

Inistate MCP Server

MCP server for the Inistate platform — module discovery, entry management, and activity submission.

Setup

Environment Variables

Variable

Required

Default

Description

INISTATE_API_TOKEN

Yes

—

Bearer token for Inistate API authentication

INISTATE_API_BASE

No

https://api.inistate.com

API base URL

INISTATE_MCP_MODE

No

configure

Initial mode: runtime, configure, or frontend (see Modes)

INISTATE_MCP_NO_SETUP

No

—

Set to 1 to force server mode from a terminal (skip the interactive wizard)

INISTATE_DEBUG_FILE

No

—

Set to 1 to log write-path tool calls to ./debug.log, or to a path to log there. Off by default; logs identifiers only, never field values

No clone or build needed — npx will fetch and run the published package on demand:

npx -y inistate-mcp

Or install globally:

npm install -g inistate-mcp
inistate-mcp

Run the binary in a terminal with no MCP client attached and it walks you through entering your API token and picks the right config file for your client:

npx -y inistate-mcp
# or, explicitly:
npx -y inistate-mcp setup

Supported clients: Claude Desktop, Claude Code (global or project-local .mcp.json), Cursor, Windsurf, Codex CLI, VS Code (user profile or workspace .vscode/mcp.json), Cline, Gemini CLI (global or workspace). Pick "Print config only" to get a JSON block to paste anywhere else.

The wizard only runs when stdin is a TTY (i.e., you launched it yourself). When an MCP client spawns the binary via piped stdio, it skips the wizard and runs as a normal MCP server — set INISTATE_MCP_NO_SETUP=1 if you need to force server mode from a terminal.

Claude Desktop Configuration

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "inistate": {
      "command": "npx",
      "args": ["-y", "inistate-mcp"],
      "env": {
        "INISTATE_API_TOKEN": "your-token-here"
      }
    }
  }
}

Claude Code Configuration

claude mcp add inistate -e INISTATE_API_TOKEN=your-token-here -- npx -y inistate-mcp

Install from source

git clone https://github.com/Inistate/inistate-mcp.git
cd inistate-mcp
npm install
npm run build

Then point your MCP client at node /absolute/path/to/inistate-mcp/build/index.js.

Related MCP server: ResearchTwin MCP Server

Tools

Tools marked (configure) are only exposed in configure mode — see Modes. Tools that depend on a local-runtime capability, such as scaffold_module, are not exposed by the hosted Platform.

Tool

Description

list_workspaces

List workspaces the user has access to

set_workspace

Set the active workspace

list_modules

List all discoverable modules in the workspace

get_module_schema

Get the canvas schema (basic or extended tier) — available in every mode

get_module_canvas

Get full module definition with stable IDs (round-trippable) (configure)

list_entries

Query entries with filters, sorting, and pagination

aggregate_entries

Count, sum, average, min or max over matching entries, optionally grouped — the platform does the arithmetic

get_entry

Read a single entry by ID

get_form

Get form fields and defaults for an activity

submit_activity

Create, edit, delete, or run custom activities

submit_activities

Bulk variant — same activity applied to up to 100 entries in one call

get_entry_history

Get entry audit trail and comments

request_upload_url

Default upload path — get a presigned S3 URL to PUT file bytes to

confirm_upload

Confirm a presigned upload completed; returns the File/Image field path

upload_file

Fallback upload via base64/multipart (use only if the presigned flow fails)

download_file

Download a file (returns pre-signed URL)

design_workflow

Generate a scaffolded module template from a description (configure)

validate_design

Validate a module schema before creating or updating (configure)

create_module

Create a new module with schema (configure)

update_module

Update an existing module's schema (configure)

scaffold_module

Draft a module schema from existing SQLite, Notion, or Airtable data (configure) — local runtime (inistate-core) only; it never creates a module

switch_mode

Switch the active mode (runtime / configure / frontend)

Resources

URI

Description

inistate://modules

List all modules

inistate://modules/{name}/canvas

Basic module schema (fields + states)

inistate://modules/{name}/canvas/extended

Extended schema with activities and flows

inistate://guardrails

Server-enforced submit_activity rules (read once per session)

inistate://schema/runtime

Runtime schema — entry/activity/file types and filter operators (default)

inistate://schema/configure

Module-design schema — write format, field types, colors (configure)

inistate://design-guide

FACTS Module Design Guide (configure)

inistate://frontend-guide

REST API reference for hand-written UIs (frontend)

Prompts

Prompt

Description

design_factsops_workflow

Guide an agent through designing a complete workflow module (configure)

execute_activity

Guide an agent through executing a specific activity

diagnose_entry

Guide an agent through investigating an entry's state and history

modify_module

Guide an agent through modifying an existing module's schema (configure)

Modes

The server exposes a focused tool/resource surface depending on the active mode, keeping agent context lean. Use switch_mode to change it, or set the initial mode via the INISTATE_MCP_MODE env var (default: configure).

Mode

Surface

runtime

Entry and activity operations only — querying, reading, submitting, files, history. The leanest surface for using existing modules.

configure

Everything in runtime plus the module-design tools, resources, and prompts (marked (configure) above).

frontend

Everything in configure plus the inistate://frontend-guide resource for building hand-written UIs against the REST API.

Tools and resources marked (configure) / (frontend) are absent from the tool list in narrower modes — switch modes to reveal them.

Typical Workflow

  1. list_workspaces → set_workspace — select a workspace (auto-selected when exactly one matches; both return the workspace's module list, so list_modules is only needed to refresh)

  2. get_module_schema — understand a module's fields, states, and activities

  3. get_form — discover required fields before the first submission per (module, activity); reuse its schema for further entries

  4. submit_activity — create or update entries (submit_activities for bulk)

  5. list_entries — query and browse data (use the fields parameter to keep payloads small)

  6. get_entry_history — review entry history

Development

npm run watch          # Watch mode for TypeScript compilation
npm run inspector      # Test with MCP Inspector

Branches

  • main is the development branch. Feature and fix work lands here.

  • production is the publishing branch. It only receives release merges.

Packaging & Versioning

Every change that should ship needs a changeset:

# After coding, on a feature branch merged into main
npx changeset

# Choose the bump (patch / minor / major) and describe the change

Releasing

Releases run from main. A release is a v* tag on production; pushing the tag runs the Publish GitHub Actions workflow (.github/workflows/publish.yml), which publishes to npm and the MCP registry.

npm run release              # full release
npm run release -- --no-push # do everything locally, push nothing
npm run package:chatgpt      # create the ChatGPT plugin ZIP in artifacts/

This does:

  1. Checks you are on an up-to-date main with a pending changeset

  2. Runs tests and the build

  3. Bumps the version, updates the changelog and syncs server.json

  4. Commits Release vX.Y.Z on main, merges main into production and tags vX.Y.Z

  5. Pushes main, production and the tag

The workflow fails if the tag, package.json and server.json versions disagree, or if the tagged commit is not on production. It skips the npm publish when that version is already on npm.

Setup the workflow relies on (one time):

  • npm: add a Trusted Publisher for this package (GitHub Actions, repo Inistate/inistate-mcp, workflow publish.yml)

  • MCP registry: the workflow logs in with GitHub OIDC, so no personal login is needed

Publishing manually (fallback)

Only if the workflow is unavailable. Install mcp-publisher:

curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/
$arch = if ([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture -eq "Arm64") { "arm64" } else { "amd64" }; Invoke-WebRequest -Uri "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_windows_$arch.tar.gz" -OutFile "mcp-publisher.tar.gz"; tar xf mcp-publisher.tar.gz mcp-publisher.exe; rm mcp-publisher.tar.gz

Then, from the released commit:

npm publish
mcp-publisher validate
mcp-publisher login github   # needs a public Inistate org membership
mcp-publisher publish

Deployment

Deployment is done by hand; there is no CI deploy. After a release, update the server (see PM2 below): pull production, npm ci, npm run build, then npm run pm2:restart.

PM2 (Ubuntu/AWS)

Run the HTTP transport in production using PM2:

npm install
npm run build
npm run pm2:start
npx pm2 save

Enable startup on reboot:

sudo npx pm2 startup systemd -u ubuntu --hp /home/ubuntu
npx pm2 save

Common operations:

npm run pm2:restart
npm run pm2:logs
npm run pm2:stop

Set required environment variables (INISTATE_API_TOKEN, and optionally INISTATE_API_BASE, INISTATE_WORKSPACE_ID, OAUTH_ISSUER_URL, INISTATE_APP_URL) in your shell, PM2 ecosystem env, or deployment secret manager before starting.

Testing

Run all tests

npm test

Watch mode (re-runs on file changes)

npm run test:watch

Test structure

Tests are in src/ alongside the source files and use Vitest:

File

Type

What it covers

src/schema.test.ts

Unit tests (76)

designWorkflow, validateDesign (including platform parity and input normalization), helper functions (isValidFieldType, isValidColor, isValidActor, suggestColorForState)

src/activity-guard.test.ts

Unit tests (42)

submit_activity guard rules — human/hybrid actor, state-change confirmation, confidence-inflation, reference-shape validation

src/tools.schema.test.ts

Unit tests (19)

Tool input-schema shapes and validation

src/backend-capabilities.test.ts

Unit tests (9)

Capability gating — tools the active backend cannot serve return a capability message

src/flagged-annotation.test.ts

Integration tests (5)

Flagged-response annotation — suppressed transitions are explained (flag_reason + agent_action) so agents stop retrying with higher confidence

src/server.test.ts

Integration tests (17)

Spins up the MCP server as a child process and exercises it through the official MCP SDK client — mode-gated tool/resource/prompt discovery, switch_mode, resource reads, prompt retrieval, and local tool calls

Unit tests cover:

  • Field type and color validation against the schema

  • State color suggestion logic

  • Design validation: duplicate names, invalid types/colors/actors, initial state rules, flow integrity, unreachable states, unused activities, AI confidence warnings

  • Input normalization: field-type, state-color, and industry aliases; parsing states from a description

  • Workflow design: pattern detection (approval, ticket, pipeline, record list), industry defaults

Integration tests verify (no API token needed):

  • Mode-gated tool/resource/prompt discovery — runtime mode hides the configure surface, switch_mode reveals and collapses it

  • design_workflow, validate_design work end-to-end through the MCP protocol

  • Static resources (inistate://schema/runtime, inistate://design-guide) return valid content

  • All 4 prompts return correctly templated messages

Interactive testing with MCP Inspector

INISTATE_API_TOKEN=your-token npm run inspector

Opens a browser UI where you can interactively call tools, inspect schemas, and see responses.

Available Tools

21 tools
aggregate_entriesAggregate EntriesA
Read-onlyIdempotent
Inspect

Totals without paging rows: count, sum, average (ave), min or max of a field over the entries list_entries would list, optionally grouped by a field (a date by day, week or month) and broken down by a second field. Use it for 'how many / how much / total / average / top N / per month' questions instead of adding up list_entries pages.

The query parameters (module, listing, state, search, filters) ARE list_entries' — same names, same meaning, same access — so pass exactly what you would pass list_entries to read those entries.

The answer: groups [{key, count, value}] (with a breakdown, values [{key, value}] per group), total {count, value} over EVERY matching entry, complete (false: the module's engine read only its first 501 entries, so the figures are partial — narrow the filters, or say they are partial) and groupsTruncated (only the largest top groups, or the latest periods, are listed; total is still whole).

Filter or group by state when Cancelled or Draft entries must not count. What a figure means — signs, which entries belong in it — comes from the module's description and get_module_schema.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYesThe metric
topNoMost groups returned, 1–500. Default 100.
fieldNoField the metric reads (a number for sum/ave; a number or date for min/max). Not needed for count.
stateNo
moduleYesModule name from list_modules
searchNoFree-text search across document ID, state, and text-like fields; supports * and ? wildcards
filtersNo
groupByNoField to group by: a display name, or state, date, createdBy, assignees …
listingNoListing (saved view) name to query, case-insensitive; 'archive' targets archived entries. Defaults to the unfiltered 'Everything' view, which is admin-only on modules with listings — non-admins must name an accessible listing (an access-denied response lists them).
intervalNoOnly when groupBy is a date field. Default day.
breakdownNoSecond field, splitting each group
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnly/idempotent, but the description adds substantial behavior beyond them: the `complete` flag semantics (engine reads only first 501 entries), `groupsTruncated` meaning vs whole `total`, and the admin-only default 'Everything' listing constraint. These are non-obvious operational traits an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the routing sentence; the query-parameter equivalence paragraph is slightly longer than needed but earns its place by reducing invocation errors. Generally efficient, though dense across four paragraphs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates fully by describing the return shape (groups, values, total, complete, groupsTruncated) and where figure semantics come from (get_module_schema). Nothing essential to calling or interpreting it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so baseline 3, but the description adds real value: it declares the query params (module, listing, state, search, filters) are identical in name/meaning/access to list_entries', telling the agent how to populate them. It doesn't detail `top`/`breakdown` interaction beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: aggregation (count/sum/ave/min/max) over 'the entries list_entries would list', immediately disambiguating scope against a specific sibling. The 'Totals without paging rows' opening makes the operation's nature unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes intent: 'Use it for how many / how much / total / average / top N / per month questions instead of adding up list_entries pages.' Names the alternative and the condition that selects this tool, clearly a strong when-to-use directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirm_uploadConfirm UploadAInspect

Confirm a presigned upload after the PUT to uploadUrl succeeded. The server verifies the object in S3 and returns { url, filename, mimeType, size } — url is the /s/ path usable as a File/Image field value. Returns 400 if the file is not in S3 (ensure the PUT completed first).

ParametersJSON Schema
NameRequiredDescriptionDefault
s3KeyYesThe s3Key returned from request_upload_url.
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is not read-only, not idempotent, and not destructive; the description adds real behavioral detail on top: the server verifies the object in S3, the exact return shape, and the 400 failure condition. It does not say what happens on repeat confirmation, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the trigger condition, then the return contract and the failure mode. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by spelling out the returned { url, filename, mimeType, size } and explaining that url is the /s/ path usable as a File/Image field value. Combined with the 400 error case, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both s3Key and workspaceId are already documented in the schema, including the workspaceId env/stateless fallback. The description adds no extra syntax or format meaning beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (confirm) plus resource (a presigned upload) and the precise precondition (the PUT to uploadUrl succeeded). It is clearly distinguishable from request_upload_url and upload_file among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the exact moment to call it ('after the PUT to uploadUrl succeeded') and warns to ensure the PUT completed first. It does not explicitly contrast with the sibling upload_file path, so it stops just short of naming alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_moduleCreate ModuleAInspect

Create a new module. Supports workflow modules (states, activities, flows) and record list modules (fields only). Requires Administrator, Consultant, or Workspace Admin role. Validates internally with the same rules as validate_design and returns structured errors without creating anything — a separate validate_design call beforehand is optional. See inistate://schema/configure for field types, color palette, and design rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
cardNoThe listing card designed with the schema — how each entry shows in the module's list (mobile and web). Fields and activities by NAME. See CardDefinition in inistate://schema/configure. A card that does not pass never fails the call: the module gets the platform's default card and the response's cardStatus says why.
iconNoEmoji identifier
nameYesModule name
flowsNoState transition rules: { from, to, activity } by name. Omit for record list modules.
statesNoWorkflow states. Omit for record list modules.
activitiesNoCustom activities. Omit for record list modules.
descriptionNo
informationNoField definitions. Items matched by id on update enable renaming.
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-idempotent, non-destructive, closed-world write, so the safety profile is covered. The description adds real behavioral context beyond that: role-based authorization, self-validating semantics that return structured errors 'without creating anything', and a pointer to the design-rules resource. It still doesn't describe the success payload or any rate/side-effect limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the core action, then mode support, then prerequisites, then the validation/alternative nuance, ending with a resource pointer. Every sentence carries distinct information with no repetition of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with deeply nested objects and no output schema, the description covers purpose, authorization, validation behavior, and where the design rules live, which is close to sufficient. The remaining gap is the success response shape (e.g. whether a module id is returned) and workspace-scoping expectations, which are only partially inferable from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 89%, so the baseline is 3, but the description adds the key cross-parameter insight: which parameter families apply to workflow modules versus record list modules, and that field types/color rules live in inistate://schema/configure. That conditional-mode framing is meaningfully more than the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new module') and immediately scopes it into its two supported flavors: workflow modules (states, activities, flows) and record list modules (fields only). This lets an agent tell it apart from update_module and design_workflow without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context: required roles are named, and it explicitly routes the validate-then-create decision by saying internal validation mirrors validate_design and that a separate validate_design call is optional. It does not say when to prefer this over sibling design_workflow or when creation is inappropriate, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

design_workflowDesign WorkflowA
Read-onlyIdempotent
Inspect

Generate a scaffolded ModuleSchema template from a natural language description. Use when the user wants to create a new module or workflow.

Design workflow: design_workflow → (complete template) → validate_design → create_module → get_module_schema(tier=extended). Load resources inistate://schema and inistate://design-guide before designing for valid field types, colors, and design rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
industryNoIndustry context, free text — mapped to financial_services, healthcare, legal, hr, procurement, it_service, or general (default). Affects audit fields, confidence thresholds, actor suggestions.
descriptionYesNatural language description of the desired workflow. Include: entity type, lifecycle states, activities, who performs each, what data is collected.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value by disclosing resource loading (inistate://schema and inistate://design-guide) and the pipeline nature, which are not conveyed by annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no redundancy: first states purpose, second gives usage trigger, third provides pipeline and prerequisites. Every sentence adds unique value and is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the output type ('scaffolded ModuleSchema template') and its role in a larger workflow. Resource loading and pipeline context provide sufficient completeness for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema descriptions cover both parameters fully (100% coverage), but the tool description enhances them by specifying the industry mapping behavior and providing detailed guidance on what to include in the 'description' parameter, plus resource loading instructions that affect parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it generates a 'scaffolded ModuleSchema template' from natural language, uses a specific verb ('Generate'), and distinguishes from siblings by outlining the workflow pipeline (design_workflow → validate_design → create_module → get_module_schema).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly says 'Use when the user wants to create a new module or workflow' and provides a pipeline for subsequent steps. Lacks explicit 'when not to use' or direct alternatives, but the context is sufficient for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_fileDownload FileA
Read-onlyIdempotent
Inspect

Download a file by module name. Construct the URL from a File/Image field value: field.path = '/s/{guid}/{fileName}'. Returns a pre-signed S3 URL (1hr TTL).

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesShort ID from the file URL
fileNameYesOriginal filename
moduleNameYesModule name (resolved to vectorId internally)
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by specifying that a pre-signed S3 URL with 1hr TTL is returned, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. The main purpose is front-loaded, and each sentence adds essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only file download tool returning a URL, the description is complete. It covers operation, input hints, and output format. No output schema is needed, and the tool is well-documented for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context about how 'guid' and 'fileName' construct the URL path, but does not significantly enhance the parameter meanings beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Download a file by module name' and explains that it returns a pre-signed S3 URL. It distinguishes from sibling tools like upload_file by focusing on download and URL generation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides implicit usage context (construct URL from field.path) but does not explicitly state when to use this tool versus siblings like upload_file or confirm_upload. No direct alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_entryGet EntryA
Read-onlyIdempotent
Inspect

Read-only lookup of a single entry by its ID; it changes nothing and performs no activity. Returns current field values, state, audit metadata, and the names of the activities available on it (to perform one, use get_form then submit_activity).

ParametersJSON Schema
NameRequiredDescriptionDefault
moduleYesModule name from list_modules
entryIdYesEntry ID
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context: it changes nothing, performs no activity, and returns specific current data plus activity names, though it omits error or not-found behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, then the return behavior and activity-execution routing. Every sentence adds distinct value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description appropriately explains what the tool returns: current field values, state, audit metadata, and available activity names. Combined with annotation-covered safety and fully documented schema parameters, an agent has enough context to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents module, entryId, and workspaceId. The description only reinforces lookup-by-ID and does not add syntax, format, or workspace-mode details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Read-only lookup of a single entry by its ID.' It also distinguishes the scope from list_entries by specifying a single entry, and from get_entry_history by focusing on current field values, state, and available activities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly routes the agent for follow-up activity execution: 'to perform one, use get_form then submit_activity.' However, it does not explicitly contrast this tool with get_entry_history or state when current-state lookup is preferable over history retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_entry_historyGet Entry HistoryA
Read-onlyIdempotent
Inspect

Get the audit trail and comments for an entry. Returns chronological list of actions (create, edit, state changes, comments) with field-level change details and AI traceability context.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (0-based, 50 items per page)
moduleYesModule name from list_modules
entryIdYesEntry ID to get history for
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-destructive read-only behavior. Description adds value by specifying output format (chronological list with field-level changes and AI traceability), going beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with verb and resource, no fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes purpose and return content well. However, missing mention of pagination (page parameter) and required parameters (module, entryId). Schema covers them, but description could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 4 parameters with descriptions (100% coverage). Description does not add further parameter details, but baseline 3 is appropriate since schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it gets audit trail and comments for an entry, mentioning specific return content (chronological actions, field-level changes, AI traceability). Distinguishes from siblings like get_entry, which returns the current entry, not history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implicitly suggests use when audit trail needed, but lacks explicit when-not or alternative tools. Among siblings, get_entry is for current state, but no direct comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_formGet Activity FormA
Read-onlyIdempotent
Inspect

Read-only lookup of the input form for one named activity of one module; it does not perform the activity (submit_activity does). Returns the form fields, current values, and options. Call this before the FIRST submit_activity on each (module, activity) pair — the form schema is stable within a session, so reuse it for subsequent entries (per-entry current values come from get_entry/list_entries). User values with no matching field: omit them and note the omission. Never fabricate form data — when a value is uncertain, submit with a lower ai.confidence and state the assumption instead of blocking to ask. A field may carry label: the name THIS activity's form shows for it (the designer relabelled it) — when the user names a field by that label, it means this field; key input by the field name (the label is accepted too). The response's actor says who may perform the activity: ai — submit it; hybrid — show the user what you plan to submit and get their explicit approval, then submit with confirmed: true; human — do not submit, a person performs it in Inistate. The response's ai_hint/ai_instruction are the designer's guidance for performing the activity; an ai_hint on a field or Table/List column says how to fill it.

ParametersJSON Schema
NameRequiredDescriptionDefault
moduleYesModule name from list_modules
entryIdNoEntry ID for edit/view/custom activities. Omit for create.
activityNoActivity name: create, edit, view, or any custom activity name from get_module_schemacreate
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses the response's actor semantics (who may perform the activity), ai_hint/ai_instruction, field label-vs-name mapping, and the no-fabrication policy with ai.confidence fallback. This is exactly the context an agent needs before driving submit_activity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose well, but the single dense block drifts into submission policy ('submit with a lower ai.confidence') and hint-handling rules that belong to submit_activity rather than to a read-only form lookup. Useful content, but not every sentence earns its place in this tool's description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry the return contract, and it does: form fields, current values, options, actor, and ai_hint/ai_instruction are all named. Combined with the input schema, an agent has everything needed to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it frames module+activity as a session-stable pair, explains that `activity` can be create/edit/view/custom, and clarifies how `input` keys relate to a field's `label` versus its name. It does not, however, add much for entryId or workspaceId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read-only lookup of the input form for one named activity of one module') and immediately differentiates from the sibling that performs the action ('it does not perform the activity (submit_activity does)'). An agent can distinguish this from submit_activity and get_entry without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('Call this before the FIRST submit_activity on each (module, activity) pair'), a reuse rule ('form schema is stable within a session'), and alternative sources for later values (get_entry/list_entries). It also routes behavior based on the returned actor value (ai/hybrid/human) and tells the agent what to do with user values that have no matching field.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_module_canvasGet Module CanvasA
Read-onlyIdempotent
Inspect

Get the full module definition with stable IDs. The output is round-trippable — modify and send back via update_module. Use this when modifying a module to preserve IDs for renaming.

Modify workflow: list_modules → get_module_canvas → (apply changes) → validate_design → update_module. Load resource inistate://schema before modifying to know valid field types, colors, and actors.

ParametersJSON Schema
NameRequiredDescriptionDefault
moduleYesModule name or numeric ID
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds valuable behavioral context: 'The output is round-trippable — modify and send back via update_module' and instructs to load inistate://schema before modifying. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences covering purpose and workflow, plus a resource instruction. Every sentence adds value with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately conveys that the output is the full module definition and round-trippable. It covers how to use it in a workflow and prerequisites. Could mention return format but not essential for a getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with clear descriptions for both parameters. The description does not add additional meaning beyond the schema, so baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves the full module definition with stable IDs, using the verb 'get' and specifying 'full module definition'. It distinguishes from siblings like list_modules (which lists) and get_module_schema (likely different scope) by emphasizing round-trippability and the modify workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises using this tool when modifying a module to preserve IDs and provides a modify workflow. It gives clear context but does not explicitly state when not to use it, though the workflow implies a sequence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_module_schemaGet Module SchemaA
Read-onlyIdempotent
Inspect

Read-only lookup of one module's schema; it changes nothing and performs no activity. Returns the canvas schema for a module. Use tier=basic (default) for fields and states only. Use tier=extended to also include activities and flows. Use basic for query operations. Use extended when you need to understand available activities and state transitions.

What the module's designer wrote for an AI rides beside the name lists: stateDetails (both tiers) gives each state's ai_hint/ai_instruction — e.g. which states no longer count — and activityDetails (extended) gives each activity's actor (ai: you may submit it; hybrid: only after the user approves the planned submission; human: never — a person performs it), ai_hint/ai_instruction, confidence_threshold and from (the states it can be performed in). A top-level ai_instruction is the module's standing instruction — follow it.

Both tiers include your accessible listings: each carries its designed filter in the SAME shape as list_entries' filters (applied automatically when that listing is queried — pick the listing whose conditions already match the question and do NOT re-add them as filters), plus partialFilter (an inexpressible formula/script condition also applies), profileOnly (rows limited to the current user's own entries) and scripted markers. Pass a listing's name as list_entries' listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNobasic = fields + states. extended = + activities and flows.basic
moduleYesModule name from list_modules
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description goes far beyond that by disclosing returned fields (stateDetails, activityDetails, ai_instruction), the actor semantics (ai/hybrid/human), partialFilter/profileOnly listing behavior, and how a listing's filter is auto-applied. This is substantial context an agent cannot get from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, and most content (tier guidance, actor semantics, listing behavior) earns its place. The listing paragraph is dense and packs multiple ideas into one sentence, but it stays on-topic for an agent that must call list_entries afterward.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-value burden and does so thoroughly, enumerating the fields each tier yields and their meaning. For a tool whose output drives downstream query construction, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds genuine decision guidance for the tier enum (which tier to pick and why) rather than restating the schema's terse default. It adds nothing for workspaceId, which the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Read-only lookup of one module's schema', and immediately qualifies what it returns ('the canvas schema for a module'). The basic/extended tier split further pins down what the agent gets back, so it is distinguishable from generic module tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use rules for the tier parameter ('Use basic for query operations. Use extended when you need to understand available activities and state transitions') and for listings ('pick the listing whose conditions already match the question and do NOT re-add them as filters'). It stops short of naming an alternative sibling such as get_module_canvas, leaving that boundary to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_entriesList EntriesA
Read-onlyIdempotent
Inspect

Query entries with filters, sorting, pagination. Filter keys are field display names; values are equality (simple) or operator objects (contains/startsWith/endsWith/min/max/above/below/between/after/before/empty/exists/yes/no/is/not/excludes). Use {or:[…]} for OR; multiple keys are AND-ed. Use 'me' for User-field self-match. See FilterOperators in inistate://schema/runtime for the full set.

Access: non-admin users cannot query the unfiltered default 'Everything' view on modules that have listings — pass listing with one of their accessible listings (an access-denied response names them).

Token control: use fields to restrict the returned data to just the columns you need. For modules with many fields this can shrink the response by an order of magnitude. Every item carries entryId, documentId and state whatever fields holds; the other system fields (date, createdBy, createdDate, updatedBy, updatedDate, assignees, due) come with the full row, but when fields is given only if it names them.

Check each item's state before totalling, counting or ranking entries: a Cancelled or Draft entry usually must not count. get_module_schema's stateDetails says what each state means.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo
fieldsNoField display names (or raw field names) to include in each entry's `data`. Strongly preferred over returning everything when the module has many or large fields — prunes both DB I/O and response tokens. Omit only when you actually need the full row. entryId, documentId and state are always returned; name any other system field (date, createdBy, createdDate, updatedBy, updatedDate, assignees, due) here to get it.
moduleYesModule name from list_modules
searchNoFree-text search across document ID, state, and text-like fields; supports * and ? wildcards
sortByNo
filtersNo
listingNoListing (saved view) name to query, case-insensitive; 'archive' targets archived entries. Defaults to the unfiltered 'Everything' view, which is admin-only on modules with listings — non-admins must name an accessible listing (an access-denied response lists them).
pageSizeNoDefault 50, max 500
currentPageNo
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.
sortDirectionNoasc

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial non-structured behavior: non-admin users cannot query the default 'Everything' view and must pass an accessible `listing` (access-denied names them), plus token-control behavior via `fields` and the exact system fields always vs conditionally returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line purpose before three labeled context blocks (filtering, access, token control, state check), so structure is strong and each paragraph earns its place. It is on the long side, but the density is justified by the 11-parameter, nested-filter surface.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-shape burden and does so by explaining `data` pruning and always-present entryId/documentId/state fields. It remains silent on pagination metadata and several simple parameters (sortBy, currentPage), so a small completeness gap persists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 55%, and the description compensates heavily for the hard parts: filter key = field display name, operator-object grammar (contains/startsWith/min/max/between/after/before/empty/exists/is/not/excludes), {or:[…]} and implicit AND, and 'me'. However, sortBy, state, and currentPage still receive no meaning anywhere, leaving gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource plus scope: 'Query entries with filters, sorting, pagination.' An agent can distinguish this list-level retrieval from get_entry (single) and aggregate_entries, but the description never names those siblings explicitly, so differentiation is inferred from scope rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides rich operational context: filter operator grammar, OR/AND composition, 'me' self-match, and the rule to check `state` before totalling/ranking. It lacks explicit when-to-use-this-vs-alternatives routing (e.g., point counting tasks at aggregate_entries), so it is clear context without exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_modulesList ModulesA
Read-onlyIdempotent
Inspect

List all discoverable modules in the current workspace. set_workspace already returns this list — call this only to refresh it or when operating stateless without set_workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive. Description adds context: modules are 'discoverable', and behavior depends on workspace state (stateless vs stateful via set_workspace). No contradiction, and supplements annotations with usage-specific behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose, second provides usage guidance. Front-loaded and efficient with no extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 1 optional parameter, high schema coverage, no output schema, and clear annotations, the description fully covers what an agent needs: purpose, when to use, and parameter semantics. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers workspaceId with description. Description adds conditional semantics: 'Omit if set via env or set_workspace; required in stateless/remote mode', which clarifies when the parameter is needed beyond schema constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'List all discoverable modules in the current workspace', specifying verb (list) and resource (modules). It distinguishes from sibling set_workspace by noting that set_workspace already returns this list, avoiding redundancy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'call this only to refresh it or when operating stateless without set_workspace'. Provides clear context and alternative, guiding appropriate invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_workspacesList WorkspacesA
Read-onlyIdempotent
Inspect

List workspaces the current user has access to. Typically the first call of a session. If exactly one workspace matches, it is selected automatically and its module list is returned — no set_workspace or list_modules needed; otherwise call set_workspace next. Administrators: without search this lists your own memberships; pass search to find any workspace by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoOptional name filter (case-insensitive)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds behavior those annotations cannot express: automatic workspace selection when a single match occurs, the fact that a module list is returned in that case, and that admin listing is scoped to own memberships unless `search` is passed. This is genuine disclosure beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences, each carrying distinct information (purpose, call order/auto-selection, admin search behavior). No filler or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description explains the meaningful return case (module list returned on single match) and the routing decision that follows. For a zero-required-parameter read tool, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema does not: `search` changes admin behavior from listing own memberships to finding any workspace by name. It clarifies semantics of the optional filter well beyond the schema's 'case-insensitive name filter'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List workspaces the current user has access to') and bounds the scope to accessible workspaces. This is easily distinguishable from siblings like list_modules or set_workspace.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says it is 'typically the first call of a session' and names the branch condition: if exactly one workspace matches, no set_workspace or list_modules is needed; otherwise call set_workspace next. It also distinguishes admin behavior of `search`. Alternatives and exclusions are given, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_upload_urlRequest Upload URLAInspect

DEFAULT upload path for every file (up to 500MB); upload_file is only the fallback if this flow fails. Flow: 1) call this tool, 2) PUT the raw bytes to uploadUrl with Content-Type exactly matching contentType (S3 rejects mismatches with 403), 3) call confirm_upload({ s3Key }) — its returned path is the File/Image field value for submit_activity. uploadUrl expires in ~1 hour; call again on expiry.

ParametersJSON Schema
NameRequiredDescriptionDefault
moduleYesModule name. Required — scopes the file to the module's storage folder.
fileNameYesOriginal filename including extension (e.g. 'report.pdf')
fileSizeYesFile size in bytes. Must be > 0 and ≤ 500MB (524288000).
contentTypeNoMIME type. Must match the Content-Type header used in the PUT request.application/octet-stream
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/destructive/idempotent/openWorld flags; the description adds critical behavior beyond them — the URL expires in ~1 hour, the PUT requires Content-Type to exactly match contentType or S3 returns 403, and the returned s3Key must be passed to confirm_upload. This is rich operational context not present in structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the key routing decision (default vs fallback) and then enumerates the flow compactly. It is dense and slightly crammed with clauses, but every sentence contributes necessary operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step upload tool with no output schema, the description supplies the complete flow, expiry caveat, error condition, and how to use the result (s3Key path for submit_activity). An agent has everything needed to execute the full sequence without further documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter (module, fileName, fileSize, contentType, workspaceId) is already documented in the schema. The description reiterates the 500MB limit and contentType matching but adds no syntactic or semantic detail beyond what the schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (request an upload URL) and explicitly establishes it as the DEFAULT upload path, distinguishing it from the fallback sibling upload_file. The multi-step flow makes the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool ('DEFAULT upload path for every file up to 500MB') and when to use the alternative ('upload_file is only the fallback if this flow fails'). It also gives the exact sequence of follow-up calls (confirm_upload, submit_activity), leaving no routing ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_workspaceSet Active WorkspaceA
Idempotent
Inspect

Set the active workspace for the current session. The response includes the workspace's module list — go straight to list_entries / get_form / get_module_schema with those names; list_modules is only needed to refresh. In stateless/remote mode, prefer passing workspaceId directly to each tool instead.

Workflow sequences after workspace is set:

  • Design: design_workflow → create_module (validates internally)

  • Execute: list_entries → get_form → submit_activity

  • Modify: get_module_canvas → validate_design → update_module

  • Query: list_entries → get_entry / get_entry_history; aggregate_entries for totals

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdYesWorkspace ID (or exact name) from list_workspaces

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered structurally. The description adds real context beyond that: the mutation is session-scoped, the response carries the module list, and the stateless-mode caveat changes behavior. It stops short of describing persistence or what happens on an invalid name/ID.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first two sentences are tight and front-loaded with the key constraint. However, the trailing block of four workflow sequences (design/execute/modify/query) concerns other tools' chaining rather than setting a workspace, and reads as bulk that could live in each tool's own description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by stating that the response includes the workspace's module list, which is the main thing an agent needs to know. The one-parameter, non-destructive, idempotent mutation is adequately characterized; only error/invalid-input behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter is fully documented in-schema (accepts ID or exact name from list_workspaces). The description only echoes the workspaceId name in the stateless-mode note and adds no new format or validation semantics, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set the active workspace for the current session') and immediately distinguishes itself from siblings by noting that list_workspaces is the discovery tool and list_modules is only needed to refresh. An agent can tell exactly what this does versus switch_mode or list_workspaces without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use this in stateful sessions, but 'in stateless/remote mode, prefer passing workspaceId directly to each tool instead' — a genuine when-not-to-use rule naming the alternative. It also clarifies when list_modules is actually required, removing a common false-positive call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_activitiesSubmit Activities (Bulk)A
Destructive
Inspect

Write operation, the bulk variant of submit_activity: one call applies one named activity of one module to many entries (the same activity for every item; nothing else runs), each item with its own input. Use instead of N sequential submit_activity calls when creating/editing many rows — one tool turn instead of N. A per-item ai wholly replaces the top-level default (no partial merge). Items run sequentially fail-soft on the server: one failure does not abort the rest; per-item outcomes (success, entryId, flagged, validation details) return in results — use clientRef to correlate. Max 100 items; chunk beyond that. Guardrails match submit_activity at batch level: actor='human' rejects the whole batch; actor='hybrid', activity='changeStatus', or any state override (top-level or per-item) requires confirmed: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
aiYesDefault AI traceability applied to every item that does not specify its own. Same field semantics as submit_activity.ai.
itemsYes1-100 items. Each item carries only what differs from the top-level activity.
moduleYes
activityNocreate
confirmedNoREQUIRED when the activity is 'changeStatus', any per-item or top-level `state` override is supplied, or the activity's actor is 'hybrid'. Set true ONLY after surfacing the planned bulk action to the user.
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the write/non-idempotent profile is covered structurally. The description nonetheless adds substantial context beyond them: fail-soft sequential execution, per-item outcomes returned in `results`, per-item `ai` wholly replacing (not merging with) the top-level default, and the actor/changeStatus/state-override rules that force `confirmed: true`. This is real disclosure that goes well past what the annotations state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the routing decision before moving to mechanics and guardrails. It is dense — the "Max 100 items" point duplicates the schema's maxItems constraint — but nearly every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming what returns in `results` (success, entryId, flagged, validation details) and how to correlate via `clientRef`. Combined with batch-level guardrails and chunking guidance, an agent has everything needed to invoke this correctly at scale.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, and the description fills key gaps: it clarifies the no-partial-merge semantics of per-item `ai`, the correlation purpose of `clientRef`, and the precise trigger conditions for `confirmed` (actor='hybrid', activity='changeStatus', or any state override). It does not restate the simpler item fields already documented in the schema, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("bulk variant of submit_activity: one call applies one named activity of one module to many entries") and explicitly contrasts itself with the sibling submit_activity. An agent can distinguish it from submit_activity and the read-only siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative and the condition that selects it: "Use instead of N sequential submit_activity calls when creating/editing many rows — one tool turn instead of N." It also supplies operational guidance (max 100 items, chunk beyond that) and the guardrail conditions that gate use of `confirmed`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_activitySubmit ActivityA
Destructive
Inspect

Write operation: one call performs exactly one named activity on one entry of one module, and nothing else runs. The activity is the activity argument — a standard one (create [no entryId], edit, delete, changeStatus, comment, duplicate, manage) or a custom activity the workspace's designer defined (listed by get_module_schema tier=extended); activity names are data, not hidden tools. Call get_form before the first submission per (module, activity); reuse its schema for further entries. The ai object is REQUIRED (reasoning + model + confidence). If confidence < the activity's threshold, the transition is suppressed and the entry is flagged. Server-side guard rules (human/hybrid actor, state-change confirm, confidence-inflation) may block — see inistate://guardrails. Input shapes: ActivitySubmission in inistate://schema/runtime.

ParametersJSON Schema
NameRequiredDescriptionDefault
aiYesREQUIRED — AI agent traceability
dueNoISO 8601
inputNoField values keyed by display name, as an object (never a JSON-encoded string). File/Image: {name,path}. Module: {id,value} (both required). User: {id,value,username} (all three required). Plural variants (Users/Modules/Files/Images): arrays of those objects. Location: {lat,lng,placeName} — lat/lng unquoted numbers, placeName the place's display name; never a combined "lat,lng" string. Table: an array of row objects keyed by sub-field name, e.g. [{"Item Code": "A-1", "Qty": 2}]. Number/Currency/Integer: JSON numbers, never strings, at the top level and inside Table rows. YesNo: true or false, never "yes". Text/MultilineText/Email: one string — join lines with \n, never an array. User/Module/Location shapes and YesNo/text value types are validated pre-flight — bare ids, bare strings, wrong value types, or objects missing any required key will be rejected.
stateNoTarget state name
moduleYes
commentNoOptional. Only when necessary to communicate with the user directly. Be concise; leave the detail in the fields.
entryIdNoOmit for create
activityNocreate
entryIdsNoFor bulk ops
assigneesNoUsernames
confirmedNoSet true only after explicit user authorization. Required for: changeStatus, state override, hybrid actor, retry after flag. Does not unlock human-actor activities. See inistate://guardrails.
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations (destructive, non-idempotent, closed-world): it discloses confidence-threshold gating that suppresses the transition and flags the entry, server-side guard rules (human/hybrid actor, state-change confirm, confidence-inflation), and points to inistate://guardrails. That is exactly the mutation-risk context an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core write semantics and the activity/ai requirements before the guardrail caveats. It is dense and clause-heavy, but nearly every clause (form-first, threshold suppression, guard rules, schema pointer) carries operational weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, nested-object mutation tool with no output schema, it covers prerequisites, gating behavior, and where the input shapes live (inistate://schema/runtime). It does not describe what a successful submission returns, though the absent output schema limits how much that matters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 83%, so the baseline is 3; the description adds real meaning by explaining that `activity` holds data-driven standard or custom activity names (not hidden tools), that `ai` is mandatory with reasoning+model+confidence, and what happens when confidence falls below the activity's threshold.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'one call performs exactly one named activity on one entry of one module, and nothing else runs.' That scope statement implicitly separates it from the bulk sibling submit_activities and from read tools like get_entry, so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete prerequisites: call get_form before the first submission per (module, activity) and reuse its schema, and use get_module_schema tier=extended to discover custom activity names. It stops short of naming submit_activities as the multi-entry alternative even though the schema exposes entryIds 'For bulk ops'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

switch_modeA
Idempotent
Inspect

Switch tool surface. 'configure' (default) = entry CRUD + module design tools and design resources. 'runtime' = entry CRUD plus get_module_schema (available in every mode). 'frontend' = configure + the inistate://frontend-guide resource (REST reference for building Vue/React UIs that call the Inistate API directly) — use it when the user wants a custom UI. The tool/resource list refreshes via list_changed after this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesTarget mode

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as idempotent and non-destructive. The description adds crucial behavioral context: it reveals that the tool/resource list refreshes via 'list_changed' after the call and clarifies what tools/resources are available in each mode. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph with no wasted sentences, but it is slightly verbose. It front-loads the core action and then lists modes and their contents efficiently. Minor room for tightening, but overall strong.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple single-parameter schema, no output schema, and informative annotations, the description fully covers the tool's behavior: what it does, the effect of each mode, and a side effect (list refresh). It leaves no obvious gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the description expands on each enum value beyond the schema's single-word labels. For example, it explains that 'configure' includes entry CRUD and design tools, while 'frontend' adds the inistate://frontend-guide resource. This adds meaningful clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb phrase 'Switch tool surface' and lists the three modes (configure, runtime, frontend) with their distinct feature sets. This clearly differentiates it from sibling tools, which are all separate resource or action tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what each mode enables and explicitly advises using 'frontend' when the user wants a custom UI. It does not explicitly state when not to use the tool, but the mode descriptions provide enough context to select appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_moduleUpdate ModuleA
DestructiveIdempotent
Inspect

Update an existing module. A section you pass (information/states/activities/flows) replaces that section's entire list — include every existing item you want to keep (matched by id, which enables renaming; omit id to add new items). Omitted sections are left unchanged. Always call get_module_canvas first to obtain the stable module id and item ids. Full-canvas payloads (information included) are validated internally like create_module; for partial payloads, validate the merged canvas with validate_design first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesModule id from get_module_canvas. Identifies which module to update.
cardNoThe listing card designed with the schema — how each entry shows in the module's list (mobile and web). Fields and activities by NAME. See CardDefinition in inistate://schema/configure. A card that does not pass never fails the call: the module gets the platform's default card and the response's cardStatus says why.
iconNoEmoji identifier
nameNoNew module name (for renaming)
flowsNoState transition rules: { from, to, activity } by name. Omit for record list modules.
statesNoWorkflow states. Omit for record list modules.
activitiesNoCustom activities. Omit for record list modules.
descriptionNo
informationNoField definitions. Items matched by id on update enable renaming.
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, and the description goes beyond them by explaining exactly what is destroyed: a passed section replaces the entire list, so any existing item omitted is lost. It also discloses the id-matching rule (rename vs. add) and the pre-flight requirements, which the annotations alone cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then the destructive replacement rule, then prerequisites and validation. Dense and all four sentences carry information, though the parenthetical detail about id/rename/omit makes it slightly heavy for a first read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, deeply nested mutation tool this covers the critical workflow: how sections behave, what to call first, and how to validate. With no output schema, the response shape is only partially covered (it references cardStatus but not the rest of the return payload), leaving a small gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 90%, so the baseline is 3; the description still adds real meaning by explaining the id-matching/renaming and omit-id-to-add semantics across sections, plus the section-replacement rule that no single property description states. It stops short of describing id/workspaceId sourcing beyond pointing at get_module_canvas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Update an existing module') and immediately scopes which parts can change (information/states/activities/flows). It also distinguishes itself from create_module by noting internal validation parity, so an agent can place it relative to siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit prerequisites and alternatives: 'Always call get_module_canvas first to obtain the stable module id and item ids,' and for partial payloads 'validate the merged canvas with validate_design first.' It also states what happens to omitted sections, so the when-to-use and how-to-sequence guidance is complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_fileUpload File (Fallback)AInspect

FALLBACK ONLY — use request_upload_url + confirm_upload first; call this only after that presigned flow has actually failed. Uploads via base64. Returns { path, filename, mimeType, size } — use path as the File/Image field value in submit_activity. Max 50MB. Blocked: .exe, .bat, .cmd, .dll, .msi.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileYesBase64-encoded file content
nameYesOriginal filename (e.g. 'report.pdf')
moduleYesModule name. Required — scopes the file to the module's storage folder.
mimeTypeNoMIME type of the fileapplication/octet-stream
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the mutation profile (readOnly=false, idempotent=false, destructive=false), and the description goes well beyond them: it discloses the return shape ({path, filename, mimeType, size}), instructs how to consume it (path as the File/Image value in submit_activity), and states two hard constraints — 50MB max and a blocked-extension list. This is exactly the kind of operational context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph with the fallback constraint front-loaded in caps, followed by mechanism, return shape, and limits. Every clause carries actionable information; nothing is redundant padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description documents the return object and its downstream use, and covers size/extension limits and the routing alternative. For a 5-parameter mutation tool, an agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented in the schema, making 3 the baseline. The description only restates the base64 encoding already noted in the schema and does not clarify module scoping, workspaceId requirements, or mimeType defaults beyond what the schema says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (uploads a file via base64) and immediately frames its role as a fallback, distinguishing it from the request_upload_url/confirm_upload sibling flow. An agent can identify both what it does and where it sits in the upload pipeline without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the preferred alternative (request_upload_url + confirm_upload) and the precise condition that selects this tool: 'call this only after that presigned flow has actually failed.' This is a textbook when-to-use/when-not-to-use statement with the alternative named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_designValidate DesignA
Read-onlyIdempotent
Inspect

Validate a module schema without submitting anything. create_module (and update_module on full-canvas payloads) runs these same checks internally, so this tool is optional there — use it to iterate on a draft, or before a partial update_module where the merged canvas cannot be checked client-side.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocreate = new module (all rules). update = merge (omitted sections acceptable).create
schemaYesA complete or partial ModuleSchema object
workspaceIdNoWorkspace ID. Omit if set via env or set_workspace; required in stateless/remote mode.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and idempotent behavior. The description adds that it runs the same checks as create_module/update_module and is a non-submitting validation, reinforcing safety. However, it could mention the return value (e.g., validation errors) for full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states core purpose, second provides usage guidance. No wasted words, front-loaded, and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple validation tool with good annotations and schema, the description covers the essential purpose and usage context. It could mention the output (e.g., success/error response) but overall is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so description adds limited value beyond schema. It does provide extra guidance on workspaceId (omit if set via env or set_workspace) and reiterates mode semantics, which is helpful but not extensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool validates a module schema without submitting, and distinguishes it from create_module and update_module by positioning it as a dry-run for iteration. The verb 'validate' and resource 'module schema' are specific and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool (iterating on a draft, before partial update_module) and when it is optional (create_module already runs these checks). It provides clear alternatives and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv1.3.1
    • Addedaggregate_entries
    • Changedcreate_module2 fields changed
      • addedInput schema / properties / card
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The listing card designed with the schema — how each entry shows in the module's list (mobile and web). Fields and activities by NAME. See CardDefinition in inistate://schema/configure. A card that does not pass never fails the call: the module gets the platform's default card and the response's cardStatus says why.",
        +  "properties": {
        +    "action": {
        +      "description": "'view' (the default when activities exist), 'edit', or an activity name",
        +      "type": "string"
        +    },
        +    "icon": {
        +      "additionalProperties": false,
        +      "description": "Detail only",
        +      "properties": {
        +        "field": {
        +          "description": "An Image, Images, File, Files or Selection field, by name",
        +          "type": "string"
        +        },
        +        "size": {
        +          "description": "XS | S | M | L (S for a Selection, M for an image)",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "field"
        +      ],
        +      "type": "object"
        +    },
        +    "rows": {
        +      "description": "1–5 rows of 1–3 items: the state row first (or the defaultCard widget alone), the title field L/b, secondary fields S/M, activities in their own row",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "items": {
        +            "description": "1–3 items",
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "name": {
        +                  "description": "Field or activity name; 'defaultCard' for the widget; unused for state",
        +                  "type": "string"
        +                },
        +                "orientation": {
        +                  "description": "Image/File fields only: portrait | landscape",
        +                  "type": "string"
        +                },
        +                "ratio": {
        +                  "description": "Image/File fields only: 1:1 | 3:2 | 4:3 | 16:9",
        +                  "type": "string"
        +                },
        +                "settings": {
        +                  "additionalProperties": {},
        +                  "description": "defaultCard widget switches (booleans): title, state, assignees, comment, createdBy, createdDate, due, documentId",
        +                  "type": "object"
        +                },
        +                "size": {
        +                  "description": "S | M | L — Text, number and date fields only",
        +                  "type": "string"
        +                },
        +                "style": {
        +                  "description": "l | n | b — Text, number and date fields only",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "description": "field | state | activity | widget",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "size": {
        +      "description": "Grid only: S | M | L",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "'grid' when the module has an Image/Images field (the image alone in row 1); otherwise 'detail' with an icon",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "type"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / information / items / properties / display
        Added value: +{
        +  "description": "User/Users/Module/Modules only: name of the connected module's field shown for a picked record. Omit to default (Full Name/Name for users, else the first Text field).",
        +  "type": "string"
        +}
    • Changedlist_entries2 fields changed
      • changedInput schema / properties / fields / description
        Previous value: -"Field display names (or raw field names) to include in each entry's `data`. Strongly preferred over returning everything when the module has many or large fields — prunes both DB I/O and response tokens. Omit only when you actually need the full row. System fields are always returned."New value: +"Field display names (or raw field names) to include in each entry's `data`. Strongly preferred over returning everything when the module has many or large fields — prunes both DB I/O and response tokens. Omit only when you actually need the full row. entryId, documentId and state are always returned; name any other system field (date, createdBy, createdDate, updatedBy, updatedDate, assignees, due) here to get it."
      • addedInput schema / properties / listing
        Added value: +{
        +  "description": "Listing (saved view) name to query, case-insensitive; 'archive' targets archived entries. Defaults to the unfiltered 'Everything' view, which is admin-only on modules with listings — non-admins must name an accessible listing (an access-denied response lists them).",
        +  "type": "string"
        +}
    • Removedscaffold_module
    • Changedsubmit_activities2 fields changed
      • changedInput schema / properties / items / items / properties / comment / description
        Previous value: -"Optional. Add only when it carries information not already in the field values or reasoning. Keep short and precise."New value: +"Optional. Only when necessary to communicate with the user directly. Be concise; leave the detail in the fields."
      • changedInput schema / properties / items / items / properties / input / description
        Previous value: -"Field values keyed by display name. Same shape as submit_activity.input."New value: +"Field values keyed by display name. Same shape as submit_activity.input: Table values are arrays of row objects, numbers are JSON numbers."
    • Changedsubmit_activity2 fields changed
      • changedInput schema / properties / comment / description
        Previous value: -"Optional. Add only when it carries information not already in the field values or reasoning. Keep short and precise."New value: +"Optional. Only when necessary to communicate with the user directly. Be concise; leave the detail in the fields."
      • changedInput schema / properties / input / description
        Previous value: -"Field values keyed by display name. File/Image: {name,path}. Module: {id,value} (both required). User: {id,value,username} (all three required). Plural variants (Users/Modules/Files/Images): arrays of those objects. User/Module shapes are validated pre-flight — bare ids, bare strings, or objects missing any required key will be rejected."New value: +"Field values keyed by display name, as an object (never a JSON-encoded string). File/Image: {name,path}. Module: {id,value} (both required). User: {id,value,username} (all three required). Plural variants (Users/Modules/Files/Images): arrays of those objects. Location: {lat,lng,placeName} — lat/lng unquoted numbers, placeName the place's display name; never a combined \"lat,lng\" string. Table: an array of row objects keyed by sub-field name, e.g. [{\"Item Code\": \"A-1\", \"Qty\": 2}]. Number/Currency/Integer: JSON numbers, never strings, at the top level and inside Table rows. YesNo: true or false, never \"yes\". Text/MultilineText/Email: one string — join lines with \\n, never an array. User/Module/Location shapes and YesNo/text value types are validated pre-flight — bare ids, bare strings, wrong value types, or objects missing any required key will be rejected."
    • Changedupdate_module2 fields changed
      • addedInput schema / properties / card
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The listing card designed with the schema — how each entry shows in the module's list (mobile and web). Fields and activities by NAME. See CardDefinition in inistate://schema/configure. A card that does not pass never fails the call: the module gets the platform's default card and the response's cardStatus says why.",
        +  "properties": {
        +    "action": {
        +      "description": "'view' (the default when activities exist), 'edit', or an activity name",
        +      "type": "string"
        +    },
        +    "icon": {
        +      "additionalProperties": false,
        +      "description": "Detail only",
        +      "properties": {
        +        "field": {
        +          "description": "An Image, Images, File, Files or Selection field, by name",
        +          "type": "string"
        +        },
        +        "size": {
        +          "description": "XS | S | M | L (S for a Selection, M for an image)",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "field"
        +      ],
        +      "type": "object"
        +    },
        +    "rows": {
        +      "description": "1–5 rows of 1–3 items: the state row first (or the defaultCard widget alone), the title field L/b, secondary fields S/M, activities in their own row",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "items": {
        +            "description": "1–3 items",
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "name": {
        +                  "description": "Field or activity name; 'defaultCard' for the widget; unused for state",
        +                  "type": "string"
        +                },
        +                "orientation": {
        +                  "description": "Image/File fields only: portrait | landscape",
        +                  "type": "string"
        +                },
        +                "ratio": {
        +                  "description": "Image/File fields only: 1:1 | 3:2 | 4:3 | 16:9",
        +                  "type": "string"
        +                },
        +                "settings": {
        +                  "additionalProperties": {},
        +                  "description": "defaultCard widget switches (booleans): title, state, assignees, comment, createdBy, createdDate, due, documentId",
        +                  "type": "object"
        +                },
        +                "size": {
        +                  "description": "S | M | L — Text, number and date fields only",
        +                  "type": "string"
        +                },
        +                "style": {
        +                  "description": "l | n | b — Text, number and date fields only",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "description": "field | state | activity | widget",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "size": {
        +      "description": "Grid only: S | M | L",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "'grid' when the module has an Image/Images field (the image alone in row 1); otherwise 'detail' with an icon",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "type"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / information / items / properties / display
        Added value: +{
        +  "description": "User/Users/Module/Modules only: name of the connected module's field shown for a picked record. Omit to default (Full Name/Name for users, else the first Text field).",
        +  "type": "string"
        +}
  2. 21 tool updatesv1.1.1
    • First observedconfirm_upload
    • First observedcreate_module
    • First observeddesign_workflow
    • First observeddownload_file
    • First observedget_entry
    • First observedget_entry_history
    • First observedget_form
    • First observedget_module_canvas
    • First observedget_module_schema
    • First observedlist_entries
    • First observedlist_modules
    • First observedlist_workspaces
    • First observedrequest_upload_url
    • First observedscaffold_module
    • First observedset_workspace
    • First observedsubmit_activities
    • First observedsubmit_activity
    • First observedswitch_mode
    • First observedupdate_module
    • First observedupload_file
    • First observedvalidate_design

TDQS

A4.2/5.0

Scored across 21 tools

Disambiguation4/5

Most tools target clearly distinct resources/actions, and overlapping pairs like submit_activity vs submit_activities (single vs bulk) and upload_file vs request_upload_url/confirm_upload (fallback vs default flow) are explicitly distinguished in their descriptions. The only mild confusions are the three read-lookup tools (get_form, get_module_schema, get_module_canvas) which are close in purpose, though descriptions do clarify. On the whole an agent can reliably pick the right tool.

Naming Consistency5/5

All 21 tool names are snake_case and follow a verb_noun pattern (validate_design, get_module_canvas, list_entries, create_module, submit_activity, request_upload_url, confirm_upload, switch_mode, etc.). No camelCase mixing or stylistic outliers — highly predictable naming throughout.

Tool Count3/5

21 tools sits in the heavy band and spans several sub-domains (workspace, module design, entry CRUD, aggregation, file upload/download). Given the multi-mode platform scope it is defensible, but it is toward the upper end and a few clusters (three upload tools, three module-read tools) could be tightened.

Completeness4/5

Coverage is strong: workspace select/list, module create/update/validate/design, entry list/get/history/aggregate/form, single and bulk activity submission, and a full presigned upload plus download flow. Entry deletion is handled via the submit_activity 'delete' activity, so the main gap is a lack of module deletion/lifecycle removal, which is a minor omission.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers