Thalovant MCP

io.github.thalovant由 GitHub 账号 thalovant 发布v0.7.2更新于 Nov 8, 2026

Connect MCP clients to Thalovant control-plane and hub runtime APIs over stdio or Streamable HTTP.

概览

AI 生成的概览

将助手连接到 Thalovant 控制平面与 hub 运行时 API,用于浏览 hub、管理运行时组与技能,并使用记忆功能。

可以做什么
  • 查看 hub、运行时组、市场技能与运行时能力,并读取分析概览
  • 创建和更新 hub 与运行时组、设置评分,并安装、更新或移除 hub 技能
  • 查询与管理记忆条目和摘要
  • 向 hub 运行时提问和查询、发送动作与代码,并发出事件
  • 管理聊天应用桥接:列出连接器与桥接、暂停、恢复、更新并发送测试消息
  • 通过设备流程登录,并查看配置、身份与健康状态
适用场景
当你希望助手操作 Thalovant 的 hub 与运行时组、在 hub 运行时上安装或更新技能,或在对话中读写 Thalovant 记忆时使用。公开 hub 发现无需凭据;预置资源需要付费方案。
运行要求
通过 npx 以 stdio 在本地运行(需 Node.js 20 或更高版本),或以容器形式通过 Streamable HTTP 运行。访问控制平面需要 THALOVANT_API_TOKEN 中的受限 API 令牌(推荐),或 THALOVANT_ACCESS_TOKEN,或 THALOVANT_EMAIL 与 THALOVANT_PASSWORD,或通过浏览器设备登录。远程部署还需 MCP_HTTP_AUTH_TOKEN 或 JWT/内省设置。需要能访问 Thalovant API 的网络。
安装前请注意
凭据只从服务器环境读取,不从工具参数传入,请勿在对话中传递令牌。写操作会改变线上 hub 状态:技能变更会影响共用同一运行时组的所有 hub,更新 hub 需要当前 etag。预置资源与安装技能需要付费方案,可能返回 402。删除类工具默认关闭,除非设置 THALOVANT_ENABLE_DESTRUCTIVE_TOOLS;删除 hub 会同时删除其客户端与 ACL 且不可恢复。客户端身份文件只会写入受限的身份目录。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Thalovant MCP,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Last Edit: Claude Fable 5.1 - 2026-11-06 - Motive: Say what the 409 skill_unavailable_licensing and memory_limit refusals get as hints (0.7.1).

Thalovant MCP Server

[M8ven Live Monitored]

Public-ready MCP server for Thalovant control-plane and hub runtime APIs.

It uses the official Thalovant Node.js SDK and the production MCP TypeScript SDK over stdio and Streamable HTTP, so it works with local MCP hosts such as Claude Desktop, Codex, Cursor, and remote MCP clients.

What It Includes

  • stdio transport for local agents.
  • Streamable HTTP transport at /mcp for remote agents.
  • OAuth-style protected resource metadata at /.well-known/oauth-protected-resource.
  • Static bearer tokens for simple/private deployments.
  • JWT/JWKS and OAuth token introspection for production remote deployments.
  • Per-principal Thalovant credentials and tool policy.
  • Chat app tools: connectors, bridges and their status in words, pause and resume, chats, test messages and the plan's allowance. Bot tokens stay in the console.
  • Host/origin validation, CORS, rate limiting, body limits, secure headers, and session binding.
  • Optional resumability event storage and JSONL audit logs.
  • Docker, Compose, Kubernetes, CI, npm package metadata, and MCP registry server.json.

Why TypeScript

Thalovant publishes SDKs for Python, Node.js, Go, and Rust. This server uses Node.js because @thalovant/sdk directly exposes the Thalovant control plane, identity loading, WSS/HTTPS/MQTT runtime clients, memory, analytics, and context helpers, while @modelcontextprotocol/sdk is the best-supported path for cross-agent stdio and Streamable HTTP servers.

Install

Run the published package with npx -y @thalovant/mcp-server, or build it from a checkout:

bash
npm installnpm run build

Node.js 20 or newer is required.

Control-Plane Auth

Public hub discovery does not need Thalovant credentials. Private control-plane tools and runtime hub tools read credentials only from the MCP server environment or server-side principal credential files. Do not pass API tokens or passwords through chat or tool arguments.

The server selects control-plane auth in this order:

  1. THALOVANT_API_TOKEN — a scoped Thalovant API token. Recommended.
  2. THALOVANT_ACCESS_TOKEN — a pre-issued session access token.
  3. THALOVANT_EMAIL + THALOVANT_PASSWORD — interactive-account login fallback.

When a token is set, the server never calls the login endpoint. thalovant_config_status reports the active mode as controlPlaneAuthMode without revealing token values.

With none of these configured, a person can sign the server in through the browser instead: see Device Sign-In. The token that sign-in mints is used only when nothing above is configured.

Device Sign-In

A tool call cannot wait for a person, so the device flow (RFC 8628) is two tools:

  1. thalovant_begin_device_login with optional scopes (an empty list, like none, asks for the API's default), clientName and clientId answers loginId, userCode, verificationUri, verificationUriComplete, interval and expiresIn. Show the person the URL and the code. clientId signs in as a registered app, thalovant-home-assistant for Home Assistant: the approval page shows the platform's name for it as verified, and approving it again replaces the token it already holds. An id the API does not know is refused (400 unknown_client).
  2. thalovant_poll_device_login with that loginId asks once. outcome is pending (poll again after interval seconds, already five seconds longer for good if the API asked to slow down), approved (with tokenId, scopes and expiresAt), expired or denied.

The device code and the token never reach the model: the server keeps both, bound to the principal that began the sign-in, for the life of the process. Once approved, every control-plane tool for that principal uses the token when no credential is configured. thalovant_revoke_device_login signs out: it revokes that token (a token may always revoke itself, and one already revoked counts as revoked) and forgets it; signing out again answers alreadyRevoked without a request, and configured tokens are never touched. A sign-in reaches only the configured API origin (THALOVANT_API_URL, or the default), since the verification URL it answers with is shown to a person. A Home Assistant link asks for hubs:read, clients:read and clients:write, which is also all a Free plan can approve.

API Tokens (Recommended For AI Agents And CI)

Scoped API tokens are the right credential for AI and automation use: they are minted from the Thalovant dashboard (or through the device flow), carry only the scopes you grant, can be revoked individually, and never involve your account password or MFA. Tokens start with tvpat_.

bash
export THALOVANT_API_TOKEN="tvpat_..."export THALOVANT_API_URL="https://api.thalovant.com"
npm start

Minimum scopes for the full control-plane tool surface:

ScopeUsed by
hubs:readthalovant_list_hubs, thalovant_get_hub, thalovant_get_analytics_overview, thalovant_list_marketplace_skills, thalovant_list_runtime_groups, thalovant_get_runtime_group, thalovant_get_runtime_group_config, the guarded merge read in thalovant_update_runtime_group_config, the hub lookup inside thalovant_create_client_identity, and the chat app reads (thalovant_list_chat_app_connectors, thalovant_get_bridge_networks, thalovant_list_bridges, thalovant_get_bridge)
hubs:inspectthalovant_get_hub_runtime_capabilities, thalovant_list_runtime_group_marketplace, thalovant_list_runtime_group_inventory, thalovant_list_hub_skills, thalovant_list_hub_skill_history
hubs:writeAll hub and runtime-group provisioning: thalovant_create_hub, thalovant_update_hub, thalovant_release_hub, thalovant_create_runtime_group, thalovant_update_runtime_group, thalovant_update_runtime_group_config, thalovant_release_runtime_group, thalovant_install_runtime_group_skill, thalovant_uninstall_runtime_group_skill, the per-hub thalovant_install_hub_skill, thalovant_update_hub_skill, thalovant_remove_hub_skill, the hub rating tools, the chat app writes (thalovant_pause_bridge, thalovant_resume_bridge, thalovant_update_bridge, thalovant_send_bridge_test_message), thalovant_list_bridge_chats (it changes nothing but asks the chat network, so the API serves it only to hubs:write and a paid plan), and the opt-in delete tools
clients:writethalovant_create_client_identity (POST /v1/clients) and the opt-in thalovant_delete_client
memory:readthalovant_list_memory_items, thalovant_get_memory_summary, thalovant_get_memory_item
memory:writethalovant_create_memory_item, thalovant_update_memory_item, thalovant_delete_memory_item

The hub scopes imply one another: hubs:write grants hubs:read, which grants hubs:inspect and hubs:preview. Minting a token with hubs:read is therefore enough for every discovery tool in the table above.

Scope is not the whole story for provisioning. Every hub and runtime-group write also requires a paid plan, and the API checks scope before the plan, so the two failure modes are ordered:

  • A token missing the scope fails 403 Insufficient scopes. Free-plan API tokens are capped at hubs:read, clients:read, and clients:write, so on the free tier provisioning fails with this 403 and never reaches the 402.
  • A correctly scoped token on a free plan fails 402 API access requires a paid plan.
  • thalovant_install_runtime_group_skill can fail with a second, distinct 402, This skill requires paid marketplace access for the tenant plan., when the plan is paid but does not include access_tier: paid catalog entries.

Discovery is deliberately not paid-gated: a free-tier token can browse the marketplace catalog and set hub ratings, but cannot install skills or provision hubs. Use thalovant_list_runtime_group_marketplace before installing — it reports installable, purchase_required, and access_message per skill, which turns an opaque 402 into a decision you can make up front.

Grant fewer scopes for narrower deployments: a read-only assistant needs only hubs:read and memory:read, and a discovery-only agent that browses skills but never provisions needs hubs:read alone. thalovant_get_analytics_overview with admin: true additionally requires an admin account with admin:analytics, which API tokens for regular use should not carry. Runtime hub tools (thalovant_ask, thalovant_send_action, and friends) use Thalovant client identities, not control-plane tokens.

Hub Etags

thalovant_update_hub and thalovant_delete_hub use optimistic locking and require the hub's current etag, sent as If-Match. The etag is only available in the body of the hub resource — the API sends no ETag response header — so an agent must call thalovant_get_hub first and pass the etag field from that response. A missing or stale value fails 412 ETag mismatch and changes nothing; re-fetch and retry. name, namespace, and domain are immutable after creation, so thalovant_update_hub does not accept them at all; send only the fields you are changing rather than round-tripping a whole hub resource. Runtime-group writes do not use etags.

Hub Skills

thalovant_list_hub_skills, thalovant_install_hub_skill, thalovant_update_hub_skill, and thalovant_remove_hub_skill select a hub's attached runtime group; all hubs sharing it are affected. A hub can start with no skills at all and gain them one at a time; a change applies live on the hub in about 15 seconds with no restart. hubId must be the hub UUID — the authenticated hub routes reject slugs.

thalovant_list_hub_skills returns the whole GET /v1/hubs/{hub_id}/skills envelope: hub_id, runtime_group_id, observed_at, source, the runtime's phase and message, and data, one row per skill (possibly empty) with skill, title, marketplace_skill_id, package_name, source_type, install_source, version, version_pin, installed_version, observed_version, previous_version, latest_version, available_version, update_available, changelog, active, state, the runtime's phase, message and last error, and last_transition_at. state is one of pending, installed, failed, removing, drifted, quarantined, or unmanaged; a change in progress shows as pending.

Each write answers 202 with operation_id, hub_id, runtime_group_id, skill, version (null for a removal), previous_version, and state (installing, updating, or removing); pass wait: true to poll that operation every 2 s until it converges (installed, or removed for a removal; a failed or timed_out operation raises an error carrying its error_message), with a 120 s default timeoutMs, or follow it yourself with thalovant_get_operation. Installing a skill that is already installed at another version performs an update; the same version fails 409 with code skill_version_already_installed. A hub with no runtime group fails 404 with code hub_without_runtime_group (a plain 404 means an unknown hub or a skill that is not installed), and an unresolvable latest or an invalid version fails 422. Errors are RFC 7807 problem bodies; the tool error keeps the short message, which appends the root code in parentheses, for example Thalovant API request failed with HTTP 409: Skill version already installed. (skill_version_already_installed), and then the code and the body's other fields (see Tool Errors). A skill the store does not install for licensing reasons (YouTube, YouTube Music, Spotify, SoundCloud and Bandcamp: the service's terms do not allow a hosted assistant to play its content) fails 409 with code skill_unavailable_licensing and reason: licensing, which thalovant_list_marketplace_skills announces per skill as unavailable_reason and installable; no plan, scope or version changes that.

