/
/
/
1"""ConfigEntry schema for the MCP Server provider."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from music_assistant_models.config_entries import ConfigEntry
8from music_assistant_models.enums import ConfigEntryType
9
10from .constants import (
11 CONF_CONFIG_READ,
12 CONF_CONFIG_WRITE_CORE,
13 CONF_CONFIG_WRITE_PLAYER,
14 CONF_CONFIG_WRITE_PROVIDER,
15 CONF_CONFIG_WRITE_SECRET,
16 CONF_CONNECT_EXTERNAL_URL,
17 CONF_CONTROL_MEDIA,
18 CONF_CONTROL_PLAYBACK,
19 CONF_CONTROL_PLAYERS,
20 CONF_CONTROL_VOLUME,
21 CONF_DEBUG_EVENT_BUFFER_CAPACITY,
22 CONF_DEBUG_EVENTS,
23 CONF_DEBUG_INSPECT,
24 CONF_DEBUG_LOGS,
25 CONF_DEBUG_PROVIDERS,
26 CONF_DEBUG_RELOAD,
27 CONF_DELETE_FAVORITES,
28 CONF_DELETE_LIBRARY,
29 CONF_DELETE_PLAYLISTS,
30 CONF_DELETE_QUEUE,
31 CONF_EDIT_FAVORITES,
32 CONF_EDIT_LIBRARY,
33 CONF_EDIT_PLAYLISTS,
34 CONF_EDIT_QUEUE,
35 CONF_ENFORCE_AUDIENCE,
36 CONF_EXTRA_ALLOWED_ORIGINS,
37 CONF_LEAN_ADMIN_SCHEMA,
38 CONF_META_TOOL_DISCOVERY,
39 CONF_MOUNT_PATH,
40 CONF_QUERY_LIBRARY,
41 CONF_QUERY_METADATA,
42 CONF_QUERY_PLAYERS,
43 CONF_QUERY_QUEUE,
44 CONF_REQUIRE_AUTH,
45 CONF_REQUIRE_CONFIRMATION,
46 CONF_RES_LIBRARY,
47 CONF_RES_PLAYER,
48 CONF_RES_PROMPTS,
49 CONF_TRUST_FORWARDED_PROTO,
50 DEFAULT_MOUNT_PATH,
51)
52
53if TYPE_CHECKING:
54 from music_assistant.mass import MusicAssistant
55
56
57def _bool(key: str, default: bool, category: str) -> ConfigEntry:
58 # Label/description intentionally unset: strings.json owns all entry text.
59 return ConfigEntry(
60 key=key,
61 type=ConfigEntryType.BOOLEAN,
62 default_value=default,
63 category=category,
64 required=False,
65 )
66
67
68def build_config_entries(
69 mass: MusicAssistant,
70 mount_path: str,
71) -> tuple[ConfigEntry, ...]:
72 """
73 Return the full ConfigEntry schema for this provider.
74
75 :param mass: MusicAssistant instance, used to compose the info label.
76 :param mount_path: The configured mount path, used to compose the info label URL.
77 """
78 base_url = mass.webserver.base_url.rstrip("/")
79 # Mirror ``MCPServerRuntime.__init__``'s normalisation so the info label
80 # always renders a valid URL even if the user dropped the leading slash.
81 mount_path = "/" + mount_path.strip("/")
82 info_label = f"MCP endpoint: {base_url}{mount_path}\nCreate tokens in Profile â Long-lived access tokens."
83
84 return (
85 ConfigEntry(
86 key="info_label",
87 type=ConfigEntryType.LABEL,
88 label=info_label,
89 category="server",
90 required=False,
91 ),
92 ConfigEntry(
93 key="open_connect",
94 type=ConfigEntryType.ACTION,
95 action="open_connect",
96 required=False,
97 ),
98 ConfigEntry(
99 key=CONF_REQUIRE_AUTH,
100 type=ConfigEntryType.BOOLEAN,
101 default_value=True,
102 category="server",
103 required=False,
104 ),
105 ConfigEntry(
106 key=CONF_MOUNT_PATH,
107 type=ConfigEntryType.STRING,
108 default_value=DEFAULT_MOUNT_PATH,
109 category="server",
110 advanced=True,
111 required=False,
112 ),
113 ConfigEntry(
114 key=CONF_REQUIRE_CONFIRMATION,
115 type=ConfigEntryType.BOOLEAN,
116 default_value=True,
117 category="server",
118 required=False,
119 ),
120 ConfigEntry(
121 key=CONF_ENFORCE_AUDIENCE,
122 type=ConfigEntryType.BOOLEAN,
123 default_value=False,
124 category="server",
125 advanced=True,
126 required=False,
127 ),
128 ConfigEntry(
129 key=CONF_EXTRA_ALLOWED_ORIGINS,
130 type=ConfigEntryType.STRING,
131 default_value="",
132 category="server",
133 advanced=True,
134 required=False,
135 ),
136 ConfigEntry(
137 key=CONF_CONNECT_EXTERNAL_URL,
138 type=ConfigEntryType.STRING,
139 default_value="",
140 category="server",
141 advanced=True,
142 required=False,
143 ),
144 ConfigEntry(
145 key=CONF_LEAN_ADMIN_SCHEMA,
146 type=ConfigEntryType.BOOLEAN,
147 default_value=False,
148 category="server",
149 advanced=True,
150 required=False,
151 ),
152 ConfigEntry(
153 key=CONF_TRUST_FORWARDED_PROTO,
154 type=ConfigEntryType.BOOLEAN,
155 default_value=False,
156 category="server",
157 advanced=True,
158 required=False,
159 ),
160 ConfigEntry(
161 key=CONF_META_TOOL_DISCOVERY,
162 type=ConfigEntryType.BOOLEAN,
163 default_value=False,
164 category="server",
165 advanced=True,
166 required=False,
167 ),
168 # Query permissions
169 _bool(CONF_QUERY_LIBRARY, True, "query_permissions"),
170 _bool(CONF_QUERY_QUEUE, True, "query_permissions"),
171 _bool(CONF_QUERY_PLAYERS, True, "query_permissions"),
172 _bool(CONF_QUERY_METADATA, True, "query_permissions"),
173 # Control permissions
174 _bool(CONF_CONTROL_PLAYBACK, False, "control_permissions"),
175 _bool(CONF_CONTROL_VOLUME, False, "control_permissions"),
176 _bool(CONF_CONTROL_PLAYERS, False, "control_permissions"),
177 _bool(CONF_CONTROL_MEDIA, False, "control_permissions"),
178 # Edit permissions
179 _bool(CONF_EDIT_LIBRARY, False, "edit_permissions"),
180 _bool(CONF_EDIT_QUEUE, False, "edit_permissions"),
181 _bool(CONF_EDIT_PLAYLISTS, False, "edit_permissions"),
182 _bool(CONF_EDIT_FAVORITES, False, "edit_permissions"),
183 # Delete permissions
184 _bool(CONF_DELETE_LIBRARY, False, "delete_permissions"),
185 _bool(CONF_DELETE_QUEUE, False, "delete_permissions"),
186 _bool(CONF_DELETE_PLAYLISTS, False, "delete_permissions"),
187 _bool(CONF_DELETE_FAVORITES, False, "delete_permissions"),
188 # Resources / prompts
189 _bool(CONF_RES_LIBRARY, True, "mcp_resources"),
190 _bool(CONF_RES_PLAYER, True, "mcp_resources"),
191 _bool(CONF_RES_PROMPTS, True, "mcp_resources"),
192 # Debug namespace â all off-by-default. See specs/inprogress/0005-debug-namespace.md.
193 _bool(CONF_DEBUG_INSPECT, False, "debug"),
194 _bool(CONF_DEBUG_LOGS, False, "debug"),
195 _bool(CONF_DEBUG_EVENTS, False, "debug"),
196 _bool(CONF_DEBUG_PROVIDERS, False, "debug"),
197 _bool(CONF_DEBUG_RELOAD, False, "debug"),
198 ConfigEntry(
199 key=CONF_DEBUG_EVENT_BUFFER_CAPACITY,
200 type=ConfigEntryType.INTEGER,
201 default_value=500,
202 range=(50, 5000),
203 category="debug",
204 required=False,
205 ),
206 # Config namespace â all off-by-default. See specs/inprogress/0006-config-read-write.md.
207 _bool(CONF_CONFIG_READ, False, "mcp_config"),
208 _bool(CONF_CONFIG_WRITE_PROVIDER, False, "mcp_config"),
209 _bool(CONF_CONFIG_WRITE_CORE, False, "mcp_config"),
210 _bool(CONF_CONFIG_WRITE_PLAYER, False, "mcp_config"),
211 _bool(CONF_CONFIG_WRITE_SECRET, False, "mcp_config"),
212 )
213