MCP Server 2.0 (#452)

* MCP Server 2.0

- Updated application version from 2.23.14 to 2.24.0 in package.json.
- MCP Server improved with new features
- Migrated functionality from Dev Tools to MCP Server
- Improved getMonitoringProvider not to crash application when misconfigured
This commit is contained in:
Giancarlo Buomprisco
2026-02-11 20:42:01 +01:00
committed by GitHub
parent 059408a70a
commit f3ac595d06
123 changed files with 17803 additions and 5265 deletions

View File

@@ -1,25 +1,37 @@
import { EnvMode } from '@/app/variables/lib/types';
import { EnvModeSelector } from '@/components/env-mode-selector';
import { ServiceCard } from '@/components/status-tile';
import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card';
import { Page, PageBody, PageHeader } from '@kit/ui/page';
import { createConnectivityService } from './lib/connectivity-service';
import { loadDashboardKitPrerequisites } from './lib/prerequisites-dashboard.loader';
import { loadDashboardKitStatus } from './lib/status-dashboard.loader';
type DashboardPageProps = React.PropsWithChildren<{
searchParams: Promise<{ mode?: EnvMode }>;
}>;
export default async function DashboardPage() {
const [status, prerequisites] = await Promise.all([
loadDashboardKitStatus(),
loadDashboardKitPrerequisites(),
]);
export default async function DashboardPage(props: DashboardPageProps) {
const mode = (await props.searchParams).mode ?? 'development';
const connectivityService = createConnectivityService(mode);
const failedRequiredCount = prerequisites.prerequisites.filter(
(item) => item.required && item.status === 'fail',
).length;
const [supabaseStatus, supabaseAdminStatus, stripeStatus] = await Promise.all(
[
connectivityService.checkSupabaseConnectivity(),
connectivityService.checkSupabaseAdminConnectivity(),
connectivityService.checkStripeConnected(),
],
const warnCount = prerequisites.prerequisites.filter(
(item) => item.status === 'warn',
).length;
const failedRequired = prerequisites.prerequisites.filter(
(item) => item.required && item.status === 'fail',
);
const prerequisiteRemedies = Array.from(
new Set(
failedRequired.flatMap((item) => [
...(item.remedies ?? []),
...(item.install_command ? [item.install_command] : []),
...(item.install_url ? [item.install_url] : []),
]),
),
);
return (
@@ -27,17 +39,148 @@ export default async function DashboardPage(props: DashboardPageProps) {
<PageHeader
displaySidebarTrigger={false}
title={'Dev Tool'}
description={'Check the status of your Supabase and Stripe services'}
>
<EnvModeSelector mode={mode} />
</PageHeader>
description={'Kit MCP status for this workspace'}
/>
<PageBody className={'space-y-8 py-2'}>
<div className="grid grid-cols-1 gap-4 md:grid-cols-4">
<ServiceCard name={'Supabase API'} status={supabaseStatus} />
<ServiceCard name={'Supabase Admin'} status={supabaseAdminStatus} />
<ServiceCard name={'Stripe API'} status={stripeStatus} />
<ServiceCard
name={'Variant'}
status={{
status: 'success',
message: `${status.variant} (${status.variant_family})`,
}}
/>
<ServiceCard
name={'Runtime'}
status={{
status: 'success',
message: `${status.framework} • Node ${status.node_version}${status.package_manager}`,
}}
/>
<ServiceCard
name={'Dependencies'}
status={{
status: status.deps_installed ? 'success' : 'error',
message: status.deps_installed
? 'Dependencies installed'
: 'node_modules not found',
}}
/>
<ServiceCard
name={'Git'}
status={{
status:
status.git_branch === 'unknown'
? 'info'
: status.git_clean
? 'success'
: 'warning',
message: `${status.git_branch} (${status.git_clean ? 'clean' : 'dirty'}) • ${status.git_modified_files.length} modified • ${status.git_untracked_files.length} untracked`,
}}
/>
<ServiceCard
name={'Dev Server'}
status={{
status: status.services.app.running ? 'success' : 'error',
message: status.services.app.running
? `Running on port ${status.services.app.port}`
: 'Not running',
}}
/>
<ServiceCard
name={'Supabase'}
status={{
status: status.services.supabase.running ? 'success' : 'error',
message: status.services.supabase.running
? `Running${status.services.supabase.api_port ? ` (API ${status.services.supabase.api_port})` : ''}${status.services.supabase.studio_port ? ` (Studio ${status.services.supabase.studio_port})` : ''}`
: 'Not running',
}}
/>
<ServiceCard
name={'Merge Check'}
status={{
status:
status.git_merge_check.has_conflicts === true
? 'warning'
: status.git_merge_check.detectable
? 'success'
: 'info',
message: status.git_merge_check.detectable
? status.git_merge_check.has_conflicts
? `${status.git_merge_check.conflict_files.length} potential conflicts vs ${status.git_merge_check.target_branch}`
: `No conflicts vs ${status.git_merge_check.target_branch}`
: status.git_merge_check.message,
}}
/>
<ServiceCard
name={'Prerequisites'}
status={{
status:
prerequisites.overall === 'fail'
? 'error'
: prerequisites.overall === 'warn'
? 'warning'
: 'success',
message:
prerequisites.overall === 'fail'
? `${failedRequiredCount} required tools missing/mismatched`
: prerequisites.overall === 'warn'
? `${warnCount} optional warnings`
: 'All prerequisites satisfied',
}}
/>
</div>
{failedRequired.length > 0 ? (
<Card>
<CardHeader>
<CardTitle>Prerequisites Details</CardTitle>
</CardHeader>
<CardContent className={'space-y-4'}>
<div className={'space-y-2'}>
<p className={'text-sm font-medium'}>Missing or Mismatched</p>
<ul
className={
'text-muted-foreground list-disc space-y-1 pl-5 text-sm'
}
>
{failedRequired.map((item) => (
<li key={item.id}>
{item.name}
{item.version
? ` (installed ${item.version}, requires >= ${item.minimum_version})`
: ' (not installed)'}
</li>
))}
</ul>
</div>
<div className={'space-y-2'}>
<p className={'text-sm font-medium'}>Remediation</p>
<ul
className={
'text-muted-foreground list-disc space-y-1 pl-5 text-sm'
}
>
{prerequisiteRemedies.map((remedy) => (
<li key={remedy}>
<code>{remedy}</code>
</li>
))}
</ul>
</div>
</CardContent>
</Card>
) : null}
</PageBody>
</Page>
);