Listing needs hubs:inspect (implied by hubs:read); the writes need hubs:write and a paid plan, and because scope is checked before plan a free-plan token sees 403, never 402. Hub-restricted tokens (a hub_ids allowlist) are honoured on all four routes. The server uses the published Node SDK hub-skill methods and preserves MCP cancellation checks during polling. A failed status read retains the accepted operation ID; use thalovant_get_operation with that ID instead of submitting the write again. No new poll starts at or after the polling deadline. That deadline does not cancel an HTTP request already in flight.

Login Fallback

bash
export THALOVANT_EMAIL="[email protected]"export THALOVANT_PASSWORD="..."
export THALOVANT_PROFILE="prod"export THALOVANT_API_URL="https://api.thalovant.com"
npm start

If neither a token nor email/password is configured, authenticated control-plane tools fail with a clear error naming the supported options.

Configured API tokens and login credentials are bound to the origin of their configured apiUrl or THALOVANT_API_URL (default https://api.thalovant.com). A tool argument cannot redirect those credentials to another origin. Equivalent URL spellings and paths on the same origin are allowed; custom origins must be configured alongside their credentials. Anonymous public discovery may still select a custom API URL.

Link Home Assistant

A home controller such as Home Assistant links to a hub with a connection of its own kind:

  1. Sign in, when no token is configured: Device Sign-In.
  2. thalovant_create_client_identity with connectionType: "home_assistant". The API must answer with the same kind; one that made an ordinary connection instead has it deleted again and the call fails. The result carries clientId, connectionType and operationId.
  3. thalovant_wait_for_admission with that operationId. A hub admits a new connection in about ninety seconds and refuses it until then. outcome is admitted, failed or timeout. A failure on the platform carries the operation's errorCode (and status null); the API refusing the wait itself carries its status, code and detail. A timeout means the connection may still be admitted: call the tool again rather than creating another connection. A 429 is waited out for the time the API names (in its body, else Retry-After, else RateLimit-Reset); one asking for longer than is left is a timeout at once. A token the API refuses (401, 403) and an API out of reach are tool errors of their own, each with a hint, never a failed admission. It reads only, honours cancellation, and never follows a links.self to another origin than the API's.

Each refusal of step 2 names what to do next after the API's own text (see Tool Errors): a kind the API does not know yet, a plan that does not allow the connection, a hub that already holds its one Home Assistant link (with the client_id holding it), or a token the API refused (sign in again). thalovant_delete_client removes a connection (If-Match, reading the etag first when none is given, retrying once on 412, and counting a connection already gone as deleted); it is a destructive tool the operator enables.

Answering the hub's requests afterwards is the integration's own long-lived job, on the data plane; an MCP tool call holds a hub connection only for its own length, so that part of the link is not a tool.

Chat Apps

A hub can answer in a chat network through a chat app: Telegram and Discord are offered, and Matrix, Mattermost and Twitch appear as beta when the API lists them. Each connection of a hub to a chat network is a bridge (/v1/bridges). The person makes the bot in the chat network, then connects it to a hub in the Thalovant console.

Tokens and secrets stay in the console. Creating a bridge and replacing its token or secrets need the bot's credential, and no tool of this server takes a credential as an argument (see Control-Plane Auth), so there is no tool for them. The descriptions and outputs say where to go instead: Connections > Add connection > Chat apps, or the hub's Chat apps tab, and Replace token on the bot. thalovant_update_bridge refuses a setting whose name looks like a token or secret, at any depth, before any request, naming it by its dotted path and never its value.

ToolWhat it doesKind
thalovant_list_chat_app_connectorsThe chat apps (GET /v1/bridges/connectors) in en or fr: status (offered, beta), whether a bridge can be created now, description and setup steps, the secrets the console asks for (by key and label, never a value), the settings form, what a chat id looks like (targets), the mention rule, session scopes and helpersread-only
thalovant_get_bridge_networksNetworks offered and the plan's allowance (GET /v1/bridges/networks): limit, used, remaining, paid_plan, can_create, and a summary in words. Free plans get 0. With hubId, the hub owner's allowanceread-only
thalovant_list_bridgesBridges of one hub (hubId) or every bridge the token may see (ownerId narrows it; limit 1-500)read-only
thalovant_get_bridgeOne bridge, with its status in plain wordsread-only
thalovant_list_bridge_chatsThe chats, channels or rooms the bot can see, to choose from; manual_entry: true when the ids are typed instead. Changes nothing, but needs hubs:write and a paid plan (it asks the network)read-only, write scope
thalovant_pause_bridgePATCH paused: true: stops answering everywhere, keeps chats, settings and token. Always allowedwrite
thalovant_resume_bridgePATCH paused: false. Needs a paid plan with room in its allowancewrite
thalovant_update_bridgeThe chats it answers in (allowed, which replaces the whole list), requireMention, sessionScope, and non-secret settingswrite
thalovant_send_bridge_test_messagePosts a short "Connected to ." line in one allowed chatwrite
thalovant_delete_bridgeDeletes the bridge and its stored token; opt-in like the other destructive toolsdestructive

Each bridge comes back with the API's own members (network, connector, state, allowed, require_mention, session_scope, paused, hold, bot, invite_links, secrets_set by name, etag, timestamps, and operation when the change queued one) and status:

  • reason is the API's customer-safe status, and summary says it in words: Setup (no chats chosen yet), Starting, Connected, Paused, Unavailable, TokenMissing and TokenRejected (both send the person to Replace token in the console). A reason this server does not know yet is kept and named.
  • phase, ready, and applied: true once the bridge carries the latest change, false while it is on its way, null in setup.
  • hold says why the platform paused a bridge: plan_limit (the plan allows fewer running chat apps, after a downgrade; it resumes on its own once there is room) or account_suspended. It is null for the owner's own pause.

The platform's own diagnostic sentence and condition (status.message, status.operator_reason, sent to administrators' tokens) are never included. Outputs are built from the members the API documents rather than passed through, so a member added later does not reach the model unreviewed; settings and operation go through the usual secret redaction.

