FastMCP Server Integration in Music Assistant: Architecture and Implementation
Music Assistant ships a built-in FastMCP server that implements the Music Control Protocol (MCP) using the fastmcp library, exposing player controls, library management, and queue operations through HTTP/ASGI endpoints.
The music-assistant/server repository includes a native FastMCP server integration that transforms Music Assistant into an MCP-compatible control plane. This integration allows external clients and automation systems to manipulate playback, manage media libraries, and configure players through a standardized protocol. The server implementation resides in the music_assistant.providers.fastmcp_server package and loads automatically as a provider plugin when Music Assistant starts.
Architecture of the FastMCP Integration
The integration follows a layered provider architecture that bridges the FastMCP protocol with Music Assistant's core services.
Provider Entry Point
The MCPServerProvider class in music_assistant/providers/fastmcp_server/provider.py subclasses PluginProvider to integrate with Music Assistant's plugin system. It implements lifecycle methods including handle_async_init, loaded_in_mass, unload, and update_config to manage the server's initialization and shutdown sequences.
Runtime and Server Initialization
The MCPServerRuntime class, defined in music_assistant/providers/fastmcp_server/server.py, instantiates the root FastMCP object. This runtime mounts sub-servers for distinct functional domains—such as players, media, and library operations—and wires them to the ASGI bridge for external communication.
Tool Registration and Sub-servers
Individual tools exposing MCP-compatible endpoints live under the tools/ directory. These include:
tools/volume.pyfor volume controls (e.g.,volume.set)tools/queue.pyfor queue management (e.g.,queue.add)tools/playlists.pyfor playlist operations (e.g.,playlists.create)tools/players.pyfor player state management
The runtime dynamically registers these tools during startup, making them available to MCP clients under the service name declared in manifest.json ("Music Assistant MCP").
HTTP Bridge and Transport
music_assistant/providers/fastmcp_server/http_bridge.py exposes the FastMCP root as an ASGI application. This bridge enables external MCP clients—including Home Assistant—to communicate over HTTP and WebSocket protocols via the /mcp endpoint.
Security and Configuration
Authentication and Authorization
The auth.py and middleware.py files enforce permission checks and translate FastMCP errors into Music Assistant's McpError exceptions. The middleware supports hot-swapping permission changes without requiring a server restart.
Configuration Management
music_assistant/providers/fastmcp_server/config.py handles validation, encryption, and file I/O for provider settings. The config_io/ subdirectory manages secrets such as API keys and allowed origin lists, ensuring sensitive data persists securely across restarts.
Resource Definitions
Static resource schemas defined in music_assistant/providers/fastmcp_server/resources/player_resources.py, library_resources.py, and _uri.py describe MCP resource names, URIs, and capabilities. These definitions enable discovery protocols that allow MCP clients to inspect available functionality at runtime.
Using the FastMCP Server
When Music Assistant boots, the core loads the provider listed in manifest.json. The MCPServerProvider's handle_async_init method creates the FastMCP runtime, mounts the sub-servers, and registers the ASGI app with the core's HTTP router.
Client Connection Examples
You can interact with the embedded server using any FastMCP client:
from fastmcp import Client
# Connect to the local MCP server (default HTTP endpoint is /mcp)
client = Client("http://localhost:8095/mcp")
# Query the current player state
player_state = client.call_tool(
"players.get_player", {"player_id": "my_player"}
)
print("Player state:", player_state)
# Change the volume
client.call_tool(
"volume.set",
{"player_id": "my_player", "volume": 55}
)
# Add a track to the queue
client.call_tool(
"queue.add",
{"player_id": "my_player", "media_item_id": "track:12345"}
)
# List all playlists
playlists = client.call_tool("library.get_playlists", {})
print("Playlists:", playlists)
Extending the Server with Custom Tools
Third-party plugins can register additional MCP tools using the register_tool utility from music_assistant.providers.fastmcp_server.tools._common:
# my_custom_plugin/provider.py
from music_assistant import PluginProvider
from music_assistant.providers.fastmcp_server.tools._common import register_tool
class MyCustomProvider(PluginProvider):
async def handle_async_init(self):
# Register a new MCP tool under the "debug" namespace
async def echo(context, payload):
"""Echoes back the given payload."""
return {"echo": payload}
await register_tool(
name="debug.echo",
func=echo,
description="Echoes the payload for testing.",
input_schema={"type": "object", "properties": {"msg": {"type": "string"}}},
)
This extensibility allows the FastMCP server to grow with custom automation logic while maintaining strict protocol compliance.
Summary
- Provider-based architecture: The FastMCP server implements
MCPServerProviderinprovider.pyto hook into Music Assistant's plugin lifecycle. - Modular tool system: Functionality is split across sub-servers in
tools/, covering volume, queues, playlists, and player controls. - ASGI transport:
http_bridge.pyexposes the server over HTTP/WebSocket at the/mcpendpoint. - Security layers:
auth.pyandmiddleware.pyenforce permissions and error translation. - Configuration management: Encrypted settings and hot-reload support are handled by
config.pyandconfig_io/. - Extensible design: Plugins register custom tools via
register_toolto expand the MCP interface without core modifications.
Frequently Asked Questions
What protocol does the Music Assistant FastMCP server use?
The server implements the Music Control Protocol (MCP) on top of the open-source fastmcp library. It exposes tools and resources through ASGI-compatible HTTP and WebSocket transports, allowing any MCP-compliant client to discover and invoke functions.
Where is the FastMCP server configuration stored?
Configuration validation and encryption are handled in music_assistant/providers/fastmcp_server/config.py, with file operations managed by the config_io/ submodule. This includes secrets like API keys and allowed origin lists that persist across server restarts.
How do I add custom functionality to the FastMCP server?
Third-party plugins can import register_tool from music_assistant.providers.fastmcp_server.tools._common and invoke it during their handle_async_init method. This registers new tools under custom namespaces (e.g., debug.echo) without modifying the core server code.
What endpoints are available on the FastMCP server?
The server exposes standard MCP tools including players.get_player, volume.set, queue.add, playlists.create, and library.get_playlists. The complete schema is defined in the resources/ directory, particularly player_resources.py and library_resources.py, which describe resource URIs and capabilities for client discovery.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →