๐Ÿค–

kandi-agentic-forms

v0.1.0 ยท MIT ยท KandiForge

AI-powered conversational system where an agent uses MCP tools and chat to guide users toward a predefined end state. XML spec in, structured output files out.

Architecture

React Client (FormProvider + KandiAgenticFormContainer)
    โ”‚ SSE Stream + REST API
    โ–ผ
Node.js Server SDK (kandi-agentic-forms/server)
    โ”‚ createFormServer({ adapterConfig, sessionStore, verifyToken })
    โ–ผ
Agent Adapter (Vercel AI SDK / Forge)
    โ”‚ streamText + tool calling + MCP servers
    โ–ผ
LLM Provider (OpenAI / Anthropic)

Features

๐Ÿ“‹

XML Form Specs

Declarative <agentic-form> format defines fields, agent behavior, validation, conditions, and output files.

๐Ÿค–

Agent Adapter

Abstract interface for AI providers. Ships with Vercel AI SDK adapter โ€” swap in your own.

๐Ÿ”ง

MCP Servers

Each form spec declares which MCP servers the agent can use โ€” per-form capability boundaries.

๐Ÿ“ก

SSE Streaming

Real-time agent responses via Server-Sent Events with Bearer token auth.

๐ŸŽจ

MUI Container

Glassmorphism chat drawer + artifact timeline. Stop button, progress bar, file preview.

๐Ÿ“ฆ

Output Files

Produces manifest.json, form-data.json, session-log.json, and rendered files from templates.

Getting Started

1

Install

terminal
npm install kandi-agentic-forms

# Server (pick your LLM provider)
npm install ai @ai-sdk/anthropic

# MUI components (optional)
npm install @mui/material @emotion/react @emotion/styled
2

Define a Form Spec (XML)

Create an XML file that defines what data to collect, agent behavior, validation rules, and output files.

project-setup.xml
<agentic-form name="project-setup" version="1.0">
  <agent>
    <tone>professional-friendly</tone>
    <greeting>Let's set up your project!</greeting>
    <error-recovery strategy="retry-with-hint" max-retries="3" />
  </agent>

  <sections>
    <section id="basics" label="Project Basics" order="1">
      <field id="name" type="text" required="true">
        <label>Project Name</label>
        <validation>
          <pattern regex="^[a-z][a-z0-9-]*$" message="Lowercase with hyphens" />
        </validation>
      </field>
      <field id="framework" type="select" required="true">
        <label>Framework</label>
        <options>
          <option value="nextjs">Next.js</option>
          <option value="remix">Remix</option>
          <option value="astro">Astro</option>
        </options>
      </field>
    </section>
  </sections>

  <output>
    <manifest filename="manifest.json" />
    <raw-data filename="project-config.json" />
    <session-log filename="setup-log.json" />
  </output>
</agentic-form>
3

Create the Server

lib/form-server.ts
import { createFormServer } from 'kandi-agentic-forms/server';

const forms = createFormServer({
  adapterConfig: {
    provider: 'anthropic',
    apiKey: process.env.ANTHROPIC_API_KEY!,
    model: 'claude-sonnet-4-20250514',
  },
  sessionStore: mySessionStore,
  verifyToken: async (token) => auth.verifyToken(token),
});

// Mount on Express, Next.js, Vercel, Fastify, etc.
app.post('/forms/sessions', forms.handleCreateSession);
app.get('/forms/sessions/stream', forms.handleStream);
app.post('/forms/sessions/message', forms.handleSendMessage);
4

Add the Client

app.tsx
import { FormProvider } from 'kandi-agentic-forms/react';
import { KandiAgenticFormContainer } from 'kandi-agentic-forms/react/mui';

function App() {
  return (
    <FormProvider config={{ formServerUrl: '/api/forms', getToken }}>
      <KandiAgenticFormContainer height="600px" />
    </FormProvider>
  );
}

Entry Points

Import PathPurpose
kandi-agentic-formsCore + React exports
kandi-agentic-forms/coreTypes, spec parser, validator, FormSession
kandi-agentic-forms/reactFormProvider, useAgenticForm, useFormStream
kandi-agentic-forms/react/headlessHeadlessFormChat (render-prop)
kandi-agentic-forms/react/muiKandiAgenticFormContainer + styled components
kandi-agentic-forms/servercreateFormServer, VercelAdapter, SessionManager

Server Handlers

MethodPathDescription
POST/sessionsCreate session from XML spec
GET/sessions/:id/streamSSE stream for session events
POST/sessions/:id/messageSend user message to agent
GET/sessions/:idGet session state
POST/sessions/:id/completeTrigger output generation
DELETE/sessions/:idCancel/delete session
POST/specs/validateValidate XML spec
โ† Back to packages