Ethora MCP Server
It lets AI assistants (Claude, ChatGPT, Cursor, VS Code, etc.) drive the Ethora chat platform end-to-end: create apps, rooms, users and AI agents, exchange messages, ingest knowledge sources, and embed a website AI chat widget.
Accounts & auth: register/login users, mint/revoke API keys and app tokens, switch between user/app-token/B2B auth modes, configure session credentials
Apps: create, list, select, update, export/import and delete apps; inspect default rooms; one-call B2B app creation/provisioning
Chat rooms & messaging: create/delete rooms, send messages (optionally waiting for an AI reply), read history, search messages, fetch message context, get unread counts, broadcast to one or many rooms
AI agents: create, list, update, clone, export/import agents; invite agents into chats; activate an agent as the app's widget bot; set agent visibility/prompt; manage, diagnose, test and remove bot instances; legacy per-app bot management
Knowledge base (RAG): crawl websites, upload documents, list/reindex sources, update retrieval tags, delete URLs/documents, with blocking wait variants
Users & files: batch-create users, upload/get/delete files
Embedding & codegen: generate the website AI widget snippet, a React chat-component App.tsx, .env examples, and B2B bootstrap runbooks
Guidance & docs: session status, connection doctor, help/recipes, documentation search and fetch, feedback submission
Wallet (stdio only): check ERC-20 balance and make transfers
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Ethora MCP Serverlist my applications"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Ethora MCP Server (Model Context Protocol)
Add the hosted server in one click. You sign in through your browser; there is nothing to install and no key to paste.
For Claude.ai, ChatGPT, Claude Desktop, LM Studio and anything else that takes a connector URL, add
https://mcp.chat.ethora.com/mcp/oauth and sign in. Running it yourself instead? See
Using with stdio clients.
The MCP server for Ethora, an open-source chat and messaging platform with a built-in AI agent framework. It lets Claude, ChatGPT, Cursor, Claude Code, VS Code and autonomous agents create Ethora apps, chat rooms, users and AI agents, post messages, index RAG sources and produce website chat-widget embeds, all through tool calls.
Part of the Ethora SDK ecosystem. Cross-SDK updates: Release Notes. Package changes: CHANGELOG.md.
MCP Registry:
io.github.dappros/ethora-mcp-server(https://registry.modelcontextprotocol.io/)Ethora API (Swagger): https://api.chat.ethora.com/api-docs/#/
Three ways to use it
Where it runs | Best for | |
Hosted (Ethora Cloud) |
| Claude.ai, ChatGPT, Claude Code, Cursor and agents that talk to Ethora Cloud with no local install |
Self-hosted | Ships with the Ethora monoserver deploy; enable | Dedicated or on-premise Ethora installs; agent traffic never leaves your infrastructure |
stdio CLI |
| Local development, CI, and clients that launch a command |
The hosted and self-hosted modes are the same server started with ETHORA_MCP_TRANSPORT=http. Every MCP session has private in-memory state: one client's login, selected app or tokens are never visible to another session.
Related MCP server: MCP REST Server
60-second quickstart
Claude.ai or ChatGPT (custom connector). In the Ethora web app open Account, then the AI Assistants tab, create an API key and copy the personal connector URL it shows (https://mcp.chat.ethora.com/mcp/k/<key>). Paste it as a custom connector. Every conversation is authenticated with no login step. For a listed connector that uses the vendor's OAuth login instead, the URL is https://mcp.chat.ethora.com/mcp/oauth.
Claude Code.
# with a personal connector URL (no headers needed)
claude mcp add --transport http ethora https://mcp.chat.ethora.com/mcp/k/<your API key>
# or the open endpoint plus a Bearer header
claude mcp add --transport http ethora https://mcp.chat.ethora.com/mcp --header "Authorization: Bearer <your API key>"Cursor, VS Code, and any client that takes a URL and headers.
{
"mcpServers": {
"ethora": {
"url": "https://mcp.chat.ethora.com/mcp",
"headers": { "Authorization": "Bearer <your API key>" }
}
}
}Autonomous agents with no account yet. Connect to https://mcp.chat.ethora.com/mcp with no credentials and call ethora-user-register with an email, first and last name. It creates the account, logs the session in, and returns a generated password plus an API key and connectorUrl exactly once. Store the key and reconnect later with the Bearer header or the personal URL; nothing else is needed, no browser and no email confirmation.
stdio CLI.
ETHORA_API_URL=https://api.chat.ethora.com/v1 ETHORA_APP_JWT="JWT <your app jwt>" npx -y @ethora/mcp-serverThen ask your agent to call ethora-status, ethora-user-login (or ethora-user-register) and ethora-app-list. Lost at any point, call ethora-help: it reads the current state and returns the recommended next calls.
Entry points and authentication
Entry point | Who supplies identity | Typical client |
| Nobody at connect time. Call | Agents, Claude Code, Cursor, connectors added as "no auth" |
| The key in the path, applied like a Bearer header | Claude.ai and ChatGPT custom connectors, which take a URL but no headers |
| An OAuth 2.1 access token obtained through the Ethora authorization server (dynamic client registration, PKCE, access scopes | Connector directories (Claude, ChatGPT); vendors run the login flow themselves |
stdio | Env vars | Local CLI |
Stay in user auth mode on the hosted server (ethora-status shows authMode: user). App-token and B2B modes exist for server integrations; the agents and rooms routes reject app tokens.
API keys
ethora-api-key-create { name?, ttlDays? }mints a key (default 90 days, max 365), shown once together withconnectorUrl.ethora-user-registermints one by default andethora-user-login { createApiKey: true }on request.ethora-api-key-listshows id, name, created and expiry, never the value.ethora-api-key-revoke { id }invalidates it immediately: the next request with that key fails withREFRESH_RECORD_NOT_FOUND.The same keys are managed in the Ethora web app under Account, AI Assistants, where the personal URL, a Claude Code one-liner and a Cursor config are shown with copy buttons.
A key acts as the user. Treat the personal URL like a password: do not share screenshots of it, revoke it if it leaks. The server never logs request URLs, and the monoserver nginx template logs method and status only on the MCP host.
OAuth 2.1 (/mcp/oauth)
Set ETHORA_MCP_AUTH_ISSUER to the public URL of the Ethora API that hosts the authorization server (the monoserver deploy sets it). The MCP server then:
serves RFC 9728 protected-resource metadata at
/.well-known/oauth-protected-resourceand/.well-known/oauth-protected-resource/mcp/oauth, naming the authorization server and the three scopes;answers unauthenticated requests on
/mcp/oauthwith401andWWW-Authenticate: Bearer resource_metadata="...", which is how clients discover the flow;validates each token against the API once per session (cached five minutes) and enforces the token's
scopeper tool: read-only tools needread, destructive tools needadmin, everything else needswrite.search,fetch,ethora-help,ethora-statusandethora-doctorneed no scope. Tokens without a scope claim (API keys) get full access;hides the identity tools (
ethora-user-login,ethora-user-register,ethora-session-configure,ethora-auth-mode-set,ethora-auth-mode-set,ethora-api-key-create,ethora-api-key-list,ethora-api-key-revoke) because the token already fixes who you are.
The authorization server itself is part of the Ethora backend: <issuer>/.well-known/oauth-authorization-server, /oauth/register, /oauth/authorize (a consent page with sign-in, account creation and Google sign-in), /oauth/token, /oauth/revoke and /oauth/userinfo. Users see and disconnect OAuth grants under Account, AI Assistants, Connected AI apps. When ETHORA_MCP_AUTH_ISSUER is unset, both OAuth routes return 404 and discovery omits them.
Identity scopes. Some directories (ChatGPT) require the minimal OpenID Connect surface on top of OAuth 2.1: the openid and email scopes and a userinfo endpoint that returns sub, email and email_verified. These scopes grant no access to apps or data; they only let the client see who signed in, and the consent page says so in plain words. There are no ID tokens or JWKS, because nothing consumes them.
Email confirmation is optional. Ethora never blocks sign-up or the dashboard on a confirmed address. When a client asks for the identity scopes and the account's address is not yet confirmed, the consent page adds one step: send the confirmation link, continue after confirming, or continue without sharing the address (the identity scopes are dropped from the grant and everything else proceeds). Google sign-ins arrive confirmed and skip the step. The same confirmation can be sent from Account, AI Assistants in the web app.
What agents can do
The end-to-end journey a new user typically asks for, with the tools in order:
ethora-user-register(orethora-user-login) to get an authenticated session and an API key.ethora-app-create { displayName }thenethora-app-select { appId }to make the new app current.ethora-chat-create { title }to create a group room. The result contains the room JID${appId}_${chatId}; every room tool accepts the JID or the barechatId.ethora-agent-create { name, prompt, ... }to create an AI agent persona in that app.ethora-agent-invite { agentIdOrAddress, chatJid }to put the agent in the room. A bot instance is spawned live, no restart needed.ethora-message-send { text, roomJid, waitForReplySec: 45 }to post a message and wait for the agent's answer, returned asreplies.ethora-chat-historyreads the room afterwards.ethora-agent-activate { agentId, chatJid }to make that agent the app's default responder, thenethora-widget-snippet-getfor the<script>tag that puts the AI chat widget on a website.
ethora-help { goal } returns this and the other recipes (user-login, broadcast, sources-ingest, files-upload, bot-manage, chat-test, widget, b2b-bootstrap-ai) with the calls filled in for the current state, and ethora-recipe-run executes them.
First-minute conventions
Every create tool answers the same way.
ethora-app-create,ethora-chat-create,ethora-agent-createreturn the raw API object pluscreated(kind,id,name, andjidoraddresswhere relevant) andnext, two to four suggested calls with arguments filled in.ethora-app-createalso returnsdashboardUrl, the app in the web dashboard.ethora-help { goal }has a recipe for each headline job:new-app,in-app-chat,multi-agent-room,widget,chat-test, plus the server-integration goals. Each returns the calls in order with arguments to copy.Who spoke.
ethora-message-sendreplies andethora-chat-historyrows carrysenderNameandsenderKind(human,agent,app), so a multi-agent room reads as "Freud: ..., Jung: ..." rather than instance ids.Search understands intent.
searchmaps the phrases people use ("add chat to my React app", "several agents talking to each other", "webhook when a message arrives") to the documents that answer them, anddoc:not-availablesays plainly what is not exposed over MCP and where it lives instead. Whole documents are fetchable by their bare id (doc:recipes,doc:chat-component-quickstart,doc:sdk-backend-quickstart,doc:auth-map).
Documentation inside the server
instructionsin the initialize result tell the assistant how identity works on the entry point it connected through: the open endpoint explains login and register, personal-URL and Bearer sessions are told they are already authenticated and must never ask for a password or key, OAuth sessions the same plus how to react toINSUFFICIENT_SCOPE.search { query }andfetch { id }(the ChatGPT connector convention) search an in-memory corpus: the auth map, quickstarts, recipes, a hosted getting-started guide, an API keys guide and one reference entry per tool with its inputs. They work unauthenticated.Resources
ethora://docs/auth-map,ethora://docs/chat-component/quickstart,ethora://docs/sdk-backend/quickstart,ethora://docs/recipesand promptsethora-auth-map,ethora-vite-quickstart,ethora-nextjs-quickstart,ethora-backend-sdk-quickstart,ethora-recipes,ethora-agents-quickstart.
Tool groups
A session lists the core group only at first: 24 tools covering the whole "sign in, create an app, add rooms and messages, create and activate an agent, give it a knowledge base, get the widget" journey, one variant per operation. The other groups are registered but hidden, which keeps tools/list around 40 KB instead of 120 KB and gives assistants a short list to choose from.
Three ways to get more:
ethora-tools-enable { group }enables a group for the session (or{ group: "all" }); the server sendstools/list_changedand the client refreshes. With no arguments it returns the catalogue with counts.Calling a hidden tool by name enables its group and runs it, so a name learned from the docs or an earlier session is never refused.
?tools=allon the endpoint URL (hosted) orETHORA_MCP_TOOLS=all(stdio) lists everything up front.
search and fetch describe hidden tools too; every tool doc names its group, and doc:tool-groups is the catalogue. Legacy and async variants carry a first line naming the preferred sibling.
Group | What it covers | Tools |
| Sign in or register, create an app, add rooms and messages, create and activate an AI agent, give it a knowledge base, get the website widget. Always listed. |
|
| List and revoke API keys, reveal an app's credentials, mint and rotate app tokens. |
|
| Diagnostics, recipes and switching the session's auth mode (app token, B2B token) for server integrations. |
|
| Delete, export and import whole apps; inspect default rooms. |
|
| Delete rooms, broadcast to many rooms, search messages, read message context and unread counts. |
|
| Inspect, clone, delete, export and import agents; edit an agent's soul and visibility. |
|
| Knowledge-base maintenance: async crawl and reindex jobs, list and tag sites and documents, delete URLs and documents. |
|
| Batch-create users and upload, fetch or delete files. |
|
| The per-app bot of apps created in the dashboard before the agents framework, and the pre-v2 document tools. Prefer the agents and sources tools for anything new. |
|
| Server-to-server provisioning with a B2B token, plus code and config generators for integrations. |
|
| Wallet balance and ERC-20 transfer. Local (stdio) only; never offered on the hosted server. |
|
App deletion and bulk-delete tools are only registered when ETHORA_MCP_ENABLE_DANGEROUS_TOOLS=true (the monoserver deploy sets it; the stdio default is off). Alias tools (ethora.b2b.*, ethora-bot-message-send, ethora-bot-history) are off by default (ETHORA_MCP_ENABLE_ALIASES=true to expose them); the canonical tools cover the same ground.
Website widget
ethora-widget-snippet-get returns the tag for the embeddable AI chat widget:
<script id="chat-content-assistant" src="https://widget.<your domain>/assistant.js"
data-app-id="<appId>" data-api-base="https://api.<your domain>" data-bot-name="Helper" defer></script>The widget answers with the app's active bot (defaultBotInstanceId). On an app created through the API run ethora-agent-create, ethora-chat-create, ethora-agent-invite and ethora-agent-activate { agentId, chatJid } first; the tool lists these prerequisites and ethora-help { goal: "widget" } walks through them. Activation runs in user auth by setting the app's default bot instance (what the admin AI Widget dropdown does). Until a bot is active, the widget's session endpoint answers AI_BOT_NOT_CONFIGURED. ethora-chat-component-app-generate produces a React App.tsx for @ethora/chat-component instead.
Configuration
Env vars (stdio and hosted)
Variable | Meaning |
| Full API URL, e.g. |
| Host-only alternative to |
| App JWT used only by login and register ( |
| Base app |
| B2B server token for |
|
|
|
|
| Hosted only. Token issued by the OpenAI apps portal for domain verification; served verbatim at |
|
|
Hosted mode only
Variable | Meaning |
|
|
| Bind address, default |
| Public base URL advertised in discovery and used for |
|
|
| Idle session eviction, default 4 hours |
| Public URL of the OAuth authorization server (the Ethora API host); enables |
| Base URL of the hosted AI chat widget ( |
| Public API base browsers can reach, emitted as |
A .env file in the working directory is loaded at startup; real environment variables win. Credentials can also be set per session with ethora-session-configure (in memory only; on a hosted server apiUrl cannot be changed).
Endpoints (hosted)
Path | Purpose |
| Streamable HTTP MCP endpoint, open |
| Same, authenticated by the key in the path |
| Same, Bearer token required, scopes enforced |
|
|
| Discovery JSON: endpoint, transport, auth options, OAuth metadata |
| RFC 9728 protected-resource metadata |
Response envelope
Every tool returns JSON text in one shape: success { ok: true, ts, meta, data }, failure { ok: false, ts, meta, error } where error carries code (the API's own code when it has one), message, httpStatus, requestId and a one-line hint.
Using with stdio clients
Every stdio client runs npx -y @ethora/mcp-server; pass credentials as env vars (preferred) or call ethora-session-configure for a quick local test (its arguments end up in the transcript). For hosted mode use the one-click buttons at the top of this README, or the URL form in the
quickstart. One-click buttons for the stdio package:
Cursor
{ "mcpServers": { "ethora": { "command": "npx", "args": ["-y", "@ethora/mcp-server"] } } }VS Code (and GitHub Copilot agent mode)
.vscode/mcp.json (note the key is servers):
{ "servers": { "ethora": { "command": "npx", "args": ["-y", "@ethora/mcp-server"] } } }Claude Code
claude mcp add ethora -e ETHORA_API_URL=https://api.chat.ethora.com/v1 -e ETHORA_APP_JWT="JWT <your app jwt>" -- npx -y @ethora/mcp-serverAdd --scope user to make it available in every project; verify with claude mcp list.
Claude Desktop
Settings, Developer, Edit Config (claude_desktop_config.json):
{ "mcpServers": { "ethora": { "command": "npx", "args": ["-y", "@ethora/mcp-server"] } } }Gemini CLI, Windsurf, Cline
Same mcpServers block as above in ~/.gemini/settings.json, ~/.codeium/windsurf/mcp_config.json or cline_mcp_settings.json.
Codex CLI
~/.codex/config.toml (the table is mcp_servers with an underscore):
[mcp_servers.ethora]
command = "npx"
args = ["-y", "@ethora/mcp-server"]Container
docker build -t ethora-mcp-server .
docker run -i --rm -e ETHORA_API_URL=https://api.chat.ethora.com/v1 -e ETHORA_APP_JWT="JWT <your app jwt>" ethora-mcp-serverAdd -e ETHORA_MCP_TRANSPORT=http -e ETHORA_MCP_HTTP_HOST=0.0.0.0 -p 3030:3030 to run the hosted mode in a container.
B2B provisioning (server integrations)
With ETHORA_B2B_TOKEN configured, ethora-auth-mode-set switches the session to tenant-actor auth and ethora-b2b-app-bootstrap-ai creates an app, indexes sources (crawlUrl, docs[] as base64) and configures its bot in one call, with optional llmProvider and llmModel. ethora-b2b-app-provision adds app tokens and default rooms. ethora-user-batch-create plus ethora-user-batch-job-wait provision users asynchronously and ethora-broadcast-send plus ethora-broadcast-job-wait send a message to many rooms. ethora-b2b-runbook-generate prints the call order for your own automation.
Troubleshooting
Symptom | Meaning and fix |
| The session has no user token. Call |
| The API key or token was revoked. Create a new key |
| The OAuth grant lacks the scope the tool needs ( |
| Wrong auth mode. On the hosted server stay in user mode ( |
| No active bot on the app. Run the agent, invite and |
| The app has no legacy per-app bot; use the agents tools instead |
| Wrong id or the app was not selected; |
| The client must accept both |
Consent page says | The Firebase code in parentheses names the cause (the browser console has the full error). |
Client cannot connect (stdio) | Run |
Hosted server not answering |
|
Feedback
ethora-feedback-submit sends a report (bug, unexpected, feature, docs, other) to the Ethora team from inside a session. The point of doing this over MCP rather than a web form is context: the session's last few tool failures travel with the report - tool name, error code and the API requestId - so a report can be joined to the server-side log entry instead of being re-typed from memory. Set includeRecentErrors: false when the report is unrelated to a failure.
It works whether or not the session is authenticated, because the reporter we most need to hear from is the one whose sign-up or credential is the thing that broke; an authenticated report is attributed to that account, and an anonymous one may carry an email for a reply. It is also exempt from OAuth scope enforcement, so a read-only grant can still report a problem.
Credential-shaped keys in the attached context are redacted before sending. That is key-based, so it cannot catch a credential pasted into the free-text message: the tool description tells the model not to put secrets or end-user personal data there.
Delivery is configured on the API side (FEEDBACK_EMAIL_TO, FEEDBACK_SLACK_WEBHOOK_URL, FEEDBACK_RETENTION_DAYS); the MCP server only submits.
Usage attribution
Outbound API calls carry X-Ethora-Client: mcp/<version> and, for the duration of a tool call, X-Ethora-Tool: <tool-name>. The API records these on its request log as client and source: mcp:<tool>, which is how MCP traffic is separated from the web app and counted per tool. The public unauthenticated endpoints (/ping, /apps/get-config) are left unattributed.
Security notes
Credentials are redacted from tool results.
appSecret,tenantSecret,appToken, passwords and similar keys come back as[redacted]from every tool (results enter the model's context and client logs).ethora-app-credentials-reveal { appId, confirm: true }reveals an app'sappTokenon purpose and needs theadminscope over OAuth; the App Secret is only ever shown in the web dashboard API tab. Login, register and the api-key / app-token minting tools still return their credential once by design.API keys and personal URLs act as the user until revoked. Keep them in your client's secret store, never in shared config or screenshots, and revoke on suspicion.
The server never logs request URLs or tokens. Keep your reverse proxy's access log free of request paths for the MCP host (the monoserver nginx template does).
Anything returned by a tool is visible to the model and stored in the conversation transcript; the server tells assistants not to print keys or passwords, and to confirm destructive tools with the user.
This repo runs report-only secret and SAST scans (gitleaks, semgrep) on pushes and PRs.
Development
Version numbers
Versions are calendar-based: YY.M.patch, where YY.M is the year and month the release ships (26.9.5 is the fifth September 2026 release, 26.10.0 the first of October) and patch counts releases within the month. No leading zero on the month, so 26.10 sorts after 26.9 under semver. Breaking changes do not bump a major; they get the next patch and a changelog entry, and earlier tool names stay callable as aliases. npm run sync-version refuses any other shape or any month other than the current one (ETHORA_VERSION_MONTH=YY.M overrides on purpose), and the publish workflow runs it. 27.0.0 and 27.1.0, published on 2026-09-24 against this rule, are deprecated; 26.9.5 is the same code.
Tool naming
Since 27.0 every listed tool follows one rule: ethora-<resource>-<verb>[-<qualifier>].
resource is a singular noun, one or two words:
app,agent,chat,message,broadcast,source-site,source-doc,user,file,bot,api-key,app-token,widget,wallet,session,auth-mode,recipe,tools.verb is the last word:
create,list,get,update,delete,send,set,run,reveal,upload,crawl,reindex,start,wait,enable,disable,generate.a qualifier only ever follows the verb:
-wait(blocking form of an async job),-batch,-legacy,-b2b.no API-version suffixes:
-v2is gone from every name.searchandfetchkeep their names by ChatGPT connector convention.
Every earlier name still works. Old names are aliases: never listed by tools/list, but a call to one is rewritten to the canonical tool (with a preset argument where three or two tools became one, such as ethora-auth-use-app becoming ethora-auth-mode-set { mode: "app" }), so published configs, recipes and saved conversations keep working. Results and usage attribution name the canonical tool. The full mapping is in the alias table at the end of this file and in src/toolNames.ts, which the test suite checks against the registry.
Related repos
ethora-chat-component: the React chat component used in widgets and stand-alone apps
ethora-monoserver: deploy automation that ships this server as an optional service (private repository, available to enterprise customers)
ethora-wp-plugin: WordPress integration
rag_demos: RAG AI assistant examples
Quality and maintenance score
Independently inspected by Glama, which builds the server, catalogues its tools and rates tool-definition quality and maintenance activity.
Earlier tool names
Names used before 27.0 and the tool each one now resolves to. All of them remain callable.
Earlier name | Canonical tool |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
License
See LICENSE.
Available Tools
89 toolsethora-agent-invite-to-chatInvite Agent to ChatA
Invite an Agent into a chat room. Multiple agents can coexist in the same room — call this tool once per agent and they will all appear as members able to converse. Lazily creates a per-App BotInstance (an Ethora user with isBot:true) if one does not already exist for (agent, app). Spawns the XMPP client live; no ai-service restart required. For the full multi-agent recipe see the ethora-agents-quickstart prompt.
Requires: an agent (ethora-agents-create-v2) and a room (ethora-app-create-chat) in the selected app.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | Required in B2B mode unless already selected via ethora-app-select. | |
| chatId | No | Mongo Chat _id (preferred when invoking from admin). | |
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| chatJid | No | Room JID `${appId}_${chatId}` (optionally with `@conference.<host>`), exactly the `jid` returned by `ethora-app-create-chat`. Preferred over `chatId`. | |
| agentIdOrAddress | No | Either Mongo _id (24 hex chars) or EOA-style address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, destructiveHint=false), the description discloses significant behavioral traits: lazy creation of a per-App BotInstance, live XMPP client spawn, and no ai-service restart requirement. It also clarifies that multiple agents can coexist, which is important for expected state changes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is multi-sentence but each sentence contributes value: core action, multi-agent behavior, side effects, recipe pointer, and prerequisites. It front-loads the primary action and is not wasteful, though it is slightly longer than the minimum needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers prerequisites, side effects, usage pattern, and points to a recipe for complex scenarios. It does not explain return values (no output schema) or error handling, but these are not essential for a tool with clear side effects. The description is sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for each parameter, including preferred chatJid and alias agentId. The description adds no additional parameter-level meaning beyond the prerequisites (agent and room), so it does not elevate the baseline of 3 set by high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action — 'Invite an Agent into a chat room' — with clear resource and verb, and elaborates on multi-agent coexistence and side effects (lazy BotInstance creation, XMPP spawn). It distinguishes itself from creation tools by explicitly requiring an existing agent and room, which positions it as an invitation step rather than a creation step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit prerequisites ('Requires: an agent ... and a room') and usage pattern ('call this tool once per agent'), making it clear when to use. It does not name specific alternative tools, but the context implies this is the invitation action distinct from agent creation or chat creation, and points to a recipe for multi-agent setups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-activate-v2Activate Agent for WidgetAIdempotent
Make an agent the app's ACTIVE widget bot: sets App.defaultBotInstanceId (and botStatus: on), which is what POST /v2/widget/sessions uses to decide who answers website visitors. Required before an embedded widget can answer on an API-created app. Preconditions: the agent was invited into a room of this app with ethora-agent-invite-to-chat (that creates its bot instance). Works in user auth (app update route); falls back to the app-token /v2/agents/:id/activate route when an appToken is stored.
Requires: an agent already invited into a room of the selected app (ethora-agents-create-v2 -> ethora-app-create-chat -> ethora-agent-invite-to-chat); the invite creates the bot instance this tool binds as the app's default responder.
Auth: user session (owner of the app). Errors: 404 no bot instance for this agent in the app (invite first); 403 not the app owner. Related: ethora-widget-embed-snippet next, ethora-bot-instances-list to inspect.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | App to activate the agent for. Defaults to the app from `ethora-app-select`. | |
| agentId | No | Id (or address) of the agent to activate. Get it from `ethora-agents-list-v2` / `ethora-agents-create-v2`. | |
| chatJid | No | Room JID `${appId}_${chatId}` (with or without `@conference...`) that becomes the widget chat. Required for API-created apps; omit only for dashboard-created apps that already have an AI Widget chat bound. | |
| agentIdOrAddress | No | Alias for `agentId` - either name is accepted, pass whichever you have. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent and open-world; the description adds that it sets specific configuration values and explains the route selection based on auth type. It also clarifies that it is required before widget can answer, which is key context. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively long but well-structured with sections for preconditions, auth, errors, and related tools. It front-loads the primary purpose and uses clear headers implied by punctuation. While comprehensive, every sentence contributes to the agent's decision-making, so no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description covers prerequisites, auth requirements, error codes, and next steps. It also clarifies the distinction between API-created and dashboard-created apps regarding chatJid. Together with the rich input schema, an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter's description in the schema already explains purpose and defaults (e.g., appId defaults, agentId source, chatJid requirement). The tool description does not add extra semantic meaning beyond what's in the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Make an agent the app's ACTIVE widget bot' and pinpoints the exact effect (setting App.defaultBotInstanceId and botStatus). It also connects to the consuming endpoint and frames the requirement clearly. This distinguishes it from related tools like invite-to-chat or create-agent because it focuses on activation for widget.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit preconditions: 'the agent was invited into a room of this app with ethora-agent-invite-to-chat', and it names the sequence of tools. It also specifies auth modes and error scenarios, and points to next steps (widget-embed-snippet). This is thorough guidance for when to use and what is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-clone-v2Clone AgentA
Duplicate an existing saved agent into a new agent, optionally overriding its name/slug/summary (POST /v2/agents/:agentId/clone). The source agent is unchanged; the new clone becomes the session's current agent context.
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
Auth: app-token mode (after ethora-app-select + ethora-auth-use-app). Errors: 401/403 wrong auth; 404 source agentId not found; 422 overridden slug collides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the clone. Omit to inherit the source agent's name. | |
| slug | No | URL-safe unique slug for the clone. Omit to let the server derive one; must not collide with an existing agent. | |
| agentId | No | Id of the source agent to clone. Get it from `ethora-agents-list-v2`. | |
| summary | No | Summary for the clone. Omit to inherit the source agent's summary. | |
| agentIdOrAddress | No | Alias for `agentId` - either name is accepted, pass whichever you have. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it is not read-only and not destructive; the description adds that the source agent remains unchanged, the clone becomes the session's current agent context, and lists specific error conditions (401/403, 404, 422). This goes beyond annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences pack in the core action, endpoint, requirements, auth mode, and error cases with no fluff. Information is front-loaded and every sentence carries value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operation, side effects, prerequisites, auth, and errors. Without an output schema, it is still complete enough for an agent to invoke the tool correctly and understand the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all parameters. The description briefly mentions optional overrides and the agentId/address alias, but adds little beyond the schema's own descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Duplicate'), resource ('existing saved agent'), and outcome ('new clone becomes the session's current agent context'). It also includes the endpoint and notes the source agent is unchanged, which differentiates it from create/update siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it requires an existing agent id/address from list or create, and specifies auth prerequisites. It does not explicitly name when-not-to-use alternatives, but the purpose clearly implies cloning an existing agent rather than creating or updating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-create-v2Create AgentA
Create a reusable AI agent (POST /v2/apps/:appId/agents). Works in user auth mode (the normal hosted mode) or B2B mode; app-token mode is not accepted by the backend. Each agent is a persona — name, avatar, system prompt, LLM config, plus response-gate settings (responseMode, cooldownSec) that control when it speaks in a room. For multi-agent scenarios (two or more personas conversing in one chat) create each one separately, then ethora-agent-invite-to-chat them into the same room. See the ethora-agents-quickstart prompt for the end-to-end recipe.
Requires: a selected app (ethora-app-select) or an explicit appId; the agent is owned by that app.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Short display name. For multi-agent scenarios, prefer single-word names (e.g. 'Hannibal', 'Varro') — the @-mention matcher uses the exact display name with word-boundary matching. | |
| slug | No | URL-safe slug (auto-generated from name if omitted). | |
| appId | No | 24-char hex appId the agent belongs to (`POST /v2/apps/:appId/agents`). Defaults to the app selected with `ethora-app-select`. Pass it when you just created an app so the agent lands there rather than in the token's own app. | |
| isRAG | No | Enable retrieval-augmented generation from indexed sources. | |
| prompt | No | System prompt — the agent's persona, role, style of speech, and behaviour rules. For multi-agent scenarios, instruct the agent to end every message with an @-mention of who speaks next; that's how turn-handoff works through the response gate. | |
| ragTags | No | Optional RAG tag filter — restrict retrieval to sources matching these tags. | |
| summary | No | Short bio shown in agent lists. | |
| trigger | No | Legacy trigger field. Prefer the newer `responseMode` for new agents. | |
| llmModel | No | LLM model override (e.g. 'gpt-4o-mini'). | |
| flowsYaml | No | Deterministic scripted conversation for this agent, as YAML. Drives the agent through a fixed sequence (opening menu, appointment request, intake questionnaire, survey) instead of leaving every turn to the model. Compiled and validated server-side on save: an invalid script is rejected with code `FLOWS_INVALID` and per-line details, and nothing is stored. A flow named `start` is reserved and fires when a conversation opens. Buttons are authored here (`buttons:` on a `say` step, or `options:` on an `ask` step). Call `fetch` with id `doc:agent-flows` for the full authoring format before writing one. Pass an empty string to clear the script. | |
| categories | No | Free-form category tags for agent directory listings. | |
| visibility | No | 'private' (only invitable inside the owning app) or 'public' (cross-app invitable). | |
| cooldownSec | No | Minimum seconds between this agent's replies in a given room. Damped 2x for bot-to-bot. Set 0 for quick turn-taking in multi-agent scenarios. | |
| isPublished | No | Convenience alias for setting visibility='public'. | |
| llmProvider | No | LLM provider override (e.g. 'openai'). Defaults to the app's configured provider. | |
| botAvatarUrl | No | URL of the avatar image shown next to bot messages. | |
| responseMode | No | When the agent decides to reply. 'always' = every room message; 'mentioned' = only when @-mentioned by display name or via /bot (recommended for multi-agent turn-taking); 'smart' = a mini LLM gate decides per-message; 'probability' = coin-flip per message using `responseProbability`. | |
| botDisplayName | No | Display name used inside the chat UI. Defaults to `name`. | |
| greetingMessage | No | Optional message the agent posts when it first joins a room. | |
| responseProbability | No | If responseMode='probability', odds (0-1) of replying to each message. Damped 0.6x for bot-to-bot messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly=false and openWorldHint=true, and the description adds significant behavioral context beyond them: auth-mode restrictions, backend rejection of app-token mode, agent ownership by app, server-side compilation and rejection of invalid flowsYaml with nothing stored, and the reserved flow name 'start'. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: endpoint and auth constraints are front-loaded, the persona/response-gate concept is summarized, the multi-agent workflow is routed to the right sibling, and the prerequisite is stated at the end. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity — 20 parameters, multi-agent behavior, auth modes, and flowsYaml validation — the description covers prerequisites, exclusions, multi-agent recipe, and backend validation behavior. The absence of an output schema is not a material gap here because the creation behavior and parameter semantics are fully described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds cross-parameter meaning by grouping fields into persona settings, LLM config, and response-gate settings, and by connecting responseMode/cooldownSec to room behavior and multi-agent turn-taking. This goes slightly beyond the individual schema descriptions, though the schema already carries the bulk of the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a reusable AI agent (POST /v2/apps/:appId/agents).' It clearly distinguishes the create operation from siblings like ethora-agents-update-v2, ethora-agents-list-v2, and ethora-agent-invite-to-chat by focusing on creation and persona configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when this tool is appropriate: create agents, one per persona, and for multi-agent scenarios create each separately then use ethora-agent-invite-to-chat. It also gives a prerequisite ('Requires: a selected app... or an explicit appId') and an exclusion ('app-token mode is not accepted by the backend'). This is strong usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agent-set-visibilitySet Agent VisibilityAIdempotent
Set an Agent's visibility (private | unlisted | public). Public agents can be invited cross-app by anyone who knows the address.
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| visibility | Yes | ||
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds a consequence for public agents (cross-app invitation) but does not mention side effects on existing visibility or any restrictions. Given annotations are present, the description adds limited extra behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. The core action is front-loaded in the first sentence, and the second sentence provides a necessary prerequisite. It is appropriately sized and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description's 'Requires' statement conflicts with the input schema's required field (only visibility is required), potentially leading an agent to omit the id. It also fails to clarify that agentId and agentIdOrAddress are aliases and that only one is needed. Given the low schema coverage, this is a significant gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only agentId has a description). The description explains that an agent id or address is required and where to obtain it, and explains the effect of 'public' visibility. However, it does not clarify the alias relationship between agentId and agentIdOrAddress, nor that only one is needed, and it contradicts the schema by implying an id is required when the schema does not mark it as required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'set' and the resource 'Agent's visibility' with an explicit enumeration of the three allowed values (private | unlisted | public). It also adds a meaningful behavioral note about public agents being invitable cross-app, which helps distinguish this tool from siblings like ethora-agents-update-v2.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a prerequisite by stating that an agent id or address is required and references where to obtain it (ethora-agents-list-v2 or ethora-agents-create-v2). However, it does not explicitly compare with alternative tools like ethora-agents-update-v2 or ethora-agents-activate-v2, leaving some ambiguity about when to prefer this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-export-v2Export AgentARead-onlyIdempotent
Export an Agent as a portable bundle (GET /v2/agents/:idOrAddress/export). format=json returns the bundle object directly; feed it back to ethora-agents-import-v2 to recreate the Agent in another App/tenant.
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Defaults to json. Prefer json for MCP round-trips. | |
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, non-destructive behavior. The description adds useful behavioral context beyond annotations: format=json returns the bundle object directly)Skip and that the bundle can be fed to import for cross-tenant recreation. It does not fully describe the zip return behavior, but this is minor given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, with the primary action and endpoint front-loaded, followed by the round-trip purpose and prerequisite sourcing. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple export tool with no output schema, the description covers what the tool produces, how to consume it, and where to get the required identifier. It could mention the zip format behavior more explicitly, but the essential calling context is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates by clarifying that the agent id comes from list/create tools and that json is the preferred format for MCP round-trips. It also reinforces the alias relationship between agentId and agentIdOrAddress via the schema description. This adds meaning above the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Export an Agent as a portable bundle', with the exact endpoint and the round-trip use case. It distinguishes itself from sibling tools by explicitly naming ethora-agents-import-v2 as the counterpart that consumes the exported bundle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use it: to export an agent and later recreate it in another App/tenant via import. It also tells the agent where to obtain the required id/address (from ethora-agents-list-v2 or ethora-agents-create-v2). It does not explicitly list exclusions versus get/clone, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-get-v2Get AgentARead-only
Fetch one reusable saved agent's full config by id (GET /v2/agents/:agentId) — prompt, LLM, RAG settings, visibility. Also sets this agent as the session's current agent context (no server-side change).
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
Auth: app-token mode (after ethora-app-select + ethora-auth-use-app). Errors: 401/403 wrong auth; 404 agentId not an agent of the current app. Related: get ids from ethora-agents-list-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | No | Id of the saved agent to fetch. Get it from `ethora-agents-list-v2`. | |
| agentIdOrAddress | No | Alias for `agentId` - either name is accepted, pass whichever you have. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description does not contradict them. It adds genuine behavioral value beyond annotations by disclosing a session-side side effect: 'Also sets this agent as the session's current agent context (no server-side change)' — important because readOnlyHint would otherwise imply zero state change. It also surfaces auth failure (401/403) and 404 semantics, enriching the agent's expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, config contents, session side effect, id source, auth requirements, and error conditions. The core purpose is front-loaded in the first clause, and dense supporting details follow without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-by-id tool with no output schema, the description covers the config fields returned (prompt, LLM, RAG settings, visibility), the side effect, prerequisites, auth, and error cases. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (agentId, agentIdOrAddress) are already described in the schema, including 'Get it from ethora-agents-list-v2.' The description's mention of sourcing ids from list/create adds only marginal reinforcement over what the schema states, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource+scope: 'Fetch one reusable saved agent's full config by id' and enumerates the config contents (prompt, LLM, RAG settings, visibility). This cleanly distinguishes it from the sibling set (list, create, update, delete) since it is the only read-by-id operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites — 'Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2' — plus the auth state (app-token after ethora-app-select + ethora-auth-use-app) and expected error codes. It does not explicitly name when NOT to use it or route to a sibling alternative for the same job, which prevents a 5, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-import-v2Import AgentA
Import an Agent from a bundle produced by ethora-agents-export-v2 (POST /v2/agents/import, application/json body IS the bundle). Optionally scope the new Agent to an owning App via ownerAppId.
Requires: a bundle produced by ethora-agents-export-v2 with format json.
| Name | Required | Description | Default |
|---|---|---|---|
| bundle | Yes | The bundle object returned by `ethora-agents-export-v2` with format=json. Pass it through unchanged. | |
| ownerAppId | No | Owning App for the imported Agent (defaults server-side). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (mutating), idempotentHint=false (non-idempotent), and destructiveHint=false (not destructive). The description adds the endpoint (POST /v2/agents/import), the requirement for a bundle from export, and the optional ownerAppId scoping. It does not describe side effects, error behavior, or what happens on success. Given annotations cover the core behavioral profile, the description adds only modest context, justifying a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. It front-loads the primary purpose and then states the requirement and optional parameter. Every sentence contributes meaning, and the structure is efficient. This is a model of conciseness for a tool with moderate complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a nested bundle object, no output schema, and moderate complexity. The description covers the purpose, prerequisite, and optional scoping, but does not describe the return value (e.g., the imported agent object) or any error conditions. While annotations cover the mutating nature, an agent calling this tool might want to know what it returns. This gap prevents a higher score, but the description is adequate for the core operation, so 3.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the schema already documents 'bundle' as 'The bundle object returned by ethora-agents-export-v2 with format=json. Pass it through unchanged' and 'ownerAppId' as 'Owning App for the imported Agent (defaults server-side)'. The description's mention that the body IS the bundle and the option to scope via ownerAppId adds minimal value beyond the schema. Since schema does the heavy lifting, baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: 'Import an Agent from a bundle produced by ethora-agents-export-v2'. It identifies the resource (Agent), the source (bundle from export), and the verb (Import). This distinguishes it from siblings like create-v2 (which creates from scratch) and clone-v2, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: the tool is for importing an agent from an existing export bundle, and it specifies a prerequisite (bundle must be from ethora-agents-export-v2 with json format). However, it does not explicitly mention when not to use this tool or name alternatives (e.g., 'use create-v2 if you don't have a bundle'). It gives context but no explicit exclusions, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-list-v2List AgentsARead-only
List the reusable saved agents of an app (GET /v2/apps/:appId/agents, or GET /v2/agents for the token's own app) — a saved agent is a reusable bot definition. Returns an array of agents with ids, names, and config.
Auth: app-token mode (after ethora-app-select + ethora-auth-use-app). Errors: 401/403 not in app-token mode or invalid appToken; empty list if the app has no saved agents.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId whose agents to list (`GET /v2/apps/:appId/agents`). Defaults to the app selected with `ethora-app-select`; without either, lists the agents of the token's own app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds valuable behavior beyond that: it specifies the auth mode, the 401/403 error conditions for invalid or missing app-token mode, the return array shape (ids, names, config), and the empty-list behavior. It does not mention pagination or rate limits, but for a simple list tool the provided context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: the core purpose appears first, followed by return format, auth requirements, and error cases. Every sentence carries useful information, and the endpoint paths are integrated without excessive digression. It is slightly longer than strictly necessary because some details duplicate the schema, but it remains focused and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read-only list tool with no output schema, the description is self-sufficient. It tells the agent what the tool does, which endpoints are involved, how appId defaults, what auth mode is required, what errors can occur, and what the response contains. An agent can invoke it correctly without needing external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single appId parameter, including its 24-char hex format and default behavior. The description repeats these facts and adds the corresponding REST endpoint, but it does not contribute new semantic information about the parameter itself. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'List the reusable saved agents of an app', and expands on it with concrete endpoints. It defines what a saved agent is, which distinguishes this tool from siblings like get, create, update, delete, or clone. The agent can clearly tell this is the collection-listing operation, not a single-agent retrieval or mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies clear usage context: it must run in app-token mode after ethora-app-select and ethora-auth-use-app, and it explains how the appId resolves when omitted. It also states the empty-list outcome when no agents exist. However, it does not explicitly name alternative tools like ethora-agents-get-v2 for single-agent retrieval, so the when-not guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agent-soul-appendAppend to Agent PromptA
Append a fragment to an Agent's SOUL.MD (its evolving identity / private notes). Operator-driven; the Agent itself can also self-edit via the same endpoint when called by ai-service.
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| append | Yes | ||
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the agent knows this is a mutating, non-idempotent operation. The description adds context about what is being modified (SOUL.MD, evolving identity/private notes) and who can call it (operator or the agent itself via ai-service). It doesn't disclose details like whether the append is atomic, how large the fragment can be, or what the response looks like, but the annotations cover the core safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the core action ('Append a fragment to an Agent's SOUL.MD'). The second sentence adds relevant context about who can call it and the prerequisite. No wasted words, though the parenthetical '(its evolving identity / private notes)' is slightly redundant with 'SOUL.MD' but still useful for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple append operation with 3 parameters and no output schema, the description covers the essential context: what is being modified, who can call it, and where to get the required identifier. It doesn't explain the return value or error cases, but given the simplicity of the tool and the annotations covering the mutation profile, this is adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only `agentId` has a description). The description itself doesn't explain the parameters beyond the schema. However, the schema is fairly self-explanatory: `append` is the fragment to append, and `agentId`/`agentIdOrAddress` are aliases for the same identifier. The description's mention of 'agent id or address' adds a little context, but it doesn't fully compensate for the undocumented `append` and `agentIdOrAddress` parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Append a fragment to an Agent's SOUL.MD') and identifies the resource (an Agent's evolving identity/private notes). It distinguishes itself from the sibling `ethora-agent-soul-set` by using 'append' vs. the sibling's 'set', though it doesn't explicitly name the sibling. The mention of operator-driven vs. self-edit adds useful context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it's for appending to an Agent's SOUL.MD, and it notes that the Agent itself can self-edit via the same endpoint when called by ai-service. It also states a prerequisite: requires an agent id or address from `ethora-agents-list-v2` or `ethora-agents-create-v2`. It doesn't explicitly say when NOT to use it (e.g., when to use `ethora-agent-soul-set` instead), but the append-vs-set distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agent-soul-setSet Agent PromptAIdempotent
Replace an Agent's SOUL.MD with the provided markdown. Operator-driven; alternative to -append.
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| soulMd | Yes | Replace SOUL.MD contents. Pass empty string to clear. | |
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat those. It adds the requirement of an agent id from specific tools and the alternative-to-append context. However, it does not disclose any side effects beyond replacement (e.g., irreversibility) or permission requirements beyond 'Operator-driven'. Since annotations cover the basic safety profile, the description provides moderate added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant wording. It front-loads the purpose and immediately adds the alternative and requirement. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple replace operation with no output schema, the description covers the essential aspects: what it does, the alternative, and how to obtain the required agent id. Annotations handle idempotency and destructive hints. It does not mention reversibility or effects on existing content beyond replacement, but given the simplicity and annotation coverage, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (2 of 3 parameters have descriptions). The soulMd description 'Replace SOUL.MD contents. Pass empty string to clear.' and agentId description 'Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have.' add meaningful semantics. The main description does not elaborate on parameters, relying on the schema. Since coverage is moderate and descriptions are helpful, a score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Replace') and resource ('Agent's SOUL.MD'), and distinguishes it from the sibling tool 'ethora-agent-soul-append' by labeling itself as the alternative to append. This makes the purpose unambiguous and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes it is 'Operator-driven' and 'alternative to -append', giving some context for when to use it over the append tool. It also specifies a prerequisite: an agent id or address from 'ethora-agents-list-v2' or 'ethora-agents-create-v2'. However, it does not explicitly state when NOT to use this tool or compare it to other set/update tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-agents-update-v2Update AgentAIdempotent
Update a saved AI agent (PUT /v2/agents/:agentId). All fields are optional — only what you pass is updated. Common uses: tune the system prompt after a test run, switch responseMode to control turn-taking in multi-agent rooms, or adjust cooldownSec. See ethora-agents-quickstart prompt for the end-to-end recipe.
Requires: an agent id or address from ethora-agents-list-v2 or ethora-agents-create-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name. For multi-agent scenarios prefer single-word names — the @-mention matcher uses exact display-name match with word-boundary. | |
| slug | No | URL-safe slug. | |
| isRAG | No | Enable RAG retrieval. | |
| prompt | No | Updated system prompt (persona + behaviour). For multi-agent rooms instruct the agent to end every message with an @-mention of the next speaker — that's how turn-handoff works through the response gate. | |
| agentId | No | Mongo _id (24 hex chars) of the agent to update. | |
| ragTags | No | RAG tag filter. | |
| summary | No | Short bio. | |
| trigger | No | Legacy trigger field. Prefer `responseMode`. | |
| llmModel | No | LLM model override. | |
| flowsYaml | No | Deterministic scripted conversation for this agent, as YAML. Drives the agent through a fixed sequence (opening menu, appointment request, intake questionnaire, survey) instead of leaving every turn to the model. Compiled and validated server-side on save: an invalid script is rejected with code `FLOWS_INVALID` and per-line details, and nothing is stored. A flow named `start` is reserved and fires when a conversation opens. Buttons are authored here (`buttons:` on a `say` step, or `options:` on an `ask` step). Call `fetch` with id `doc:agent-flows` for the full authoring format before writing one. Pass an empty string to clear the script. | |
| categories | No | Category tags for directory listings. | |
| visibility | No | 'private' or 'public' (cross-app invitable). | |
| cooldownSec | No | Minimum seconds between this agent's replies in a given room. Damped 2x for bot-to-bot. Set 0 for quick turn-taking. | |
| isPublished | No | Convenience alias for visibility='public'. | |
| llmProvider | No | LLM provider override. | |
| botAvatarUrl | No | Avatar image URL. | |
| responseMode | No | When the agent replies. 'always' = every message; 'mentioned' = only @-mention or /bot (best for multi-agent turn-taking); 'smart' = mini-LLM decides; 'probability' = coin-flip using `responseProbability`. | |
| botDisplayName | No | Display name in chat UI. | |
| greetingMessage | No | Message the agent posts when it first joins a new room. | |
| agentIdOrAddress | No | Alias for `agentId` - either name is accepted, pass whichever you have. | |
| responseProbability | No | If responseMode='probability', odds (0-1) of replying. Damped 0.6x for bot-to-bot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds that it's a partial update (only passed fields are updated) and that it requires an existing agent id. It does not contradict annotations. The 'nothing is stored' detail is in the flowsYaml parameter description, not here. The description gives some behavioral context beyond annotations, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, two short paragraphs. It leads with the action and endpoint, then gives common uses and a requirement. No fluff, every sentence adds information. Very concise and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, common uses, and a prerequisite. It references a quickstart for more details. For a tool with 21 parameters, it doesn't enumerate them (schema does), but it provides enough context to guide usage. The absence of an output schema means return values aren't described, but that's not required. It's reasonably complete for an update tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters have descriptions. The description itself doesn't add parameter-level semantics beyond mentioning common use cases and the requirement for an agent id. It doesn't explain each parameter, but the schema does. Since coverage is high, baseline is 3, and the description adds minimal extra value, so 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing AI agent, mentions the HTTP method (PUT /v2/agents/:agentId), and notes that all fields are optional for partial updates. It gives common use cases, which helps the agent understand the purpose. While it doesn't explicitly distinguish from every sibling, the name and description are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides typical scenarios (tuning prompt, switching responseMode, adjusting cooldownSec) and states the prerequisite of needing an agent id from list or create. It references the quickstart for the full recipe. However, it doesn't explicitly state when not to use this tool or when to prefer alternatives like create or delete, so it's not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-api-key-createCreate API KeyA
Mint a long-lived, revocable API key for the currently logged-in user. The key is a user token: send it as Authorization: Bearer <key> to the hosted MCP endpoint (or set it in the stdio client) to skip ethora-user-login. Shown once.
Auth: user auth (logged in). Errors: 401 not logged in; 404 on backends without API key support.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Label to recognise the key later (e.g. `ci-runner`, `claude-desktop`). | |
| ttlDays | No | Lifetime in days. Server default applies when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the key is long-lived, revocable, shown only once, and tied to the current user's session. It also documents auth requirements and error cases (401, 404 on unsupported backends), which materially helps an agent handle the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: action first, usage next, then one-time visibility and error/auth notes. Every sentence contributes a distinct operational fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter creation tool with no output schema, it covers auth, errors, usage, and the one-time display caveat, which is enough to invoke it correctly. It does not specify the exact response shape, so an agent still has to infer how the returned key is surfaced, but the 'Shown once' note mitigates this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the parameter descriptions are already meaningful. The text does not add further parameter-level detail, so this dimension sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific action 'Mint a long-lived, revocable API key' and scopes it to the currently logged-in user. This clearly differentiates creation from the sibling list/revoke tools without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite ('logged-in user') and the practical context: the key is a Bearer token that enables API access and bypasses ethora-user-login. It does not explicitly name list/revoke as alternatives or give when-not-to-use conditions, but the creation use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-api-key-listList API KeysARead-only
List the current user's API keys (id, name, createdAt, expiresAt). Token values are never returned. Auth: user auth.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds that token values are never returned and that user auth is required, which are behavioral traits not covered by annotations. This adds value without contradicting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy. Front-loaded with the resource and fields, then the crucial security note about token values never being returned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and no output schema, the description covers everything an agent needs: the resource, the returned fields, the auth requirement, and the key security caveat. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so schema coverage is trivially 100%. The description adds nothing about parameters (none exist), but the baseline for 0-param tools is 4, and the description appropriately focuses on return fields and auth.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'List the current user's API keys'. Specifies exactly which fields are returned (id, name, createdAt, expiresAt). Distinct from siblings like ethora-api-key-create and ethora-api-key-revoke by the clear read-only action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage: for listing keys of the current user, and notes auth requirement. Does not explicitly contrast with create/revoke, but the action is unambiguous and the scope ('current user') is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-api-key-revokeRevoke API KeyADestructiveIdempotent
Revoke one of the current user's API keys by id. Clients using that key stop working immediately.
Requires: a key id from ethora-api-key-list or ethora-api-key-create.
Auth: user auth. Errors: 404 unknown id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | API key id as returned by `ethora-api-key-create` / `ethora-api-key-list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint and idempotentHint, and the description adds meaningful behavioral context: 'Clients using that key stop working immediately' and '404 unknown id.' This goes beyond the annotation metadata and helps the agent anticipate the real-world effect and failure mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short, information-dense lines with no filler. The core purpose is front-loaded, followed by prerequisite, auth, and error info. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a single-parameter tool with rich annotations and low complexity. The description covers what the tool does, how to get the required id, auth requirements, immediate impact, and an error case. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes `id` as 'API key id as returned by `ethora-api-key-create` / `ethora-api-key-list`.' The description repeats this prerequisite without adding substantially new parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Revoke one of the current user's API keys by id.' It clearly scopes the operation to the current user and distinguishes it from related key tools like create and list by the revoke action. The wording is unambiguous and immediately tells the agent what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies the prerequisite for using the tool: a key id from `ethora-api-key-list` or `ethora-api-key-create`. It also states auth requirements and a likely error condition. It doesn't explicitly name alternatives or say when not to use it, but the context is clear enough for a revoke operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-createCreate AppA
Create a new Ethora app (tenant) owned by the currently logged-in user. Allocates a fresh 24-char hex appId and sets the caller as owner; counts against the owner's plan limit. Returns the new app object including appId. The returned app has its credential fields redacted; call ethora-app-credentials { appId, confirm: true } when a snippet needs the appToken.
Auth: user-auth mode, active session (ethora-user-login first). Errors: 401 not logged in; 402/403 plan limit reached; 422 invalid displayName. Related: server-side provisioning uses ethora-b2b-app-create.
| Name | Required | Description | Default |
|---|---|---|---|
| displayName | Yes | Human-readable app name shown to users in the app picker and on the public landing page. Not required to be unique across accounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses that the tool allocates a fresh appId, sets the caller as owner, counts against the plan limit, returns an app object, and redacts credential fields. These are meaningful behavioral disclosures that help an agent predict side effects and response content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries operational value: purpose, side effects, return behavior, credential redaction, auth, errors, and related tool. It is front-loaded with the core purpose and structured logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter creation tool with no output schema, the description covers prerequisites, return shape, redacted fields, error codes, plan-limit side effects, and the relevant alternative tool. There is no critical missing information an agent would need to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents displayName with a clear description and uniqueness caveat (100% coverage). The description only adds a marginal hint that an invalid displayName yields a 422 error, which does not substantially extend the schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Create a new Ethora app (tenant) owned by the currently logged-in user.' It also differentiates from the related server-side provisioning path by naming ethora-b2b-app-create, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit prerequisites (user-auth mode, ethora-user-login first), error conditions that inform when the call will fail, and directs the agent to ethora-app-credentials when an appToken is needed and to ethora-b2b-app-create for server-side provisioning. This is strong when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-create-chatCreate Chat RoomA
Create a new chat room (MUC room) inside an app the caller owns. Every room created this way is listed in the app's rooms (defaultRooms); pinned: true additionally makes new users auto-join it (existing users are not added), pinned: false (default) keeps it opt-in. Returns the new room object including its JID.
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: user-auth mode, active session; the caller must own the app. Errors: 401 not logged in; 403 not owner; 404 unknown appId; 422 invalid title.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex ObjectId of the app to create the chat room in. Optional — defaults to the app most recently passed to `ethora-app-select`. | |
| title | Yes | Display name for the new chat room. Visible to all members; not required to be unique within the app. | |
| pinned | No | If `true`, the room is added to the app's default rooms list — every new user of the app auto-joins it. If `false`, the room exists but users must be added explicitly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing side effects: rooms are listed in `defaultRooms`, `pinned: true` auto-joins new users but not existing users, and the operation returns the new room object including JID. It also specifies auth requirements and error codes (401, 403, 404, 422).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose first, then behavioral effects, then requirements, auth, and errors. Every sentence carries useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description states the key return value (new room object including JID), covers all relevant error cases, and specifies prerequisites and ownership conditions. Nothing essential is missing for an agent to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents parameters well. The description adds valuable nuance, particularly that `pinned: true` does not add existing users and that `pinned: false` keeps the room opt-in, which enriches the pinned parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'Create a new chat room (MUC room) inside an app the caller owns.' It also explains the room's lifecycle effect ('listed in the app's rooms (`defaultRooms`)'), which distinguishes it from chat messaging or chat deletion tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit prerequisites: a selected app via `ethora-app-select` or an explicit `appId`, plus a clear distinction between `pinned: true` and `pinned: false` behavior. It does not explicitly name alternative tools or state when not to use this tool, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-credentialsReveal App TokenARead-onlyIdempotent
Reveal the appToken of an app the caller owns, for a chat-component snippet or a widget config. Every other tool redacts appToken, appSecret and tenantSecret from its results because tool output enters the model's context and client logs; this tool returns exactly { appId, appToken, note } and nothing else. The App Secret is never returned over MCP: it is shown only in the web dashboard (app settings, API tab), and backend integrations should use revocable server tokens from that tab instead of the secret.
Requires: an app you own (ethora-app-create or ethora-app-list) and confirm: true.
Auth: user auth (app owner). Errors: 401 not logged in; 403 not the owner; 404 unknown appId; validation error unless confirm is true.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex app id. Defaults to the app selected with `ethora-app-select`. | |
| confirm | Yes | Must be `true`: acknowledges that the token is a credential and will appear in this conversation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that this tool is deliberately the only one returning appToken, that output enters the model's context and client logs, and that the App Secret is never exposed. It also gives the exact return shape, auth expectations, and a full error list. These facts materially change how an agent should invoke and handle results, and they are not captured 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries essential information: purpose, redaction policy, App Secret caveat, requirements, auth, errors. It is front-loaded with the core action and organized into clear labeled segments, achieving high density without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by specifying the exact return shape ({ appId, appToken, note }), prerequisites, authentication model, error cases, and security context. For a credential-revealing tool, this is unusually complete; an agent has everything needed to decide when to call it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented: appId is a 24-char hex ID defaulting to the selected app, and confirm must be true to acknowledge the token will appear in conversation. The description reinforces the confirm requirement and ownership precondition but adds no new parameter meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states the exact action and target: 'Reveal the appToken of an app the caller owns, for a chat-component snippet or a widget config.' It further differentiates from all other tools by noting they redact appToken/appSecret/tenantSecret, while this tool returns exactly { appId, appToken, note }. This makes the tool's unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames the intended use case ('for a chat-component snippet or a widget config') and requires ownership of an app via `ethora-app-create` or `ethora-app-list`. It also directs alternatives clearly: backend integrations should use revocable server tokens, and the App Secret is never returned over MCP. This is explicit when-to-use and when-not-to-use guidance, including a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-delete-chatDelete Chat RoomADestructiveIdempotent
Permanently delete a chat room from an app the caller owns — removes the MUC room, its message archive, and all member affiliations. Irreversible; gated behind ETHORA_MCP_ENABLE_DANGEROUS_TOOLS=true.
Requires: a room from ethora-app-get-default-rooms or ethora-app-create-chat.
Auth: user-auth mode, active session; the caller must own the app. Errors: 401 not logged in; 403 not owner; 404 chatJid not a room in the app.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex ObjectId of the app the chat room belongs to. Optional — defaults to the app most recently passed to `ethora-app-select`. | |
| chatJid | Yes | Room JID (XMPP address) of the chat to delete, e.g. `<roomId>@conference.<host>`. Obtain from `ethora-app-get-default-rooms` or the response of `ethora-app-create-chat`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description provides rich behavioral context: permanent deletion, removal of the message archive, revocation of member affiliations, irreversibility, environment-flag gating, and specific 401/403/404 error conditions. This significantly outstrips what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loads the critical destructive and irreversible nature, and then systematically covers requirements, auth, and errors. Every sentence adds necessary operational information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description is complete: it covers scope, side effects, prerequisites, auth, ownership, gating, and error codes. Nothing an agent needs to safely and correctly invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters well. The description reinforces how to obtain chatJid and mentions ownership constraints, but adds no new parameter-level formats or semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Permanently delete a chat room') and resource ('chat room from an app the caller owns'), and enumerates the concrete consequences: removes the MUC room, message archive, and member affiliations. It also distinguishes this from related tools like ethora-app-delete and ethora-app-create-chat by focusing on chat-room deletion scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear prerequisites (a room from ethora-app-get-default-rooms or ethora-app-create-chat), auth requirements (user-auth mode, active session, ownership), and the gating condition (ETHORA_MCP_ENABLE_DANGEROUS_TOOLS=true). It does not explicitly contrast with alternative deletion tools, but the scope and prerequisites make usage conditions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-export-v2Export AppARead-onlyIdempotent
Export an App as a portable bundle (GET /v2/apps/:appId/export). format=json returns the bundle object directly. Use include to select sections (e.g. 'chats,users,sources,botInstances'). Feed the result to ethora-app-import-v2.
Requires: a selected app (ethora-app-select) or an explicit appId.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | Required in B2B mode unless already selected via ethora-app-select. | |
| format | No | ||
| include | No | Comma-separated sections to include, e.g. 'chats,users,sources,botInstances'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds meaningful detail beyond those annotations: the HTTP method, format-specific return behavior, and the include-section selection mechanism.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense, purposeful sentences with no filler. The endpoint and core behavior are front-loaded, and the prerequisite is cleanly separated at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only export tool with no output schema, the description covers purpose, parameter semantics, prerequisite, and downstream composition with the import tool. The zip return behavior is not detailed, but the essential information an agent needs is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates by explaining the appId prerequisite, the format=json return behavior, and the include syntax with an example. All three parameters receive useful semantic guidance beyond raw schema names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Export an App as a portable bundle' with an explicit GET endpoint. It also distinguishes itself from related tools by naming the import counterpart and clarifying format/include behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage conditions: requires a selected app or explicit appId, and instructs feeding the result to ethora-app-import-v2. It does not explicitly enumerate when-not-to-use alternatives, but the context is strong enough for an agent to proceed correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-get-default-roomsGet Default RoomsARead-only
List the default chat rooms (MUC rooms) of the currently selected Ethora app — every new user auto-joins these. Returns rooms with their JIDs and titles.
Auth: user-auth mode, active session; operates against the app set via ethora-app-select. Errors: 400 no app currently selected; 401 not logged in. Related: ethora-app-get-default-rooms-with-app-id to pass appId explicitly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds meaningful context beyond annotations: auth mode ('user-auth mode, active session'), the dependency on `ethora-app-select`, and specific error codes (400 no app selected, 401 not logged in). This is useful operational detail not present in the annotations. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient: a first sentence states the core action and outcome, a second sentence covers auth and errors, and the final line names the related tool. Every sentence earns its place, and the key purpose is front-loaded. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with no parameters and no output schema, the description covers all essentials: what it returns (rooms with JIDs and titles), the auth requirement, the dependency on a previously selected app, error conditions, and the alternative for explicit appId. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty (0 parameters), so there is nothing to document. The description correctly does not invent parameters. Baseline for 0 params is 4, and the description does not need to add anything about parameters. It effectively communicates that no parameters are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a specific resource ('default chat rooms (MUC rooms) of the currently selected Ethora app'), and clarifies the auto-join behavior. It also distinguishes itself from the sibling by naming the alternative that takes an explicit appId. This is a clear, unambiguous purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly references the sibling tool `ethora-app-get-default-rooms-with-app-id` and explains when to use it (to pass `appId` explicitly). It also states the prerequisite that an app must be selected via `ethora-app-select`. This gives clear when-to-use and when-not-to-use guidance, with an alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-get-default-rooms-with-app-idGet Default Rooms for AppARead-only
List the default chat rooms of a specific Ethora app, passed via appId (or the currently selected app). Returns rooms with their JIDs and titles.
Requires: an appId from ethora-app-list or ethora-app-create.
Auth: user-auth mode, active session; the caller needs read access (ownership or room membership). Errors: 400 no appId and none selected; 401 not logged in; 403 no read access; 404 unknown appId.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex ObjectId of the app whose default rooms you want to read. Optional — defaults to the app most recently passed to `ethora-app-select`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only and non-destructive; the description adds useful behavioral context: return content (rooms with JIDs/titles), auth mode, and specific error conditions (400/401/403/404). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main intent is front-loaded in the first sentence, and the supporting requirements/auth/errors are compactly grouped. Each block earns its place, though the error-code enumeration could arguably be trimmed without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no output schema, the description covers the input source, auth prerequisites, failure modes, and the key return fields. The only notable gap is the absence of an explicit distinction from the closely related sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the optional `appId` and its 24-char hex format and default behavior. The description adds provenance guidance (where to obtain a valid `appId`) and reinforces the selected-app fallback, which is valuable beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('List') and resource ('default chat rooms of a specific Ethora app'), with a clear scoping mechanism (`appId` or currently selected app). It does not explicitly contrast with the similarly named sibling `ethora-app-get-default-rooms`, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the caller to obtain `appId` from `ethora-app-list` or `ethora-app-create`, states that it may also use the currently selected app, and lists authentication/read-access requirements. It provides clear context but no explicit 'when not to use' or alternative routing versus the sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-import-v2Import AppA
Import an App from a bundle produced by ethora-app-export-v2 (POST /v2/apps/import, application/json body IS the bundle). B2B / tenant-actor auth. domainNameOverride renames the imported App's domain.
Requires: a bundle produced by ethora-app-export-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| bundle | No | The exported bundle object (the json export output). | |
| domainNameOverride | No | Rename the imported App's domainName. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as non-read and non-idempotent, and the description adds useful behavioral context: the request body is the bundle itself, authentication is B2B/tenant-actor, and domainNameOverride renames the domain. It does not detail side effects or return value, but nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, dense sentences with the core action and endpoint front-loaded; every sentence adds information (action, endpoint format, auth, override behavior, prerequisite). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter import tool with no output schema, the description covers what is imported, where the bundle comes from, how auth works, and the optional override. It could briefly state the outcome or confirm optionality of parameters, but the essential invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by specifying that bundle is the exported bundle from ethora-app-export-v2 and that the JSON body is the bundle itself, and it reinforces what domainNameOverride does. This is helpful beyond the terse schema property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description names a specific action and resource: 'Import an App from a bundle produced by ethora-app-export-v2'. It also identifies the HTTP route and body format, leaving no ambiguity about what the tool does; the App-domain scope distinguishes it from import tools for other entities such as ethora-agents-import-v2.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States clear prerequisites ('bundle produced by ethora-app-export-v2') and auth context ('B2B / tenant-actor auth'), which tell an agent when this tool applies. It does not explicitly list alternatives or when not to use it, but the App-versus-agent distinction plus the bundle requirement is enough guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-listList AppsARead-only
List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with appId (24-char hex), displayName, domainName, ownership and bot-status metadata. Credential fields (appSecret, tenantSecret, appToken, passwords) are redacted in the result; call ethora-app-credentials { appId, confirm: true } to reveal an app's appToken.
Auth: user-auth mode, active session (ethora-user-login first). Errors: 401 not logged in; empty list if the user owns no apps. Related: feed appId into ethora-app-update / ethora-app-select.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral details beyond the readOnlyHint annotation: credential fields are redacted, an empty list is returned when the user owns no apps, and 401 errors occur when not logged in. This is rich operational context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, front-loading the core purpose before covering return shape, redaction, auth, errors, and related tools. Every sentence contributes actionable information without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains what the returned array contains, which fields are present, redaction behavior, authentication requirements, and error cases. An agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is fully covered at 100%, so there is no parameter burden for the description. The description instead clarifies output fields and behavior, which is the relevant semantic content for this empty-schema tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List all Ethora apps (tenants) owned by the currently logged-in user.' It clearly distinguishes this from other sibling tools by scoping to owned apps and specifying the returned metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states prerequisites ('active session (`ethora-user-login` first)'), error conditions, and points to `ethora-app-credentials` when credential revelation is needed. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-selectSelect AppAIdempotent
Set the current app context for this session so app-scoped tools can omit their appId argument. Stores currentAppId and, if given, appToken (which defaults the auth mode to app-token unless authMode overrides).
Auth: none required to set the context. Errors: effectively none — a non-existent appId is not validated here; the first app-scoped API call surfaces the 404. Related: pairs with ethora-auth-use-app.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | 24-char hex Ethora appId to set as the current context. Get it from `ethora-app-list`, `ethora-app-create`, or a B2B create/provision response. | |
| appToken | No | Per-app appToken to store alongside the appId. If provided, the active auth mode switches to app-token (unless `authMode` says otherwise). Secret. | |
| authMode | No | Auth mode to keep after selecting the app. Omit to let the mode default to app-token when an `appToken` is given, or stay unchanged otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations include idempotentHint=true and destructiveHint=false, indicating a non-destructive, idempotent operation. The description adds valuable behavioral context: it stores `currentAppId` and possibly `appToken`, defaults the auth mode to app-token under conditions, and notes that errors are deferred to the first app-scoped API call. This goes beyond annotations by explaining the session state mutation and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet informative, with key information front-loaded. It avoids redundancy and presents the most critical behavioral effects (storing context, auth mode defaults) early, followed by error handling and related tools. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 parameters, no output schema, no nested objects), the description is adequately complete. It covers all necessary aspects: purpose, parameters, auth, errors, and relation to siblings. The only minor omission is explicit mention of how to retrieve a valid `appId` (though the parameter description covers that), so it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters clearly. The description reinforces the semantics of `appToken` and `authMode` by explaining their interplay (e.g., appToken defaults auth mode to app-token unless overridden), but does not add new meaning beyond that. Since coverage is high, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to set the current app context for the session, enabling app-scoped tools to omit their `appId` argument. It uses specific verbs ('set') and resource ('current app context'), and mentions the effects on `appId` and `appToken`. While the name and title are somewhat generic, the description adds precise detail about the session context and its implications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: to set the current app context, and pairs it with `ethora-auth-use-app` as related. It also clarifies that no authentication is required to set the context, and that a non-existent `appId` is not validated here. This provides clear guidance on prerequisites and when to use it versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-tokens-create-v2Create App TokenA
Mint a new app token for an app. The secret token value is returned exactly once and cannot be retrieved again — capture it immediately. Returns the new token including its one-time secret value and tokenId.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: 401/403 not in B2B mode; 400 no appId and none selected; 404 unknown appId. Related: manage with ethora-app-tokens-list-v2 / -rotate-v2 / -revoke-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId to mint the token for. Optional — defaults to the app set via `ethora-app-select`. | |
| label | No | Human-readable label to identify this token later (e.g. `staging`, `ci`). Shown in `ethora-app-tokens-list-v2`. | |
| timeoutMs | No | HTTP timeout for this request, in milliseconds. Default 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations by disclosing that the secret is returned exactly once and can never be retrieved again, instructing the agent to capture it immediately, and listing auth and error behavior. Annotations only signal readOnly=false, idempotent=false, destructive=false; the description adds critical operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: purpose, one-time-secret warning, return fields, auth, errors, and related tools. Every sentence earns its place, and the most critical warning is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only 3 optional parameters, no output schema, and no nested objects, the description covers what the agent needs: return shape, irrecoverable secret, auth prerequisites, error codes, and related tools. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents appId's default behavior, label's purpose, and timeoutMs default. The description does not materially add parameter meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mint a new app token for an app,' a specific verb and resource, and clarifies it returns the token plus tokenId. It also names related management tools, making the create-vs-manage distinction explicit and separating it from list/rotate/revoke siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Auth prerequisites (B2B mode + b2bToken) and common error cases are stated directly. Related tools are named, though it does not explicitly phrase 'use this when you need a new token' as an exclusionary guideline; still, the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-tokens-list-v2List App TokensARead-only
List the app tokens issued for an app — metadata only (tokenId, label, created/rotated timestamps, status); the secret token values are never returned (only shown once at create/rotate time).
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: 401/403 not in B2B mode; 400 no appId and none selected; 404 unknown appId.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId to list tokens for. Optional — defaults to the app set via `ethora-app-select`. | |
| timeoutMs | No | HTTP timeout for this request, in milliseconds. Default 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the key behavioral detail that secret token values are never returned (only shown once at create/rotate time), which is crucial for agents to avoid expecting secrets in responses. It also discloses auth requirements and error codes, adding value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core function and return details, the second covers auth and error codes. It is front-loaded with the primary purpose and wastes no words. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with 2 optional parameters, the description covers the essential context: what it returns, the auth prerequisite, and error conditions. The absence of an output schema is mitigated by the description listing the returned metadata fields. It could mention pagination or result limits, but these are not critical for this tool given its simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the parameters with descriptions for both appId and timeoutMs. The description itself does not add parameter-specific semantics, but since the schema is complete, the baseline of 3 is appropriate. No additional information is needed from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists app tokens and specifies the metadata fields returned (tokenId, label, timestamps, status), explicitly distinguishing it from token creation, rotation, and revocation siblings. The purpose is unambiguous and actionable for an agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes an explicit auth requirement (B2B mode with ethora-auth-use-b2b and a configured b2bToken), which tells an agent when the tool is usable. It also lists error conditions (401/403, 400, 404) that clarify failure scenarios. However, it doesn't explicitly contrast with create/rotate/revoke alternatives, though the operation name and description make that obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-tokens-revoke-v2Revoke App TokenADestructiveIdempotent
Permanently revoke an app token by tokenId — it stops working immediately; any client, SDK, or MCP session still using it gets auth failures. No replacement is issued.
Requires: a token id from ethora-app-tokens-list-v2.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: 401/403 not in B2B mode; 400 no appId and none selected; 404 unknown appId. Related: get tokenId from ethora-app-tokens-list-v2; ethora-app-tokens-rotate-v2 for revoke-and-replace.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the token belongs to. Optional — defaults to the app set via `ethora-app-select`. | |
| tokenId | Yes | Id of the token to revoke. Get it from `ethora-app-tokens-list-v2`. | |
| timeoutMs | No | HTTP timeout for this request, in milliseconds. Default 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description explains concrete runtime effects: the token stops working immediately, clients still using it get auth failures, and no replacement is issued. It also enumerates auth-related error responses, which is valuable behavioral context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most critical information is front-loaded in the first sentence, followed by structured, compact sections for requirements, auth, errors, and related tools. Every sentence adds operational detail with no filler or repetition of annotation fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, auth-gated mutation with no output schema, the description covers prerequisites, authorization context, failure modes, and relationship to sibling tools. The only omission is the success return value, which is not essential for a tool of this kind and is not expected given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: all three parameters (`tokenId`, `appId`, `timeoutMs`) have descriptions with types, constraints, and defaults. The description reinforces the `tokenId` source and `appId` fallback, but does not add meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently revoke an app token by `tokenId`', giving a specific verb, resource, and behavior. It further differentiates itself from siblings by noting that no replacement is issued and explicitly routing revoke-and-replace use to `ethora-app-tokens-rotate-v2`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the prerequisite ('a token id from `ethora-app-tokens-list-v2`'), the required auth mode (B2B with `b2bToken`), and common error conditions (401/403, 400, 404). It also names the alternative for a revoke-and-replace workflow, leaving no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-tokens-rotate-v2Rotate App TokenADestructiveIdempotent
Rotate an app token: revoke an existing token and issue a replacement in one step. The old tokenId is revoked immediately — anything using it stops working at once. The new secret value is returned exactly once — capture it immediately.
Requires: a token id from ethora-app-tokens-list-v2.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: 401/403 not in B2B mode; 400 no appId and none selected; 404 unknown appId or tokenId. Related: ethora-app-tokens-revoke-v2 to revoke without a replacement.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the token belongs to. Optional — defaults to the app set via `ethora-app-select`. | |
| label | No | Label for the replacement token. Omit to inherit the old token's label. | |
| tokenId | Yes | Id of the token to revoke and replace. Get it from `ethora-app-tokens-list-v2`. | |
| timeoutMs | No | HTTP timeout for this request, in milliseconds. Default 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts the `idempotentHint: true` annotation. It states the old token is revoked immediately and the new secret is returned exactly once, which implies a second call with the same `tokenId` cannot be idempotent because the old token would already be revoked. Despite the description richly disclosing revocation semantics, auth, and errors, the contradiction with the annotation forces a score of 1 per the contradiction rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but structured: core action first, then prerequisites, auth/errors, and related tool. Every sentence adds operational value, though the error enumeration makes it longer than strictly necessary. No fluff, but not perfectly minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-read-only operation with no output schema, the description covers everything needed: required inputs, prerequisites, auth mode, expected error codes, the one-time return of the secret, and a pointer to the alternative without replacement. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds modest context by sourcing `tokenId` from the list tool and noting `appId` defaults to the selected app, but these only reinforce schema text without adding substantial new semantics beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource combination: 'Rotate an app token: revoke an existing token and issue a replacement in one step.' It clearly differentiates itself from the related revoke sibling by noting it performs revocation with a replacement, while pointing to `ethora-app-tokens-revoke-v2` for revoke-without-replacement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context: 'in one step,' requires a token id from `ethora-app-tokens-list-v2`, and specifies B2B auth mode prerequisites. It also names the alternative tool (`ethora-app-tokens-revoke-v2`) and lists concrete error conditions, leaving no ambiguity about when and how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-app-updateUpdate AppAIdempotent
Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchanged.
Requires: an appId from ethora-app-list or ethora-app-create.
Auth: user-auth mode, active session; the caller must own the app. Errors: 401 not logged in; 403 not owner; 404 unknown appId; 422 validation (e.g. domainName taken, primaryColor not #RRGGBB).
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex ObjectId of the app to update. Optional — defaults to the app most recently passed to `ethora-app-select`. | |
| botStatus | No | `on` enables the AI bot for new conversations (requires a configured prompt — see `ethora-bot-update-v2`); `off` disables it. Does not change the bot's configured prompt or sources. | |
| appTagline | No | Short tagline shown on the public app landing page. | |
| domainName | No | Subdomain to host the web app at. Setting `abcd` makes the web app available at `abcd.ethora.com`. Must be unique across all Ethora apps; lower-case alphanumerics and dashes only. | |
| displayName | No | New human-readable app name. Visible in the app picker and on the public landing page. | |
| primaryColor | No | Primary brand color in hex `#RRGGBB` format (e.g. `#F54927`). Used throughout the app UI. | |
| appDescription | No | Deprecated alias for `appTagline`, kept so older callers keep working. Prefer `appTagline`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: partial-update semantics ('omitted fields are left unchanged'), the ownership requirement, and the specific error conditions. It also clarifies that botStatus changes do not alter the bot's configured prompt or sources. The only minor gap is that it doesn't describe the response body, but with no output schema and a mutation tool, the error/ownership context is the more important behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the action and scope, the second states the partial-update semantics, and the remaining lines pack prerequisites, auth, and errors into a scannable block. Every sentence earns its place; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 7 parameters, full schema coverage, and no output schema, the description covers everything an agent needs to call it correctly: what fields can be updated, partial-update behavior, how to obtain the appId, auth requirements, ownership, and error semantics. The sibling list includes create/delete/select tools, and the description explicitly routes the agent to the right source for appId. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds meaning beyond the schema by naming the core mutable fields up front, explaining the partial-update behavior, and clarifying the appId default ('defaults to the app most recently passed to ethora-app-select'). It also flags appDescription as a deprecated alias, which is not obvious from the schema alone. The description doesn't repeat every schema detail, which is appropriate given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Update') and resource ('mutable fields on an app the caller owns'), then enumerates the exact fields (displayName, domainName, appTagline, primaryColor, botStatus). It also states the partial-update semantics, which distinguishes it from create/delete siblings. An agent can tell this apart from ethora-app-create and ethora-app-delete without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the prerequisite ('Requires: an appId from ethora-app-list or ethora-app-create'), the auth mode ('user-auth mode, active session'), and the ownership condition ('the caller must own the app'). It also enumerates the error conditions (401/403/404/422), which tells the agent when the call will fail and how to react. This is explicit when-to-use guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-auth-use-appUse App Token AuthAIdempotent
Switch this session's active auth mode to app-token, so subsequent app-scoped calls authenticate with the configured appToken.
Auth: requires an appToken to already be configured (via ethora-configure, ETHORA_APP_TOKEN env, or ethora-app-select). Errors: returns an error if no appToken is configured. Related: use after ethora-app-select.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the annotations by explaining that the tool mutates the session's active auth mode, requires a pre-configured appToken, and errors if one is missing. Annotations already cover idempotency and non-destructiveness, so the description appropriately supplements them rather than repeating them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the primary action, then uses labeled 'Auth', 'Errors', and 'Related' sections to convey prerequisites, failure modes, and sequencing. Every sentence earns its place, and there is no redundant or irrelevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless session-state switch with no output schema, the description is complete: it states the effect, prerequisites, error condition, and recommended usage order. An agent has enough information to invoke it correctly and to understand the consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters, and the schema description coverage is 100%, so there are no parameter details to clarify. The description still adds useful context about the configured appToken that indirectly affects behavior, which is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb and resource: it switches the session's active auth mode to app-token, which is specific and actionable. It does not explicitly name sibling auth tools like ethora-auth-use-b2b or ethora-auth-use-user, but the app-token scope makes the distinction reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete prerequisites and sequencing: appToken must already be configured via ethora-configure, ETHORA_APP_TOKEN, or ethora-app-select, and it recommends using this tool after ethora-app-select. It does not explicitly list when not to use it or mention alternative auth-mode tools, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-auth-use-b2bUse B2B AuthAIdempotent
Switch this session's active auth mode to B2B, so subsequent calls authenticate as a tenant actor via the x-custom-token header.
Auth: requires a b2bToken (JWT with type=server) to already be configured (via ethora-configure or ETHORA_B2B_TOKEN env). Errors: returns an error if no b2bToken is configured. Related: server-side automation — pairs with ethora-b2b-app-create, ethora-users-batch-create-v2, ethora-app-tokens-*-v2.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: it discloses the session-scoped side effect, the exact x-custom-token header mechanism, the required JWT type, how to configure it, and the error case when it is missing. These are precisely the operational details an agent needs to invoke this tool safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact, front-loaded sentences cover purpose, auth requirements, errors, and related tools. Every sentence contributes operational value and nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter state-switching tool, the description thoroughly covers purpose, prerequisite, error behavior, and related tools. It omits an explicit comparison with app/user auth siblings and a success return value, but neither is essential given the provided context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no schema semantics to clarify. Given the zero-parameter baseline, the description does not need to compensate for any parameter documentation gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific action—switching the session's active auth mode to B2B—and states the concrete consequence: subsequent calls authenticate as a tenant actor via the x-custom-token header. The B2B scope and tenant-actor wording distinguish it clearly from the sibling auth-use-app and auth-use-user tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear: server-side automation, paired with specific B2B tools. It also states the prerequisite (b2bToken configured via ethora-configure or ETHORA_B2B_TOKEN env) and the failure mode if it is absent. It does not explicitly call out auth-use-app or auth-use-user as alternatives, but the context is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-auth-use-userUse User AuthAIdempotent
Switch this session's active auth mode to user-session, so subsequent calls authenticate as a logged-in Ethora user.
Auth: the switch needs nothing, but user-auth tools only work once ethora-user-login stores a user token (login also needs a configured appJwt). Errors: none on the switch; downstream tools return 401 until login succeeds. Related: follow with ethora-user-login.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavioral details beyond the annotations: it states the switch itself requires nothing and causes no errors, but downstream tools will return 401 until login succeeds. This gives agents accurate expectations about side effects and dependencies. It does not contradict any annotation and adds useful context about the required token.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences that are front-loaded with the core purpose, then add required context (auth requirements, errors, related tool) in a logical order. No extraneous words; every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description covers the essential information: what it does, prerequisites, error behavior, and a related next step. It omits explicit mention of alternative auth modes, but those are visible in sibling names, so the description is complete enough for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the schema trivially covers 100% of them. The baseline for a zero-parameter tool is 4. The description adds no parameter information because none exists, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: 'Switch this session's active auth mode to user-session' and the outcome: 'subsequent calls authenticate as a logged-in Ethora user.' This is not a tautology and distinguishes the user-session mode from other auth modes present in the sibling tools (ethora-auth-use-app, ethora-auth-use-b2b), though it does not explicitly name them. It is slightly under the top score because it could have explicitly contrasted with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: it states the prerequisite (login via ethora-user-login storing a user token), the error behavior (downstream 401 until login), and a related next step ('follow with ethora-user-login'). It does not explicitly say when to use this tool vs the app or b2b auth switches, but the provided flow is clear for the user-auth path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-b2b-app-bootstrap-aiBootstrap AI App (B2B)A
One-call B2B orchestrator: create an app, set it as the current context, index RAG sources, then configure and enable its AI bot. Source ingest and bot activation are best-effort (the app is still created if a later step fails); crawl/embedding continues asynchronously after this returns. Returns a per-step log including the new appId.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken); internally switches to app-token mode for source-ingest steps. Errors: aborts with the partial step log if app creation fails; previous auth mode restored best-effort. Related: rooms+tokens variant is ethora-b2b-app-provision.
| Name | Required | Description | Default |
|---|---|---|---|
| docs | No | Optional docs to ingest (base64) | |
| crawlUrl | No | Optional website URL to crawl and index into the new app's RAG sources. | |
| llmModel | No | Optional generation model for the default AI bot (example: 'gpt-4o-mini'). | |
| enableBot | No | If true, enables botStatus=on (best-effort AI service activation) | |
| botTrigger | No | Optional bot trigger (e.g. '/bot' or 'any_message') | |
| followLink | No | For `crawlUrl`: also follow in-domain links (default true). Can ingest many pages. | |
| agentPrompt | No | Phase 1: persona/instructions for the newly-created Agent. | |
| displayName | Yes | Display name for the new app. | |
| llmProvider | No | Optional generation provider for the default AI bot (example: 'openai' or 'openai-compatible'). | |
| savedAgentId | No | Optional saved agent to bind as the active bot for the new app. | |
| setAsCurrent | No | If true (default), set the new app as the session's current app and switch to app-token auth so follow-up tools can omit appId. | |
| agentVisibility | No | Phase 1: visibility for the newly-created Agent. | |
| agentDisplayName | No | Phase 1: create a new Agent with this display name as part of bootstrap. | |
| inviteToDefaultRoom | No | Phase 1: if true (default), invite the newly-created Agent into the App's first default room. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations (which only indicate non-read-only, non-destructive, non-idempotent) by disclosing critical behaviors: best-effort source ingest and bot activation (app is still created if later steps fail), asynchronous crawl/embedding that continues after return, a per-step log including appId, internal auth mode switching, error handling with partial step log on app creation failure, and best-effort restoration of the previous auth mode. These details are essential for an agent to correctly interpret outcomes and handle failures, and they are not contradicted by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured logically: first the core purpose, then the best-effort and async caveats, then auth and error behavior, and finally the related variant. Every sentence delivers necessary information without redundancy or filler. The front-loaded purpose sentence immediately tells an agent what the tool does, and the subsequent details are packed but concise. It is appropriately sized for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 parameters, multi-step orchestration, auth switching, async behavior), the description covers all essential aspects: the overall flow, failure semantics, async continuation, auth requirements, return value (per-step log with appId), and related tool. There is no output schema, but the description mentions the key return element. Nothing an agent needs to call this tool correctly is missing, and the description is sufficiently detailed for a high-complexity operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for all 14 parameters (100% coverage), so the description does not need to repeat their definitions. The description does add some contextual meaning, such as noting that source ingest is best-effort and that crawl/embedding continues asynchronously, which affects how the `docs`, `crawlUrl`, and `followLink` parameters should be interpreted. However, this is supplementary; the schema already covers the parameter semantics adequately, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise, actionable statement: 'One-call B2B orchestrator: create an app, set it as the current context, index RAG sources, then configure and enable its AI bot.' It names the exact sequence of operations and the resources involved, and it distinguishes itself from a sibling by naming `ethora-b2b-app-provision` as the rooms+tokens variant. This leaves no ambiguity about what the tool does or how it differs from similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions the related variant `ethora-b2b-app-provision` and frames this tool as the one-call orchestrator, implying it is the right choice when you want to perform all steps in a single invocation. It also states the auth prerequisite (B2B mode) and notes that source ingest and bot activation are best-effort, which influences whether this is appropriate for a given use case. However, it does not enumerate all possible alternatives (e.g., individual tools like ethora-app-create + ethora-sources-docs-upload), though that omission is acceptable given the tool's self-description as an orchestrator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-b2b-app-createCreate App (B2B)A
Create a new Ethora app (tenant) server-side using B2B auth — the partner/integrator equivalent of ethora-app-create. Allocates a fresh 24-char hex appId; does not create tokens, rooms, or a bot. Returns the new app object including appId.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: 401/403 not in B2B mode or invalid b2bToken; 422 invalid displayName. Related: all-in-one path is ethora-b2b-app-bootstrap-ai / ethora-b2b-app-provision.
| Name | Required | Description | Default |
|---|---|---|---|
| displayName | Yes | Human-readable app name shown to users in the app picker and on the public landing page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing the side-effect scope: it allocates a fresh 24-char hex `appId`, does not create tokens/rooms/bot, and returns the app object. It also documents auth requirements (B2B mode + `b2bToken`) and specific error codes (401/403, 422), giving the agent a clear behavioral contract.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, then efficiently covers scope exclusions, return value, auth, errors, and related tools in just a few sentences. No information is redundant or unnecessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a simple one-parameter create operation with no output schema, the description covers all necessary context: what the tool does, what it does not do, what it returns, auth prerequisites, error conditions, and related alternatives. Nothing critical is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only one parameter and 100% schema description coverage, the schema already fully documents `displayName`. The description adds only marginal value by mentioning '422 invalid displayName' but does not provide additional semantic detail about the parameter beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Create a new Ethora app (tenant) server-side using B2B auth') and differentiates it from the similarly named `ethora-app-create` by identifying it as the partner/integrator equivalent. It also narrows the scope by explicitly listing what it does NOT do ('does not create tokens, rooms, or a bot'), making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use this tool: when operating in B2B mode, and it names the direct alternative `ethora-app-create` for the non-B2B path. It also points to `ethora-b2b-app-bootstrap-ai` / `ethora-b2b-app-provision` for an all-in-one flow, so an agent can decide between this minimal creation step and a more comprehensive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-b2b-app-provisionProvision App (B2B)A
One-call B2B orchestrator: create an app, mint one or more app tokens, provision default chat rooms, then configure and enable its AI bot. Later-step failures don't undo earlier steps. Returns a per-step log including appId and the created tokens (returned once — capture them).
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: aborts with the partial step log if app creation fails; previous auth mode restored best-effort. Related: ethora-b2b-app-bootstrap-ai does sources+bot but not tokens/rooms.
| Name | Required | Description | Default |
|---|---|---|---|
| rooms | No | Default chat rooms to create in the new app. Up to 20. | |
| llmModel | No | LLM model id for the bot, e.g. `gpt-4o-mini`. Must be available for the chosen provider. | |
| botPrompt | No | System prompt for the new app's bot. | |
| enableBot | No | If true, enable the new app's bot using the first minted app token. | |
| botTrigger | No | Bot trigger: `any_message` (every message) or `/bot` (only /bot-prefixed messages). | |
| displayName | Yes | Display name for the new app. | |
| llmProvider | No | LLM provider for the bot, e.g. `openai` or `openai-compatible`. Must be enabled in your Ethora backend. | |
| tokenLabels | No | Labels for the app tokens to mint, one token per label. Default: ['default']. 1–5 tokens. | |
| savedAgentId | No | Optional id of an existing saved agent to bind as the new app's active bot, instead of setting prompt fields by hand. | |
| botGreetingMessage | No | Greeting message the bot posts when a conversation starts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, openWorldHint true), the description discloses critical behaviors: later-step failures don't undo earlier steps, tokens are returned only once and must be captured, errors abort with a partial step log, and the previous auth mode is restored best-effort. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose/steps, failure semantics, return behavior, auth requirement, error behavior, and sibling differentiation. It is dense but not bloated, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-step tool with no output schema, the description covers the full call sequence, return shape, failure semantics, auth prerequisite, and relationship to alternatives. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage across all 10 parameters, so the description does not need to restate parameter meanings. It adds no parameter-level detail beyond the schema, but the schema already carries that burden, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('One-call B2B orchestrator') and enumerates exactly what happens: create app, mint tokens, provision rooms, configure/enable bot. It also distinguishes itself from the closely related sibling ethora-b2b-app-bootstrap-ai, making the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the auth prerequisite explicitly ('B2B mode ... + configured b2bToken'), describes the orchestration use case, and names the alternative tool with a clear differentiator: bootstrap-ai does sources+bot but not tokens/rooms. This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-b2b-bot-enableEnable Legacy Bot (B2B)A
Enable the LEGACY per-app aiBot (B2B auth). NOTE: apps created via the API/B2B no longer auto-provision a legacy aiBot, so this returns 422 BOT_NOT_INITIALIZED on a clean app. The forward path for B2B AI is the Agents API — use ethora-b2b-app-bootstrap-ai or ethora-agents-create-v2 + ethora-agent-invite-to-chat. This tool remains valid for apps that already have a legacy aiBot (e.g. admin-panel apps created with a default chat).
Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId whose bot to enable. Optional — defaults to the app set via `ethora-app-select`. | |
| botTrigger | No | When the bot responds: `/bot` (only messages starting with /bot) or `any_message` (every message). Omit to leave the existing trigger unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a specific failure mode (422 BOT_NOT_INITIALIZED on clean apps), the precondition of a legacy bot, and a clear limitation. Annotations only say readOnlyHint=false and destructiveHint=false, so the description adds substantial behavioral context the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and the critical 422 caveat, then follows with a 'Requires' section. It is somewhat long and repeats the alternatives to the Agents API in both the NOTE and the Requires section, which costs a small amount of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description tells an agent when the tool is valid, what precondition must be met, what error to expect otherwise, and exactly which sibling tools to use instead. This is complete enough to invoke the tool correctly in the B2B context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters (appId and botTrigger) with descriptions at 100% coverage, so the structured data already carries the semantic load. The tool description does not add any parameter-level detail beyond what the schema provides, which matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Enable the LEGACY per-app aiBot (B2B auth)'. It clearly distinguishes this tool from the v2/Agents family by emphasizing legacy-only scope and calling out the forward path via sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: it works only for apps that already have a legacy dashboard-created aiBot, and API-created apps should use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead. It also names ethora-b2b-app-bootstrap-ai as an alternative for the forward path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-disable-v2Disable Legacy BotAIdempotent
Turn the AI bot off for an app (sets bot status: "off") — it stops responding. The configured prompt/LLM/RAG and any activated agent are preserved, so re-enabling restores the same behavior.
Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId. Related: ethora-bot-enable-v2 to turn back on.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true). The description adds meaningful beyond-annotation context: disabling preserves the configured prompt/LLM/RAG and activated agent, so re-enabling restores behavior. It also clarifies auth modes and error responses. It doesn't cover what happens to the bot's chat history or whether the effect is immediate, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured and front-loaded: main effect first, then prerequisites, auth, errors, and related tool. Every sentence serves a purpose; there is no fluff. It is concise given the amount of context it provides (prerequisites, alternative, auth, errors).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with one parameter and annotations already covering safety and side-effect hints, the description covers all necessary context: what the tool does, when to use it, prerequisites, alternative paths, auth, error codes, and reversal. No output schema needed. An agent has enough information to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% because the sole parameter `appId` is fully described in the input schema, including format and mode-specific behavior. The description reinforces the appId requirement in B2B mode but adds no new semantic meaning beyond the schema. Since schema does the heavy lifting, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Turn the AI bot off for an app (sets bot `status: "off"`)". It explains the effect (stops responding) and distinguishes from sibling tools like `ethora-bot-enable-v2` and the agent toolchain by noting it targets legacy per-app aiBots only. This makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: for an app with a legacy per-app aiBot (dashboard-created). It also gives the alternative path for API-created apps (`ethora-agents-create-v2` → `ethora-agent-invite-to-chat` → `ethora-agents-activate-v2`) and notes the related `ethora-bot-enable-v2` to reverse. Auth modes and error codes are also covered, so the agent knows exactly when and how to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-enable-v2Enable Legacy BotAIdempotent
Enable the LEGACY per-app aiBot using app-token or B2B auth. NOTE: clean API/B2B-created apps have no legacy aiBot, so this returns 422 BOT_NOT_INITIALIZED there — use the Agents API (ethora-agents-create-v2 + ethora-agent-invite-to-chat, or ethora-b2b-app-bootstrap-ai) for B2B AI. Valid for apps that already have a legacy aiBot.
Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| trigger | No | When the bot responds: `any_message` (every message) or `/bot` (only /bot-prefixed messages). Omit to leave the existing trigger unchanged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds beyond that by disclosing the 422 BOT_NOT_INITIALIZED failure mode and the legacy-only prerequisite, which are critical for an agent to predict behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then provides error/alternative context. It is somewhat lengthy and slightly repetitive ('Valid for apps...' and 'Requires: an app...'), but each sentence carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, fully schema-documented tool with annotations, the description is complete: it covers prerequisites, failure modes, auth modes, and alternatives. An agent can decide whether to call this tool and how to interpret a likely error without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds auth-mode context and the legacy-app requirement, but it does not elaborate on appId or trigger semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Enable the LEGACY per-app aiBot'), names the resource, and clarifies the scope via auth modes. It also differentiates itself from the Agents API alternative by naming the exact conditions under which that alternative applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when the tool works ('apps that already have a legacy aiBot'), when it fails with 422 BOT_NOT_INITIALIZED, and which alternative tools to use instead (ethora-agents-create-v2, ethora-agent-invite-to-chat, ethora-agents-activate-v2, ethora-b2b-app-bootstrap-ai). This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-get-v2Get Legacy BotARead-only
Read the current AI bot configuration for an app: status, trigger, prompt, greeting, LLM provider/model, RAG settings, widget config.
Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId. Related: change config with ethora-bot-update-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode (the token determines the app). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: it discloses auth requirements (app-token vs B2B with explicit appId), error semantics (401/403 wrong auth, 404 unknown appId), and the legacy-vs-API-created app distinction. It doesn't describe pagination or return format, but for a single-resource read with no output schema, the disclosed behavior is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose and resource are in the first sentence, followed by a terse prerequisite, an alternative route, auth/error notes, and a related tool. Every sentence earns its place; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with rich annotations and 100% schema coverage, the description is complete. It covers prerequisites, auth modes, error conditions, the legacy-vs-new distinction, and the related update tool. The absence of an output schema is not a gap because the description enumerates the returned fields. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single appId parameter well. The description adds meaningful context beyond the schema: it explains when appId is required (B2B mode), when it is ignored (app-token mode), and how it relates to ethora-app-select. This goes beyond the schema's own description and helps an agent decide whether to pass the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Read') and a precise resource ('current AI bot configuration for an app'), then enumerates the exact fields returned (status, trigger, prompt, greeting, LLM provider/model, RAG settings, widget config). It also distinguishes itself from the ethora-agents-* family by explicitly naming the legacy per-app aiBot scope, so an agent can tell it apart from sibling tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it applies only to apps with a legacy dashboard-created aiBot, and it explicitly routes API-created apps to the alternative sequence (ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2). It also states auth modes (app-token or B2B with explicit appId) and names the related update tool (ethora-bot-update-v2). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-instance-diagDiagnose Bot InstanceARead-onlyIdempotent
Diagnose a specific BotInstance for an Agent (GET /v2/agents/:idOrAddress/bot-instances/:botInstanceId/diag). Returns live XMPP/ai-service status and recent activity for troubleshooting.
Requires: a bot instance id from ethora-bot-instances-list (instances are created by ethora-agent-invite-to-chat).
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| botInstanceId | Yes | ||
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds useful behavioral context: it returns live XMPP/ai-service status and recent activity, and it requires a bot instance id from a specific sibling tool. It doesn't describe rate limits, pagination, or failure modes, but for a read-only diagnostic tool the annotations plus the description are adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the action, endpoint, and return value; the second gives the prerequisite and source of the required parameter. Every sentence earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only diagnostic tool with strong annotations and a clear endpoint, the description is nearly complete. It explains what the tool returns, where the required parameter comes from, and the alias relationship between agentId and agentIdOrAddress. It doesn't describe the output schema, but no output schema exists and the description's mention of 'live XMPP/ai-service status and recent activity' gives the agent enough to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It does: it explains that botInstanceId comes from ethora-bot-instances-list, and it clarifies the agentId/agentIdOrAddress alias relationship ('either name is accepted, pass whichever you have'). This adds real meaning beyond the bare schema fields, though it doesn't fully document all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Diagnose'), a specific resource ('a specific BotInstance for an Agent'), and the exact endpoint. It also names the return value ('live XMPP/ai-service status and recent activity for troubleshooting'), which clearly distinguishes it from sibling tools like ethora-bot-instance-status or ethora-bot-instance-test-message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: troubleshooting a bot instance, and it explicitly states a prerequisite ('Requires: a bot instance id from ethora-bot-instances-list'). It doesn't explicitly name alternatives or say when not to use it, but the prerequisite and troubleshooting purpose provide enough guidance to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-instance-leave-chatRemove Bot from ChatADestructiveIdempotent
Remove a BotInstance from a chat room (POST /v2/agents/:idOrAddress/bot-instances/:botInstanceId/leave-chat). The inverse of ethora-agent-invite-to-chat.
Requires: a bot instance id from ethora-bot-instances-list (instances are created by ethora-agent-invite-to-chat).
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| chatJid | Yes | Fully-qualified room JID to leave. | |
| botInstanceId | Yes | ||
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, covering the safety and mutation profile. The description adds context beyond annotations by stating the endpoint uses POST and that it is the inverse operation, which clarifies the behavioral relationship to invite-to-chat. It doesn't contradict annotations; it enriches them with the 'undo' semantic.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The action is front-loaded, the endpoint is included, and the relationship plus prerequisite are stated concisely. No filler or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive action with no output schema, the description covers the core purpose, the inverse relationship, and how to obtain the required botInstanceId. It doesn't describe the response format or error cases, but those are not expected without an output schema. Given the tool's simplicity and the annotations covering safety, this is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, with chatJid and agentId described in the schema, but botInstanceId and agentIdOrAddress lack descriptions. The description compensates by indicating that botInstanceId comes from ethora-bot-instances-list, which is helpful but doesn't fully clarify the other parameters. Since schema already covers chatJid, the description adds some value for botInstanceId but not enough to fully offset the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: 'Remove a BotInstance from a chat room' with a specific verb and resource. It names the HTTP endpoint and explicitly identifies itself as the inverse of ethora-agent-invite-to-chat, distinguishing it from that sibling. The purpose is unambiguous and differentiates the tool from its peers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance by stating it is the inverse of ethora-agent-invite-to-chat, implying it should be used to undo an invitation. It also specifies the prerequisite (a bot instance id from ethora-bot-instances-list) and how those instances are created, giving the agent concrete steps to gather required inputs. This covers both context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-instances-listList Bot InstancesARead-onlyIdempotent
List BotInstances. Filter by appId (caller's App by default) and/or agentId.
Requires: at least one invited agent in the app (ethora-agent-invite-to-chat); otherwise the list is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | ||
| agentId | No | ||
| agentIdOrAddress | No | Alias for `agentId` - either name is accepted, pass whichever you have. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive traits. The description adds meaningful context by stating the default appId filter and the dependency on having an invited agent, which explains why the list might be empty. This goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose, and then provides filter and prerequisite details without any fluff. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with three optional parameters and no output schema, the description covers the main purpose, filtering behavior, and a critical prerequisite. It omits details about return format or pagination, but given the annotations and simplicity, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only agentIdOrAddress has a description). The description clarifies that appId defaults to the caller's app and that both appId and agentId are filters, adding some value. However, it does not elaborate on the relationship between agentId and agentIdOrAddress beyond what the schema already says, so the compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List BotInstances') and resource, clearly distinguishing it from related tools like ethora-agents-list-v2 or ethora-bot-get-v2. It also mentions filters, but does not explicitly name sibling tools for differentiation, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear prerequisite (an invited agent must exist) and explains the default appId behavior, which implies when the tool is useful. However, it does not explicitly contrast with alternatives like ethora-bot-instance-status or ethora-bot-get-v2, leaving some room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-instance-statusBot Instance StatusARead-onlyIdempotent
Turn a specific BotInstance on or off. Off detaches it from XMPP; on re-spawns the XMPP client live.
Requires: a bot instance id from ethora-bot-instances-list (instances are created by ethora-agent-invite-to-chat).
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| botInstanceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, yet the description clearly describes a state-changing operation: 'Turn a specific BotInstance on or off' with detachment and re-spawning behavior. This is a direct contradiction, so the description provides misleading context about the tool's safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action and effect, followed by the necessary prerequisite. No filler or repeated schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter toggle with an enum, the description provides the essential invocation context: what the action does and where to get the ID. However, the readOnlyHint annotation directly conflicts with the described behavior, and there is no output schema or mention of response/error behavior, leaving some ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: botInstanceId is tied to a specific source tool (`ethora-bot-instances-list`), and the status values 'on'/'off' are given behavioral meaning via detach and re-spawn. This adds real value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Turn a specific BotInstance on or off.' It also explains the operational effect of each state ('Off detaches it from XMPP; on re-spawns the XMPP client live'), which clearly distinguishes this toggle tool from siblings like list, diag, or leave-chat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context and a prerequisite: the bot instance id must come from `ethora-bot-instances-list`, and instances are created by `ethora-agent-invite-to-chat`. It does not explicitly state when not to use this tool or name alternatives, but the source-of-id guidance is practical and sufficient for a simple toggle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-instance-test-messageSend Test Message to BotA
Send a test message from a BotInstance (POST /v2/agents/:idOrAddress/bot-instances/:botInstanceId/test-message). Omit roomJid to fan out to every room the BotInstance is in. Requires the ai-service to be running.
Requires: a bot instance id from ethora-bot-instances-list (instances are created by ethora-agent-invite-to-chat).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Message body. Optional/empty is allowed. | |
| agentId | No | Alias for `agentIdOrAddress` - either name is accepted, pass whichever you have. | |
| roomJid | No | Target a specific room JID; omit to broadcast to all the bot's rooms. | |
| botInstanceId | Yes | ||
| agentIdOrAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-idempotent action. The description adds behavior beyond annotations by explaining the roomJid omission causes fan-out to every room and by stating the ai-service dependency. It does not fully describe side effects or response behavior, but it complements the annotation profile well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: endpoint, core behavior, essential dependency, and prerequisite source all in a few sentences. No filler or repeated schema information beyond the critical fan-out behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a send action without an output schema, the description covers the required inputs, optional room behavior, external service dependency, and where to obtain the botInstanceId. It does not describe the response format or success/failure indication, but the essential invocation context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 60%, so the description must add meaning for botInstanceId and agentIdOrAddress. It contextualizes botInstanceId by pointing to ethora-bot-instances-list as the source, and it restates the important roomJid omit-to-broadcast behavior. agentIdOrAddress remains less explained, but the schema's alias note plus the endpoint path provide enough guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Send a test message from a BotInstance' plus the exact endpoint '/v2/agents/:idOrAddress/bot-instances/:botInstanceId/test-message'. This clearly separates it from sibling tools like ethora-bot-instance-diag or ethora-bot-instance-status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context and prerequisites: 'Requires the ai-service to be running' and 'Requires a bot instance id from ethora-bot-instances-list (instances are created by ethora-agent-invite-to-chat)'. It does not explicitly state when-not-to-use or name alternatives, but it gives enough precondition guidance to select and invoke it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-update-v2Update Legacy BotAIdempotent
Configure the AI bot for an app — prompt, LLM, trigger, greeting, RAG behavior, identity, and public widget settings. Partial update — omitted fields are left unchanged. status: "on" activates the bot (best-effort; needs a prompt + LLM and a backend AI service).
Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId; 422 validation (e.g. an llmProvider/llmModel not enabled). Related: ethora-bot-get-v2, ethora-agents-activate-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| isRAG | No | If true, the bot retrieves from the app's indexed RAG sources (see the `ethora-sources-*` tools) when answering. | |
| chatId | No | Restrict the bot to a single chat by id. Omit to apply app-wide. | |
| prompt | No | System prompt that defines the bot's persona and behavior. | |
| status | No | `on` activates the bot, `off` deactivates it. Omit to leave the current status unchanged. | |
| ragTags | No | Restrict RAG retrieval to sources tagged with these tags (see `ethora-sources-site-tags-update-v2` / `ethora-sources-docs-tags-update-v2`). | |
| trigger | No | When the bot responds: `any_message` (replies to every message) or `/bot` (only messages starting with /bot). | |
| llmModel | No | LLM model id, e.g. `gpt-4o-mini`. Must be available for the chosen `llmProvider`. | |
| botLastName | No | Bot's last name in its user profile. | |
| llmProvider | No | LLM provider, e.g. `openai` or `openai-compatible`. Must be enabled in your Ethora backend's AI service config. | |
| botAvatarUrl | No | Public URL of the bot's avatar image. | |
| botFirstName | No | Bot's first name in its user profile. | |
| savedAgentId | No | Id of a saved agent whose config should back this bot. Alternative to setting prompt/LLM/RAG fields individually. | |
| botDisplayName | No | Bot's display name shown in chat. | |
| greetingMessage | No | Message the bot posts when a conversation starts. | |
| widgetPublicUrl | No | Public URL for the embeddable widget. Usually read via `ethora-bot-widget-v2` rather than set here. | |
| widgetPublicEnabled | No | If true, expose the bot through a public embeddable chat widget. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (mutation) and idempotentHint=true. The description adds valuable behavioral context: 'Partial update — omitted fields are left unchanged', and that activating the bot is 'best-effort; needs a prompt + LLM and a backend AI service'. It also details error conditions (401/403, 404, 422). This goes beyond the annotations without contradicting them, though it doesn't mention every possible side effect (e.g., propagation to chat history).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but information-dense. It front-loads the core purpose, then covers partial update semantics, activation condition, prerequisites, alternatives, auth, and errors in about four sentences. While it is longer than minimal, every sentence earns its place and there is no fluff. The structure is logical and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 17 optional parameters, no required fields, and no output schema, the description is remarkably complete. It explains the critical prerequisite (legacy aiBot vs. API-created), provides the correct alternative workflow, specifies auth modes, and lists expected errors. An agent has everything needed to decide whether to call this tool and how to interpret failures. No significant gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all 17 parameters with detailed descriptions. The tool description groups parameters into categories (prompt, LLM, trigger, etc.) but adds no per-parameter semantics beyond what the schema provides. Per the rubric, a baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb ('Configure') and resource ('AI bot for an app'), and enumerates the configurable aspects (prompt, LLM, trigger, greeting, RAG behavior, identity, public widget settings). It explicitly distinguishes this tool from the agents family by stating it targets a 'legacy per-app aiBot (dashboard-created)' and points to the alternative workflow for API-created apps, so an agent can tell it apart from sibling tools without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.' It also clarifies auth modes and lists common error codes, leaving no ambiguity about the correct context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-bot-widget-v2Get Legacy Bot WidgetARead-only
LEGACY: read the per-app bot widget config (GET /v2/bot/widget); only apps that already have a legacy aiBot have one, API-created apps get 422. For the embeddable AI chat widget use ethora-widget-embed-snippet instead — the widget config and public widget URL metadata needed to embed the bot on a website.
Requires: an app with a legacy per-app aiBot (dashboard-created). API-created apps have none: use ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 instead.
Auth: app-token mode (after ethora-app-select + ethora-auth-use-app). Errors: 401/403 not in app-token mode or invalid appToken. Related: enable/disable via widgetPublicEnabled in ethora-bot-update-v2.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set readOnlyHint and destructiveHint. Description adds key context: 422 error for API-created apps, auth modes, and that it returns metadata needed for embedding. This exceeds baseline given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is dense but front-loaded with the 'LEGACY' tag and endpoint. Three sentences pack a lot of nuance; could be slightly streamlined but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param read tool with no output schema, the description covers purpose, constraints, auth, and relations. Minor gap: doesn't describe exact response structure, but output schema is absent and not required for selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has zero parameters, so schema carries no burden. Description clarifies what 'config' means and its purpose (embedding metadata), adding semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('read'), resource ('per-app bot widget config'), and endpoint ('GET /v2/bot/widget'). Clearly distinguishes itself as a legacy accessor versus the embeddable widget tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (apps with legacy aiBot), when not to use it (API-created apps get 422), and names the alternative tool (`ethora-widget-embed-snippet`) plus a full workflow for API-created apps. Also specifies auth requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-chats-broadcast-job-v2Get Broadcast JobARead-only
Fetch the current status and per-room results of a broadcast job by jobId (one-shot, no polling). Returns the job object with its state (pending/running/completed/failed).
Requires: a selected app with at least one room (ethora-app-create-chat).
Auth: app-token mode OR B2B mode with an explicit appId — must match the auth used to enqueue the job. Errors: 401/403 wrong auth; 404 unknown jobId. Related: ethora-wait-broadcast-job-v2 for a blocking wait.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the job belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| jobId | Yes | Job id returned by `ethora-chats-broadcast-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds substantial context beyond annotations: the one-shot no-polling nature, the requirement that auth must match the enqueue auth, the prerequisite of having a room, and specific error codes (401/403/404). These details go well beyond what the annotations convey, though they don't specify what happens to results after fetching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and densely informative: purpose, mode, prerequisite, auth, errors, and related tool are covered in a few sentences. The most critical detail (one-shot, no polling) is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status-fetch tool with no output schema, the description covers all essential aspects: purpose, behavior, prerequisites, auth modes, error codes, and the sibling for blocking waits. No critical gaps remain for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds meaning by explaining `jobId` is returned by `ethora-chats-broadcast-v2` and clarifying when `appId` is required versus ignored. This is a modest but real value-add over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('current status and per-room results of a broadcast job by jobId'), and it explicitly distinguishes itself from the sibling `ethora-wait-broadcast-job-v2` by noting it is one-shot with no polling. This makes the tool's purpose precise and clearly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides when-to-use context ('one-shot, no polling'), contrasts with the blocking alternative `ethora-wait-broadcast-job-v2`, and gives prerequisites, auth mode requirements, and error codes. An agent can reliably decide when to call this tool versus the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-chats-broadcast-v2Broadcast MessageA
Enqueue an asynchronous broadcast job posting a message to one or more chat rooms of an app — returns a jobId; messages are not sent synchronously. Targeting is exclusive: allRooms, chatIds, or chatNames, not a mix.
Requires: a selected app with at least one room (ethora-app-create-chat).
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 400 no target or conflicting targets; 404 unknown appId or room. Related: track with ethora-wait-broadcast-job-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Plain-text message body to broadcast to the targeted rooms. | |
| appId | No | 24-char hex appId to broadcast in. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode (the token determines the app). | |
| chatIds | No | Explicit list of chat ids to target. Mutually exclusive with `allRooms` and `chatNames`. | |
| allRooms | No | If true, broadcast to every room in the app. Mutually exclusive with `chatIds` and `chatNames`. | |
| chatNames | No | Explicit list of chat JIDs or localparts to target. Mutually exclusive with `allRooms` and `chatIds`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond the annotations: it is asynchronous, returns a jobId immediately rather than sending synchronously, and targeting modes are mutually exclusive. It also discloses auth requirements and error conditions. There is no contradiction with the annotations, and the side-effecting mutation nature is consistent with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the most important async behavior, and every sentence adds necessary information. It covers prerequisites, auth, errors, and related tooling without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the five-parameter tool and no output schema, the description explains the return value (jobId), async nature, targeting exclusivity, required app context, auth modes, and error codes. It also points to the companion wait tool for tracking. This is sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description reinforces exclusivity of allRooms/chatIds/chatNames and mentions error conditions tied to targeting, but it adds little meaning beyond what the schema already states. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: enqueue an asynchronous broadcast job to post a message to one or more rooms, and mentions the returned jobId. It is specific about verb and resource. However, it does not explicitly differentiate itself from the closely named sibling ethora-chats-broadcast-job-v2, so it stops short of full sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete context: requires a selected app with at least one room, specifies auth modes, and lists relevant error codes. It references the related tracking tool ethora-wait-broadcast-job-v2. It does not explicitly state when not to use it or name alternatives like ethora-chats-message-v2, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-chats-history-v2Get Chat HistoryARead-only
Read the archived messages of a chat room (GET /v2/apps/:appId/chats/:chatId/messages, newest last). Returns results with from, nick, body, ts (ms) plus a nextBefore cursor for older pages. Identify the room by roomJid (${appId}_${chatId}) or bare chatId plus the selected app.
Requires: a room in the selected app (ethora-app-create-chat).
Auth: user auth (default on the hosted server) or B2B; app-token mode is not accepted. Errors: 401 not logged in; 403 not the app owner; 404 unknown app/room; 502 MAM_READ_FAILED or mamUnavailable: true when the deployment has no message archive.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId. Optional when `roomJid` carries it or an app is selected. | |
| limit | No | Maximum number of most-recent messages to return (default 100). | |
| before | No | Pagination cursor: only messages older than this timestamp (ms), from a previous `nextBefore`. | |
| chatId | No | Bare chat id. Needs an app: pass `appId` or select one with `ethora-app-select`. | |
| roomJid | No | Room JID `${appId}_${chatId}` (optionally with `@conference.<host>`). Either this or `chatId` is required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description goes far beyond that by detailing the exact return structure (results fields, nextBefore cursor), the auth requirements (user/B2B vs app-token), and a comprehensive list of error codes with specific causes (including 502 MAM_READ_FAILED and mamUnavailable). This gives the agent full visibility into behavior without needing to probe the endpoint. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but every sentence contributes. It opens with the core purpose and endpoint, then moves to return format, identification, prerequisites, auth, and errors. It is well-structured with clear separations (Requires, Auth, Errors) and avoids redundant fluff. The length is justified by the complexity of the tool (pagination, multiple auth modes, and error handling) without being bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully describes the return payload and cursor mechanism. It covers prerequisites (room must exist), auth modes, error conditions, and pagination details. For a read-only paginated history endpoint, everything an agent needs to correctly invoke and interpret results is present. The only minor omission is a note on rate limiting or ordering beyond 'newest last', but these are not critical for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter already has a descriptive explanation. The description adds substantial value by explaining the relationship between roomJid and appId/chatId, the default limit (100), the semantics of the 'before' cursor (older than timestamp), and the optionality of appId when roomJid carries it. This goes beyond simple field names and gives operational context that is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), a clear resource ('archived messages of a chat room'), and gives the exact HTTP endpoint. It explicitly contrasts with siblings like ethora-chats-message-v2 (sending) and ethora-messages-search-v2 (searching), making its purpose unambiguous. The phrase 'newest last' further clarifies the ordering semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite of a room in the selected app and explains how to identify the room via roomJid or chatId plus app. It also lists auth modes that are and are not accepted. While it doesn't explicitly say 'when not to use this tool,' the inclusion of the sibling search tool and the phrase 'archived messages' implies it is for history retrieval, not live or search operations. This is clear enough for an agent to make the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-chats-message-v2Send Chat MessageA
Post a message into a chat room of an app (POST /v2/apps/:appId/chats/broadcast targeting one room). The message is attributed to the app's broadcast sender (override the shown name with senderName). Use it to seed or test a conversation, e.g. right after ethora-agent-invite-to-chat, and set waitForReplySec (up to 60) to wait for an AI agent's answer; replies are returned in replies. Identify the room by roomJid (${appId}_${chatId}, exactly what ethora-app-create-chat returns as jid) or by the bare chatId plus the selected app.
Requires: a room in the selected app (ethora-app-create-chat); for replies, an agent invited into it (ethora-agent-invite-to-chat).
Auth: user auth (the default on the hosted server) or B2B; app-token mode is not accepted by this route. Errors: 401 not logged in; 403 not the app owner; 404 unknown app/room; 422 empty text. Reply detection needs the message archive (MAM) on the deployment; when it is unavailable replies is null and historyUnavailable is true.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Message body to post (1-4000 chars). | |
| appId | No | 24-char hex appId. Optional when `roomJid` carries it or an app is selected. | |
| chatId | No | Chat id: either the Mongo chat `_id` (as listed by the app's chat list) or the suffix after `${appId}_` in the room JID. Needs an app: pass `appId` or select one with `ethora-app-select`. | |
| roomJid | No | Room JID `${appId}_${chatId}` (optionally with `@conference.<host>`), as returned by `ethora-app-create-chat`. Either this or `chatId` is required. | |
| senderName | No | Display name shown as the message sender (defaults to the app's broadcast sender / app name). | |
| waitForReplySec | No | Seconds to wait for a reply from someone else in the room (an AI agent, typically). 0 (default) returns right after posting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is exceptionally transparent about behavior beyond the annotations. It details the attribution to the broadcast sender, the `waitForReplySec` blocking behavior, the shape of replies (in `replies`), the auth modes that are and aren't accepted, specific error codes, and the MAM dependency that yields `historyUnavailable`. This far exceeds what annotations (which only say non-readOnly, openWorld, non-idempotent, non-destructive) provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but every sentence contributes value: action, use case, identification, prerequisites, auth, errors, and a dependency caveat. It is front-loaded with the core action and the one-room distinction. It is not verbose; it is dense but structured, making it easy to scan. A 4 reflects that it could be tightened, but it's efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, no output schema, and complex auth, the description covers all critical context: prerequisites, authentication modes, error responses, reply retrieval, and the MAM requirement. It even hints at the response fields (`replies`, `historyUnavailable`). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra meaning beyond the schema: it explains the composition of `roomJid` (`${appId}_${chatId}`), the relationship between `chatId` and the JID, the default for `senderName`, and the purpose of `waitForReplySec` with its maximum. This enriches the schema and helps an agent construct parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Post'), a specific resource ('a chat room of an app'), and the exact endpoint. It also clarifies the tool is for a single room ('targeting one room'), which distinguishes it from broadcast tools. The purpose is further refined by the use case ('seed or test a conversation'), so an agent can immediately understand what it does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete context for when to use the tool: right after `ethora-agent-invite-to-chat`, and when waiting for an AI reply. It also lists prerequisites (`ethora-app-create-chat` for a room, `ethora-agent-invite-to-chat` for replies). It does not explicitly name an alternative for broadcasting to multiple rooms, but the phrase 'targeting one room' implies that broadcast tools are for multi-room. The guidance is clear enough for an agent to make the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-configureConfigure ConnectionAIdempotent
Set the Ethora API URL and credentials for this MCP session. Stores values in memory only; each call merges with omitted fields kept. Alternative to env vars (ETHORA_API_URL / ETHORA_APP_JWT / ETHORA_APP_TOKEN / ETHORA_B2B_TOKEN). On a hosted server apiUrl is fixed and cannot be changed; credentials are per session.
Auth: none required — this establishes auth material. Errors: only if a value is structurally invalid. Follow with an ethora-auth-use-* tool to pick the active mode.
| Name | Required | Description | Default |
|---|---|---|---|
| apiUrl | No | Full Ethora API URL including the version path, e.g. `https://api.chat.ethora.com/v1` or `http://localhost:8080/v1`. If you only have the host, set ETHORA_BASE_URL env instead and the server appends `/v1`. | |
| appJwt | No | Ethora App JWT, used only to bootstrap login/register in user-auth mode. Usually starts with `JWT `. Secret — never commit it. | |
| appToken | No | Per-app appToken for app-scoped flows (broadcast, sources, bot). Setting this makes app-token auth available via `ethora-auth-use-app`. Secret. | |
| b2bToken | No | B2B server token for tenant-actor `x-custom-token` auth (a JWT with `type=server`). Required for B2B provisioning flows. Secret. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond annotations: values are stored in memory only, omitted fields are preserved across calls, credentials are per-session, `apiUrl` may be fixed on hosted servers, no auth is required to set auth material, and errors occur only for structural invalidity. This strongly complements the idempotentHint and non-read-only annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six compact sentences cover action, storage model, env-var alternative, platform constraint, auth requirement, error behavior, and next step. Every sentence earns its place, and the most important operational fact is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for an optional-parameter configuration tool: it explains scope, merging, constraints, auth, error behavior, and the correct next tool. The only minor gap is that no success response/return value is described, though the error statement partially compensates since there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter already has detailed descriptions including examples, secret warnings, and mode implications. The tool description adds relevant session-level semantics like merge-on-partial-call, but does not need to restate per-parameter meaning; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set the Ethora API URL and credentials for this MCP session.' It clearly differentiates itself from the auth-use siblings by framing configuration as establishing auth material that is later selected by an `ethora-auth-use-*` tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus env vars, notes the hosted-server constraint on `apiUrl`, and gives a direct follow-up instruction: 'Follow with an `ethora-auth-use-*` tool to pick the active mode.' This gives an agent actionable selection and sequencing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-doctorConnection DoctorARead-only
Diagnose the session: validate the config is internally consistent for the active auth mode and ping the Ethora API (GET /v1/ping). Returns { state, checks, ping, suggestions }.
Auth: none required; report is tailored to whatever credentials are set. Errors: rarely throws — instead returns suggestions and a ping.ok: false block when the API is unreachable.
| Name | Required | Description | Default |
|---|---|---|---|
| timeoutMs | No | HTTP timeout in milliseconds for the ping request. Defaults to 3000. Raise it on slow links, lower it to fail fast. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive, and the description adds valuable behavioral context: return shape `{ state, checks, ping, suggestions }`, no auth required, and a rare-throw error model that returns `suggestions` and a `ping.ok: false` block. This exceeds what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: purpose and endpoint in the first, return shape in the second, auth/error behavior in the third. Every sentence carries distinct information, and the most important action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional, well-schema-documented parameter and no output schema, the description provides the return shape, auth requirements, error behavior, and a sensible default timeout note in the schema. No critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter `timeoutMs` is fully described in the schema with default, bounds, and usage guidance. The description does not add parameter-level detail, but schema coverage is 100%, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific action (diagnose the session) and resource (session config plus Ethora API ping), and it specifies the endpoint `GET /v1/ping`. It is unambiguous enough to be distinguished from siblings like `ethora-status` by its config-validation and ping behavior, though it does not explicitly name or contrast an alternative sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied by 'Diagnose the session' and the explanation that it validates config consistency for the active auth mode and pings the API. However, there is no explicit guidance about when to prefer this over alternatives such as `ethora-status` or `ethora-help`, and no when-not-to-use conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-feedback-submitSend FeedbackA
Send feedback about Ethora to the Ethora team: something that does not work, behaves differently from what the tool description promised, is missing, or is badly documented. It reaches the team directly, so prefer it over guessing or silently giving up when a tool fails. Recent failures in this session (tool, error code, request id) are attached automatically when includeRecentErrors is true, which is what makes a report from here more useful than a web form: the team can join it to the server-side log. Works whether or not you are signed in, so a problem that blocks sign-up can still be reported. Do not put credentials, API keys or end-user personal data in message; credential-shaped values in the attached context are redacted before sending.
Requires: nothing.
Auth: none. Works anonymously; when the session is authenticated the report is attributed to that account. Errors: 422 if message is shorter than 5 characters or looks like spam; 429 if too many reports were sent from this address.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Reply address. Only useful when the session is not signed in; an authenticated report already carries the account, so leave this out unless the user offers an address. | ||
| message | Yes | What happened, in the user's own words where possible: what was attempted, what was expected, what occurred instead. No credentials or end-user personal data. | |
| category | No | What kind of report this is: `bug` (something is broken), `unexpected` (it works but not as described), `feature` (a request), `docs` (a description or guide is wrong or missing), `other`. Defaults to `other`. | |
| includeRecentErrors | No | Attach this session's last few tool failures (tool name, error code, request id) so the team can trace them. Default true; set false if the report is unrelated to a failure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations carry only basic hints, so the description carries the behavioral burden. It discloses anonymous operation, account attribution when signed in, redaction of credential-shaped values, automatic attachment of recent failures, and 422/429 error conditions. This goes far beyond what the structured fields provide, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but efficient: every sentence carries a usage trigger, a constraint, or an error condition. The core purpose is front-loaded, and the labeled auth/error block is easy to scan. Nothing feels redundant or promotional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-risk feedback submission tool, this covers the decision triggers, parameter guidance, auth behavior, redaction, and failure modes. No output schema is present, but an agent already knows enough to call the tool correctly. There is no meaningful gap that would cause a misinvocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining why `includeRecentErrors` matters (server-side log join) and that credential-shaped values in attached context are redacted. It partially duplicates the schema text, but the redaction and error-behavior clarifications push it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States an unambiguous verb and resource ('Send feedback about Ethora') and enumerates the report types ('does not work, behaves differently, missing, badly documented'). This clearly distinguishes it from the dozens of operational sibling tools in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs the agent to prefer this tool over guessing or silently giving up when a tool fails, and contrasts it with a web form for server-side traceability. It also explains when it is useful even without authentication. The triggers and exclusions are clear enough that an agent can decide when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-files-delete-v2Delete FileADestructiveIdempotent
Permanently delete one of the authenticated user's files by id (DELETE /v2/files/:id). Removes the record and its stored content; not reversible.
Requires: a file id from ethora-files-upload-v2.
Auth: user-auth mode with an active user session. Errors: 401 not logged in; 403 not owned by the user; 404 unknown id. Related: get ids from ethora-files-get-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id of the file to delete. Get it from `ethora-files-get-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable context: 'Removes the record and its stored content; not reversible' and enumerates specific error codes and their causes. This goes beyond the annotations, clarifying the irreversibility and auth requirements. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: action first, then requirements, auth, errors, and related tools. Each sentence serves a purpose, with no filler. The irreversibility warning is front-loaded, making the destructive nature immediately visible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter delete tool, the description covers the core aspects: what it does, prerequisites, auth, errors, and related tools. It does not explicitly describe the success response (e.g., 204 No Content), but error handling is thoroughly documented. Given the tool's simplicity and lack of output schema, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, so the baseline is 3. The description adds meaning by specifying the source of the id (from `ethora-files-upload-v2`) and later referencing `ethora-files-get-v2` as a related retrieval tool. This gives the agent actionable guidance on where to obtain a valid id, beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Permanently delete one of the authenticated user's files by id', with a specific verb and resource. It distinguishes itself from sibling tools like get/upload by focusing on deletion and irreversibility. The HTTP endpoint is also given, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit prerequisites: a file id from `ethora-files-upload-v2` and user-auth mode with an active session. It lists error conditions (401, 403, 404) and points to `ethora-files-get-v2` for retrieving ids. It does not explicitly state 'when not to use' but the purpose is narrow enough that no alternative deletion tool exists; the guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-files-get-v2Get FileARead-only
List the authenticated user's files, or fetch one file's metadata by id (GET /v2/files). Returns an array when id is omitted, a single record when given.
Requires: a file id from ethora-files-upload-v2.
Auth: user-auth mode with an active user session. Errors: 401 not logged in; 404 unknown id or not owned by the user.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | File id to fetch a single record. Omit to list all files owned by the logged-in user. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description largely reinforces the safety. It adds valuable context about auth requirements (user-auth mode with active session), error codes (401, 404), and ownership restrictions (not owned by the user), which are beyond the annotations and essential for agents to handle failures correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with the primary functionality front-loaded, followed by prerequisites and errors. Every sentence provides useful information without redundancy, and it avoids overly technical jargon. It is appropriately sized for an agent to quickly grasp key actions and constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with full schema coverage, the description covers operation modes, auth, errors, and ownership constraints. No output schema exists, so return format guidance is provided. With annotations covering safety, nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, with a description for `id` that explains its optionality and effect. The tool description adds clarity by stating the return format (array vs single record) that depends on `id`, which is not explicit in the schema. This is a good compensation for any potential ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's dual function: listing all user files or fetching one by id, backed by the endpoint. It distinguishes itself from sibling ethora-files-upload-v2 and ethora-files-delete-v2 by focusing on reading, and the overall purpose is unmistakable. The verb 'List' and 'fetch' with specific resource and scope make it highly specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to omit or provide `id` for listing versus single fetch, and states the prerequisite of using `ethora-files-upload-v2` to get a file id. However, it does not explicitly compare with alternatives like `ethora-files-delete-v2` for when—but the deletion sibling is not a read alternative; the guidance is clear for the primary use case, though not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-files-upload-v2Upload FileA
Upload 1–5 files to the authenticated user's Ethora file storage (POST /v2/files). Each upload is a new record (no overwrite-by-name); files passed as base64, 50MB max each.
Auth: user-auth mode with an active user session (ethora-user-login first). Errors: 401 not logged in; 413 size limit exceeded; 422 unsupported mime type. Related: manage with ethora-files-get-v2 / ethora-files-delete-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | 1 to 5 files to upload in this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds substantial behavioral detail beyond the minimal annotations (readOnlyHint false, destructiveHint false): each upload is a new record (no overwrite), base64 encoding, 50MB size limit, and error conditions. It also discloses auth-state requirements, which is critical for correct use. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact (three sentences) and front-loaded with the primary purpose and scope. Each sentence serves a distinct purpose: core behavior, auth requirement, errors, and related tools. No redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple files, base64, auth constraints), the description covers preconditions (auth), failure modes (401/413/422), size limits, and the non-overwrite semantics. It includes related tools for follow-up actions. Absence of an output schema is acceptable since the description doesn't need to describe returns, and the description is sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers 100% of the parameter `files`, including its sub-properties (name, mimeType, base64) with details like base64 prefix stripping and 50MB limit. The tool description adds no new parameter-specific guidance, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Upload'), resource ('files to the authenticated user's Ethora file storage'), and includes the exact endpoint (`POST /v2/files`). It clearly distinguishes from siblings by noting management via `ethora-files-get-v2` / `ethora-files-delete-v2`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: auth requirement (`ethora-user-login` first), specific error codes (401, 413, 422), and a note on related tools for management. Does not explicitly exclude alternate tools or give 'when not to use' guidance, but the context is sufficient for typical selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-generate-b2b-bootstrap-runbookGenerate B2B Bootstrap RunbookARead-only
Generate a human-readable runbook listing this server's tool calls in the right order for a B2B bootstrap, with example payloads. Documentation only — does not write any file or execute any step.
Auth: none required — pure text generator, no API calls. Errors: effectively none. Related: to actually run the sequence use ethora-run-recipe or ethora-b2b-app-bootstrap-ai.
| Name | Required | Description | Default |
|---|---|---|---|
| apiUrl | No | Ethora API base URL to show in the runbook's configure step. Omit to emit a placeholder. | |
| crawlUrl | No | Website URL to show in the runbook's source-ingest step. Omit to emit a placeholder. | |
| displayName | No | App display name to show in the runbook's create-app step. Omit to emit a placeholder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description goes further by stating it does not write any file or execute any step, requires no auth, makes no API calls, and has effectively no errors. This adds valuable behavioral context beyond the annotations, making the tool's side-effect-free nature unmistakable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact (three sentences) and front-loaded: it states the core purpose first, then side-effect constraints, then related tools. Every sentence carries useful information with no fluff, and the structure logically leads an agent through purpose, behavior, and alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, non-destructive tool with no required parameters and no output schema, the description fully covers what it does, its side effects, auth requirements, error behavior, and related tools. An agent has all information needed to call it correctly and understand the result (a human-readable runbook).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each of the three optional parameters (apiUrl, crawlUrl, displayName) described as values to show in specific runbook steps, omitting them yields placeholders. The description does not add any semantics beyond the schema, so the baseline of 3 is appropriate; the schema fully explains parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: generate a human-readable runbook with example payloads for a B2B bootstrap. It specifies the verb 'generate' and the resource 'runbook', and explicitly distinguishes itself from related tools by naming alternatives for actually running the sequence. No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: use this for documentation only; to actually execute the sequence, use `ethora-run-recipe` or `ethora-b2b-app-bootstrap-ai`. It also notes it requires no auth and has effectively no errors, helping the agent decide if this is the right tool for a given task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-generate-chat-component-app-tsxGenerate Chat Component App.tsxARead-only
Generate a ready-to-paste React App.tsx snippet that mounts @ethora/chat-component. Returns { filename: "App.tsx", snippet }; unpassed values are emitted as placeholders. Does not write any file. Get the appToken from ethora-app-credentials { appId, confirm: true } (other tools redact it).
Auth: none required — pure code generator, no API calls. Errors: effectively none. Security note: the snippet includes appToken inline only as a quickstart convenience — do not ship hardcoded tokens to production.
| Name | Required | Description | Default |
|---|---|---|---|
| apiUrl | No | Ethora API base URL to embed in the snippet, e.g. `https://api.chat.ethora.com/v1`. Omit to emit a placeholder. | |
| roomJid | No | Room JID to open on load. Omit to emit a commented-out placeholder. | |
| appToken | No | appToken to embed in the snippet for quickstart testing. Omit to emit a placeholder. Do NOT hardcode real tokens in production source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint and destructiveHint annotations by disclosing no API calls, no file writes, effectively no errors, and a security note about not shipping hardcoded tokens. It also explains placeholder behavior for unpassed values. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, front-loading the primary action and return format, then covering side effects, auth, errors, and security in a logical order. Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 optional parameters and no output schema, the description covers purpose, return format, placeholder behavior, lack of side effects, auth requirements, error behavior, and security considerations. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining that unpassed values are emitted as placeholders and by warning against hardcoding real appToken in production, which is behavioral context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a ready-to-paste React App.tsx snippet that mounts @ethora/chat-component, specifies the return format, and explicitly notes it does not write files. This is a specific verb+resource that distinguishes it from sibling tools like ethora-widget-embed-snippet, which generates embed snippets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it tells the agent to get appToken from ethora-app-credentials, states no auth is required, and clarifies it is a pure code generator with no API calls. It does not explicitly name alternative tools or exclusions, but the context is sufficient for an agent to decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-generate-env-examplesGenerate Env ExamplesARead-only
Generate .env.example templates for the three common Ethora integration targets: the frontend chat component, the backend SDK, and this MCP server. Returns { target, template } when target is given, or { templates } with all three. Placeholder values only; does not write any file.
Auth: none required — pure text generator, no API calls. Errors: effectively none.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Which template to return: `frontend-chat-component` (Vite env), `backend-sdk` (@ethora/sdk-backend env), or `mcp` (this server's env). Omit to return all three. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds: 'does not write any file', 'no API calls', 'Auth: none required', and 'Errors: effectively none'. These are valuable behavioral disclosures beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero fluff, front-loaded purpose, then return format, then safety/auth. Efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple generator with one optional parameter, the description covers purpose, return format, side effects, auth, and errors. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed enum description. The description adds the conditional return shape: `{ target, template }` when target given, or `{ templates }` with all three. This clarifies behavior based on parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (generate) and resource (.env.example templates) plus the three integration targets, distinguishing it from sibling generators like ethora-generate-chat-component-app-tsx and ethora-generate-b2b-bootstrap-runbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context: it's for generating env templates for three integration targets. It doesn't explicitly name alternatives or exclusions, but the purpose is unambiguous and the return format conditional on the target parameter gives usage context. No explicit when-not-to-use, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-helpHelp and Next StepsARead-only
Task-oriented orientation for this MCP server: explains the three Ethora auth modes (user / app-token / B2B) and recommends next tool calls + recipes based on current session state.
Auth: none required — inspects state, no API calls. Errors: effectively none. Related: pass a recommended recipe id to ethora-run-recipe.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Goal hint to tailor the recommendations and recipe list. Omit or use `auto` to get recommendations inferred from the current session state. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive; the description adds important context beyond those annotations by stating that auth is not required, it inspects session state without making API calls, and errors are effectively none. This gives the agent strong confidence that calling this tool is safe and side-effect-free. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core orientation purpose comes first, followed by clearly labeled Auth, Errors, and Related notes. Each sentence contributes necessary information about scope, safety, or next steps, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter help/orientation tool with strong annotations, the description covers purpose, side-effect profile, error behavior, and the relationship to recipe execution. The absence of an output schema is not a significant gap because the description already tells the agent what the tool produces: recommendations for next calls and recipes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional `goal` parameter is fully documented in the schema with an enum and clear guidance to omit it or use `auto`, so schema coverage is effectively 100%. The description reinforces the parameter's purpose through session-state recommendation context but adds no new syntax, constraints, or semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource ('this MCP server') and a concrete outcome: explaining the three Ethora auth modes and recommending next tool calls/recipes based on session state. It does not merely restate the title, and no sibling tool claims this orientation/next-step role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied: call this when orientation or next-step recommendations are needed, and it even points to ethora-run-recipe for recipe execution. However, it never explicitly states when not to use it or names alternative introspection/status tools such as ethora-status or ethora-doctor, so selection guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-messages-context-v2Get Message ContextARead-onlyIdempotent
Fetch the messages surrounding a target message (GET /v2/apps/:appId/chats/:chatId/messages/context). Provide either aroundStanzaId or aroundMessageId; radius controls how many messages before/after.
Requires: a message id from ethora-messages-search-v2 or ethora-chats-history-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | Required in B2B mode unless already selected via ethora-app-select. | |
| chatId | Yes | ||
| radius | No | ||
| aroundStanzaId | No | ||
| aroundMessageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description confirms the safe read-only nature with 'Fetch' and 'GET'. It adds context about radius and the required message-id source, but it does not disclose potential edge cases, error behavior, or exclusivity handling if both around ids are supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry the full message with no filler: action/endpoint, parameter usage, and prerequisite source. The most important usage instruction is front-loaded, and every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only context fetch, the description covers the main invocation needs: choosing one around id, setting radius, and knowing where to obtain a message id. It lacks explicit treatment of responses and default/omitted radius behavior, but the annotations plus endpoint path make the tool callable without missing critical inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, so the description must compensate; it does explain the key around* parameters ('Provide either aroundStanzaId or aroundMessageId') and radius ('controls how many messages before/after'). However, it does not explain the difference between aroundStanzaId and aroundMessageId or give semantics for chatId beyond its appearance in the endpoint path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific action on a specific resource: 'Fetch the messages surrounding a target message' and includes the exact GET path. It also differentiates itself from siblings by explicitly requiring a message id produced by ethora-messages-search-v2 or ethora-chats-history-v2, so an agent can tell it apart from history/search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context: provide either aroundStanzaId or aroundMessageId, and set radius for before/after count. It identifies the prerequisite sources for the id, but it does not explicitly state when not to use this tool versus other chat message tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-messages-search-v2Search MessagesBRead-onlyIdempotent
Search an App's chat messages (GET /v2/apps/:appId/messages/search). B2B / tenant-actor auth. Filter by room (chatId), author (fromUserId), and time window.
Requires: a selected app (ethora-app-select) or an explicit appId.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query. | |
| mode | No | ||
| sort | No | ||
| appId | No | Required in B2B mode unless already selected via ethora-app-select. | |
| limit | No | ||
| since | No | ISO date lower bound. | |
| until | No | ISO date upper bound. | |
| chatId | No | ||
| offset | No | ||
| fromUserId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the auth requirement (B2B/tenant-actor) and the app selection precondition, which are useful behavioral context. It does not disclose details like pagination behavior or response format, but the annotation coverage lowers the bar, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the purpose and filters front-loaded in the first sentence and the requirement in the second. There is no redundant information or fluff, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 10 parameters and no output schema, the description covers the essential purpose, filters, and auth requirement. However, it omits guidance on using mode and sort (e.g., when to choose fulltext vs substring, or relevance vs date), and does not mention pagination defaults or result format. These are gaps that an agent might need, so completeness is adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 40%, with only q and appId described in the schema. The description adds meaning for chatId (room), fromUserId (author), and the time window (since/until), but does not explain mode, sort, limit, or offset. It compensates for some parameters but not all, so it adds partial value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Search' and the resource 'App's chat messages', with the endpoint. It mentions specific filters (room, author, time window) that distinguish it from a plain listing. However, it does not explicitly differentiate it from sibling tools like ethora-chats-history-v2 or ethora-messages-context-v2, so it is clear but not fully distinguishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use: it mentions B2B/tenant-actor auth and the prerequisite of a selected app or explicit appId. However, it does not state when not to use it or mention alternative tools for similar tasks, leaving the usage guidance implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-run-recipeRun RecipeA
Execute a built-in recipe — an ordered sequence of this server's own tool calls — by id. Recipes capture common flows (B2B bootstrap, broadcast, sources ingest). Use dryRun: true to preview resolved steps. Omit recipeId to list runnable recipes for a goal.
Requires: the inputs the chosen recipe lists; call without recipeId first to see the recipes and their required inputs.
Auth: depends on the recipe's steps — configure those first (see ethora-help). Errors: stops at the first failing step and returns the partial log; a missing required vars entry fails fast before any step runs.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Goal scope used to look up recipes when `recipeId` is omitted. Defaults to `auto`. | |
| vars | No | Key/value substitutions injected into recipe steps (e.g. appId, appToken, b2bToken, appJwt, email, password, apiUrl). A recipe declares which vars it requires; missing required vars fail the run before any step executes. | |
| dryRun | No | If true, resolve and return the step list with `vars` substituted but execute nothing. Use this to preview a recipe before running it for real. | |
| recipeId | No | Id of the recipe to run. Omit to instead list the runnable recipes for the selected `goal` (get ids from `ethora-help`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply hints; the description adds substantial runtime behavior: ordered execution, stop-at-first-failure with a partial log, fail-fast on missing required vars before any step runs, dryRun preview semantics, and auth dependence on the recipe's own steps. This goes well beyond the generic readOnly/idempotent/destructive hints and gives an agent a realistic model of execution and failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficiently organized: a first sentence defining the tool, followed by concrete flow examples and the dryRun tip, then labeled paragraphs for Requires, Auth, and Errors. No sentence is filler, and the most important usage guidance is front-loaded. This is appropriately sized for a complex meta-tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description covers inputs, discovery, auth, and failure behavior. It even states what dryRun returns (a resolved step list) and what failure returns (a partial log). The only notable gap is that it never describes the success return value of a real run beyond implying a log. Given the high complexity and absent output schema, this is a minor omission rather than a fatal one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds relational value between parameters: it explains that dryRun previews resolved steps, that omitting recipeId triggers a listing for the selected goal, and that vars are injected into steps with missing required vars failing fast. This cross-parameter workflow guidance goes beyond the individual parameter descriptions, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Execute') and a specific resource ('a built-in recipe') and defines what a recipe is: 'an ordered sequence of this server's own tool calls.' It also gives concrete examples of flows (B2B bootstrap, broadcast, sources ingest) and contrasts the two modes of operation (run by id vs. list by goal). This clearly separates it from the many individual flow tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use context: execute a built-in recipe for common flows, preview with dryRun, and list recipes by omitting recipeId. It also gives a prerequisite discovery procedure ('call without recipeId first to see the recipes and their required inputs') and an auth prerequisite. It does not explicitly name alternatives like calling the underlying flow tools directly, but the recipe-based framing makes the intended usage unambiguous enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-docs-deleteDelete Knowledge Document (Legacy)ADestructiveIdempotent
Remove a previously ingested document from an app's RAG sources by docId (legacy user-auth route). Deletes the document record and its embeddings; not reversible.
Requires: a document id from ethora-sources-docs-list-v2.
Auth: user-auth mode, active session; the user must own the app. Errors: 401 not logged in; 403 not owner; 404 unknown docId. Related: get docId from ethora-sources-docs-list-v2; app-token/B2B uses ethora-sources-docs-delete-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the document belongs to. Optional — defaults to the app set via `ethora-app-select`. | |
| docId | Yes | Id of the ingested document to delete. Get it from `ethora-sources-docs-list-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds meaningful context beyond them: it specifies that both the document record and its embeddings are deleted, states irreversibility, enumerates error codes (401/403/404), and notes legacy status. This is exactly the extra behavioral disclosure expected when annotations exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then structured into clear lines for requirements, auth, errors, and related tools. It is slightly repetitive in stating the docId source twice, but every line adds value; no filler. Slightly longer than necessary but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation with auth and error conditions, the description covers everything an agent needs: prerequisites, auth mode, error codes, irreversibility, and the v2 alternative. No output schema exists, but for a delete operation the return value is likely trivial. The description is fully sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no new parameter-level detail beyond what the schema already provides (docId from list-v2, appId optional). It does reinforce the source of docId, but that is more usage guidance than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-resource statement: 'Remove a previously ingested document from an app's RAG sources by docId' and immediately flags it as the legacy user-auth route. This clearly distinguishes it from the v2 sibling, and explicitly names the sibling in the Related line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to source the docId from ethora-sources-docs-list-v2, states the auth mode and ownership requirement, and explicitly routes app-token/B2B callers to ethora-sources-docs-delete-v2. This is a textbook when-to-use vs alternative explanation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-docs-delete-v2Delete Knowledge DocumentADestructiveIdempotent
Remove a previously ingested document from an app's RAG sources by docId (app-token / B2B variant of ethora-sources-docs-delete). Deletes the document record and its embeddings; not reversible.
Requires: a document id from ethora-sources-docs-list-v2.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId or docId. Related: get docId from ethora-sources-docs-list-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the document belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| docId | Yes | Id of the ingested document to delete. Get it from `ethora-sources-docs-list-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructiveHint=true, but the description adds important context: it specifies that the document record and its embeddings are deleted and that the operation is not reversible. It also discloses auth-related error conditions (401/403 for wrong auth, 404 for unknown appId/docId), which are not present in the structured annotations. This exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise but contains redundancy: 'Requires: a document id from ethora-sources-docs-list-v2' and 'Related: get docId from ethora-sources-docs-list-v2' convey the same instruction twice. The layout is otherwise clear, but the duplication makes it slightly less efficient than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool with only 2 parameters and no output schema, the description covers all essential aspects: purpose, authentication, required input, error conditions, and irreversibility. It omits the success response format, but that is minor given the operation's simplicity and the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both appId and docId already have descriptive text. The tool-level description restates the same information (e.g., 'Get it from ethora-sources-docs-list-v2') without adding new parameter-level semantics. According to the rubric, this warrants a baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Remove a previously ingested document') and the resource ('from an app's RAG sources by docId'), and distinguishes it from the sibling tool ethora-sources-docs-delete by labeling it the app-token/B2B variant. This fully clarifies what the tool does and how it differs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the prerequisite (obtain docId from ethora-sources-docs-list-v2), the supported auth modes (app-token or B2B with explicit appId), and references the alternative tool (ethora-sources-docs-delete) with the distinguishing variant label. It stops short of an explicit 'when not to use' statement, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-docs-list-v2List Knowledge DocumentsARead-only
List an app's ingested documents, including each document's id, name, and current RAG tags. Their ids feed ethora-sources-docs-tags-update-v2 and ethora-sources-docs-delete-v2.
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId; empty list if nothing has been uploaded. Related: website-sources equivalent is ethora-sources-site-list-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId to list documents for. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false, so the safe-read nature is covered. The description adds valuable behavioral context: auth requirements, error cases, and the empty-list behavior, going beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly packed with useful information, front-loaded with the core purpose and target fields, then requirements, auth, errors, and related tool. No filler or redundancy; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list with one optional parameter and no output schema, the description covers prerequisites, auth, errors, and the list's content. It stops short of noting pagination or sort order, but these are minor gaps for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains the appId parameter's format, mode-specific behavior, and optionality. The description restates this in prose without adding new parameter-level information, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('List'), resource ('an app's ingested documents'), and the exact fields returned (id, name, current RAG tags). It also differentiates itself from sibling tools by noting that the ids feed update/delete tools and pointing to the site-list equivalent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisites (selected app or explicit appId), valid auth modes (app-token vs B2B with appId), and error conditions (401/403, 404, empty list). Names the related sibling tool for website sources, giving clear guidance on when to use which.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-docs-tags-update-v2Update Knowledge Document TagsAIdempotent
Set the RAG retrieval tags on an ingested document — replaces the document's tag set with the provided tags array (not additive; pass [] to clear all). Tags let the bot's ragTags narrow retrieval.
Requires: a document id from ethora-sources-docs-list-v2.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId or docId. Related: get docId from ethora-sources-docs-list-v2; website-source equivalent is ethora-sources-site-tags-update-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | The complete desired tag set for this document (replaces any existing tags). Up to 50 tags; pass `[]` to clear all. | |
| appId | No | 24-char hex appId the document belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| docId | Yes | Id of the ingested document to tag. Get it from `ethora-sources-docs-list-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations present, the description adds meaningful behavioral context: tags are replaced, not merged; passing [] clears all tags; and the RAG-retrieval purpose of tags. It also discloses auth requirements and likely error codes. There is no contradiction with the annotations, since 'replaces tags' does not mean the document resource itself is destroyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior, then proceeds through requirements, auth, errors, and related tools in a logical, compact way. Every sentence earns its place without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter mutation with no output schema, the description is complete: it explains the core behavior, prerequisites, auth modes, failure modes, and related tools. An agent has what it needs to invoke the tool correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a detailed schema description, so the baseline is 3. The description mostly restates schema content rather than adding significant new parameter-level meaning, though it adds the useful 'not additive' framing and RAG-retrieval purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Set') and a clearly scoped resource ('RAG retrieval tags on an ingested document'), so an agent immediately knows what the tool does. It also distinguishes this tool from its website-source sibling by noting the document context and naming the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a hard prerequisite (docId from ethora-sources-docs-list-v2), explains the two valid auth modes, and points to the website-source equivalent. This gives an agent enough guidance to know when this tool is appropriate and when to use a sibling instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-docs-uploadUpload Knowledge Document (Legacy)A
Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (legacy user-auth route). Async — content becomes queryable once indexing finishes; files passed as base64, 50MB max each.
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: user-auth mode, active session; the user must own the app. Errors: 401 not logged in; 403 not owner; 413 too large; 422 unsupported document type. Related: app-token/B2B flows use ethora-sources-docs-upload-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId to ingest into. Optional — defaults to the app set via `ethora-app-select`. | |
| files | Yes | 1 to 5 documents to ingest in this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing asynchronous indexing behavior, the 50MB per-file limit, and the exact error conditions (401/403/413/422). It also clarifies the legacy user-auth context and ownership requirement, which annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every clause carries operational value: scope, async behavior, file limits, prerequisites, auth, error codes, and the sibling alternative. The most important call-blocking constraints are front-loaded, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and meaningful complexity, the description covers the required inputs, prerequisites, auth, error cases, async behavior, and the legacy-vs-v2 distinction. Nothing essential is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `appId`, `files`, `name`, `mimeType`, and `base64` thoroughly. The description mostly restates schema facts (1–5 files, base64, 50MB max) and adds only minor context like 'PDF, text, etc.' It does not meaningfully extend parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact action ('Upload documents into an app's RAG sources'), the resource, and the route ('legacy user-auth route'). It also distinguishes this tool from the sibling `ethora-sources-docs-upload-v2`, making its scope immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisites (selected app via `ethora-app-select` or explicit `appId`), auth requirements (user-auth mode, active session, app ownership), and explicitly routes app-token/B2B flows to the v2 sibling. This gives an agent concrete when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-docs-upload-v2Upload Knowledge DocumentA
Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of ethora-sources-docs-upload). Async — content becomes queryable once indexing finishes; files passed as base64, 50MB max each.
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId; 413 too large; 422 unsupported document type. Related: ethora-sources-docs-list-v2, ethora-sources-docs-delete-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId to ingest into. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| files | Yes | 1 to 5 documents to ingest in this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the minimal annotations: async indexing, eventual queryability, base64 payloads, 50MB per-file limit, auth requirements, and a compact error-code map. This is exactly the kind of operational detail an agent needs and annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose first, then async behavior and limits, prerequisites, auth, errors, and related tools. The layout is dense but highly scannable and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers document types, count, limits, async behavior, requirements, auth modes, errors, and related tools. The main gap is not describing the response/job status for the async upload or the exact accepted MIME list, though those are not strictly required for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description echoes some schema content (base64, 50MB max, 1–5 files, `appId` mode behavior) but adds little new parameter-level meaning beyond error codes and the async outcome.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: uploading documents into an app's RAG sources. It further distinguishes the tool as the app-token/B2B variant of the v1 upload and implicitly separates it from list/delete siblings by naming them as related but different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear prerequisites (selected app or explicit `appId`), auth mode conditions, and error codes, plus names related list/delete tools. It does not explicitly state when to avoid this tool or choose the v1 sibling, but the context is strong enough for an agent to decide correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-crawl-v2Crawl Website SourceA
Crawl a website URL and ingest its content into an app's RAG sources (app-token / B2B variant of ethora-sources-site-crawl). Async — returns once the job is accepted; followLink: true follows in-domain links and can ingest many pages.
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 400 malformed url; 404 unknown appId. Related: ethora-sources-site-crawl-v2-wait (block until done).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute URL to crawl, e.g. `https://example.com/docs`. | |
| appId | No | 24-char hex appId to ingest into. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| followLink | No | If true, also crawl in-domain links reachable from `url`. Can ingest many pages — use with care. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), the description adds critical behavioral context: it is asynchronous, returns immediately upon job acceptance, and `followLink: true` can ingest many pages (with a caution to use carefully). It also discloses error cases and authentication requirements. This goes well beyond what annotations convey and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: the first sentence states the core purpose and async nature, the second covers `followLink` behavior, and a third covers requirements, auth, errors, and related tools. There is no redundant or verbose phrasing; every sentence carries essential information, and the most important facts are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters and no output schema, the description is thorough. It explains the async behavior, prerequisites, auth modes, error codes, and points to the wait variant. Nothing an agent needs to invoke this correctly is missing: the tool's purpose, constraints, and failure modes are all covered. The lack of an output schema is acceptable since the tool returns a job acceptance, which is described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all three parameters (`url`, `appId`, `followLink`) with clear descriptions, and schema coverage is 100%. The description adds value by explaining the consequence of `followLink` (ingesting many pages) and clarifying the role of `appId` in B2B mode vs. app-token mode. While not a massive addition, it enriches the semantic understanding beyond the raw schema, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Crawl a website URL and ingest its content into an app's RAG sources'. It clearly distinguishes itself from the sibling `ethora-sources-site-crawl-v2-wait` by noting it is async and returns once the job is accepted, and it also identifies itself as a B2B/app-token variant. This is unambiguous and separates it from other source-management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage conditions: it requires a selected app via `ethora-app-select` or an explicit `appId`, specifies auth modes (app-token vs B2B), details possible error codes (401/403, 400, 404) and their meanings, and points to the related wait tool `ethora-sources-site-crawl-v2-wait` for blocking completion. This gives the agent clear decision criteria for when to use this tool and what prerequisites must be met.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-crawl-v2-waitCrawl Website Source and WaitA
Crawl a website URL and wait for the crawl to finish: enqueues the job, then polls it until it reports completed or failed. Returns { done, status, jobId, polls, durationMs, result }; done: false with a note means the budget ran out while the job was still running (it usually finishes server-side anyway).
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 400 malformed url; 504/timeout if it takes longer than timeoutMs (the job may still complete server-side — check with ethora-sources-site-list-v2).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute URL to crawl, e.g. `https://example.com/docs`. | |
| appId | No | 24-char hex appId to ingest into. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| timeoutMs | No | How long to poll for the crawl to finish, in milliseconds. Default 45000, chosen to stay under the ~60s request timeout most MCP clients enforce. Caps at 600000 (10 min) for clients that allow longer calls. | |
| followLink | No | If true, also crawl in-domain links reachable from `url`. Can ingest many pages — use with care. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only high-level hints (readOnly=false, not destructive, not idempotent). The description adds crucial behavioral detail: it enqueues then polls, returns a structured result, and discloses that a timeout does not guarantee the job is cancelled—it may still complete. It also explains auth requirements and error codes (401/403, 400, 504), which are not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet dense, leading with the primary action, then the return shape, prerequisites, auth, and errors. Every sentence earns its place—there is no filler. It is front-loaded with the core behavior and uses a structured paragraph style that aids scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully explains the return object, including the edge case of `done:false`. It covers prerequisites, auth modes, error handling, and the timeout behavior. It also references a sibling tool for follow-up, making it complete for an agent to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaningful context beyond the schema: it explains why `timeoutMs` defaults to 45000 (to stay under typical client limits), warns that `followLink` can ingest many pages, and clarifies when `appId` is required versus ignored. This enriches each parameter's meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Crawl a website URL') and clarifies the distinctive wait-for-completion behavior, which separates it from the likely non-waiting sibling `ethora-sources-site-crawl-v2`. It also states the outcome and what the return value contains, leaving no ambiguity about the tool's job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states prerequisites (selected app or explicit `appId`), which auth modes are accepted, and what to do on timeout (check with `ethora-sources-site-list-v2`). It also explains the partial-failure case (`done: false` with a `note`) and notes that the job usually finishes server-side, giving clear guidance on when to use this tool versus waiting/checking elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-delete-url-v2Delete Website Source URLADestructiveIdempotent
Remove a single crawled URL from an app's RAG sources, matched by its exact url string (app-token / B2B variant of ethora-sources-site-delete-url). Deletes the source record and its embeddings; not reversible. Matches on the exact stored URL string.
Requires: an indexed site URL from ethora-sources-site-list-v2 (crawled with ethora-sources-site-crawl-v2).
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 url not a crawled source. Related: get the stored value from ethora-sources-site-list-v2; bulk-by-id is ethora-sources-site-delete-url-v2-batch.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Exact crawled URL string to remove (must match what was stored — get it from `ethora-sources-site-list-v2`). | |
| appId | No | 24-char hex appId the URL belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that both the source record and its embeddings are deleted and that the operation is not reversible. It also specifies exact-match behavior and expected error codes (401/403, 404), which adds meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with labeled sections (Requires, Auth, Errors, Related) and is front-loaded with the core purpose. However, the exact-match condition is stated twice in the opening, and list-v2 appears in both Requires and Related, creating minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter destructive operation with no output schema, the description covers prerequisites, destruction scope, irreversibility, auth modes, error handling, and related tools. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter descriptions already explain the exact-match requirement and the B2B appId behavior. The tool description largely reiterates the schema, adding little new meaning beyond emphasizing 'get it from ethora-sources-site-list-v2'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Remove a single crawled URL from an app's RAG sources.' It further clarifies exact-match semantics and explicitly distinguishes this tool from its batch sibling, so an agent can tell it apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names explicit prerequisites ('Requires: an indexed site URL from ethora-sources-site-list-v2... crawled with ethora-sources-site-crawl-v2'), auth requirements, and points to the bulk alternative `ethora-sources-site-delete-url-v2-batch`. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-list-v2List Website SourcesARead-only
List an app's crawled website sources, including each source's id, URL, and current RAG tags. Their ids feed ethora-sources-site-tags-update-v2, ethora-sources-site-delete-url-v2-batch, and ethora-sources-site-reindex-v2.
Requires: a selected app (ethora-app-select) or an explicit appId.
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId; empty list if nothing has been crawled.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId to list sources for. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the empty-list behavior when nothing has been crawled, the auth-mode-dependent behavior of appId (ignored in app-token mode), and the downstream consumer tools. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose is in the first sentence, followed by downstream consumers, then requirements/auth/errors. Every sentence earns its place, and the error conditions are packed efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one optional parameter, the description covers purpose, prerequisites, auth modes, error cases, and downstream usage. The output schema is absent, but the description states exactly what fields are returned (id, URL, RAG tags), so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the appId parameter. The description adds meaningful context beyond the schema by explaining when appId is required (B2B mode) versus ignored (app-token mode), and that it can be inherited from ethora-app-select. This is genuinely useful semantic information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('an app's crawled website sources'), and the exact data returned (id, URL, current RAG tags). It also names the downstream tools that consume the ids, which distinguishes it from sibling source tools like ethora-sources-docs-list-v2 and ethora-sources-site-crawl-v2.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states prerequisites ('Requires: a selected app (`ethora-app-select`) or an explicit `appId`'), auth modes, and error conditions (401/403 wrong auth, 404 unknown appId, empty list if nothing crawled). This gives clear when-to-use and when-not-to-use guidance, including the alternative of selecting an app first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-reindex-v2Reindex Website SourceAIdempotent
Re-crawl and re-embed a previously crawled URL by its urlId, refreshing its RAG content (app-token / B2B variant of ethora-sources-site-reindex). Async — the existing source record is updated in place once indexing finishes.
Requires: an indexed site URL from ethora-sources-site-list-v2 (crawled with ethora-sources-site-crawl-v2).
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId or urlId. Related: get urlId from ethora-sources-site-list-v2; ethora-sources-site-reindex-v2-wait blocks until done.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the URL belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| urlId | Yes | Id of a previously crawled URL record. Get it from `ethora-sources-site-list-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description goes beyond these by disclosing the async nature ('Async — the existing source record is updated in place once indexing finishes'), authentication requirements (app-token or B2B with explicit appId), and specific error codes (401/403 wrong auth, 404 unknown appId/urlId). This adds meaningful operational context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact—four sentences, each carrying distinct value: the action and variant, async update behavior, prerequisite, and auth/error/related pointers. It is front-loaded with the core purpose and avoids extraneous detail. Slightly verbose but not padded; the structure is clean and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple reindex tool with only two parameters, the description covers the essential operational aspects: what it does, async behavior, prerequisites, auth modes, error cases, and related tools. The only omission is an explicit description of the return value, but given there is no output schema and the async nature, this is a minor gap. The description is otherwise sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reiterates that `urlId` comes from list, and adds that `appId` is required in B2B mode unless set via `ethora-app-select`, but this information already exists in the schema's parameter descriptions. The description does not introduce new semantics beyond what the schema already documents, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Re-crawl and re-embed a previously crawled URL by its `urlId`, refreshing its RAG content'. This clearly states what the tool does and names the target. It also distinguishes itself from siblings by noting it's the app-token/B2B variant and referencing the wait block tool, making its position in the family clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear prerequisite: requires an indexed site URL from `ethora-sources-site-list-v2` (crawled with `ethora-sources-site-crawl-v2`), which effectively tells the agent when to use this tool (only after a URL has been crawled). It also points to the related wait tool and how to obtain `urlId`. It doesn't explicitly say 'use X instead if Y', but the prerequisite and related-tool mentions give adequate guidance for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-reindex-v2-waitReindex Website Source and WaitAIdempotent
Re-crawl and re-embed a previously crawled URL and wait for it to finish: enqueues the job, then polls it until it reports completed or failed. Returns { done, status, jobId, polls, durationMs, result }; done: false with a note means the budget ran out while the job was still running.
Requires: an indexed site URL from ethora-sources-site-list-v2 (crawled with ethora-sources-site-crawl-v2).
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId or urlId; 504/timeout if it takes longer than timeoutMs (the job may still complete server-side). Related: get urlId from ethora-sources-site-list-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the URL belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| urlId | Yes | Id of a previously crawled URL record. Get it from `ethora-sources-site-list-v2`. | |
| timeoutMs | No | How long to poll for the reindex to finish, in milliseconds. Default 45000, chosen to stay under the ~60s request timeout most MCP clients enforce. Caps at 600000 (10 min) for clients that allow longer calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the full lifecycle: job enqueueing, polling until completed/failed, the done:false/note budget-exhaustion case, the auth modes, the specific 401/403/404/504 errors, and the fact that a timeout may still leave the job running server-side. Even with idempotentHint=true and readOnlyHint=false present, this text adds meaningful behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries information: purpose, return value, prerequisites, auth requirements, error semantics, and related tools. Information is front-loaded with the tool's core behavior before the polling details. No filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description compensates by specifying the returned fields, the partial-result note, timeout behavior, and error cases. Combined with the 100%-covered input schema, an agent has everything needed to invoke this tool correctly and handle its edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents appId, urlId, and timeoutMs well. The description adds context about why timeoutMs defaults to 45s and that appId is required in B2B mode, but it mostly reinforces schema-level meaning rather than introducing new parameter semantics. A baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb pair ('re-crawl and re-embed'), names the exact resource (a previously crawled URL), and immediately distinguishes the wait behavior from the non-wait sibling by explaining it enqueues then polls. The return shape is stated, so an agent can tell this tool apart from ethora-sources-site-reindex-v2 and ethora-sources-site-crawl-v2-wait without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states prerequisites: the URL must already be indexed from ethora-sources-site-list-v2 and crawled with ethora-sources-site-crawl-v2. It explains when the wait matters (polls until completed/failed, budget-exhaustion note) and gives related tool references, though it does not explicitly say 'use the non-wait variant if you do not need to block'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-sources-site-tags-update-v2Update Website Source TagsAIdempotent
Set the RAG retrieval tags on a crawled website source — replaces the source's tag set with the provided tags array (not additive; pass [] to clear all). Tags let the bot's ragTags narrow retrieval.
Requires: an indexed site URL from ethora-sources-site-list-v2 (crawled with ethora-sources-site-crawl-v2).
Auth: app-token mode OR B2B mode with an explicit appId. Errors: 401/403 wrong auth; 404 unknown appId or sourceId. Related: get sourceId from ethora-sources-site-list-v2; doc equivalent is ethora-sources-docs-tags-update-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | The complete desired tag set for this source (replaces any existing tags). Up to 50 tags; pass `[]` to clear all. | |
| appId | No | 24-char hex appId the source belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| sourceId | Yes | Id of the crawled site source to tag. Get it from `ethora-sources-site-list-v2`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description adds substantial behavioral context: the non-additive replacement semantics with `[]` to clear, auth-mode requirements, concrete error codes (401/403/404), and the prerequisite workflow. It also explains the operational effect — tags narrow retrieval via the bot's ragTags. These are exactly the behaviors an agent needs to call correctly, and none contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core semantics are front-loaded in the first sentence, followed by purpose, requirements, and auth/errors/routing in labeled segments. Every sentence earns its place; the only minor imperfection is the final sentence packing Auth, Errors, and Related together, which slightly reduces scannability, hence 4 rather than 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter mutation with 100% schema coverage, the description covers replacement semantics, prerequisites, auth, error modes, and sibling routing. The only gap is the success response shape, which is unaddressed and there is no output schema — a minor omission for a lightweight synchronous tag-set operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters fully (tags, appId, sourceId), setting a baseline of 3. The description adds value beyond the schema by explaining the semantic purpose of tags ('Tags let the bot's ragTags narrow retrieval'), which the schema does not convey, and reinforces the sourceId provenance workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Set the RAG retrieval tags on a crawled website source.' It immediately distinguishes itself from the sibling space by clarifying replace-vs-additive semantics and naming the doc equivalent (ethora-sources-docs-tags-update-v2), so an agent can tell it apart from the many sources-* siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit preconditions ('Requires: an indexed site URL from ethora-sources-site-list-v2, crawled with ethora-sources-site-crawl-v2'), auth conditions (app-token vs B2B with appId), and routes the agent to the correct alternative for documents via 'doc equivalent is ethora-sources-docs-tags-update-v2.' Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-statusSession StatusARead-only
Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like hasAppJwt — values never echoed), the selected appId/agentId, and hosted/sessionId on the hosted (Streamable HTTP) server.
Auth: none required. Errors: effectively none. Related: ethora-doctor for an active connectivity check.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, indicating a safe, non-destructive operation. The description adds the important behavioral detail that credential values are never echoed, only their presence via booleans like hasAppJwt. This is critical for an agent to avoid expecting sensitive data in the output. It also notes that errors are 'effectively none' and that no authentication is required, which are not captured in annotations. This goes beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the main purpose ('Report the current Ethora MCP session state') and then lists the specific items reported in a single sentence. The additional lines about auth, errors, and related tool are brief and to the point. Every sentence adds value, with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool, the description is quite complete. It covers what the tool returns, mentions that no auth is required, and anticipates that errors are negligible. It also suggests an alternative for connectivity issues. Given the simplicity of the tool, the only minor gap is that it doesn't explicitly describe the output format beyond the listed fields, but given there is no output schema, the description does a good job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain parameter semantics. It does, however, mention the booleans (hasAppJwt) that will be present in the output, which indirectly informs the agent about the kind of data it can expect. Since there are no parameters, the description fulfills the requirement by clearly stating the tool's zero-input nature.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: reporting the current Ethora MCP session state. It enumerates the specific pieces of information returned (configured API URL, auth mode, credential presence, appId/agentId, hosted/sessionId). It also distinguishes itself from the sibling tool ethora-doctor, which is an active connectivity check, making it clear that this tool is for status reporting only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: to inspect the current session state. It implicitly suggests it is a read-only diagnostic tool. It mentions a related tool, ethora-doctor, for active connectivity checks, which helps an agent choose between the two. However, it does not explicitly state when NOT to use this tool (e.g., when you need to modify configuration), but the distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-unread-counts-v2Get Unread CountsARead-onlyIdempotent
Batch per-room unread message counts for a set of users (POST /v2/apps/:appId/users/unread-counts). mode=count returns numbers (capped); mode=flag returns booleans. Requires Mongo message archiving enabled on the deployment.
Requires: a selected app (ethora-app-select) or an explicit appId.
| Name | Required | Description | Default |
|---|---|---|---|
| cap | No | ||
| mode | No | ||
| appId | No | Required in B2B mode unless already selected via ethora-app-select. | |
| userIds | Yes | uuid / Mongo _id / xmppUsername, 1..200. | |
| concurrency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by explaining the mode parameter (count returns capped numbers, flag returns booleans) and the deployment requirement (Mongo archiving). This goes beyond the structured annotations and informs the agent of operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, front-loading the core purpose before detailing mode behavior and requirements. Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters and no output schema, the description covers the most critical aspects: the operation's nature, mode behavior, and prerequisites. It omits details on cap and concurrency, but those are optional and less critical. The description is reasonably complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, leaving cap, mode, and concurrency undocumented in the schema. The description clarifies the mode parameter's effect and the appId requirement, but does not explain cap or concurrency semantics. It partially compensates for the low coverage but leaves gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: batch per-room unread message counts for a set of users, including the HTTP endpoint. It is specific about the resource and action, and distinct enough from siblings like ethora-messages-context-v2, though it does not explicitly contrast itself against them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear prerequisites: requires Mongo message archiving enabled, and requires either a selected app via ethora-app-select or an explicit appId. It does not explicitly mention when not to use this tool or suggest alternatives, but the conditions given are actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-user-loginLog InAIdempotent
Authenticate as an existing Ethora user with email + password. Stores the user session token in this MCP session and unlocks user-auth tools (ethora-app-list, ethora-files-*, ethora-wallet-*).
Auth: user-auth mode (ethora-auth-use-user first) and a configured appJwt. Errors: 401/403 bad credentials; 404 email not registered; 429 per-IP rate limit — retry with backoff.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | User's registered email address (RFC 5322). Must match an account created via `ethora-user-register`. | ||
| password | Yes | Plain-text password the user set during registration. Sent over TLS to the Ethora API; never echoed back or logged. | |
| apiKeyName | No | Label for the API key when `createApiKey` is true (e.g. `claude-code-laptop`). | |
| createApiKey | No | When true, also mint a long-lived API key for this user and return it once, so headless clients / agents can reconnect with `Authorization: Bearer <key>` instead of logging in again. Default false. | |
| apiKeyTtlDays | No | Lifetime of the API key in days when `createApiKey` is true. Server default applies when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint: false, idempotentHint: true, destructiveHint: false), the description discloses a key side effect: 'Stores the user session token in this MCP session and unlocks user-auth tools.' It also lists error codes (401/403, 404, 429) with rate-limit retry advice, which is valuable behavioral context that the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: three sentences cover the main purpose, session side effect, auth prerequisites, and error handling. It is front-loaded with the core action, and every sentence adds essential information with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a login tool, the description covers all necessary operational aspects: the credentials to use, the required auth context, the resulting session behavior, and error handling. There is no output schema, but because the session token is stored internally, a return value description is unnecessary. The context signals and sibling tools further make the place of this tool clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all five parameters, including details like format, purpose, and defaults. The tool description only repeats 'email + password' and adds no extra meaning beyond what the schema already documents. This meets the baseline of 3 as the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Authenticate as an existing Ethora user with email + password.' This clearly distinguishes it from sibling tools like ethora-user-register and the auth-mode selectors, making 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies the prerequisite 'user-auth mode (`ethora-auth-use-user` first) and a configured `appJwt`', which tells the agent when this tool can be used. It also notes that it 'unlocks user-auth tools', implicitly guiding the agent to choose login when those tools need to be accessed. It does not explicitly name alternatives for app or B2B auth, but the user vs. app distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-user-registerRegister AccountA
Create a new Ethora user account by email + first/last name, then log in and bind the session. A password is generated when omitted and returned once. By default also mints a long-lived API key so an agent can reconnect later with Authorization: Bearer <key> (no human step needed).
Auth: user-auth mode and a configured appJwt (on a hosted server this is preset). Errors: 401 no appJwt; 422 email already registered or password shorter than 6 chars; 429 rate limited. Related: bulk provisioning uses ethora-users-batch-create-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address for the new user. Must be RFC-5322 valid and not already registered within this app. No confirmation click is required to log in; the address is used for password reset. | ||
| lastName | Yes | Last name shown in the user's profile. | |
| password | No | Password for the account (min 6 chars). Omit to have a strong random password generated and returned once in the result. | |
| firstName | Yes | First name shown in the user's profile and message attributions across chat rooms and the app UI. | |
| apiKeyName | No | Label for the API key (default `mcp-signup`). | |
| createApiKey | No | Mint a long-lived API key right after signup and return it once. Default true. Set false if you only need this session. | |
| apiKeyTtlDays | No | API key lifetime in days. Server default applies when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is not read-only and not destructive; the description carries the full behavioral burden. It covers password auto-generation, one-time return, API key minting by default, session binding, auth prerequisites, and specific error codes. It could still add more about the exact response shape, but given the constraints it is quite complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences plus an error list and sibling pointer. It is not bloated and front-loads the primary purpose before auth/errors. Minor redundancy with schema descriptions means it is not a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, and only basic annotations, this description still covers high-level behavior, errors, authentication, and the API-key reconnection flow. It does not detail a response schema, but while there is no output schema it may be incomplete in exact return shape, so this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter schema already covers 100% of the properties, so baseline is 3. The description adds value by explaining the `appJwt` auth dependency, tying API key creation to reconnection, and summarizing which error conditions map to email/password validation, going beyond the raw schema texts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says clearly that this tool creates a new user, logs the session in, and can mint an API key. It explicitly names the related bulk alternative, `ethora-users-batch-create-v2`, so an agent can tell this tool apart from its sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool (new account + session + optional API key) and names the bulk alternative. It does not explicitly tell the agent when not to use it (e.g., for an already-existing user, `ethora-user-login`), but the purpose is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-users-batch-create-v2Batch Create UsersA
Provision many Ethora users (1–100) in one asynchronous batch job — the bulk equivalent of ethora-user-register. Enqueues a background job (HTTP 202); the job reports per-user conflicts rather than failing the whole batch. Returns { jobId, statusUrl }.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken). Errors: 401/403 not in B2B mode; 422 usersList validation. Related: track with ethora-wait-users-batch-job-v2.
| Name | Required | Description | Default |
|---|---|---|---|
| timeoutMs | No | HTTP timeout for the job-creation request (not the job itself), in milliseconds. Default 30000. | |
| usersList | Yes | The users to create, 1–100 per batch. | |
| bypassEmailConfirmation | No | If true, created users skip email verification and are immediately usable. If false/omitted, each user receives a verification link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations are thin (only openWorldHint=true, idempotentHint=false), so the description carries the burden and meets it: it discloses the asynchronous HTTP 202 behavior, per-user conflict handling instead of whole-batch failure, the `{ jobId, statusUrl }` return shape, and the 401/403/422 error conditions. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, dense segments: behavior and batch size first, then response shape, then auth/errors/related tool. Every clause carries operational information with no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description itself supplies the return shape (`{ jobId, statusUrl }`), the async semantics, and the follow-up tracking tool. Combined with a fully-described input schema, nothing an agent needs to select and invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (usersList, timeoutMs, bypassEmailConfirmation) are already documented; the baseline is 3. The description adds little parameter-level value beyond tying 422 validation to `usersList` and noting per-user conflict reporting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific action ('Provision many Ethora users (1–100)') and a concrete resource, and immediately contrasts itself with the single-user sibling (`ethora-user-register`), so an agent can tell it apart from the large sibling list without opening the schema. The async-batch framing (HTTP 202) further pins down what this tool is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the near-sibling and the condition that selects between them: bulk (1–100) versus single-user registration. It also routes the follow-up step to `ethora-wait-users-batch-job-v2` and states the auth prerequisite (B2B mode via `ethora-auth-use-b2b` + `b2bToken`), so an agent knows exactly when and with what setup to call this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-users-batch-job-v2Get Users Batch JobARead-only
Fetch the current status and per-user results of a users batch job by jobId (one-shot, no polling). Returns the job object with its state (pending/running/completed/failed) and per-user outcomes.
Requires: a jobId returned by ethora-users-batch-create-v2.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken) — must match the auth used to create the job. Errors: 401/403 not in B2B mode; 404 unknown jobId. Related: ethora-wait-users-batch-job-v2 for a blocking wait.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Job id returned by `ethora-users-batch-create-v2`. | |
| timeoutMs | No | HTTP timeout for this status request, in milliseconds. Default 10000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral context: the one-shot non-polling nature, the required auth match, and the specific error codes. It also describes the return shape (job object with `state` and per-user outcomes), which is not disclosed by annotations and is critical for correct use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. It front-loads the main action, then packs prerequisites, auth, errors, and a related tool into a few sentences. No filler or repetition; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explains the return format (job object with state and per-user outcomes). It covers auth requirements, error scenarios, and the relationship to the create and wait tools. For a one-shot status fetch, all necessary information for correct invocation is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `jobId` and `timeoutMs` are already fully documented in the schema. The description reinforces that `jobId` must come from `ethora-users-batch-create-v2`, which is also in the schema's parameter description, so it adds no new semantic meaning. Baseline of 3 is appropriate because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch'), resource ('current status and per-user results of a users batch job'), and identifies the key input (`jobId`). It explicitly differentiates from the sibling `ethora-wait-users-batch-job-v2` by noting it is 'one-shot, no polling', making 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use context: requires a `jobId` from `ethora-users-batch-create-v2`, and contrasts with the blocking alternative `ethora-wait-users-batch-job-v2`. It also specifies auth requirements (B2B mode with matching token) and lists common error conditions (401/403, 404), giving the agent clear conditions for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-wait-broadcast-job-v2Wait for Broadcast JobARead-only
Block until a broadcast job reaches a terminal state (completed or failed) or until timeoutMs — read-only polling wrapper around ethora-chats-broadcast-job-v2. Returns { done, state, job }, or { done: false, reason: "timeout" } on timeout.
Requires: a jobId returned by ethora-chats-broadcast-job-v2.
Auth: app-token mode OR B2B mode with an explicit appId — must match the auth used to enqueue the job. Errors: 401/403 wrong auth; 404 unknown jobId.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | 24-char hex appId the job belongs to. Required in B2B mode unless already set via `ethora-app-select`; ignored in app-token mode. | |
| jobId | Yes | Job id returned by `ethora-chats-broadcast-v2`. | |
| timeoutMs | No | Maximum time to wait, in milliseconds. Default 60000. Caps at 300000 (5 min). | |
| intervalMs | No | Delay between status checks, in milliseconds. Default 1000. Lower = more responsive but more API calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral detail: the blocking behavior, the return shape ({ done, state, job } and timeout reason), error cases (401/403 wrong auth, 404 unknown jobId), and the requirement that auth match the enqueue step. These go beyond what annotations provide, giving the agent a full picture of side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, then covers return, auth, and errors in a compact format. It avoids fluff, but the density of information (auth modes, errors) makes it slightly dense; still, every sentence earns its place. It could be slightly more structured but remains effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only polling tool with no output schema, the description covers all essential context: the blocking condition, return format, timeout behavior, required prerequisites (jobId), auth constraints, and error responses. It also references the companion enqueue tool. An agent has everything needed to call it correctly without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter already has a clear description (e.g., jobId, appId, timeoutMs, intervalMs with defaults). The description adds minimal new semantics beyond the schema—only reiterating that jobId comes from the enqueue tool and that appId is for B2B mode. This meets the baseline of 3 for high schema coverage; the description does not significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Block until a broadcast job reaches a terminal state...' and specifies the resource (broadcast job). It also distinguishes itself as a polling wrapper around ethora-chats-broadcast-job-v2, making its role distinct from the enqueue tool and other wait tools. The verb 'Block' and the terminal state condition are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it requires a jobId from the enqueue tool and specifies auth requirements. It implies when to use it (after enqueuing a broadcast job) but does not explicitly state alternatives or exclusion cases (e.g., when not to use it or compare to ethora-wait-users-batch-job-v2). Still, the prerequisites and the wrapper relationship provide adequate guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-wait-users-batch-job-v2Wait for Users Batch JobARead-only
Block until a users batch job reaches a terminal state (completed or failed) or timeoutMs — read-only polling wrapper around ethora-users-batch-job-v2. Returns { done, state, job }, or { done: false, reason: "timeout" } on timeout.
Requires: a jobId returned by ethora-users-batch-create-v2.
Auth: B2B mode (ethora-auth-use-b2b + a configured b2bToken) — must match the auth used to create the job. Errors: 401/403 not in B2B mode; 404 unknown jobId.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Job id returned by `ethora-users-batch-create-v2`. | |
| timeoutMs | No | Maximum time to wait, in milliseconds. Default 60000. Caps at 300000 (5 min). | |
| intervalMs | No | Delay between status checks, in milliseconds. Default 1000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the readOnlyHint and destructiveHint annotations: blocking semantics, terminal states, timeout behavior, return shape, auth matching requirement, and error codes (401/403, 404). This is far more than what annotations alone provide, making the tool's behavior very transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: core behavior first, then return format, then requirements and errors. Each sentence carries useful information, though it is a bit long. It is front-loaded with the main purpose and does not waste words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polling wrapper with no output schema, the description covers the essential aspects: how it blocks, what it returns, prerequisites, auth, and errors. It does not explain the job states (completed/failed) in detail, but those are implied. It also doesn't mention intervalMs, but that's in the schema. Overall, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents jobId, timeoutMs, and intervalMs with defaults and ranges. The description repeats the jobId origin and timeout behavior but does not add new parameter semantics beyond what the schema states. Thus, it meets the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: 'Block until a users batch job reaches a terminal state' with specific resource (users batch job). It distinguishes itself as a read-only polling wrapper around ethora-users-batch-job-v2, and the return shape is explicit. This differentiates it from the underlying job tool and other wait tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides the prerequisite: a jobId from ethora-users-batch-create-v2, and the auth mode required. It implies this is the tool to use when you want to block until completion, but does not explicitly contrast with alternatives like directly calling ethora-users-batch-job-v2 or ethora-wait-broadcast-job-v2. Still, the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-wallet-get-balanceGet Wallet BalanceARead-only
Read the authenticated user's on-chain ERC-20 wallet balance(s). Auth: user-auth (log in first). Errors: 401 not logged in; 503 wallet RPC unreachable — retry with backoff.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false; the description adds a user-auth prerequisite and specific HTTP errors (401, 503) plus retry backoff guidance. This materially enhances the safe-call context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the action and resource, with auth and error behavior following. No filler or unnecessary repetition of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only call, the description covers what is read, the required login, failure modes, and retry policy. While there is no output schema, the call itself needs no further input context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is vacuous and baseline for this dimension is 4. The description appropriately reinforces a parameterless call by focusing on auth and error handling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description names the specific operation 'Read' and the exact resource 'authenticated user's on-chain ERC-20 wallet balance(s)', making the tool's function unambiguous. It also distinguishes itself from the unrelated sibling tools by stating the wallet-scoped subject.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the prerequisite auth: user-auth (log in first) and error conditions with retry advice. No explicit alternatives are named, but no sibling tool overlaps with wallet balance retrieval, so the practical use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ethora-widget-embed-snippetWidget Embed SnippetARead-onlyIdempotent
Generate the tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisites that must hold before it answers. No API call; pure generator using this deployment's hosted widget URL and public API base. The widget answers with the app's ACTIVE bot: for API-created apps run ethora-agents-create-v2 -> ethora-agent-invite-to-chat -> ethora-agents-activate-v2 { agentId, chatJid } first, otherwise POST /v2/widget/sessions returns 422 and the widget stays silent.
Requires: an activated agent on the app (ethora-agents-activate-v2); without it the widget opens but never answers.
Auth: none required (uses the selected app when appId is omitted). Errors: effectively none; when no hosted widget is configured the snippet carries a <WIDGET_URL> placeholder. Related: ethora-agents-activate-v2, ethora-bot-widget-v2 (legacy per-app bot only).
| Name | Required | Description | Default |
|---|---|---|---|
| appId | No | App the widget belongs to (24-char hex). Defaults to the app from `ethora-app-select`. | |
| botId | No | Legacy `data-bot-id` (bot XMPP address); only for old embeds. Prefer `appId`: the backend picks the active agent from the app. | |
| locale | No | UI locale (`data-locale`), e.g. `en`, `fr`, `es`. | |
| apiBase | No | Override the public API base (`data-api-base`). Defaults to this deployment's public API URL. | |
| botName | No | Display name shown in the widget header (`data-bot-name`), e.g. the agent's name. | |
| greeting | No | Greeting shown when the panel opens (`data-greeting-message`). | |
| position | No | Launcher corner (`data-position`). | |
| botAvatar | No | Avatar image URL shown for the bot (`data-bot-avatar`). | |
| widgetUrl | No | Override the widget bundle base URL (the script is `<widgetUrl>/assistant.js`). | |
| primaryColor | No | Brand colour for launcher and bubbles (`data-primary-color`), e.g. `#0052CC`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description adds independent value: 'Auth: none required', 'Errors: effectively none', the `<WIDGET_URL>` placeholder fallback, and the 422-on-sessions consequence of missing activation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, but the description is dense and somewhat redundant: the activation prerequisite is stated twice (the runbook chain and the 'Requires:' sentence). The 422 detail is valuable but adds length; every sentence mostly earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 fully documented optional parameters and no output schema, the description compensates by explaining the output shape (script tag, `<WIDGET_URL>` placeholder), auth, error behavior, and prerequisites. Slightly more detail on the generated snippet's structure would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema does the heavy lifting. The description adds some cross-parameter context (appId drives active-agent selection, botId is legacy), but no per-parameter details beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate the <script> tag that embeds the Ethora AI chat widget') and explicitly differentiates from the sibling `ethora-bot-widget-v2` (legacy per-app bot only). The 'No API call; pure generator' clarification removes any ambiguity about side effects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites ('Requires: an activated agent') for when the snippet is valid, names the exact activation runbook, and differentiates the legacy alternative `ethora-bot-widget-v2` by condition. An agent knows precisely when to use this tool and what must be true beforehand.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetch DocARead-onlyIdempotent
Fetch the full text of a documentation section or tool reference entry by the id returned from search (e.g. tool:ethora-app-create, doc:auth-map#app-jwt, doc:hosted-guide).
Auth: none required. Errors: unknown id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id from a `search` result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds two useful behavioral details: 'Auth: none required' and 'Errors: unknown id', which are not present in annotations. It also clarifies the return is 'full text'. This adds value beyond the structured metadata without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy. The first sentence front-loads the purpose and input source; the second adds auth and error details. Every clause earns its place. Ideal length for a simple fetch operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, no output schema, and comprehensive annotations, the description covers the essential operational details: what it does, how to get the id, auth requirements, and error behavior. The return content ('full text') is implied. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for the single 'id' parameter ('Document id from a search result'), so the baseline is 3. The description adds concrete examples of id formats ('tool:ethora-app-create', 'doc:auth-map#app-jwt', 'doc:hosted-guide') and explicitly states the id comes from 'search', reinforcing the schema. This extra context justifies a score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a specific resource ('the full text of a documentation section or tool reference entry'), and the source of the identifier ('by the id returned from search'). It clearly differentiates from sibling tools like 'search' by specifying it retrieves content by id, not listing/searching. Examples of id formats further clarify the scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly ties usage to the output of 'search' ('by the id returned from search'), giving clear context on when to call this tool. It doesn't explicitly state alternatives or when not to use it, but the sibling relationship with 'search' and the clear input contract make usage straightforward. It could have been more explicit about the search→fetch workflow, but the guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch DocsARead-onlyIdempotent
Search the Ethora documentation and tool reference: auth model (app JWT vs app token vs B2B token vs API keys), hosted-server getting started, chat-component and backend SDK quickstarts, recipes, and a reference entry for every tool with its inputs. Use it for any "how do I ..." question about Ethora before guessing; then call fetch with a result id to read the full text.
Auth: none required.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-text query, e.g. 'create an app', 'invite agent to chat', 'api key bearer header'. Empty returns the getting-started guides. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safe read-only nature is covered. The description adds useful behavioral context by noting 'Auth: none required' and implying the tool returns result IDs that can be passed to `fetch`. It does not disclose result limits or exact return shape, but it adds value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and scope, then gives concrete guidance, follow-up instruction, and auth info in a compact form. Every sentence earns its place and there is no redundant repetition of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter search tool with safety annotations already provided, the description is complete: it states what is searched, when to use it, the auth requirement, and the follow-up path to read full text via `fetch`. The absence of an output schema is mitigated by the clear 'result id' handoff instruction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the query parameter with examples and empty-query behavior. The tool description adds usage-level guidance rather than parameter-level semantics, so a baseline 3 is appropriate; the schema is doing the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description has a specific verb and resource: 'Search the Ethora documentation and tool reference', then enumerates covered topics and even points to the sibling `fetch` tool for follow-up reading. This clearly distinguishes it from the many action-oriented sibling tools and the complementary `fetch` tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use this tool: for any 'how do I ...' question about Ethora before guessing. It also names the follow-up action (`fetch` with a result id), giving clear operational context beyond simple tool selection.
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.
88 tool updates
v26.9.3- Added
ethora-agent-invite-to-chat - Added
ethora-agent-set-visibility - Added
ethora-agent-soul-append - Added
ethora-agent-soul-set - Added
ethora-agents-activate-v2 - Added
ethora-agents-clone-v2 - Added
ethora-agents-create-v2 - Added
ethora-agents-export-v2 - Added
ethora-agents-get-v2 - Added
ethora-agents-import-v2 - Added
ethora-agents-list-v2 - Added
ethora-agents-update-v2 - Added
ethora-api-key-create - Added
ethora-api-key-list - Added
ethora-api-key-revoke - Changed
ethora-app-create1 field changed- changed
Input schema / properties / displayName / descriptionPrevious value: -"display name for app"New value: +"Human-readable app name shown to users in the app picker and on the public landing page. Not required to be unique across accounts."
- Changed
ethora-app-create-chat5 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"appId for app"New value: +"24-char hex ObjectId of the app to create the chat room in. Optional — defaults to the app most recently passed to `ethora-app-select`." - added
Input schema / properties / pinned / defaultAdded value: +false - changed
Input schema / properties / pinned / descriptionPrevious value: -"pinned for chat"New value: +"If `true`, the room is added to the app's default rooms list — every new user of the app auto-joins it. If `false`, the room exists but users must be added explicitly." - changed
Input schema / properties / title / descriptionPrevious value: -"title for chat"New value: +"Display name for the new chat room. Visible to all members; not required to be unique within the app." - changed
Input schema / requiredPrevious value: -[ - "appId", - "title", - "pinned" -]New value: +[ + "title" +]
- Added
ethora-app-credentials - Removed
ethora-app-delete - Changed
ethora-app-delete-chat3 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"appId for app"New value: +"24-char hex ObjectId of the app the chat room belongs to. Optional — defaults to the app most recently passed to `ethora-app-select`." - changed
Input schema / properties / chatJid / descriptionPrevious value: -"title for chat"New value: +"Room JID (XMPP address) of the chat to delete, e.g. `<roomId>@conference.<host>`. Obtain from `ethora-app-get-default-rooms` or the response of `ethora-app-create-chat`." - changed
Input schema / requiredPrevious value: -[ - "appId", - "chatJid" -]New value: +[ + "chatJid" +]
- Added
ethora-app-export-v2 - Changed
ethora-app-get-default-rooms-with-app-id2 fields changed- changed
Input schema / properties / appId / descriptionPrevious value: -"appId for app"New value: +"24-char hex ObjectId of the app whose default rooms you want to read. Optional — defaults to the app most recently passed to `ethora-app-select`." - removed
Input schema / requiredRemoved value: -[ - "appId" -]
- Added
ethora-app-import-v2 - Added
ethora-app-select - Added
ethora-app-tokens-create-v2 - Added
ethora-app-tokens-list-v2 - Added
ethora-app-tokens-revoke-v2 - Added
ethora-app-tokens-rotate-v2 - Changed
ethora-app-update8 fields changed- changed
Input schema / properties / appDescription / descriptionPrevious value: -"Set the application description"New value: +"Deprecated alias for `appTagline`, kept so older callers keep working. Prefer `appTagline`." - changed
Input schema / properties / appId / descriptionPrevious value: -"appId for app"New value: +"24-char hex ObjectId of the app to update. Optional — defaults to the app most recently passed to `ethora-app-select`." - added
Input schema / properties / appTaglineAdded value: +{ + "description": "Short tagline shown on the public app landing page.", + "type": "string" +} - changed
Input schema / properties / botStatus / descriptionPrevious value: -"Set the bot status to on or off, if on bot is enabled"New value: +"`on` enables the AI bot for new conversations (requires a configured prompt — see `ethora-bot-update-v2`); `off` disables it. Does not change the bot's configured prompt or sources." - changed
Input schema / properties / displayName / descriptionPrevious value: -"displayName of the application"New value: +"New human-readable app name. Visible in the app picker and on the public landing page." - changed
Input schema / properties / domainName / descriptionPrevious value: -"If the domainName is set to 'abcd', your web application will be available at abcd.ethora.com."New value: +"Subdomain to host the web app at. Setting `abcd` makes the web app available at `abcd.ethora.com`. Must be unique across all Ethora apps; lower-case alphanumerics and dashes only." - changed
Input schema / properties / primaryColor / descriptionPrevious value: -"Set thie color of the application in #F54927 format"New value: +"Primary brand color in hex `#RRGGBB` format (e.g. `#F54927`). Used throughout the app UI." - removed
Input schema / requiredRemoved value: -[ - "appId", - "botStatus" -]
- Added
ethora-auth-use-app - Added
ethora-auth-use-b2b - Added
ethora-auth-use-user - Added
ethora-b2b-app-bootstrap-ai - Added
ethora-b2b-app-create - Added
ethora-b2b-app-provision - Added
ethora-b2b-bot-enable - Added
ethora-bot-disable-v2 - Added
ethora-bot-enable-v2 - Added
ethora-bot-get-v2 - Added
ethora-bot-instance-diag - Added
ethora-bot-instance-leave-chat - Added
ethora-bot-instance-status - Added
ethora-bot-instance-test-message - Added
ethora-bot-instances-list - Added
ethora-bot-update-v2 - Added
ethora-bot-widget-v2 - Added
ethora-chats-broadcast-job-v2 - Added
ethora-chats-broadcast-v2 - Added
ethora-chats-history-v2 - Added
ethora-chats-message-v2 - Added
ethora-configure - Added
ethora-doctor - Added
ethora-feedback-submit - Added
ethora-files-delete-v2 - Added
ethora-files-get-v2 - Added
ethora-files-upload-v2 - Added
ethora-generate-b2b-bootstrap-runbook - Added
ethora-generate-chat-component-app-tsx - Added
ethora-generate-env-examples - Added
ethora-help - Added
ethora-messages-context-v2 - Added
ethora-messages-search-v2 - Added
ethora-run-recipe - Added
ethora-sources-docs-delete - Added
ethora-sources-docs-delete-v2 - Added
ethora-sources-docs-list-v2 - Added
ethora-sources-docs-tags-update-v2 - Added
ethora-sources-docs-upload - Added
ethora-sources-docs-upload-v2 - Added
ethora-sources-site-crawl-v2 - Added
ethora-sources-site-crawl-v2-wait - Added
ethora-sources-site-delete-url-v2 - Added
ethora-sources-site-list-v2 - Added
ethora-sources-site-reindex-v2 - Added
ethora-sources-site-reindex-v2-wait - Added
ethora-sources-site-tags-update-v2 - Added
ethora-status - Added
ethora-unread-counts-v2 - Changed
ethora-user-login5 fields changed- added
Input schema / properties / apiKeyNameAdded value: +{ + "description": "Label for the API key when `createApiKey` is true (e.g. `claude-code-laptop`).", + "type": "string" +} - added
Input schema / properties / apiKeyTtlDaysAdded value: +{ + "description": "Lifetime of the API key in days when `createApiKey` is true. Server default applies when omitted.", + "maximum": 365, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / createApiKeyAdded value: +{ + "description": "When true, also mint a long-lived API key for this user and return it once, so headless clients / agents can reconnect with `Authorization: Bearer <key>` instead of logging in again. Default false.", + "type": "boolean" +} - changed
Input schema / properties / email / descriptionPrevious value: -"email for login"New value: +"User's registered email address (RFC 5322). Must match an account created via `ethora-user-register`." - changed
Input schema / properties / password / descriptionPrevious value: -"password for login"New value: +"Plain-text password the user set during registration. Sent over TLS to the Ethora API; never echoed back or logged."
- Changed
ethora-user-register7 fields changed- added
Input schema / properties / apiKeyNameAdded value: +{ + "description": "Label for the API key (default `mcp-signup`).", + "type": "string" +} - added
Input schema / properties / apiKeyTtlDaysAdded value: +{ + "description": "API key lifetime in days. Server default applies when omitted.", + "maximum": 365, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / createApiKeyAdded value: +{ + "description": "Mint a long-lived API key right after signup and return it once. Default true. Set false if you only need this session.", + "type": "boolean" +} - added
Input schema / properties / email / descriptionAdded value: +"Email address for the new user. Must be RFC-5322 valid and not already registered within this app. No confirmation click is required to log in; the address is used for password reset." - added
Input schema / properties / firstName / descriptionAdded value: +"First name shown in the user's profile and message attributions across chat rooms and the app UI." - added
Input schema / properties / lastName / descriptionAdded value: +"Last name shown in the user's profile." - added
Input schema / properties / passwordAdded value: +{ + "description": "Password for the account (min 6 chars). Omit to have a strong random password generated and returned once in the result.", + "minLength": 6, + "type": "string" +}
- Added
ethora-users-batch-create-v2 - Added
ethora-users-batch-job-v2 - Added
ethora-wait-broadcast-job-v2 - Added
ethora-wait-users-batch-job-v2 - Removed
ethora-wallet-erc20-transfer - Added
ethora-widget-embed-snippet - Added
fetch - Added
search
12 tool updates
v1.0.0- First observed
ethora-app-create - First observed
ethora-app-create-chat - First observed
ethora-app-delete - First observed
ethora-app-delete-chat - First observed
ethora-app-get-default-rooms - First observed
ethora-app-get-default-rooms-with-app-id - First observed
ethora-app-list - First observed
ethora-app-update - First observed
ethora-user-login - First observed
ethora-user-register - First observed
ethora-wallet-erc20-transfer - First observed
ethora-wallet-get-balance
TDQS
Scored across 89 tools
The tool descriptions are detailed, but the set is full of near-duplicate variants distinguished only by auth mode, legacy vs v2, or async vs wait behavior (e.g. ethora-sources-docs-upload vs ethora-sources-docs-upload-v2, ethora-sources-site-crawl-v2 vs ethora-sources-site-crawl-v2-wait, legacy bot tools vs agents tools). An agent would frequently struggle to pick the right variant, especially under time pressure.
Names are readable and consistently ethora-prefixed, but conventions are mixed: noun-verb and verb-noun orders both appear, singular/plural varies (user vs users, agent vs agents), and wait/v2 suffixes are placed inconsistently (ethora-wait-broadcast-job-v2 vs ethora-sources-site-crawl-v2-wait). The pattern is recognizable, but far from uniform.
With 89 tools, this far exceeds the 50+ extreme threshold in the calibration guide. Many tools are variants or wrappers of the same underlying operation, which inflates the surface and creates major selection overhead for agents.
The server covers a broad set of domains—apps, chats, messages, RAG sources, agents, files, users, tokens, and wallets—but lifecycle coverage is uneven. Apps and agents lack delete operations, users only have register/batch-create/login, and wallet support is a single balance-read, leaving notable gaps for full CRUD workflows.
Maintenance
Related MCP Connectors
Register, deploy, review, and govern internal applications built with coding agents.
Manage brainCloud apps, cloud code, hooks and servers; API lookups to help generate client code.
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
- OneOAuthai.withone
Search, document and execute authenticated API calls across 700+ apps via one MCP server
Related MCP Servers
- FlicenseAqualityFmaintenanceEnables interaction with Coolify applications and resources through the Coolify API via a standardized interface, supporting application management operations such as listing, starting, stopping, restarting, and deploying.1113-
- FlicenseAqualityCmaintenanceEnables interaction with any REST API through token or login authentication, with automatic Swagger/OpenAPI documentation integration for endpoint discovery and comprehensive HTTP request support.7-

Hellō Admin MCP Serverofficial
AlicenseAqualityDmaintenanceEnables AI assistants to create and manage Hellō applications with full developer context, supporting app creation, updates, secret generation, and logo management through a single unified tool.133 npm4MIT- AlicenseAqualityDmaintenanceEnables managing electronic signatures and contracts through the eSignatures API, including creating, sending, and withdrawing contracts, as well as managing templates and collaborators.13MIT