{"id":275,"date":"2026-07-16T17:05:46","date_gmt":"2026-07-16T17:05:46","guid":{"rendered":"https:\/\/subashselvaraj.com\/?p=275"},"modified":"2026-07-16T17:06:33","modified_gmt":"2026-07-16T17:06:33","slug":"agentic-apps-using-app-builder-and-mcp","status":"publish","type":"post","link":"https:\/\/subashselvaraj.com\/index.php\/2026\/07\/16\/agentic-apps-using-app-builder-and-mcp\/","title":{"rendered":"Agentic Apps Using App Builder and MCP &#8211; Part 1"},"content":{"rendered":"\n<p>Getting started and creating your project \u2014 the foundations for building interactive AI experiences with Adobe App Builder and the Model Context Protocol.<\/p>\n\n\n\n<h2>Introduction<\/h2>\n\n\n\n<p>AI assistants are moving beyond text-only chat. Users increasingly expect rich, interactive experiences \u2014 product carousels, detail views, carts, dashboards \u2014 rendered directly inside the conversation.&nbsp;<strong>Agentic Apps<\/strong>&nbsp;(built on the&nbsp;<a href=\"https:\/\/github.com\/modelcontextprotocol\/ext-apps\">MCP Apps extension<\/a>) deliver exactly that: MCP tools paired with interactive HTML UIs that run inside compatible hosts like Cursor and Claude Desktop.<\/p>\n\n\n\n<p>In this series, we&#8217;ll build Agentic Apps on&nbsp;<strong>Adobe App Builder<\/strong>, deploying MCP servers to&nbsp;<strong>Adobe I\/O Runtime<\/strong>&nbsp;\u2014 Adobe&#8217;s serverless platform with enterprise auth, auto-scaling, and one-command deploys.<\/p>\n\n\n\n<p><strong>Part 1<\/strong>&nbsp;covers the foundations, walks you through creating your App Builder project, deploys the scaffolded MCP server to I\/O Runtime, and connects it to an MCP host for verification. Later parts will cover building the Agentic App UI and extending tools and resources.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>What Is an Agentic App?<\/h2>\n\n\n\n<p>A standard MCP server exposes&nbsp;<strong>tools<\/strong>&nbsp;(callable functions),&nbsp;<strong>resources<\/strong>&nbsp;(static content), and&nbsp;<strong>prompts<\/strong>&nbsp;(reusable templates). An&nbsp;<strong>Agentic App<\/strong>&nbsp;(MCP App) adds a third layer: an interactive UI.<\/p>\n\n\n\n<p>Every Agentic App has three linked pieces:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/Agentic-app-1024x486.png\" alt=\"\" class=\"wp-image-276\" width=\"639\" height=\"303\" srcset=\"https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/Agentic-app-1024x486.png 1024w, https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/Agentic-app-300x142.png 300w, https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/Agentic-app-768x364.png 768w, https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/Agentic-app.png 1244w\" sizes=\"(max-width: 639px) 100vw, 639px\" \/><figcaption class=\"wp-element-caption\">The three linked pieces of an Agentic App \u2014 and how a request flows between them.<\/figcaption><\/figure><\/div>\n\n\n<ol>\n<li><strong>Tool<\/strong>&nbsp;\u2014 Called by the LLM or host; fetches data and returns structured results.<\/li>\n\n\n\n<li><strong>Resource<\/strong>&nbsp;\u2014 Serves bundled HTML (<code>text\/html;profile=mcp-app<\/code>) that renders the UI.<\/li>\n\n\n\n<li><strong>Link<\/strong>&nbsp;\u2014 The tool&#8217;s&nbsp;<code>_meta.ui.resourceUri<\/code>&nbsp;points at the resource URI.<\/li>\n<\/ol>\n\n\n\n<p>When a user asks&nbsp;<em>&#8220;Show me products matching vanilla candle&#8221;<\/em>, the host invokes your tool, receives product data, and renders your HTML UI inside the conversation \u2014 complete with images, filters, and click actions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>Why App Builder for Agentic Apps?<\/h2>\n\n\n\n<p>Running MCP servers locally works for prototyping, but production Agentic Apps need:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Requirement<\/th><th>App Builder delivers<\/th><\/tr><\/thead><tbody><tr><td><strong>Serverless hosting<\/strong><\/td><td>Adobe I\/O Runtime with auto-scaling<\/td><\/tr><tr><td><strong>Secure credentials<\/strong><\/td><td>Encrypted env vars \u2014 no API keys in client configs<\/td><\/tr><tr><td><strong>Enterprise auth<\/strong><\/td><td>IMS token validation and API key support built in<\/td><\/tr><tr><td><strong>One-command deploy<\/strong><\/td><td><code>aio app deploy<\/code>&nbsp;ships to production<\/td><\/tr><tr><td><strong>Official MCP SDK<\/strong><\/td><td><code>@modelcontextprotocol\/sdk<\/code>&nbsp;+&nbsp;<code>@modelcontextprotocol\/ext-apps<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Adobe also provides an official App Builder template \u2014&nbsp;<code>@ad<\/code>obe\/generator-app-remote-mcp-server-generic&nbsp;\u2014 that scaffolds a production-ready MCP server with tools, resources, prompts, authentication, and Streamable HTTP transport.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>Architecture at a Glance<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/appbuilder-host-1024x576.png\" alt=\"\" class=\"wp-image-287\" width=\"728\" height=\"409\" srcset=\"https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/appbuilder-host-1024x576.png 1024w, https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/appbuilder-host-300x169.png 300w, https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/appbuilder-host-768x432.png 768w, https:\/\/subashselvaraj.com\/wp-content\/uploads\/2026\/07\/appbuilder-host.png 1394w\" sizes=\"(max-width: 728px) 100vw, 728px\" \/><figcaption class=\"wp-element-caption\">The MCP server runs as a stateless web action on I\/O Runtime; the host renders its bundled HTML as an MCP resource.<br><\/figcaption><\/figure><\/div>\n\n\n<p>The MCP server runs as a&nbsp;<strong>web action<\/strong>&nbsp;on I\/O Runtime. Each request creates a fresh, stateless server instance \u2014 ideal for serverless. The bundled HTML is served as an MCP resource and rendered by the host.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>Prerequisites<\/h2>\n\n\n\n<p>Before creating your project, ensure you have:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Requirement<\/th><th>Details<\/th><\/tr><\/thead><tbody><tr><td><strong>Node.js<\/strong><\/td><td>Version 18.19 or later<\/td><\/tr><tr><td><strong>Adobe I\/O CLI<\/strong><\/td><td>App Builder command-line tool (<code>aio<\/code>)<\/td><\/tr><tr><td><strong>Adobe Developer Console account<\/strong><\/td><td><a href=\"https:\/\/developer.adobe.com\/console\">developer.adobe.com\/console<\/a><\/td><\/tr><tr><td><strong>I\/O Runtime enabled<\/strong><\/td><td>A Developer Console project with Runtime added<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2><strong>1<\/strong>.&nbsp;Create an Adobe Developer Console Project<\/h2>\n\n\n\n<ol>\n<li>Go to the&nbsp;<a href=\"https:\/\/developer.adobe.com\/console\">Adobe Developer Console<\/a>.<\/li>\n\n\n\n<li>Click&nbsp;<strong>Create new project<\/strong>&nbsp;\u2192&nbsp;<strong>Create an empty project<\/strong>.<\/li>\n\n\n\n<li>Name your project (e.g.&nbsp;<code>my-agentic-app<\/code>).<\/li>\n\n\n\n<li>Click&nbsp;<strong>Add API<\/strong>&nbsp;\u2192 select&nbsp;<strong>I\/O Runtime<\/strong>&nbsp;\u2192&nbsp;<strong>Next<\/strong>&nbsp;\u2192&nbsp;<strong>Save configured API<\/strong>.<\/li>\n\n\n\n<li>Add a&nbsp;<strong>Workspace<\/strong>&nbsp;(e.g.&nbsp;<code>Development<\/code>) if prompted.<\/li>\n<\/ol>\n\n\n\n<p>Your project now has a serverless runtime namespace where MCP actions will deploy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2><strong>2<\/strong>.&nbsp;Install the Adobe I\/O CLI<\/h2>\n\n\n\n<p>Install the CLI globally:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g @adobe\/aio-cli<\/code><\/pre>\n\n\n\n<p>Verify the installation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aio --version<\/code><\/pre>\n\n\n\n<p>Log in to your Adobe account:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aio login<\/code><\/pre>\n\n\n\n<p>This opens a browser for IMS authentication and links the CLI to your Developer Console projects.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>3. Generate Your MCP Server Project<\/h2>\n\n\n\n<p>Initialize a new App Builder project:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aio app init<\/code><\/pre>\n\n\n\n<p>The CLI walks you through interactive prompts:<\/p>\n\n\n\n<ol>\n<li><strong>Select a project<\/strong>&nbsp;\u2014 Choose the Developer Console project you created in Step 1.<\/li>\n\n\n\n<li><strong>Select a workspace<\/strong>&nbsp;\u2014 Choose&nbsp;<code>Development<\/code>&nbsp;(or your workspace name).<\/li>\n\n\n\n<li><strong>Select a template<\/strong>&nbsp;\u2014 Choose&nbsp;<strong><code>@adobe\/generator-app-remote-mcp-server-generic<\/code><\/strong>&nbsp;(Remote MCP Server).<\/li>\n\n\n\n<li><strong>Project folder name<\/strong>&nbsp;\u2014 e.g.&nbsp;<code>my-agentic-app<\/code>.<\/li>\n\n\n\n<li><strong>App name<\/strong>&nbsp;\u2014 A display name for your application.<\/li>\n<\/ol>\n\n\n\n<p>When complete, the CLI downloads the workspace configuration and scaffolds the project.<\/p>\n\n\n\n<p>Alternatively, pass the folder name directly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aio app init my-agentic-app<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>What Gets Generated<\/h2>\n\n\n\n<p>After&nbsp;<code>aio app init<\/code>, your project directory looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>my-agentic-app\/\n\u251c\u2500\u2500 actions\/\n\u2502   \u2514\u2500\u2500 mcp-server\/\n\u2502       \u251c\u2500\u2500 index.js          <em># Main MCP server action (entry point)<\/em>\n\u2502       \u251c\u2500\u2500 tools.js          <em># Tool, resource, and prompt registrations<\/em>\n\u2502       \u2514\u2500\u2500 validator.js      <em># IMS \/ API key authentication<\/em>\n\u251c\u2500\u2500 test\/                     <em># Jest test suite<\/em>\n\u251c\u2500\u2500 app.config.yaml           <em># I\/O Runtime deployment configuration<\/em>\n\u251c\u2500\u2500 package.json              <em># Dependencies (MCP SDK, Zod, aio-sdk)<\/em>\n\u251c\u2500\u2500 webpack.config.js         <em># Build configuration for the action bundle<\/em>\n\u251c\u2500\u2500 jest.config.js            <em># Test configuration<\/em>\n\u251c\u2500\u2500 .env.example              <em># Environment variable template<\/em>\n\u2514\u2500\u2500 .aio                      <em># Workspace config (gitignored)<\/em><\/code><\/pre>\n\n\n\n<h3>Key files to know<\/h3>\n\n\n\n<p><strong><code>app.config.yaml<\/code><\/strong>&nbsp;\u2014 Defines how your MCP server deploys to I\/O Runtime:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>application:\n  actions: actions\n  runtimeManifest:\n    packages:\n      my-agentic-app:\n        actions:\n          mcp-server:\n            function: actions\/mcp-server\/index.js\n            web: 'yes'\n            runtime: 'nodejs:20'\n            annotations:\n              raw-http: true        <em># Required for MCP Streamable HTTP<\/em>\n              web-export: true<\/code><\/pre>\n\n\n\n<p><strong><code>actions\/mcp-server\/tools.js<\/code><\/strong>&nbsp;\u2014 Where you register MCP capabilities. The template ships with sample tools (echo, calculator, weather), resources, and prompts.<\/p>\n\n\n\n<p><strong><code>actions\/mcp-server\/index.js<\/code><\/strong>&nbsp;\u2014 The I\/O Runtime action entry point. It creates a stateless MCP server per request using Streamable HTTP transport.<\/p>\n\n\n\n<p><strong><code>package.json<\/code><\/strong>&nbsp;\u2014 Core dependencies:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"dependencies\": {\n    \"@adobe\/aio-sdk\": \"^5.0.0\",\n    \"@modelcontextprotocol\/sdk\": \"^1.24.0\",\n    \"zod\": \"^3.23.8\"\n  }\n}<\/code><\/pre>\n\n\n\n<h3>Built-in capabilities (out of the box)<\/h3>\n\n\n\n<p>The generated template includes working examples:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Capability<\/th><th>Name<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><strong>Tool<\/strong><\/td><td><code>echo<\/code><\/td><td>Test connectivity \u2014 echoes a message back<\/td><\/tr><tr><td><strong>Tool<\/strong><\/td><td><code>calculator<\/code><\/td><td>Evaluate math expressions<\/td><\/tr><tr><td><strong>Tool<\/strong><\/td><td><code>weather<\/code><\/td><td>Mock weather API (pattern for external integrations)<\/td><\/tr><tr><td><strong>Resource<\/strong><\/td><td><code>example:\/\/text<\/code><\/td><td>Static text content<\/td><\/tr><tr><td><strong>Resource<\/strong><\/td><td><code>example:\/\/docs<\/code><\/td><td>Markdown documentation<\/td><\/tr><tr><td><strong>Prompt<\/strong><\/td><td><code>weather-info<\/code><\/td><td>Reusable weather prompt template<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>These are starting points you&#8217;ll replace or extend when building Agentic Apps.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>Connect Your Workspace<\/h2>\n\n\n\n<p>After generation, link the project to your Developer Console workspace (if not done automatically during&nbsp;<code>init<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd my-agentic-app\naio app use<\/code><\/pre>\n\n\n\n<p>Select your project and workspace. This writes a&nbsp;<code>.env<\/code>&nbsp;file with runtime credentials (<code>AIO_RUNTIME_NAMESPACE<\/code>,&nbsp;<code>AIO_RUNTIME_AUTH<\/code>, etc.).<\/p>\n\n\n\n<p>Install dependencies:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install<\/code><\/pre>\n\n\n\n<p>At this point you have a fully scaffolded MCP server project, connected to your Adobe I\/O Runtime workspace, ready to deploy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2><strong>4<\/strong>.&nbsp;Deploy to Adobe I\/O Runtime<\/h2>\n\n\n\n<p>The generated template includes a webpack build and deploy script. From your project directory:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run deploy<\/code><\/pre>\n\n\n\n<p>This runs two steps:<\/p>\n\n\n\n<ol>\n<li><strong>Build<\/strong>&nbsp;\u2014 Webpack bundles&nbsp;<code>actions\/mcp-server\/index.js<\/code>&nbsp;into&nbsp;<code>dist\/<\/code>&nbsp;for I\/O Runtime<\/li>\n\n\n\n<li><strong>Deploy<\/strong>&nbsp;\u2014&nbsp;<code>aio app deploy<\/code>&nbsp;uploads the bundle and applies&nbsp;<code>app.config.yaml<\/code><\/li>\n<\/ol>\n\n\n\n<p>When deploy completes, the CLI prints your web action URLs. Note the URL for the&nbsp;<code>mcp-server<\/code>&nbsp;action \u2014 you will need it for host configuration.<\/p>\n\n\n\n<h3>Deployed URL format<\/h3>\n\n\n\n<p>I\/O Runtime web actions follow this pattern:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;&lt;namespace&gt;.adobeioruntime.net\/api\/v1\/web\/&lt;package-name&gt;\/mcp-server<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Segment<\/th><th>Source<\/th><\/tr><\/thead><tbody><tr><td><code>&lt;namespace&gt;<\/code><\/td><td>Your I\/O Runtime namespace (from&nbsp;<code>.env<\/code>, set by&nbsp;<code>aio app use<\/code>)<\/td><\/tr><tr><td><code>&lt;package-name&gt;<\/code><\/td><td>The package key in&nbsp;<code>app.config.yaml<\/code>&nbsp;(e.g.&nbsp;<code>my-agentic-app<\/code>)<\/td><\/tr><tr><td><code>mcp-server<\/code><\/td><td>The action name in&nbsp;<code>app.config.yaml<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Example<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;123456-myproject-dev.adobeioruntime.net\/api\/v1\/web\/my-agentic-app\/mcp-server<\/code><\/pre>\n\n\n\n<p>You can also list deployed actions at any time:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aio runtime action list<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2><strong>5<\/strong>.&nbsp;Verify the Deployment<\/h2>\n\n\n\n<p>Confirm the server is reachable before connecting an MCP host.<\/p>\n\n\n\n<h3>Health check (GET)<\/h3>\n\n\n\n<p>The template responds to&nbsp;<code>GET<\/code>&nbsp;requests with a JSON health payload:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl https:\/\/&lt;namespace&gt;.adobeioruntime.net\/api\/v1\/web\/&lt;package-name&gt;\/mcp-server<\/code><\/pre>\n\n\n\n<p>Expected response:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"status\": \"healthy\",\n  \"server\": \"my-agentic-app\",\n  \"version\": \"1.0.0\",\n  \"transport\": \"StreamableHTTP\",\n  \"sdk\": \"@modelcontextprotocol\/sdk\",\n  \"timestamp\": \"2026-07-16T12:00:00.000Z\"\n}<\/code><\/pre>\n\n\n\n<p>A&nbsp;<code>200<\/code>&nbsp;response with&nbsp;<code>\"status\": \"healthy\"<\/code>&nbsp;confirms the action is deployed and responding.<\/p>\n\n\n\n<h3>Run the test suite<\/h3>\n\n\n\n<p>The template includes Jest tests for health checks, CORS, and MCP protocol handling:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm test<\/code><\/pre>\n\n\n\n<p>Tests exercise the action locally by calling&nbsp;<code>main()<\/code>&nbsp;with simulated I\/O Runtime parameters \u2014 no deploy required, but passing tests is a good signal before you connect a host.<\/p>\n\n\n\n<h3>MCP protocol check (optional)<\/h3>\n\n\n\n<p>Send an MCP&nbsp;<code>initialize<\/code>&nbsp;request directly to the deployed endpoint:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST \\\n  https:\/\/&lt;namespace&gt;.adobeioruntime.net\/api\/v1\/web\/&lt;package-name&gt;\/mcp-server \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"jsonrpc\": \"2.0\",\n    \"id\": 1,\n    \"method\": \"initialize\",\n    \"params\": {\n      \"protocolVersion\": \"2024-11-05\",\n      \"capabilities\": {},\n      \"clientInfo\": { \"name\": \"curl-test\", \"version\": \"1.0.0\" }\n    }\n  }'<\/code><\/pre>\n\n\n\n<p>A successful response includes&nbsp;<code>\"protocolVersion\": \"2024-11-05\"<\/code>&nbsp;and&nbsp;<code>serverInfo<\/code>&nbsp;in the result.<\/p>\n\n\n\n<p>List the built-in tools:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST \\\n  https:\/\/&lt;namespace&gt;.adobeioruntime.net\/api\/v1\/web\/&lt;package-name&gt;\/mcp-server \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"jsonrpc\": \"2.0\",\n    \"id\": 2,\n    \"method\": \"tools\/list\",\n    \"params\": {}\n  }'<\/code><\/pre>\n\n\n\n<p>You should see&nbsp;<code>echo<\/code>,&nbsp;<code>calculator<\/code>, and&nbsp;<code>weather<\/code>&nbsp;in the tool list.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2><strong>6<\/strong>&nbsp;Configure Your MCP Host<\/h2>\n\n\n\n<p>Connect Cursor or Claude Desktop to your deployed server using&nbsp;<strong>Streamable HTTP<\/strong>&nbsp;transport.<\/p>\n\n\n\n<p>Replace&nbsp;<code>&lt;namespace&gt;<\/code>&nbsp;and&nbsp;<code>&lt;package-name&gt;<\/code>&nbsp;with your own values. For initial testing, leave authentication disabled in&nbsp;<code>.env<\/code>&nbsp;(both&nbsp;<code>AUTH_VALIDATE_IMS<\/code>&nbsp;and&nbsp;<code>SERVICE_API_KEY<\/code>&nbsp;unset). See Part 2 for securing the server before production.<\/p>\n\n\n\n<h3>Cursor<\/h3>\n\n\n\n<p>Open&nbsp;<strong>Cursor Settings \u2192 MCP<\/strong>&nbsp;(or edit your MCP config file) and add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"mcpServers\": {\n    \"my-mcp-server\": {\n      \"url\": \"https:\/\/&lt;namespace&gt;.adobeioruntime.net\/api\/v1\/web\/&lt;package-name&gt;\/mcp-server\",\n      \"type\": \"streamable-http\"\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>Restart Cursor after saving. The server should appear in the MCP panel with a green connected status.<\/p>\n\n\n\n<p>Test prompt<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>What&#8217;s the weather in Noida right now?<\/p>\n<\/blockquote>\n\n\n\n<p>Or something that exercises the echo tool:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Repeat this back to me: &#8220;Hello from App Builder&#8221;.<\/p>\n<\/blockquote>\n\n\n\n<h3>Claude Desktop<\/h3>\n\n\n\n<p>Claude Desktop uses stdio by default, so route Streamable HTTP through&nbsp;<code>mcp-remote<\/code>. Add to your Claude Desktop MCP config (<code>claude_desktop_config.json<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"mcpServers\": {\n    \"my-mcp-server\": {\n      \"command\": \"npx\",\n      \"args\": &#91;\n        \"mcp-remote\",\n        \"https:\/\/&lt;namespace&gt;.adobeioruntime.net\/api\/v1\/web\/&lt;package-name&gt;\/mcp-server\"\n      ]\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>Restart Claude Desktop, then try:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>What&#8217;s the weather like in London?<\/p>\n<\/blockquote>\n\n\n\n<h3>Troubleshooting host connections<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Symptom<\/th><th>Likely cause<\/th><th>Fix<\/th><\/tr><\/thead><tbody><tr><td>Host shows disconnected<\/td><td>Wrong URL or namespace<\/td><td>Confirm URL from&nbsp;<code>aio app deploy<\/code>&nbsp;output or&nbsp;<code>aio runtime action list<\/code><\/td><\/tr><tr><td>Health check works, host fails<\/td><td>Missing&nbsp;<code>type: streamable-http<\/code>&nbsp;in Cursor<\/td><td>Add the transport type explicitly<\/td><\/tr><tr><td>Claude Desktop cannot connect<\/td><td>Direct URL without&nbsp;<code>mcp-remote<\/code><\/td><td>Use the&nbsp;<code>npx mcp-remote<\/code>&nbsp;wrapper shown above<\/td><\/tr><tr><td>CORS errors in browser clients<\/td><td>Preflight blocked<\/td><td>Template handles&nbsp;<code>OPTIONS<\/code>; verify&nbsp;<code>raw-http: true<\/code>&nbsp;in&nbsp;<code>app.config.yaml<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>What&#8217;s Next \u2014 Part 2 Preview<\/h2>\n\n\n\n<p>In&nbsp;<strong>Part 2<\/strong>, we&#8217;ll transform this deployed MCP server into a full Agentic App:<\/p>\n\n\n\n<ul>\n<li>Add&nbsp;<code>@modelcontextprotocol\/ext-apps<\/code>&nbsp;for interactive UI support<\/li>\n\n\n\n<li>Build an HTML UI with Vite and&nbsp;<code>vite-plugin-singlefile<\/code><\/li>\n\n\n\n<li>Register an Agentic App tool linked to a UI resource via&nbsp;<code>_meta.ui.resourceUri<\/code><\/li>\n\n\n\n<li>Configure environment variables for your data source<\/li>\n\n\n\n<li>Redeploy and test the interactive UI in Cursor<\/li>\n\n\n\n<li>Secure the server with API key or IMS authentication<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>Summary<\/h2>\n\n\n\n<p>In Part 1, we:<\/p>\n\n\n\n<ol>\n<li>Introduced&nbsp;<strong>Agentic Apps<\/strong>&nbsp;\u2014 MCP tools paired with interactive HTML UIs<\/li>\n\n\n\n<li>Explained why&nbsp;<strong>Adobe App Builder<\/strong>&nbsp;is a strong fit for serverless MCP hosting<\/li>\n\n\n\n<li>Created a&nbsp;<strong>Developer Console project<\/strong>&nbsp;with I\/O Runtime enabled<\/li>\n\n\n\n<li>Installed the&nbsp;<strong>Adobe I\/O CLI<\/strong>&nbsp;and authenticated<\/li>\n\n\n\n<li>Generated a project with&nbsp;<strong><code>aio app init<\/code><\/strong>&nbsp;using the official Remote MCP Server template<\/li>\n\n\n\n<li>Reviewed the&nbsp;<strong>scaffolded project structure<\/strong>&nbsp;and its built-in capabilities<\/li>\n\n\n\n<li><strong>Deployed<\/strong>&nbsp;the MCP server with&nbsp;<code>npm run deploy<\/code><\/li>\n\n\n\n<li><strong>Verified<\/strong>&nbsp;the deployment with health checks and MCP protocol requests<\/li>\n\n\n\n<li><strong>Configured Cursor and Claude Desktop<\/strong>&nbsp;to test the live server<\/li>\n<\/ol>\n\n\n\n<p>You now have a deployed, verified MCP server on App Builder. Part 2 picks up from here and turns it into an interactive Agentic App.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2>Resources<\/h2>\n\n\n\n<ul>\n<li><a href=\"https:\/\/modelcontextprotocol.io\/\">Model Context Protocol<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/modelcontextprotocol\/ext-apps\">MCP Apps Extension (<code>ext-apps<\/code>)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.adobe.com\/app-builder\/docs\/resources\/ai-use-cases\">Adobe App Builder \u2014 AI Use Cases<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/adobe\/generator-app-remote-mcp-server-generic\">Remote MCP Server Generator Template<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.adobe.com\/runtime\/docs\/\">Adobe I\/O Runtime Documentation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.adobe.com\/app-builder\/docs\/getting_started\/\">App Builder Getting Started<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Getting started and creating your project \u2014 the foundations for building interactive AI experiences with Adobe App Builder and the Model Context Protocol. Introduction AI&#8230;<\/p>\n","protected":false},"author":1,"featured_media":289,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_mi_skip_tracking":false,"_themeisle_gutenberg_block_has_review":false},"categories":[36,37,34,4,38,39],"tags":[33,31,32],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts\/275"}],"collection":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/comments?post=275"}],"version-history":[{"count":4,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts\/275\/revisions"}],"predecessor-version":[{"id":290,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/posts\/275\/revisions\/290"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/media\/289"}],"wp:attachment":[{"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/media?parent=275"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/categories?post=275"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/subashselvaraj.com\/index.php\/wp-json\/wp\/v2\/tags?post=275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}