Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
a828eac
upgrade @mcp-ui/client
aharvard Oct 30, 2025
02b3d7c
declare supported content types
aharvard Oct 30, 2025
8da9d52
simplify ui action handling
aharvard Oct 30, 2025
be436f7
set up self-host proxy for UIResourceRenderer
aharvard Oct 30, 2025
b49fd9c
add media-src CSP to mcp-ui-proxy
aharvard Oct 31, 2025
8f877fa
relax script-src CSP on MCP-UI Proxy
aharvard Oct 31, 2025
0ce5a8a
Enhance MCP-UI proxy server security with token validation and origin…
aharvard Oct 31, 2025
94d2162
update console errors for clarity
aharvard Oct 31, 2025
745f2eb
Revert "Enhance MCP-UI proxy server security with token validation an…
aharvard Oct 31, 2025
715c09a
fix static path issue for builds
aharvard Oct 31, 2025
c42f12b
bring back MCP-UI proxy security
aharvard Oct 31, 2025
72f1ef1
remove troubleshooting text in UI
aharvard Oct 31, 2025
7677e76
Update ui/desktop/src/components/MCPUIResourceRenderer.tsx
aharvard Nov 3, 2025
5af7c66
fix: use consistent lowercase casing for mcp-ui-proxy-token header
aharvard Nov 3, 2025
949f9b4
Update ui/desktop/src/components/MCPUIResourceRenderer.tsx
aharvard Nov 3, 2025
fec432d
refactor: remove excessive debug logging from MCP-UI proxy
aharvard Nov 3, 2025
093bf6c
fix: await MCP-UI proxy server close on app quit
aharvard Nov 3, 2025
9084e51
fix: update Content-Security-Policy in MCP-UI proxy HTML
aharvard Nov 3, 2025
8f2bd7e
Update ui/desktop/src/components/MCPUIResourceRenderer.tsx
aharvard Nov 3, 2025
4f38d64
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
2f9c187
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
ed320d2
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
5af994a
security: add origin validation to MCP-UI proxy postMessage calls
aharvard Nov 3, 2025
4d04991
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
972f95f
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
6a748ec
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
6522b1b
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
927c969
Update ui/desktop/static/mcp-ui-proxy.html
aharvard Nov 3, 2025
127ba09
security: use 'null' origin instead of wildcard for srcdoc iframe
aharvard Nov 3, 2025
80b2c21
refactor: consolidate webRequest handlers and fix origin validation l…
aharvard Nov 3, 2025
b1e8628
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
5eb9bf3
Update ui/desktop/src/components/MCPUIResourceRenderer.tsx
aharvard Nov 3, 2025
52304d7
Update ui/desktop/src/main.ts
aharvard Nov 3, 2025
10468bb
fix issues that co-pilot code review introduced
aharvard Nov 3, 2025
d3f5360
fix spelling in comment
aharvard Nov 3, 2025
72e52e8
fix: add null check for iframe contentWindow in MCP-UI proxy
aharvard Nov 3, 2025
bf42719
optimize ALLOWED_ORIGIN value
aharvard Nov 3, 2025
8c3988d
refactor: move MCP-UI proxy logic to a dedicated module
aharvard Nov 6, 2025
881eaa5
refactor and document proxy code for maintainability
aharvard Nov 6, 2025
ee9959a
Merge remote-tracking branch 'origin/main' into feat/mcp-ui-improvements
aharvard Nov 6, 2025
c444706
address copilot feedback
aharvard Nov 6, 2025
913b0bf
update pnpm lock post-merge from main
aharvard Nov 6, 2025
c170e4c
remove accidental pnpm-lock
aharvard Nov 7, 2025
f2c66e1
security: validate IPC caller origin for MCP-UI proxy URL
aharvard Nov 10, 2025
356b409
security: restrict proxy token injection to trusted webContents
aharvard Nov 10, 2025
dfe457e
security: add IPv6 loopback support to proxy allowed hostnames
aharvard Nov 10, 2025
e1590f0
security: replace blanket static serving with explicit route
aharvard Nov 10, 2025
92d7c3c
Merge main and resolve conflict in preload.ts
aharvard Nov 10, 2025
8433401
Update ui/desktop/src/components/MCPUIResourceRenderer.tsx
aharvard Nov 10, 2025
40276bf
fix: remove orphaned setSchedulingEngine from preload.ts
aharvard Nov 10, 2025
a6daeed
fix: prefix unused req parameters with underscore in proxy.ts
aharvard Nov 10, 2025
b6740fb
feat: MCP UI proxy to goose-server (#5749)
alexhancock Nov 17, 2025
273f4de
Merge remote-tracking branch 'origin/main' into feat/mcp-ui-improvements
aharvard Nov 18, 2025
7aef5a2
remove old proxy files from client
aharvard Nov 18, 2025
e9e18d7
[MCP-UI] proxy add Referrer-Policy HTTP response header (#5797)
zanesq Nov 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/goose-server/src/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub async fn check_token(
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if request.uri().path() == "/status" {
if request.uri().path() == "/status" || request.uri().path() == "/mcp-ui-proxy" {
return Ok(next.run(request).await);
}
let secret_key = request
Expand Down
2 changes: 1 addition & 1 deletion crates/goose-server/src/commands/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ pub async fn run() -> Result<()> {
.allow_methods(Any)
.allow_headers(Any);

let app = crate::routes::configure(app_state)
let app = crate::routes::configure(app_state, secret_key.clone())
.layer(middleware::from_fn_with_state(
secret_key.clone(),
check_token,
Expand Down
1 change: 1 addition & 0 deletions crates/goose-server/src/openapi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ derive_utoipa!(Icon as IconSchema);
paths(
super::routes::status::status,
super::routes::status::diagnostics,
super::routes::mcp_ui_proxy::mcp_ui_proxy,
super::routes::config_management::backup_config,
super::routes::config_management::recover_config,
super::routes::config_management::validate_config,
Expand Down
53 changes: 53 additions & 0 deletions crates/goose-server/src/routes/mcp_ui_proxy.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
use axum::{
extract::Query,
http::{header, StatusCode},
response::{Html, IntoResponse, Response},
routing::get,
Router,
};
use serde::Deserialize;

#[derive(Deserialize)]
struct ProxyQuery {
secret: String,
}

const MCP_UI_PROXY_HTML: &str = include_str!("templates/mcp_ui_proxy.html");

#[utoipa::path(
get,
path = "/mcp-ui-proxy",
params(
("secret" = String, Query, description = "Secret key for authentication")
),
responses(
(status = 200, description = "MCP UI proxy HTML page", content_type = "text/html"),
(status = 401, description = "Unauthorized - invalid or missing secret"),
)
)]
async fn mcp_ui_proxy(
axum::extract::State(secret_key): axum::extract::State<String>,
Query(params): Query<ProxyQuery>,
) -> Response {
if params.secret != secret_key {
return (StatusCode::UNAUTHORIZED, "Unauthorized").into_response();
}

(
[
(header::CONTENT_TYPE, "text/html; charset=utf-8"),
(
header::HeaderName::from_static("referrer-policy"),
"no-referrer",
),
],
Html(MCP_UI_PROXY_HTML),
)
.into_response()
}

pub fn routes(secret_key: String) -> Router {
Router::new()
.route("/mcp-ui-proxy", get(mcp_ui_proxy))
.with_state(secret_key)
}
4 changes: 3 additions & 1 deletion crates/goose-server/src/routes/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ pub mod agent;
pub mod audio;
pub mod config_management;
pub mod errors;
pub mod mcp_ui_proxy;
pub mod recipe;
pub mod recipe_utils;
pub mod reply;
Expand All @@ -16,7 +17,7 @@ use std::sync::Arc;
use axum::Router;

// Function to configure all routes
pub fn configure(state: Arc<crate::state::AppState>) -> Router {
pub fn configure(state: Arc<crate::state::AppState>, secret_key: String) -> Router {
Router::new()
.merge(status::routes())
.merge(reply::routes(state.clone()))
Expand All @@ -27,4 +28,5 @@ pub fn configure(state: Arc<crate::state::AppState>) -> Router {
.merge(session::routes(state.clone()))
.merge(schedule::routes(state.clone()))
.merge(setup::routes(state.clone()))
.merge(mcp_ui_proxy::routes(secret_key))
}
142 changes: 142 additions & 0 deletions crates/goose-server/src/routes/templates/mcp_ui_proxy.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="referrer" content="no-referrer"/>
<!--
Permissive CSP so nested content is not constrained by top-level Goose Desktop CSP
- default-src: Fallback for other directives (allows same-origin)
- script-src: Allow scripts from any origin, inline, eval, wasm, and blob URLs
- style-src: Allow styles from any origin and inline styles
- font-src: Allow fonts from any origin
- connect-src: Allow network requests to any origin
- frame-src: Allow embedding iframes from any origin (required for proxy functionality)
- media-src: Allow audio/video media from any origin
- base-uri: Restrict <base> tag to same-origin only
- upgrade-insecure-requests: Automatically upgrade HTTP to HTTPS
-->
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src * 'wasm-unsafe-eval' 'unsafe-inline' 'unsafe-eval' blob:; style-src * 'unsafe-inline'; font-src *; connect-src *; frame-src *; media-src *; base-uri 'self'; upgrade-insecure-requests"/>
<title>MCP-UI Proxy</title>
<style>
body,
html {
margin: 0;
height: 100vh;
width: 100vw;
}
body {
display: flex;
flex-direction: column;
}
* {
box-sizing: border-box;
}
iframe {
background-color: transparent;
border: 0 none transparent;
padding: 0;
overflow: hidden;
flex-grow: 1;
}
</style>
</head>
<body>
<script>
const params = new URLSearchParams(location.search);
const contentType = params.get('contentType');
const target = params.get('url');

// Validate that the URL is a valid HTTP or HTTPS URL
function isValidHttpUrl(string) {
try {
const url = new URL(string);
return url.protocol === 'http:' || url.protocol === 'https:';
} catch (error) {
return false;
}
}

if (contentType === 'rawhtml') {
// Double-iframe raw HTML mode (HTML sent via postMessage)
const inner = document.createElement('iframe');
inner.style = 'width:100%; height:100%; border:none;';
// sandbox will be set from postMessage payload; default minimal before html arrives
inner.setAttribute('sandbox', 'allow-scripts');
document
.body
.appendChild(inner);

// Wait for HTML content from parent
window.addEventListener('message', (event) => {
if (event.source === window.parent) {
if (event.data && event.data.type === 'ui-html-content') {
const payload = event.data.payload || {};
const html = payload.html;
const sandbox = payload.sandbox;
if (typeof sandbox === 'string') {
inner.setAttribute('sandbox', sandbox);
}
if (typeof html === 'string') {
inner.srcdoc = html;
}
} else {
if (inner && inner.contentWindow) {
inner
.contentWindow
.postMessage(event.data, '*');
}
}
} else if (event.source === inner.contentWindow) {
// Relay messages from inner to parent
window
.parent
.postMessage(event.data, '*');
}
});

// Notify parent that proxy is ready to receive HTML (distinct event)
window
.parent
.postMessage({
type: 'ui-proxy-iframe-ready'
}, '*');
} else if (target) {
if (!isValidHttpUrl(target)) {
document.body.textContent = 'Error: invalid URL. Only HTTP and HTTPS URLs are allowed.';
} else {
const inner = document.createElement('iframe');
inner.src = target;
inner.style = 'width:100%; height:100%; border:none;';
// Default external URL sandbox; can be adjusted later by protocol if needed
inner.setAttribute('sandbox', 'allow-same-origin allow-scripts');
document
.body
.appendChild(inner);
const urlOrigin = new URL(target).origin;

window.addEventListener('message', (event) => {
if (event.source === window.parent) {
// listen for messages from the parent and send them to the iframe
if (inner.contentWindow) {
inner
.contentWindow
.postMessage(event.data, urlOrigin);
} else {
console.warn('[MCP-UI Proxy] iframe contentWindow is not available; message not sent');
}
} else if (event.source === inner.contentWindow) {
// listen for messages from the iframe and send them to the parent
window
.parent
.postMessage(event.data, '*');
}
});
}
} else {
document.body.textContent = 'Error: missing url or html parameter';
}
</script>
</body>
</html>
27 changes: 27 additions & 0 deletions ui/desktop/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -1042,6 +1042,33 @@
}
}
},
"/mcp-ui-proxy": {
"get": {
"tags": [
"super::routes::mcp_ui_proxy"
],
"operationId": "mcp_ui_proxy",
"parameters": [
{
"name": "secret",
"in": "query",
"description": "Secret key for authentication",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "MCP UI proxy HTML page"
},
"401": {
"description": "Unauthorized - invalid or missing secret"
}
}
}
},
"/recipes/create": {
"post": {
"tags": [
Expand Down
8 changes: 4 additions & 4 deletions ui/desktop/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion ui/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"dependencies": {
"@ai-sdk/openai": "^2.0.52",
"@ai-sdk/ui-utils": "^1.2.11",
"@mcp-ui/client": "^5.13.0",
"@mcp-ui/client": "^5.14.1",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-avatar": "^1.1.10",
"@radix-ui/react-dialog": "^1.1.15",
Expand Down
9 changes: 8 additions & 1 deletion ui/desktop/src/api/sdk.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import type { Client, Options as Options2, TDataShape } from './client';
import { client } from './client.gen';
import type { AddExtensionData, AddExtensionErrors, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponses, BackupConfigData, BackupConfigErrors, BackupConfigResponses, CheckProviderData, ConfirmPermissionData, ConfirmPermissionErrors, ConfirmPermissionResponses, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleResponses, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponses, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponses, GetSessionData, GetSessionErrors, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponses, GetSessionResponses, GetToolsData, GetToolsErrors, GetToolsResponses, ImportSessionData, ImportSessionErrors, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponses, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponses, KillRunningJobData, KillRunningJobResponses, ListRecipesData, ListRecipesErrors, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponses, ParseRecipeData, ParseRecipeErrors, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponses, ProvidersData, ProvidersResponses, ReadAllConfigData, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, RecoverConfigData, RecoverConfigErrors, RecoverConfigResponses, RemoveConfigData, RemoveConfigErrors, RemoveConfigResponses, RemoveCustomProviderData, RemoveCustomProviderErrors, RemoveCustomProviderResponses, RemoveExtensionData, RemoveExtensionErrors, RemoveExtensionResponses, ReplyData, ReplyErrors, ReplyResponses, ResumeAgentData, ResumeAgentErrors, ResumeAgentResponses, RunNowHandlerData, RunNowHandlerErrors, RunNowHandlerResponses, SaveRecipeData, SaveRecipeErrors, SaveRecipeResponses, ScanRecipeData, ScanRecipeResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponses, SetConfigProviderData, StartAgentData, StartAgentErrors, StartAgentResponses, StartOpenrouterSetupData, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponses, StatusData, StatusResponses, UnpauseScheduleData, UnpauseScheduleErrors, UnpauseScheduleResponses, UpdateAgentProviderData, UpdateAgentProviderErrors, UpdateAgentProviderResponses, UpdateCustomProviderData, UpdateCustomProviderErrors, UpdateCustomProviderResponses, UpdateFromSessionData, UpdateFromSessionErrors, UpdateFromSessionResponses, UpdateRouterToolSelectorData, UpdateRouterToolSelectorErrors, UpdateRouterToolSelectorResponses, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleResponses, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponses } from './types.gen';
import type { AddExtensionData, AddExtensionErrors, AddExtensionResponses, AgentAddExtensionData, AgentAddExtensionErrors, AgentAddExtensionResponses, AgentRemoveExtensionData, AgentRemoveExtensionErrors, AgentRemoveExtensionResponses, BackupConfigData, BackupConfigErrors, BackupConfigResponses, CheckProviderData, ConfirmPermissionData, ConfirmPermissionErrors, ConfirmPermissionResponses, CreateCustomProviderData, CreateCustomProviderErrors, CreateCustomProviderResponses, CreateRecipeData, CreateRecipeErrors, CreateRecipeResponses, CreateScheduleData, CreateScheduleErrors, CreateScheduleResponses, DecodeRecipeData, DecodeRecipeErrors, DecodeRecipeResponses, DeleteRecipeData, DeleteRecipeErrors, DeleteRecipeResponses, DeleteScheduleData, DeleteScheduleErrors, DeleteScheduleResponses, DeleteSessionData, DeleteSessionErrors, DeleteSessionResponses, DiagnosticsData, DiagnosticsErrors, DiagnosticsResponses, EncodeRecipeData, EncodeRecipeErrors, EncodeRecipeResponses, ExportSessionData, ExportSessionErrors, ExportSessionResponses, GetCustomProviderData, GetCustomProviderErrors, GetCustomProviderResponses, GetExtensionsData, GetExtensionsErrors, GetExtensionsResponses, GetProviderModelsData, GetProviderModelsErrors, GetProviderModelsResponses, GetSessionData, GetSessionErrors, GetSessionInsightsData, GetSessionInsightsErrors, GetSessionInsightsResponses, GetSessionResponses, GetToolsData, GetToolsErrors, GetToolsResponses, ImportSessionData, ImportSessionErrors, ImportSessionResponses, InitConfigData, InitConfigErrors, InitConfigResponses, InspectRunningJobData, InspectRunningJobErrors, InspectRunningJobResponses, KillRunningJobData, KillRunningJobResponses, ListRecipesData, ListRecipesErrors, ListRecipesResponses, ListSchedulesData, ListSchedulesErrors, ListSchedulesResponses, ListSessionsData, ListSessionsErrors, ListSessionsResponses, McpUiProxyData, McpUiProxyErrors, McpUiProxyResponses, ParseRecipeData, ParseRecipeErrors, ParseRecipeResponses, PauseScheduleData, PauseScheduleErrors, PauseScheduleResponses, ProvidersData, ProvidersResponses, ReadAllConfigData, ReadAllConfigResponses, ReadConfigData, ReadConfigErrors, ReadConfigResponses, RecoverConfigData, RecoverConfigErrors, RecoverConfigResponses, RemoveConfigData, RemoveConfigErrors, RemoveConfigResponses, RemoveCustomProviderData, RemoveCustomProviderErrors, RemoveCustomProviderResponses, RemoveExtensionData, RemoveExtensionErrors, RemoveExtensionResponses, ReplyData, ReplyErrors, ReplyResponses, ResumeAgentData, ResumeAgentErrors, ResumeAgentResponses, RunNowHandlerData, RunNowHandlerErrors, RunNowHandlerResponses, SaveRecipeData, SaveRecipeErrors, SaveRecipeResponses, ScanRecipeData, ScanRecipeResponses, SessionsHandlerData, SessionsHandlerErrors, SessionsHandlerResponses, SetConfigProviderData, StartAgentData, StartAgentErrors, StartAgentResponses, StartOpenrouterSetupData, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponses, StatusData, StatusResponses, UnpauseScheduleData, UnpauseScheduleErrors, UnpauseScheduleResponses, UpdateAgentProviderData, UpdateAgentProviderErrors, UpdateAgentProviderResponses, UpdateCustomProviderData, UpdateCustomProviderErrors, UpdateCustomProviderResponses, UpdateFromSessionData, UpdateFromSessionErrors, UpdateFromSessionResponses, UpdateRouterToolSelectorData, UpdateRouterToolSelectorErrors, UpdateRouterToolSelectorResponses, UpdateScheduleData, UpdateScheduleErrors, UpdateScheduleResponses, UpdateSessionNameData, UpdateSessionNameErrors, UpdateSessionNameResponses, UpdateSessionUserRecipeValuesData, UpdateSessionUserRecipeValuesErrors, UpdateSessionUserRecipeValuesResponses, UpsertConfigData, UpsertConfigErrors, UpsertConfigResponses, UpsertPermissionsData, UpsertPermissionsErrors, UpsertPermissionsResponses, ValidateConfigData, ValidateConfigErrors, ValidateConfigResponses } from './types.gen';

export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = Options2<TData, ThrowOnError> & {
/**
Expand Down Expand Up @@ -310,6 +310,13 @@ export const startTetrateSetup = <ThrowOnError extends boolean = false>(options?
});
};

export const mcpUiProxy = <ThrowOnError extends boolean = false>(options: Options<McpUiProxyData, ThrowOnError>) => {
return (options.client ?? client).get<McpUiProxyResponses, McpUiProxyErrors, ThrowOnError>({
url: '/mcp-ui-proxy',
...options
});
};

export const createRecipe = <ThrowOnError extends boolean = false>(options: Options<CreateRecipeData, ThrowOnError>) => {
return (options.client ?? client).post<CreateRecipeResponses, CreateRecipeErrors, ThrowOnError>({
url: '/recipes/create',
Expand Down
26 changes: 26 additions & 0 deletions ui/desktop/src/api/types.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1725,6 +1725,32 @@ export type StartTetrateSetupResponses = {

export type StartTetrateSetupResponse = StartTetrateSetupResponses[keyof StartTetrateSetupResponses];

export type McpUiProxyData = {
body?: never;
path?: never;
query: {
/**
* Secret key for authentication
*/
secret: string;
};
url: '/mcp-ui-proxy';
};

export type McpUiProxyErrors = {
/**
* Unauthorized - invalid or missing secret
*/
401: unknown;
};

export type McpUiProxyResponses = {
/**
* MCP UI proxy HTML page
*/
200: unknown;
};

export type CreateRecipeData = {
body: CreateRecipeRequest;
path?: never;
Expand Down
Loading
Loading