protogrid

Search / io.github.dappros/ethora-mcp-server

ethora-mcp-server

R0· no sign-in

Ethora chat platform MCP: apps, users, rooms, AI agents, chat widgets. Hosted or stdio.

v26.10.1 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality71needs work
Trust97of 100
Uptime, 30 days100%
Latency p50226 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "ethora-mcp-server": {
      "type": "http",
      "url": "https://mcp.chat.ethora.com/mcp"
    }
  }
}
claude mcp add --transport http ethora-mcp-server https://mcp.chat.ethora.com/mcp
[mcp_servers.ethora-mcp-server]
url = "https://mcp.chat.ethora.com/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ethora-mcp-server": {
      "type": "remote",
      "url": "https://mcp.chat.ethora.com/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "ethora-mcp-server": {
      "type": "http",
      "url": "https://mcp.chat.ethora.com/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=ethora-mcp-server&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vbWNwLmNoYXQuZXRob3JhLmNvbS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "ethora-mcp-server": {
      "type": "http",
      "url": "https://mcp.chat.ethora.com/mcp"
    }
  }
}
{
  "mcpServers": {
    "ethora-mcp-server": {
      "httpUrl": "https://mcp.chat.ethora.com/mcp"
    }
  }
}
extensions:
  "ethora-mcp-server":
    enabled: true
    name: "ethora-mcp-server"
    type: streamable_http
    uri: "https://mcp.chat.ethora.com/mcp"
    timeout: 300

Quality 71 / 100needs work

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorization83 · weight 15
  • pass
    auth.prmProtected Resource Metadata (RFC 9728) published
  • pass
    auth.as_metadataauthorization server metadata reachable
  • warn
    auth.cimdonly Dynamic Client Registration, deprecated in 2026-07-28 in favour of CIMD
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene86 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length2 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations24 of 24 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • warn
    tools.token_costabout 10,977 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability25 · weight 15
  • warn
    stability.changes119 tool changes in 30 days
  • fail
    stability.rug_pull1 tools kept their name but changed most of their description in 30 days; review before trusting them
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvabledeps.dev does not know @ethora/[email protected]

24 tools, about 10,977 tokens to load them all · tool set 185475c71856 · tools last changed 2026-10-16 · checked 2026-10-19 10:20 UTC

Tool changes

  • ethora-chat-historychangedannotations
  • ethora-agent-listchangedannotations
  • ethora-app-listchangedannotations
  • ethora-widget-snippet-getchangedannotations
  • ethora-source-site-crawl-waitchangedannotations
  • ethora-helpchangedannotations
  • ethora-statuschangedannotations
  • ethora-agent-createchangedinput schema
  • ethora-tools-enablechangeddescription, input schema
    before

    Session-only: changes which tools this connection lists. Touches no account data. Only the core tools are listed by default. Call this to enable another group for this session; the tool list refreshes automatically (tools/list_changed). On the hosted server the enabled groups are remembered for the signed-in account, so a client that opens a new session per call keeps them. Without `group` it returns the catalogue: each group's summary, tool count and whether it is enabled. Groups: keys, session, apps-admin, rooms, agents-admin, sources, users-files, legacy-bot, b2b, wallet; `all` enables everything. Hidden tools are still described by `search` / `fetch`, and each doc names its group. Auth: none. Errors: UNKNOWN_GROUP for a name outside the list.

    after · 99% of words in common

    Session-only: changes which tools this connection lists. Touches no account data. Only the core tools are listed by default. Call this to enable another group for this session; the tool list refreshes automatically (tools/list_changed). On the hosted server the enabled groups are remembered for the signed-in account, so a client that opens a new session per call keeps them. Without `group` it returns the catalogue: each group's summary, tool count and whether it is enabled. Groups: keys, session, apps-admin, rooms, agents-admin, sources, widget, users-files, legacy-bot, b2b, wallet; `all` enables everything. Hidden tools are still described by `search` / `fetch`, and each doc names its group. Auth: none. Errors: UNKNOWN_GROUP for a name outside the list.

  • ethora-agent-updatechangeddescription, input schema
    before

    Overwrites the fields you pass; previous values are not kept and cannot be restored from the API, so confirm changes to the prompt, name or settings with the user first. 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-agent-list` or `ethora-agent-create`.

    after · 84% of words in common

    Overwrites the fields you pass; previous values are not kept and cannot be restored from the API, so confirm changes to the prompt, name or settings with the user first. 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-agent-list` or `ethora-agent-create`. Only the agent's owner can update it: a public agent from someone else, including the platform's Support Agent, answers 403, so `ethora-agent-clone` it and update the copy.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 97 / 100

