Files
agent-ui/server/routes/webmcp.ts
josedario87 50f670f66c feat: Auto-connect WebMCP without agent intervention
- Add requestToken() and autoConnect() functions to request tokens directly from WebMCP server
- Add /api/webmcp-request-token endpoint to proxy token requests (for HTTPS/Traefik)
- Add webmcpHttp endpoint configuration for direct WebMCP HTTP API access
- Update App.vue to auto-connect on load with polling fallback
- Add kill-ports script to clear ports 4101, 4102, 4103, 4105 before starting
2026-02-14 16:15:49 -06:00

76 lines
2.1 KiB
TypeScript

import { jsonResponse, errorResponse } from '../utils/cors'
// WebMCP server URL (localhost since they run on same machine)
const WEBMCP_URL = 'http://localhost:4102'
// WebMCP token storage (in-memory)
let pendingWebMCPToken: { token: string; createdAt: Date } | null = null
// Request token directly from WebMCP server
export async function handleWebMCPRequestToken(req: Request) {
if (req.method !== 'POST') {
return errorResponse('Method not allowed', 405)
}
try {
const res = await fetch(`${WEBMCP_URL}/token`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
})
if (!res.ok) {
console.error('[WebMCP] Failed to request token from server:', res.status)
return errorResponse('Failed to request token', res.status)
}
const data = await res.json()
if (data.success && data.token) {
console.log('[WebMCP] Token obtained from server')
return jsonResponse({ success: true, token: data.token })
}
return errorResponse('Invalid response from WebMCP', 500)
} catch (e) {
console.error('[WebMCP] Error requesting token:', e)
return errorResponse('WebMCP server not available', 503)
}
}
export async function handleWebMCPToken(req: Request) {
if (req.method === 'GET') {
if (pendingWebMCPToken) {
// Check if token is not expired (5 minutes)
const age = Date.now() - pendingWebMCPToken.createdAt.getTime()
if (age < 5 * 60 * 1000) {
return jsonResponse({
token: pendingWebMCPToken.token,
createdAt: pendingWebMCPToken.createdAt.toISOString()
})
}
// Token expired
pendingWebMCPToken = null
}
return jsonResponse({ token: null })
}
if (req.method === 'POST') {
const body = await req.json()
if (body.token) {
pendingWebMCPToken = {
token: body.token,
createdAt: new Date()
}
console.log('[WebMCP] Token received and stored')
return jsonResponse({ success: true })
}
return errorResponse('Token required', 400)
}
if (req.method === 'DELETE') {
pendingWebMCPToken = null
return jsonResponse({ success: true })
}
return null
}