Skip to main content
Glama

Muse-Chat-MCP

Use Meta Muse — the muse.ai "Hatch" agent — from any MCP client or any OpenAI-compatible client, with your own account and quota.

Muse has no public API: its chat is an encrypted WebSocket (wss://hatch.metaaivm.com/v1/noise, an X25519 + HKDF + AES‑GCM + Ed25519 Noise transport). So instead of re‑implementing the protocol, this project drives your real, logged‑in Chrome with Playwright: the app performs all the crypto itself, and we type into the composer and read the rendered reply.

That gives you two front doors:

Front door

What it is

Use it from

MCP server (stdio)

7 tools: muse_status, muse_login, muse_new_chat, muse_chat, muse_read_last, muse_dump_dom, muse_close

Claude Desktop, opencode, Cursor, any MCP host

OpenAI-compatible shim (HTTP)

GET /v1/models, POST /v1/chat/completions (stream + non-stream, tool calling)

any OpenAI SDK / @ai-sdk/openai-compatible provider

Plus a tiny CLI (muse-cli.mjs) for one-shot generation from scripts.

IMPORTANT

This drivesyour browser and your Muse account. It ships with no credentials, no Chrome profile, and no captured traffic — you sign in to your own Meta account on first run. See Disclaimer.


Features

  • MCP tools over stdio — drop-in for Claude Desktop / opencode / any MCP host.

  • OpenAI-compatible HTTP shim with real streaming (SSE), correct finish_reason, and /v1 error objects.

  • Prompt-injected tool calling — expose OpenAI tools to Muse and get tool_calls back.

  • Attachments — send images/video with a prompt (MCP files, OpenAI image_url parts, CLI -f).

  • Sessions & media — list/open/read/send in any Muse chat, and pull out the images/videos Muse generates (links + download).

  • Muse Manual — a living guide to Muse's video/image/content capabilities at manual/MUSE_MANUAL.md, regenerated with node manual/interview.mjs.

  • Reuses your existing login via a dedicated Chrome profile, or attaches to a Chrome you already run with --remote-debugging-port=9222.

  • Never kills your browser: when attached over CDP it only disconnects on close.

  • Resilient: if the profile is locked by a running Chrome, it auto-attaches over CDP instead of failing.

  • Correct streaming: only stable, monotonic text is emitted, so a rewrite mid-answer never duplicates.

  • No browser download — it uses your installed Chrome via playwright-core.


Related MCP server: Background AI Chat MCP Server

Requirements

  • Node.js ≥ 18 (tested on v24).

  • Google Chrome (or Edge) installed.

  • A Meta account with access to Muse.

  • Windows / macOS / Linux (paths in the examples are Windows; adjust for your OS).


Install

git clone https://github.com/duclm1x1/Muse-Chat-MCP.git
cd Muse-Chat-MCP
npm install

npm install only pulls playwright-core (a library) — it does not download a browser.

First run (log in once)

npm run selftest          # launches Chrome, prints login/browser state, then closes

A Chrome window opens to https://muse.ai. Sign in with your Meta account. The session is stored in a dedicated profile (.muse-profile/, git-ignored) and reused afterwards. When muse_status reports "loggedIn": true, you're ready.


Use it as an MCP server

opencode

Add to ~/.config/opencode/opencode.jsonc:

{
  "mcp": {
    "muse": {
      "type": "local",
      "command": ["node", "/absolute/path/to/Muse-Chat-MCP/muse-server.mjs"],
      "enabled": true,
      "timeout": 300000
    }
  }
}

The timeout is the tool-listing timeout at startup, not per-call — long muse_chat calls are fine.

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "muse": {
      "command": "node",
      "args": ["/absolute/path/to/Muse-Chat-MCP/muse-server.mjs"],
      "env": { "MUSE_PROFILE_DIR": "/absolute/path/to/Muse-Chat-MCP/.muse-profile" }
    }
  }
}

MCP tools

Tool

Arguments

Returns

muse_status

–

browser / login / composer state

muse_login

