Muvia BI
Truy vấn dữ liệu công ty và máy móc bằng SQL, đồng thời xây dựng bảng điều khiển, báo cáo và cảnh báo; các thao tác ghi tuân theo chính sách phê duyệt.
Máy chủ MCP được lưu trữ
npx add-mcp 'https://api.muviabi.com/mcp/v1'Cài vào Claude Code, Codex, Cursor và nhiều công cụ khác
Tài liệu
MCP server
Muvia runs an MCP (Model Context Protocol) server so that AI assistants and agents can use Muvia directly: look up projects, read data, run queries and propose changes. It is the richest way in; the REST API is the simple, read-only one.
Endpoint
https://api.muviabi.com/mcp/v1
The transport is JSON-RPC 2.0 over HTTP POST. Send Content-Type: application/json and Accept: application/json, text/event-stream; the answer arrives as a server-sent event with one data: line holding the JSON-RPC response. The protocol version is 2025-06-18. A complete exchange is in the Agent quickstart.
Authentication
| Who | How |
|---|---|
| A person's assistant (Claude, ChatGPT, an IDE) | OAuth. The person adds the URL as a connector, signs in to Muvia and grants scopes. The assistant acts as that person. |
| An integration or agent without a person | An mvk_ API key, sent as Authorization: Bearer $MUVIA_API_KEY. It acts as the key, in the key's company, within the key's scopes. |
API keys are the same keys the REST API uses (X-Api-Key); see Authentication.
Listing tools
Send tools/list. Every tool has a name, a description, an inputSchema (JSON Schema) and annotations. Call whoami first, then list_projects: every other tool acts inside one project. If your client cannot search a long tool list, find_tools names the tools of an area (datasets, signals, nodes, alarms, dashboards, analyses, reports, documents, predictors).
MCP tools lists every tool of the server, by area: what it does, whether it reads or writes, its write mode and its arguments. tools/list answers the same tools, narrowed to what your key or connection may use.
Tools return their result as structuredContent (an object) and as text in content. Tables are {"columns": [...], "rows": [[...]]}. A failure is a result with isError: true, not an HTTP error.
Annotations: reads and writes
| Annotation | Meaning |
|---|---|
readOnlyHint: true | The tool only reads. Safe to call freely. |
no readOnlyHint (with destructiveHint: false) | The tool writes: it creates or changes something. |
destructiveHint: true | The tool writes and deletes or cannot be undone. Ask the person before calling it. |
All tools carry openWorldHint: false: they act on Muvia only.
Writes
A write tool does not change Muvia on the spot. It files a proposal, and what happens next is the company's policy for that kind of change:
- Ask for confirmation: the answer is
{"status": "pending", "action_id", "approve_url", "summary", "needs_admin"}. Nothing has changed. A person opensapprove_urlin Muvia and approves or discards it. Give them the link; do not retry. - Run immediately: the answer is
{"status": "applied", "action_id", "id", "url"}. The change is made andurlopens it in Muvia.
Either way, get_action with the action_id tells what became of the proposal: pending, applied (with its result), discarded, stale, expired or failed (with a reason). Anything that needs an administrator waits for one, whatever the policy.
Writes by a key
A key writes only when an administrator has turned on «Can write through assistants» on it, in Settings › Company › API keys. It is off by default, and the key's scopes still apply: a key without analysis_annotate cannot annotate, whatever the policy says. Without the switch, a write tool answers with isError: true and this text, and reads are unaffected:
This API key can only read. To propose or make changes through an assistant, an administrator must turn on «Can write through assistants» on the key, in Settings › Company › API keys.
Some tools stay a person's even for a writing key and answer «Only a person can do this: connect the assistant with your own account.» They are: a person's own notes and the browser drop link. Changes that belong to the person who makes them are always proposed by a key, whatever the policy, and the person who confirms them applies them and owns the result: creating, editing, sharing or deleting an analysis; a notebook made from an analysis; public links to an analysis, a dashboard or a notebook; annotations and event notes; creating a project; Athena's memory; running a notebook; acknowledging, shelving, unshelving or noting an alarm. Writes that need an administrator always wait for one. Everything else (dashboards, datasets, flows, channels and the rest) follows the company's policy.
A change made by a key appears in Muvia as authored by «API key» and the key's name. A proposal that a person confirms is applied as that person. A person's OAuth assistant writes within the scopes the person granted.
whoami
The REST GET /v1/whoami answers the same writes for a key, as mcp.writes. This tool answers who the connection acts as and what it may do:
| Field | Meaning |
|---|---|
kind | api_key for a key, user for a person's assistant. |
company | {id, name} of the company. |
key | For a key: {name, created_by}. |
user | {id, email} of the person, or null for a key. |
client | {client_id, name} of the assistant application, or null for a key. |
scopes | The scopes the connection holds. |
permissions | The permissions those scopes resolve to. |
writes | A boolean: whether this connection may write through MCP. For a key, whether «Can write through assistants» is on. |
{
"kind": "api_key",
"company": { "id": "6aa95e431b5b18b1850a2a21", "name": "ACME srl" },
"user": null,
"client": null,
"key": { "name": "Reporting agent", "created_by": "Anna Rossi" },
"scopes": ["datasets_read", "settings_read"],
"permissions": ["datasets_read", "settings_read"],
"writes": false
}
Limits and errors
Each key has its own limits. Reads share the REST per-key per-minute limit (the same number as REST; see Rate limits); writes are limited to 30 per minute per key. Past a limit the tool answers isError: true with «This key made too many requests in a minute: try again in N seconds.» or «This key made too many changes in a minute: try again in N seconds.» Wait that long.
A call that cannot run answers isError: true; a malformed JSON-RPC request answers a JSON-RPC error. A missing, wrong or expired key answers HTTP 401.