An MCP (Model Context Protocol) CLI/server that connects popular MCP clients to the Ethora platform. This runs locally on a developer machine via stdio rather than as a hosted Ethora service.
Use it from Cursor, VS Code MCP, Claude Desktop, or Windsurf/Cline to log in, manage apps and chats, automate B2B workflows, and interact with wallets (ERC-20).
Part of the Ethora SDK ecosystem — see all SDKs, tools, and sample apps. Follow cross-SDK updates in the Release Notes.
Best for:
- developers trying Ethora locally
- tenant admins / app owners using MCP manually
- flows that start with
ethora-user-login
How it works:
- configure
ETHORA_APP_JWTonce for login/register bootstrap - switch to
ethora-auth-use-user - call
ethora-user-login - use user-auth tools such as files and legacy owner/admin endpoints
Best for:
- permanent backend integrations
- partner provisioning flows
- autonomous agents operating Ethora without a human user session
How it works:
- configure
ETHORA_B2B_TOKEN - switch to
ethora-auth-use-b2bfor explicit tenant-actor/v2/apps/:appId/...routes - optionally switch into
ethora-auth-use-appafterethora-app-selectwhen you want app-scoped convenience routes powered byappToken
Rule of thumb:
- first-time local use usually starts with User Auth
- repeatable automation usually starts with B2B, then often moves into app-token mode for one selected app
- Resources (loadable docs into context)
ethora://docs/auth-map— appJwt vs appToken vs b2bTokenethora://docs/chat-component/quickstart— Vite/Next quickstart + replacing demo tokensethora://docs/sdk-backend/quickstart— backend integration quickstartethora://docs/recipes— common tool sequences (broadcast/sources/files/bot)
- Prompts
ethora-auth-mapethora-vite-quickstartethora-nextjs-quickstartethora-backend-sdk-quickstartethora-recipes
ethora-generate-chat-component-app-tsx— ready-to-pasteApp.tsxsnippet for@ethora/chat-componentethora-generate-env-examples—.env.exampletemplates for:- frontend chat component
- backend SDK integration
- MCP usage (
ETHORA_API_URL,ETHORA_APP_JWT,ETHORA_B2B_TOKEN)
ethora-generate-b2b-bootstrap-runbook— minimal “call these MCP tools in order” runbook for B2B bootstrap
Tip: to list runnable recipes without calling ethora-help, call ethora-run-recipe with goal: "auto" and omit recipeId.
-
Session / Config
ethora-configure— set API URL plus App JWT / B2B token / appToken for this MCP sessionethora-status— show configured API URL, active auth mode, and which credentials are presentethora-help— task-oriented help (recommended next calls + “one-click recipes” based on current state)ethora-run-recipe— execute a built-in recipe by id (sequential steps; no shell, no file writes)ethora-doctor— validate config + ping the configured Ethora API for both user and B2B usageethora-app-select— select current appId and optionally set appTokenethora-auth-use-app— switch to app-token auth mode for app-scoped operationsethora-auth-use-user— switch to user-session auth modeethora-auth-use-b2b— switch to tenant-actor B2Bx-custom-tokenauth mode
-
Chats (v2)
ethora-chats-broadcast-v2— enqueue broadcast job using app-token auth or B2B + explicitappIdethora-chats-broadcast-job-v2— get broadcast job status/results using app-token auth or B2B + explicitappIdethora-wait-broadcast-job-v2— poll broadcast job until completed/failed using app-token auth or B2B + explicitappIdethora-chats-message-v2— send a test/automation message through the app chat surface (requires app-token auth)ethora-chats-history-v2— read persisted automation/test history for private or group sessions (requires app-token auth)
-
Users (v2 async batch)
ethora-users-batch-create-v2— create async users batch job (requires B2B auth)ethora-users-batch-job-v2— get users batch job status/results (requires B2B auth)ethora-wait-users-batch-job-v2— poll users batch job until completed/failed (requires B2B auth)
-
Files (v2)
-
Bot / Agent (v2)
-
ethora-bot-get-v2— get bot status/settings using app-token auth or B2B + explicitappId -
ethora-bot-update-v2— update bot settings using app-token auth or B2B + explicitappId -
ethora-bot-enable-v2— enable bot using app-token auth or B2B + explicitappId -
ethora-bot-disable-v2— disable bot using app-token auth or B2B + explicitappId -
ethora-bot-widget-v2— get widget/embed config and public widget URL metadata (app-token auth) -
ethora-agents-list-v2— list reusable saved agents for the current app owner (app-token auth) -
ethora-agents-get-v2— get one reusable saved agent (app-token auth) -
ethora-agents-create-v2— create a reusable saved agent (app-token auth) -
ethora-agents-update-v2— update a reusable saved agent (app-token auth) -
ethora-agents-clone-v2— clone a reusable saved agent (app-token auth) -
ethora-agents-activate-v2— bind a saved agent as the active bot for the selected app (app-token auth) -
ethora-bot-message-v2— compatibility alias forethora-chats-message-v2 -
ethora-bot-history-v2— compatibility alias forethora-chats-history-v2 -
ethora-files-upload-v2— upload files (requires user auth) -
ethora-files-get-v2— list/get files (requires user auth) -
ethora-files-delete-v2— delete file by id (requires user auth)
-
-
Sources
ethora-sources-site-crawl— crawl a URL (requires user auth)ethora-sources-site-reindex— reindex URL by urlId (requires user auth)ethora-sources-site-delete-url— delete by URL (requires user auth)ethora-sources-site-delete-url-v2— batch delete URLs (requires user auth)ethora-sources-docs-upload— upload docs for ingestion (requires user auth)ethora-sources-docs-delete— delete ingested doc by id (requires user auth)ethora-sources-site-crawl-v2— crawl a URL using app-token auth or B2B + explicitappIdethora-sources-site-reindex-v2— reindex URL by urlId using app-token auth or B2B + explicitappIdethora-sources-site-crawl-v2-wait— single-call long-timeout helper for crawl (app-token auth)ethora-sources-site-reindex-v2-wait— single-call long-timeout helper for reindex (app-token auth)ethora-sources-site-list-v2— list crawled site sources and current tags using app-token auth or B2B + explicitappIdethora-sources-site-tags-update-v2— set/update tags for a crawled site source using app-token auth or B2B + explicitappIdethora-sources-site-delete-url-v2— delete one crawled URL by URL using app-token auth or B2B + explicitappIdethora-sources-site-delete-url-v2-batch— batch delete crawled source records by id using app-token auth or B2B + explicitappIdethora-sources-docs-upload-v2— upload docs for ingestion using app-token auth or B2B + explicitappIdethora-sources-docs-list-v2— list indexed documents and current tags using app-token auth or B2B + explicitappIdethora-sources-docs-tags-update-v2— set/update tags for an indexed document using app-token auth or B2B + explicitappIdethora-sources-docs-delete-v2— delete doc by id using app-token auth or B2B + explicitappId
-
Auth & Accounts
ethora-user-login— login user (email + password)ethora-user-register— register user (email + first/last name)
-
Applications
ethora-app-create— create appethora-app-update— update appethora-app-delete— delete appethora-app-list— list appsethora-b2b-app-create— create app using B2B auth (x-custom-token)ethora-b2b-app-bootstrap-ai— create app → index sources → configure/enable bot, including runtime LLM selection (B2B automation)ethora-app-tokens-list-v2— list app token metadata (B2B auth)ethora-app-tokens-create-v2— create new app token (returned once) (B2B auth)ethora-app-tokens-rotate-v2— rotate token (revoke old, return new once) (B2B auth)ethora-app-tokens-revoke-v2— revoke token by tokenId (idempotent) (B2B auth)ethora-b2b-app-provision— create app + create tokens + provision rooms + configure bot, including runtime LLM selection (B2B orchestrator)
-
Chat & Rooms
ethora-app-get-default-rooms— list default roomsethora-app-get-default-rooms-with-app-id— rooms for a given appethora-app-create-chat— create chat for appethora-app-delete-chat— delete chat
-
Wallet
ethora-wallet-get-balance— get balanceethora-wallet-erc20-transfer— send ERC-20 tokens
Tool names above reflect the functional areas exposed by the server. Your exact tool names may vary slightly by version; run the client’s “list tools” to confirm.
Before you begin, ensure you have the following:
- Node.js installed on your system (recommended version 18.x or higher).
The server is distributed as an npm package and is typically launched by MCP clients via npx:
npx -y @ethora/mcp-serverNo global install is required.
This MCP server supports both the local user-auth flow and the server-side B2B flow.
Core values:
- Ethora API URL (where to send requests)
- Ethora App JWT (used only for login/register bootstrap in user-auth mode)
- Ethora B2B Token (used for tenant-actor server-to-server flows)
You can provide these either:
- via env vars, or
- at runtime via the
ethora-configuretool (in-memory; resets when MCP process restarts)
ETHORA_API_URL: full API URL (example:https://api.ethora.com/v1,http://localhost:8080/v1)ETHORA_BASE_URL: base host URL (example:https://api.ethora.com,http://localhost:8080)
If provided, the server will default to.../v1.ETHORA_APP_JWT: App JWT string, usually starting withJWT ...ETHORA_B2B_TOKEN: B2B server token forx-custom-tokenauth (JWT withtype=server)ETHORA_MCP_ENABLE_DANGEROUS_TOOLS: enable destructive tools (default: disabled). Set totrueto expose:- app deletion tools
- wallet transfer tools
- bulk delete tools
Security: never commit App JWTs, B2B tokens, or appTokens to git. Configure them via env vars, the MCP client secret store, or your own backend.
All tools return JSON in a consistent envelope:
- Success:
{ ok: true, ts, meta, data } - Error:
{ ok: false, ts, meta, error }, whereerrorincludes:code: stable string (prefer APIcode, otherwise inferred)httpStatus: HTTP status when the failure came from an API callrequestId: request/correlation id if returned by APIhint: 1-line “what to do next”
- Open Cursor → Settings → MCP
- Click Add new global MCP server
- Add an entry for the Ethora MCP server, following the pattern below:
{
"mcpServers": {
"ethora-mcp-cli": {
"command": "npx",
"args": ["-y", "@ethora/mcp-server"]
}
}
}- Save. You should see green active when connected.
- Open User Settings (JSON)
- Add an MCP entry:
"mcp": {
"servers": {
"ethora-mcp-cli": {
"command": "npx",
"args": [
"-y", "@ethora/mcp-server"
]
}
}
}- Save. The server will auto-start on first use.
- Settings → Developer
- Click Edit Config
- Open
claude_desktop_config.json - Add the following configuration:
{
"mcpServers": {
"ethora-mcp-cli": {
"command": "npx",
"args": ["-y", "@ethora/mcp-server"]
}
}
}-
Run:
npx -y @ethora/mcp-server
-
Configure your
mcp_config.jsonsimilarly:{ "mcpServers": { "ethora-mcp-cli": { "command": "npx", "args": ["-y", "@ethora/mcp-server"] } } }
After the server shows as connected in your client:
- Run
list tools(client command) to verify Ethora tools are available. - Check config/connectivity: call
ethora-doctor(orethora-status) - For a first local/manual test:
- call
ethora-configurewithapiUrl/appJwt - call
ethora-auth-use-user - call
ethora-user-login - then try
ethora-app-listorethora-wallet-get-balance
- call
- For a server-side/B2B test:
- call
ethora-configurewithapiUrl/b2bToken - call
ethora-auth-use-b2b - then try
ethora-b2b-app-createorethora-app-tokens-list-v2
- call
Pre-reqs:
- Configure
ETHORA_API_URL(or callethora-configure) - Configure
ETHORA_B2B_TOKEN(or callethora-configurewithb2bToken) - Ensure your Ethora backend is configured with AI service URL/secret (for bot activation)
Suggested flow:
- Call
ethora-auth-use-b2b - Call
ethora-b2b-app-bootstrap-aiwith:displayName- optional
savedAgentId - optional
crawlUrl - optional
docs[](base64) enableBot: true- optional
llmProvider - optional
llmModel
It will:
- create the app (B2B)
- set current app context (best-effort)
- index sources via
/v2/sources/*(app-token auth) - configure and/or enable bot (best-effort)
Minimal (create app only):
{
"displayName": "Acme AI Demo",
"setAsCurrent": true
}Create app + crawl a website + enable bot:
{
"displayName": "Acme AI Demo",
"savedAgentId": "6790abc1234567890def1111",
"crawlUrl": "https://example.com",
"followLink": true,
"enableBot": true,
"botTrigger": "/bot",
"llmProvider": "openai",
"llmModel": "gpt-4o-mini"
}Create app + upload docs + enable bot:
{
"displayName": "Acme AI Demo",
"docs": [
{
"name": "faq.pdf",
"mimeType": "application/pdf",
"base64": "BASE64_PDF_CONTENT_HERE"
}
],
"enableBot": true,
"llmProvider": "openai",
"llmModel": "gpt-4o-mini"
}Provision app + token + default rooms + bot settings:
{
"displayName": "Acme Support",
"savedAgentId": "6790abc1234567890def1111",
"tokenLabels": ["default", "staging"],
"rooms": [
{ "title": "General" },
{ "title": "Support", "pinned": true }
],
"enableBot": true,
"botTrigger": "/bot",
"botPrompt": "You are the Acme support assistant.",
"botGreetingMessage": "Hello. How can I help?",
"llmProvider": "openai",
"llmModel": "gpt-4o-mini"
}Provider/model note:
- Common values are
openaiandopenai-compatible. - The effective provider/model must also be enabled by your Ethora backend + AI service environment.
Once you already have an app selected with appToken auth:
- call
ethora-auth-use-app - call
ethora-bot-get-v2to inspect current bot status and prompt settings - call
ethora-sources-site-list-v2andethora-sources-docs-list-v2to inspect indexed sources - call
ethora-sources-site-tags-update-v2orethora-sources-docs-tags-update-v2to organize retrieval by tags - call
ethora-chats-message-v2/ethora-chats-history-v2if your backend exposes the chat automation surface on the same API host
Example: apply retrieval tags to a crawled source
{
"sourceId": "6790abc1234567890def1234",
"tags": ["support", "faq", "billing"]
}Example: apply retrieval tags to an indexed document
{
"docId": "6790abc1234567890def1235",
"tags": ["support", "faq"]
}- Never hardcode API keys in shared config. Prefer client-side secret stores.
- Use least privilege keys and consider allowlists/rate limits on your Ethora backend.
- Rotate credentials regularly in production use.
This repo runs report-only scans on pushes/PRs:
- gitleaks for secret scanning
- semgrep for basic SAST
Clone and run locally:
git clone https://github.com/dappros/ethora-mcp-cli.git
cd ethora-mcp-cli
npm install
npm run build
npm startSuggested scripts (if not present):
{
"scripts": {
"build": "tsc -p .",
"start": "node dist/index.js",
"dev": "tsx src/index.ts"
}
}- Client can’t connect: Ensure
npx @ethora/mcp-serverruns locally without errors. Check Node ≥ 18. - Auth errors: Verify
ETHORA_BASE_URLand any required secrets are set in the client’s environment. - Tools missing: Restart the MCP client and inspect server logs for registration errors.
- Network: Confirm outbound access from the IDE to your Ethora host.
- Ethora Chat Component — our React chat component used in widgets and stand-alone apps https://github.com/dappros/ethora-chat-component
- Ethora WP Plugin — WordPress integration
https://github.com/dappros/ethora-wp-plugin - RAG Demos — RAG AI assistant examples
https://github.com/dappros/rag_demos
See LICENSE.