The write tools take an optional etag (the bridge's etag field; there is no ETag header), sent as If-Match: a stale one fails 412 and changes nothing. Telegram lists chats only while its bridge is paused (409 bridge_running), so the flow is pause, send /start@<bot> in the new group, list, update allowed, resume. A refusal keeps the API's code, sentence and fields (see Tool Errors) and adds a hint by code: the settings a bridge_settings_invalid or bridge_url_* refusal names (names only), the plan's allowance after 402 or 403 plan_limit, the wait after 429, and the console for anything about a token.

Reads need hubs:read, except thalovant_list_bridge_chats: it changes nothing, but it asks the chat network on the bot's behalf, so it needs hubs:write, the hub's owner or a workspace manager, and a paid plan, like the writes. Writes need the same, except pausing and deleting, which always work on any plan. THALOVANT_MCP_READONLY keeps the four reads a hubs:read token can call and leaves thalovant_list_bridge_chats out.

Local Stdio

The server speaks MCP over stdio and does not write logs to stdout.

Runtime hub tools load local identities in this order:

  1. identityFile tool argument.
  2. configPath or profile tool argument.
  3. Thalovant SDK environment identity variables.
  4. The default Thalovant SDK config profile.

Keep Thalovant identity files secret. The SDK expects protected config files such as ~/.config/thalovant/config.yaml with mode 0600.

Streamable HTTP

Remote mode uses MCP Streamable HTTP at /mcp and requires bearer authentication by default.

bash
export MCP_TRANSPORT="http"export MCP_HTTP_HOST="127.0.0.1"export MCP_HTTP_PORT="3000"export MCP_HTTP_AUTH_TOKEN="$(openssl rand -hex 32)"export MCP_HTTP_ALLOWED_HOSTS="127.0.0.1:3000,localhost:3000"
npm run start:http

Clients connect to:

text
http://127.0.0.1:3000/mcpAuthorization: Bearer <token>

Health checks are available at /healthz and /readyz.

For public deployments, set the public URL and exact host/origin allowlists:

bash
export MCP_HTTP_HOST="0.0.0.0"export MCP_HTTP_PORT="3000"export MCP_PUBLIC_URL="https://mcp.example.com"export MCP_HTTP_ALLOWED_HOSTS="mcp.example.com"export MCP_HTTP_ALLOWED_ORIGINS="https://agent.example.com"

Remote Auth

Use static bearer tokens only for local, private, or single-tenant deployments:

bash
export MCP_HTTP_AUTH_TOKEN="$(openssl rand -hex 32)"# orexport MCP_HTTP_AUTH_TOKENS="token-a,token-b"

Use JWT/JWKS for production resource-server validation:

bash
export MCP_HTTP_AUTH_MODE="jwt"export MCP_OAUTH_ISSUER="https://auth.example.com/"export MCP_OAUTH_JWKS_URL="https://auth.example.com/.well-known/jwks.json"export MCP_OAUTH_AUDIENCE="https://mcp.example.com/mcp"export MCP_OAUTH_AUTHORIZATION_SERVERS="https://auth.example.com/"export MCP_OAUTH_REQUIRED_SCOPES="mcp:thalovant"

Use introspection when your authorization server issues opaque tokens:

bash
export MCP_HTTP_AUTH_MODE="introspection"export MCP_OAUTH_INTROSPECTION_URL="https://auth.example.com/oauth2/introspect"export MCP_OAUTH_CLIENT_ID="mcp-server-client"export MCP_OAUTH_CLIENT_SECRET="..."export MCP_OAUTH_AUDIENCE="https://mcp.example.com/mcp"export MCP_OAUTH_AUTHORIZATION_SERVERS="https://auth.example.com/"export MCP_OAUTH_REQUIRED_SCOPES="mcp:thalovant"

The server publishes protected resource metadata at:

text
https://mcp.example.com/.well-known/oauth-protected-resource

401 responses include WWW-Authenticate with a resource_metadata pointer for MCP clients that support OAuth discovery.

Principal Credentials

For multi-user remote deployments, do not share one Thalovant access token across all MCP users. Map each authenticated MCP principal to its own Thalovant control-plane token, runtime identity, and tool policy.

Single file:

bash
export THALOVANT_PRINCIPAL_CREDENTIALS_FILE="/run/secrets/thalovant-principals.json"

Directory mode:

bash
export THALOVANT_PRINCIPAL_CREDENTIALS_DIR="/run/secrets/thalovant-principals"

Directory files are named <sha256(principal-id)>.json. The server checks the OAuth subject, principal id, and client id. See examples/principal-credentials.sample.json.

Keep this disabled for multi-user deployments unless you intentionally want every remote principal to use the server environment's Thalovant credentials:

bash
export THALOVANT_ALLOW_SHARED_CREDENTIALS="false"

Runtime identityFile, configPath, profile, and fromEnv tool arguments are disabled for remote principals by default. Set MCP_HTTP_ALLOW_CLIENT_CREDENTIAL_PATHS=true only for trusted private deployments.

Policy, Audit, And Resumability

Global tool policy:

bash
export MCP_TOOL_ALLOWLIST="thalovant_*"export MCP_TOOL_DENYLIST="thalovant_delete_memory_item"

Per-principal credential files may also include allowedTools and deniedTools.

Both are call-time filters, and an empty allowlist means "allow everything". They cannot make a tool default-off or hide it from tools/list, which is why the two destructive control-plane tools are gated separately by THALOVANT_ENABLE_DESTRUCTIVE_TOOLS. See Destructive Tools.

Audit logs:

bash
export MCP_AUDIT_LOG="stderr" # off, stderr, file, or bothexport MCP_AUDIT_LOG_FILE="/var/log/thalovant-mcp/audit.jsonl"export MCP_AUDIT_INCLUDE_ARGS="false"

Audit entries are JSONL and credential-shaped fields are redacted.

Streamable HTTP resumability defaults to an in-memory event store. Use a file-backed store for single-instance restarts:

bash
export MCP_EVENT_STORE_FILE="/var/lib/thalovant-mcp/events.jsonl"

HTTP Hardening

  • Bearer auth is required unless MCP_HTTP_ALLOW_UNAUTHENTICATED=true is explicitly set.
  • Host headers are allowlisted to reduce DNS rebinding risk.
  • Browser Origin headers are rejected unless they exactly match MCP_HTTP_ALLOWED_ORIGINS.
  • CORS exposes only MCP session/protocol headers.
  • Sessions use cryptographically random ids and are bound to the authenticated principal.
  • Request bodies are capped by MCP_HTTP_MAX_BODY_BYTES, defaulting to 1 MiB.
  • Fixed-window rate limiting defaults to 120 MCP requests per minute per client address.
  • Security headers include nosniff, DENY framing, no referrer, and a restrictive CSP.

Useful HTTP environment variables:

bash
MCP_HTTP_PATH=/mcpMCP_HTTP_RATE_LIMIT_MAX=120MCP_HTTP_RATE_LIMIT_WINDOW_MS=60000MCP_HTTP_SESSION_TTL_MS=3600000MCP_HTTP_MAX_BODY_BYTES=1048576MCP_HTTP_ENABLE_JSON_RESPONSE=falseMCP_HTTP_TRUST_PROXY=false

Claude Desktop

Recommended: authenticate with a scoped API token so the MCP config never contains your account password.

json
{  "mcpServers": {    "thalovant": {      "command": "npx",      "args": ["-y", "@thalovant/mcp-server"],      "env": {        "THALOVANT_API_TOKEN": "tvpat_...",        "THALOVANT_PROFILE": "prod"      }    }  }}

Codex

Use the same stdio command in your MCP client config:

json
{  "mcpServers": {    "thalovant": {      "command": "npx",      "args": ["-y", "@thalovant/mcp-server"],      "env": {        "THALOVANT_API_TOKEN": "tvpat_...",        "THALOVANT_PROFILE": "prod"      }    }  }}

Tools

Read-only:

  • thalovant_config_status
  • thalovant_list_public_hubs
  • thalovant_get_public_hub
  • thalovant_list_hubs
  • thalovant_get_hub
  • thalovant_get_operation
  • thalovant_wait_for_admission
  • thalovant_identity_status
  • thalovant_healthcheck
  • thalovant_intent_inventory
  • thalovant_wait_for_event
  • thalovant_get_analytics_overview
  • thalovant_list_memory_items
  • thalovant_get_memory_summary
  • thalovant_get_memory_item

Skill and runtime-group discovery (read-only):

  • thalovant_list_marketplace_skills
  • thalovant_list_runtime_group_marketplace
  • thalovant_list_runtime_group_inventory
  • thalovant_list_runtime_groups
  • thalovant_get_runtime_group
  • thalovant_get_runtime_group_config
  • thalovant_get_hub_runtime_capabilities

Sign-in (see Device Sign-In):

  • thalovant_begin_device_login
  • thalovant_poll_device_login
  • thalovant_revoke_device_login

Writes or hub events:

  • thalovant_create_client_identity
  • thalovant_ask
  • thalovant_query
  • thalovant_send_action
  • thalovant_send_code
  • thalovant_emit_event
  • thalovant_create_memory_item
  • thalovant_update_memory_item
  • thalovant_delete_memory_item

Hub and runtime-group provisioning:

  • thalovant_create_hub
  • thalovant_update_hub
  • thalovant_release_hub
  • thalovant_set_hub_rating
  • thalovant_clear_hub_rating
  • thalovant_create_runtime_group
  • thalovant_update_runtime_group
  • thalovant_update_runtime_group_config
  • thalovant_release_runtime_group
  • thalovant_install_runtime_group_skill
  • thalovant_uninstall_runtime_group_skill

Hub skills, acting on the hub’s shared runtime (see Hub Skills; the list tool is read-only):

  • thalovant_list_hub_skills
  • thalovant_list_hub_skill_history
  • thalovant_install_hub_skill
  • thalovant_update_hub_skill
  • thalovant_remove_hub_skill

Chat apps (see Chat Apps; the first five are read-only, and thalovant_list_bridge_chats needs hubs:write):

  • thalovant_list_chat_app_connectors
  • thalovant_get_bridge_networks
  • thalovant_list_bridges
  • thalovant_get_bridge
  • thalovant_list_bridge_chats
  • thalovant_pause_bridge
  • thalovant_resume_bridge
  • thalovant_update_bridge
  • thalovant_send_bridge_test_message

Destructive, not registered unless explicitly enabled (see Destructive Tools):

  • thalovant_delete_hub
  • thalovant_delete_runtime_group
  • thalovant_delete_client
  • thalovant_delete_bridge

Tool outputs redact credential-shaped fields. thalovant_create_client_identity does not return secret identity material; pass savePath when you want the full identity written to a local file with mode 0600. savePath is confined to the server's identity directory (THALOVANT_MCP_IDENTITY_DIR, default <config-dir>/thalovant/identities): pass a plain filename, since absolute paths outside that directory and .. traversal are rejected, so a model cannot drop a credential file into a git working tree or synced folder. thalovant_config_status reports the active identityDir.

thalovant_intent_inventory uses the runtime identity and accepts languages, describe, fallback, speakable, sentence, slots, exampleLimit, and a per-query/batch timeoutMs. It returns registered intents and examples, fallback skills, fallbacks_known, listed_in, and may_answer by requested language. listed_in names the hub language each requested language was listed in. A hub lists nothing under a language it did not load, so a language with no sentences is listed in its usual form (en-CA in en-US) or in the closest language the hub loaded, and examples are rendered in that language. When listed_in differs from what was asked, the sentences are in another language, and presentation.notes says so. Fallback skills come from ovos.skills.list, in skill id order, with priority: null: the hub does not say in which order it tries them. A missing or denied fallback-skill query remains unknown, rather than being reported as a known empty list. The optional probe adds at most 1500ms. A silent listing can use engine manifests; disable this with fallback: false. Both new tools are available in read-only mode and respect per-principal policy. thalovant_get_operation reads an operation ID returned by provisioning without replaying the write.

The additive presentation object contains the shared SDK inventory shape: cache_version, hub_id, hub_name, source, generated_at, skills, notes, and languages_present. Skill titles are derived from IDs. Runtime discovery cannot prove catalog locales or hub display metadata, so those fields remain unknown (empty lists/strings), with explanatory notes. Intent language order is explicit and survives JSON key sorting. Each tool call retains its own identity lease; the server does not persist inventory or share a session across callers.

Tool Errors

When the Thalovant API refuses a control-plane call, the tool result is an error whose text starts with the SDK's one-line message (which names the HTTP status and can be shortened) and then says what the API said, in full:

text
Thalovant API request failed with HTTP 403: Only an administrator can run an image the platform does not release: bus may be one of ghcr.io/thalovant/ovos-messagebus:2026.09.2, ... (platform_image_required)code: platform_image_requireddetail: Only an administrator can run an image the platform does not release: bus may be one of ghcr.io/thalovant/ovos-messagebus:2026.09.2, ghcr.io/thalovant/ovos-messagebus:2026.09.3-alpha.1, ghcr.io/thalovant/ovos-messagebus:2026.08.7; core may be any tag or digest of ghcr.io/thalovant/ovos-core.fields: {"allowed_images":{"bus":[...],"core":[...]},"allowed_repositories":{"core":"ghcr.io/thalovant/ovos-core"},"component":"runtime_group","refused_images":{...}}
  • code is the API's machine-readable code, when it sent one.
  • detail is the whole sentence, and appears only when the first line had to shorten it.
  • fields is every other member of the error body as compact JSON (the Problem+JSON type, title, status and instance are left out), with the same secret redaction as every other tool output. A value a validation error echoes back from the request -- each entry's input in a detail or errors list, whatever its key or shape -- is replaced with "[omitted]" there and never reaches the first line. A plan refusal carries resource, limit, used and plan here. A chat app refusal about settings or secrets carries the API's own fields list here: their names, never their values. Its hint repeats the names.

A hint may follow for statuses that need one. A platform_image_required or plan_limit 403 gets its own hint rather than the general scope hint. A 409 skill_unavailable_licensing says the store refuses the skill for its licensing and where the catalog announces it, instead of the version hint. A memory create or update refused with 409 memory_limit (the plan's remembered items are used up; a Free plan keeps one, limit and upgrade_plan are in the fields) names the delete tool that frees a slot, the update tool that changes the item that exists, and the plan to move to; other memory refusals carry the SDK's message alone.

Request hints, embedded audio, and configuration merging

thalovant_ask accepts sttLang, an ordered pipeline, and location with required city and optional region, country, timezone, latitude, and longitude. Hints apply to the current request. Omit unused hints; an empty pipeline is ignored, and blank language or city strings are rejected.

Ask and Query return language, ordered event metadata, hasAudio and droppedMedia. Embedded hex stays out of text output. Opt into separate MCP audio blocks with includeAudio: true; unknown formats become embedded binary resource blocks. Clip and reply limits are 4 MiB and 16 MiB respectively, checked by the SDK before retention. The client owns playback. No skill-supplied path or URL is fetched. Inventory speakable: true renders examples without changing the raw patterns; slots supplies illustrative slot values, and exampleLimit limits examples per language to 1–20 (default 2).

Configuration updates default to merge: true: GET the revision, deep-merge the caller's delta and PUT with expected_revision. Only HTTP 412 retries, with a fresh read and at most three total attempts. This requires hubs:read, hubs:write, and a paid plan. An older API without revision support fails before writing. There is no unconditional fallback. Supplied personas replace; omitted personas stay unchanged. For an intentional full replacement, pass merge: false, requiring hubs:write, a paid plan, and coordination with other writers. Guarded merges reject integers outside JavaScript's safe integer range in the delta or stored configuration before writing. Store large identifiers as strings or use an SDK that preserves large JSON integers.

Destructive Tools

thalovant_delete_hub, thalovant_delete_runtime_group, thalovant_delete_client and thalovant_delete_bridge are disabled by default. They are not merely blocked when called — they are never registered, so they do not appear in tools/list and a model cannot see or attempt them.

A long-lived control-plane token combined with an always-available delete tool is a categorically different risk from a read or update tool: deleting a hub also deletes its dependent clients and ACLs, and none of it is reversible. So these are opt-in:

bash
export THALOVANT_ENABLE_DESTRUCTIVE_TOOLS="true"

Accepted true values are 1, true, yes, and on; anything else, including unset, leaves the tools off. The flag is read when a server instance is created. Restart the server process with the updated environment after changing it. thalovant_config_status reports the current state as destructiveToolsEnabled and lists the tools the flag controls.

This is a separate mechanism from the existing tool policy, deliberately. MCP_TOOL_ALLOWLIST / MCP_TOOL_DENYLIST and the per-principal allowedTools / deniedTools are call-time filters where an empty allowlist means "allow everything"; they cannot express a tool that is off until an operator turns it on, and they cannot hide a tool from tools/list. Once THALOVANT_ENABLE_DESTRUCTIVE_TOOLS is set the delete tools are ordinary tools again and remain subject to that policy, so the two layers compose:

bash
# Register delete tools, then deny their use by every principal.export THALOVANT_ENABLE_DESTRUCTIVE_TOOLS="true"export MCP_TOOL_DENYLIST="thalovant_delete_hub,thalovant_delete_runtime_group"

The global deny applies to every principal and cannot be overridden by a principal's allowedTools. To restrict only selected principals, leave these tools out of the global denylist and use those principals' deniedTools instead.

Deleting a hub still requires a current etag (412 otherwise), and deleting a runtime group fails with 409 while it is the workspace default or still has hubs attached. Deleting a client cuts off the device or link using it; its etag is read first when none is given. Deleting a chat app bridge removes its stored token, so connecting the bot again means pasting the token in the console; to stop a bridge for now, pause it instead.

Non-Catalog Skill Sources

thalovant_install_runtime_group_skill installs from the vetted marketplace catalog by default. Any other source — notably sourceType: "git" with an arbitrary sourceRef repository URL — pulls code the marketplace never reviewed straight into a production runtime, and the control-plane validator is format-only with no host allowlist. Because the tools are driven by a model holding a long-lived token, non-catalog sources are refused unless an operator opts in:

bash
export THALOVANT_ENABLE_GIT_SKILL_SOURCES="true"

With the flag unset, a call with any sourceType other than catalog fails before any control-plane request is made. Accepted true values are 1, true, yes, and on. thalovant_config_status reports the state as gitSkillSourcesEnabled. The tool is annotated destructiveHint: true.

Read-Only Mode

Set THALOVANT_MCP_READONLY=1 to register only tools annotated readOnlyHint: true (the sign-in tools are not among them; thalovant_wait_for_admission is), less those the API serves only to a write scope: thalovant_list_bridge_chats changes nothing but needs hubs:write, which an observe-only agent's token does not carry. Write and destructive tools are then never registered and never appear in tools/list, so an operator can run an observe-only agent without hand-writing a denylist. Like the other registration-time gates it is read when a server instance is created; thalovant_config_status reports the state as readOnly.

HiveMind Runtime Compatibility

Runtime calls sharing the same hub client identity run sequentially within one MCP process. Use a distinct client identity for each independently running MCP server so the hub can keep their sessions separate.

Version 0.7.1 requires @thalovant/sdk ^0.10.0 (0.10.0 through versions below 0.11.0), which carries the chat app methods and ThalovantApiError.fields. Since 0.5.1 the server enforces secure effective MQTT URLs and carries a single connection deadline through MQTT setup and HTTP failure cleanup. Runtime tools support HiveMind v3 Noise over WSS, HTTPS and MQTT over TLS. thalovant_healthcheck reports readiness only after authentication; a reachable hub or broker alone does not establish a runtime session.

The Zod 4 security migration preserves the 50 default tools and string-keyed record values. Its JSON Schema output inlines repeated records, identifies string property names, and omits additionalProperties: false on stripping objects; unknown input keys are still stripped before handlers receive them. UUID validation now enforces standard version/variant bits (plus nil/max UUIDs), and memory-list offsets must be safe integers. See the security audit for evidence and release gates.

Keep the SDK configuration directory persistent and private between server restarts (~/.config/thalovant, or the configured XDG/Windows equivalent). It contains the client Noise key and trusted server pins. An authentication failure preserves those pins; replacing a server key requires an explicit, verified trust change. HTTPS identities must advertise the hub's HTTPS plugin, and MQTT requires the identity's broker credentials and topic prefix.

Runtime tools retain their identity lease through actual cleanup. If the close caller times out, a later tool waits up to six seconds for that cleanup before opening a session. A queued tool that reaches this deadline fails without executing later or releasing the previous session's identity. An actual cleanup failure marks the identity unavailable to later calls instead of risking concurrent sessions. These leases are process-local; separate server processes or replicas need distinct runtime identities or external coordination.

MCP request cancellation applies to queued runtime tools in both stdio and Streamable HTTP mode. A cancelled queued call never constructs a runtime client or executes later. Cancellation also reaches runtime connection setup, Ask, Query and event waits. Action/code sends, raw event publication and inventory queries check cancellation during connection setup, then retain ownership until the admitted SDK operation finishes. Cancelling the MCP request cannot undo an already admitted operation or its effects. The identity remains reserved through that work and actual cleanup; application requests are never automatically replayed. Control-plane tools do not gain runtime cancellation semantics in this release.

For example, an MCP TypeScript client can cancel a runtime query after ten seconds, including time spent waiting for its identity lease:

typescript
await mcpClient.callTool({  name: "thalovant_query",  arguments: { identityFile: "/secure/identity.json", text: "What is the weather?", timeoutMs: 30000 },}, undefined, { signal: AbortSignal.timeout(10000) });

Intent inventory retains its connection setup and per-query/batch budgets plus a separate optional fallback probe; it has no single inventory-wide deadline.

Development

bash
npm run typechecknpm testnpm run buildnpm run test:smokenpm run test:httpnpm run benchnpm run bench:httpnpm pack --dry-run

License

MIT. This is the right default for a public integration server: it is permissive, compatible with the MIT Thalovant Node SDK and MCP TypeScript SDK, and does not force downstream agent or enterprise users into a reciprocal licensing model.

Credential-bearing control-plane calls require HTTPS. Explicit loopback HTTP (localhost, 127.0.0.1, [::1]) remains supported for local development. API redirects are rejected so password-login bodies cannot be forwarded. Runtime clients are constructed only after acquiring their identity lease.

thalovant_query sends a routed HiveMind query; the hub may cascade it according to its routing policy. It accepts text, timeoutMs, lang, sessionId, requestId, queryId, context and replySettleMs, plus the runtime identity options, and returns the same normalized reply shape as thalovant_ask. A query may trigger actions, so read-only mode hides it. Conversation workflows use sessionId with ask/query and the existing event-wait tool; MCP does not expose one tool for every SDK conversation or event-listener method.

Shared-runtime skill management

The catalog has 59 default tools, 28 in read-only mode, and 63 with destructive tools enabled.

Hub-addressed skill methods select the runtime group attached to the hub UUID. Every hub sharing that group sees the same skill changes and history. The API requires a restricted token to cover all served hubs. Reads need hubs:inspect (hubs:read implies it); writes need hubs:write, an eligible paid plan and ownership.

The history response contains newest-first event and operation entries, including nullable actor/version fields. Its limit is 1–200 (50 where omitted). An accepted mutation is not proof the skill is ready. Optional waiting polls the operation, with a 120-second default timeout and two-second interval. Polling never repeats an accepted mutation and starts no new read after its deadline; an already-running HTTP request retains its normal request timeout.

Read history with thalovant_list_hub_skill_history (hubId, optional limit). This tool remains available in read-only mode.

Inventory sentence: true implies speakable rendering and capitalizes/punctuates examples using bundled thalovant-languages 0.2.1 rules. Regional locale matching follows OVOS distances; explicit slots override locale sample values. Complete phrases rank first, and exampleLimit counts unique nonempty rendered results. Raw intent definitions remain in the response; unknown locales retain bare text.

The CLI handles SIGTERM and SIGINT in stdio and HTTP modes, including when it runs as the container's PID 1. It closes sessions and HTTP connections before a successful exit, with a ten-second failure deadline for stalled cleanup.

Version 0.5.1 uses Node SDK 0.7.1 with Python 0.7.4-compatible inventory and question detection, including Unicode question marks and omitted-language patterns. With sentence: true, Spanish questions receive their question mark and complete French phrases keep their final period. Undescribed languages remain bare.

来源:README.md,提交 1bed882

工具

59

thalovant_config_status

Thalovant Config Status

Inspect local Thalovant MCP configuration without revealing secret values.

无需输入参数。

thalovant_list_public_hubs

List Public Hubs

List Thalovant public hubs. This read-only discovery call does not require authentication. Page size is capped at 48.

输入参数limitapiUrlcursor

thalovant_get_public_hub

Get Public Hub

Fetch one public Thalovant hub by id or slug.

输入参数apiUrlhubRef必填

thalovant_list_hubs

List Visible Hubs

List authenticated Thalovant hubs visible to the account.

输入参数limitapiUrlcursorownerIdloginScope

thalovant_get_hub

Get Hub

Fetch one authenticated Thalovant hub by UUID.

输入参数hubId必填apiUrlloginScope

thalovant_get_operation

Get Provisioning Operation

Read the status of an asynchronous control-plane operation returned by provisioning.

输入参数apiUrlloginScopeoperationId必填

thalovant_create_client_identity

Create Client Identity

Create a Thalovant client identity (a hub connection) for a hub. The identity is secret; output is redacted unless savePath is used. Pass connectionType (for example home_assistant) for a connection of that kind: the API must answer with the same kind, or the connection it made instead is deleted and the call fails. A new connection is admitted by its hub in about ninety seconds; follow operationId with thalovant_wait_for_admission before connecting.

输入参数name必填spechubId必填activeapiUrlsiteIdownerIdsavePathloginScopeconnectionTypeidempotencyKeypreferredProtocols

thalovant_wait_for_admission

Wait For Connection Admission

Wait until a hub admits a connection made with thalovant_create_client_identity: about ninety seconds after the create. Follows the operation the create returned (operationId), reading it every pollIntervalMs; a 429 is waited out for the time the API names. outcome is admitted (ready, or an operation the API no longer tracks), failed -- the platform could not admit it (errorCode says why, status is null) or the API refused the wait itself (status, code and detail say what it answered) -- or timeout: timeoutMs passed first and the connection may still be admitted, so call this tool again rather than creating another connection. A token the API refuses (401, 403) or an API out of reach is a tool error of its own, not a failed admission. Omit operationId when the create returned none. Reads only.

输入参数apiUrltimeoutMsloginScopeoperationIdpollIntervalMs

thalovant_begin_device_login

Begin Device Sign-In

Start a device sign-in (RFC 8628) when no API token is configured: a person approves it in a browser. Show the person verificationUri and userCode (or verificationUriComplete, which carries the code), then call thalovant_poll_device_login with loginId every `interval` seconds. The device code stays on this server. Once approved, control-plane tools for this principal use the token it minted. A Home Assistant link asks for hubs:read, clients:read and clients:write, which is also all a Free plan can approve, and signs in as the registered app thalovant-home-assistant (clientId).

输入参数apiUrlscopesclientIdclientName

thalovant_poll_device_login

Poll Device Sign-In

Ask once whether the person approved a device sign-in started with thalovant_begin_device_login. outcome is pending (poll again after `interval` seconds, already lengthened if the API asked to slow down), approved (control-plane tools for this principal now use the token; tokenId, scopes and expiresAt describe it), expired or denied (begin a new sign-in). The token itself is never returned.

输入参数loginId必填

thalovant_revoke_device_login

Revoke Device Sign-In

Sign out: revoke the API token this principal signed in with through thalovant_poll_device_login, and stop using it. A token may always revoke itself, and one already revoked counts as revoked; signing out again answers alreadyRevoked without a request. Tokens configured on the server are never touched.

无需输入参数。

thalovant_identity_status

Identity Status

Load a Thalovant identity and return redacted protocol and endpoint status.

输入参数fromEnvprofileprotocolconfigPathidentityFile

thalovant_healthcheck

Runtime Healthcheck

Connect to a Thalovant hub with a saved identity and return runtime transport health.

输入参数fromEnvprofileprotocoltimeoutMsconfigPathidentityFile

thalovant_intent_inventory

Runtime Intent Inventory

Discover a hub's registered intents, language examples and fallback skills using its runtime identity. listed_in names, per requested language, the hub language the sentences were listed in: a hub lists nothing under a language it did not load, so a language with no sentences is listed in its usual form or the closest language the hub loaded. When listed_in differs from the language asked, tell the user which language the sentences are in. Fallback skills come from ovos.skills.list in skill id order; the hub does not say in which order they are tried, so priority is null. Unknown fallback support remains distinct from a known empty list; answerability is a conservative hint.

输入参数slotsfromEnvprofiledescribefallbackprotocolsentencelanguagesspeakabletimeoutMsconfigPathexampleLimit另有 1 个

thalovant_ask

Ask Hub

Send one text request to a Thalovant hub using a saved identity and return the normalized reply.

输入参数langtext必填contextfromEnvprofilesttLanglocationpipelineprotocolrequestIdsessionIdtimeoutMs另有 5 个

thalovant_query

Query Hub

Send a routed HiveMind query using a saved identity and return the normalized reply. The hub may cascade the query according to its routing policy; a query can trigger actions.

输入参数langtext必填contextfromEnvprofilequeryIdprotocolrequestIdsessionIdtimeoutMsconfigPathidentityFile另有 2 个

thalovant_send_action

Send Action

Send one action to a Thalovant hub using a saved identity, the way a button or a shortcut would. The hub routes payload like a spoken request, so the skill that takes it can change things: switch a light, start a timer, play music. Returns once the action is sent, without waiting for the reply; use thalovant_ask to read the answer. THALOVANT_MCP_READONLY leaves this tool out.

输入参数langtitlecontextfromEnvpayload必填profileprotocolrequestIdsessionIdconfigPathidentityFile

thalovant_send_code

Send Code

Send one exact value to a Thalovant hub using a saved identity: something typed, scanned, a barcode, a QR code or a serial number. The hub receives it as an utterance whose input is marked exact, and a skill that recognizes the value may act on it. Returns once the value is sent, without waiting for a reply. THALOVANT_MCP_READONLY leaves this tool out.

输入参数kindlanglabelvalue必填contextfromEnvprofileprotocolrequestIdsessionIdconfigPathidentityFile

thalovant_emit_event

Emit Event

Emit a raw Thalovant event to a hub. Use only when a more specific runtime tool is not enough.

输入参数datacontextfromEnvprofileprotocoleventType必填configPathidentityFile

thalovant_wait_for_event

Wait For Event

Wait for one named hub event using a saved identity and return it: the first eventName the hub sends once the connection is made, or a timeout error after timeoutMs. sessionId, requestId and context narrow it to events carrying the same values. Listens only: it opens the connection and sends the hub no message, so it changes nothing.

输入参数contextfromEnvprofileprotocoleventName必填requestIdsessionIdtimeoutMsconfigPathidentityFile

thalovant_get_analytics_overview

Analytics Overview

Read authenticated Thalovant analytics overview data.

输入参数hourhubIdrangeapiUrlbucketintentcountrymessagetimeEndweekdayclientIdtimeStart另有 2 个

thalovant_list_memory_items

List Memory Items

List authenticated Thalovant memory items.

输入参数kindhubIdlimitqueryscopeapiUrloffsetownerIdloginScopeincludeDeletedincludeExpired

thalovant_get_memory_summary

Memory Summary

Read authenticated Thalovant memory summary data.

输入参数apiUrlownerIdloginScope

thalovant_get_memory_item

Get Memory Item

Read one authenticated Thalovant memory item.

输入参数apiUrlmemoryId必填loginScope

thalovant_create_memory_item

Create Memory Item

Create an explicit Thalovant memory item.

输入参数kindtagshubIdscopetitleapiUrlsourcecontent必填ownerIdmetadataexpiresAtloginScope另有 3 个

thalovant_update_memory_item

Update Memory Item

Update an explicit Thalovant memory item.

输入参数kindtagstitleapiUrlcontentmemoryId必填metadataexpiresAtloginScopeconsentScopeclearExpiresAtconsentVersion另有 1 个

thalovant_delete_memory_item

Delete Memory Item

Delete one Thalovant memory item.

输入参数apiUrlmemoryId必填loginScope

thalovant_list_marketplace_skills

List Marketplace Skills

Browse the Thalovant marketplace skill catalog. Start here when discovering what a hub could run: each entry carries the fields an install needs (skill_id, source_type, source_ref, package_name, version compatibility, config_schema, secret_schema) plus category, tags, verified, access_tier, and billing_sku. Requires the hubs:read scope and is NOT paid-gated, so a free-tier token can browse the catalog even though it cannot install from it. The response is not paginated — the whole catalog comes back at once.

输入参数apiUrlownerIdloginScopeforceRefreshincludeInactive

thalovant_list_runtime_group_marketplace

List Runtime Group Marketplace

List the marketplace catalog resolved against one runtime group. This is the view to read immediately before installing: every catalog entry comes back with the group's own state folded in — whether the skill is desired (active, version_pin, source_type), whether it was observed running (observed_source, observed_at, intent counts), operator status, and the plan verdict (purchase_required, installable, access_message). Check installable and purchase_required here to avoid a 402 at install time. A skill the store does not install carries unavailable_reason (licensing or unpublished) with installable and purchase_required false, and is listed only when the group already has it. Requires the hubs:inspect scope; browsing needs no paid plan. Answers 404 for an unknown group and 403 when the caller does not own it.

输入参数apiUrlloginScoperuntimeGroupId必填refreshInventory

thalovant_list_runtime_group_inventory

List Runtime Group Inventory

List the skills a runtime group is actually observed running right now. Where thalovant_list_runtime_group_marketplace answers 'what could be installed here', this answers 'what is loaded'. Each entry carries skill_id, version, source, active, adapt_intents, padatious_intents, total_intents, and observed_at; the envelope reports source (ovos-runtime-operator, runtime-group-cache, or ovos-runtime-operator-pending), operator_phase, and operator_message. Unlike thalovant_get_hub_runtime_capabilities this never fails with 409 when nothing is reporting — it returns an empty list with a pending source. Requires the hubs:inspect scope; no paid plan needed.

输入参数apiUrlrefreshloginScoperuntimeGroupId必填

thalovant_create_hub

Create Hub

Create a Thalovant hub. Requires the hubs:write scope AND a paid plan: a token without the scope fails 403, and because the scope is checked before the plan, granting the scope can then surface a 402 'API access requires a paid plan'. The create is idempotent — the SDK sends an Idempotency-Key, so a retried create returns the first hub rather than making a second one; reusing a key with a DIFFERENT body fails 409.

输入参数name必填slugspec必填activeapiUrldomainownerIdisLockednamespaceloginScopevisibilityidempotencyKey另有 2 个

thalovant_update_hub

Update Hub

Partially update a Thalovant hub. Send ONLY the fields you are changing — do not round-trip a whole hub resource. name, namespace, and domain are immutable and are deliberately not accepted here; the API rejects a changed value with HTTP 400. This route uses optimistic locking and requires the hub's current etag, which lives in the hub resource BODY (there is no ETag response header), so call thalovant_get_hub first and pass the etag field from its response. A missing or stale etag fails 412 and changes nothing. Requires the hubs:write scope and a paid plan.

输入参数etag必填slugspechubId必填activeapiUrlownerIdisLockedloginScopevisibilityruntimeGroupIdcapacityProfile

thalovant_release_hub

Release Hub

Apply a release policy to a hub and return the updated hub. Every option is optional; omitted fields fall back to the workspace release policy. Passing images switches the hub to custom mode unless mode is also set; non-admins may pass only images the platform releases (see images). Requires the hubs:write scope and a paid plan. No etag is needed.

输入参数modehubId必填apiUrlimagesreasonchannelversionloginScope

thalovant_set_hub_rating

Set Hub Rating

Rate a public Thalovant hub from 1 to 5 and return the updated hub. Requires the hubs:write scope; no paid plan is needed, so free-tier tokens can rate. Rating a non-public hub fails 400 "Only public hubs can be rated." and rating your own hub fails 400 "Hub owners cannot rate their own public hubs."

输入参数hubId必填apiUrlrating必填loginScope

thalovant_clear_hub_rating

Clear Hub Rating

Remove the caller's own rating from a public Thalovant hub and return the hub. This clears only the caller's rating, not the hub. Requires the hubs:write scope; no paid plan is needed.

输入参数hubId必填apiUrlloginScope

thalovant_get_hub_runtime_capabilities

Get Hub Runtime Capabilities

Read the live skill and intent inventory a hub runtime exposes. Requires the hubs:inspect scope. The API answers HTTP 409 when the hub has no connected client that can report inventory — for a group-level view that returns an empty list instead of failing, use thalovant_list_runtime_group_inventory.

输入参数hubId必填apiUrlloginScope

thalovant_list_runtime_groups

List Runtime Groups

List the Thalovant runtime groups visible to the authenticated account. Requires the hubs:read scope. The response is not paginated — every visible group is returned at once.

输入参数apiUrlownerIdloginScope

thalovant_get_runtime_group

Get Runtime Group

Fetch one Thalovant runtime group. Requires the hubs:read scope.

输入参数apiUrlloginScoperuntimeGroupId必填

thalovant_create_runtime_group

Create Runtime Group

Create a Thalovant runtime group — the unit that hosts hubs and holds installed skills. Requires the hubs:write scope and a paid plan. Unlike the hub write routes this one takes no etag.

输入参数name必填apiUrlownerIdloginScopedescriptionenvironmentcloneFromDefault

thalovant_update_runtime_group

Update Runtime Group

Update a Thalovant runtime group's name, description, or spec. spec patches replicas and container resources. This route does NOT use If-Match, so no etag is required. Requires the hubs:write scope and a paid plan.

输入参数namespecapiUrlloginScopedescriptionruntimeGroupId必填

thalovant_get_runtime_group_config

Get Runtime Group Config

Read a Thalovant runtime group's runtime configuration and personas. Requires the hubs:read scope. The revision returned by this call is used by safe configuration merges.

输入参数apiUrlloginScoperuntimeGroupId必填

thalovant_update_runtime_group_config

Update Runtime Group Config

Merge runtime configuration into a Thalovant runtime group. The SDK reads and deep-merges config, then writes with a revision precondition. Only explicit HTTP 412 conflicts retry, at most three attempts; older APIs fail before a write. Set merge=false for explicit unconditional replacement. personas, when provided, is REPLACED wholesale rather than merged; omit it to leave stored personas untouched. Requires hubs:read and paid hubs:write for merging; replacement needs paid hubs:write.

输入参数mergeapiUrlconfig必填personasloginScoperuntimeGroupId必填

thalovant_release_runtime_group

Release Runtime Group

Apply a runtime image policy to a Thalovant runtime group and return the updated group. Options behave like thalovant_release_hub: everything is optional, omitted fields fall back to the workspace release policy, and passing images switches to custom mode unless mode is also set (non-admins: only images the platform releases, see images). Requires the hubs:write scope and a paid plan.

输入参数modeapiUrlimagesreasonchannelversionloginScoperuntimeGroupId必填

thalovant_install_runtime_group_skill

Install Runtime Group Skill

Install (or re-install) a skill in a Thalovant runtime group from the marketplace catalog. Installing a skill that is already present updates the existing entry rather than failing. Discover skillId with thalovant_list_marketplace_skills, then confirm installable/purchase_required with thalovant_list_runtime_group_marketplace before calling this. Requires the hubs:write scope and a paid plan (402 'API access requires a paid plan'); a paid marketplace skill ALSO needs marketplace access on the tenant plan, which fails with a second, distinct 402 about paid marketplace access. Only catalog sources are allowed by default: installing from a non-catalog source such as sourceType "git" runs code the marketplace never vetted and is refused unless the operator sets THALOVANT_ENABLE_GIT_SKILL_SOURCES.

输入参数activeapiUrlskillId必填sourceRefloginScopesourceTypeversionPinruntimeGroupId必填marketplaceSkillId

thalovant_uninstall_runtime_group_skill

Uninstall Runtime Group Skill

Remove one skill from a Thalovant runtime group. This removes only the named skill; the runtime group and its other skills are untouched. Requires the hubs:write scope and a paid plan.

输入参数apiUrlskillId必填loginScoperuntimeGroupId必填

thalovant_list_hub_skill_history

List Hub Skill History

Read newest-first skill events and operations for the runtime group attached to a hub. This history is shared by all hubs using that runtime. Requires hubs:inspect (hubs:read implies it); restricted tokens must cover all served hubs. Returns event/operation kind, timestamps, versions, actors and outcome fields. No changes are made.

输入参数hubId必填limitapiUrlloginScope

thalovant_list_hub_skills

List Hub Skills

List the skills installed on the runtime group attached to a Thalovant hub. Returns the whole envelope: hub_id, runtime_group_id, observed_at, source, the runtime's phase and message, and data — one row per skill with version, version_pin, installed_version, observed_version, previous_version, latest_version, available_version, update_available, changelog, active, state (pending, installed, failed, removing, drifted, quarantined, unmanaged; a change in progress shows as pending), the runtime's last error and last_transition_at. The hub UUID selects its attached runtime group. Skills and changes are shared by every hub using that group; restricted tokens must cover all served hubs. hubId must be the hub UUID — the authenticated hub routes reject slugs; a hub with no runtime group attached fails 404 with code hub_without_runtime_group. Requires the hubs:inspect scope (hubs:read implies it); hub-restricted tokens only see the hubs in their allowlist.

输入参数hubId必填apiUrlloginScope

thalovant_install_hub_skill

Install Hub Skill

Install a skill on the runtime group attached to a Thalovant hub. All hubs sharing that runtime group are affected. The change applies live on the hub in about 15 seconds, with no hub restart; a hub may start with no skills and gain them one at a time. Discover the skill name with thalovant_list_marketplace_skills. The API answers 202 with an operation_id and state "installing": pass wait: true to poll the operation until it converges (state "installed", or an error carrying the operation's failure message), with a 120 s default timeout; otherwise follow it with thalovant_get_operation. The 202 body also carries hub_id, runtime_group_id and previous_version. Installing a skill that is already installed at ANOTHER version performs an update; the SAME version fails 409 with code skill_version_already_installed. Fails 404 with code hub_without_runtime_group when the hub has no runtime group attached yet, and 422 when "latest" cannot be resolved or the version string is invalid. hubId must be the hub UUID — the authenticated hub routes reject slugs. Requires the hubs:write scope and a paid plan; scope is checked before plan, so a free-plan token sees 403, never 402. A hub-restricted token must cover every hub sharing the affected runtime group.

输入参数waithubId必填skill必填apiUrlversiontimeoutMsloginScope

thalovant_update_hub_skill

Update Hub Skill

Move a skill already installed on the runtime group attached to a Thalovant hub to a specific version (not a runtime group or skill set). The change applies live on the hub in about 15 seconds, with no hub restart. version is required — read the current version and latest_version from thalovant_list_hub_skills. The API answers 202 with an operation_id, hub_id, runtime_group_id, previous_version and state "updating": pass wait: true to poll the operation until it converges (state "installed", or an error carrying the operation's failure message), with a 120 s default timeout; otherwise follow it with thalovant_get_operation. Fails 404 when the skill is not installed on the hub (code hub_without_runtime_group when the hub has no runtime group), 409 with code skill_version_already_installed when it is already at that version, and 422 for an invalid version. hubId must be the hub UUID — the authenticated hub routes reject slugs. Requires the hubs:write scope and a paid plan; scope is checked before plan, so a free-plan token sees 403, never 402. A hub-restricted token must cover every hub sharing the affected runtime group.

输入参数waithubId必填skill必填apiUrlversion必填timeoutMsloginScope

thalovant_remove_hub_skill

Remove Hub Skill

Remove one skill from the runtime group attached to a Thalovant hub. Every hub sharing the runtime loses this skill; other skill attachments are unchanged, and the change applies live on the hub in about 15 seconds with no hub restart. The API answers 202 with an operation_id, hub_id, runtime_group_id, previous_version (version is null) and state "removing": pass wait: true to poll the operation until it converges (state "removed", or an error carrying the operation's failure message), with a 120 s default timeout; otherwise follow it with thalovant_get_operation. Fails 404 when the skill is not installed on the hub (code hub_without_runtime_group when the hub has no runtime group). hubId must be the hub UUID — the authenticated hub routes reject slugs. Requires the hubs:write scope and a paid plan; scope is checked before plan, so a free-plan token sees 403, never 402. A hub-restricted token must cover every hub sharing the affected runtime group.

输入参数waithubId必填skill必填apiUrltimeoutMsloginScope

thalovant_list_chat_app_connectors

List Chat App Connectors

List the chat apps a hub can answer in (GET /v1/bridges/connectors): Telegram and Discord, and Matrix, Mattermost or Twitch when they are listed. Each has status (offered, or beta), offered (whether a bridge can be created for it now), its description and setup steps in the language asked (English where there is no French), the secrets the console asks for (key, label, required: names only, never a value), the settings form, what a chat id looks like (targets: label, pattern, max, lowercase, strip_prefix), require_mention_fixed, the session scopes, and its helpers: with discover, thalovant_list_bridge_chats lists the chats (otherwise ids are typed); with test_message, thalovant_send_bridge_test_message works. Creating a bridge, and pasting or replacing its token or secrets, happen only in the Thalovant console (Connections > Add connection > Chat apps, or the hub's Chat apps tab): no tool takes a token or secret. Requires the hubs:read scope. Reads only.

输入参数apiUrllanguageloginScope

thalovant_get_bridge_networks

Get Chat App Allowance

Show which chat networks are offered and the plan's chat-app allowance (GET /v1/bridges/networks): networks (network, name, status offered or beta, offered) and allowance (plan, paid_plan, limit, used: bridges set up or running, remaining, can_create: whether a new bridge would pass the plan checks, saying nothing about a token). Free plans get 0. With hubId the allowance is the hub owner's, since bridges count against the owner; otherwise the caller's. summary says it in words. Read it before suggesting a new chat app or resuming one the plan paused. Requires the hubs:read scope. Reads only.

输入参数hubIdapiUrlloginScope

thalovant_list_bridges

List Chat App Bridges

List chat app bridges (GET /v1/bridges): one hub's with hubId, otherwise every bridge the token may see (its own, and those of workspaces where it is a member above basic); ownerId narrows that to one owner. Each bridge has its network and connector, state (setup or active), the chats it answers in (allowed), require_mention, session_scope, paused, hold (why the platform paused it: plan_limit or account_suspended; null for the owner's own pause), the bot, its invite links, secrets_set (which secrets are stored, by name), its etag, and status: reason (Setup, Starting, Connected, Paused, Unavailable, TokenMissing, TokenRejected), phase, ready, applied (whether the latest change has reached the bridge) and summary, the status in plain words. The platform's own diagnostic message is never included. Requires the hubs:read scope. Reads only.

输入参数hubIdlimitapiUrlownerIdloginScope

thalovant_get_bridge

Get Chat App Bridge

Fetch one chat app bridge (GET /v1/bridges/{id}) with the same fields as thalovant_list_bridges: status.reason, phase, ready, applied and summary (the status in plain words), hold, the chats it answers in, and the etag the write tools accept. The platform's own diagnostic message is never included. Requires the hubs:read scope. Reads only.

输入参数apiUrlbridgeId必填loginScope

thalovant_list_bridge_chats

List Bridge Chats

List the chats, channels or rooms a bridge's bot can see (GET /v1/bridges/{id}/chats), to choose from for allowed in thalovant_update_bridge. Each row has id, title, kind, the Discord server (guild_id, guild_name), allowed (it already answers there), and selectable (false for an encrypted room it cannot read). manual_entry true means this chat app cannot list its chats: type the ids instead, matching targets.pattern from thalovant_list_chat_app_connectors. Telegram lists only chats that wrote to the bot in the last 24 hours, and only while the bridge is paused (409 bridge_running otherwise): pause it with thalovant_pause_bridge, send /start@<bot username> in the new group, list, choose with thalovant_update_bridge, then resume. Listing is rate-limited per bridge. It changes nothing, but because it asks the chat network on the bot's behalf it needs the hubs:write scope, a paid plan, and the hub's owner or a workspace manager (403 for a hubs:read token, 402 on a plan without chat apps); THALOVANT_MCP_READONLY leaves it out.

输入参数apiUrlbridgeId必填loginScope

thalovant_pause_bridge

Pause Chat App Bridge

Pause a chat app bridge (PATCH /v1/bridges/{id} with paused: true): it stops answering in every chat until resumed, and keeps its chats, settings and token. Always allowed, whatever the plan. Returns the bridge; status.reason turns Paused once the bridge has stopped. Requires the hubs:write scope, and the hub's owner or a workspace manager.

输入参数etagapiUrlbridgeId必填loginScope

thalovant_resume_bridge

Resume Chat App Bridge

Resume a paused chat app bridge (PATCH /v1/bridges/{id} with paused: false). Needs a paid plan with room for one more running bridge: 402 on a plan without chat apps, 403 plan_limit when its running bridges are already at the limit (thalovant_get_bridge_networks shows the allowance). A bridge paused because the account was deactivated (hold account_suspended) resumes when the account is reactivated. A bridge with no chats yet (status Setup) starts only once thalovant_update_bridge sets allowed. Returns the bridge; status.reason turns Connected once it runs. Requires the hubs:write scope, and the hub's owner or a workspace manager.

输入参数etagapiUrlbridgeId必填loginScope

thalovant_update_bridge

Update Chat App Bridge

Change where and how a chat app bridge answers (PATCH /v1/bridges/{id}); send only what changes, at least one of allowed, requireMention, sessionScope and settings. allowed REPLACES the whole list of chats, channels or rooms the bridge answers in (1-50, never empty: pause it instead): keep the current ones from thalovant_get_bridge, add rows from thalovant_list_bridge_chats, or type ids matching the chat app's targets.pattern. Setting allowed the first time starts a bridge in setup. requireMention false makes it answer every message in its groups, which spends the daily allowance faster; a Discord bridge always needs a mention (422 bridge_mention_required). sessionScope person gives each person a conversation of their own, chat one per chat. settings are the chat app's non-secret settings (its settings form in thalovant_list_chat_app_connectors), merged into the stored ones and checked again; an address must be https on port 443 with a public host. A token or secret is never a setting: a setting name that looks like one is refused here before any request, and tokens and secrets are replaced in the Thalovant console: open the bot from Connections or the hub's Chat apps tab and use Replace token. To pause or resume, use thalovant_pause_bridge or thalovant_resume_bridge. Needs a paid plan. Requires the hubs:write scope, and the hub's owner or a workspace manager.

输入参数etagapiUrlallowedbridgeId必填settingsloginScopesessionScoperequireMention

thalovant_send_bridge_test_message

Send Bridge Test Message

Post a short "Connected to <hub>." message, in the hub's language, in one of a chat app bridge's allowed chats (POST /v1/bridges/{id}/test). Everyone in that chat sees it. chatId must be in the bridge's allowed list (422 bridge_chat_not_allowed otherwise). Only chat apps with the test_message helper have one (Telegram and Discord; 409 bridge_helper_unavailable otherwise: mention the bot in the chat instead). A few test messages an hour per bridge; past that, 429 says how long to wait. Needs a paid plan. Requires the hubs:write scope, and the hub's owner or a workspace manager.

输入参数apiUrlchatId必填bridgeId必填loginScope

版本历史

12
  1. v0.7.1Nov 7, 2026
  2. v0.7.0Nov 3, 2026
  3. v0.6.6Oct 26, 2026
  4. v0.6.5Oct 23, 2026
  5. v0.6.4Oct 19, 2026
  6. v0.6.3Oct 11, 2026
  7. v0.6.2Oct 2, 2026
  8. v0.6.1Sep 29, 2026
  9. v0.6.0Sep 28, 2026
  10. v0.5.3Sep 27, 2026
  11. v0.5.2Sep 19, 2026
  12. v0.5.1Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分