@gradio/core 0.23.2 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -0
- package/dist/src/Blocks.svelte +28 -1
- package/dist/src/Blocks.svelte.d.ts +1 -0
- package/dist/src/api_docs/ApiBanner.svelte +1 -1
- package/dist/src/api_docs/ApiDocs.svelte +52 -270
- package/dist/src/api_docs/MCPSnippet.svelte +571 -0
- package/dist/src/api_docs/MCPSnippet.svelte.d.ts +47 -0
- package/package.json +32 -31
- package/src/Blocks.svelte +32 -1
- package/src/api_docs/ApiBanner.svelte +1 -1
- package/src/api_docs/ApiDocs.svelte +58 -271
- package/src/api_docs/MCPSnippet.svelte +602 -0
package/package.json
CHANGED
|
@@ -1,67 +1,68 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gradio/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"devDependencies": {
|
|
6
|
-
"@gradio/atoms": "^0.16.3",
|
|
7
6
|
"@gradio/accordion": "^0.5.20",
|
|
8
|
-
"@gradio/
|
|
9
|
-
"@gradio/
|
|
7
|
+
"@gradio/atoms": "^0.16.3",
|
|
8
|
+
"@gradio/annotatedimage": "^0.9.27",
|
|
10
9
|
"@gradio/box": "^0.2.21",
|
|
11
|
-
"@gradio/button": "^0.5.7",
|
|
12
10
|
"@gradio/browserstate": "^0.3.2",
|
|
13
|
-
"@gradio/
|
|
14
|
-
"@gradio/
|
|
11
|
+
"@gradio/audio": "^0.17.23",
|
|
12
|
+
"@gradio/chatbot": "^0.26.20",
|
|
13
|
+
"@gradio/button": "^0.5.9",
|
|
15
14
|
"@gradio/checkboxgroup": "^0.6.25",
|
|
16
|
-
"@gradio/
|
|
17
|
-
"@gradio/
|
|
18
|
-
"@gradio/
|
|
19
|
-
"@gradio/dataframe": "^0.18.3",
|
|
20
|
-
"@gradio/datetime": "^0.3.18",
|
|
15
|
+
"@gradio/checkbox": "^0.4.26",
|
|
16
|
+
"@gradio/client": "^1.16.0",
|
|
17
|
+
"@gradio/code": "^0.14.13",
|
|
21
18
|
"@gradio/colorpicker": "^0.4.25",
|
|
22
|
-
"@gradio/downloadbutton": "^0.4.7",
|
|
23
|
-
"@gradio/dropdown": "^0.9.25",
|
|
24
19
|
"@gradio/column": "^0.2.1",
|
|
25
|
-
"@gradio/
|
|
20
|
+
"@gradio/dataset": "^0.4.30",
|
|
21
|
+
"@gradio/dataframe": "^0.18.5",
|
|
22
|
+
"@gradio/downloadbutton": "^0.4.9",
|
|
23
|
+
"@gradio/datetime": "^0.3.18",
|
|
24
|
+
"@gradio/dropdown": "^0.10.0",
|
|
25
|
+
"@gradio/file": "^0.12.26",
|
|
26
|
+
"@gradio/fileexplorer": "^0.5.37",
|
|
26
27
|
"@gradio/fallback": "^0.4.25",
|
|
27
|
-
"@gradio/fileexplorer": "^0.5.35",
|
|
28
28
|
"@gradio/form": "^0.2.21",
|
|
29
|
-
"@gradio/gallery": "^0.15.
|
|
29
|
+
"@gradio/gallery": "^0.15.29",
|
|
30
30
|
"@gradio/group": "^0.2.0",
|
|
31
31
|
"@gradio/highlightedtext": "^0.9.8",
|
|
32
32
|
"@gradio/html": "^0.6.17",
|
|
33
33
|
"@gradio/icons": "^0.12.0",
|
|
34
|
-
"@gradio/image": "^0.22.
|
|
35
|
-
"@gradio/
|
|
36
|
-
"@gradio/
|
|
37
|
-
"@gradio/json": "^0.5.27",
|
|
34
|
+
"@gradio/image": "^0.22.15",
|
|
35
|
+
"@gradio/imageeditor": "^0.16.3",
|
|
36
|
+
"@gradio/imageslider": "^0.2.11",
|
|
38
37
|
"@gradio/label": "^0.5.17",
|
|
38
|
+
"@gradio/multimodaltextbox": "^0.10.15",
|
|
39
39
|
"@gradio/markdown": "^0.13.18",
|
|
40
|
-
"@gradio/model3d": "^0.14.
|
|
41
|
-
"@gradio/
|
|
40
|
+
"@gradio/model3d": "^0.14.23",
|
|
41
|
+
"@gradio/json": "^0.5.27",
|
|
42
42
|
"@gradio/nativeplot": "^0.7.2",
|
|
43
43
|
"@gradio/number": "^0.6.2",
|
|
44
44
|
"@gradio/paramviewer": "^0.7.13",
|
|
45
|
-
"@gradio/radio": "^0.7.8",
|
|
46
45
|
"@gradio/plot": "^0.9.20",
|
|
47
|
-
"@gradio/
|
|
46
|
+
"@gradio/radio": "^0.7.8",
|
|
47
|
+
"@gradio/row": "^0.2.1",
|
|
48
48
|
"@gradio/sidebar": "^0.1.18",
|
|
49
|
+
"@gradio/simpleimage": "^0.8.37",
|
|
49
50
|
"@gradio/simpletextbox": "^0.3.26",
|
|
50
|
-
"@gradio/
|
|
51
|
-
"@gradio/simpleimage": "^0.8.35",
|
|
51
|
+
"@gradio/simpledropdown": "^0.3.25",
|
|
52
52
|
"@gradio/sketchbox": "^0.6.13",
|
|
53
|
-
"@gradio/statustracker": "^0.10.15",
|
|
54
53
|
"@gradio/slider": "^0.6.14",
|
|
55
54
|
"@gradio/state": "^0.1.2",
|
|
56
55
|
"@gradio/tabitem": "^0.5.0",
|
|
57
56
|
"@gradio/tabs": "^0.4.5",
|
|
57
|
+
"@gradio/statustracker": "^0.10.15",
|
|
58
58
|
"@gradio/textbox": "^0.10.18",
|
|
59
59
|
"@gradio/theme": "^0.4.0",
|
|
60
60
|
"@gradio/timer": "^0.4.5",
|
|
61
|
-
"@gradio/upload": "^0.16.11",
|
|
62
|
-
"@gradio/uploadbutton": "^0.9.7",
|
|
63
61
|
"@gradio/utils": "^0.10.2",
|
|
64
|
-
"@gradio/
|
|
62
|
+
"@gradio/vibeeditor": "^0.2.0",
|
|
63
|
+
"@gradio/uploadbutton": "^0.9.9",
|
|
64
|
+
"@gradio/video": "^0.14.23",
|
|
65
|
+
"@gradio/upload": "^0.16.13",
|
|
65
66
|
"@gradio/wasm": "^0.18.1"
|
|
66
67
|
},
|
|
67
68
|
"msw": {
|
package/src/Blocks.svelte
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
export let max_file_size: number | undefined = undefined;
|
|
57
57
|
export let initial_layout: ComponentMeta | undefined = undefined;
|
|
58
58
|
export let css: string | null | undefined = null;
|
|
59
|
+
export let vibe_mode = false;
|
|
59
60
|
let broken_connection = false;
|
|
60
61
|
|
|
61
62
|
let {
|
|
@@ -92,6 +93,8 @@
|
|
|
92
93
|
old_dependencies = dependencies;
|
|
93
94
|
}
|
|
94
95
|
|
|
96
|
+
let vibe_editor_width = 350;
|
|
97
|
+
|
|
95
98
|
async function run(): Promise<void> {
|
|
96
99
|
await setupi18n(app.config?.i18n_translations || undefined);
|
|
97
100
|
|
|
@@ -121,6 +124,7 @@
|
|
|
121
124
|
let ApiDocs: ComponentType<ApiDocs> | null = null;
|
|
122
125
|
let ApiRecorder: ComponentType<ApiRecorder> | null = null;
|
|
123
126
|
let Settings: ComponentType<Settings> | null = null;
|
|
127
|
+
let VibeEditor: ComponentType | null = null;
|
|
124
128
|
|
|
125
129
|
async function loadApiDocs(): Promise<void> {
|
|
126
130
|
if (!ApiDocs || !ApiRecorder) {
|
|
@@ -145,6 +149,13 @@
|
|
|
145
149
|
}
|
|
146
150
|
}
|
|
147
151
|
|
|
152
|
+
async function loadVibeEditor(): Promise<void> {
|
|
153
|
+
if (!VibeEditor) {
|
|
154
|
+
const vibe_editor_module = await import("@gradio/vibeeditor");
|
|
155
|
+
VibeEditor = vibe_editor_module.default;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
148
159
|
async function set_api_docs_visible(visible: boolean): Promise<void> {
|
|
149
160
|
api_recorder_visible = false;
|
|
150
161
|
if (visible) {
|
|
@@ -945,6 +956,15 @@
|
|
|
945
956
|
}
|
|
946
957
|
);
|
|
947
958
|
|
|
959
|
+
const handleVibeEditorResize = (event: CustomEvent): void => {
|
|
960
|
+
vibe_editor_width = event.detail.width;
|
|
961
|
+
};
|
|
962
|
+
|
|
963
|
+
window.addEventListener(
|
|
964
|
+
"vibeEditorResize",
|
|
965
|
+
handleVibeEditorResize as EventListener
|
|
966
|
+
);
|
|
967
|
+
|
|
948
968
|
// Load components if they should be visible on initial page load
|
|
949
969
|
if (api_docs_visible) {
|
|
950
970
|
loadApiDocs();
|
|
@@ -955,6 +975,9 @@
|
|
|
955
975
|
if (settings_visible) {
|
|
956
976
|
loadSettings();
|
|
957
977
|
}
|
|
978
|
+
if (vibe_mode) {
|
|
979
|
+
loadVibeEditor();
|
|
980
|
+
}
|
|
958
981
|
});
|
|
959
982
|
|
|
960
983
|
function screen_recording(): void {
|
|
@@ -976,7 +999,11 @@
|
|
|
976
999
|
</svelte:head>
|
|
977
1000
|
|
|
978
1001
|
<div class="wrap" style:min-height={app_mode ? "100%" : "auto"}>
|
|
979
|
-
<div
|
|
1002
|
+
<div
|
|
1003
|
+
class="contain"
|
|
1004
|
+
style:flex-grow={app_mode ? "1" : "auto"}
|
|
1005
|
+
style:margin-right={vibe_mode ? `${vibe_editor_width}px` : "0"}
|
|
1006
|
+
>
|
|
980
1007
|
{#if $_layout && app.config}
|
|
981
1008
|
<MountComponents
|
|
982
1009
|
rootNode={$_layout}
|
|
@@ -1132,6 +1159,10 @@
|
|
|
1132
1159
|
<Toast {messages} on:close={handle_error_close} />
|
|
1133
1160
|
{/if}
|
|
1134
1161
|
|
|
1162
|
+
{#if vibe_mode && VibeEditor}
|
|
1163
|
+
<svelte:component this={VibeEditor} {app} {root} />
|
|
1164
|
+
{/if}
|
|
1165
|
+
|
|
1135
1166
|
<style>
|
|
1136
1167
|
.wrap {
|
|
1137
1168
|
display: flex;
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import bash from "./img/bash.svg";
|
|
21
21
|
import ResponseSnippet from "./ResponseSnippet.svelte";
|
|
22
22
|
import mcp from "./img/mcp.svg";
|
|
23
|
+
import MCPSnippet from "./MCPSnippet.svelte";
|
|
23
24
|
|
|
24
25
|
export let dependencies: Dependency[];
|
|
25
26
|
export let root: string;
|
|
@@ -109,7 +110,27 @@
|
|
|
109
110
|
|
|
110
111
|
const dispatch = createEventDispatcher();
|
|
111
112
|
|
|
112
|
-
|
|
113
|
+
$: selected_tools_array = Array.from(selected_tools);
|
|
114
|
+
$: selected_tools_without_prefix =
|
|
115
|
+
selected_tools_array.map(remove_tool_prefix);
|
|
116
|
+
$: mcp_server_url = `${root}gradio_api/mcp/sse`;
|
|
117
|
+
$: mcp_server_url_streamable =
|
|
118
|
+
selected_tools_array.length > 0 &&
|
|
119
|
+
selected_tools_array.length < tools.length
|
|
120
|
+
? `${root}gradio_api/mcp/?tools=${selected_tools_without_prefix.join(",")}`
|
|
121
|
+
: `${root}gradio_api/mcp/`;
|
|
122
|
+
|
|
123
|
+
$: if (mcp_json_sse && selected_tools.size > 0) {
|
|
124
|
+
const baseUrl =
|
|
125
|
+
selected_tools_array.length > 0 &&
|
|
126
|
+
selected_tools_array.length < tools.length
|
|
127
|
+
? `${root}gradio_api/mcp/sse?tools=${selected_tools_without_prefix.join(",")}`
|
|
128
|
+
: `${root}gradio_api/mcp/sse`;
|
|
129
|
+
mcp_json_sse.mcpServers.gradio.url = baseUrl;
|
|
130
|
+
if (mcp_json_stdio) {
|
|
131
|
+
mcp_json_stdio.mcpServers.gradio.args[1] = baseUrl;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
113
134
|
|
|
114
135
|
interface ToolParameter {
|
|
115
136
|
title?: string;
|
|
@@ -131,6 +152,15 @@
|
|
|
131
152
|
let mcp_json_sse: any;
|
|
132
153
|
let mcp_json_stdio: any;
|
|
133
154
|
let file_data_present = false;
|
|
155
|
+
let selected_tools: Set<string> = new Set();
|
|
156
|
+
let tool_prefix = space_id ? space_id.split("/").pop() + "_" : "";
|
|
157
|
+
|
|
158
|
+
function remove_tool_prefix(toolName: string): string {
|
|
159
|
+
if (tool_prefix && toolName.startsWith(tool_prefix)) {
|
|
160
|
+
return toolName.slice(tool_prefix.length);
|
|
161
|
+
}
|
|
162
|
+
return toolName;
|
|
163
|
+
}
|
|
134
164
|
|
|
135
165
|
const upload_file_mcp_server = {
|
|
136
166
|
command: "uvx",
|
|
@@ -144,9 +174,10 @@
|
|
|
144
174
|
]
|
|
145
175
|
};
|
|
146
176
|
|
|
147
|
-
async function
|
|
177
|
+
async function fetch_mcp_tools() {
|
|
148
178
|
try {
|
|
149
|
-
|
|
179
|
+
let schema_url = `${root}gradio_api/mcp/schema`;
|
|
180
|
+
const response = await fetch(schema_url);
|
|
150
181
|
const schema = await response.json();
|
|
151
182
|
file_data_present = schema
|
|
152
183
|
.map((tool: any) => tool.meta?.file_data_present)
|
|
@@ -158,17 +189,20 @@
|
|
|
158
189
|
parameters: tool.inputSchema?.properties || {},
|
|
159
190
|
expanded: false
|
|
160
191
|
}));
|
|
192
|
+
selected_tools = new Set(tools.map((tool) => tool.name));
|
|
161
193
|
headers = schema.map((tool: any) => tool.meta?.headers || []).flat();
|
|
162
194
|
if (headers.length > 0) {
|
|
163
195
|
mcp_json_sse = {
|
|
164
196
|
mcpServers: {
|
|
165
197
|
gradio: {
|
|
166
198
|
url: mcp_server_url,
|
|
167
|
-
headers: headers.reduce(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
199
|
+
headers: headers.reduce(
|
|
200
|
+
(accumulator: Record<string, string>, current_key: string) => {
|
|
201
|
+
accumulator[current_key] = "<YOUR_HEADER_VALUE>";
|
|
202
|
+
return accumulator;
|
|
203
|
+
},
|
|
204
|
+
{}
|
|
205
|
+
)
|
|
172
206
|
}
|
|
173
207
|
}
|
|
174
208
|
};
|
|
@@ -236,7 +270,7 @@
|
|
|
236
270
|
.then((response) => {
|
|
237
271
|
mcp_server_active = response.ok;
|
|
238
272
|
if (mcp_server_active) {
|
|
239
|
-
|
|
273
|
+
fetch_mcp_tools();
|
|
240
274
|
if (!is_valid_language(lang_param)) {
|
|
241
275
|
current_language = "mcp";
|
|
242
276
|
}
|
|
@@ -335,135 +369,18 @@
|
|
|
335
369
|
target="_blank">docs</a
|
|
336
370
|
>) if you don't already have it installed.
|
|
337
371
|
{:else if current_language == "mcp"}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
</Block>
|
|
351
|
-
<p> </p>
|
|
352
|
-
<strong>Available MCP Tools</strong>
|
|
353
|
-
<div class="mcp-tools">
|
|
354
|
-
{#each tools as tool}
|
|
355
|
-
<div class="tool-item">
|
|
356
|
-
<button
|
|
357
|
-
class="tool-header"
|
|
358
|
-
on:click={() => (tool.expanded = !tool.expanded)}
|
|
359
|
-
>
|
|
360
|
-
<span
|
|
361
|
-
><span class="tool-name">{tool.name}</span>
|
|
362
|
-
<span class="tool-description"
|
|
363
|
-
>{tool.description
|
|
364
|
-
? tool.description
|
|
365
|
-
: "⚠︎ No description provided in function docstring"}</span
|
|
366
|
-
></span
|
|
367
|
-
>
|
|
368
|
-
<span class="tool-arrow"
|
|
369
|
-
>{tool.expanded ? "▼" : "▶"}</span
|
|
370
|
-
>
|
|
371
|
-
</button>
|
|
372
|
-
{#if tool.expanded}
|
|
373
|
-
<div class="tool-content">
|
|
374
|
-
{#if Object.keys(tool.parameters).length > 0}
|
|
375
|
-
<div class="tool-parameters">
|
|
376
|
-
{#each Object.entries(tool.parameters) as [name, param]}
|
|
377
|
-
<div class="parameter">
|
|
378
|
-
<code>{name}</code>
|
|
379
|
-
<span class="parameter-type">
|
|
380
|
-
({param.type}{param.default !== undefined
|
|
381
|
-
? `, default: ${JSON.stringify(param.default)}`
|
|
382
|
-
: ""})
|
|
383
|
-
</span>
|
|
384
|
-
<p class="parameter-description">
|
|
385
|
-
{param.description
|
|
386
|
-
? param.description
|
|
387
|
-
: "⚠︎ No description for this parameter in function docstring"}
|
|
388
|
-
</p>
|
|
389
|
-
</div>
|
|
390
|
-
{/each}
|
|
391
|
-
</div>
|
|
392
|
-
{:else}
|
|
393
|
-
<p>Takes no input parameters</p>
|
|
394
|
-
{/if}
|
|
395
|
-
</div>
|
|
396
|
-
{/if}
|
|
397
|
-
</div>
|
|
398
|
-
{/each}
|
|
399
|
-
</div>
|
|
400
|
-
<p> </p>
|
|
401
|
-
|
|
402
|
-
<strong>SSE Transport</strong>: To add this MCP to clients that
|
|
403
|
-
support SSE (e.g. Cursor, Windsurf, Cline), simply add the
|
|
404
|
-
following configuration to your MCP config.
|
|
405
|
-
<p> </p>
|
|
406
|
-
<Block>
|
|
407
|
-
<code>
|
|
408
|
-
<div class="copy">
|
|
409
|
-
<CopyButton
|
|
410
|
-
code={JSON.stringify(mcp_json_sse, null, 2)}
|
|
411
|
-
/>
|
|
412
|
-
</div>
|
|
413
|
-
<div>
|
|
414
|
-
<pre>{JSON.stringify(mcp_json_sse, null, 2)}</pre>
|
|
415
|
-
</div>
|
|
416
|
-
</code>
|
|
417
|
-
</Block>
|
|
418
|
-
{#if file_data_present}
|
|
419
|
-
<p> </p>
|
|
420
|
-
<em>Note about files</em>: Gradio MCP servers that have files
|
|
421
|
-
as inputs need the files as URLs, so the
|
|
422
|
-
<code>upload_files_to_gradio</code>
|
|
423
|
-
tool is included for your convenience. This tool can upload files
|
|
424
|
-
located in the specified <code>UPLOAD_DIRECTORY</code>
|
|
425
|
-
argument (an absolute path in your local machine) or any of its
|
|
426
|
-
subdirectories to the Gradio app. You can omit this tool if you
|
|
427
|
-
are fine manually uploading files yourself and providing the URLs.
|
|
428
|
-
Before using this tool, you must have
|
|
429
|
-
<a
|
|
430
|
-
href="https://docs.astral.sh/uv/getting-started/installation/"
|
|
431
|
-
target="_blank">uv installed</a
|
|
432
|
-
>.
|
|
433
|
-
<p> </p>
|
|
434
|
-
{/if}
|
|
435
|
-
|
|
436
|
-
<strong>STDIO Transport</strong>: For clients that only support
|
|
437
|
-
stdio (e.g. Claude Desktop), first
|
|
438
|
-
<a href="https://nodejs.org/en/download/" target="_blank"
|
|
439
|
-
>install Node.js</a
|
|
440
|
-
>. Then, you can use the following command:
|
|
441
|
-
<p> </p>
|
|
442
|
-
<Block>
|
|
443
|
-
<code>
|
|
444
|
-
<div class="copy">
|
|
445
|
-
<CopyButton
|
|
446
|
-
code={JSON.stringify(mcp_json_stdio, null, 2)}
|
|
447
|
-
/>
|
|
448
|
-
</div>
|
|
449
|
-
<div>
|
|
450
|
-
<pre>{JSON.stringify(mcp_json_stdio, null, 2)}</pre>
|
|
451
|
-
</div>
|
|
452
|
-
</code>
|
|
453
|
-
</Block>
|
|
454
|
-
<p> </p>
|
|
455
|
-
<p>
|
|
456
|
-
<a href={mcp_docs} target="_blank">
|
|
457
|
-
Read more about MCP in the Gradio docs
|
|
458
|
-
</a>
|
|
459
|
-
</p>
|
|
460
|
-
{:else}
|
|
461
|
-
This Gradio app can also serve as an MCP server, with an MCP
|
|
462
|
-
tool corresponding to each API endpoint. To enable this, launch
|
|
463
|
-
this Gradio app with <code>.launch(mcp_server=True)</code> or
|
|
464
|
-
set the <code>GRADIO_MCP_SERVER</code> env variable to
|
|
465
|
-
<code>"True"</code>.
|
|
466
|
-
{/if}
|
|
372
|
+
<MCPSnippet
|
|
373
|
+
{mcp_server_active}
|
|
374
|
+
{mcp_server_url}
|
|
375
|
+
{mcp_server_url_streamable}
|
|
376
|
+
tools={tools.filter((tool) => selected_tools.has(tool.name))}
|
|
377
|
+
all_tools={tools}
|
|
378
|
+
bind:selected_tools
|
|
379
|
+
{mcp_json_sse}
|
|
380
|
+
{mcp_json_stdio}
|
|
381
|
+
{file_data_present}
|
|
382
|
+
{mcp_docs}
|
|
383
|
+
/>
|
|
467
384
|
{:else}
|
|
468
385
|
1. Confirm that you have cURL installed on your system.
|
|
469
386
|
{/if}
|
|
@@ -637,6 +554,7 @@
|
|
|
637
554
|
color: var(--body-text-color);
|
|
638
555
|
line-height: 1;
|
|
639
556
|
user-select: none;
|
|
557
|
+
font-size: var(--text-lg);
|
|
640
558
|
}
|
|
641
559
|
|
|
642
560
|
.current-lang {
|
|
@@ -657,7 +575,8 @@
|
|
|
657
575
|
|
|
658
576
|
.snippet img {
|
|
659
577
|
margin-right: var(--size-1-5);
|
|
660
|
-
width: var(--size-
|
|
578
|
+
width: var(--size-4);
|
|
579
|
+
height: var(--size-4);
|
|
661
580
|
}
|
|
662
581
|
|
|
663
582
|
.header {
|
|
@@ -756,136 +675,4 @@
|
|
|
756
675
|
.api-name {
|
|
757
676
|
color: var(--color-accent);
|
|
758
677
|
}
|
|
759
|
-
|
|
760
|
-
.mcp-url {
|
|
761
|
-
padding: var(--size-2);
|
|
762
|
-
position: relative;
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
.mcp-url label {
|
|
766
|
-
display: block;
|
|
767
|
-
margin-bottom: var(--size-2);
|
|
768
|
-
font-weight: 600;
|
|
769
|
-
color: var(--body-text-color);
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
.mcp-url .textbox {
|
|
773
|
-
display: flex;
|
|
774
|
-
align-items: center;
|
|
775
|
-
gap: var(--size-2);
|
|
776
|
-
border: 1px solid var(--border-color-primary);
|
|
777
|
-
border-radius: var(--radius-sm);
|
|
778
|
-
padding: var(--size-2);
|
|
779
|
-
background: var(--background-fill-primary);
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
.mcp-url input {
|
|
783
|
-
flex: 1;
|
|
784
|
-
border: none;
|
|
785
|
-
background: none;
|
|
786
|
-
color: var(--body-text-color);
|
|
787
|
-
font-family: var(--font-mono);
|
|
788
|
-
font-size: var(--text-md);
|
|
789
|
-
width: 100%;
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
.mcp-url input:focus {
|
|
793
|
-
outline: none;
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
.status-indicator {
|
|
797
|
-
display: inline-block;
|
|
798
|
-
margin-right: var(--size-1-5);
|
|
799
|
-
position: relative;
|
|
800
|
-
top: -1px;
|
|
801
|
-
font-size: 0.8em;
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
.status-indicator.active {
|
|
805
|
-
color: #4caf50;
|
|
806
|
-
animation: pulse 1s infinite;
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
@keyframes pulse {
|
|
810
|
-
0% {
|
|
811
|
-
opacity: 1;
|
|
812
|
-
}
|
|
813
|
-
50% {
|
|
814
|
-
opacity: 0.6;
|
|
815
|
-
}
|
|
816
|
-
100% {
|
|
817
|
-
opacity: 1;
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
.mcp-tools {
|
|
822
|
-
margin-top: var(--size-4);
|
|
823
|
-
border: 1px solid var(--border-color-primary);
|
|
824
|
-
border-radius: var(--radius-md);
|
|
825
|
-
overflow: hidden;
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
.tool-item {
|
|
829
|
-
border-bottom: 1px solid var(--border-color-primary);
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
.tool-item:last-child {
|
|
833
|
-
border-bottom: none;
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
.tool-header {
|
|
837
|
-
width: 100%;
|
|
838
|
-
display: flex;
|
|
839
|
-
justify-content: space-between;
|
|
840
|
-
align-items: center;
|
|
841
|
-
padding: var(--size-3);
|
|
842
|
-
background: var(--background-fill-primary);
|
|
843
|
-
border: none;
|
|
844
|
-
cursor: pointer;
|
|
845
|
-
text-align: left;
|
|
846
|
-
}
|
|
847
|
-
|
|
848
|
-
.tool-header:hover {
|
|
849
|
-
background: var(--background-fill-secondary);
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
.tool-name {
|
|
853
|
-
font-family: var(--font-mono);
|
|
854
|
-
font-weight: 600;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
.tool-arrow {
|
|
858
|
-
color: var(--body-text-color-subdued);
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
.tool-content {
|
|
862
|
-
padding: var(--size-3);
|
|
863
|
-
background: var(--background-fill-secondary);
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
.tool-description {
|
|
867
|
-
margin-bottom: var(--size-3);
|
|
868
|
-
color: var(--body-text-color);
|
|
869
|
-
}
|
|
870
|
-
.parameter {
|
|
871
|
-
margin-bottom: var(--size-2);
|
|
872
|
-
padding: var(--size-2);
|
|
873
|
-
background: var(--background-fill-primary);
|
|
874
|
-
border-radius: var(--radius-sm);
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
.parameter code {
|
|
878
|
-
font-weight: 600;
|
|
879
|
-
color: var(--color-accent);
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
.parameter-type {
|
|
883
|
-
color: var(--body-text-color-subdued);
|
|
884
|
-
margin-left: var(--size-1);
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
.parameter-description {
|
|
888
|
-
margin-top: var(--size-1);
|
|
889
|
-
color: var(--body-text-color);
|
|
890
|
-
}
|
|
891
678
|
</style>
|