provenance90
liveness100
freshness100
hygiene100

+repository +namespace-matches-repo +website +reachable +uptime-100% +updated-3d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

@ethora/[email protected] npmthis version is not known to the dependency resolver

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://mcp.chat.ethora.com/mcp/oauth streamable-httpoauth2 AS: https://api.chat.ethora.comyes100%226 ms–2026-10-19
https://mcp.chat.ethora.com/mcp streamable-httpnoneyes100%218 ms2025-06-182026-10-19
packageregistryversionruntimesecrets
@ethora/mcp-servernpm26.10.1–ETHORA_APP_JWT, ETHORA_B2B_TOKEN

Tools (24)

ethora-agent-activateMake 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` (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-agent-create` -> `ethora-chat-create` -> `ethora-agent-invite`); 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-snippet-get` next, `ethora-bot-instance-list` to inspect.
ethora-agent-createCreate 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` them into the same room. See the `ethora-agents-quickstart` prompt for the end-to-end recipe. To start from a ready-made public agent instead, `ethora-agent-list { visibility: "public" }` then `ethora-agent-clone`. Requires: a selected app (`ethora-app-select`) or an explicit `appId`. The agent belongs to your account (only you can change it) and is homed in that app; it can still be used in your other apps.
ethora-agent-inviteInvite 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-agent-create`) and a room (`ethora-chat-create`) in the selected app.
ethora-agent-listread-onlyList AI agents (`GET /v2/agents`): by default your own agents plus the public ones. Pass `appId` to list only the agents homed in that app (`GET /v2/apps/:appId/agents`, which needs you to manage the app; B2B tokens always use this form). Agents belong to your account, not to one app, so the same agent can answer in several of your apps. Public agents (e.g. the platform's Support Agent, sample personas) can be tried with `ethora-agent-try` and copied with `ethora-agent-clone`, not edited. Returns agents with ids, names, owner, visibility, categories and config. Auth: user session or B2B token. Errors: 401/403 wrong auth; empty list when nothing matches.
ethora-agent-updatedestructiveOverwrites the fields you pass; previous values are not kept and cannot be restored from the API, so confirm changes to the prompt, name or settings with the user first. 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-agent-list` or `ethora-agent-create`. Only the agent's owner can update it: a public agent from someone else, including the platform's Support Agent, answers 403, so `ethora-agent-clone` it and update the copy.
ethora-api-key-createMint 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.
ethora-app-createCreate 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-reveal { 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`.
ethora-app-listread-onlyList 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-reveal { 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`.
ethora-app-selectread-onlySession-only: remembers which app later calls refer to. Changes nothing on the server and can be called again at any time to switch. Set the current app context for this session so app-scoped tools can omit their `appId` argument. On the hosted server the selection is remembered for the signed-in account (24 hours), so a client that opens a new session per call keeps it; `ethora-app-create` selects the new app by itself, and an account with exactly one app has it selected automatically. 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-mode-set`.
ethora-app-updatedestructiveOverwrites the fields you pass; previous values are not kept and cannot be restored from the API, so confirm changes to the prompt, name or settings with the user first. 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`).
ethora-chat-createCreate 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`.
ethora-chat-historyread-onlyRead 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-chat-create`). 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.
ethora-feedback-submitSend 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.
ethora-helpread-onlyTask-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-recipe-run`.
ethora-message-sendPost 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`, 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-chat-create` returns as `jid`) or by the bare `chatId` plus the selected app. Requires: a room in the selected app (`ethora-chat-create`); for `replies`, an agent invited into it (`ethora-agent-invite`). 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.
ethora-source-doc-uploadUpload documents (1–5; PDF, text, etc.) into an agent's knowledge base (the one named by `agentId`, else the app's default agent) (app-token / B2B variant of `ethora-source-doc-upload-legacy`). 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-source-doc-list`, `ethora-source-doc-delete`.
ethora-source-site-crawl-waitdestructiveAdds the crawled pages to an agent's knowledge base (the one named by `agentId`, else the app's default agent); existing documents are kept and nothing is deleted. A URL that is already indexed is refused with 409 unless `force: true` re-crawls it. 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 (403 `AGENT_NOT_WRITABLE` when `agentId` is someone else's agent); 400 malformed `url`; 409 already indexed; 504/timeout if it takes longer than `timeoutMs` (the job may still complete server-side - check with `ethora-source-site-list`, or stop it with `ethora-source-site-crawl-cancel`). Related: `ethora-agent-knowledge-get` shows what the agent can search afterwards.
ethora-statusread-onlyReport 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.
ethora-tools-enableread-onlySession-only: changes which tools this connection lists. Touches no account data. Only the core tools are listed by default. Call this to enable another group for this session; the tool list refreshes automatically (tools/list_changed). On the hosted server the enabled groups are remembered for the signed-in account, so a client that opens a new session per call keeps them. Without `group` it returns the catalogue: each group's summary, tool count and whether it is enabled. Groups: keys, session, apps-admin, rooms, agents-admin, sources, widget, users-files, legacy-bot, b2b, wallet; `all` enables everything. Hidden tools are still described by `search` / `fetch`, and each doc names its group. Auth: none. Errors: UNKNOWN_GROUP for a name outside the list.
ethora-user-loginAuthenticate 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-mode-set` first) and a configured `appJwt`. Errors: 401/403 bad credentials; 404 email not registered; 429 per-IP rate limit — retry with backoff.
ethora-user-registerCreate 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-user-batch-create`.
ethora-widget-snippet-getread-onlyGenerate the <script> 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-agent-create` -> `ethora-agent-invite` -> `ethora-agent-activate { agentId, chatJid }` first, otherwise `POST /v2/widget/sessions` returns 422 and the widget stays silent. Requires: an activated agent on the app (`ethora-agent-activate`); 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. The widget's look (colours, texts, launcher) is saved on the app with `ethora-widget-appearance-set` and loads on every embed by itself, so the snippet only needs `data-app-id`; the cosmetic parameters here write attributes into the tag, which then win over the saved look on that site. Related: `ethora-agent-activate`, `ethora-widget-appearance-set`, `ethora-bot-widget-get` (legacy per-app bot only).
fetchread-onlyFetch 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.
searchread-onlySearch 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.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "io.github.dappros/ethora-mcp-server",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://mcp.chat.ethora.com/mcp/oauth",
      "type": "streamable-http"
    },
    {
      "url": "https://mcp.chat.ethora.com/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "26.10.1",
  "packages": [
    {
      "version": "26.10.1",
      "transport": {
        "type": "stdio"
      },
      "identifier": "@ethora/mcp-server",
      "registryType": "npm",
      "environmentVariables": [
        {
          "name": "ETHORA_API_URL",
          "format": "string",
          "description": "Full Ethora API URL. Defaults to https://api.chat.ethora.com/v1 if neither ETHORA_API_URL nor ETHORA_BASE_URL is set."
        },
        {
          "name": "ETHORA_BASE_URL",
          "format": "string",
          "description": "Base host URL (e.g. https://api.chat.ethora.com). The server appends /v1 automatically. Use ETHORA_API_URL instead if you need a non-/v1 path."
        },
        {
          "name": "ETHORA_APP_JWT",
          "format": "string",
          "isSecret": true,
          "description": "App JWT used for the user-auth bootstrap flow (login/register). Usually starts with 'JWT '. Optional; can also be set at runtime via the ethora-configure tool."
        },
        {
          "name": "ETHORA_B2B_TOKEN",
          "format": "string",
          "isSecret": true,
          "description": "B2B server token used for tenant-actor x-custom-token auth (JWT with type=server). Required for B2B / app provisioning flows. Optional; can also be set at runtime."
        },
        {
          "name": "ETHORA_MCP_ENABLE_DANGEROUS_TOOLS",
          "format": "string",
          "description": "Set to 'true' to expose destructive tools (app deletion, wallet transfers, bulk delete). Disabled by default."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/dappros/ethora-mcp-server",
    "source": "github"
  },
  "websiteUrl": "https://ethora.com/ai-sdk/mcp-server/",
  "description": "Ethora chat platform MCP: apps, users, rooms, AI agents, chat widgets. Hosted or stdio."
}