{"server":{"name":"musehub-mcp","version":"0.2.0","protocolVersion":"2025-11-25","endpoint":"/mcp","docsUrl":"/mcp/docs"},"tools":[{"name":"musehub_set_context","description":"Set the session's focused repository. After calling this, all subsequent tool calls that accept owner/slug will use this repo automatically — you no longer need to pass owner+slug on every call. Calling again with different owner/slug switches focus. Example: musehub_set_context(owner='gabriel', slug='jazz-standards') then musehub_list_branches() with no other args.","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"Repository owner username."},"slug":{"type":"string","description":"Repository slug (URL-safe name)."}},"required":["owner","slug"]}},{"name":"musehub_read_context","description":"Start here. Get the full AI context document for a MuseHub repository: domain plugin (scoped_id, dimensions, capabilities), branches, recent commits, and artifact inventory — in a single call. This is the primary oracle for any agent: always call it before creating or modifying state to ensure coherence with the existing multidimensional content. For computed analytics (per-dimension scores), follow up with musehub_read_domain_insights. For the full viewer payload (dimension slices, navigation strip), follow up with musehub_read_view. Repo identifier required: provide repo_id OR both owner+slug. Example: musehub_read_context(repo_id='a3f2-...') or musehub_read_context(owner='gabriel', slug='jazz-standards'). If no repo identifier is provided and session context is set via musehub_set_context, the focused repo is used automatically.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":[]}},{"name":"musehub_list_branches","description":"List all branches in a MuseHub repository with their head commit IDs. Call before musehub_list_commits to identify the target branch ref. Example: musehub_list_branches(repo_id='a3f2-...') or musehub_list_branches(owner='gabriel', slug='jazz-standards').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":[]}},{"name":"musehub_list_commits","description":"List commits on a MuseHub repository (newest first). Optionally filter by branch name and cap the result count. Example: musehub_list_commits(repo_id='a3f2-...', branch='main', limit=10) or musehub_list_commits(owner='gabriel', slug='jazz-standards', branch='main').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"branch":{"type":"string","description":"Branch name filter (e.g. 'main'). Omit to list across all branches."},"limit":{"type":"integer","description":"Maximum commits to return (default: 20, max: 100).","default":20,"minimum":1,"maximum":100}},"required":[]}},{"name":"musehub_read_file","description":"Read the metadata for a stored artifact (MIDI, MP3, WebP piano roll) in a MuseHub repo. Returns path, size_bytes, mime_type, and object_id. Binary content is not returned — discover object IDs via musehub_read_context first. Example: musehub_read_file(repo_id='a3f2-...', object_id='sha256:abc...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"object_id":{"type":"string","description":"Content-addressed object ID (e.g. 'sha256:abc...')."}},"required":["object_id"]}},{"name":"musehub_search","description":"Search within a MuseHub repository by substring query. Mode 'path' matches artifact file paths (e.g. 'tracks/jazz'); mode 'commit' searches commit messages (e.g. 'add bass'). Returns matching items with their metadata. Example: musehub_search(repo_id='a3f2-...', query='bass', mode='path') or musehub_search(owner='gabriel', slug='jazz-standards', query='bass').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"query":{"type":"string","description":"Substring query string (case-insensitive)."},"mode":{"type":"string","description":"Search mode: 'path' searches object paths; 'commit' searches commit messages.","enum":["path","commit"],"default":"path"}},"required":["query"]}},{"name":"musehub_read_commit","description":"Get detailed information about a single commit, including its message, author, timestamp, parent IDs, and the full list of artifact paths at that snapshot. Use to inspect what changed at a specific point in history. Example: musehub_read_commit(repo_id='a3f2-...', commit_id='sha256:abc...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"commit_id":{"type":"string","description":"Commit ID (SHA or short ID)."}},"required":["commit_id"]}},{"name":"musehub_compare","description":"Compare two refs (branches or commit IDs) in a MuseHub repository. Returns a multidimensional state diff: which artifacts were added, removed, or modified, and per-dimension change scores sourced from the repo's domain plugin capabilities. Example: musehub_compare(repo_id='a3f2-...', base_ref='main', head_ref='feature/new-section') or musehub_compare(owner='gabriel', slug='jazz-standards', base_ref='main', head_ref='feature/bridge').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"base_ref":{"type":"string","description":"Base branch name or commit ID."},"head_ref":{"type":"string","description":"Head branch name or commit ID to compare against base."}},"required":["base_ref","head_ref"]}},{"name":"musehub_list_issues","description":"List issues for a MuseHub repository. Filter by state (open/closed/all) or label string. Returns issue summaries (title, state, labels) — call musehub_read_issue with the number to get the full body and comment thread. Example: musehub_list_issues(repo_id='a3f2-...', state='open', label='bug') or musehub_list_issues(owner='gabriel', slug='jazz-standards').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"state":{"type":"string","description":"Filter by state: 'open', 'closed', or 'all'.","enum":["open","closed","all"],"default":"open"},"label":{"type":"string","description":"Filter to issues with this label string."}},"required":[]}},{"name":"musehub_read_issue","description":"Read a single issue by its per-repo number, including the full body and comment thread. Use musehub_list_issues to discover issue numbers, then this tool to read the detail. Example: musehub_read_issue(repo_id='a3f2-...', issue_number=42) or musehub_read_issue(owner='gabriel', slug='jazz-standards', issue_number=42).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."}},"required":["issue_number"]}},{"name":"musehub_list_proposals","description":"List merge proposals for a MuseHub repository. Filter by state (open/merged/closed/all). Returns merge proposal summaries — call musehub_read_proposal with the proposal_id to get reviews and inline comments. Example: musehub_list_proposals(repo_id='a3f2-...', state='open') or musehub_list_proposals(owner='gabriel', slug='jazz-standards').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"state":{"type":"string","description":"Filter by state: 'open', 'merged', 'closed', or 'all'.","enum":["open","merged","closed","all"],"default":"all"}},"required":[]}},{"name":"musehub_list_proposals_context","description":"List merge proposals with full enrichment: risk band, approval status, active domains, blocking dependencies, and author type — all in a single call. Use this instead of musehub_list_proposals when you need to triage the merge queue without calling musehub_read_proposal for each entry. Returns up to 50 proposals sorted by the state filter. Example: musehub_list_proposals_context(repo_id='a3f2-...', state='open') or musehub_list_proposals_context(owner='gabriel', slug='jazz-standards').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"state":{"type":"string","description":"Filter by state: 'open', 'merged', 'settling', or 'all'.","enum":["open","merged","settling","all"],"default":"open"}},"required":[]}},{"name":"musehub_read_proposal","description":"Read a single merge proposal by ID, including all reviews and inline dimension-anchored comments. Use musehub_list_proposals to discover proposal_ids, then this tool to read the full detail. Example: musehub_read_proposal(repo_id='a3f2-...', proposal_id='b5e8-...') or musehub_read_proposal(owner='gabriel', slug='jazz-standards', proposal_id='b5e8-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["proposal_id"]}},{"name":"musehub_read_proposal_risk","description":"Get the computed risk score for a merge proposal. Returns risk score (0-100), band (low/medium/high/critical), blast delta, breakage count, symbol totals, agent commit ratio, and signing status. Use this before merging to decide whether to require additional review. Example: musehub_read_proposal_risk(repo_id='a3f2-...', proposal_id='b5e8-...'). Pair with musehub/safe-to-merge prompt for a full pre-merge audit.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["proposal_id"]}},{"name":"musehub_read_proposal_diff","description":"Get the full symbol-level diff for a merge proposal — added, modified, and deleted named symbols across all commits on the from-branch. Returns sym_added, sym_modified, sym_deleted counts and all symbol addresses by category. Use this to understand the semantic scope of a proposal before reviewing or merging. Example: musehub_read_proposal_diff(repo_id='a3f2-...', proposal_id='b5e8-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["proposal_id"]}},{"name":"musehub_read_proposal_breakage","description":"Get the list of breaking changes for a merge proposal — symbols deleted or structurally modified in a way that breaks callers. An empty list means no breaking changes were detected across all commits. Example: musehub_read_proposal_breakage(repo_id='a3f2-...', proposal_id='b5e8-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["proposal_id"]}},{"name":"musehub_list_releases","description":"List all releases for a MuseHub repository, ordered newest first. Each release includes tag, title, release notes summary, and asset counts. Example: musehub_list_releases(repo_id='a3f2-...') or musehub_list_releases(owner='gabriel', slug='jazz-standards').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":[]}},{"name":"musehub_search_repos","description":"Discover public MuseHub repositories across all domains by text query, domain plugin, or free-text tags. Filter by domain scoped ID (e.g. '@gabriel/midi') to browse repos of a specific type. Returns repos sorted by relevance including repo_id, owner, and slug for each result. Example: musehub_search_repos(query='jazz', domain='@gabriel/midi').","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text query matched against repo names and descriptions."},"domain":{"type":"string","description":"Filter by domain scoped ID, e.g. '@gabriel/midi' or '@gabriel/code'."},"tags":{"type":"array","description":"Filter repos that have all of these tags.","items":{"type":"string"}},"limit":{"type":"integer","description":"Maximum results to return (default: 20, max: 100).","default":20,"minimum":1,"maximum":100}},"required":[]}},{"name":"musehub_list_repo_forks","description":"List all direct forks of a MuseHub repository. Returns each fork's full repo metadata (owner, slug, repo_id, description, tags, created_at) plus source attribution so you can render 'forked from {owner}/{slug}'. Use musehub_get_fork_network to traverse the full recursive tree including forks-of-forks. Example: musehub_list_repo_forks(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the source repository whose forks you want to list."}},"required":["repo_id"]}},{"name":"musehub_get_fork_network","description":"Return the complete recursive fork network tree rooted at a MuseHub repository. The response has a 'root' node (the source repo) with 'children' (direct forks), each child carrying its own 'children' for second-level forks, etc. 'totalForks' is the flat count of all fork nodes (excluding root). Use this to find the most-diverged fork, visualise the fork graph, or decide which fork to merge back into the upstream before a breaking change. Example: musehub_get_fork_network(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the root repository."}},"required":["repo_id"]}},{"name":"musehub_get_user_forks","description":"List all repositories that a MuseHub user has forked, with source attribution. Returns each fork entry with the fork repo's full metadata plus 'sourceOwner' and 'sourceSlug' so you can render 'forked from {sourceOwner}/{sourceSlug}'. Ordered newest-first. Example: musehub_get_user_forks(username='gabriel').","inputSchema":{"type":"object","properties":{"username":{"type":"string","description":"MSign handle of the user whose forks to retrieve."}},"required":["username"]}},{"name":"musehub_list_domains","description":"List and search all registered Muse domain plugins. Domains are the extensibility layer that give Muse its domain-agnostic power — each domain defines its own dimensions, viewer, merge semantics, CLI commands, and artifact types. Filter by query string, viewer_type, or verified status. Returns scoped_id (@author/slug), display_name, description, capabilities, repo_count, and install_count for each domain. Example: musehub_list_domains(query='genomics', verified=true).","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Full-text search across name and description."},"viewer_type":{"type":"string","description":"Filter by viewer type (e.g. 'piano_roll', 'code_graph', 'generic')."},"verified":{"type":"boolean","description":"When true, return only officially-verified domains."},"limit":{"type":"integer","description":"Maximum results (default 20, max 100).","default":20,"minimum":1,"maximum":100},"cursor":{"type":"string","description":"Opaque cursor from a previous call's next_cursor field to fetch the next page."}},"required":[]}},{"name":"musehub_read_domain","description":"Fetch the full manifest for a specific Muse domain plugin by its scoped ID. Returns all capabilities: dimensions list, viewer_type, merge_semantics, cli_commands, artifact_types, manifest_hash (content-addressed, immutable), version, repo_count, and install_count. Call this after musehub_read_context to understand the domain a repo uses, or before creating a repo to verify domain capabilities. Example: musehub_read_domain(scoped_id='@gabriel/midi').","inputSchema":{"type":"object","properties":{"scoped_id":{"type":"string","description":"Domain scoped identifier in '@author/slug' format."}},"required":["scoped_id"]}},{"name":"musehub_read_domain_insights","description":"Get computed analytics for a MuseHub repository across any of its domain's dimensions. Returns numeric scores and structured metrics — e.g. harmonic tension score, rhythmic complexity, melodic contour for MIDI; symbol hotspots, coupling metrics for Code. The available dimensions are defined by the repo's domain plugin — call musehub_read_domain first to learn the dimension names. dimension='overview' always returns cross-domain stats (commits, objects, collaborators). Prefer musehub_read_context for structural understanding; use this tool when you need quantitative analysis of a specific dimension. For the viewer-ready state payload, use musehub_read_view instead. Example: musehub_read_domain_insights(repo_id='a3f2-...', dimension='harmonic').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"dimension":{"type":"string","description":"Insight dimension to fetch. 'overview' is always available; other values depend on the repo's domain plugin.","default":"overview"},"ref":{"type":"string","description":"Branch name, tag, or commit SHA to scope the insights to. Defaults to HEAD."}},"required":[]}},{"name":"musehub_read_view","description":"Fetch the universal viewer payload for a repo at a given ref. Returns the structured representation of multidimensional state as rendered by the domain's viewer — dimension slices, navigation strip entries, and domain-specific viewer metadata. This is the MCP equivalent of the /{owner}/{repo}/insights/{ref} page. Use when you need the full state payload for reasoning or rendering. For quantitative analytics (scores, metrics), use musehub_read_domain_insights instead. For repo identity and inventory, use musehub_read_context instead. Example: musehub_read_view(repo_id='a3f2-...', ref='main') or musehub_read_view(owner='gabriel', slug='jazz-standards', ref='main').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"ref":{"type":"string","description":"Branch name, tag, or commit SHA. Defaults to HEAD of default branch."},"dimension":{"type":"string","description":"Optional: restrict the view payload to a single dimension slice. Omit to get the full multi-dimensional view."}},"required":[]}},{"name":"musehub_whoami","description":"Return identity information for the currently authenticated caller. Call this first to confirm authentication before any write operations. Works for both human users and AI agent tokens. Authenticated response includes: user_id (handle), username (handle), display_name, repo_count, is_admin, and token_type ('human' or 'agent'). Returns {authenticated: false} when called without a valid MSign header — never errors. Example: musehub_whoami().","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"muse_pull","description":"Fetch missing commits and blobs from a MuseHub repository. Equivalent to 'muse pull' — returns new commits and blob metadata since the given commit ID. Use since_commit_id to fetch incrementally. Pass blob_ids to download specific blobs — their content is returned as base64-encoded strings in the 'content_b64' field of each blob entry; decode with base64.b64decode() before writing to disk. Example: muse_pull(repo_id='a3f2-...', branch='main', since_commit_id='abc123') or muse_pull(owner='gabriel', slug='jazz-standards', branch='main').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"branch":{"type":"string","description":"Branch to pull from. Defaults to the default branch."},"since_commit_id":{"type":"string","description":"Only return commits newer than this commit ID."},"blob_ids":{"type":"array","description":"Specific blob IDs to fetch (content-addressed sha256: prefixed IDs).","items":{"type":"string"}}},"required":[]}},{"name":"muse_remote","description":"Return the remote URL, push/pull API endpoints, and clone command for a MuseHub repository. Covers both 'muse remote -v' and 'muse clone' use cases in a single call. Returns: origin URL, push endpoint, pull endpoint, clone command (with optional ref), and the 'muse remote add origin' command. Use this when setting up a local repo to push to MuseHub, or to get the clone URL. Example: muse_remote(owner='gabriel', slug='neo-soul-experiment') or muse_remote(owner='gabriel', slug='neo-soul-experiment', ref='feat/jazz-bridge').","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"Repository owner username."},"slug":{"type":"string","description":"Repository slug (URL-safe name)."},"ref":{"type":"string","description":"Optional branch or tag to target (used in the clone command)."}},"required":["owner","slug"]}},{"name":"musehub_read_prompt","description":"Return the fully assembled content of a named MuseHub MCP prompt. This is a tool-layer shim over the MCP prompts/get primitive, enabling agents whose client only supports tools/call to access prompt content programmatically — identical output to prompts/get, callable as a tool. Use musehub_list_prompts() (prompts/list) to discover available prompt names. The eleven available prompts are: musehub/orientation, musehub/contribute, musehub/create, musehub/review_proposal, musehub/issue_triage, musehub/release_prep, musehub/onboard, musehub/safe-to-merge, musehub/pre-release-audit, musehub/agent-onboarding, musehub/symbol-investigation. Pass caller_type='agent' to musehub/orientation for agent-specific guidance. Example: musehub_read_prompt(name='musehub/orientation', arguments={'caller_type': 'agent'}).","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Prompt name to fetch, e.g. 'musehub/orientation' or 'musehub/review_proposal'. Must be one of the eleven musehub/* prompts.","enum":["musehub/orientation","musehub/contribute","musehub/create","musehub/review_proposal","musehub/issue_triage","musehub/release_prep","musehub/onboard","musehub/safe-to-merge","musehub/pre-release-audit","musehub/agent-onboarding","musehub/symbol-investigation"]},"arguments":{"type":"object","description":"Optional prompt arguments as string key-value pairs. E.g. {'caller_type': 'agent'} for musehub/orientation, {'repo_id': '<sha256>'} for musehub/contribute, {'repo_id': '<sha256>', 'proposal_id': '<sha256>'} for musehub/review_proposal."}},"required":["name"]}},{"name":"musehub_list_symbols","description":"List or search all symbols known to MuseHub for a repo. Uses the materialized symbol index built from commit structured_delta on each push. Supports substring search with ?q= and op-kind filter (add|modify|delete). Returns address, last op, content_id, last_modified, history_count per symbol. Repo identifier required: provide repo_id OR both owner+slug. Example: musehub_list_symbols(repo_id='a3f2-...', q='MyClass') or musehub_list_symbols(owner='gabriel', slug='muse', q='CommitRecord').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"q":{"type":"string","description":"Substring to match against symbol address"},"kind":{"type":"string","enum":["add","modify","delete"],"description":"Filter by last op kind"},"limit":{"type":"integer","default":100,"description":"Max symbols to return"},"cursor":{"type":"string","description":"Opaque cursor from a previous call's next_cursor field to fetch the next page."}}}},{"name":"musehub_read_symbol","description":"Get the full history timeline for a single symbol address. Returns every commit that touched the symbol, with op type (add/modify/delete), content_id (body hash), and timestamp. Use this to understand how a symbol evolved, who changed it, and when. Repo identifier and address both required. Example: musehub_read_symbol(repo_id='a3f2-...', address='muse/core/store.py::CommitRecord') or musehub_read_symbol(owner='gabriel', slug='muse', address='muse/core/store.py::CommitRecord').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"address":{"type":"string","description":"Symbol address (e.g. 'file.py::ClassName::method')"}},"required":["address"]}},{"name":"musehub_symbol_impact","description":"Get the blast radius for a symbol: which other symbols are co-changed with it most frequently. Uses commit co-occurrence analysis — if symbols A and B are modified in the same commits often, they are likely coupled. Essential before refactoring: reveals hidden dependencies. Returns co_changed list sorted by shared_commit_count descending. Example: musehub_symbol_impact(repo_id='a3f2-...', address='muse/core/store.py::CommitRecord').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"address":{"type":"string","description":"Symbol address"},"depth":{"type":"integer","default":1,"minimum":1,"maximum":3}},"required":["address"]}},{"name":"musehub_symbol_clones","description":"Find symbols that share the exact same body hash as the given symbol (clones / duplicates). Uses hash_occurrence index for O(1) lookup. Example: musehub_symbol_clones(repo_id='a3f2-...', address='muse/core/store.py::_utc_now').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"address":{"type":"string","description":"Symbol address to find clones of"}},"required":["address"]}},{"name":"musehub_read_intel_index_status","description":"Check whether the symbol index has been built for a repo, when it was last built, and how many symbols it contains. Returns status: 'ready' or 'not_built'. Example: musehub_read_intel_index_status(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}}}},{"name":"musehub_read_intel_health_score","description":"Return the repository health score (0–100) and label ('Excellent'/'Good'/'Fair'/'Poor'/'Critical'). Also returns the four penalty components: dead_penalty, hotspot_penalty, coupling_penalty, breakage_penalty. Use before a release or after a large merge to gauge repo hygiene. Example: musehub_read_intel_health_score(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_read_intel_hotspots","description":"Return symbols ranked by change frequency — the highest-churn code paths. Each entry contains: address, change_count, last_changed (ISO-8601). Results are sorted descending by change_count. Example: musehub_read_intel_hotspots(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_read_intel_dead","description":"Return dead code candidates — symbols added but rarely or never modified, cold for 90+ days. Each entry contains: address, days_cold, blast_radius, added_at. Sorted by days_cold descending (stalest first). Example: musehub_read_intel_dead(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_read_intel_blast_risk","description":"Return symbols with the highest historical co-change blast radius. Each entry contains: address, co_change_count, top_co_symbols (up to 5). Sorted by co_change_count descending. Use to identify 'leverage points' — symbols where a change ripples farthest. Example: musehub_read_intel_blast_risk(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_list_labels","description":"List all labels defined in a MuseHub repository. Returns label_id, name, color, and description for each label. Use label_id values with musehub_update_label and musehub_delete_label. Example: musehub_list_labels(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"audience":["assistant"]}},{"name":"musehub_get_repo","description":"Fetch metadata for a single MuseHub repository by repo_id or owner+slug. Returns name, owner, slug, visibility, description, tags, default_branch, clone_url, created_at, updated_at, and pushed_at. Use this to inspect a specific repo without searching. Example: musehub_get_repo(owner='gabriel', slug='jazz-standards') or musehub_get_repo(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"Repository sha256 genesis ID. Takes precedence over owner+slug when both provided."},"owner":{"type":"string","description":"Repository owner handle (used together with slug)."},"slug":{"type":"string","description":"URL-safe repository slug (used together with owner)."}},"required":[]},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"audience":["assistant"]}},{"name":"musehub_list_repos","description":"List repositories owned by or collaborated on by the authenticated user. Results are ordered newest-first. Use next_cursor from the response to page. This is the only way to enumerate your own private repos — musehub_search_repos only surfaces public repositories. Example: musehub_list_repos() or musehub_list_repos(limit=50, cursor='...').","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"Maximum repos per page (default 20, max 100).","default":20,"minimum":1,"maximum":100},"cursor":{"type":"string","description":"Opaque pagination cursor from a previous next_cursor field."}},"required":[]},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"audience":["assistant"]}},{"name":"muse_mist_read","description":"Fetch the full content and metadata of a single Mist by its content-addressed ID. Public mists are readable by any caller. Secret mists require authentication as the owner. The view counter is incremented on each call. Example: muse_mist_read(mist_id='aB3xKq9dPwNm')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"12-character content-addressed mist ID."}},"required":["mist_id"]},"annotations":{"readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"audience":["assistant"]}},{"name":"muse_mist_list","description":"List Mists — either for a specific owner or the global public discovery feed. When owner is omitted, returns the newest public mists from all users (explore mode). When owner is provided, returns that handle's mists; pass include_secret=true as the authenticated owner to include your own secret mists. Supports cursor-based pagination via next_cursor. Filter by artifact_type (e.g. 'code', 'midi', 'schema', 'dataset'). Examples: muse_mist_list() — global explore; muse_mist_list(owner='gabriel') — gabriel's public mists; muse_mist_list(owner='gabriel', include_secret=True) — all gabriel's mists (owner only).","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"Handle to filter by. Omit for global explore."},"artifact_type":{"type":"string","description":"Filter by artifact type (e.g. 'code', 'midi', 'schema')."},"include_secret":{"type":"boolean","description":"Include secret mists (only works when authenticated as the owner).","default":false},"cursor":{"type":"string","description":"Pagination cursor from a previous next_cursor field."},"limit":{"type":"integer","description":"Results per page (default 20, max 200).","default":20,"minimum":1,"maximum":200}},"required":[]},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"audience":["assistant"]}},{"name":"muse_mist_embed","description":"Get embeddable codes (iframe, JavaScript snippet, markdown badge) for a public Mist. Use these to share a Mist in documentation, READMEs, or web pages. The embed counter is incremented so the owner can track distribution. Only available for public mists. Example: muse_mist_embed(mist_id='aB3xKq9dPwNm', owner='gabriel')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"12-character mist ID."},"owner":{"type":"string","description":"Handle of the mist owner (used to build canonical URLs)."}},"required":["mist_id","owner"]},"annotations":{"readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"audience":["assistant"]}},{"name":"muse_mist_list_forks","description":"List the direct (one-level) forks of a mist, newest first. Returns each fork's mist_id, owner, filename, artifact_type, fork_depth, and created_at. The parent mist must exist and be readable by the caller — secret parents require authentication. Example: muse_mist_list_forks(mist_id='aB3xKq9dPwNm')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"12-character mist ID whose direct forks to list."},"limit":{"type":"integer","description":"Maximum number of forks to return (1–100, default 20).","default":20,"minimum":1,"maximum":100}},"required":["mist_id"]},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false,"audience":["assistant"]}},{"name":"muse_mist_raw","description":"Fetch the raw artifact content of a mist as a plain string — faster than muse_mist_read when you only need the content without full metadata. Secret mists require authentication as the owner. Increments the view counter. Example: muse_mist_raw(mist_id='aB3xKq9dPwNm')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"12-character mist ID whose content to fetch."}},"required":["mist_id"]},"annotations":{"readOnlyHint":false,"idempotentHint":false,"openWorldHint":false,"audience":["assistant"]}},{"name":"musehub_read_coord_swarm","description":"MULTI-AGENT ENTRY POINT: Call this first when joining or starting a multi-agent session.\n\nReturns: active agents, symbols each agent has reserved, and task queue depths per queue.\nUse this to:\n  - Understand who is working and what is already claimed\n  - Decide which task queue to join\n  - Detect if the swarm is idle (no active agents, no pending tasks)\n\nFollow-up tools:\n  - musehub_read_coord_conflicts(addresses=[...]) before reserving symbols\n  - musehub_list_coord_tasks(status='pending') to find claimable work\n  - musehub_create_coord_reservation(...) to lock symbols before editing","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":[]}},{"name":"musehub_list_coord_reservations","description":"List active symbol reservations (locked symbols) in the repository.\n\nA reservation means another agent is actively editing that symbol — do not edit it.\nUse agent_id filter to see what a specific agent has locked.\nFor a quick conflict check before reserving, prefer musehub_read_coord_conflicts(addresses=[...]) — it returns only the subset that conflicts rather than the full list.\n\nPart of the SYMBOL EDITING PROTOCOL:\n  read_coord_conflicts → create_coord_reservation → [edit] → delete_coord_reservation","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"agent_id":{"type":"string","description":"Filter reservations by this agent ID."},"include_expired":{"type":"boolean","description":"Include expired (but not released) reservations. Default false.","default":false},"limit":{"type":"integer","description":"Max reservations to return (default 200, max 1000).","default":200,"minimum":1,"maximum":1000}},"required":[]}},{"name":"musehub_read_coord_conflicts","description":"SYMBOL EDITING PROTOCOL — Step 1 of 3: Check if target symbols are free before reserving.\n\nReturns has_conflicts=false when all addresses are free (safe to proceed to reserve).\nReturns has_conflicts=true with a conflicts list when symbols are locked by other agents.\n\nIf conflicts exist:\n  - Check conflicts[].expires_at — wait until expiry if close\n  - Contact the owning agent via the task queue or choose different symbols\n  - Do NOT proceed to edit without a reservation\n\nStep 1: musehub_read_coord_conflicts(addresses=[...])\nStep 2: musehub_create_coord_reservation(addresses=[...], agent_id='...') if no conflicts\nStep 3: musehub_delete_coord_reservation(reservation_id='...') after committing your changes","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"addresses":{"type":"array","items":{"type":"string"},"description":"Symbol addresses to check (e.g. 'file.py::ClassName').","minItems":1,"maxItems":100}},"required":["addresses"]}},{"name":"musehub_list_coord_tasks","description":"TASK QUEUE PROTOCOL — Worker step 1: Find pending tasks to claim.\n\nTasks flow: pending → claimed → completed | failed\n\nTypical worker loop:\n  1. musehub_list_coord_tasks(status='pending', queue='my-queue') — find work\n  2. musehub_claim_coord_task(task_id='...', agent_id='me') — atomically claim one\n  3. [do the work described in task.payload]\n  4. musehub_complete_coord_task(...) or musehub_fail_coord_task(...)\n\nFilter by queue to specialise (e.g. queue='analysis' for symbol-analysis agents).\nSort order: highest priority first, then created_at ascending.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"queue":{"type":"string","description":"Filter by queue name (e.g. 'tasks', 'analysis'). Omit for all queues."},"status":{"type":"string","enum":["pending","claimed","completed","failed"],"description":"Filter by task status. Omit to return all statuses."},"limit":{"type":"integer","description":"Max tasks to return (default 100, max 500).","default":100,"minimum":1,"maximum":500}},"required":[]}},{"name":"musehub_create_repo","description":"Create a new MuseHub repository for any Muse domain. The slug is auto-generated from the name. Specify a domain scoped ID (e.g. '@gabriel/midi') to associate the repo with a domain plugin — this unlocks domain-specific viewers, insights, and CLI commands. Call musehub_list_domains first to discover available domains. Set initialize=true (default) to get an initial commit and default branch. Example: musehub_create_repo(name='Genome Edit Session', domain='@alice/genomics', visibility='public').","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Human-readable repository name (slug auto-generated)."},"description":{"type":"string","description":"Optional markdown description of the repository."},"visibility":{"type":"string","description":"Repository visibility: 'public' or 'private'.","enum":["public","private"],"default":"public"},"domain":{"type":"string","description":"Domain plugin scoped ID (e.g. '@gabriel/midi', '@gabriel/code'). Call musehub_list_domains first to discover available domains."},"domain_meta":{"type":"object","description":"Domain-specific metadata dict declared by the domain plugin."},"tags":{"type":"array","description":"Free-form tags for discovery (e.g. ['jazz', 'trio']).","items":{"type":"string"}},"initialize":{"type":"boolean","description":"When true (default), creates an initial commit and default branch.","default":true}},"required":["name"]}},{"name":"musehub_fork_repo","description":"Fork a public MuseHub repository into your account. Creates a new repository owned by the authenticated caller, copies the source repo's tags and description, and records the fork relationship. Rules: the source repo must be public; you cannot fork your own repo; you cannot fork the same repo twice (returns conflict). The fork is public by default — pass visibility='private' for a private fork. Returns full fork metadata including fork_id, fork_repo_id, and source attribution. Example: musehub_fork_repo(source_repo_id='a3f2-...', name='my-fork').","inputSchema":{"type":"object","properties":{"source_repo_id":{"type":"string","description":"sha256 genesis ID of the public repository to fork."},"name":{"type":"string","description":"Name for the new fork (slug auto-generated). Defaults to the source repo's name."},"visibility":{"type":"string","description":"Visibility of the fork: 'public' (default) or 'private'.","enum":["public","private"],"default":"public"},"description":{"type":"string","description":"Description for the fork. Defaults to 'Fork of {owner}/{slug}: {source description}'."}},"required":["source_repo_id"]}},{"name":"musehub_create_issue","description":"Open a new issue in a MuseHub repository. Use issues to track bugs, feature requests, or work items — anchored directly to Muse symbols and commits so agents can trace issues back to the exact code that needs changing. Always supply symbol_anchors (e.g. 'musehub/services/foo.py::create_foo') and commit_anchors when the issue originates from specific code or a specific commit. When filing on behalf of an AI agent, set agent_id and model_id for full provenance. Example: musehub_create_issue(repo_id='a3f2-...', title='fix: crash in create_issue', symbol_anchors=['musehub/services/musehub_issues.py::create_issue'], agent_id='agentception-worker-42', model_id='claude-sonnet-4-6') or musehub_create_issue(owner='gabriel', slug='musehub', title='perf: slow list_issues').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"title":{"type":"string","description":"Issue title."},"body":{"type":"string","description":"Optional markdown description of the issue."},"labels":{"type":"array","description":"Label strings to apply on creation.","items":{"type":"string"}},"symbol_anchors":{"type":"array","description":"Muse symbol addresses this issue is anchored to. Format: 'path/to/file.py::SymbolName' or 'path/to/file.py::Class.method'. Obtain these via muse code grep or muse code symbols before filing the issue. Example: ['musehub/services/musehub_issues.py::create_issue', 'musehub/db/musehub_models.py::MusehubIssue']","items":{"type":"string"}},"commit_anchors":{"type":"array","description":"Muse commit IDs this issue is anchored to. Use when the issue was introduced by or relates to a specific commit. Obtain commit IDs via muse log --json.","items":{"type":"string"}},"agent_id":{"type":"string","description":"Agent identifier when filing on behalf of an AI agent (e.g. 'agentception-worker-42'). Leave empty for human-filed issues."},"model_id":{"type":"string","description":"Model identifier when filing on behalf of an AI agent (e.g. 'claude-sonnet-4-6', 'claude-opus-4-6'). Leave empty for human-filed issues."}},"required":["title"]}},{"name":"musehub_update_issue","description":"Update an existing issue's title, body, labels, symbol anchors, commit anchors, state, or assignee. Only provided fields are modified — omitted fields are left unchanged. Set state='closed' to close the issue, state='open' to reopen it. Use symbol_anchors / commit_anchors to add or replace the VCS links for an issue after discovering the relevant code (send the full replacement list, not a diff). Example: musehub_update_issue(repo_id='a3f2-...', issue_number=42, state='closed', symbol_anchors=['musehub/services/musehub_issues.py::create_issue']).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."},"title":{"type":"string","description":"New title (optional)."},"body":{"type":"string","description":"New markdown body (optional)."},"labels":{"type":"array","description":"Replacement label list (replaces all existing labels).","items":{"type":"string"}},"symbol_anchors":{"type":"array","description":"Replacement symbol anchor list (replaces all existing anchors). Format: 'path/to/file.py::SymbolName'. Obtain via muse code grep or muse code symbols.","items":{"type":"string"}},"commit_anchors":{"type":"array","description":"Replacement commit anchor list (replaces all existing anchors). Obtain commit IDs via muse log --json.","items":{"type":"string"}},"state":{"type":"string","description":"New state: 'open' or 'closed'.","enum":["open","closed"]},"assignee":{"type":"string","description":"Username to assign, or empty string to unassign."}},"required":["issue_number"]}},{"name":"musehub_create_issue_comment","description":"Add a comment to an existing issue. Example: musehub_create_issue_comment(repo_id='a3f2-...', issue_number=42, body='Fixed in commit abc...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."},"body":{"type":"string","description":"Markdown comment body."}},"required":["issue_number","body"]}},{"name":"musehub_close_issue","description":"Close an open issue. Idempotent — closing an already-closed issue returns the issue unchanged. Use musehub_reopen_issue to reverse. Example: musehub_close_issue(repo_id='a3f2-...', issue_number=42).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."}},"required":["issue_number"]}},{"name":"musehub_reopen_issue","description":"Reopen a closed issue. Idempotent — reopening an already-open issue returns the issue unchanged. Use musehub_close_issue to close. Example: musehub_reopen_issue(repo_id='a3f2-...', issue_number=42).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."}},"required":["issue_number"]}},{"name":"musehub_assign_issue","description":"Assign or unassign a collaborator on an issue. Pass assignee='' to unassign. Example: musehub_assign_issue(repo_id='a3f2-...', issue_number=42, assignee='gabriel').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."},"assignee":{"type":"string","description":"Username to assign, or empty string to unassign."}},"required":["issue_number","assignee"]}},{"name":"musehub_update_issue_labels","description":"Bulk-replace the label list on an issue. The new list replaces all existing labels. Pass labels=[] to remove all labels. Use musehub_remove_issue_label to remove a single label without affecting others. Example: musehub_update_issue_labels(repo_id='a3f2-...', issue_number=42, labels=['bug', 'enhancement']).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."},"labels":{"type":"array","description":"Replacement label list (replaces all existing labels). Pass [] to clear all.","items":{"type":"string"}}},"required":["issue_number","labels"]}},{"name":"musehub_remove_issue_label","description":"Remove a single label from an issue. Idempotent — no-ops when the label is not present. Use musehub_update_issue_labels to replace the entire label list. Example: musehub_remove_issue_label(repo_id='a3f2-...', issue_number=42, label='bug').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."},"label":{"type":"string","description":"Label name to remove."}},"required":["issue_number","label"]}},{"name":"musehub_create_proposal","description":"Open a new merge proposal proposing to merge from_branch into to_branch. Call musehub_list_branches first to confirm both branches exist. Supports draft proposals, domain-selective merge strategies, and DAG-based dependency ordering. Example: musehub_create_proposal(repo_id='a3f2-...', title='Add jazz bridge', from_branch='feature/jazz-bridge', to_branch='main', merge_strategy='state_weave').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"title":{"type":"string","description":"Merge proposal title."},"from_branch":{"type":"string","description":"Source branch name to merge from."},"to_branch":{"type":"string","description":"Target branch name to merge into."},"body":{"type":"string","description":"Optional markdown description."},"proposal_type":{"type":"string","enum":["state_merge","stem_integration","midi_evolution","payment_settlement","agent_delegation","identity_transition","canonical_release"],"description":"Semantic proposal type. Defaults to 'state_merge'.","default":"state_merge"},"is_draft":{"type":"boolean","description":"Open as a draft (not ready for review). Default false.","default":false},"merge_strategy":{"type":"string","enum":["state_overlay","state_weave","state_rebase","domain_selective","phased"],"description":"How branches are merged. Default 'state_overlay'.","default":"state_overlay"},"merge_conditions":{"type":"object","description":"Optional JSON object with additional merge gate conditions."},"selective_domains":{"type":"array","items":{"type":"string"},"description":"Domain names to include when merge_strategy='domain_selective'."},"depends_on":{"type":"array","items":{"type":"string"},"description":"Proposal IDs that must be merged before this one (DAG ordering)."}},"required":["title","from_branch","to_branch"]}},{"name":"musehub_merge_proposal","description":"Merge an open merge proposal. Creates a merge commit on the target branch. The proposal must be in 'open' state. Obtain proposal_id from musehub_list_proposals. Example: musehub_merge_proposal(repo_id='a3f2-...', proposal_id='b5e8-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal to merge."},"merge_strategy":{"type":"string","description":"Merge strategy: 'merge_commit' (default), 'squash', or 'rebase'.","enum":["merge_commit","squash","rebase"],"default":"merge_commit"}},"required":["proposal_id"]}},{"name":"musehub_create_proposal_comment","description":"Post a comment on a merge proposal, optionally anchored to a specific symbol address. Use symbol_address to pin the comment directly to a named symbol in the Symbol Delta (e.g. 'core/engine.py::Engine.process'). For non-code domains, pass dimension_ref instead to target a track, beat region, or note. Omit both for a general proposal-level comment. Example: musehub_create_proposal_comment(repo_id='a3f2-...', proposal_id='b5e8-...', body='This symbol has a blast radius of 34 — needs test coverage', symbol_address='core/engine.py::Engine.process').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"body":{"type":"string","description":"Markdown comment body."},"symbol_address":{"type":"string","description":"Symbol address to anchor this comment to (e.g. 'core/engine.py::Engine.process'). Use the addresses returned by musehub_read_proposal symAdded/symModified/symDeleted. Takes precedence over dimension_ref for code-domain proposals."},"dimension_ref":{"type":"object","description":"Optional domain-specific anchor for non-code domains (MIDI, genomics, etc.). Schema is defined by the repo's domain plugin. Prefer symbol_address for code-domain proposals."},"parent_comment_id":{"type":"string","description":"ID of the parent comment when creating a threaded reply."}},"required":["proposal_id","body"]}},{"name":"musehub_create_proposal_review","description":"Submit a formal review on a merge proposal. event='approve' approves the proposal; event='request_changes' blocks merge; event='comment' adds a neutral review comment. Example: musehub_create_proposal_review(repo_id='a3f2-...', proposal_id='b5e8-...', event='approve', body='Sounds great! The bridge lands perfectly.').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"event":{"type":"string","description":"Review verdict: 'approve', 'request_changes', or 'comment'.","enum":["approve","request_changes","comment"]},"body":{"type":"string","description":"Optional review summary."}},"required":["proposal_id","event"]}},{"name":"musehub_create_release","description":"Publish a new release for a MuseHub repository. A release pins a version tag to a commit and packages the state snapshot. Tags must be unique per repo (e.g. 'v1.0', 'final-mix'). For an interactive release flow with elicitation, use musehub_create_release_interactive. Example: musehub_create_release(repo_id='a3f2-...', tag='v1.0', title='First Release', body='Initial session recording.').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"tag":{"type":"string","description":"Version tag string (e.g. 'v1.0'). Must be unique per repo."},"title":{"type":"string","description":"Human-readable release title."},"body":{"type":"string","description":"Markdown release notes."},"commit_id":{"type":"string","description":"Optional commit SHA to pin this release to. Defaults to HEAD of the default branch."},"is_prerelease":{"type":"boolean","description":"When true, marks as pre-release.","default":false}},"required":["tag","title"]}},{"name":"musehub_create_label","description":"Create a repo-scoped label with a name and hex colour. Labels can be applied to issues and proposals for categorisation. Label names must be unique within the repository (max 50 chars). Color must be a 7-character hex string starting with '#' (e.g. '#d73a4a'). Example: musehub_create_label(repo_id='a3f2-...', name='bug', color='#d73a4a').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"name":{"type":"string","description":"Label name (unique per repo, max 50 chars).","maxLength":50},"color":{"type":"string","description":"7-character hex colour starting with '#' (e.g. '#d73a4a').","pattern":"^#[0-9a-fA-F]{6}$"},"description":{"type":"string","description":"Optional label description (max 200 chars).","maxLength":200}},"required":["repo_id","name","color"]}},{"name":"musehub_update_label","description":"Partially update an existing label — rename it, change its colour, or update its description. Only the fields you provide are changed; omitted fields stay as-is. The new name must still be unique within the repository. Get label_id from musehub_list_labels. Example: musehub_update_label(repo_id='sha256:...', label_id='sha256:...', name='critical-bug', color='#b60205').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"label_id":{"type":"string","description":"ID of the label to update (from musehub_list_labels)."},"name":{"type":"string","description":"New label name (optional, max 50 chars, must be unique per repo).","maxLength":50},"color":{"type":"string","description":"New hex colour starting with '#' (optional, e.g. '#b60205').","pattern":"^#[0-9a-fA-F]{6}$"},"description":{"type":"string","description":"New description (optional, max 200 chars; pass '' to clear).","maxLength":200}},"required":["repo_id","label_id"]}},{"name":"musehub_delete_label","description":"Permanently delete a label from a MuseHub repository and remove it from every issue and proposal it is currently attached to. This operation is irreversible. Get label_id from musehub_list_labels. Example: musehub_delete_label(repo_id='sha256:...', label_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"label_id":{"type":"string","description":"ID of the label to delete (from musehub_list_labels)."}},"required":["repo_id","label_id"]}},{"name":"muse_push","description":"Push commits, snapshots, and binary objects to a MuseHub repository. Equivalent to 'muse push' — uploads new commits, their snapshot manifests, and base64-encoded binary objects in a single atomic batch. Enforces fast-forward semantics unless force=true. All three arrays are optional — a push with only commits and no new file content is valid (e.g. a merge commit that modifies no files). Authentication required: use `muse auth keygen` + `muse auth register --agent`. Example: muse_push(repo_id='a3f2-...', branch='main', head_commit_id='abc123', commits=[{commit_id, parent_ids, message, snapshot_id, ...}], snapshots=[{snapshot_id, manifest:{path: object_id}}], objects=[{object_id, path, content_b64}]).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"branch":{"type":"string","description":"Target branch name (e.g. 'main')."},"head_commit_id":{"type":"string","description":"SHA of the new HEAD commit after this push."},"commits":{"type":"array","description":"List of CommitInput objects to push. Each has: commit_id (str), parent_ids (list[str]), message (str), author (str), timestamp (ISO-8601 str), snapshot_id (str).","items":{"type":"object"}},"snapshots":{"type":"array","description":"Snapshot manifests for the pushed commits. Each has: snapshot_id (str, SHA-256 of sorted path:oid pairs), manifest (dict[str, str] mapping path → object_id), created_at (ISO-8601 str, optional). Snapshots are idempotent — already-stored snapshots are skipped. Include one snapshot per commit that introduces file changes.","items":{"type":"object"}},"blobs":{"type":"array","description":"List of blob objects to upload. Each has: object_id (str, e.g. 'sha256:abc...'), path (str, e.g. 'tracks/bass.mid'), content_b64 (str, base64-encoded bytes).","items":{"type":"object"}},"force":{"type":"boolean","description":"Allow non-fast-forward push (overwrites remote head). Use with caution.","default":false}},"required":["branch","head_commit_id"]}},{"name":"muse_config","description":"Read info about Muse configuration keys or generate a 'muse config set' command. Equivalent to 'muse config get <key>' or 'muse config set <key> <value>'. Call without arguments to list all known config keys. Pass key and value to get the exact CLI command to run. Repo-level keys (stored in .muse/config.toml): hub.url, user.type. Auth tokens are stored per-hub in ~/.muse/identity.toml — use 'muse auth login' or write the token directly under the hub hostname section. Example: muse_config(key='hub.url', value='https://musehub.ai').","inputSchema":{"type":"object","properties":{"key":{"type":"string","description":"Configuration key to query or set (e.g. 'hub.url', 'user.type'). Note: auth tokens live in ~/.muse/identity.toml, not config.toml. Omit to list all known keys."},"value":{"type":"string","description":"When provided together with key, returns the CLI command 'muse config set <key> <value>'."}},"required":[]}},{"name":"musehub_publish_domain","description":"Register a new Muse domain plugin in the MuseHub marketplace. After registration the domain appears in musehub_list_domains and can be selected when creating repos (musehub_create_repo). The scoped identifier '@{author_slug}/{slug}' must be globally unique. Authentication required: use `muse auth keygen` + `muse auth register --agent`. The 'capabilities' object must follow the Muse domain schema:\n  dimensions: list of {name, description} objects\n  viewer_type: primary viewer identifier (e.g. 'midi', 'code', 'spatial')\n  artifact_types: list of MIME types the domain produces\n  merge_semantics: 'ot' | 'crdt' | 'three_way'\n  supported_commands: list of muse CLI commands this domain supports\nReturns: {domain_id, scoped_id, manifest_hash} on success. Example: musehub_publish_domain(author_slug='gabriel', slug='genomics', display_name='Genomics', description='Version DNA sequences', capabilities={...}, viewer_type='sequence', version='0.1.0').","inputSchema":{"type":"object","properties":{"author_slug":{"type":"string","description":"Your MuseHub username (owner of the domain)."},"slug":{"type":"string","description":"URL-safe domain name (e.g. 'genomics', 'spatial-3d')."},"display_name":{"type":"string","description":"Human-readable name shown in the marketplace."},"description":{"type":"string","description":"What this domain models and why it benefits from semantic VCS."},"capabilities":{"type":"object","description":"Domain capabilities manifest. Required keys: dimensions (list of {name, description}), viewer_type (string), artifact_types (list of MIME strings), merge_semantics ('ot'|'crdt'|'three_way'), supported_commands (list of muse CLI command names)."},"viewer_type":{"type":"string","description":"Primary viewer identifier (e.g. 'midi', 'code', 'spatial', 'genome')."},"version":{"type":"string","description":"Semver string (e.g. '0.1.0').","default":"0.1.0"}},"required":["author_slug","slug","display_name","description","capabilities","viewer_type"]}},{"name":"musehub_agent_notify","description":"Send a real-time signal to another agent's active MCP session(s) via SSE.\n\nThe target agent receives a notifications/agent_message event on their GET /mcp SSE stream immediately — no polling needed.\n\nUse cases:\n  - Handoff: 'I finished processing the repo, your turn'\n  - Unblock: 'I released the reservation on AudioEngine, you can proceed'\n  - Coordinate: 'I found a conflict in track 3, assigning to you'\n\ntarget_handle is the MSign handle (username) of the receiving agent.\nevent is a short string naming the signal (e.g. 'task_complete', 'handoff', 'conflict_found').\npayload is arbitrary JSON for the receiver to act on.\n\nReturns sessions_reached=0 with not_ready error if the target has no active sessions.\nCheck musehub_read_coord_swarm() to see which agents are currently connected.","inputSchema":{"type":"object","properties":{"target_handle":{"type":"string","description":"MSign handle (username) of the target agent to notify."},"event":{"type":"string","description":"Short signal name (e.g. 'task_complete', 'handoff', 'unblocked')."},"payload":{"type":"object","description":"Arbitrary JSON payload for the receiving agent."}},"required":["target_handle","event","payload"]}},{"name":"musehub_agent_broadcast","description":"Broadcast a real-time signal to ALL agents focused on the same repo via SSE.\n\nDelivers notifications/agent_message to every active MCP session whose repo focus matches your current session focus (set via musehub_set_context). Your own session is excluded.\n\nUse cases:\n  - Swarm coordination: 'Starting merge, pause your pushes'\n  - Progress updates: 'Analysis complete, results in task queue'\n  - Phase transitions: 'Phase 1 done, all workers proceed to phase 2'\n\nRequires musehub_set_context(owner, slug) to be called first.\nReturns sessions_reached=0 (not an error) when no other agents are focused on the repo.","inputSchema":{"type":"object","properties":{"event":{"type":"string","description":"Short signal name (e.g. 'phase_complete', 'merge_starting', 'results_ready')."},"payload":{"type":"object","description":"Arbitrary JSON payload for receiving agents."}},"required":["event","payload"]}},{"name":"musehub_delete_issue_comment","description":"Soft-delete a comment from an issue. Deleted comments are hidden from list results but preserved in the audit log. Requires write/admin access or repo ownership. Get comment_id from musehub_list_issue_comments or the comment creation response. Example: musehub_delete_issue_comment(repo_id='a3f2-...', issue_number=42, comment_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number.","minimum":1},"comment_id":{"type":"string","description":"sha256 genesis ID of the comment to delete."}},"required":["repo_id","issue_number","comment_id"]}},{"name":"musehub_list_collaborators","description":"List all collaborators for a repository with their permission levels. Returns read, write, admin, and owner entries. Authentication required. Example: musehub_list_collaborators(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_invite_collaborator","description":"Invite a user as a collaborator on a repository. Requires the caller to be the repo owner or have admin permission. Permission levels: read (view only), write (push + issue management), admin (write + invite/remove collaborators). Returns error_code='conflict' if the user is already a collaborator. Example: musehub_invite_collaborator(repo_id='a3f2-...', handle='carol', permission='write').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"handle":{"type":"string","description":"MSign handle of the user to invite."},"permission":{"type":"string","description":"Permission level: 'read', 'write' (default), or 'admin'.","enum":["read","write","admin"],"default":"write"}},"required":["repo_id","handle"]}},{"name":"musehub_update_collaborator_permission","description":"Update an existing collaborator's permission level. Requires admin or owner access. The repository owner's own permission cannot be changed through this tool. Example: musehub_update_collaborator_permission(repo_id='a3f2-...', handle='carol', permission='admin').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"handle":{"type":"string","description":"MSign handle of the collaborator to update."},"permission":{"type":"string","description":"New permission level: 'read', 'write', or 'admin'.","enum":["read","write","admin"]}},"required":["repo_id","handle","permission"]}},{"name":"musehub_remove_collaborator","description":"Remove a collaborator from a repository. Requires admin or owner access. The repository owner cannot be removed. Example: musehub_remove_collaborator(repo_id='a3f2-...', handle='carol').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"handle":{"type":"string","description":"MSign handle of the collaborator to remove."}},"required":["repo_id","handle"]}},{"name":"musehub_create_webhook","description":"Register a new webhook subscription for a repository. The webhook URL will receive HTTP POST payloads for each subscribed event type. Valid event types: push, proposal, issue, release, branch, tag, session, analysis. Requires write/admin access or repo ownership. The secret is used to compute an HMAC-SHA256 signature on each payload (sent in the X-MuseHub-Signature header). Example: musehub_create_webhook(repo_id='a3f2-...', url='https://example.com/hook', events=['push', 'release']).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"url":{"type":"string","description":"HTTPS URL that will receive event payloads."},"events":{"type":"array","description":"Event types to subscribe to. Valid: push, proposal, issue, release, branch, tag, session, analysis.","items":{"type":"string"},"minItems":1},"secret":{"type":"string","description":"Optional HMAC-SHA256 signing secret (plaintext). Store securely.","default":""}},"required":["repo_id","url","events"]}},{"name":"musehub_list_webhooks","description":"List all webhook subscriptions for a repository. Returns webhook IDs, URLs, event subscriptions, and active status. Authentication required. Example: musehub_list_webhooks(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_delete_webhook","description":"Delete a webhook subscription and all its delivery history. This operation is irreversible. Requires write/admin access or repo ownership. Get webhook_id from musehub_list_webhooks. Example: musehub_delete_webhook(repo_id='sha256:...', webhook_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"webhook_id":{"type":"string","description":"ID of the webhook to delete (from musehub_list_webhooks)."}},"required":["repo_id","webhook_id"]}},{"name":"musehub_attach_release_asset","description":"Attach a downloadable asset file to an existing release. Assets represent build artifacts, MIDI bundles, model checkpoints, or any file associated with a release. Requires write/admin access or repo ownership. The release must already exist (create it with musehub_create_release first). Example: musehub_attach_release_asset(repo_id='a3f2-...', tag='v1.2.3', name='myapp-v1.2.3-linux.tar.gz', download_url='https://cdn.example.com/myapp-v1.2.3-linux.tar.gz').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"tag":{"type":"string","description":"Release tag the asset belongs to (e.g. 'v1.2.3')."},"name":{"type":"string","description":"Filename shown in the UI (e.g. 'myapp-v1.2.3-linux.tar.gz')."},"download_url":{"type":"string","description":"Direct download URL for the artifact."},"label":{"type":"string","description":"Optional human-readable label (e.g. 'Linux bundle').","default":""},"content_type":{"type":"string","description":"MIME type of the artifact (e.g. 'application/gzip').","default":""},"size":{"type":"integer","description":"File size in bytes (0 if unknown).","default":0}},"required":["repo_id","tag","name","download_url"]}},{"name":"musehub_delete_release_asset","description":"Permanently remove an asset from a release. This operation is irreversible — the download URL remains valid only if the external storage is not also deleted. Requires write/admin access or repo ownership. Get asset_id from musehub_list_release_assets or the asset creation response. Example: musehub_delete_release_asset(repo_id='a3f2-...', tag='v1.2.3', asset_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"tag":{"type":"string","description":"Release tag the asset belongs to."},"asset_id":{"type":"string","description":"ID of the asset to remove (from musehub_list_release_assets)."}},"required":["repo_id","tag","asset_id"]}},{"name":"musehub_list_proposal_comments","description":"Return all review comments for a merge proposal, threaded by parent. Each top-level comment includes a 'replies' list of direct children. Authentication required. Example: musehub_list_proposal_comments(repo_id='sha256:...', proposal_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["repo_id","proposal_id"]}},{"name":"musehub_request_proposal_reviewers","description":"Request one or more reviewers on a merge proposal. Idempotent: requesting an already-assigned reviewer leaves their state unchanged. Requires write/admin access or repo ownership. Example: musehub_request_proposal_reviewers(repo_id='a3f2-...', proposal_id='sha256:...', reviewers=['alice', 'bob']).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"reviewers":{"type":"array","items":{"type":"string"},"description":"List of MSign handles to request as reviewers.","minItems":1}},"required":["repo_id","proposal_id","reviewers"]}},{"name":"musehub_remove_proposal_reviewer","description":"Remove a pending review request from a merge proposal. Only 'pending' rows can be removed — submitted reviews are immutable. Requires write/admin access or repo ownership. Example: musehub_remove_proposal_reviewer(repo_id='a3f2-...', proposal_id='sha256:...', reviewer='alice').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"reviewer":{"type":"string","description":"MSign handle of the reviewer to remove."}},"required":["repo_id","proposal_id","reviewer"]}},{"name":"musehub_list_proposal_reviews","description":"Return all reviews for a merge proposal, optionally filtered by state. States: 'pending', 'approved', 'changes_requested', 'dismissed'. Authentication required. Example: musehub_list_proposal_reviews(repo_id='sha256:...', proposal_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"state":{"type":"string","enum":["pending","approved","changes_requested","dismissed"],"description":"Optional state filter. Omit to return all reviews."}},"required":["repo_id","proposal_id"]}},{"name":"musehub_get_proposal","description":"Read a single merge proposal with full enrichment: blocked_by, blocks, is_blocked, and latest_simulations (conflict_scan / risk_projection / dependency_order results). Use this when you need the complete proposal picture including DAG position and simulation cache. Authentication required. Example: musehub_get_proposal(repo_id='sha256:...', proposal_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["repo_id","proposal_id"]}},{"name":"musehub_run_proposal_simulation","description":"Run a simulation for a merge proposal. Always recomputes — ignores the cache. Stores the result so musehub_get_proposal_simulation can return it without recomputing. simulation_type must be one of: 'conflict_scan', 'risk_projection', 'dependency_order'. conflict_scan: detects file-level conflicts between branches. risk_projection: projects multi-domain merge risk and returns a risk_band (low/medium/high). dependency_order: computes topological order of the proposal DAG; detects cycles. Check is_stale in the response to know if the from-branch has advanced. Example: musehub_run_proposal_simulation(repo_id='sha256:...', proposal_id='sha256:...', simulation_type='conflict_scan').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"simulation_type":{"type":"string","enum":["conflict_scan","risk_projection","dependency_order"],"description":"Type of simulation to run."}},"required":["repo_id","proposal_id","simulation_type"]}},{"name":"musehub_get_proposal_simulation","description":"Read the cached simulation result for a merge proposal without recomputing. Returns error_code='not_found' when no simulation has been run yet — call musehub_run_proposal_simulation first. Check is_stale: when True, the from-branch has advanced and results may be outdated. Example: musehub_get_proposal_simulation(repo_id='sha256:...', proposal_id='sha256:...', simulation_type='risk_projection').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."},"simulation_type":{"type":"string","enum":["conflict_scan","risk_projection","dependency_order"],"description":"Type of simulation to read."}},"required":["repo_id","proposal_id","simulation_type"]}},{"name":"musehub_list_proposal_simulations","description":"List all cached simulations for a merge proposal (up to 3 — one per type). Each entry includes is_stale so you can identify which simulations need refreshing. Returns an empty list when no simulations have been run. Example: musehub_list_proposal_simulations(repo_id='sha256:...', proposal_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal."}},"required":["repo_id","proposal_id"]}},{"name":"musehub_delete_repo","description":"Soft-delete a MuseHub repository. Only the repo owner may delete. Data is retained for audit; subsequent reads return 404. Example: musehub_delete_repo(repo_id='a3f2-...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."}},"required":["repo_id"]}},{"name":"musehub_update_repo","description":"Partially update mutable settings for a repository. Only non-null fields are written. Caller must be owner or admin collaborator. 'visibility' must be 'public' or 'private'. 'topics' replaces the full tag list. Example: musehub_update_repo(repo_id='a3f2-...', visibility='private', has_issues=true).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"name":{"type":"string","description":"New repo name."},"description":{"type":"string","description":"New markdown description."},"visibility":{"type":"string","enum":["public","private"],"description":"'public' or 'private'."},"default_branch":{"type":"string","description":"New default branch name."},"has_issues":{"type":"boolean","description":"Enable or disable the issues tracker."},"has_wiki":{"type":"boolean","description":"Enable or disable the wiki."},"topics":{"type":"array","items":{"type":"string"},"description":"Full replacement topic tag list."},"homepage_url":{"type":"string","description":"Project homepage URL."},"allow_merge_commit":{"type":"boolean","description":"Allow merge commits on proposals."},"allow_squash_merge":{"type":"boolean","description":"Allow squash merges on proposals."},"allow_rebase_merge":{"type":"boolean","description":"Allow rebase merges on proposals."},"delete_branch_on_merge":{"type":"boolean","description":"Auto-delete head branch after proposal merge."}},"required":["repo_id"]}},{"name":"musehub_transfer_repo_ownership","description":"Transfer ownership of a repository to another user. Only the current owner may initiate — admin collaborators are not permitted. After transfer the calling user loses owner privileges immediately. Example: musehub_transfer_repo_ownership(repo_id='a3f2-...', new_owner='alice').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"new_owner":{"type":"string","description":"MSign handle of the new owner."}},"required":["repo_id","new_owner"]}},{"name":"musehub_list_issue_comments","description":"List all non-deleted comments on an issue, oldest first. Returns commentId, author, body, createdAt for each comment. Call musehub_read_issue first to confirm the issue exists. Example: musehub_list_issue_comments(repo_id='a3f2-...', issue_number=42).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"issue_number":{"type":"integer","description":"Per-repo issue number."},"limit":{"type":"integer","description":"Max comments to return (default 100).","default":100},"cursor":{"type":"string","description":"Pagination cursor from a previous nextCursor value."}},"required":["issue_number"]}},{"name":"musehub_update_release","description":"Update a release's title, body, channel, or draft status. Only fields provided are changed — omitted fields are left unchanged. Requires repo owner or write/admin collaborator. Example: musehub_update_release(repo_id='a3f2-...', tag='v1.0.0', title='New title').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"tag":{"type":"string","description":"Release tag to update (e.g. 'v1.0.0')."},"title":{"type":"string","description":"New release title."},"body":{"type":"string","description":"New release notes (Markdown)."},"channel":{"type":"string","enum":["stable","beta","alpha","nightly"],"description":"Distribution channel."},"is_draft":{"type":"boolean","description":"Draft status."}},"required":["tag"]}},{"name":"musehub_list_release_assets","description":"List all assets attached to a release. Returns assetId, name, label, contentType, size, downloadUrl, downloadCount. Example: musehub_list_release_assets(repo_id='a3f2-...', tag='v1.0.0').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"tag":{"type":"string","description":"Release tag."},"limit":{"type":"integer","default":50},"cursor":{"type":"string"}},"required":["tag"]}},{"name":"musehub_read_user_profile","description":"Fetch a user's public profile: bio, avatarUrl, repoCount, followerCount, followingCount, pinnedRepos. No auth required — profiles are publicly accessible. Example: musehub_read_user_profile(username='gabriel').","inputSchema":{"type":"object","properties":{"username":{"type":"string","description":"MuseHub username."}},"required":["username"]}},{"name":"musehub_update_user_profile","description":"Update the authenticated user's profile. Accepts bio, avatarUrl, and pinnedRepoIds (list of repo sha256 genesis IDs). Caller must be the owner of the profile. Example: musehub_update_user_profile(username='gabriel', bio='Composer and engineer').","inputSchema":{"type":"object","properties":{"username":{"type":"string","description":"Your MuseHub username."},"bio":{"type":"string","description":"Profile bio text."},"avatar_url":{"type":"string","description":"Avatar image URL."},"pinned_repo_ids":{"type":"array","items":{"type":"string"},"description":"List of repo sha256 genesis IDs to pin (replaces all pinned repos)."}},"required":["username"]}},{"name":"musehub_read_profile_manifest","description":"Return the full archetype-aware profile manifest for a MuseHub identity. Includes identity_type, activity canvas (5 domains × 364-day grids), attestation badges, avax_address (human), agent_model + trust_chain (agent), org manifest (org), and MPay ledger totals. Example: musehub_read_profile_manifest(handle='gabriel').","inputSchema":{"type":"object","properties":{"handle":{"type":"string","description":"MSign handle of the identity."}},"required":["handle"]}},{"name":"musehub_issue_attestation","description":"Issue a cryptographically-verified attestation about a MuseHub identity. The caller must supply an Ed25519 signature over ATTEST\\n{attester}\\n{subject}\\n{claim}\\n{issued_at_iso}. Idempotent — re-issuing the same attestation returns the existing record. Example: musehub_issue_attestation(attester='gabriel', subject='aria', claim='{\"type\":\"human\"}', issued_at_iso='2026-04-21T12:00:00+00:00', signature='ed25519:...', attester_public_key='ed25519:...').","inputSchema":{"type":"object","properties":{"attester":{"type":"string","description":"Handle of the attesting identity."},"subject":{"type":"string","description":"Handle of the attested identity."},"claim":{"type":"string","description":"JSON claim payload."},"issued_at_iso":{"type":"string","description":"ISO-8601 timestamp of issuance."},"signature":{"type":"string","description":"Ed25519 signature; 'ed25519:<base64url>'."},"attester_public_key":{"type":"string","description":"Attester public key; 'ed25519:<base64url>'."}},"required":["attester","subject","claim","issued_at_iso","signature","attester_public_key"]}},{"name":"musehub_revoke_attestation","description":"Revoke an attestation by ID. Only the original attester may revoke their own attestation. Example: musehub_revoke_attestation(attestation_id='sha256:...', revoker='gabriel').","inputSchema":{"type":"object","properties":{"attestation_id":{"type":"string","description":"sha256:-prefixed attestation ID."},"revoker":{"type":"string","description":"MSign handle of the caller (must be original attester)."}},"required":["attestation_id","revoker"]}},{"name":"musehub_list_attestations","description":"List all attestations about a subject identity. Set include_revoked=true to include revoked attestations. Example: musehub_list_attestations(subject='aria').","inputSchema":{"type":"object","properties":{"subject":{"type":"string","description":"Handle of the identity whose attestations to list."},"include_revoked":{"type":"boolean","default":false,"description":"Include revoked attestations."}},"required":["subject"]}},{"name":"musehub_record_mpay_claim","description":"Record a verified MPay micropayment claim. The caller must supply an Ed25519 signature over MPAY\\n{sender}\\n{recipient}\\n{amount_nano}\\n{nonce_hex}. Idempotent on nonce_hex. amount_nano must be > 0 and sender != recipient. Example: musehub_record_mpay_claim(sender='gabriel', recipient='aria', amount_nano=500000, nonce_hex='bb...bb', signature='ed25519:...', sender_public_key='ed25519:...').","inputSchema":{"type":"object","properties":{"sender":{"type":"string","description":"Handle of the payer."},"recipient":{"type":"string","description":"Handle of the payee."},"amount_nano":{"type":"integer","description":"Payment in nanoMUSE (> 0)."},"nonce_hex":{"type":"string","description":"64-char hex nonce for replay protection."},"signature":{"type":"string","description":"Ed25519 signature; 'ed25519:<base64url>'."},"sender_public_key":{"type":"string","description":"Sender public key; 'ed25519:<base64url>'."},"memo":{"type":"string","description":"Optional payment memo."}},"required":["sender","recipient","amount_nano","nonce_hex","signature","sender_public_key"]}},{"name":"musehub_get_mpay_ledger","description":"Return the MPay ledger for a handle — sent and received claims with totals. limit is clamped to 500. Example: musehub_get_mpay_ledger(handle='gabriel', limit=50).","inputSchema":{"type":"object","properties":{"handle":{"type":"string","description":"MSign handle whose ledger to return."},"limit":{"type":"integer","default":100,"description":"Max claims per direction (clamped to 500)."}},"required":["handle"]}},{"name":"musehub_list_topics","description":"Browse all topics registered on MuseHub with their repo counts. Filter by substring query. Example: musehub_list_topics(query='jazz').","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Substring filter on topic names."},"limit":{"type":"integer","default":50}},"required":[]}},{"name":"musehub_set_repo_topics","description":"Replace all topics for a repository (max 20). Pass an empty list to clear all topics. Requires repo owner or write/admin collaborator. Example: musehub_set_repo_topics(repo_id='a3f2-...', topics=['jazz', 'midi', 'generative']).","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"topics":{"type":"array","items":{"type":"string"},"description":"Full topic list to apply (replaces existing topics).","maxItems":20}},"required":["topics"]}},{"name":"musehub_list_webhook_deliveries","description":"List recent delivery attempts for a webhook. Returns deliveryId, event, status, statusCode, duration, createdAt per delivery. Use deliveryId with musehub_redeliver_webhook to retry a failed delivery. Example: musehub_list_webhook_deliveries(repo_id='sha256:...', webhook_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"webhook_id":{"type":"string","description":"ID of the webhook."},"limit":{"type":"integer","default":20},"cursor":{"type":"string"}},"required":["webhook_id"]}},{"name":"musehub_redeliver_webhook","description":"Re-send a previously attempted webhook delivery. Requires the webhook_id and the delivery_id to retry. Example: musehub_redeliver_webhook(repo_id='sha256:...', webhook_id='sha256:...', delivery_id='sha256:...').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"webhook_id":{"type":"string","description":"ID of the webhook."},"delivery_id":{"type":"string","description":"ID of the delivery to redeliver."}},"required":["webhook_id","delivery_id"]}},{"name":"muse_mist_create","description":"Publish a new content-addressed, cryptographically signed Mist. The mist_id is derived automatically from the artifact content (SHA-256 → base-58, 12 chars) — identical content from any owner produces the same mist_id. Artifact type and language are detected from filename and content. Symbol anchors are extracted automatically for Python/JS/TS code. Rate-limited to 20 creates per minute per handle. Example: muse_mist_create(filename='validate.py', content='def validate(x): ...', title='Handle validation primitive', tags=['security', 'utils'])","inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"Original filename (used for type detection). Must not be empty."},"content":{"type":"string","description":"Artifact content (UTF-8 text, or base64 for binary). Must not be empty."},"title":{"type":"string","description":"Optional human-readable title.","default":""},"description":{"type":"string","description":"Optional Markdown description.","default":""},"visibility":{"type":"string","enum":["public","secret"],"description":"Visibility: 'public' (default) or 'secret'.","default":"public"},"tags":{"type":"array","items":{"type":"string"},"description":"Freeform tags (max 10)."},"agent_id":{"type":"string","description":"Agent identifier for AI-authored mists.","default":""},"model_id":{"type":"string","description":"Model identifier for AI provenance.","default":""},"gpg_signature":{"type":"string","description":"ASCII-armoured Ed25519 signature (optional)."}},"required":["filename","content"]}},{"name":"muse_mist_update","description":"Update a mist's metadata or replace its content. Only the mist owner may update. Fields that are omitted are left unchanged (partial update). Replacing content increments the version counter. Example: muse_mist_update(mist_id='aB3xKq9dPwNm', title='Better title', visibility='secret')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"12-character mist ID to update."},"title":{"type":"string","description":"New title (omit to leave unchanged)."},"description":{"type":"string","description":"New Markdown description (omit to leave unchanged)."},"visibility":{"type":"string","enum":["public","secret"],"description":"New visibility (omit to leave unchanged)."},"tags":{"type":"array","items":{"type":"string"},"description":"New tag list (omit to leave unchanged)."},"content":{"type":"string","description":"New artifact content (omit to leave unchanged). Increments version."}},"required":["mist_id"]}},{"name":"muse_mist_fork","description":"Fork an existing Mist into the authenticated caller's namespace. The fork inherits the source content and metadata but gets a new mist_id and owner. The source's fork_count is incremented. Fork depth is enforced (max 5 levels). Rate-limited to 30 forks per minute per handle. Example: muse_mist_fork(mist_id='aB3xKq9dPwNm')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"mist_id of the Mist to fork."}},"required":["mist_id"]}},{"name":"muse_mist_delete","description":"Permanently delete a Mist and its underlying Muse repository. Only the mist owner may delete. The backing repo (commits, snapshots) is removed via cascade. This action is irreversible. Example: muse_mist_delete(mist_id='aB3xKq9dPwNm')","inputSchema":{"type":"object","properties":{"mist_id":{"type":"string","description":"12-character mist ID to delete."}},"required":["mist_id"]}},{"name":"musehub_claim_coord_task","description":"TASK QUEUE PROTOCOL — Worker step 2: Atomically claim a pending task.\n\nAtomic: only one agent can claim a given task even under concurrent calls.\nReturns the task record with status='claimed' on success.\nReturns task_not_found if the task is already claimed, completed, or doesn't exist — call musehub_list_coord_tasks(status='pending') to find currently claimable tasks.\n\nAfter claiming:\n  - Execute the work described in the task payload\n  - Call musehub_complete_coord_task when done\n  - Call musehub_fail_coord_task if an unrecoverable error occurs\n  - Do not abandon a claimed task — it blocks the queue until TTL expiry","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"task_id":{"type":"string","description":"ID of the task to claim."},"agent_id":{"type":"string","description":"Identifier of the claiming agent (e.g. 'agentception-worker-42')."}},"required":["task_id","agent_id"]}},{"name":"musehub_complete_coord_task","description":"TASK QUEUE PROTOCOL — Worker step 3a: Mark your claimed task as completed.\n\nThe agent_id must match the agent that claimed the task.\nAttach a result payload with any output the orchestrator needs (e.g. commit_id, analysis summary, generated file paths).\nReturns task_not_found if the task is not claimed by this agent.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"task_id":{"type":"string","description":"ID of the claimed task to complete."},"agent_id":{"type":"string","description":"Agent ID that claimed this task."},"result":{"type":"object","description":"Optional JSON result payload to attach to the completed task."}},"required":["task_id","agent_id"]}},{"name":"musehub_fail_coord_task","description":"TASK QUEUE PROTOCOL — Worker step 3b: Mark your claimed task as failed.\n\nUse this when the task cannot be completed (error, conflict, missing dependency).\nInclude a reason so the orchestrator can diagnose and re-enqueue or escalate.\nThe agent_id must match the agent that claimed the task.\nReturns task_not_found if the task is not claimed by this agent.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"task_id":{"type":"string","description":"ID of the claimed task to fail."},"agent_id":{"type":"string","description":"Agent ID that claimed this task."},"reason":{"type":"string","description":"Human-readable reason the task failed.","default":""}},"required":["task_id","agent_id"]}},{"name":"musehub_extend_coord_reservation","description":"SYMBOL EDITING PROTOCOL — Optional: Extend a reservation's TTL mid-work.\n\nCall this if your editing work will exceed the original TTL before you can release.\nExtend by 30–3600 seconds (default 300 / 5 min).\nBetter to extend proactively than to let the reservation expire — an expired reservation allows other agents to reserve the same symbols.\n\nUse the reservation_id returned by musehub_create_coord_reservation.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"reservation_id":{"type":"string","description":"ID of the reservation to extend."},"extend_by_s":{"type":"integer","description":"Seconds to add to the current expiry (30–3600, default 300).","default":300,"minimum":30,"maximum":3600}},"required":["reservation_id"]}},{"name":"musehub_create_coord_reservation","description":"SYMBOL EDITING PROTOCOL — Step 2 of 3: Reserve symbol addresses before editing them.\n\nStep 1: musehub_read_coord_conflicts(addresses=[...]) — verify symbols are free.\nStep 2: musehub_create_coord_reservation(addresses=[...], agent_id='...', ttl_s=300) — lock them.\nStep 3: Do your work, then musehub_delete_coord_reservation(reservation_id='...') when done.\n\nIf another agent has the symbols reserved, read_coord_conflicts will tell you — wait and retry rather than proceeding without a reservation.\nOne reservation_id covers all addresses in the batch.\nDefault TTL is 300s (5 min). Extend with musehub_extend_coord_reservation if work takes longer.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"addresses":{"type":"array","items":{"type":"string"},"description":"Symbol addresses to reserve (e.g. 'src/engine.py::AudioEngine').","minItems":1,"maxItems":50},"agent_id":{"type":"string","description":"Identifier of the reserving agent (e.g. 'agentception-worker-42')."},"ttl_s":{"type":"integer","description":"Reservation TTL in seconds (30–3600, default 300).","default":300,"minimum":30,"maximum":3600}},"required":["addresses","agent_id"]}},{"name":"musehub_delete_coord_reservation","description":"SYMBOL EDITING PROTOCOL — Step 3 of 3: Release a reservation when done editing.\n\nAlways release after your work is committed so other agents can proceed.\nIf you crash or forget, the TTL will expire the reservation automatically.\nUse the reservation_id returned by musehub_create_coord_reservation.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"reservation_id":{"type":"string","description":"ID returned by musehub_create_coord_reservation."},"agent_id":{"type":"string","description":"Agent ID that created the reservation."}},"required":["reservation_id","agent_id"]}},{"name":"musehub_enqueue_coord_task","description":"TASK QUEUE PROTOCOL — Orchestrator step: Enqueue a task for worker agents to claim.\n\nFull task lifecycle:\n  Orchestrator: musehub_enqueue_coord_task(queue='...', payload={...}, agent_id='orchestrator') → task_id\n  Worker: musehub_list_coord_tasks(status='pending') → find claimable tasks\n  Worker: musehub_claim_coord_task(task_id='...', agent_id='worker-N') → atomic claim\n  Worker: [do the work]\n  Worker: musehub_complete_coord_task(task_id='...', agent_id='worker-N', result={...})\n       or musehub_fail_coord_task(task_id='...', agent_id='worker-N', reason='...')\n\nPriority 0–100 (higher = processed first). Default 50.\nUse depends_on to declare task_ids this task should wait for.","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"queue":{"type":"string","description":"Queue name (e.g. 'tasks', 'analysis', 'review')."},"payload":{"type":"object","description":"Arbitrary JSON payload describing the task for the worker."},"agent_id":{"type":"string","description":"Agent creating this task (e.g. 'orchestrator', 'agentception-main')."},"priority":{"type":"integer","description":"Task priority 0–100. Higher is processed first. Default 50.","default":50,"minimum":0,"maximum":100},"depends_on":{"type":"array","items":{"type":"string"},"description":"task_ids this task depends on (informational, not enforced by server)."}},"required":["queue","payload","agent_id"]}},{"name":"musehub_read_cross_repo_impact","description":"Compute the blast radius of a symbol across all repos in the owner's workspace. Returns local co-changed symbols (within the source repo) AND symbols from other repos that were modified during overlapping time windows — surfacing cross-repo coupling heuristically from shared commit timestamps. Example: musehub_read_cross_repo_impact(repo_id='a3f2-...', address='musehub.services.musehub_wire.wire_push').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"address":{"type":"string","description":"Fully-qualified symbol address to analyse."}},"required":["repo_id","address"]}},{"name":"musehub_read_workspace_intel","description":"Return a health overview for all repos in an owner's workspace. Includes per-repo symbol counts, health scores, and the top 10 cross-repo blast-risk symbols. Example: musehub_read_workspace_intel(owner='gabriel').","inputSchema":{"type":"object","properties":{"owner":{"type":"string","description":"Owner username whose workspace to inspect."}},"required":["owner"]}},{"name":"musehub_review_proposal_interactive","description":"Review a merge proposal interactively by first eliciting the reviewer's focus dimension and depth (quick / standard / thorough). Returns a deep structured review targeting the chosen dimensions with per-dimension divergence scores. Currently implements the MIDI domain's dimension vocabulary (melodic / harmonic / rhythmic / structural / dynamic / all). For repos on other domains, call musehub_read_domain first to learn the correct dimension names, then pass dimension= directly to skip elicitation. For a non-interactive review, use musehub_read_proposal + musehub_create_proposal_review instead. ELICITATION BEHAVIOUR: requires an active MCP session (Mcp-Session-Id header). Without a session, pass dimension= and depth= directly to skip elicitation. Example: musehub_review_proposal_interactive(repo_id='sha256:...', proposal_id='sha256:...') or musehub_review_proposal_interactive(repo_id='sha256:...', proposal_id='sha256:...', dimension='harmonic', depth='thorough').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"proposal_id":{"type":"string","description":"sha256 genesis ID of the merge proposal to review."},"dimension":{"type":"string","description":"Focus dimension to bypass elicitation. One of: melodic, harmonic, rhythmic, structural, dynamic, all.","enum":["melodic","harmonic","rhythmic","structural","dynamic","all"]},"depth":{"type":"string","description":"Review depth to bypass elicitation: quick, standard, or thorough.","enum":["quick","standard","thorough"]}},"required":["proposal_id"]}},{"name":"musehub_create_release_interactive","description":"Create a release interactively in two chained elicitation steps: (1) form-mode: collects tag, title, release notes, changelog highlight, and pre-release flag; (2) URL-mode (optional): offers streaming platform OAuth connection. Creates the release then returns distribution guidance for connected platforms. For a non-interactive release, use musehub_create_release with explicit arguments. ELICITATION BEHAVIOUR: requires an active MCP session with elicitation capability. Without a session, pass tag=, title=, notes= directly to bypass elicitation and create the release immediately (identical to musehub_create_release). Example: musehub_create_release_interactive(repo_id='a3f2-...') or musehub_create_release_interactive(repo_id='a3f2-...', tag='v1.0.0', title='First release', notes='Initial commit').","inputSchema":{"type":"object","properties":{"repo_id":{"type":"string","description":"sha256 genesis ID of the MuseHub repository. Alternatively, provide 'owner' + 'slug' to identify by URL path. All three can be omitted if session context is set via musehub_set_context."},"owner":{"type":"string","description":"Repository owner username (e.g. 'gabriel'). Use with 'slug' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"slug":{"type":"string","description":"Repository slug — the URL-safe name (e.g. 'jazz-standards'). Use with 'owner' as an alternative to 'repo_id'. Omit if session context is already set via musehub_set_context."},"tag":{"type":"string","description":"Semver tag string (e.g. 'v1.0.0'). Elicited if omitted."},"title":{"type":"string","description":"Release title. Elicited if omitted."},"notes":{"type":"string","description":"Release notes markdown. Elicited if omitted."},"pre_release":{"type":"boolean","description":"Whether this is a pre-release. Default: false.","default":false}},"required":[]}}],"resources":[{"uri":"musehub://trending","name":"Trending Repositories","description":"Top public MuseHub repositories ranked by recent commit activity across all domains. Use this to discover active state repositories before browsing or forking.","mimeType":"application/json"},{"uri":"musehub://me","name":"My Profile","description":"Authenticated user's profile, public stats, and pinned repositories. Requires authentication.","mimeType":"application/json"},{"uri":"musehub://me/notifications","name":"My Notifications","description":"Unread notification inbox for the authenticated user: Proposal reviews, issue mentions, and new comments. Requires authentication.","mimeType":"application/json"},{"uri":"musehub://me/feed","name":"My Activity Feed","description":"Recent activity (commits, proposals, issues) across repositories the authenticated user follows. Requires authentication.","mimeType":"application/json"},{"uri":"muse://docs/overview","name":"Muse Paradigm Overview","description":"High-level introduction to the Muse paradigm: State, Commit, Branch, Merge, and Drift. Explains how Muse extends version control from text/code to any multidimensional state space. Essential first read for any agent new to Muse.","mimeType":"application/json"},{"uri":"muse://docs/protocol","name":"MuseDomainPlugin Protocol Spec","description":"Full specification of the MuseDomainPlugin protocol — the six interfaces every domain plugin must implement: StateSerializer, DiffEngine, MergeStrategy, InsightProvider, ViewRenderer, and ArtifactManager. Read this to understand how domains work or to build a new one.","mimeType":"application/json"},{"uri":"muse://docs/domains","name":"Domain Plugin Authoring Guide","description":"Step-by-step guide for authoring and registering a new Muse domain plugin. Covers the MuseDomainPlugin scaffold, capability manifest schema, viewer registration, and publishing to the MuseHub domain registry.","mimeType":"application/json"},{"uri":"muse://domains","name":"Registered Domain Plugins","description":"All domain plugins registered on this MuseHub instance, with their scoped IDs (@author/slug), dimension counts, viewer types, and install counts. Use musehub_list_domains for richer filtering.","mimeType":"application/json"},{"uri":"musehub://me/tokens","name":"My Active Agent Tokens","description":"Active agent identities registered by the authenticated user. Returns identity metadata: agent_name, issued_at, expires_at, and last_used. Run `muse auth keygen` then `muse auth register --agent` to register new identities. Requires authentication.","mimeType":"application/json"}],"resourceTemplates":[{"uriTemplate":"musehub://repos/{owner}/{slug}","name":"Repository Overview","description":"Metadata, stats, and recent activity for a public repository.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/branches","name":"Repository Branches","description":"All branches with their head commit IDs.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/commits","name":"Repository Commits","description":"Paginated commit history (newest first) across all branches.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/commits/{commit_id}","name":"Single Commit","description":"Detailed commit metadata including parent IDs and artifact snapshot.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/tree/{ref}","name":"File Tree","description":"All artifact paths and MIME types at the given branch or commit ref.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/blob/{ref}/{path}","name":"File Metadata","description":"Metadata for a single artifact (path, size, MIME type, object ID).","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/issues","name":"Issues","description":"Open issues for the repository.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/issues/{number}","name":"Single Issue","description":"A single issue with its full comment thread.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/proposals","name":"Merge Proposals","description":"Merge proposals for the repository.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/proposals/{number}","name":"Single Merge Proposal","description":"A single merge proposal with reviews and inline musical comments.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/releases","name":"Releases","description":"All releases ordered newest first.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/releases/{tag}","name":"Single Release","description":"A specific release by tag with asset download counts.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/insights/{ref}","name":"Domain Insights","description":"Domain-specific insight dimensions at a given ref. The dimensions returned are sourced from the repo's domain plugin capabilities — e.g. harmony/rhythm/melody for MIDI repos, or symbols/hotspots/coupling for code repos.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/timeline","name":"State Timeline","description":"Chronological evolution of the repository's state across all dimensions. Shows commits, branch divergences, and structural milestones over time.","mimeType":"application/json"},{"uriTemplate":"musehub://users/{username}","name":"User Profile","description":"Public profile and list of public repositories for a user.","mimeType":"application/json"},{"uriTemplate":"muse://domains/{author}/{slug}","name":"Domain Plugin Manifest","description":"Full manifest for a specific registered domain plugin: capabilities, dimensions, viewer type, artifact types, merge semantics, and install instructions. Use {author}=gabriel and {slug}=midi to read the built-in MIDI domain.","mimeType":"application/json"},{"uriTemplate":"musehub://repos/{owner}/{slug}/remote","name":"Repository Remote Info","description":"Remote URL, push/pull API endpoints, and Muse CLI commands for a repository. Returns origin URL, push endpoint, pull endpoint, clone command, and the 'muse remote add origin' command. Equivalent to 'muse remote -v' for a MuseHub repo.","mimeType":"application/json"},{"uriTemplate":"musehub://mists/{owner}/{mist_id}","name":"Mist","description":"Full metadata and content for a single Mist by its content-addressed ID. Public mists are readable by any caller. Secret mists require authentication as the owner. Example: musehub://mists/gabriel/aB3xKq9dPwNm","mimeType":"application/json"},{"uriTemplate":"musehub://mists/{owner}","name":"Owner Mist List","description":"All public Mists published by a specific user, newest first. Example: musehub://mists/gabriel","mimeType":"application/json"}],"prompts":[{"name":"musehub/orientation","description":"Explains MuseHub's model (repos, commits, branches, domains, multidimensional state) and which tools to use for what. The essential first read for any new caller. Pass caller_type='agent' for agent-specific guidance including MSign Ed25519 auth, rate limits, agent onboarding, and the read-modify-commit cycle.","arguments":[{"name":"caller_type","description":"Caller type: 'human' (default) or 'agent'. Tailors the orientation content.","required":false}]},{"name":"musehub/contribute","description":"End-to-end contribution workflow: authenticate → set up remote → discover repo → orient via get_context → open issue → push commit → create proposal → request review → merge. Includes push setup (auth, remote config, muse_push) as a prerequisite step.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the target repository.","required":true},{"name":"owner","description":"Repository owner username.","required":false},{"name":"slug","description":"Repository slug.","required":false}]},{"name":"musehub/create","description":"Domain-agnostic state creation workflow: get context → understand existing dimensions → push new state commit → verify via domain insights. Works for any Muse domain (MIDI, Code, Genomics, etc.).","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository to create state in.","required":true},{"name":"domain","description":"Domain scoped ID (e.g. '@gabriel/midi'). Auto-resolved from repo if omitted.","required":false}]},{"name":"musehub/review_proposal","description":"Dimension-aware proposal review: get proposal → read domain insights → compare branches → submit review with dimension_ref-anchored comments.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository.","required":true},{"name":"proposal_id","description":"sha256 genesis ID of the proposal to review.","required":true}]},{"name":"musehub/issue_triage","description":"Triage open issues: list → label → assign → add commit anchors.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository whose issues to triage.","required":true}]},{"name":"musehub/release_prep","description":"Prepare a release: check merged proposals → write release notes → create release with version tag.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository to release.","required":true}]},{"name":"musehub/onboard","description":"Interactive creator onboarding (MCP 2025-11-25 elicitation-aware). Guides a new MuseHub creator through: profile setup → domain selection (via musehub_list_domains) → first repo creation → initial state scaffold → optional cloud integration. Requires an active session with elicitation capability.","arguments":[{"name":"username","description":"MuseHub username of the creator being onboarded.","required":false}]},{"name":"musehub/safe-to-merge","description":"Pre-merge safety audit for a merge proposal. Runs: risk score → symbol diff → breakage check → blast radius → CI status → reviews. Produces a structured merge recommendation: APPROVE, APPROVE WITH CAUTION, or BLOCK.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository.","required":true},{"name":"proposal_id","description":"sha256 genesis ID of the merge proposal to audit.","required":true}]},{"name":"musehub/pre-release-audit","description":"Full repository health audit before cutting a release. Runs: health score → hotspots → dead code → blast risk → open proposals → recent breakages. Produces a structured GO / GO WITH CAUTION / NO-GO release recommendation.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository.","required":true}]},{"name":"musehub/agent-onboarding","description":"Onboarding guide for a new agent joining a multi-agent swarm on a MuseHub repository. Covers: authenticate → get context → survey swarm state → reserve symbols → claim task → commit with provenance → complete task. Teaches the read-reserve-edit-commit cycle and how to avoid conflicts with concurrent agents.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository the agent is joining.","required":true},{"name":"agent_id","description":"Identifier for this agent instance (e.g. 'agentception-worker-42').","required":false},{"name":"queue","description":"Task queue to pull from (e.g. 'tasks', 'analysis'). Default: 'tasks'.","required":false}]},{"name":"musehub/symbol-investigation","description":"Deep-dive symbol investigation workflow: find a symbol → read its body → compute blast radius → trace provenance → surface co-change partners → check for active reservations. Produces a structured investigation report suitable for deciding whether to edit the symbol or delegate to another agent.","arguments":[{"name":"repo_id","description":"sha256 genesis ID of the repository.","required":true},{"name":"address","description":"Symbol address to investigate (e.g. 'src/engine.py::AudioEngine').","required":true}]}]}