Demos
The Demos folder contains ready-to-run projects, each focused on a specific MARS feature. Open the project group, build, and run the server (most also include a client and a test project). Below is what each one teaches, with a representative snippet.
The MARSTemplate project is also the starting point produced by the MARSCmd bootstrapper.
MARSTemplate
A complete, minimal application scaffold: a helloworld resource, a JWT token resource, an OpenAPI/Swagger endpoint, and host projects for every deployment target (console, VCL, FMX, Windows service, ISAPI, Apache module, FastCGI, Linux daemon). The recommended starting point — see Your First Server.
[Path('helloworld')]
THelloWorldResource = class
[GET, Produces(TMediaType.TEXT_PLAIN)]
function SayHelloWorld: string;
end;ErrorObjects
How to return errors at three levels of richness: a plain Delphi exception (→ 500), a MARS HTTP exception with a custom status/message, and a MARS exception carrying a structured JSON body — plus how the client reads that body back. See Error Handling.
raise EMARSWithResponseException.Create('Error Message!',
TValue.From<TErrorDetails>(LErrorDetails), 530, 'The reason of the error');SSEDemo
Server-Sent Events: a resource that pushes a heartbeat event every second over a persistent connection, plus a static HTML page that consumes it with the browser EventSource. See Server-Sent Events.
[GET, Produces(TMediaType.TEXT_EVENT_STREAM)]
function SayHelloWorld: TMARSServerSideEvent;MCPServer
An MCP (Model Context Protocol) server for AI agents: derive a resource from TMCPResource, mark methods with [MCPTool] and Claude, Claude Code or any MCP client can discover and call them over Streamable HTTP — tool list and JSON Schema are generated automatically via RTTI. See MCP Servers.
[MCPTool('add_numbers', 'Adds two numbers and returns a structured result')]
function AddNumbers(
[MCPParam('a', 'First operand')] const A: Double;
[MCPParam('b', 'Second operand')] const B: Double): TCalculationResult;TokenRenew
JWT lifecycle management: checking remaining validity and automatically re-issuing the token when it drops below half its duration. See Authentication ▸ Token renewal.
if LRemainingSecs < (Token.DurationSecs / 2) then
Token.Build(JWTSecret); // sliding-expiration renewalOTPDemo
A full two-factor-authentication example: time-based one-time passwords (TOTP, RFC 6238) compatible with Microsoft/Google Authenticator, QR-code provisioning, and FireDAC-backed user storage. Includes both server and client.
[GET, Path('/verify/{username}/{otp}')]
function Verify([PathParam] AUserName, AOTP: string): TVerifyOTPResponse;
// Result.verified := TOTP.VerifyTotp(LUser.OTP_Secret, AOTP);WebStencilsDemo
Server-side HTML rendering with Embarcadero's WebStencils engine, binding live FireDAC datasets into templates. See HTML & Templates.
FWS.AddVarValue('datasetName', LDatasetName);
FWS.AddDataVar('dataset', LMemTable, True);
Result := FWS.ContentFromFile('dataset.html');HtmxDemo
A hypermedia front-end with htmx: the server reads its own OpenAPI document and returns the endpoint list, which the page renders client-side without a SPA framework. See HTML & Templates ▸ htmx.
function THelloworldResource.RetrieveData([Context] AOpenAPI: TOpenAPI): TDataResponse;
begin
for var LPath in AOpenAPI.paths do
Result.endpoints := Result.endpoints + [TEndpoint.Create(LPath.Key, LPath.Value.Methods)];
end;TailwindcssDemo
A complete server-rendered web application rather than a single feature: users sign in against a FireDAC-queried table, confirm a time-based one-time password, and reach a styled dashboard where they can browse and manage users. Pages are rendered with WebStencils, updated with htmx and styled with Tailwind CSS. The token issued after the password step carries an mfa_pending claim, so a half-authenticated session cannot reach the application until the second factor clears it. A step-by-step walkthrough is in Tailwind CSS for Delphi developers.
function IsFullyAuthenticated(const AToken: TMARSToken): Boolean;
begin
Result := AToken.IsVerified
and not AToken.Claims.ByNameText('mfa_pending', False).AsBoolean;
end;MARS and Embarcadero KAI
There is a video walkthrough of MARS with Embarcadero KAI: YouTube — MARS and KAI.
