Loading...
Loading...
Generate and deploy a pro-code AI agent using LangGraph and SAP GenAI Hub, deploy it to SAP BTP Cloud Foundry, create a Joule capability with A2A (Agent-to-Agent) action, and deploy it to Joule. Supports TypeScript (Express or CAP) and Python. Use this skill whenever the user mentions: building a custom agent for Joule, deploying an AI agent to BTP Cloud Foundry, A2A protocol integration with Joule, pro-code agent extensibility, LangGraph agent on SAP BTP, connecting an external agent to Joule, "bring your own agent" for Joule, creating a Joule capability with A2A action, CAP agent, MTA deployment, or any combination of LangGraph/A2A/Joule/BTP/Cloud Foundry/CAP in an agent development context. Also trigger when the user wants to scaffold, modify, or redeploy an existing A2A agent project.
npx skill4agent add sap-samples/joule-a2a-agent-toolkit joule-a2a-agentcf push/.well-known/agent.jsonagent-requestagent-requestcapability.sapdas.yamlschema_version: "3.28.0"joule login --use-envjoule login joule statusnpm install -g @sap/joule-studio-clicf logincf login joule loginjoule login --use-envextensibility_developercapabilityadminmbtnpm install -g mbtcf install-plugin multiappscf deploy.mtar# Start Claude Code with the SAP A2A Agent Toolkit plugin
claude --plugin-dir <path-to-sap-a2a-agent-toolkit>
# Log in to Cloud Foundry
cf login -a https://api.cf.<landscape>.hana.ondemand.com
# Log in to Joule
joule login gpt-4.1bash <skill-path>/scripts/scaffold-ts.sh \
--name <agent-name> \
--framework express \
--namespace <company-namespace> \
--output <output-dir> \
--description "<agent description>" \
--landscape <cf-landscape>references/langgraph-a2a-agent-typescript.mdreferences/cf-deployment-typescript.md<agent-name>/
├── src/
│ ├── index.ts # Express + A2A server entry point
│ ├── agent.ts # LangGraph.js ReAct agent
│ ├── executor.ts # A2A protocol bridge
│ ├── agentCard.ts # Agent Card definition
│ ├── tools.ts # Agent's tools (Zod schemas)
│ └── llm.ts # SAP GenAI Hub configuration
├── joule-capability/
│ ├── capability.sapdas.yaml
│ ├── capability_context.yaml
│ ├── da.sapdas.yaml
│ ├── functions/call_agent.yaml
│ └── scenarios/invoke_agent.yaml
├── package.json
├── tsconfig.json
├── manifest.yml
├── Procfile
├── .env.example
└── README.mdbash <skill-path>/scripts/scaffold-ts.sh \
--name <agent-name> \
--framework cap \
--namespace <company-namespace> \
--output <output-dir> \
--description "<agent description>" \
--landscape <cf-landscape>references/langgraph-a2a-agent-cap-typescript.mdreferences/cf-deployment-cap-typescript.md<agent-name>/
├── srv/
│ ├── server.ts # CAP bootstrap + A2A Express endpoints
│ ├── agent-executor.ts # LangGraph StateGraph agent orchestrator
│ ├── service.cds # CDS service definition
│ ├── tools/
│ │ └── tools.ts # Agent tools (Zod schemas)
│ └── utils/
│ ├── prompts.ts # System prompt
│ ├── a2aToLangchain.ts # A2A → LangChain converter
│ ├── a2a-operations.ts # A2A event helpers
│ └── helpers.ts # URL helpers
├── joule-capability/
│ ├── capability.sapdas.yaml
│ ├── capability_context.yaml
│ ├── da.sapdas.yaml
│ ├── functions/call_agent.yaml
│ └── scenarios/invoke_agent.yaml
├── package.json
├── tsconfig.json
├── mta.yaml
├── .cdsrc.sample.json
├── .env.example
└── README.mdpython <skill-path>/scripts/scaffold.py \
--name <agent-name> \
--namespace <company-namespace> \
--output <output-dir> \
--description "<agent description>" \
--landscape <cf-landscape>references/langgraph-a2a-agent.mdreferences/cf-deployment.md| Aspect | TS Express | TS CAP | Python |
|---|---|---|---|
| Server | Express + jsonRpcHandler/agentCardHandler | CAP + cds.on("bootstrap") | Starlette + A2AStarletteApplication |
| A2A SDK | @a2a-js/sdk 0.3.10 | @a2a-js/sdk 0.3.10 | a2a-sdk >=0.2.7 |
| LLM | OrchestrationClient | OrchestrationClient | langchain-openai ChatOpenAI (direct AI Core endpoint) |
| Deploy | | | |
| Auth | Manual | Built-in CAP auth | Manual |
| Agent pattern | createReactAgent | StateGraph (manual) | create_react_agent |
| Interrupt support | Basic (question heuristic) | Full (LangGraph interrupt()) | Structured response format |
| Buildpack | nodejs_buildpack | nodejs_buildpack (via MTA) | python_buildpack |
| Reference | | | |
tool()@toolsrc/tools.tssrv/tools/tools.tsapp/tools.pySYSTEM_PROMPTsrc/agent.tssrv/utils/prompts.tsSYSTEM_INSTRUCTIONapp/agent.pysrc/agentCard.tsagentCardsrv/server.tsapp/agent_card.pycapability.sapdas.yamlscenarios/invoke_agent.yamlreferences/cf-deployment-typescript.mdreferences/cf-deployment.mdcd <agent-name>
npm install
npm run build # TypeScript only — must compile before push
cf push
curl https://<app-url>/.well-known/agent.jsonreferences/cf-deployment-cap-typescript.mdcd <agent-name>
npm install
mbt build
cf deploy mta_archives/<agent-name>_1.0.0.mtar
curl https://<agent-name>-srv.cfapps.<landscape>.hana.ondemand.com/.well-known/agent.jsonbash <skill-path>/scripts/create-destination.sh \
--agent-name <agent-name> \
--destination-name <DESTINATION_NAME> \
--landscape <cf-landscape>system_aliases.<AliasName>.destinationcapability.sapdas.yamlreferences/joule-capability.md# Install Joule CLI (if not installed)
npm install -g @sap/joule-cli
# Authenticate
joule login # or joule login --use-env
# Navigate to the joule-capability directory
cd joule-capability
# Compile + deploy
joule deploy ./da.sapdas.yaml --compile -n "<assistant_name>"cf logs <app-name> --recentMODEL_NAMEcapability.sapdas.yamljoule deploy ./da.sapdas.yaml --compileinstancesmemorymanifest.ymlmta.yamlreferences/langgraph-a2a-agent-typescript.mdreferences/langgraph-a2a-agent-cap-typescript.mdreferences/langgraph-a2a-agent.mdreferences/cf-deployment-typescript.mdreferences/cf-deployment-cap-typescript.mdreferences/cf-deployment.mdreferences/joule-capability.mdmessage/sendmessage/stream/.well-known/agent.jsonOrchestrationClient@sap-ai-sdk/langchainlangchain-openaiChatOpenAIgenerative-ai-hub-sdka2a-sdk@sap/joule-clicapabilityadminextensibility_developerda.sapdas.yaml1.4.0capability.sapdas.yaml3.28.0joule.extmetadata.namespacecapability.sapdas.yamljoule.extmycompanyjoule deployjoule.extmbtnpm install -g mbtcf install-plugin multiappscf deploy.mtar