sap-business-ai-agent-suite
SAP Business AI Agent Suite
A small, self-contained demo of a Joule-style multi-agent architecture built on a real, standalone Model Context Protocol (MCP) server, grounded by a lightweight RAG knowledge base, and designed around SAP's Clean Core principles throughout.
This is a portfolio project (mock/generic data only — see Clean Core & data below).
Why this exists
This repo focuses specifically on agentic AI architecture and ABAP AI / Clean Core concepts — the areas most relevant to SAP Joule / Business AI extension roles — as a complement to two earlier repos in the same portfolio:
SAP CPI & BTP Integration Examples — core Integration Suite / iFlow skills.
IntelliFleet — SAP BTP + CAP + Fiori + Business AI end-to-end application.
Repo #3 goes one level deeper: instead of embedding "MCP-style" tool calls inside one app, it ships a real standalone MCP server any MCP-compliant client could connect to, plus a small multi-agent orchestrator that composes specialized skills the way SAP Joule composes skills internally.
Architecture
┌─────────────────────┐
user query ───▶ │ Orchestrator │ routes by intent
│ (planner agent) │ (rule-based, or Claude Haiku
└──────────┬────────────┘ if ANTHROPIC_API_KEY is set)
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────────┐ ┌────────────────┐
│ Diagnostics │ │ Documentation │ │ Action │
│ agent │ │ agent │ │ agent │
│ (reads live │ │ (RAG over mock SAP │ │ (drafts via MCP │
│ device/order/ │ │ help content — │ │ tool; never │
│ incident data)│ │ BTP/CPI/ABAP AI) │ │ writes back) │
└───────┬────────┘ └────────────────────┘ └────────┬────────┘
│ │
└───────────────────┬────────────────────────────────┘
▼
┌─────────────────────┐
│ MCP server (stdio) │ get_device_status, get_customer,
│ src/mcp-server/ │ get_order, list_open_incidents,
└──────────────────────┘ draft_incident_note1. Standalone MCP server (src/mcp-server/)
A real Model Context Protocol server built
with @modelcontextprotocol/sdk, run as its own process over stdio — not tool
functions embedded inside one app. It exposes five tools over mock data
(src/mcp-server/data/mock-data.ts):
Tool | Purpose |
| Read a device's status + latest telemetry |
| Read customer master data |
| Read an order |
| List open incidents, optionally filtered by device |
| Draft a customer-facing note — drafting only, never persists |
Any MCP-compliant client can connect to this server independently of the
agents in this repo (e.g. point Claude Desktop's MCP config at
src/mcp-server/server.ts via tsx).
2. RAG knowledge base (src/rag/)
A small curated set of mock SAP-help-style markdown docs covering BTP, CPI/
Integration Suite, ABAP AI & Clean Core, and Joule-style agent architecture
(src/rag/knowledge-base/). Retrieval (src/rag/retriever.ts) uses a
dependency-free TF-IDF + cosine-similarity search — fully offline, no
embedding API calls. The documentation agent grounds its answers in the
retrieved excerpts, and (optionally) asks Claude to synthesize a short answer
from them; with no ANTHROPIC_API_KEY, it returns the excerpts directly.
3. Multi-agent orchestration (src/agents/)
orchestrator.ts— the planner. Routes a query to one of three specialized agents. Uses deterministic keyword rules by default; ifANTHROPIC_API_KEYis set, uses Claude Haiku for more flexible natural- language routing instead (same dual-mode pattern used in IntelliFleet).diagnosticsAgent.ts— calls MCP read tools to answer operational questions ("what's the status of DEV-001?").documentationAgent.ts— answers conceptual questions via RAG.actionAgent.ts— drafts a note via the MCPdraft_incident_notetool.
Clean Core & data
Every tool the agents can call is the mock equivalent of a released SAP
API (a released OData service / wrapped BAPI / event API) — nothing in this
repo reads or writes a simulated core table directly, and draft_incident_note
only produces draft text; it never persists anything. See
src/rag/knowledge-base/abap-clean-core.md for the underlying principle this
mirrors.
All data (src/mcp-server/data/mock-data.ts, the knowledge-base docs) is
generic/mock. No real Cognizant/Electrolux client code, data, or IP appears
anywhere in this repo.
Running it
npm install
npm run cliRuns three example queries end-to-end (spawns the MCP server as a subprocess, routes each through the orchestrator). Pass your own query:
npm run cli -- "What is the status of DEV-002?"By default this runs fully offline/deterministic — no external API calls, no cost. To enable Claude-assisted routing and documentation synthesis:
cp .env.example .env # then fill in ANTHROPIC_API_KEYTo run the MCP server standalone (e.g. to point another MCP client at it):
npm run mcp-serverTests
npm testRuns offline against the real MCP server subprocess (test/mcp-server.test.ts),
the retriever (test/retriever.test.ts), and the orchestrator's routing
(test/orchestrator.test.ts) — no API key required.
Tech stack
Node.js + TypeScript, @modelcontextprotocol/sdk, @anthropic-ai/sdk
(optional, dual-model Haiku/Sonnet cost-conscious pattern), a dependency-free
in-process TF-IDF retriever, zod for tool schemas, tsx for running
TypeScript directly, Node's built-in test runner.