timeout_sec?

waits for Meta sign-in to complete

muse_new_chat

–

navigates to the home composer

muse_chat

prompt, timeout_sec?, new_thread?, files?, chat?

{ reply, messages, threadUrl, elapsedMs, … }

muse_read_last

–

latest assistant message (no send)

muse_chats

query?

list chats (Main chat / Channels / Side chats), optional title filter

muse_open_chat

target

open a chat (title, index, URL, or id)

muse_read_chat

chat?, max?

messages of a chat (all roles, with media links)

muse_media

chat?, download?, dir?

image/video/attachment links from a chat (optionally downloaded)

muse_dump_dom

max_chars?

element counts + transcript HTML (selector debugging)

muse_close

–

closes the browser (disconnect-only if CDP-attached)

Typical flow: muse_status → (if needed muse_login) → muse_chat { prompt }.

Attachments (images & video)

muse_chat accepts a files array — absolute paths or URLs — and attaches them to the message before sending:

{ "name": "muse_chat", "arguments": { "prompt": "What is in this image?", "files": ["C:\\path\\frame.jpg", "https://host/clip.mp4"] } }

Muse accepts images, video and documents (the composer's file input has no accept filter). Files are set directly on the hidden composer input — no OS file dialog.

Sessions (multiple chats)

Muse has a Main chat plus Channels and Side chats (each a muse.ai/thread/<id>). List them, then target any one for reading or sending:

  • MCP — muse_chats, muse_open_chat { target }, muse_read_chat { chat?, max? }, and muse_chat { …, chat } where the target is a title, index, thread URL, or thread id.

  • HTTP — GET /v1/muse/chats (list) and GET /v1/muse/chat?target=<name|index|url>&max=100 (read); send with header x-muse-chat: <name|index|url> (or body chat).

  • CLI — --list-chats, --read [<chat>], --chat <chat>.

Muse can generate images/video inside a chat (it replies with share links) — use a session read or the media tools to retrieve them.

Media (generated images & video)

When asked, Muse makes media and replies with a share link (https://muse.ai/files/<…>/….mp4|.png). Extract and download them:

  • MCP — muse_media { chat?, download?, dir? }.

  • HTTP — GET /v1/muse/media?target=<chat>&download=1&dir=<dir>.

  • CLI — --media [<chat>] [--download] [--dir <dir>].

Links are public (anyone with the link can view) but expire (~2 days) — download to keep them.


Use the OpenAI-compatible shim

muse-server.mjs starts the shim automatically on port 8787 (disable with MUSE_SHIM_PORT=0). Run it stand-alone (HTTP only, no MCP) with node muse-server.mjs --serve-only.

Route

Purpose

GET /v1/models

model list

POST /v1/chat/completions

chat completions (stream + non-stream, tools)

GET /health

browser / login state

GET /v1/muse/chats

list Muse chats

GET /v1/muse/chat?target=…

read a chat (optionally opening it first)

GET /v1/muse/media?target=…

media links in a chat (add download=1 to save)

curl http://127.0.0.1:8787/v1/models

curl http://127.0.0.1:8787/v1/chat/completions \
  -H "content-type: application/json" \
  -d '{"model":"muse-spark-1.3","messages":[{"role":"user","content":"Summarize what Muse is in 2 sentences."}]}'

Any OpenAI client

from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8787/v1", api_key="muse-local")
r = client.chat.completions.create(
    model="muse-spark-1.3",
    messages=[{"role": "user", "content": "Write a haiku about browsers."}],
    stream=True,
)
for chunk in r:
    print(chunk.choices[0].delta.content or "", end="")

opencode provider

"provider": {
  "muse-local": {
    "npm": "@ai-sdk/openai-compatible",
    "name": "Muse (local shim)",
    "options": { "baseURL": "http://127.0.0.1:8787/v1", "apiKey": "muse-local" },
    "models": {
      "muse-spark-1.3": { "name": "Muse Spark 1.3" },
      "muse": { "name": "Muse" }
    }
  }
}

Shim behavior

  • Real streaming — DOM text is re-emitted as OpenAI deltas. Only text that is a monotonic extension and has been stable for MUSE_STREAM_QUIET_MS (default 600 ms) is emitted; the remainder is flushed at the end. Each stream ends with exactly one finish_reason, then [DONE].

  • Tools — prompt-injected. Tool schemas are embedded with a decision-only rule ("do not execute"), so Muse returns {"tool_calls":[{"name","arguments"}]} instead of trying to actually run the action. Parsed into OpenAI tool_calls (finish_reason: "tool_calls"). Best-effort, not a native function-calling API.

  • Attachments — send images/video via OpenAI multimodal content ({"type":"image_url","image_url":{"url":…}}) or a top-level files array (local paths / URLs / data-URIs). Muse sees them like a normal chat attachment.

  • Plain message — the shim sends the latest user message verbatim: no ### USER/### ASSISTANT role markers and no "continue the conversation" wrapper. Muse flags roleplay-style wrappers as prompt-injection and refuses them, so the bridge never adds any. Prior context comes from Muse's own thread.

  • Sessions — target a chat with header x-muse-chat: <title|index|url> (or body chat); read chats via GET /v1/muse/chats and GET /v1/muse/chat.

  • Headers — x-muse-thread: new (navigate to / first), x-muse-timeout-ms.


Use the CLI

muse-cli.mjs talks to the shim (reusing a running one, or auto-starting --serve-only and shutting it down after).

node muse-cli.mjs "Explain what a B-tree is in 2 sentences."          # streams to stdout
node muse-cli.mjs --no-stream -s "Output ONLY raw code." "Write ..."   # exact final code
node muse-cli.mjs -f ./frame.jpg "Write a Facebook caption for this image."  # attach image/video
node muse-cli.mjs --list-chats                                        # list Muse chats
node muse-cli.mjs --read "Video creation capability"                  # read a chat
node muse-cli.mjs --chat "Reply with pong" "hi"                       # send into a chat
echo "<file>" | node muse-cli.mjs -s "Review this file"                # stdin prompt
npm run muse -- "hello"                                                # via package.json

Options: -s/--system, -m/--model, -t/--timeout, -f/--file <path|url> (repeatable), --chat <name|index|url>, --list-chats, --query <text>, --read [<chat>], --media [<chat>], --download, --dir <dir>, --new-thread, --no-stream, --json, --base (or env MUSE_SHIM_URL).


Architecture

MCP client (Claude Desktop / opencode / …)      OpenAI client (SDK / opencode provider)
        │ stdio (JSON-RPC)                                │ HTTP  /v1/*
        ▼                                                  ▼
   muse-server.mjs  ───────────►  muse-openai-shim.mjs  ────┘
        │  (MCP tools)                   (SSE + JSON)
        └──────────────┬──────────────────────────┘
                       ▼
                 muse-driver.mjs        playwright-core
                       ▼
        Chrome (dedicated profile ./.muse-profile)  ──►  https://muse.ai

Why a browser driver?

Captured from a real session (endpoints + WS frames), Muse chat is not REST/SSE:

Signal

Value

App

Next.js on Vercel, fronted by Meta fwdproxy

Auth

cookie-based: POST /api/auth/check → { ok, access_token, viewer_id }

Session

GET /api/session → assigned VM wss://<vm_id>.metaaivm.com/

Wake

POST /api/hatch/vm/wake

Chat transport

WebSocket wss://hatch.metaaivm.com/v1/noise — RPC methods chat.stream, chat.history, chat.mark_seen

Frames

encrypted binary (Noise handshake), signed auth_token/notary_token in the WS URL

/api/falco

telemetry only — not chat

So the only robust options are (1) drive the real browser (this project) or (2) re-implement the encrypted Noise client (roadmap).

Selectors

Purpose

Selector

Composer root

[data-hatch-composer-root]

Editor

[data-hatch-composer-root] textarea (fallback [data-lexical-editor="true"])

Send

Enter key

Attach

[data-hatch-composer-root] input[type="file"] (hidden; setInputFiles)

Chat list

[data-testid="hatch-thread-row"]

Streaming

[data-testid="hatch-composer-stop-button"]

Messages

[data-message-item] with data-message-role="user" | "assistant"

Error

[data-testid="assistant-response-error-notice"]

Auth probe

page-origin fetch('/api/auth/check', { method: 'POST' })


Reproduce this yourself (HAR → coding agent)

You don't have to reverse-engineer anything by hand. Capture what the app actually does, then let a coding agent read it and write the bridge for you.

Requirements: Google Chrome + some kind of coding agent — Claude Code, OpenAI Codex, opencode, Cursor, Cline, Aider, … anything that can read files.

  1. Open the app. In Chrome, go to https://muse.ai and sign in with your own account.

  2. Open DevTools. Press F12 → Network tab → tick Preserve log. Leave it open for the whole session so the WebSocket frames get recorded.

  3. Filter the traffic. Click Fetch/XHR to see the HTTP calls, and WS to see the chat WebSocket. Muse's chat is a WebSocket, not a REST call, so you want both.

  4. Send a few prompts (e.g. hi, what can you do?) so real traffic is recorded.

  5. Export a HAR. Right-click anywhere in the request list → Save all as HAR with content. Pick the version "with sensitive data" — the sanitized export strips cookies and WebSocket frames, which makes the capture useless.

  6. Hand it to your coding agent. Drop the file into your project (e.g. captures/muse.har) and give the agent a prompt like this:

    Analyze captures/muse.har from a web chat app and report:
    1) The chat transport: REST/SSE vs WebSocket. List every relevant endpoint
       (auth, session, wake, chat) and how authentication works (cookies? tokens?).
    2) The WebSocket: URL, subprotocol, and whether frames are encrypted/binary —
       e.g. a Noise handshake (X25519 + HKDF + AES-GCM + Ed25519) — plus the RPC method names.
    3) The most robust way to build a local bridge that exposes this chat as
       (a) an MCP tool and (b) an OpenAI-compatible /v1 endpoint, given there is no official API.

    The agent will read the HAR and tell you exactly what to build. In our capture it surfaced POST /api/auth/check, GET /api/session, POST /api/hatch/vm/wake, and the encrypted wss://hatch.metaaivm.com/v1/noise WebSocket with a chat.stream method — which is precisely why this project drives the real browser instead of calling a REST API. If your agent reaches the same conclusion, you're spot on.

WARNING

A HAR "with sensitive data" contains yoursession cookies and access tokens. Never commit it, never paste it into a chat, never share it. This repo's .gitignore already blocks *.har.


Configuration (environment)

Variable

Default

Meaning

MUSE_PROFILE_DIR

./.muse-profile

dedicated Chrome profile (holds your login)

MUSE_URL

https://muse.ai/

app URL

MUSE_CHANNEL

chrome

chrome or msedge

MUSE_HEADLESS=1

off

run headless (log in headed first)

MUSE_CDP

–

attach to an existing Chrome at this URL (e.g. http://127.0.0.1:9222) instead of launching

MUSE_STREAM_QUIET_MS

600

streaming stability window (skip mid-message draft rewrites)

MUSE_LAUNCH_TIMEOUT_MS

60000

launch / navigation timeout

MUSE_SHIM_PORT

8787

shim port (0 disables the shim)

MUSE_SHIM_HOST

127.0.0.1

shim bind host

MUSE_SHIM_TIMEOUT_MS

240000

default shim request timeout

MUSE_SHIM_MODELS

muse-spark-1.3,muse-spark-1.3-contributor,muse

advertised model ids

MUSE_SHIM_URL

http://127.0.0.1:8787/v1

shim base url used by the CLI

MUSE_CLI_AUTOSTART=0

off

disable the CLI auto-starting a shim


Troubleshooting

  • loggedIn: false → run muse_login (or npm run selftest) and sign in in the Chrome window.

  • composerReady: false after login → node muse-server.mjs --dump-dom; if the DOM changed, re-derive selectors and update SELECTORS in muse-driver.mjs.

  • Empty reply / timedOut → raise timeout_sec; agent tasks (browsing, VM work) can take minutes. needsApproval: true means Muse is waiting on an in-app approval you must click.

  • Chrome profile locked → expected if a Chrome already uses .muse-profile. The driver auto-attaches to http://127.0.0.1:9222 in that case; otherwise close that window, or start Chrome with --remote-debugging-port=9222 and set MUSE_CDP.

  • npm blocked in PowerShell → call & "C:\Program Files\nodejs\npm.cmd" instead of npm.

Limitations

  • One conversation. Muse is a single persistent thread; the in-app "new chat" control is unreliable. The shim sends the full transcript each call; x-muse-thread: new navigates to / first (best-effort fresh context).

  • Serialized — one browser, requests run one at a time (auto-queued).

  • Tool calling is prompt-injected — best-effort, not a native function-calling API.

  • DOM-driven — a Muse UI change can break selectors; muse_dump_dom is the escape hatch.


Roadmap

  • Phase 2 — headless Noise client. Talk to Muse directly over wss://hatch.metaaivm.com/v1/noise (X25519 + HKDF + AES‑GCM + Ed25519) with a MUSE_TRANSPORT=noise|browser switch, keeping the browser driver as fallback.

  • Native tool-calling passthrough for clients that support it.

  • Multi-thread support when Muse exposes a reliable switch.

Disclaimer

This is an unofficial, unaffiliated tool. It automates your own logged-in browser session and does not bundle, proxy, or share anyone's credentials. Use it only with an account you are entitled to use, and respect Muse's / Meta's Terms of Service and your local laws. The maintainers are not responsible for misuse or for any consequences of using this software. There is no API key, Chrome profile, or captured traffic in this repository — you bring your own.

License

MIT © 2026 duclm1x1

Available Tools

11 tools
muse_chatChat with MuseA

Send a prompt to Muse and return the assistant reply once streaming finishes. Uses your own logged-in session and token quota.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatNoTarget chat by title, index, thread URL, or thread id (default: main chat).
filesNoAbsolute paths or URLs of images/videos/files to attach to the message.
promptNoThe message to send. May be empty when attaching files.
new_threadNoStart a new thread before sending (default false = continue current thread).
timeout_secNoMax seconds to wait for the reply (default 240).

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose two important traits: it blocks until streaming finishes (synchronous completion), and it consumes the caller's own session and token quota. It omits failure/timeout behavior and whether the call mutates conversation state, so it is not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action, and the quota/session caveat placed second. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description does state the return value (the assistant reply) plus the blocking nature of the call. Combined with the fully documented schema, an agent has enough to invoke it, though timeout/error outcomes are left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters (chat, files, prompt, new_thread, timeout_sec) are already documented with defaults in the schema. The description adds no extra parameter meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Send a prompt to Muse and return the assistant reply'), which clearly separates it from read-only siblings like muse_read_chat or muse_read_last. It does not explicitly name or contrast with the closest alternatives (muse_new_chat, muse_open_chat), so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — this is the tool you call to actually send a message — and the note about using your own logged-in session is a useful prerequisite. But there is no explicit when-to-use versus muse_new_chat/muse_open_chat, and no stated conditions such as needing to log in first (muse_login).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_chatsList Muse chatsA

List the chats in the Muse sidebar (Main chat, Channels, Side chats) with an active flag. Optionally filter by title.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoOptional case-insensitive title filter.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that results include an "active flag" and which sidebar categories are returned, but says nothing about authentication requirements, ordering, result volume, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action and scope front-loaded and no filler. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter read tool with no output schema, the description covers scope, categories, the active flag, and the optional filter. It is nearly sufficient, with only auth/ordering behavior left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single `query` parameter is already documented as an optional case-insensitive title filter. The description's "Optionally filter by title" merely restates the schema, adding no new syntax or behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("List") and resource ("chats in the Muse sidebar"), and enumerates the three chat categories it covers. It does not explicitly differentiate itself from siblings like muse_read_chat or muse_open_chat, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer you list chats to discover them before opening or reading one, but the description never states when to use this versus muse_open_chat, muse_read_chat, or muse_read_last, and names no alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_closeClose Muse browserA

Close the dedicated Chrome window and release the profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the two observable effects (window closes, profile released), which is useful, but omits whether the call is idempotent, what happens if no window is open, and whether in-flight chat state is lost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with two concrete effects and zero filler. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter lifecycle tool with no output schema, the description is nearly sufficient: it names both the action and its cleanup side effect. Only edge-case behavior (calling when nothing is open, effect on session data) is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema fully covers the input contract. The description correctly adds no parameter detail, which is the expected baseline for a no-arg tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Close') and resource ('the dedicated Chrome window') and adds the side effect of releasing the profile. It is unambiguous what the tool does, though it never names a sibling or scope condition to differentiate it from the muse_open_chat/muse_chats family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus alternatives, nor any precondition (e.g. whether a Muse session must be active). The agent must infer that this is a teardown step to use at the end of a session.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_dump_domDump Muse DOMB

Diagnostics: element counts and transcript HTML. Use if selectors stop matching after a Muse update.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_charsNoTruncate HTML to this many characters (default 20000).

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It doesn't say whether this mutates state, requires login/auth, is read-only, is expensive, or whether the dump is stable. The trigger condition is useful but leaves most behavioral context unaddressed for a diagnostics tool with zero annotation support.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single tight sentence with no filler, and the trigger condition is front-loaded after the noun phrase. Nothing is wasted, but structure could more explicitly separate output from condition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a diagnostics tool with no annotations and no output schema, the description is thin: it doesn't describe the return shape beyond 'element counts and transcript HTML,' doesn't state auth or environment requirements, and doesn't cover the failure mode it's meant to diagnose in any detail. The schema covers its one parameter, but the description leaves the tool's behavior underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents max_chars fully with a default and a 200000 cap, so coverage is 100% and the description needn't repeat it. The description adds no parameter-level detail beyond the schema, which matches the baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a deliverable ('element counts and transcript HTML') and a trigger ('use if selectors stop matching'), so the diagnostic intent is visible. But the verb is a bare label ('Dump Muse DOM') and the tool isn't clearly distinguished from its siblings (muse_status, muse_read_chat) in a way an agent can route on. Purpose is implied rather than stated as a specific verb+resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use condition: 'Use if selectors stop matching after a Muse update.' That is a clear when-to-use trigger. It doesn't name an alternative sibling to try before or instead, so it stops short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_loginMuse loginA

Open muse.ai in the dedicated Chrome window and wait for Meta sign-in to complete. Use when muse_status reports loggedIn=false.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeout_secNoHow long to wait for login (default 300).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does disclose the key non-obvious trait: this launches a browser window and blocks waiting for an interactive human Meta sign-in, which is not derivable from the schema. It omits what happens on timeout or failure (e.g., error vs. status return), so it is not fully complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the usage condition; no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, no-output-schema tool, the description covers what it does, its side effect, and when to call it. Only post-call expectations (success/failure signaling, whether it returns login state) are left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter timeout_sec is already fully documented in the schema (100% coverage), including default and bounds. The description's 'wait for sign-in' phrasing implies blocking behavior but adds no format or default detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (open muse.ai in the dedicated Chrome window) and its outcome (wait for Meta sign-in), so the agent knows exactly what the tool performs. It is clearly distinguishable from siblings like muse_status, which it references by name rather than duplicating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition: 'Use when muse_status reports loggedIn=false,' which ties the tool to a specific sibling's output. It stops short of stating when not to use it (e.g., already logged in, or while another login is pending), so there is a small amount of inference left.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_mediaMuse chat mediaA

Extract image/video/attachment links from a chat (Muse replies with share links for generated media). Optionally download them.

ParametersJSON Schema
NameRequiredDescriptionDefault
dirNoDirectory for downloads (default: ./downloads next to the server).
chatNoChat to open first (title, index, URL, or id).
downloadNoDownload the media to disk (default false).

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that download is opt-in and that the chat may be opened first, but it says nothing about authentication/login requirements (muse_login exists), permissions, or what happens when a chat cannot be opened. The side-effect disclosure is helpful but incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action front-loaded and the optional side effect second. Nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations, so the description should ideally sketch the return shape (e.g., a list of URLs vs. downloaded file paths) and the login/chat prerequisites. It covers the core intent but leaves these gaps for a tool in a larger chat-automation family.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the three parameters (dir, chat, download) are already fully documented in the schema. The description restates only the optional download behavior and adds no new semantics for dir or chat, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (extract image/video/attachment links from a chat) and clarifies what those links are (Muse share links for generated media). That is enough to distinguish it from muse_read_chat or muse_chats, though it never explicitly contrasts itself with any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Optionally download them" implies the two modes (link extraction vs. download), but there is no explicit when-to-use guidance, no prerequisites (e.g., must be logged in or have a chat open), and no named alternative for reading chat text. Usage is only inferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_new_chatMuse new chatA

Start a fresh Muse thread (navigates to the home composer).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden; it does usefully disclose the navigation side effect (goes to the home composer). However, it omits auth requirements, whether the current thread is discarded, and any state-change implications, leaving notable gaps for a UI-mutating action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core action front-loaded and the clarifying side effect in a parenthetical. No filler or redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter navigation tool with no output schema and no annotations, the description conveys the action and its visible effect, which is nearly all an agent needs. Only minor context (auth/state implications) is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to document; the baseline for a parameterless tool is 4. The schema coverage is trivially 100% with an empty property set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a fresh Muse thread') and the parenthetical clarifies the effect (navigates to the home composer). The word 'fresh' implies a distinction from siblings like muse_open_chat, but no sibling is named explicitly, so differentiation relies on inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer you call this when you want a brand-new thread rather than opening an existing one. There is no explicit when-to-use or when-not-to-use guidance, and alternatives such as muse_open_chat or muse_chat are not referenced.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_open_chatOpen Muse chatA

Open a specific Muse chat so later reads/sends target it (instead of the main chat).

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesChat title (substring), index from muse_chats, a thread URL, or a thread id.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses the key stateful effect (opening a chat changes the target for later reads/sends), but it omits other relevant traits such as authentication prerequisites, error behavior when the target is not found, and what the call returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single front-loaded sentence with no wasted words. It states the action and its immediate consequence efficiently, with no redundancy or buried information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter state-setting tool with a rich schema and no output schema, the description provides the essential context: what it opens and how it affects later operations. It is nearly complete, though it could mention prerequisite state such as login or what happens if the chat is not found.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents the single 'target' parameter, including the accepted formats (title substring, index, URL, thread id). The description does not add syntax or format meaning beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a specific verb ('Open') with a specific resource ('Muse chat') and states the resulting scope ('so later reads/sends target it'). It also distinguishes the action from the default behavior by explicitly saying this targets a specific chat instead of the main chat, which differentiates it from sibling operations like muse_chat.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: call this when you want subsequent reads/sends to hit a specific chat rather than the main chat. It does not explicitly name alternative sibling tools or state exclusions, but the intended sequencing is clear from the phrase 'so later reads/sends target it.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_read_chatRead Muse chatA

Return the messages of a chat (all roles) without sending anything. Optionally open a chat first.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNoMax messages to return from the end (default 100).
chatNoOptional chat to open first (title, index, URL, or id).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the tool does not send anything and may optionally open a chat first, but omits authentication requirements, return format, pagination behavior, and any side effects of opening a chat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero waste. The core purpose is front-loaded, and the optional-open behavior follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with complete schema coverage and no output schema, the description is largely sufficient. It could still note authentication or return structure, but those gaps are minor given the tool's low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are fully documented in the schema. The description adds no syntax or semantic detail beyond what the schema already provides, making 3 the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: return the messages of a chat, all roles, without sending anything. It distinguishes reading from sending, but does not explicitly differentiate from siblings like muse_read_last or muse_chats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage by saying it returns messages without sending anything and can optionally open a chat first. However, it gives no explicit when-to-use guidance relative to siblings such as muse_open_chat, muse_read_last, or muse_chats.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_read_lastRead last Muse replyA

Return the most recent assistant message from the current thread without sending anything.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that the operation is non-mutating ('without sending anything') and scoped to the current thread, but it omits auth requirements, what happens if no thread is active, and the exact return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no wasted words. The core action and its non-sending constraint are immediately clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema getter, the description covers the essential purpose and non-mutating behavior. It could mention the implicit prerequisite of an active thread or authentication, but otherwise it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to clarify. The baseline for 0 params is 4, and the description does not introduce any contradictory or missing parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'Return' and resource 'most recent assistant message from the current thread', with a clear scope qualifier 'without sending anything' that distinguishes it from send-oriented siblings like muse_chat.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance, no prerequisites, and no named alternatives. The phrase 'without sending anything' hints at read-only usage but does not say when to choose this over muse_read_chat or other read tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

muse_statusMuse statusA

Report whether the Muse browser is running, whether you are logged in to muse.ai, and whether the chat composer is ready.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It implies a read-only, side-effect-free probe by saying 'Report whether,' which is useful, but it does not explicitly state that nothing is mutated, whether the check is cached, or how a false result should be handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tightly-written sentence with the three checks parallel and front-loaded. Every clause earns its place and nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the three boolean results an agent can expect, which is the key missing piece for a status tool. It stops short of explaining how to act on negative results, but the core is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter documentation burden; the baseline of 4 applies. The description correctly reflects that no input is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (report) and enumerates the exact three conditions checked: browser running, login state, and chat composer readiness. This clearly distinguishes it from siblings like muse_login or muse_open_chat, which act rather than report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied – an agent would call this to check state before invoking muse_chat or muse_login – but the description never states when to use it or how it relates to alternatives such as muse_login. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.0
    • First observedmuse_chat
    • First observedmuse_chats
    • First observedmuse_close
    • First observedmuse_dump_dom
    • First observedmuse_login
    • First observedmuse_media
    • First observedmuse_new_chat
    • First observedmuse_open_chat
    • First observedmuse_read_chat
    • First observedmuse_read_last
    • First observedmuse_status

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have distinct purposes, but muse_chat (send prompt) and muse_chats (list chats) are easy to confuse due to near-identical names. muse_read_chat, muse_read_last, and muse_media also have some overlap in reading chat content, though descriptions clarify the boundaries.

Naming Consistency4/5

All tools use the muse_ prefix with snake_case, which is highly consistent. Minor deviations exist in verb/noun patterns (e.g., muse_status, muse_media, muse_chats are noun-like, while others are verb-led), but the overall convention remains readable and predictable.

Tool Count5/5

Eleven tools is well-scoped for a browser-automation MCP that manages login, chat navigation, reading, sending, media extraction, and diagnostics. Each tool appears to earn its place without excessive fragmentation.

Completeness4/5

The surface covers the core chat lifecycle: status/login, new/open/close, list/read/send, media extraction, and diagnostics. Minor gaps exist around chat management (e.g., delete, rename, or search), but these are not

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that enables AI tools to control local browser sessions for ChatGPT, Claude, and other AI services, supporting querying, navigation, file uploads, and artifact management.
    41 npm
    566
    Mozilla Public 2.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    A Chrome browser automation MCP server. Connect Claude (or any MCP client) to a real Chrome session — using your existing profiles with their cookies, saved passwords, and history.
    3
    -
  • A
    license
    A
    quality
    A
    maintenance
    MCP server that lets AI agents drive your real Chromium browser with your existing signed-in sessions, providing visible, local, and inspectable automation for tasks like navigation, clicking, typing, and form filling.
    25
    1
    Apache 2.0