{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_k97zjrjbf36x","handle":"ethora-mcp-cli","url":"https://wellknown.network/agents/ethora-mcp-cli","links":{"self":"https://wellknown.network/agents/ethora-mcp-cli/record.json","html":"https://wellknown.network/agents/ethora-mcp-cli","markdown":"https://wellknown.network/agents/ethora-mcp-cli/record.md","api":"https://wellknown.network/api/v1/agents/ethora-mcp-cli","status":"https://wellknown.network/api/v1/agents/ethora-mcp-cli/status","claim":"https://wellknown.network/agents/ethora-mcp-cli/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/ethora-mcp-cli/claim.json","badge":"https://wellknown.network/agents/ethora-mcp-cli/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/ethora-mcp-cli/history","tools":"https://wellknown.network/api/v1/agents/ethora-mcp-cli/tools"},"ard":{"identifier":"urn:air:mcp.chat.ethora.com:server:ethora-mcp-cli","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"ethora-mcp-cli","summary":"MCP server for the Ethora chat & messaging platform: chat ops, AI agents, RAG, automation.","description":"MCP server for the Ethora chat & messaging platform: chat ops, AI agents, RAG, automation.","publisher":{"name":"dappros","url":null},"homepage":"https://github.com/dappros/ethora-mcp-server#readme","repository":"https://github.com/dappros/ethora-mcp-cli","version":"26.5.2","license":"MIT","protocols":["mcp"],"tags":["mcp","mcp-server","model-context-protocol","remote-mcp","streamable-http","ethora","ethora-mcp","chat","messaging","chat-api","chatbot","ai-agents","ai-assistant","llm-tools","tool-calling","rag","customer-support","chat-widget","oauth2","claude","chatgpt","cursor","typescript"],"pricing":{"model":"freemium","currency":"USD"},"endpoints":[{"url":"https://mcp.chat.ethora.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true},{"url":"https://mcp.chat.ethora.com/mcp/oauth","type":"mcp_streamable_http","auth":null,"probeable":true},{"url":"npm:@ethora/mcp-server","type":"package_npm","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-05-14T11:30:26.063385Z","npmKeywords":["mcp","mcp-server","model-context-protocol","remote-mcp","streamable-http","ethora","ethora-mcp","chat","messaging","chat-api","chatbot","ai-agents","ai-assistant","llm-tools","tool-calling","rag","customer-support","chat-widget","oauth2","claude","chatgpt","cursor","typescript"],"publishedAt":"2026-05-14T11:30:26.063385Z","registryName":"io.github.dappros/ethora-mcp-cli","editedByOwnerAt":"2026-09-18T20:39:57.062Z"},"attribution":{"kind":"claim","name":"claim","license":"npm","pricing":"claim","repoUrl":"mcp_registry","summary":"claim","version":"mcp_registry","description":"claim","homepageUrl":"claim","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"content.translation","name":"Translation","confidence":1,"provenance":"claimed"},{"slug":"communication.notifications","name":"Notifications","confidence":1,"provenance":"claimed"},{"slug":"knowledge.memory","name":"Agent Memory","confidence":1,"provenance":"claimed"},{"slug":"infra.cloud","name":"Cloud Platforms","confidence":1,"provenance":"claimed"},{"slug":"automation.orchestration","name":"Agent Orchestration","confidence":1,"provenance":"claimed"},{"slug":"ai.model-access","name":"Model Access","confidence":1,"provenance":"claimed"},{"slug":"ai.agent-discovery","name":"Agent Discovery","confidence":1,"provenance":"claimed"},{"slug":"data.vector-search","name":"Vector Search","confidence":1,"provenance":"declared"},{"slug":"security.identity","name":"Identity & Access","confidence":1,"provenance":"derived"},{"slug":"communication.chat","name":"Team Chat","confidence":1,"provenance":"claimed"},{"slug":"ai.prompting","name":"Prompt Management","confidence":1,"provenance":"claimed"},{"slug":"communication.customer-support","name":"Customer Support","confidence":1,"provenance":"claimed"},{"slug":"code.documentation","name":"Code Documentation","confidence":0.583,"provenance":"derived"},{"slug":"security.secrets","name":"Secrets Management","confidence":0.569,"provenance":"derived"},{"slug":"dev.docs-lookup","name":"Documentation Lookup","confidence":0.54,"provenance":"derived"}],"categories":["code","communication","data","dev","security"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 24m ago.","lastOkAt":"2026-09-27T03:20:10.470Z","lastProbedAt":"2026-09-27T03:20:10.470Z","statusComputedAt":"2026-09-27T03:22:04.049Z","reliability30d":{"probes":392,"successRate":1,"p50Ms":103,"basis":"mixed","measures":{"availability":"availability (some checks stopped at authentication)","latency":"response time (mixed)","tools":"partially observed","summary":"Some successful checks reached the service and some stopped at an authentication response; figures combine both."},"checks":{"total":392,"ok":392,"authBoundaryOk":196,"serviceOk":196,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-09-27T03:20:10.470Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":126,"error":null,"detail":{"tools":[{"name":"ethora-status","description":"Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like `hasAppJwt` — values never echoe"},{"name":"ethora-help","description":"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 c"},{"name":"ethora-app-select","description":"Set the current app context for this session so app-scoped tools can omit their `appId` argument. Stores `currentAppId` and, if given, `appToken` (which default"},{"name":"ethora-source-site-crawl-wait","description":"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, "},{"name":"ethora-source-doc-upload","description":"Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of `ethora-source-doc-upload-legacy`). Async — content becomes querya"},{"name":"ethora-user-login","description":"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`,"},{"name":"ethora-user-register","description":"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 defaul"},{"name":"ethora-api-key-create","description":"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 endpo"},{"name":"ethora-feedback-submit","description":"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 badl"},{"name":"ethora-widget-snippet-get","description":"Generate the <script> tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisite"},{"name":"ethora-app-list","description":"List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with `appId` (24-char hex), `displayName`, `domainName`, ownership and bo"},{"name":"ethora-app-create","description":"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 o"},{"name":"ethora-app-update","description":"Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchang"},{"name":"ethora-chat-create","description":"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` addit"},{"name":"ethora-agent-list","description":"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 definitio"},{"name":"ethora-agent-create","description":"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 ba"},{"name":"ethora-agent-update","description":"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 r"},{"name":"ethora-agent-activate","description":"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 an"},{"name":"ethora-agent-invite","description":"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 conve"},{"name":"ethora-message-send","description":"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 (ov"},{"name":"ethora-chat-history","description":"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) pl"},{"name":"ethora-tools-enable","description":"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). Witho"},{"name":"search","description":"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 an"},{"name":"fetch","description":"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`, "}],"toolCount":24,"toolsHash":"a8c8106f8c0f416eaa32ea7ac2e2adb0f01ab38d063e31c4e21e04c60adb92ce","serverName":"Ethora MCP Server","capabilities":["tools","resources","completions","prompts"],"serverVersion":"26.9.5","protocolVersion":"2025-06-18"}},{"at":"2026-09-27T03:20:10.021Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":109,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer realm=\"ethora\", resource_metadata=\"https://mcp.chat.ethora.com/.well-known/oauth-protected-resource/mcp/oauth\""}},{"at":"2026-09-27T02:20:35.971Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":101,"error":null,"detail":{"tools":[{"name":"ethora-status","description":"Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like `hasAppJwt` — values never echoe"},{"name":"ethora-help","description":"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 c"},{"name":"ethora-app-select","description":"Set the current app context for this session so app-scoped tools can omit their `appId` argument. Stores `currentAppId` and, if given, `appToken` (which default"},{"name":"ethora-source-site-crawl-wait","description":"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, "},{"name":"ethora-source-doc-upload","description":"Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of `ethora-source-doc-upload-legacy`). Async — content becomes querya"},{"name":"ethora-user-login","description":"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`,"},{"name":"ethora-user-register","description":"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 defaul"},{"name":"ethora-api-key-create","description":"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 endpo"},{"name":"ethora-feedback-submit","description":"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 badl"},{"name":"ethora-widget-snippet-get","description":"Generate the <script> tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisite"},{"name":"ethora-app-list","description":"List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with `appId` (24-char hex), `displayName`, `domainName`, ownership and bo"},{"name":"ethora-app-create","description":"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 o"},{"name":"ethora-app-update","description":"Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchang"},{"name":"ethora-chat-create","description":"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` addit"},{"name":"ethora-agent-list","description":"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 definitio"},{"name":"ethora-agent-create","description":"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 ba"},{"name":"ethora-agent-update","description":"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 r"},{"name":"ethora-agent-activate","description":"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 an"},{"name":"ethora-agent-invite","description":"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 conve"},{"name":"ethora-message-send","description":"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 (ov"},{"name":"ethora-chat-history","description":"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) pl"},{"name":"ethora-tools-enable","description":"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). Witho"},{"name":"search","description":"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 an"},{"name":"fetch","description":"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`, "}],"toolCount":24,"toolsHash":"a8c8106f8c0f416eaa32ea7ac2e2adb0f01ab38d063e31c4e21e04c60adb92ce","serverName":"Ethora MCP Server","capabilities":["tools","resources","completions","prompts"],"serverVersion":"26.9.5","protocolVersion":"2025-06-18"}},{"at":"2026-09-27T02:20:35.574Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":97,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer realm=\"ethora\", resource_metadata=\"https://mcp.chat.ethora.com/.well-known/oauth-protected-resource/mcp/oauth\""}},{"at":"2026-09-27T01:24:01.309Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":98,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer realm=\"ethora\", resource_metadata=\"https://mcp.chat.ethora.com/.well-known/oauth-protected-resource/mcp/oauth\""}},{"at":"2026-09-27T01:23:59.037Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":110,"error":null,"detail":{"tools":[{"name":"ethora-status","description":"Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like `hasAppJwt` — values never echoe"},{"name":"ethora-help","description":"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 c"},{"name":"ethora-app-select","description":"Set the current app context for this session so app-scoped tools can omit their `appId` argument. Stores `currentAppId` and, if given, `appToken` (which default"},{"name":"ethora-source-site-crawl-wait","description":"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, "},{"name":"ethora-source-doc-upload","description":"Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of `ethora-source-doc-upload-legacy`). Async — content becomes querya"},{"name":"ethora-user-login","description":"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`,"},{"name":"ethora-user-register","description":"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 defaul"},{"name":"ethora-api-key-create","description":"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 endpo"},{"name":"ethora-feedback-submit","description":"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 badl"},{"name":"ethora-widget-snippet-get","description":"Generate the <script> tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisite"},{"name":"ethora-app-list","description":"List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with `appId` (24-char hex), `displayName`, `domainName`, ownership and bo"},{"name":"ethora-app-create","description":"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 o"},{"name":"ethora-app-update","description":"Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchang"},{"name":"ethora-chat-create","description":"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` addit"},{"name":"ethora-agent-list","description":"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 definitio"},{"name":"ethora-agent-create","description":"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 ba"},{"name":"ethora-agent-update","description":"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 r"},{"name":"ethora-agent-activate","description":"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 an"},{"name":"ethora-agent-invite","description":"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 conve"},{"name":"ethora-message-send","description":"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 (ov"},{"name":"ethora-chat-history","description":"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) pl"},{"name":"ethora-tools-enable","description":"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). Witho"},{"name":"search","description":"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 an"},{"name":"fetch","description":"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`, "}],"toolCount":24,"toolsHash":"a8c8106f8c0f416eaa32ea7ac2e2adb0f01ab38d063e31c4e21e04c60adb92ce","serverName":"Ethora MCP Server","capabilities":["tools","resources","completions","prompts"],"serverVersion":"26.9.5","protocolVersion":"2025-06-18"}},{"at":"2026-09-27T00:23:53.720Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":103,"error":null,"detail":{"tools":[{"name":"ethora-status","description":"Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like `hasAppJwt` — values never echoe"},{"name":"ethora-help","description":"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 c"},{"name":"ethora-app-select","description":"Set the current app context for this session so app-scoped tools can omit their `appId` argument. Stores `currentAppId` and, if given, `appToken` (which default"},{"name":"ethora-source-site-crawl-wait","description":"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, "},{"name":"ethora-source-doc-upload","description":"Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of `ethora-source-doc-upload-legacy`). Async — content becomes querya"},{"name":"ethora-user-login","description":"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`,"},{"name":"ethora-user-register","description":"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 defaul"},{"name":"ethora-api-key-create","description":"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 endpo"},{"name":"ethora-feedback-submit","description":"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 badl"},{"name":"ethora-widget-snippet-get","description":"Generate the <script> tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisite"},{"name":"ethora-app-list","description":"List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with `appId` (24-char hex), `displayName`, `domainName`, ownership and bo"},{"name":"ethora-app-create","description":"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 o"},{"name":"ethora-app-update","description":"Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchang"},{"name":"ethora-chat-create","description":"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` addit"},{"name":"ethora-agent-list","description":"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 definitio"},{"name":"ethora-agent-create","description":"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 ba"},{"name":"ethora-agent-update","description":"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 r"},{"name":"ethora-agent-activate","description":"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 an"},{"name":"ethora-agent-invite","description":"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 conve"},{"name":"ethora-message-send","description":"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 (ov"},{"name":"ethora-chat-history","description":"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) pl"},{"name":"ethora-tools-enable","description":"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). Witho"},{"name":"search","description":"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 an"},{"name":"fetch","description":"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`, "}],"toolCount":24,"toolsHash":"a8c8106f8c0f416eaa32ea7ac2e2adb0f01ab38d063e31c4e21e04c60adb92ce","serverName":"Ethora MCP Server","capabilities":["tools","resources","completions","prompts"],"serverVersion":"26.9.5","protocolVersion":"2025-06-18"}},{"at":"2026-09-27T00:23:51.808Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":100,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer realm=\"ethora\", resource_metadata=\"https://mcp.chat.ethora.com/.well-known/oauth-protected-resource/mcp/oauth\""}},{"at":"2026-09-26T23:21:30.093Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":97,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer realm=\"ethora\", resource_metadata=\"https://mcp.chat.ethora.com/.well-known/oauth-protected-resource/mcp/oauth\""}},{"at":"2026-09-26T23:21:27.025Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":100,"error":null,"detail":{"tools":[{"name":"ethora-status","description":"Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like `hasAppJwt` — values never echoe"},{"name":"ethora-help","description":"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 c"},{"name":"ethora-app-select","description":"Set the current app context for this session so app-scoped tools can omit their `appId` argument. Stores `currentAppId` and, if given, `appToken` (which default"},{"name":"ethora-source-site-crawl-wait","description":"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, "},{"name":"ethora-source-doc-upload","description":"Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of `ethora-source-doc-upload-legacy`). Async — content becomes querya"},{"name":"ethora-user-login","description":"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`,"},{"name":"ethora-user-register","description":"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 defaul"},{"name":"ethora-api-key-create","description":"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 endpo"},{"name":"ethora-feedback-submit","description":"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 badl"},{"name":"ethora-widget-snippet-get","description":"Generate the <script> tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisite"},{"name":"ethora-app-list","description":"List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with `appId` (24-char hex), `displayName`, `domainName`, ownership and bo"},{"name":"ethora-app-create","description":"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 o"},{"name":"ethora-app-update","description":"Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchang"},{"name":"ethora-chat-create","description":"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` addit"},{"name":"ethora-agent-list","description":"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 definitio"},{"name":"ethora-agent-create","description":"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 ba"},{"name":"ethora-agent-update","description":"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 r"},{"name":"ethora-agent-activate","description":"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 an"},{"name":"ethora-agent-invite","description":"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 conve"},{"name":"ethora-message-send","description":"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 (ov"},{"name":"ethora-chat-history","description":"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) pl"},{"name":"ethora-tools-enable","description":"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). Witho"},{"name":"search","description":"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 an"},{"name":"fetch","description":"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`, "}],"toolCount":24,"toolsHash":"a8c8106f8c0f416eaa32ea7ac2e2adb0f01ab38d063e31c4e21e04c60adb92ce","serverName":"Ethora MCP Server","capabilities":["tools","resources","completions","prompts"],"serverVersion":"26.9.5","protocolVersion":"2025-06-18"}}],"tools":[{"name":"ethora-status","description":"Report the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like `hasAppJwt` — values never echoe"},{"name":"ethora-help","description":"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 c"},{"name":"ethora-app-select","description":"Set the current app context for this session so app-scoped tools can omit their `appId` argument. Stores `currentAppId` and, if given, `appToken` (which default"},{"name":"ethora-source-site-crawl-wait","description":"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, "},{"name":"ethora-source-doc-upload","description":"Upload documents (1–5; PDF, text, etc.) into an app's RAG sources (app-token / B2B variant of `ethora-source-doc-upload-legacy`). Async — content becomes querya"},{"name":"ethora-user-login","description":"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`,"},{"name":"ethora-user-register","description":"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 defaul"},{"name":"ethora-api-key-create","description":"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 endpo"},{"name":"ethora-feedback-submit","description":"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 badl"},{"name":"ethora-widget-snippet-get","description":"Generate the <script> tag that embeds the Ethora AI chat widget (the floating launcher + chat panel that website visitors use) for an app, plus the prerequisite"},{"name":"ethora-app-list","description":"List all Ethora apps (tenants) owned by the currently logged-in user. Returns an array with `appId` (24-char hex), `displayName`, `domainName`, ownership and bo"},{"name":"ethora-app-create","description":"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 o"},{"name":"ethora-app-update","description":"Update mutable fields on an app the caller owns (displayName, domainName, appTagline, primaryColor, botStatus). Partial update — omitted fields are left unchang"},{"name":"ethora-chat-create","description":"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` addit"},{"name":"ethora-agent-list","description":"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 definitio"},{"name":"ethora-agent-create","description":"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 ba"},{"name":"ethora-agent-update","description":"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 r"},{"name":"ethora-agent-activate","description":"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 an"},{"name":"ethora-agent-invite","description":"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 conve"},{"name":"ethora-message-send","description":"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 (ov"},{"name":"ethora-chat-history","description":"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) pl"},{"name":"ethora-tools-enable","description":"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). Witho"},{"name":"search","description":"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 an"},{"name":"fetch","description":"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`, "}],"package":{"name":"@ethora/mcp-server","registry":"npm","observedAt":"2026-09-27T03:22:22.134Z","publishedAt":"2026-09-24T09:06:10.495Z","latestVersion":"26.9.5","weeklyDownloads":187},"toolSurface":{"id":"ts_6kvaj9sg9c25","endpointId":"ep_hacbyf8uj8vb","hash":"a8c8106f8c0f416eaa32ea7ac2e2adb0f01ab38d063e31c4e21e04c60adb92ce","toolCount":24,"serverName":"Ethora MCP Server","serverVersion":"27.1.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-09-24T05:21:37.696Z","lastSeenAt":"2026-09-27T03:20:10.468Z","observations":69,"toolNames":["ethora-status","ethora-help","ethora-app-select","ethora-source-site-crawl-wait","ethora-source-doc-upload","ethora-user-login","ethora-user-register","ethora-api-key-create","ethora-feedback-submit","ethora-widget-snippet-get","ethora-app-list","ethora-app-create","ethora-app-update","ethora-chat-create","ethora-agent-list","ethora-agent-create","ethora-agent-update","ethora-agent-activate","ethora-agent-invite","ethora-message-send","ethora-chat-history","ethora-tools-enable","search","fetch"],"distinctSurfaces":4},"endpointFacts":[{"id":"ep_hacbyf8uj8vb","url":"https://mcp.chat.ethora.com/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-09-26T12:26:11.903Z","auth":{"observedAt":"2026-09-26T12:26:12.199Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-09-26T12:26:12.391Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"mcp.chat.ethora.com","issuer":{"commonName":"YE2","organization":"Let's Encrypt"},"validFrom":"2026-09-15T18:55:27.000Z","validTo":"2026-12-14T18:55:26.000Z","daysToExpiry":78,"sanCount":1,"fingerprint256":"F1:9E:2B:52:CF:B1:70:28:0A:A7:08:84:04:F6:D8:F6:C5:EE:96:56:AF:23:DE:F1:9C:15:61:49:C3:60:60:FD"}},{"id":"ep_fhr9a6m69wpa","url":"https://mcp.chat.ethora.com/mcp/oauth","type":"mcp_streamable_http","factsCheckedAt":"2026-09-26T04:25:02.691Z","auth":{"observedAt":"2026-09-26T04:25:03.162Z","authRequired":true,"scheme":"Bearer","resourceMetadata":{"url":"https://mcp.chat.ethora.com/.well-known/oauth-protected-resource/mcp/oauth","resource":"https://mcp.chat.ethora.com/mcp/oauth","authorizationServers":["https://api.chat.ethora.com"],"scopesSupported":["read","write","admin","openid","email"]},"authorizationServer":{"url":"https://api.chat.ethora.com/.well-known/oauth-authorization-server","issuer":"https://api.chat.ethora.com","grantTypesSupported":["authorization_code","refresh_token","client_credentials"],"codeChallengeMethodsSupported":["S256"],"tokenEndpointAuthMethodsSupported":["none","client_secret_post","client_secret_basic"],"dynamicClientRegistration":true,"dpopSigningAlgValuesSupported":[],"clientIdMetadataDocumentSupported":null},"conformance":{"dpop":false,"rfc8414":true,"rfc9728":true,"pkceS256":true,"clientIdMetadataDocument":false,"dynamicClientRegistration":true}},"tls":{"observedAt":"2026-09-26T04:25:03.365Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"mcp.chat.ethora.com","issuer":{"commonName":"YE2","organization":"Let's Encrypt"},"validFrom":"2026-09-15T18:55:27.000Z","validTo":"2026-12-14T18:55:26.000Z","daysToExpiry":78,"sanCount":1,"fingerprint256":"F1:9E:2B:52:CF:B1:70:28:0A:A7:08:84:04:F6:D8:F6:C5:EE:96:56:AF:23:DE:F1:9C:15:61:49:C3:60:60:FD"}}]},"verification":{"claimed":true,"claimedAt":"2026-09-18T20:36:47.574Z","proofs":[{"method":"github_owner","target":"dappros","verifiedAt":"2026-09-18T20:36:47.574Z"}]},"provenance":{"sources":[{"source":"mcp_registry","key":"io.github.dappros/ethora-mcp-cli","url":"https://registry.modelcontextprotocol.io/v0/servers/io.github.dappros%2Fethora-mcp-cli","firstSeenAt":"2026-09-06T12:19:20.006Z","fetchedAt":"2026-09-14T15:19:15.112Z","normalizedAt":"2026-09-14T15:19:15.112Z"},{"source":"npm","key":"@ethora/mcp-server","url":"https://www.npmjs.com/package/@ethora/mcp-server","firstSeenAt":"2026-09-18T02:20:17.070Z","fetchedAt":"2026-09-26T22:18:08.058Z","normalizedAt":"2026-09-26T22:18:08.058Z"},{"source":"claim","key":"ag_k97zjrjbf36x","url":null,"firstSeenAt":"2026-09-18T20:39:57.077Z","fetchedAt":"2026-09-18T20:39:57.077Z","normalizedAt":"2026-09-18T20:39:57.062Z"},{"source":"mcp_registry","key":"io.github.dappros/ethora-mcp-server","url":"https://registry.modelcontextprotocol.io/v0/servers/io.github.dappros%2Fethora-mcp-server","firstSeenAt":"2026-09-06T12:19:20.006Z","fetchedAt":"2026-09-26T08:24:21.414Z","normalizedAt":"2026-09-26T08:24:21.414Z"}]},"firstSeenAt":"2026-09-06T12:19:20.006Z","updatedAt":"2026-09-27T03:22:22.134Z"}