Apps are the organizational units for capabilities in FrontMCP. Each app groups related tools, resources, and prompts into a cohesive domain, along with providers, adapters, and plugins that support them.
Why Apps?
In FrontMCP, apps provide domain boundaries and enable multi-tenant architectures:
| Aspect | App | Server | Tool |
|---|
| Purpose | Group capabilities | Host apps | Execute actions |
| Scope | Feature/domain boundary | Process entry point | Single operation |
| Contains | Tools, resources, prompts | Apps, global providers | Input → Output logic |
Apps are ideal for:
- Feature domains — billing, users, analytics as separate concerns
- Team boundaries — each team owns their app
- Multi-tenant — isolate per customer with
splitByApp: true
- Third-party integrations — wrap OpenAPI adapters per service
Minimal App
import { App } from '@frontmcp/sdk';
@App({
id: 'hello',
name: 'Hello App',
tools: [],
})
export default class HelloApp {}
Add it to your server:
@FrontMcp({ info: { name: 'Demo', version: '0.1.0' }, apps: [HelloApp] })
export default class Server {}
App options
@App({
id?: string,
name: string,
description?: string,
providers?: ProviderType[],
authProviders?: AuthProviderType[],
plugins?: PluginType[],
adapters?: AdapterType[],
tools?: ToolType[],
resources?: ResourceType[],
prompts?: PromptType[],
auth?: AuthOptions, // app‑default auth (overrides server auth)
standalone?: 'includeInParent' | boolean, // isolate scope / expose separately
})
Field descriptions:
| Field | Description |
|---|
id | Unique identifier; used in URLs when splitByApp: true |
name | Human-readable display name |
description | Optional description for documentation |
providers | DI providers scoped to this app |
authProviders | Authentication providers for this app |
plugins | Plugins attached at app scope |
adapters | Adapters (e.g., OpenAPI) that generate tools/resources |
tools | Tool classes registered to this app |
resources | Resource classes registered to this app |
prompts | Prompt classes registered to this app |
auth | App-level auth config (overrides server auth) |
standalone | Isolation mode: true, false, or 'includeInParent' |
Scoping & auth
- If the server uses
splitByApp: true, each app is isolated and must configure its own auth (server-level auth is disallowed).
standalone: true makes the app expose its own scope/entry; 'includeInParent' lists it under the parent while keeping isolation.
Dependency resolution
- Providers resolve tool → app → server.
- Plugins/adapters attach at app scope; generated items inherit the app’s policies and provenance.
Example: app with adapter + providers
@App({
id: 'billing',
name: 'Billing',
providers: [DbProvider, CacheProvider],
adapters: [
// e.g. OpenAPI adapter that generates tools/resources from a spec
BillingOpenApiAdapter,
],
})
export default class BillingApp {}
Remote Apps (Roadmap)
Coming soon: Connect to remote MCP servers and register them as @App({ remote: true }).
This will allow you to encapsulate external MCP servers and forward traffic with authentication,
treating them as first-class apps in your FrontMCP server.
Best Practices
Do:
- Use descriptive
id values that work as URL segments
- Group related tools, resources, and prompts in the same app
- Configure
standalone: true when apps need isolated auth
- Use adapters to generate tools from OpenAPI specs
Don’t:
- Put unrelated functionality in the same app
- Mix authentication strategies within a single app
- Create apps with only one tool (use the server directly)