Midday / apps /website /src /data /apps.ts
Jules
Final deployment with all fixes and verified content
c09f67c
// Import apps from the app-store package (source of truth)
import { apps as appStoreApps } from "@midday/app-store";
export interface WebsiteApp {
id: string;
name: string;
slug: string;
category: string;
active: boolean;
beta?: boolean;
short_description: string;
description: string | null;
features: string[];
installUrl?: string;
}
// Website-specific extensions for each app (features and slugs only)
const appExtensions: Record<
string,
{ slug: string; features: string[]; installUrl?: string }
> = {
gmail: {
slug: "gmail",
features: [
"Continuous inbox monitoring",
"Automatic PDF extraction",
"Smart transaction matching",
"Secure OAuth authentication",
],
},
outlook: {
slug: "outlook",
features: [
"Continuous inbox monitoring",
"Automatic PDF extraction",
"Smart transaction matching",
"Secure OAuth authentication",
],
},
slack: {
slug: "slack",
features: [
"Real-time transaction notifications",
"Direct receipt upload from Slack",
"Smart document matching",
"One-click approve or decline",
],
},
whatsapp: {
slug: "whatsapp",
features: [
"QR code setup - no app needed",
"Forward receipts on the go",
"Smart document matching",
"One-tap approve or decline",
],
},
xero: {
slug: "xero",
features: [
"Manual transaction export",
"Receipt & invoice attachments",
"Smart categorization mapping",
"Faster book closing",
],
},
quickbooks: {
slug: "quickbooks",
features: [
"Export as purchases and sales receipts",
"Automatic document attachment",
"Smart account mapping",
"Efficient bookkeeping",
],
},
fortnox: {
slug: "fortnox",
features: [
"Export transactions as vouchers",
"Automatic attachments",
"Swedish BAS account mapping",
"Compliance-ready exports",
],
},
raycast: {
slug: "raycast",
features: [
"Start/stop timers instantly",
"Project selection",
"Create new projects",
"Keyboard-first workflow",
],
},
"stripe-payments": {
slug: "stripe-payments",
features: [
"Accept credit cards on invoices",
"Apple Pay & Google Pay support",
"Automatic status updates",
"Secure Stripe processing",
],
},
stripe: {
slug: "stripe",
features: [
"Sync payments automatically",
"Revenue data import",
"Transaction matching",
"Real-time updates",
],
},
"midday-desktop": {
slug: "midday-desktop",
features: [
"One-click access to finances",
"Track time from menu bar",
"Manage invoices",
"Native Mac experience",
],
installUrl: "https://midday.ai/download",
},
"google-drive": {
slug: "google-drive",
features: [
"Automatic file sync",
"Document organization",
"Seamless backup",
"Easy file access",
],
},
dropbox: {
slug: "dropbox",
features: [
"Automatic file sync",
"Document organization",
"Seamless backup",
"Easy file access",
],
},
polar: {
slug: "polar",
features: [
"Sync subscription payments",
"Revenue tracking",
"Customer insights",
"Automated reconciliation",
],
},
deel: {
slug: "deel",
features: [
"Sync contractor payments",
"Payroll integration",
"Compliance tracking",
"Global workforce support",
],
},
"e-invoice": {
slug: "e-invoice",
features: [
"Peppol network support",
"European compliance",
"Send & receive e-invoices",
"Automated processing",
],
},
"cursor-mcp": {
slug: "cursor-mcp",
features: [
"Financial context in your editor",
"Query transactions while coding",
"One-click install via deeplink",
"27 tools for financial data",
],
installUrl: "https://midday.ai/mcp/cursor",
},
"claude-mcp": {
slug: "claude-mcp",
features: [
"Conversations with real numbers",
"Works with Claude Code & Desktop",
"Query invoices and reports",
"Granular permission controls",
],
installUrl: "https://midday.ai/mcp/claude",
},
"perplexity-mcp": {
slug: "perplexity-mcp",
features: [
"AI search with your real data",
"Works with Perplexity Mac app",
"Query transactions and reports",
"Natural language questions",
],
installUrl: "https://midday.ai/mcp/perplexity",
},
"raycast-mcp": {
slug: "raycast-mcp",
features: [
"Financial tools at your fingertips",
"Keyboard-first access",
"One-click install via deeplink",
"@-mention in Raycast AI",
],
installUrl: "https://midday.ai/mcp/raycast",
},
"chatgpt-mcp": {
slug: "chatgpt-mcp",
features: [
"Build with the MCP SDK",
"Custom integrations",
"Programmatic data access",
"TypeScript support",
],
installUrl: "https://midday.ai/mcp/chatgpt",
},
"opencode-mcp": {
slug: "opencode-mcp",
features: [
"Track time for clients while coding",
"Start/stop timers from terminal",
"Query finances from any editor",
"Open source AI coding agent",
],
installUrl: "https://midday.ai/mcp/opencode",
},
"zapier-mcp": {
slug: "zapier-mcp",
features: [
"Connect to 7,000+ apps",
"Automate reports and alerts",
"No-code workflow builder",
"Sync data across tools",
],
installUrl: "https://midday.ai/mcp/zapier",
},
"copilot-mcp": {
slug: "copilot-mcp",
features: [
"Query data from Microsoft 365",
"Works with Word, Excel, Outlook",
"Build custom Copilot agents",
"Enterprise-ready integration",
],
installUrl: "https://midday.ai/mcp/copilot",
},
"n8n-mcp": {
slug: "n8n-mcp",
features: [
"Build automated financial workflows",
"AI agents with Midday tools",
"Connect to 400+ apps via n8n",
"MCP Client & Server support",
],
installUrl: "https://midday.ai/mcp/n8n",
},
"make-mcp": {
slug: "make-mcp",
features: [
"Visual scenario builder",
"Connect to 1,500+ apps",
"MCP Client module support",
"No-code workflow automation",
],
installUrl: "https://midday.ai/mcp/make",
},
};
// Merge app-store data with website extensions
export const apps: WebsiteApp[] = appStoreApps
.map((app): WebsiteApp | null => {
const extension = appExtensions[app.id];
if (!extension) return null;
const appWithCategory = app as {
category?: string;
beta?: boolean;
installUrl?: string;
};
return {
id: app.id,
name: app.name,
slug: extension.slug,
category: appWithCategory.category || "Other",
active: app.active,
beta: appWithCategory.beta,
short_description: app.short_description || "",
description: app.description || null,
features: extension.features,
installUrl: extension.installUrl || appWithCategory.installUrl,
};
})
.filter((app): app is WebsiteApp => app !== null);
export const categories = [
{ id: "all", name: "All" },
{ id: "capture", name: "Capture" },
{ id: "accounting", name: "Accounting" },
{ id: "payments", name: "Payments" },
{ id: "storage", name: "Storage" },
{ id: "apps", name: "Apps" },
{ id: "ai-automation", name: "AI & Automation" },
];
export function getAppBySlug(slug: string): WebsiteApp | undefined {
return apps.find((app) => app.slug === slug);
}
export function getAppsByCategory(category: string): WebsiteApp[] {
if (category === "all") return apps;
return apps.filter((app) => app.category === category);
}
export function getCategoryName(categoryId: string): string {
const category = categories.find((c) => c.id === categoryId);
return category?.name || categoryId;
}
export function getAllSlugs(): string[] {
return apps.map((app) => app.slug);
}