This is page 40 of 43. Use http://codebase.md/taurgis/sfcc-dev-mcp?lines=false&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .github
│ ├── dependabot.yml
│ ├── instructions
│ │ ├── mcp-node-tests.instructions.md
│ │ └── mcp-yml-tests.instructions.md
│ ├── ISSUE_TEMPLATE
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── documentation.yml
│ │ ├── feature_request.yml
│ │ └── question.yml
│ ├── PULL_REQUEST_TEMPLATE
│ │ ├── bug_fix.md
│ │ ├── documentation.md
│ │ └── new_tool.md
│ ├── pull_request_template.md
│ └── workflows
│ ├── ci.yml
│ ├── deploy-pages.yml
│ ├── publish.yml
│ └── update-docs.yml
├── .gitignore
├── .husky
│ └── pre-commit
├── aegis.config.docs-only.json
├── aegis.config.json
├── aegis.config.with-dw.json
├── AGENTS.md
├── ai-instructions
│ ├── claude-desktop
│ │ └── claude_custom_instructions.md
│ ├── cursor
│ │ └── .cursor
│ │ └── rules
│ │ ├── debugging-workflows.mdc
│ │ ├── hooks-development.mdc
│ │ ├── isml-templates.mdc
│ │ ├── job-framework.mdc
│ │ ├── performance-optimization.mdc
│ │ ├── scapi-endpoints.mdc
│ │ ├── security-patterns.mdc
│ │ ├── sfcc-development.mdc
│ │ ├── sfra-controllers.mdc
│ │ ├── sfra-models.mdc
│ │ ├── system-objects.mdc
│ │ └── testing-patterns.mdc
│ └── github-copilot
│ └── copilot-instructions.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── docs
│ ├── best-practices
│ │ ├── cartridge_creation.md
│ │ ├── isml_templates.md
│ │ ├── job_framework.md
│ │ ├── localserviceregistry.md
│ │ ├── ocapi_hooks.md
│ │ ├── performance.md
│ │ ├── scapi_custom_endpoint.md
│ │ ├── scapi_hooks.md
│ │ ├── security.md
│ │ ├── sfra_client_side_js.md
│ │ ├── sfra_controllers.md
│ │ ├── sfra_models.md
│ │ └── sfra_scss.md
│ ├── dw_campaign
│ │ ├── ABTest.md
│ │ ├── ABTestMgr.md
│ │ ├── ABTestSegment.md
│ │ ├── AmountDiscount.md
│ │ ├── ApproachingDiscount.md
│ │ ├── BonusChoiceDiscount.md
│ │ ├── BonusDiscount.md
│ │ ├── Campaign.md
│ │ ├── CampaignMgr.md
│ │ ├── CampaignStatusCodes.md
│ │ ├── Coupon.md
│ │ ├── CouponMgr.md
│ │ ├── CouponRedemption.md
│ │ ├── CouponStatusCodes.md
│ │ ├── Discount.md
│ │ ├── DiscountPlan.md
│ │ ├── FixedPriceDiscount.md
│ │ ├── FixedPriceShippingDiscount.md
│ │ ├── FreeDiscount.md
│ │ ├── FreeShippingDiscount.md
│ │ ├── PercentageDiscount.md
│ │ ├── PercentageOptionDiscount.md
│ │ ├── PriceBookPriceDiscount.md
│ │ ├── Promotion.md
│ │ ├── PromotionMgr.md
│ │ ├── PromotionPlan.md
│ │ ├── SlotContent.md
│ │ ├── SourceCodeGroup.md
│ │ ├── SourceCodeInfo.md
│ │ ├── SourceCodeStatusCodes.md
│ │ └── TotalFixedPriceDiscount.md
│ ├── dw_catalog
│ │ ├── Catalog.md
│ │ ├── CatalogMgr.md
│ │ ├── Category.md
│ │ ├── CategoryAssignment.md
│ │ ├── CategoryLink.md
│ │ ├── PriceBook.md
│ │ ├── PriceBookMgr.md
│ │ ├── Product.md
│ │ ├── ProductActiveData.md
│ │ ├── ProductAttributeModel.md
│ │ ├── ProductAvailabilityLevels.md
│ │ ├── ProductAvailabilityModel.md
│ │ ├── ProductInventoryList.md
│ │ ├── ProductInventoryMgr.md
│ │ ├── ProductInventoryRecord.md
│ │ ├── ProductLink.md
│ │ ├── ProductMgr.md
│ │ ├── ProductOption.md
│ │ ├── ProductOptionModel.md
│ │ ├── ProductOptionValue.md
│ │ ├── ProductPriceInfo.md
│ │ ├── ProductPriceModel.md
│ │ ├── ProductPriceTable.md
│ │ ├── ProductSearchHit.md
│ │ ├── ProductSearchModel.md
│ │ ├── ProductSearchRefinementDefinition.md
│ │ ├── ProductSearchRefinements.md
│ │ ├── ProductSearchRefinementValue.md
│ │ ├── ProductVariationAttribute.md
│ │ ├── ProductVariationAttributeValue.md
│ │ ├── ProductVariationModel.md
│ │ ├── Recommendation.md
│ │ ├── SearchModel.md
│ │ ├── SearchRefinementDefinition.md
│ │ ├── SearchRefinements.md
│ │ ├── SearchRefinementValue.md
│ │ ├── SortingOption.md
│ │ ├── SortingRule.md
│ │ ├── Store.md
│ │ ├── StoreGroup.md
│ │ ├── StoreInventoryFilter.md
│ │ ├── StoreInventoryFilterValue.md
│ │ ├── StoreMgr.md
│ │ ├── Variant.md
│ │ └── VariationGroup.md
│ ├── dw_content
│ │ ├── Content.md
│ │ ├── ContentMgr.md
│ │ ├── ContentSearchModel.md
│ │ ├── ContentSearchRefinementDefinition.md
│ │ ├── ContentSearchRefinements.md
│ │ ├── ContentSearchRefinementValue.md
│ │ ├── Folder.md
│ │ ├── Library.md
│ │ ├── MarkupText.md
│ │ └── MediaFile.md
│ ├── dw_crypto
│ │ ├── CertificateRef.md
│ │ ├── CertificateUtils.md
│ │ ├── Cipher.md
│ │ ├── Encoding.md
│ │ ├── JWE.md
│ │ ├── JWEHeader.md
│ │ ├── JWS.md
│ │ ├── JWSHeader.md
│ │ ├── KeyRef.md
│ │ ├── Mac.md
│ │ ├── MessageDigest.md
│ │ ├── SecureRandom.md
│ │ ├── Signature.md
│ │ ├── WeakCipher.md
│ │ ├── WeakMac.md
│ │ ├── WeakMessageDigest.md
│ │ ├── WeakSignature.md
│ │ └── X509Certificate.md
│ ├── dw_customer
│ │ ├── AddressBook.md
│ │ ├── AgentUserMgr.md
│ │ ├── AgentUserStatusCodes.md
│ │ ├── AuthenticationStatus.md
│ │ ├── Credentials.md
│ │ ├── Customer.md
│ │ ├── CustomerActiveData.md
│ │ ├── CustomerAddress.md
│ │ ├── CustomerCDPData.md
│ │ ├── CustomerContextMgr.md
│ │ ├── CustomerGroup.md
│ │ ├── CustomerList.md
│ │ ├── CustomerMgr.md
│ │ ├── CustomerPasswordConstraints.md
│ │ ├── CustomerPaymentInstrument.md
│ │ ├── CustomerStatusCodes.md
│ │ ├── EncryptedObject.md
│ │ ├── ExternalProfile.md
│ │ ├── OrderHistory.md
│ │ ├── ProductList.md
│ │ ├── ProductListItem.md
│ │ ├── ProductListItemPurchase.md
│ │ ├── ProductListMgr.md
│ │ ├── ProductListRegistrant.md
│ │ ├── Profile.md
│ │ └── Wallet.md
│ ├── dw_extensions.applepay
│ │ ├── ApplePayHookResult.md
│ │ └── ApplePayHooks.md
│ ├── dw_extensions.facebook
│ │ ├── FacebookFeedHooks.md
│ │ └── FacebookProduct.md
│ ├── dw_extensions.paymentrequest
│ │ ├── PaymentRequestHookResult.md
│ │ └── PaymentRequestHooks.md
│ ├── dw_extensions.payments
│ │ ├── SalesforceBancontactPaymentDetails.md
│ │ ├── SalesforceCardPaymentDetails.md
│ │ ├── SalesforceEpsPaymentDetails.md
│ │ ├── SalesforceIdealPaymentDetails.md
│ │ ├── SalesforceKlarnaPaymentDetails.md
│ │ ├── SalesforcePaymentDetails.md
│ │ ├── SalesforcePaymentIntent.md
│ │ ├── SalesforcePaymentMethod.md
│ │ ├── SalesforcePaymentRequest.md
│ │ ├── SalesforcePaymentsHooks.md
│ │ ├── SalesforcePaymentsMgr.md
│ │ ├── SalesforcePaymentsSiteConfiguration.md
│ │ ├── SalesforcePayPalOrder.md
│ │ ├── SalesforcePayPalOrderAddress.md
│ │ ├── SalesforcePayPalOrderPayer.md
│ │ ├── SalesforcePayPalPaymentDetails.md
│ │ ├── SalesforceSepaDebitPaymentDetails.md
│ │ └── SalesforceVenmoPaymentDetails.md
│ ├── dw_extensions.pinterest
│ │ ├── PinterestAvailability.md
│ │ ├── PinterestFeedHooks.md
│ │ ├── PinterestOrder.md
│ │ ├── PinterestOrderHooks.md
│ │ └── PinterestProduct.md
│ ├── dw_io
│ │ ├── CSVStreamReader.md
│ │ ├── CSVStreamWriter.md
│ │ ├── File.md
│ │ ├── FileReader.md
│ │ ├── FileWriter.md
│ │ ├── InputStream.md
│ │ ├── OutputStream.md
│ │ ├── PrintWriter.md
│ │ ├── RandomAccessFileReader.md
│ │ ├── Reader.md
│ │ ├── StringWriter.md
│ │ ├── Writer.md
│ │ ├── XMLIndentingStreamWriter.md
│ │ ├── XMLStreamConstants.md
│ │ ├── XMLStreamReader.md
│ │ └── XMLStreamWriter.md
│ ├── dw_job
│ │ ├── JobExecution.md
│ │ └── JobStepExecution.md
│ ├── dw_net
│ │ ├── FTPClient.md
│ │ ├── FTPFileInfo.md
│ │ ├── HTTPClient.md
│ │ ├── HTTPRequestPart.md
│ │ ├── Mail.md
│ │ ├── SFTPClient.md
│ │ ├── SFTPFileInfo.md
│ │ ├── WebDAVClient.md
│ │ └── WebDAVFileInfo.md
│ ├── dw_object
│ │ ├── ActiveData.md
│ │ ├── CustomAttributes.md
│ │ ├── CustomObject.md
│ │ ├── CustomObjectMgr.md
│ │ ├── Extensible.md
│ │ ├── ExtensibleObject.md
│ │ ├── Note.md
│ │ ├── ObjectAttributeDefinition.md
│ │ ├── ObjectAttributeGroup.md
│ │ ├── ObjectAttributeValueDefinition.md
│ │ ├── ObjectTypeDefinition.md
│ │ ├── PersistentObject.md
│ │ ├── SimpleExtensible.md
│ │ └── SystemObjectMgr.md
│ ├── dw_order
│ │ ├── AbstractItem.md
│ │ ├── AbstractItemCtnr.md
│ │ ├── Appeasement.md
│ │ ├── AppeasementItem.md
│ │ ├── Basket.md
│ │ ├── BasketMgr.md
│ │ ├── BonusDiscountLineItem.md
│ │ ├── CouponLineItem.md
│ │ ├── CreateAgentBasketLimitExceededException.md
│ │ ├── CreateBasketFromOrderException.md
│ │ ├── CreateCouponLineItemException.md
│ │ ├── CreateOrderException.md
│ │ ├── CreateTemporaryBasketLimitExceededException.md
│ │ ├── GiftCertificate.md
│ │ ├── GiftCertificateLineItem.md
│ │ ├── GiftCertificateMgr.md
│ │ ├── GiftCertificateStatusCodes.md
│ │ ├── Invoice.md
│ │ ├── InvoiceItem.md
│ │ ├── LineItem.md
│ │ ├── LineItemCtnr.md
│ │ ├── Order.md
│ │ ├── OrderAddress.md
│ │ ├── OrderItem.md
│ │ ├── OrderMgr.md
│ │ ├── OrderPaymentInstrument.md
│ │ ├── OrderProcessStatusCodes.md
│ │ ├── PaymentCard.md
│ │ ├── PaymentInstrument.md
│ │ ├── PaymentMethod.md
│ │ ├── PaymentMgr.md
│ │ ├── PaymentProcessor.md
│ │ ├── PaymentStatusCodes.md
│ │ ├── PaymentTransaction.md
│ │ ├── PriceAdjustment.md
│ │ ├── PriceAdjustmentLimitTypes.md
│ │ ├── ProductLineItem.md
│ │ ├── ProductShippingCost.md
│ │ ├── ProductShippingLineItem.md
│ │ ├── ProductShippingModel.md
│ │ ├── Return.md
│ │ ├── ReturnCase.md
│ │ ├── ReturnCaseItem.md
│ │ ├── ReturnItem.md
│ │ ├── Shipment.md
│ │ ├── ShipmentShippingCost.md
│ │ ├── ShipmentShippingModel.md
│ │ ├── ShippingLineItem.md
│ │ ├── ShippingLocation.md
│ │ ├── ShippingMethod.md
│ │ ├── ShippingMgr.md
│ │ ├── ShippingOrder.md
│ │ ├── ShippingOrderItem.md
│ │ ├── SumItem.md
│ │ ├── TaxGroup.md
│ │ ├── TaxItem.md
│ │ ├── TaxMgr.md
│ │ ├── TrackingInfo.md
│ │ └── TrackingRef.md
│ ├── dw_order.hooks
│ │ ├── CalculateHooks.md
│ │ ├── OrderHooks.md
│ │ ├── PaymentHooks.md
│ │ ├── ReturnHooks.md
│ │ └── ShippingOrderHooks.md
│ ├── dw_rpc
│ │ ├── SOAPUtil.md
│ │ ├── Stub.md
│ │ └── WebReference.md
│ ├── dw_suggest
│ │ ├── BrandSuggestions.md
│ │ ├── CategorySuggestions.md
│ │ ├── ContentSuggestions.md
│ │ ├── CustomSuggestions.md
│ │ ├── ProductSuggestions.md
│ │ ├── SearchPhraseSuggestions.md
│ │ ├── SuggestedCategory.md
│ │ ├── SuggestedContent.md
│ │ ├── SuggestedPhrase.md
│ │ ├── SuggestedProduct.md
│ │ ├── SuggestedTerm.md
│ │ ├── SuggestedTerms.md
│ │ ├── Suggestions.md
│ │ └── SuggestModel.md
│ ├── dw_svc
│ │ ├── FTPService.md
│ │ ├── FTPServiceDefinition.md
│ │ ├── HTTPFormService.md
│ │ ├── HTTPFormServiceDefinition.md
│ │ ├── HTTPService.md
│ │ ├── HTTPServiceDefinition.md
│ │ ├── LocalServiceRegistry.md
│ │ ├── Result.md
│ │ ├── Service.md
│ │ ├── ServiceCallback.md
│ │ ├── ServiceConfig.md
│ │ ├── ServiceCredential.md
│ │ ├── ServiceDefinition.md
│ │ ├── ServiceProfile.md
│ │ ├── ServiceRegistry.md
│ │ ├── SOAPService.md
│ │ └── SOAPServiceDefinition.md
│ ├── dw_system
│ │ ├── AgentUserStatusCodes.md
│ │ ├── Cache.md
│ │ ├── CacheMgr.md
│ │ ├── HookMgr.md
│ │ ├── InternalObject.md
│ │ ├── JobProcessMonitor.md
│ │ ├── Log.md
│ │ ├── Logger.md
│ │ ├── LogNDC.md
│ │ ├── OrganizationPreferences.md
│ │ ├── Pipeline.md
│ │ ├── PipelineDictionary.md
│ │ ├── RemoteInclude.md
│ │ ├── Request.md
│ │ ├── RequestHooks.md
│ │ ├── Response.md
│ │ ├── RESTErrorResponse.md
│ │ ├── RESTResponseMgr.md
│ │ ├── RESTSuccessResponse.md
│ │ ├── SearchStatus.md
│ │ ├── Session.md
│ │ ├── Site.md
│ │ ├── SitePreferences.md
│ │ ├── Status.md
│ │ ├── StatusItem.md
│ │ ├── System.md
│ │ └── Transaction.md
│ ├── dw_util
│ │ ├── ArrayList.md
│ │ ├── Assert.md
│ │ ├── BigInteger.md
│ │ ├── Bytes.md
│ │ ├── Calendar.md
│ │ ├── Collection.md
│ │ ├── Currency.md
│ │ ├── DateUtils.md
│ │ ├── Decimal.md
│ │ ├── FilteringCollection.md
│ │ ├── Geolocation.md
│ │ ├── HashMap.md
│ │ ├── HashSet.md
│ │ ├── Iterator.md
│ │ ├── LinkedHashMap.md
│ │ ├── LinkedHashSet.md
│ │ ├── List.md
│ │ ├── Locale.md
│ │ ├── Map.md
│ │ ├── MapEntry.md
│ │ ├── MappingKey.md
│ │ ├── MappingMgr.md
│ │ ├── PropertyComparator.md
│ │ ├── SecureEncoder.md
│ │ ├── SecureFilter.md
│ │ ├── SeekableIterator.md
│ │ ├── Set.md
│ │ ├── SortedMap.md
│ │ ├── SortedSet.md
│ │ ├── StringUtils.md
│ │ ├── Template.md
│ │ └── UUIDUtils.md
│ ├── dw_value
│ │ ├── EnumValue.md
│ │ ├── MimeEncodedText.md
│ │ ├── Money.md
│ │ └── Quantity.md
│ ├── dw_web
│ │ ├── ClickStream.md
│ │ ├── ClickStreamEntry.md
│ │ ├── Cookie.md
│ │ ├── Cookies.md
│ │ ├── CSRFProtection.md
│ │ ├── Form.md
│ │ ├── FormAction.md
│ │ ├── FormElement.md
│ │ ├── FormElementValidationResult.md
│ │ ├── FormField.md
│ │ ├── FormFieldOption.md
│ │ ├── FormFieldOptions.md
│ │ ├── FormGroup.md
│ │ ├── FormList.md
│ │ ├── FormListItem.md
│ │ ├── Forms.md
│ │ ├── HttpParameter.md
│ │ ├── HttpParameterMap.md
│ │ ├── LoopIterator.md
│ │ ├── PageMetaData.md
│ │ ├── PageMetaTag.md
│ │ ├── PagingModel.md
│ │ ├── Resource.md
│ │ ├── URL.md
│ │ ├── URLAction.md
│ │ ├── URLParameter.md
│ │ ├── URLRedirect.md
│ │ ├── URLRedirectMgr.md
│ │ └── URLUtils.md
│ ├── sfra
│ │ ├── account.md
│ │ ├── address.md
│ │ ├── billing.md
│ │ ├── cart.md
│ │ ├── categories.md
│ │ ├── content.md
│ │ ├── locale.md
│ │ ├── order.md
│ │ ├── payment.md
│ │ ├── price-default.md
│ │ ├── price-range.md
│ │ ├── price-tiered.md
│ │ ├── product-bundle.md
│ │ ├── product-full.md
│ │ ├── product-line-items.md
│ │ ├── product-search.md
│ │ ├── product-tile.md
│ │ ├── querystring.md
│ │ ├── render.md
│ │ ├── request.md
│ │ ├── response.md
│ │ ├── server.md
│ │ ├── shipping.md
│ │ ├── store.md
│ │ ├── stores.md
│ │ └── totals.md
│ └── TopLevel
│ ├── APIException.md
│ ├── arguments.md
│ ├── Array.md
│ ├── ArrayBuffer.md
│ ├── BigInt.md
│ ├── Boolean.md
│ ├── ConversionError.md
│ ├── DataView.md
│ ├── Date.md
│ ├── Error.md
│ ├── ES6Iterator.md
│ ├── EvalError.md
│ ├── Fault.md
│ ├── Float32Array.md
│ ├── Float64Array.md
│ ├── Function.md
│ ├── Generator.md
│ ├── global.md
│ ├── Int16Array.md
│ ├── Int32Array.md
│ ├── Int8Array.md
│ ├── InternalError.md
│ ├── IOError.md
│ ├── Iterable.md
│ ├── Iterator.md
│ ├── JSON.md
│ ├── Map.md
│ ├── Math.md
│ ├── Module.md
│ ├── Namespace.md
│ ├── Number.md
│ ├── Object.md
│ ├── QName.md
│ ├── RangeError.md
│ ├── ReferenceError.md
│ ├── RegExp.md
│ ├── Set.md
│ ├── StopIteration.md
│ ├── String.md
│ ├── Symbol.md
│ ├── SyntaxError.md
│ ├── SystemError.md
│ ├── TypeError.md
│ ├── Uint16Array.md
│ ├── Uint32Array.md
│ ├── Uint8Array.md
│ ├── Uint8ClampedArray.md
│ ├── URIError.md
│ ├── WeakMap.md
│ ├── WeakSet.md
│ ├── XML.md
│ ├── XMLList.md
│ └── XMLStreamError.md
├── docs-site
│ ├── .gitignore
│ ├── App.tsx
│ ├── components
│ │ ├── Badge.tsx
│ │ ├── BreadcrumbSchema.tsx
│ │ ├── CodeBlock.tsx
│ │ ├── Collapsible.tsx
│ │ ├── ConfigBuilder.tsx
│ │ ├── ConfigHero.tsx
│ │ ├── ConfigModeTabs.tsx
│ │ ├── icons.tsx
│ │ ├── Layout.tsx
│ │ ├── LightCodeContainer.tsx
│ │ ├── NewcomerCTA.tsx
│ │ ├── NextStepsStrip.tsx
│ │ ├── OnThisPage.tsx
│ │ ├── Search.tsx
│ │ ├── SEO.tsx
│ │ ├── Sidebar.tsx
│ │ ├── StructuredData.tsx
│ │ ├── ToolCard.tsx
│ │ ├── ToolFilters.tsx
│ │ ├── Typography.tsx
│ │ └── VersionBadge.tsx
│ ├── constants.tsx
│ ├── index.html
│ ├── main.tsx
│ ├── metadata.json
│ ├── package-lock.json
│ ├── package.json
│ ├── pages
│ │ ├── AIInterfacesPage.tsx
│ │ ├── ConfigurationPage.tsx
│ │ ├── DevelopmentPage.tsx
│ │ ├── ExamplesPage.tsx
│ │ ├── FeaturesPage.tsx
│ │ ├── HomePage.tsx
│ │ ├── SecurityPage.tsx
│ │ ├── ToolsPage.tsx
│ │ └── TroubleshootingPage.tsx
│ ├── postcss.config.js
│ ├── public
│ │ ├── .well-known
│ │ │ └── security.txt
│ │ ├── 404.html
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── apple-touch-icon.png
│ │ ├── explain-product-pricing-methods-no-mcp.png
│ │ ├── explain-product-pricing-methods.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ ├── llms.txt
│ │ ├── robots.txt
│ │ ├── site.webmanifest
│ │ └── sitemap.xml
│ ├── README.md
│ ├── scripts
│ │ ├── generate-search-index.js
│ │ ├── generate-sitemap.js
│ │ └── search-dev.js
│ ├── src
│ │ └── styles
│ │ ├── input.css
│ │ └── prism-theme.css
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ ├── types.ts
│ ├── utils
│ │ ├── search.ts
│ │ └── toolsData.ts
│ └── vite.config.ts
├── eslint.config.js
├── jest.config.js
├── LICENSE
├── package-lock.json
├── package.json
├── README.md
├── scripts
│ └── convert-docs.js
├── SECURITY.md
├── server.json
├── src
│ ├── clients
│ │ ├── base
│ │ │ ├── http-client.ts
│ │ │ ├── oauth-token.ts
│ │ │ └── ocapi-auth-client.ts
│ │ ├── best-practices-client.ts
│ │ ├── cartridge-generation-client.ts
│ │ ├── docs
│ │ │ ├── class-content-parser.ts
│ │ │ ├── class-name-resolver.ts
│ │ │ ├── documentation-scanner.ts
│ │ │ ├── index.ts
│ │ │ └── referenced-types-extractor.ts
│ │ ├── docs-client.ts
│ │ ├── log-client.ts
│ │ ├── logs
│ │ │ ├── index.ts
│ │ │ ├── log-analyzer.ts
│ │ │ ├── log-client.ts
│ │ │ ├── log-constants.ts
│ │ │ ├── log-file-discovery.ts
│ │ │ ├── log-file-reader.ts
│ │ │ ├── log-formatter.ts
│ │ │ ├── log-processor.ts
│ │ │ ├── log-types.ts
│ │ │ └── webdav-client-manager.ts
│ │ ├── ocapi
│ │ │ ├── code-versions-client.ts
│ │ │ ├── site-preferences-client.ts
│ │ │ └── system-objects-client.ts
│ │ ├── ocapi-client.ts
│ │ └── sfra-client.ts
│ ├── config
│ │ ├── configuration-factory.ts
│ │ └── dw-json-loader.ts
│ ├── core
│ │ ├── handlers
│ │ │ ├── abstract-log-tool-handler.ts
│ │ │ ├── base-handler.ts
│ │ │ ├── best-practices-handler.ts
│ │ │ ├── cartridge-handler.ts
│ │ │ ├── client-factory.ts
│ │ │ ├── code-version-handler.ts
│ │ │ ├── docs-handler.ts
│ │ │ ├── job-log-handler.ts
│ │ │ ├── job-log-tool-config.ts
│ │ │ ├── log-handler.ts
│ │ │ ├── log-tool-config.ts
│ │ │ ├── sfra-handler.ts
│ │ │ ├── system-object-handler.ts
│ │ │ └── validation-helpers.ts
│ │ ├── server.ts
│ │ └── tool-definitions.ts
│ ├── index.ts
│ ├── main.ts
│ ├── services
│ │ ├── file-system-service.ts
│ │ ├── index.ts
│ │ └── path-service.ts
│ ├── tool-configs
│ │ ├── best-practices-tool-config.ts
│ │ ├── cartridge-tool-config.ts
│ │ ├── code-version-tool-config.ts
│ │ ├── docs-tool-config.ts
│ │ ├── job-log-tool-config.ts
│ │ ├── log-tool-config.ts
│ │ ├── sfra-tool-config.ts
│ │ └── system-object-tool-config.ts
│ ├── types
│ │ └── types.ts
│ └── utils
│ ├── cache.ts
│ ├── job-log-tool-config.ts
│ ├── job-log-utils.ts
│ ├── log-cache.ts
│ ├── log-tool-config.ts
│ ├── log-tool-constants.ts
│ ├── log-tool-utils.ts
│ ├── logger.ts
│ ├── ocapi-url-builder.ts
│ ├── path-resolver.ts
│ ├── query-builder.ts
│ ├── utils.ts
│ └── validator.ts
├── tests
│ ├── __mocks__
│ │ ├── docs-client.ts
│ │ ├── src
│ │ │ └── clients
│ │ │ └── base
│ │ │ └── http-client.js
│ │ └── webdav.js
│ ├── base-handler.test.ts
│ ├── base-http-client.test.ts
│ ├── best-practices-handler.test.ts
│ ├── cache.test.ts
│ ├── cartridge-handler.test.ts
│ ├── class-content-parser.test.ts
│ ├── class-name-resolver.test.ts
│ ├── client-factory.test.ts
│ ├── code-version-handler.test.ts
│ ├── code-versions-client.test.ts
│ ├── config.test.ts
│ ├── configuration-factory.test.ts
│ ├── docs-handler.test.ts
│ ├── documentation-scanner.test.ts
│ ├── file-system-service.test.ts
│ ├── job-log-handler.test.ts
│ ├── job-log-utils.test.ts
│ ├── log-client.test.ts
│ ├── log-handler.test.ts
│ ├── log-processor.test.ts
│ ├── logger.test.ts
│ ├── mcp
│ │ ├── AGENTS.md
│ │ ├── node
│ │ │ ├── activate-code-version-advanced.full-mode.programmatic.test.js
│ │ │ ├── code-versions.full-mode.programmatic.test.js
│ │ │ ├── generate-cartridge-structure.docs-only.programmatic.test.js
│ │ │ ├── get-available-best-practice-guides.docs-only.programmatic.test.js
│ │ │ ├── get-available-sfra-documents.programmatic.test.js
│ │ │ ├── get-best-practice-guide.docs-only.programmatic.test.js
│ │ │ ├── get-hook-reference.docs-only.programmatic.test.js
│ │ │ ├── get-job-execution-summary.full-mode.programmatic.test.js
│ │ │ ├── get-job-log-entries.full-mode.programmatic.test.js
│ │ │ ├── get-latest-debug.full-mode.programmatic.test.js
│ │ │ ├── get-latest-error.full-mode.programmatic.test.js
│ │ │ ├── get-latest-info.full-mode.programmatic.test.js
│ │ │ ├── get-latest-job-log-files.full-mode.programmatic.test.js
│ │ │ ├── get-latest-warn.full-mode.programmatic.test.js
│ │ │ ├── get-log-file-contents.full-mode.programmatic.test.js
│ │ │ ├── get-sfcc-class-documentation.docs-only.programmatic.test.js
│ │ │ ├── get-sfcc-class-info.docs-only.programmatic.test.js
│ │ │ ├── get-sfra-categories.docs-only.programmatic.test.js
│ │ │ ├── get-sfra-document.programmatic.test.js
│ │ │ ├── get-sfra-documents-by-category.docs-only.programmatic.test.js
│ │ │ ├── get-system-object-definition.full-mode.programmatic.test.js
│ │ │ ├── get-system-object-definitions.docs-only.programmatic.test.js
│ │ │ ├── get-system-object-definitions.full-mode.programmatic.test.js
│ │ │ ├── list-log-files.full-mode.programmatic.test.js
│ │ │ ├── list-sfcc-classes.docs-only.programmatic.test.js
│ │ │ ├── search-best-practices.docs-only.programmatic.test.js
│ │ │ ├── search-custom-object-attribute-definitions.full-mode.programmatic.test.js
│ │ │ ├── search-job-logs-by-name.full-mode.programmatic.test.js
│ │ │ ├── search-job-logs.full-mode.programmatic.test.js
│ │ │ ├── search-logs.full-mode.programmatic.test.js
│ │ │ ├── search-sfcc-classes.docs-only.programmatic.test.js
│ │ │ ├── search-sfcc-methods.docs-only.programmatic.test.js
│ │ │ ├── search-sfra-documentation.docs-only.programmatic.test.js
│ │ │ ├── search-site-preferences.full-mode.programmatic.test.js
│ │ │ ├── search-system-object-attribute-definitions.full-mode.programmatic.test.js
│ │ │ ├── search-system-object-attribute-groups.full-mode.programmatic.test.js
│ │ │ ├── summarize-logs.full-mode.programmatic.test.js
│ │ │ ├── tools.docs-only.programmatic.test.js
│ │ │ └── tools.full-mode.programmatic.test.js
│ │ ├── README.md
│ │ ├── test-fixtures
│ │ │ └── dw.json
│ │ └── yaml
│ │ ├── activate-code-version.docs-only.test.mcp.yml
│ │ ├── activate-code-version.full-mode.test.mcp.yml
│ │ ├── get_latest_error.test.mcp.yml
│ │ ├── get-available-best-practice-guides.docs-only.test.mcp.yml
│ │ ├── get-available-best-practice-guides.full-mode.test.mcp.yml
│ │ ├── get-available-sfra-documents.docs-only.test.mcp.yml
│ │ ├── get-available-sfra-documents.full-mode.test.mcp.yml
│ │ ├── get-best-practice-guide.docs-only.test.mcp.yml
│ │ ├── get-best-practice-guide.full-mode.test.mcp.yml
│ │ ├── get-code-versions.docs-only.test.mcp.yml
│ │ ├── get-code-versions.full-mode.test.mcp.yml
│ │ ├── get-hook-reference.docs-only.test.mcp.yml
│ │ ├── get-hook-reference.full-mode.test.mcp.yml
│ │ ├── get-job-execution-summary.full-mode.test.mcp.yml
│ │ ├── get-job-log-entries.full-mode.test.mcp.yml
│ │ ├── get-latest-debug.full-mode.test.mcp.yml
│ │ ├── get-latest-error.full-mode.test.mcp.yml
│ │ ├── get-latest-info.full-mode.test.mcp.yml
│ │ ├── get-latest-job-log-files.full-mode.test.mcp.yml
│ │ ├── get-latest-warn.full-mode.test.mcp.yml
│ │ ├── get-log-file-contents.full-mode.test.mcp.yml
│ │ ├── get-sfcc-class-documentation.docs-only.test.mcp.yml
│ │ ├── get-sfcc-class-documentation.full-mode.test.mcp.yml
│ │ ├── get-sfcc-class-info.docs-only.test.mcp.yml
│ │ ├── get-sfcc-class-info.full-mode.test.mcp.yml
│ │ ├── get-sfra-categories.docs-only.test.mcp.yml
│ │ ├── get-sfra-categories.full-mode.test.mcp.yml
│ │ ├── get-sfra-document.docs-only.test.mcp.yml
│ │ ├── get-sfra-document.full-mode.test.mcp.yml
│ │ ├── get-sfra-documents-by-category.docs-only.test.mcp.yml
│ │ ├── get-sfra-documents-by-category.full-mode.test.mcp.yml
│ │ ├── get-system-object-definition.docs-only.test.mcp.yml
│ │ ├── get-system-object-definition.full-mode.test.mcp.yml
│ │ ├── get-system-object-definitions.docs-only.test.mcp.yml
│ │ ├── get-system-object-definitions.full-mode.test.mcp.yml
│ │ ├── list-log-files.full-mode.test.mcp.yml
│ │ ├── list-sfcc-classes.docs-only.test.mcp.yml
│ │ ├── list-sfcc-classes.full-mode.test.mcp.yml
│ │ ├── search-best-practices.docs-only.test.mcp.yml
│ │ ├── search-best-practices.full-mode.test.mcp.yml
│ │ ├── search-custom-object-attribute-definitions.docs-only.test.mcp.yml
│ │ ├── search-custom-object-attribute-definitions.test.mcp.yml
│ │ ├── search-job-logs-by-name.full-mode.test.mcp.yml
│ │ ├── search-job-logs.full-mode.test.mcp.yml
│ │ ├── search-logs.full-mode.test.mcp.yml
│ │ ├── search-sfcc-classes.docs-only.test.mcp.yml
│ │ ├── search-sfcc-classes.full-mode.test.mcp.yml
│ │ ├── search-sfcc-methods.docs-only.test.mcp.yml
│ │ ├── search-sfcc-methods.full-mode.test.mcp.yml
│ │ ├── search-sfra-documentation.docs-only.test.mcp.yml
│ │ ├── search-sfra-documentation.full-mode.test.mcp.yml
│ │ ├── search-site-preferences.docs-only.test.mcp.yml
│ │ ├── search-site-preferences.full-mode.test.mcp.yml
│ │ ├── search-system-object-attribute-definitions.docs-only.test.mcp.yml
│ │ ├── search-system-object-attribute-definitions.full-mode.test.mcp.yml
│ │ ├── search-system-object-attribute-groups.docs-only.test.mcp.yml
│ │ ├── search-system-object-attribute-groups.full-mode.test.mcp.yml
│ │ ├── summarize-logs.full-mode.test.mcp.yml
│ │ ├── tools.docs-only.test.mcp.yml
│ │ └── tools.full-mode.test.mcp.yml
│ ├── oauth-token.test.ts
│ ├── ocapi-auth-client.test.ts
│ ├── ocapi-client.test.ts
│ ├── path-service.test.ts
│ ├── query-builder.test.ts
│ ├── referenced-types-extractor.test.ts
│ ├── servers
│ │ ├── sfcc-mock-server
│ │ │ ├── mock-data
│ │ │ │ └── ocapi
│ │ │ │ ├── code-versions.json
│ │ │ │ ├── custom-object-attributes-customapi.json
│ │ │ │ ├── custom-object-attributes-globalsettings.json
│ │ │ │ ├── custom-object-attributes-versionhistory.json
│ │ │ │ ├── site-preferences-ccv.json
│ │ │ │ ├── site-preferences-fastforward.json
│ │ │ │ ├── site-preferences-sfra.json
│ │ │ │ ├── site-preferences-storefront.json
│ │ │ │ ├── site-preferences-system.json
│ │ │ │ ├── system-object-attribute-groups-campaign.json
│ │ │ │ ├── system-object-attribute-groups-category.json
│ │ │ │ ├── system-object-attribute-groups-order.json
│ │ │ │ ├── system-object-attribute-groups-product.json
│ │ │ │ ├── system-object-attribute-groups-sitepreferences.json
│ │ │ │ ├── system-object-attributes-customeraddress.json
│ │ │ │ ├── system-object-attributes-product-expanded.json
│ │ │ │ ├── system-object-attributes-product.json
│ │ │ │ ├── system-object-definition-category.json
│ │ │ │ ├── system-object-definition-customer.json
│ │ │ │ ├── system-object-definition-customeraddress.json
│ │ │ │ ├── system-object-definition-order.json
│ │ │ │ ├── system-object-definition-product.json
│ │ │ │ ├── system-object-definitions-old.json
│ │ │ │ └── system-object-definitions.json
│ │ │ ├── package-lock.json
│ │ │ ├── package.json
│ │ │ ├── README.md
│ │ │ ├── scripts
│ │ │ │ └── setup-logs.js
│ │ │ ├── server.js
│ │ │ └── src
│ │ │ ├── app.js
│ │ │ ├── config
│ │ │ │ └── server-config.js
│ │ │ ├── middleware
│ │ │ │ ├── auth.js
│ │ │ │ ├── cors.js
│ │ │ │ └── logging.js
│ │ │ ├── routes
│ │ │ │ ├── ocapi
│ │ │ │ │ ├── code-versions-handler.js
│ │ │ │ │ ├── oauth-handler.js
│ │ │ │ │ ├── ocapi-error-utils.js
│ │ │ │ │ ├── ocapi-utils.js
│ │ │ │ │ ├── site-preferences-handler.js
│ │ │ │ │ └── system-objects-handler.js
│ │ │ │ ├── ocapi.js
│ │ │ │ └── webdav.js
│ │ │ └── utils
│ │ │ ├── mock-data-loader.js
│ │ │ └── webdav-xml.js
│ │ └── sfcc-mock-server-manager.ts
│ ├── sfcc-mock-server.test.ts
│ ├── site-preferences-client.test.ts
│ ├── system-objects-client.test.ts
│ ├── utils.test.ts
│ ├── validation-helpers.test.ts
│ └── validator.test.ts
├── tsconfig.json
└── tsconfig.test.json
```
# Files
--------------------------------------------------------------------------------
/docs-site/pages/HomePage.tsx:
--------------------------------------------------------------------------------
```typescript
import React, { useState, useRef, useCallback } from 'react';
import { NavLink } from 'react-router-dom';
import SEO from '../components/SEO';
import BreadcrumbSchema from '../components/BreadcrumbSchema';
import StructuredData from '../components/StructuredData';
import { H1, H2, H3, PageSubtitle } from '../components/Typography';
import CodeBlock, { InlineCode } from '../components/CodeBlock';
import LightCodeContainer from '../components/LightCodeContainer';
import NewcomerCTA from '../components/NewcomerCTA';
const HomePage: React.FC = () => {
const [isWithoutMcpModalOpen, setIsWithoutMcpModalOpen] = useState(false);
const [isWithMcpModalOpen, setIsWithMcpModalOpen] = useState(false);
const [zoomPosition1, setZoomPosition1] = useState({ x: 0, y: 0 });
const [isZooming1, setIsZooming1] = useState(false);
const [zoomPosition2, setZoomPosition2] = useState({ x: 0, y: 0 });
const [isZooming2, setIsZooming2] = useState(false);
const imageRef1 = useRef<HTMLImageElement>(null);
const imageRef2 = useRef<HTMLImageElement>(null);
const handleMouseMove1 = useCallback((e: React.MouseEvent<HTMLImageElement>) => {
if (!imageRef1.current) return;
const rect = imageRef1.current.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
setZoomPosition1({ x, y });
}, []);
const handleMouseEnter1 = useCallback(() => {
setIsZooming1(true);
}, []);
const handleMouseLeave1 = useCallback(() => {
setIsZooming1(false);
}, []);
const handleMouseMove2 = useCallback((e: React.MouseEvent<HTMLImageElement>) => {
if (!imageRef2.current) return;
const rect = imageRef2.current.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
setZoomPosition2({ x, y });
}, []);
const handleMouseEnter2 = useCallback(() => {
setIsZooming2(true);
}, []);
const handleMouseLeave2 = useCallback(() => {
setIsZooming2(false);
}, []);
const homePageStructuredData = {
"@context": "https://schema.org",
"@type": "WebPage",
"name": "SFCC Development MCP Server - AI-Powered Commerce Cloud Development Tools",
"description": "Model Context Protocol server for Salesforce B2C Commerce Cloud development with comprehensive documentation access, log analysis, and development best practices.",
"url": "https://sfcc-mcp-dev.rhino-inquisitor.com/",
"mainEntity": {
"@type": "SoftwareApplication",
"name": "SFCC Development MCP Server",
"applicationCategory": "DeveloperApplication",
"description": "A comprehensive MCP server providing AI assistants with direct access to SFCC development tools, documentation, and debugging capabilities.",
"operatingSystem": "Node.js",
"downloadUrl": "https://www.npmjs.com/package/sfcc-dev-mcp",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://sfcc-mcp-dev.rhino-inquisitor.com/"
}]
}
};
return (
<div className="max-w-6xl mx-auto px-6 py-8">
<SEO
title="SFCC Development MCP Server - AI-Powered Commerce Cloud Development Tools"
description="Model Context Protocol server for Salesforce B2C Commerce Cloud development. Access comprehensive documentation, analyze logs, explore system objects, and get best practices with AI assistance."
keywords="SFCC, Salesforce Commerce Cloud, Model Context Protocol, MCP server, AI development tools, SFCC documentation, Commerce Cloud development, SFCC debugging, AI-assisted development, SFCC best practices"
canonical="/"
ogType="website"
/>
<BreadcrumbSchema items={[
{ name: "Home", url: "/" }
]} />
<StructuredData structuredData={homePageStructuredData} />
{/* Hero Section */}
<div className="text-center mb-16">
<div className="inline-flex items-center gap-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white px-4 py-2 rounded-full text-sm font-medium mb-6">
<span className="bg-white/20 rounded-full p-1">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" />
</svg>
</span>
AI-Powered Development Tools for SFCC
</div>
<H1 id="sfcc-development-mcp-server" className="text-5xl md:text-6xl font-extrabold bg-gradient-to-r from-gray-900 via-blue-900 to-purple-900 bg-clip-text text-transparent mb-6">
SFCC Development MCP Server
</H1>
<PageSubtitle className="text-xl md:text-2xl text-gray-600 max-w-4xl mx-auto leading-relaxed">
Supercharge your Salesforce B2C Commerce Cloud development with AI-powered documentation access,
real-time log analysis, and intelligent best practices guidance
</PageSubtitle>
</div>
{/* Quick Start Section */}
<div className="mb-16 bg-gradient-to-r from-blue-50 via-indigo-50 to-purple-50 rounded-2xl p-8 shadow-xl border border-blue-100">
<div className="text-center mb-8">
<div className="inline-flex items-center gap-2 bg-green-100 text-green-800 px-4 py-2 rounded-full text-sm font-medium mb-4">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
No Credentials Required
</div>
<H2 id="quick-start" className="text-3xl font-bold mb-4">🚀 Zero-Config Quick Start</H2>
<p className="text-lg text-gray-700 max-w-3xl mx-auto">
Jump straight into SFCC development with AI assistance. Get access to comprehensive documentation,
best practices, and cartridge generation tools instantly.
</p>
</div>
{/* Newcomer CTA */}
<NewcomerCTA className="mb-8" />
<div className="grid md:grid-cols-2 gap-8 items-center">
<div>
<h3 className="text-lg font-semibold text-gray-900 mb-4">Add to your AI client:</h3>
<LightCodeContainer>
<CodeBlock language="json" code={`{
"mcpServers": {
"sfcc-dev": {
"command": "npx",
"args": ["sfcc-dev-mcp"]
}
}
}`} />
</LightCodeContainer>
</div>
<div className="space-y-4">
<div className="flex items-start gap-3 md:mt-24">
<div className="bg-blue-100 rounded-full p-2 mt-1">
<svg className="w-5 h-5 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mt-0">Instant Access</h4>
<p className="text-gray-600 text-sm">Start using SFCC documentation and tools immediately</p>
</div>
</div>
<div className="flex items-start gap-3">
<div className="bg-green-100 rounded-full p-2 mt-1">
<svg className="w-5 h-5 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mt-0">No Setup Required</h4>
<p className="text-gray-600 text-sm">Works out of the box with documentation-only mode</p>
</div>
</div>
<div className="flex items-start gap-3">
<div className="bg-purple-100 rounded-full p-2 mt-1">
<svg className="w-5 h-5 text-purple-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clipRule="evenodd" />
</svg>
</div>
<div>
<h4 className="font-semibold text-gray-900 mt-0">Full Documentation</h4>
<p className="text-gray-600 text-sm">Complete SFCC API docs, SFRA guides, and best practices</p>
</div>
</div>
</div>
</div>
<div className="mt-6 p-4 bg-blue-50 border border-blue-200 rounded-lg">
<p className="text-sm text-blue-800 text-center">
💡 <strong>Want more features?</strong> Add SFCC credentials via <InlineCode>--dw-json</InlineCode> for
real-time log analysis, system & custom object exploration, and advanced debugging tools.
</p>
</div>
</div>
{/* CTA Buttons */}
<div className="flex flex-col sm:flex-row gap-4 justify-center mt-8 mb-8">
<NavLink
to="/ai-interfaces/"
className="group bg-gradient-to-r from-blue-600 to-purple-600 text-white px-8 py-4 rounded-xl font-semibold text-lg shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1 no-underline hover:no-underline focus:no-underline"
>
Get Started in 2 Minutes
<span className="ml-2 group-hover:translate-x-1 inline-block transition-transform">→</span>
</NavLink>
<NavLink
to="/examples/"
className="border-2 border-gray-300 text-gray-700 px-8 py-4 rounded-xl font-semibold text-lg hover:border-blue-500 hover:text-blue-600 transition-all duration-300 no-underline hover:no-underline focus:no-underline"
>
See Examples
</NavLink>
</div>
{/* AI Instructions Warning */}
<div className="mb-16 bg-gradient-to-r from-red-100 to-orange-100 border-l-4 border-red-500 rounded-xl p-6 shadow-lg">
<div className="flex items-start gap-4">
<div className="bg-red-100 rounded-full p-3 flex-shrink-0">
<svg className="w-6 h-6 text-red-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
</svg>
</div>
<div className="flex-1">
<H3 id="important-ai-instructions" className="text-red-800 text-xl font-bold mb-3">
⚠️ Essential: AI Instructions Required
</H3>
<p className="text-red-800 mb-4">
Your AI needs specific instructions to use the MCP server effectively. We've created ready-to-use
instruction files for GitHub Copilot, Claude, and Cursor.
</p>
<div className="flex items-center gap-4">
<a
href="https://github.com/taurgis/sfcc-dev-mcp/tree/main/ai-instructions"
className="inline-flex items-center gap-2 bg-red-600 text-white px-4 py-2 rounded-lg font-medium hover:bg-red-700 transition-colors no-underline hover:no-underline focus:no-underline"
target="_blank"
rel="noopener noreferrer"
>
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M3 4a1 1 0 011-1h4a1 1 0 010 2H6.414l2.293 2.293a1 1 0 01-1.414 1.414L5 6.414V8a1 1 0 01-2 0V4zm9 1a1 1 0 010-2h4a1 1 0 011 1v4a1 1 0 01-2 0V6.414l-2.293 2.293a1 1 0 11-1.414-1.414L13.586 5H12zm-9 7a1 1 0 012 0v1.586l2.293-2.293a1 1 0 111.414 1.414L6.414 15H8a1 1 0 010 2H4a1 1 0 01-1-1v-4zm13-1a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 010-2h1.586l-2.293-2.293a1 1 0 111.414-1.414L15 13.586V12a1 1 0 011-1z" clipRule="evenodd" />
</svg>
Download AI Instructions
</a>
<NavLink
to="/ai-interfaces/"
className="inline-flex no-underline items-center gap-1 text-red-600 hover:text-red-800 font-medium transition-colors"
>
📖 Setup Guide
<svg className="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clipRule="evenodd" />
</svg>
</NavLink>
</div>
</div>
</div>
</div>
{/* Value Proposition Section */}
<div className="mb-16">
<div className="text-center mb-12">
<H2 id="why-use-this" className="text-4xl font-bold mb-6">
<span className="bg-gradient-to-r from-gray-900 via-blue-900 to-purple-900 bg-clip-text text-transparent">
Stop Fighting Documentation
</span>
</H2>
<p className="text-xl text-gray-600 max-w-4xl mx-auto leading-relaxed">
Transform your SFCC development workflow from manual documentation hunting to AI-powered assistance
</p>
</div>
{/* Before/After Comparison */}
<div className="mb-12 bg-gradient-to-r from-blue-50/50 via-purple-50/50 to-pink-50/50 rounded-3xl p-8 shadow-2xl border border-gray-200">
{/* Timeline Header */}
<div className="text-center mb-8">
<div className="inline-flex items-center gap-4 bg-gradient-to-r from-gray-800 to-gray-900 text-white px-6 py-3 rounded-full text-sm font-medium">
<span className="bg-white/20 rounded-full p-1">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clipRule="evenodd" />
</svg>
</span>
Development Timeline Comparison
</div>
</div>
<div className="grid lg:grid-cols-2 gap-8 relative">
{/* Connecting Line */}
<div className="hidden lg:block absolute left-1/2 top-16 bottom-16 w-px bg-gradient-to-b from-red-300 via-yellow-300 to-green-300 transform -translate-x-1/2"></div>
{/* Before Timeline */}
<div className="relative">
<div className="flex items-center gap-3 mb-6">
<div className="bg-gradient-to-r from-red-500 to-orange-500 rounded-xl p-3 shadow-lg">
<svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
</svg>
</div>
<div>
<h3 className="text-2xl font-bold text-gray-900">Traditional</h3>
<p className="text-red-600 font-medium">Frustrating & Time-Consuming</p>
</div>
</div>
{/* Timeline Steps */}
<div className="space-y-4">
<div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-red-600 font-bold text-sm">1</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Documentation Hunt</h4>
<p className="text-sm text-gray-600">Open 10+ browser tabs searching for method signatures</p>
<div className="text-xs text-red-600 font-medium mt-1">⏱️ 15-30 minutes</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-red-600 font-bold text-sm">2</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Copy-Paste Engineering</h4>
<p className="text-sm text-gray-600">Hunt for code examples across forums and docs</p>
<div className="text-xs text-red-600 font-medium mt-1">⏱️ 20-45 minutes</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-red-600 font-bold text-sm">3</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Debug Blindly</h4>
<p className="text-sm text-gray-600">Manual log analysis without proper context</p>
<div className="text-xs text-red-600 font-medium mt-1">⏱️ 1-3 hours</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-red-600 font-bold text-sm">4</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Feature Scaffolding</h4>
<p className="text-sm text-gray-600">Manually create cartridge structures and boilerplate code for new cartridges, new SCAPI endpoints, ...</p>
<div className="text-xs text-red-600 font-medium mt-1">⏱️ 30-60 minutes</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-red-600 font-bold text-sm">5</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Context Switching</h4>
<p className="text-sm text-gray-600">Jump between IDE, browser, logs, and documentation</p>
<div className="text-xs text-red-600 font-medium mt-1">⏱️ Constant overhead</div>
</div>
</div>
</div>
<div className="mt-6 p-4 bg-red-100 border border-red-300 rounded-xl">
<div className="flex items-center gap-2 text-red-800">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
</svg>
<span className="font-bold">Total Time Lost: 2-4 hours daily</span>
</div>
</div>
</div>
{/* After Timeline */}
<div className="relative">
<div className="flex items-center gap-3 mb-6">
<div className="bg-gradient-to-r from-green-500 to-emerald-500 rounded-xl p-3 shadow-lg">
<svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" />
</svg>
</div>
<div>
<h3 className="text-2xl font-bold text-gray-900">AI-Enhanced</h3>
<p className="text-green-600 font-medium">Efficient & Intelligent</p>
</div>
</div>
{/* Timeline Steps */}
<div className="space-y-4">
<div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-green-600 font-bold text-sm">1</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Ask AI Directly</h4>
<p className="text-sm text-gray-600">"Show me Product pricing methods" → instant comprehensive answer</p>
<div className="text-xs text-green-600 font-medium mt-1">⏱️ 30 seconds</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-green-600 font-bold text-sm">2</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Get Complete Examples</h4>
<p className="text-sm text-gray-600">AI generates proper SFCC patterns with best practices</p>
<div className="text-xs text-green-600 font-medium mt-1">⏱️ 1-2 minutes</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-green-600 font-bold text-sm">3</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Smart Debugging</h4>
<p className="text-sm text-gray-600">"Find errors from last 24h" → AI analyzes and filters logs</p>
<div className="text-xs text-green-600 font-medium mt-1">⏱️ 2-5 minutes</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-green-600 font-bold text-sm">4</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Instant Scaffolding</h4>
<p className="text-sm text-gray-600">"Create custom SCAPI endpoint for wishlist" → complete cartridge with routes</p>
<div className="text-xs text-green-600 font-medium mt-1">⏱️ 1-2 minutes</div>
</div>
</div>
<div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md">
<div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0">
<span className="text-green-600 font-bold text-sm">5</span>
</div>
<div>
<h4 className="font-semibold text-gray-900 mb-1">Stay in Flow</h4>
<p className="text-sm text-gray-600">All SFCC knowledge accessible within your editor</p>
<div className="text-xs text-green-600 font-medium mt-1">⏱️ Zero context switching</div>
</div>
</div>
</div>
<div className="mt-6 p-4 bg-green-100 border border-green-300 rounded-xl">
<div className="flex items-center gap-2 text-green-800">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="font-bold">Total Time Saved: 2-3 hours daily</span>
</div>
</div>
</div>
</div>
{/* Bottom CTA */}
<div className="mt-10 text-center">
<div className="inline-flex items-center gap-4 bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 text-white px-8 py-4 rounded-2xl shadow-lg">
<svg className="w-6 h-6" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M11.3 1.046A1 1 0 0112 2v5h4a1 1 0 01.82 1.573l-7 10A1 1 0 018 18v-5H4a1 1 0 01-.82-1.573l7-10a1 1 0 011.12-.38z" clipRule="evenodd" />
</svg>
<div className="text-left">
<div className="font-bold text-lg">Ready to 10x your SFCC productivity?</div>
<div className="text-blue-100 text-sm">Set up in under 2 minutes • No SFCC credentials required to start</div>
</div>
</div>
</div>
</div>
</div>
{/* What You Get */}
<div className="mb-16">
<div className="text-center mb-10">
<H2 id="what-you-get" className="text-3xl font-bold mb-4">🎯 What You Get</H2>
<p className="text-lg text-gray-600 max-w-3xl mx-auto">
Two modes to match your needs: start instantly with documentation-only mode,
then upgrade to full mode for live data analysis
</p>
</div>
<div className="grid lg:grid-cols-2 gap-8">
{/* Documentation Mode */}
<div className="bg-gradient-to-br from-green-50 to-emerald-50 rounded-2xl p-8 border border-green-200">
<div className="flex items-center gap-3 mb-6">
<div className="bg-green-500 rounded-full p-3">
<svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<div>
<H3 id="documentation-mode" className="text-2xl font-bold text-green-800">Documentation Mode</H3>
<p className="text-green-600 font-medium" style={{
marginTop: '-12px'
}}>Zero setup required</p>
</div>
</div>
<ul className="space-y-3">
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">Complete SFCC API documentation</span>
</li>
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">SFRA guides and best practices</span>
</li>
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">Cartridge generation tools</span>
</li>
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">Security and performance guidance</span>
</li>
</ul>
</div>
{/* Full Mode */}
<div className="bg-gradient-to-br from-blue-50 to-purple-50 rounded-2xl p-8 border border-blue-200">
<div className="flex items-center gap-3 mb-6">
<div className="bg-gradient-to-r from-blue-500 to-purple-500 rounded-full p-3">
<svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" />
</svg>
</div>
<div>
<H3 id="full-mode" className="text-2xl font-bold text-blue-800 mb-">Full Mode</H3>
<p className="text-blue-600 font-medium" style={{
marginTop: '-12px'
}}>Everything + live data</p>
</div>
</div>
<ul className="space-y-3">
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">All documentation features</span>
</li>
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">Real-time log analysis</span>
</li>
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">System & custom object exploration</span>
</li>
<li className="flex items-center gap-3">
<svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
<span className="text-gray-700">Code version management</span>
</li>
</ul>
<div className="mt-6 p-4 bg-blue-100 rounded-lg">
<p className="text-blue-800 text-sm font-medium">🔐 Requires SFCC credentials</p>
</div>
</div>
</div>
</div>
{/* Key Features Overview */}
<div className="mb-16">
<div className="text-center mb-8">
<H2 id="key-features" className="text-3xl font-bold mb-4">✨ Everything You Need</H2>
<p className="text-lg text-gray-600 max-w-3xl mx-auto">
36+ specialized tools for comprehensive SFCC development support
</p>
</div>
<div className="grid grid-cols-2 md:grid-cols-5 gap-6">
<div className="text-center">
<div className="bg-blue-100 rounded-full p-4 w-16 h-16 mx-auto mb-3">
<svg className="w-8 h-8 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 4.804A7.968 7.968 0 005.5 4c-1.255 0-2.443.29-3.5.804v10A7.969 7.969 0 005.5 14c1.669 0 3.218.51 4.5 1.385A7.962 7.962 0 0114.5 14c1.255 0 2.443.29 3.5.804v-10A7.968 7.968 0 0014.5 4c-1.255 0-2.443.29-3.5.804V12a1 1 0 11-2 0V4.804z" />
</svg>
</div>
<h3 className="font-semibold text-gray-900">Documentation</h3>
<p className="text-sm text-gray-600">Complete API docs</p>
</div>
<div className="text-center">
<div className="bg-green-100 rounded-full p-4 w-16 h-16 mx-auto mb-3">
<svg className="w-8 h-8 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M3 3a1 1 0 000 2v8a2 2 0 002 2h2.586l-1.293 1.293a1 1 0 101.414 1.414L10 15.414l2.293 2.293a1 1 0 001.414-1.414L12.414 15H15a2 2 0 002-2V5a1 1 0 100-2H3zm11.707 4.707a1 1 0 00-1.414-1.414L10 9.586 8.707 8.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<h3 className="font-semibold text-gray-900">Log Analysis</h3>
<p className="text-sm text-gray-600">Real-time monitoring</p>
</div>
<div className="text-center">
<div className="bg-purple-100 rounded-full p-4 w-16 h-16 mx-auto mb-3">
<svg className="w-8 h-8 text-purple-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M4 4a2 2 0 00-2 2v8a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2H4zm2 6a2 2 0 104 0 2 2 0 00-4 0zm6 0a2 2 0 104 0 2 2 0 00-4 0z" clipRule="evenodd" />
</svg>
</div>
<h3 className="font-semibold text-gray-900">System Objects</h3>
<p className="text-sm text-gray-600">Live exploration</p>
</div>
<div className="text-center">
<div className="bg-orange-100 rounded-full p-4 w-16 h-16 mx-auto mb-3">
<svg className="w-8 h-8 text-orange-600" fill="currentColor" viewBox="0 0 20 20">
<path d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm0 4a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1V8zm8 0a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1h-6a1 1 0 01-1-1V8z" />
</svg>
</div>
<h3 className="font-semibold text-gray-900">Cartridges</h3>
<p className="text-sm text-gray-600">Auto generation</p>
</div>
<div className="text-center">
<div className="bg-yellow-100 rounded-full p-4 w-16 h-16 mx-auto mb-3">
<svg className="w-8 h-8 text-yellow-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3-9a1 1 0 00-1-1H8a1 1 0 100 2h1v3a1 1 0 102 0v-3h1a1 1 0 001-1z" clipRule="evenodd" />
</svg>
</div>
<h3 className="font-semibold text-gray-900">Job Logs</h3>
<p className="text-sm text-gray-600">Execution insights</p>
</div>
</div>
</div>
{/* Quick Test Drive Section */}
<div className="mb-16 bg-gradient-to-r from-emerald-50 via-teal-50 to-cyan-50 rounded-2xl p-8 shadow-xl border border-emerald-200">
<div className="text-center mb-8">
<div className="inline-flex items-center gap-2 bg-emerald-100 text-emerald-800 px-4 py-2 rounded-full text-sm font-medium mb-4">
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
Test Drive
</div>
<H2 id="quick-test-drive" className="text-3xl font-bold mb-4">🧪 Try It Right Now</H2>
<p className="text-lg text-gray-600 max-w-3xl mx-auto">
After setup, ask your AI assistant this question to see the MCP server in action. No SFCC credentials needed.
</p>
</div>
<div className="space-y-8">
<div>
<h3 className="text-lg font-semibold text-gray-900 mb-4 text-center">Ask Your AI This</h3>
<div className="bg-gradient-to-r from-blue-50 to-indigo-50 border border-blue-200 rounded-xl p-6">
<div className="flex items-start gap-4">
<div className="flex-1">
<p className="font-medium text-blue-900 mb-3">Copy this prompt:</p>
<div className="bg-white rounded-lg p-4 border border-blue-200">
<p className="text-base font-mono text-gray-800 leading-relaxed">
"Explain how to get the sale price for a product variant in SFCC. Keep it short and a quick example"
</p>
</div>
<div className="mt-3 flex justify-center gap-2 flex-wrap">
<button
onClick={() => navigator.clipboard.writeText('Explain how to get the sale price for a product variant in SFCC. Keep it short and a quick example')}
className="inline-flex items-center gap-2 bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg transition font-medium text-sm"
>
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" />
<path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" />
</svg>
Copy Prompt
</button>
<button
onClick={() => setIsWithoutMcpModalOpen(true)}
className="inline-flex items-center gap-2 bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded-lg transition font-medium text-sm"
>
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
</svg>
View Without MCP
</button>
<button
onClick={() => setIsWithMcpModalOpen(true)}
className="inline-flex items-center gap-2 bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-lg transition font-medium text-sm"
>
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
View With MCP
</button>
</div>
</div>
</div>
</div>
</div>
<div>
<h3 className="text-lg font-semibold text-gray-900 mb-4 text-center">What You Should See</h3>
<div className="grid md:grid-cols-3 gap-4">
<div className="bg-green-50 border border-green-200 rounded-lg p-4 flex flex-col h-full">
<div className="grid grid-cols-[auto_1fr] gap-2 items-center mb-3">
<div className="bg-green-100 rounded-full p-1">
<svg className="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<p className="font-medium text-green-800">SFCC Methods</p>
</div>
<p className="text-sm text-green-700 flex-grow">Lists actual methods like getPriceModel(), getVariationModel()</p>
</div>
<div className="bg-green-50 border border-green-200 rounded-lg p-4 flex flex-col h-full">
<div className="grid grid-cols-[auto_1fr] gap-2 items-center mb-3">
<div className="bg-green-100 rounded-full p-1">
<svg className="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<p className="font-medium text-green-800">Code Examples</p>
</div>
<p className="text-sm text-green-700 flex-grow">Shows real SFCC code patterns with proper syntax</p>
</div>
<div className="bg-green-50 border border-green-200 rounded-lg p-4 flex flex-col h-full">
<div className="grid grid-cols-[auto_1fr] gap-2 items-center mb-3">
<div className="bg-green-100 rounded-full p-1">
<svg className="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
</div>
<p className="font-medium text-green-800">Documentation</p>
</div>
<p className="text-sm text-green-700 flex-grow">References accurate SFCC API information</p>
</div>
</div>
</div>
</div> <div className="mt-8 p-4 bg-yellow-50 border border-yellow-200 rounded-lg">
<div className="flex items-start gap-3">
<div className="bg-yellow-100 rounded-full p-1 mt-0.5">
<svg className="w-4 h-4 text-yellow-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
</svg>
</div>
<div className="flex-1">
<p className="font-medium text-yellow-800 mb-1">Without MCP Server</p>
<p className="text-sm text-yellow-700">
Your AI would give generic responses or outdated information. With MCP, it accesses live SFCC documentation and provides accurate, specific answers.
</p>
</div>
</div>
</div>
<div className="mt-8 text-center">
<p className="text-gray-600 mb-4">✅ Getting SFCC-specific answers? Your setup is working perfectly!</p>
<div className="flex flex-col sm:flex-row gap-3 justify-center">
<NavLink to="/examples/" className="inline-flex items-center justify-center px-6 py-3 rounded-full text-sm font-semibold bg-emerald-600 text-white shadow hover:bg-emerald-700 transition group no-underline hover:no-underline focus:no-underline">
Try More Examples
<span className="ml-2 transition group-hover:translate-x-0.5">→</span>
</NavLink>
<NavLink to="/configuration/" className="inline-flex items-center justify-center px-6 py-3 rounded-full text-sm font-semibold bg-white text-gray-800 border border-gray-300 hover:border-gray-400 hover:bg-gray-50 transition no-underline hover:no-underline focus:no-underline">
Add Full Mode
</NavLink>
</div>
</div>
</div>
{/* Final CTA */}
<div className="text-center">
<div className="bg-gradient-to-r from-gray-50 to-blue-50 rounded-2xl p-8 border border-gray-200 mb-8">
<p className="text-lg text-gray-700 italic leading-relaxed max-w-4xl mx-auto mb-6">
"Empower your AI assistant with comprehensive SFCC knowledge for faster, more accurate development assistance."
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<NavLink
to="/ai-interfaces/"
className="group bg-gradient-to-r from-blue-600 to-purple-600 text-white px-8 py-4 rounded-xl font-semibold text-lg shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1 no-underline hover:no-underline focus:no-underline"
>
Get Started Now
<span className="ml-2 group-hover:translate-x-1 inline-block transition-transform">→</span>
</NavLink>
<NavLink
to="/features/"
className="border-2 border-gray-300 text-gray-700 px-8 py-4 rounded-xl font-semibold text-lg hover:border-blue-500 hover:text-blue-600 transition-all duration-300 no-underline hover:no-underline focus:no-underline"
>
Explore Features
</NavLink>
</div>
</div>
</div>
{/* Modal for WITHOUT MCP screenshot */}
{isWithoutMcpModalOpen && (
<div
className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50"
onClick={() => setIsWithoutMcpModalOpen(false)}
>
<div
className="bg-white rounded-2xl shadow-2xl max-w-5xl max-h-[90vh] overflow-auto"
onClick={(e) => e.stopPropagation()}
>
<div className="sticky top-0 bg-white border-b border-gray-200 px-6 py-4 rounded-t-2xl">
<div className="flex items-center justify-between">
<h3 className="text-xl font-semibold text-gray-900 flex items-center gap-2">
<svg className="w-5 h-5 text-red-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" />
</svg>
AI Response Without MCP Server
</h3>
<button
onClick={() => setIsWithoutMcpModalOpen(false)}
className="text-gray-400 hover:text-gray-600 transition-colors"
aria-label="Close modal"
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
<div className="p-6">
<div className="mb-6 relative">
<div className="relative overflow-hidden rounded-lg shadow-lg border border-gray-200">
<img
ref={imageRef1}
src="/explain-product-pricing-methods-no-mcp.png"
alt="AI response without MCP server - generic and potentially inaccurate information"
className="w-full h-auto cursor-crosshair"
onMouseMove={handleMouseMove1}
onMouseEnter={handleMouseEnter1}
onMouseLeave={handleMouseLeave1}
/>
{/* Zoom circle */}
{isZooming1 && (
<div
className="absolute pointer-events-none border-4 border-white shadow-lg rounded-full overflow-hidden"
style={{
width: '300px',
height: '300px',
left: `${zoomPosition1.x - 150}px`,
top: `${zoomPosition1.y - 150}px`,
backgroundImage: `url('/explain-product-pricing-methods-no-mcp.png')`,
backgroundSize: `${imageRef1.current ? imageRef1.current.offsetWidth * 2 : 0}px ${imageRef1.current ? imageRef1.current.offsetHeight * 2 : 0}px`,
backgroundPosition: `-${zoomPosition1.x * 2 - 150}px -${zoomPosition1.y * 2 - 150}px`,
backgroundRepeat: 'no-repeat',
transform: 'translate(0, 0)',
zIndex: 1000
}}
>
<div className="absolute inset-0 ring-2 ring-red-500 ring-opacity-50 rounded-full"></div>
</div>
)}
</div>
</div>
<div className="bg-red-50 border border-red-200 rounded-xl p-6">
<h4 className="text-lg font-semibold text-red-900 mb-4 flex items-center gap-2">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" />
</svg>
Problems with This Response
</h4>
<div className="space-y-4">
<div className="p-4 bg-white border border-red-300 rounded-lg">
<p className="font-semibold text-red-800 mb-2">🎯 Wrong API Usage:</p>
<p className="text-sm text-red-700">
Suggests non-existent methods like <code className="bg-red-200 px-1 rounded font-mono">product.getVariant('variant-id')</code>
and shows client-side fetch to non-standard endpoints. These approaches don't exist in SFCC
and would cause runtime errors in production.
</p>
</div>
<div className="p-4 bg-white border border-red-300 rounded-lg">
<p className="font-semibold text-red-800 mb-2">📚 Outdated Patterns:</p>
<p className="text-sm text-red-700">
Shows generic client-side fetch patterns to non-standard endpoints like
<code className="bg-red-200 px-1 rounded font-mono">/on/demandware.store/Sites-SiteGenesis-Site/</code>
instead of current SFRA controller patterns. This leads developers down the wrong implementation path.
</p>
</div>
<div className="p-4 bg-white border border-red-300 rounded-lg">
<p className="font-semibold text-red-800 mb-2">🤔 Generic Assumptions:</p>
<p className="text-sm text-red-700">
Makes assumptions about SFCC architecture without understanding the actual API structure.
Provides general e-commerce patterns that don't align with SFCC's specific implementation.
</p>
</div>
<div className="grid md:grid-cols-2 gap-4">
<div>
<h5 className="font-semibold text-red-800 mb-2">Other Issues:</h5>
<ul className="text-sm text-red-700 space-y-1">
<li>Non-existent API methods suggested</li>
<li>Generic client-side fetch patterns</li>
<li>Broken endpoint examples</li>
<li>Generic assumptions about SFCC</li>
</ul>
</div>
<div>
<h5 className="font-semibold text-red-800 mb-2">Developer Impact:</h5>
<ul className="text-sm text-red-700 space-y-1">
<li>Runtime errors from wrong API calls</li>
<li>Time wasted on deprecated patterns</li>
<li>Following incorrect implementation paths</li>
<li>Loss of confidence in AI guidance</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)}
{/* Modal for WITH MCP screenshot */}
{isWithMcpModalOpen && (
<div
className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50"
onClick={() => setIsWithMcpModalOpen(false)}
>
<div
className="bg-white rounded-2xl shadow-2xl max-w-5xl max-h-[90vh] overflow-auto"
onClick={(e) => e.stopPropagation()}
>
<div className="sticky top-0 bg-white border-b border-gray-200 px-6 py-4 rounded-t-2xl">
<div className="flex items-center justify-between">
<h3 className="text-xl font-semibold text-gray-900 flex items-center gap-2">
<svg className="w-5 h-5 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
AI Response With MCP Server
</h3>
<button
onClick={() => setIsWithMcpModalOpen(false)}
className="text-gray-400 hover:text-gray-600 transition-colors"
aria-label="Close modal"
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
<div className="p-6">
<div className="mb-6 relative">
<div className="relative overflow-hidden rounded-lg shadow-lg border border-gray-200">
<img
ref={imageRef2}
src="/explain-product-pricing-methods.png"
alt="AI response with MCP server - accurate SFCC-specific information and code examples"
className="w-full h-auto cursor-crosshair"
onMouseMove={handleMouseMove2}
onMouseEnter={handleMouseEnter2}
onMouseLeave={handleMouseLeave2}
/>
{/* Zoom circle */}
{isZooming2 && (
<div
className="absolute pointer-events-none border-4 border-white shadow-lg rounded-full overflow-hidden"
style={{
width: '300px',
height: '300px',
left: `${zoomPosition2.x - 150}px`,
top: `${zoomPosition2.y - 150}px`,
backgroundImage: `url('/explain-product-pricing-methods.png')`,
backgroundSize: `${imageRef2.current ? imageRef2.current.offsetWidth * 2 : 0}px ${imageRef2.current ? imageRef2.current.offsetHeight * 2 : 0}px`,
backgroundPosition: `-${zoomPosition2.x * 2 - 150}px -${zoomPosition2.y * 2 - 150}px`,
backgroundRepeat: 'no-repeat',
transform: 'translate(0, 0)',
zIndex: 1000
}}
>
<div className="absolute inset-0 ring-2 ring-green-500 ring-opacity-50 rounded-full"></div>
</div>
)}
</div>
</div>
<div className="bg-green-50 border border-green-200 rounded-xl p-6">
<h4 className="text-lg font-semibold text-green-900 mb-4 flex items-center gap-2">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</svg>
Why This Response is Accurate
</h4>
<div className="space-y-4">
<div className="p-4 bg-white border border-green-300 rounded-lg">
<p className="font-semibold text-green-800 mb-2">✅ Accurate SFCC Implementation:</p>
<p className="text-sm text-green-700">
The AI correctly uses <code className="bg-green-200 px-1 rounded font-mono">ProductMgr.getProduct()</code>
and <code className="bg-green-200 px-1 rounded font-mono">getPriceModel().getPrice()</code> with
proper syntax. It also mentions the correct <code className="bg-green-200 px-1 rounded font-mono">Money</code>
object return type and <code className="bg-green-200 px-1 rounded font-mono">toFormattedString()</code> method.
</p>
</div>
<div className="p-4 bg-white border border-green-300 rounded-lg">
<p className="font-semibold text-green-800 mb-2">🔍 Comprehensive Context:</p>
<p className="text-sm text-green-700">
Explains important details like <code className="bg-green-200 px-1 rounded font-mono">Money.NOT_AVAILABLE</code>
handling, quantity-based pricing options, and <code className="bg-green-200 px-1 rounded font-mono">getPriceInfo()</code>
for additional price book details. Shows understanding of SFCC pricing architecture.
</p>
</div>
<div className="p-4 bg-white border border-green-300 rounded-lg">
<p className="font-semibold text-green-800 mb-2">🎯 Real-World Ready:</p>
<p className="text-sm text-green-700">
Code examples are production-ready and follow current SFRA patterns. The AI shows
MCP server integration by using actual SFCC documentation tools during the response.
</p>
</div>
<div className="grid md:grid-cols-2 gap-4">
<div>
<h5 className="font-semibold text-green-800 mb-2">Key Benefits:</h5>
<ul className="text-sm text-green-700 space-y-1">
<li>Syntactically correct SFCC code</li>
<li>Proper ProductPriceModel usage</li>
<li>Current SFRA best practices</li>
<li>Real-time documentation access</li>
</ul>
</div>
<div>
<h5 className="font-semibold text-green-800 mb-2">Developer Impact:</h5>
<ul className="text-sm text-green-700 space-y-1">
<li>Copy-paste ready code examples</li>
<li>Production-ready implementations</li>
<li>Comprehensive error handling info</li>
<li>Advanced API usage patterns</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)}
</div>
);
};
export default HomePage;
```
--------------------------------------------------------------------------------
/tests/mcp/yaml/get-sfcc-class-documentation.full-mode.test.mcp.yml:
--------------------------------------------------------------------------------
```yaml
# ==================================================================================
# SFCC MCP Server - get_sfcc_class_documentation Tool YAML Tests
# Comprehensive testing for SFCC class documentation retrieval functionality
# Tests both successful responses and error handling scenarios
#
# Quick Test Commands:
# aegis "tests/mcp/yaml/get-sfcc-class-documentation.full-mode.test.mcp.yml" --config "aegis.config.with-dw.json" --verbose
# aegis "tests/mcp/yaml/get-sfcc-class-documentation.full-mode.test.mcp.yml" --config "aegis.config.with-dw.json" --debug --timing
# aegis query get_sfcc_class_documentation '{"className": "dw.catalog.Product"}' --config "aegis.config.with-dw.json"
# aegis query get_sfcc_class_documentation '{"className": "dw.order.Order"}' --config "aegis.config.with-dw.json"
# ==================================================================================
description: "SFCC MCP Server get_sfcc_class_documentation tool - comprehensive validation"
# ==================================================================================
# BASIC TOOL STRUCTURE VALIDATION
# ==================================================================================
tests:
- it: "should list get_sfcc_class_documentation tool in available tools"
request:
jsonrpc: "2.0"
id: "tool-available"
method: "tools/list"
params: {}
expect:
response:
jsonrpc: "2.0"
id: "tool-available"
result:
match:extractField: "tools.*.name"
value: "match:arrayContains:get_sfcc_class_documentation"
stderr: "toBeEmpty"
- it: "should have get_sfcc_class_documentation in tools list with proper structure"
request:
jsonrpc: "2.0"
id: "tool-metadata"
method: "tools/list"
params: {}
expect:
response:
jsonrpc: "2.0"
id: "tool-metadata"
result:
tools: "match:arrayContains:name:get_sfcc_class_documentation"
stderr: "toBeEmpty"
- it: "should have tool with meaningful description"
request:
jsonrpc: "2.0"
id: "tool-description-quality"
method: "tools/list"
params: {}
expect:
response:
jsonrpc: "2.0"
id: "tool-description-quality"
result:
tools:
match:arrayElements:
match:partial:
name: "match:type:string"
description: "match:regex:.{20,}" # At least 20 characters
stderr: "toBeEmpty"
- it: "should have proper inputSchema structure for get_sfcc_class_documentation"
request:
jsonrpc: "2.0"
id: "tool-schema-structure"
method: "tools/list"
params: {}
expect:
response:
jsonrpc: "2.0"
id: "tool-schema-structure"
result:
tools:
match:arrayElements:
match:partial:
name: "match:type:string"
inputSchema:
type: "object"
properties: "match:type:object"
stderr: "toBeEmpty"
# ==================================================================================
# SUCCESSFUL EXECUTION TESTS - CORE CLASSES
# ==================================================================================
- it: "should execute with dw.catalog.Product class"
request:
jsonrpc: "2.0"
id: "exec-product-basic"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-product-basic"
result:
content:
- type: "text"
text: "match:contains:## Package: dw.catalog"
isError: false
stderr: "toBeEmpty"
- it: "should return complete documentation for dw.catalog.Product"
request:
jsonrpc: "2.0"
id: "exec-product-complete"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-product-complete"
result:
content:
- type: "text"
text: "match:contains:# Class Product"
isError: false
stderr: "toBeEmpty"
- it: "should include inheritance hierarchy in Product documentation"
request:
jsonrpc: "2.0"
id: "exec-product-inheritance"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-product-inheritance"
result:
content:
- type: "text"
text: "match:contains:## Inheritance Hierarchy"
isError: false
stderr: "toBeEmpty"
- it: "should include properties section in Product documentation"
request:
jsonrpc: "2.0"
id: "exec-product-properties"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-product-properties"
result:
content:
- type: "text"
text: "match:contains:## Properties"
isError: false
stderr: "toBeEmpty"
- it: "should include method summary in Product documentation"
request:
jsonrpc: "2.0"
id: "exec-product-methods"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-product-methods"
result:
content:
- type: "text"
text: "match:contains:## Method Summary"
isError: false
stderr: "toBeEmpty"
- it: "should include method details in Product documentation"
request:
jsonrpc: "2.0"
id: "exec-product-method-details"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-product-method-details"
result:
content:
- type: "text"
text: "match:contains:## Method Details"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# CLASS NAME VARIATIONS TESTING
# ==================================================================================
- it: "should work with fully qualified class names"
request:
jsonrpc: "2.0"
id: "exec-fqn"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-fqn"
result:
content:
- type: "text"
text: "match:contains:dw.catalog.Product"
isError: false
stderr: "toBeEmpty"
- it: "should work with dw.order.Order class"
request:
jsonrpc: "2.0"
id: "exec-order-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Order"
expect:
response:
jsonrpc: "2.0"
id: "exec-order-class"
result:
content:
- type: "text"
text: "match:contains:## Package: dw.order"
isError: false
stderr: "toBeEmpty"
- it: "should work with dw.system.Site class"
request:
jsonrpc: "2.0"
id: "exec-site-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Site"
expect:
response:
jsonrpc: "2.0"
id: "exec-site-class"
result:
content:
- type: "text"
text: "match:contains:# Class Site"
isError: false
stderr: "toBeEmpty"
- it: "should work with dw.customer.Customer class"
request:
jsonrpc: "2.0"
id: "exec-customer-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.Customer"
expect:
response:
jsonrpc: "2.0"
id: "exec-customer-class"
result:
content:
- type: "text"
text: "match:contains:dw.customer.Customer"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# CORE SFCC CLASSES VALIDATION - TOP 15 MOST IMPORTANT CLASSES
# ==================================================================================
- it: "should return documentation for dw.catalog.Catalog class"
request:
jsonrpc: "2.0"
id: "core-catalog"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Catalog"
expect:
response:
jsonrpc: "2.0"
id: "core-catalog"
result:
content:
- type: "text"
text: "match:contains:# Class Catalog"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.Category class"
request:
jsonrpc: "2.0"
id: "core-category"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Category"
expect:
response:
jsonrpc: "2.0"
id: "core-category"
result:
content:
- type: "text"
text: "match:contains:## Package: dw.catalog"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.Basket class"
request:
jsonrpc: "2.0"
id: "core-basket"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Basket"
expect:
response:
jsonrpc: "2.0"
id: "core-basket"
result:
content:
- type: "text"
text: "match:contains:# Class Basket"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.ProductLineItem class"
request:
jsonrpc: "2.0"
id: "core-lineitem"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.ProductLineItem"
expect:
response:
jsonrpc: "2.0"
id: "core-lineitem"
result:
content:
- type: "text"
text: "match:contains:ProductLineItem"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.CustomerMgr class"
request:
jsonrpc: "2.0"
id: "core-customermgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.CustomerMgr"
expect:
response:
jsonrpc: "2.0"
id: "core-customermgr"
result:
content:
- type: "text"
text: "match:contains:CustomerMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Session class"
request:
jsonrpc: "2.0"
id: "core-session"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Session"
expect:
response:
jsonrpc: "2.0"
id: "core-session"
result:
content:
- type: "text"
text: "match:contains:# Class Session"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Request class"
request:
jsonrpc: "2.0"
id: "core-request"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Request"
expect:
response:
jsonrpc: "2.0"
id: "core-request"
result:
content:
- type: "text"
text: "match:contains:## Package: dw.system"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Response class"
request:
jsonrpc: "2.0"
id: "core-response"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Response"
expect:
response:
jsonrpc: "2.0"
id: "core-response"
result:
content:
- type: "text"
text: "match:contains:# Class Response"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.URLUtils class"
request:
jsonrpc: "2.0"
id: "core-urlutils"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.URLUtils"
expect:
response:
jsonrpc: "2.0"
id: "core-urlutils"
result:
content:
- type: "text"
text: "match:contains:URLUtils"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.ProductMgr class"
request:
jsonrpc: "2.0"
id: "core-productmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.ProductMgr"
expect:
response:
jsonrpc: "2.0"
id: "core-productmgr"
result:
content:
- type: "text"
text: "match:contains:ProductMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.OrderMgr class"
request:
jsonrpc: "2.0"
id: "core-ordermgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.OrderMgr"
expect:
response:
jsonrpc: "2.0"
id: "core-ordermgr"
result:
content:
- type: "text"
text: "match:contains:# Class OrderMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.BasketMgr class"
request:
jsonrpc: "2.0"
id: "core-basketmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.BasketMgr"
expect:
response:
jsonrpc: "2.0"
id: "core-basketmgr"
result:
content:
- type: "text"
text: "match:contains:BasketMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.ArrayList class"
request:
jsonrpc: "2.0"
id: "core-arraylist"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.ArrayList"
expect:
response:
jsonrpc: "2.0"
id: "core-arraylist"
result:
content:
- type: "text"
text: "match:contains:ArrayList"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.HashMap class"
request:
jsonrpc: "2.0"
id: "core-hashmap"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.HashMap"
expect:
response:
jsonrpc: "2.0"
id: "core-hashmap"
result:
content:
- type: "text"
text: "match:contains:# Class HashMap"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.value.Money class"
request:
jsonrpc: "2.0"
id: "core-money"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.value.Money"
expect:
response:
jsonrpc: "2.0"
id: "core-money"
result:
content:
- type: "text"
text: "match:contains:## Package: dw.value"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# EXTENDED SFCC CLASSES VALIDATION - 30 ADDITIONAL IMPORTANT CLASSES
# ==================================================================================
- it: "should return documentation for dw.content.ContentMgr class"
request:
jsonrpc: "2.0"
id: "ext-contentmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.content.ContentMgr"
expect:
response:
jsonrpc: "2.0"
id: "ext-contentmgr"
result:
content:
- type: "text"
text: "match:contains:ContentMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.content.Content class"
request:
jsonrpc: "2.0"
id: "ext-content"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.content.Content"
expect:
response:
jsonrpc: "2.0"
id: "ext-content"
result:
content:
- type: "text"
text: "match:contains:# Class Content"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.ProductSearchModel class"
request:
jsonrpc: "2.0"
id: "ext-productsearch"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.ProductSearchModel"
expect:
response:
jsonrpc: "2.0"
id: "ext-productsearch"
result:
content:
- type: "text"
text: "match:contains:ProductSearchModel"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.SearchModel class"
request:
jsonrpc: "2.0"
id: "ext-searchmodel"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.SearchModel"
expect:
response:
jsonrpc: "2.0"
id: "ext-searchmodel"
result:
content:
- type: "text"
text: "match:contains:SearchModel"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.PriceBook class"
request:
jsonrpc: "2.0"
id: "ext-pricebook"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.PriceBook"
expect:
response:
jsonrpc: "2.0"
id: "ext-pricebook"
result:
content:
- type: "text"
text: "match:contains:PriceBook"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.Variant class"
request:
jsonrpc: "2.0"
id: "ext-variant"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Variant"
expect:
response:
jsonrpc: "2.0"
id: "ext-variant"
result:
content:
- type: "text"
text: "match:contains:# Class Variant"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.PaymentInstrument class"
request:
jsonrpc: "2.0"
id: "ext-paymentinstrument"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.PaymentInstrument"
expect:
response:
jsonrpc: "2.0"
id: "ext-paymentinstrument"
result:
content:
- type: "text"
text: "match:contains:PaymentInstrument"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.Shipment class"
request:
jsonrpc: "2.0"
id: "ext-shipment"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Shipment"
expect:
response:
jsonrpc: "2.0"
id: "ext-shipment"
result:
content:
- type: "text"
text: "match:contains:# Class Shipment"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.ShippingMethod class"
request:
jsonrpc: "2.0"
id: "ext-shippingmethod"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.ShippingMethod"
expect:
response:
jsonrpc: "2.0"
id: "ext-shippingmethod"
result:
content:
- type: "text"
text: "match:contains:ShippingMethod"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.CustomerGroup class"
request:
jsonrpc: "2.0"
id: "ext-customergroup"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.CustomerGroup"
expect:
response:
jsonrpc: "2.0"
id: "ext-customergroup"
result:
content:
- type: "text"
text: "match:contains:CustomerGroup"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.Profile class"
request:
jsonrpc: "2.0"
id: "ext-profile"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.Profile"
expect:
response:
jsonrpc: "2.0"
id: "ext-profile"
result:
content:
- type: "text"
text: "match:contains:# Class Profile"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Logger class"
request:
jsonrpc: "2.0"
id: "ext-logger"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Logger"
expect:
response:
jsonrpc: "2.0"
id: "ext-logger"
result:
content:
- type: "text"
text: "match:contains:# Class Logger"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Transaction class"
request:
jsonrpc: "2.0"
id: "ext-transaction"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Transaction"
expect:
response:
jsonrpc: "2.0"
id: "ext-transaction"
result:
content:
- type: "text"
text: "match:contains:Transaction"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.Cookie class"
request:
jsonrpc: "2.0"
id: "ext-cookie"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.Cookie"
expect:
response:
jsonrpc: "2.0"
id: "ext-cookie"
result:
content:
- type: "text"
text: "match:contains:# Class Cookie"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.Resource class"
request:
jsonrpc: "2.0"
id: "ext-resource"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.Resource"
expect:
response:
jsonrpc: "2.0"
id: "ext-resource"
result:
content:
- type: "text"
text: "match:contains:Resource"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.Form class"
request:
jsonrpc: "2.0"
id: "ext-form"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.Form"
expect:
response:
jsonrpc: "2.0"
id: "ext-form"
result:
content:
- type: "text"
text: "match:contains:# Class Form"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.Collection class"
request:
jsonrpc: "2.0"
id: "ext-collection"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.Collection"
expect:
response:
jsonrpc: "2.0"
id: "ext-collection"
result:
content:
- type: "text"
text: "match:contains:Collection"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.Iterator class"
request:
jsonrpc: "2.0"
id: "ext-iterator"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.Iterator"
expect:
response:
jsonrpc: "2.0"
id: "ext-iterator"
result:
content:
- type: "text"
text: "match:contains:Iterator"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.Calendar class"
request:
jsonrpc: "2.0"
id: "ext-calendar"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.Calendar"
expect:
response:
jsonrpc: "2.0"
id: "ext-calendar"
result:
content:
- type: "text"
text: "match:contains:# Class Calendar"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.value.Quantity class"
request:
jsonrpc: "2.0"
id: "ext-quantity"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.value.Quantity"
expect:
response:
jsonrpc: "2.0"
id: "ext-quantity"
result:
content:
- type: "text"
text: "match:contains:Quantity"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.net.HTTPClient class"
request:
jsonrpc: "2.0"
id: "ext-httpclient"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.net.HTTPClient"
expect:
response:
jsonrpc: "2.0"
id: "ext-httpclient"
result:
content:
- type: "text"
text: "match:contains:HTTPClient"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.net.Mail class"
request:
jsonrpc: "2.0"
id: "ext-mail"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.net.Mail"
expect:
response:
jsonrpc: "2.0"
id: "ext-mail"
result:
content:
- type: "text"
text: "match:contains:# Class Mail"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.io.File class"
request:
jsonrpc: "2.0"
id: "ext-file"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.io.File"
expect:
response:
jsonrpc: "2.0"
id: "ext-file"
result:
content:
- type: "text"
text: "match:contains:# Class File"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.io.Reader class"
request:
jsonrpc: "2.0"
id: "ext-reader"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.io.Reader"
expect:
response:
jsonrpc: "2.0"
id: "ext-reader"
result:
content:
- type: "text"
text: "match:contains:Reader"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.svc.ServiceRegistry class"
request:
jsonrpc: "2.0"
id: "ext-serviceregistry"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.svc.ServiceRegistry"
expect:
response:
jsonrpc: "2.0"
id: "ext-serviceregistry"
result:
content:
- type: "text"
text: "match:contains:ServiceRegistry"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.svc.HTTPService class"
request:
jsonrpc: "2.0"
id: "ext-httpservice"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.svc.HTTPService"
expect:
response:
jsonrpc: "2.0"
id: "ext-httpservice"
result:
content:
- type: "text"
text: "match:contains:HTTPService"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.campaign.Campaign class"
request:
jsonrpc: "2.0"
id: "ext-campaign"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.campaign.Campaign"
expect:
response:
jsonrpc: "2.0"
id: "ext-campaign"
result:
content:
- type: "text"
text: "match:contains:# Class Campaign"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.campaign.Promotion class"
request:
jsonrpc: "2.0"
id: "ext-promotion"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.campaign.Promotion"
expect:
response:
jsonrpc: "2.0"
id: "ext-promotion"
result:
content:
- type: "text"
text: "match:contains:Promotion"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.object.CustomObject class"
request:
jsonrpc: "2.0"
id: "ext-customobject"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.object.CustomObject"
expect:
response:
jsonrpc: "2.0"
id: "ext-customobject"
result:
content:
- type: "text"
text: "match:contains:CustomObject"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.object.CustomObjectMgr class"
request:
jsonrpc: "2.0"
id: "ext-customobjectmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.object.CustomObjectMgr"
expect:
response:
jsonrpc: "2.0"
id: "ext-customobjectmgr"
result:
content:
- type: "text"
text: "match:contains:CustomObjectMgr"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# ADVANCED SFCC CLASSES VALIDATION - 30 MORE SPECIALIZED CLASSES
# ==================================================================================
- it: "should return documentation for dw.catalog.CatalogMgr class"
request:
jsonrpc: "2.0"
id: "adv-catalogmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.CatalogMgr"
expect:
response:
jsonrpc: "2.0"
id: "adv-catalogmgr"
result:
content:
- type: "text"
text: "match:contains:CatalogMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.ProductOption class"
request:
jsonrpc: "2.0"
id: "adv-productoption"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.ProductOption"
expect:
response:
jsonrpc: "2.0"
id: "adv-productoption"
result:
content:
- type: "text"
text: "match:contains:ProductOption"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.ProductOptionModel class"
request:
jsonrpc: "2.0"
id: "adv-productoptionmodel"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.ProductOptionModel"
expect:
response:
jsonrpc: "2.0"
id: "adv-productoptionmodel"
result:
content:
- type: "text"
text: "match:contains:ProductOptionModel"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.Recommendation class"
request:
jsonrpc: "2.0"
id: "adv-recommendation"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Recommendation"
expect:
response:
jsonrpc: "2.0"
id: "adv-recommendation"
result:
content:
- type: "text"
text: "match:contains:# Class Recommendation"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.catalog.ProductAttributeModel class"
request:
jsonrpc: "2.0"
id: "adv-productattributemodel"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.ProductAttributeModel"
expect:
response:
jsonrpc: "2.0"
id: "adv-productattributemodel"
result:
content:
- type: "text"
text: "match:contains:ProductAttributeModel"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.LineItem class"
request:
jsonrpc: "2.0"
id: "adv-lineitem"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.LineItem"
expect:
response:
jsonrpc: "2.0"
id: "adv-lineitem"
result:
content:
- type: "text"
text: "match:contains:# Class LineItem"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.OrderAddress class"
request:
jsonrpc: "2.0"
id: "adv-orderaddress"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.OrderAddress"
expect:
response:
jsonrpc: "2.0"
id: "adv-orderaddress"
result:
content:
- type: "text"
text: "match:contains:OrderAddress"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.PaymentMethod class"
request:
jsonrpc: "2.0"
id: "adv-paymentmethod"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.PaymentMethod"
expect:
response:
jsonrpc: "2.0"
id: "adv-paymentmethod"
result:
content:
- type: "text"
text: "match:contains:PaymentMethod"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.PaymentMgr class"
request:
jsonrpc: "2.0"
id: "adv-paymentmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.PaymentMgr"
expect:
response:
jsonrpc: "2.0"
id: "adv-paymentmgr"
result:
content:
- type: "text"
text: "match:contains:PaymentMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.order.ShippingMgr class"
request:
jsonrpc: "2.0"
id: "adv-shippingmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.ShippingMgr"
expect:
response:
jsonrpc: "2.0"
id: "adv-shippingmgr"
result:
content:
- type: "text"
text: "match:contains:ShippingMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.AddressBook class"
request:
jsonrpc: "2.0"
id: "adv-addressbook"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.AddressBook"
expect:
response:
jsonrpc: "2.0"
id: "adv-addressbook"
result:
content:
- type: "text"
text: "match:contains:AddressBook"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.CustomerAddress class"
request:
jsonrpc: "2.0"
id: "adv-customeraddress"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.CustomerAddress"
expect:
response:
jsonrpc: "2.0"
id: "adv-customeraddress"
result:
content:
- type: "text"
text: "match:contains:CustomerAddress"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.CustomerPaymentInstrument class"
request:
jsonrpc: "2.0"
id: "adv-custpaymentinstrument"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.CustomerPaymentInstrument"
expect:
response:
jsonrpc: "2.0"
id: "adv-custpaymentinstrument"
result:
content:
- type: "text"
text: "match:contains:CustomerPaymentInstrument"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.customer.Wallet class"
request:
jsonrpc: "2.0"
id: "adv-wallet"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.Wallet"
expect:
response:
jsonrpc: "2.0"
id: "adv-wallet"
result:
content:
- type: "text"
text: "match:contains:# Class Wallet"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Pipeline class"
request:
jsonrpc: "2.0"
id: "adv-pipeline"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Pipeline"
expect:
response:
jsonrpc: "2.0"
id: "adv-pipeline"
result:
content:
- type: "text"
text: "match:contains:Pipeline"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.HookMgr class"
request:
jsonrpc: "2.0"
id: "adv-hookmgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.HookMgr"
expect:
response:
jsonrpc: "2.0"
id: "adv-hookmgr"
result:
content:
- type: "text"
text: "match:contains:HookMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.CacheMgr class"
request:
jsonrpc: "2.0"
id: "adv-cachemgr"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.CacheMgr"
expect:
response:
jsonrpc: "2.0"
id: "adv-cachemgr"
result:
content:
- type: "text"
text: "match:contains:CacheMgr"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.Forms class"
request:
jsonrpc: "2.0"
id: "adv-forms"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.Forms"
expect:
response:
jsonrpc: "2.0"
id: "adv-forms"
result:
content:
- type: "text"
text: "match:contains:# Class Forms"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.PageMetaData class"
request:
jsonrpc: "2.0"
id: "adv-pagemetadata"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.PageMetaData"
expect:
response:
jsonrpc: "2.0"
id: "adv-pagemetadata"
result:
content:
- type: "text"
text: "match:contains:PageMetaData"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.web.PagingModel class"
request:
jsonrpc: "2.0"
id: "adv-pagingmodel"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.web.PagingModel"
expect:
response:
jsonrpc: "2.0"
id: "adv-pagingmodel"
result:
content:
- type: "text"
text: "match:contains:PagingModel"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.StringUtils class"
request:
jsonrpc: "2.0"
id: "adv-stringutils"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.StringUtils"
expect:
response:
jsonrpc: "2.0"
id: "adv-stringutils"
result:
content:
- type: "text"
text: "match:contains:StringUtils"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.Map class"
request:
jsonrpc: "2.0"
id: "adv-map"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.Map"
expect:
response:
jsonrpc: "2.0"
id: "adv-map"
result:
content:
- type: "text"
text: "match:contains:# Class Map"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.Locale class"
request:
jsonrpc: "2.0"
id: "adv-locale"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.Locale"
expect:
response:
jsonrpc: "2.0"
id: "adv-locale"
result:
content:
- type: "text"
text: "match:contains:# Class Locale"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.util.List class"
request:
jsonrpc: "2.0"
id: "adv-list"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.util.List"
expect:
response:
jsonrpc: "2.0"
id: "adv-list"
result:
content:
- type: "text"
text: "match:contains:# Class List"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.value.EnumValue class"
request:
jsonrpc: "2.0"
id: "adv-enumvalue"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.value.EnumValue"
expect:
response:
jsonrpc: "2.0"
id: "adv-enumvalue"
result:
content:
- type: "text"
text: "match:contains:EnumValue"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.net.FTPClient class"
request:
jsonrpc: "2.0"
id: "adv-ftpclient"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.net.FTPClient"
expect:
response:
jsonrpc: "2.0"
id: "adv-ftpclient"
result:
content:
- type: "text"
text: "match:contains:FTPClient"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.net.SFTPClient class"
request:
jsonrpc: "2.0"
id: "adv-sftpclient"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.net.SFTPClient"
expect:
response:
jsonrpc: "2.0"
id: "adv-sftpclient"
result:
content:
- type: "text"
text: "match:contains:SFTPClient"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.io.CSVStreamWriter class"
request:
jsonrpc: "2.0"
id: "adv-csvstreamwriter"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.io.CSVStreamWriter"
expect:
response:
jsonrpc: "2.0"
id: "adv-csvstreamwriter"
result:
content:
- type: "text"
text: "match:contains:CSVStreamWriter"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.io.XMLStreamWriter class"
request:
jsonrpc: "2.0"
id: "adv-xmlstreamwriter"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.io.XMLStreamWriter"
expect:
response:
jsonrpc: "2.0"
id: "adv-xmlstreamwriter"
result:
content:
- type: "text"
text: "match:contains:XMLStreamWriter"
isError: false
stderr: "toBeEmpty"
- it: "should return documentation for dw.system.Status class"
request:
jsonrpc: "2.0"
id: "adv-status"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.system.Status"
expect:
response:
jsonrpc: "2.0"
id: "adv-status"
result:
content:
- type: "text"
text: "match:contains:# Class Status"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# DOCUMENTATION CONTENT VALIDATION
# ==================================================================================
- it: "should include class description in Order documentation"
request:
jsonrpc: "2.0"
id: "exec-order-description"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Order"
expect:
response:
jsonrpc: "2.0"
id: "exec-order-description"
result:
content:
- type: "text"
text: "match:contains:## Description"
isError: false
stderr: "toBeEmpty"
- it: "should include constants in Order documentation"
request:
jsonrpc: "2.0"
id: "exec-order-constants"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Order"
expect:
response:
jsonrpc: "2.0"
id: "exec-order-constants"
result:
content:
- type: "text"
text: "match:contains:## Constants"
isError: false
stderr: "toBeEmpty"
- it: "should include constructor summary in Order documentation"
request:
jsonrpc: "2.0"
id: "exec-order-constructors"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Order"
expect:
response:
jsonrpc: "2.0"
id: "exec-order-constructors"
result:
content:
- type: "text"
text: "match:contains:## Constructor Summary"
isError: false
stderr: "toBeEmpty"
- it: "should include method signatures in documentation"
request:
jsonrpc: "2.0"
id: "exec-method-signatures"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-method-signatures"
result:
content:
- type: "text"
text: "match:contains:**Signature:**"
isError: false
stderr: "toBeEmpty"
- it: "should include property types in documentation"
request:
jsonrpc: "2.0"
id: "exec-property-types"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-property-types"
result:
content:
- type: "text"
text: "match:contains:**Type:**"
isError: false
stderr: "toBeEmpty"
- it: "should include return valid markdown format"
request:
jsonrpc: "2.0"
id: "exec-markdown-format"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "exec-markdown-format"
result:
content:
- type: "text"
text: "match:regex:[\\s\\S]*#{1,6}[\\s\\S]*" # Contains markdown headers
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# ERROR HANDLING TESTS
# ==================================================================================
- it: "should handle invalid class names gracefully"
request:
jsonrpc: "2.0"
id: "error-invalid-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "NonExistentClass"
expect:
response:
jsonrpc: "2.0"
id: "error-invalid-class"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
stderr: "toBeEmpty"
- it: "should handle invalid class with specific error message"
request:
jsonrpc: "2.0"
id: "error-invalid-specific"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "InvalidClassName"
expect:
response:
jsonrpc: "2.0"
id: "error-invalid-specific"
result:
content:
- type: "text"
text: "match:contains:not found"
isError: true
stderr: "toBeEmpty"
- it: "should handle empty class name"
request:
jsonrpc: "2.0"
id: "error-empty-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: ""
expect:
response:
jsonrpc: "2.0"
id: "error-empty-class"
result:
content:
- type: "text"
text: "match:contains:non-empty string"
isError: true
stderr: "toBeEmpty"
- it: "should handle missing className parameter with error response"
request:
jsonrpc: "2.0"
id: "error-missing-param"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments: {}
expect:
response:
jsonrpc: "2.0"
id: "error-missing-param"
result:
content:
- type: "text"
text: "match:contains:non-empty string"
isError: true
stderr: "toBeEmpty"
- it: "should handle null className gracefully"
request:
jsonrpc: "2.0"
id: "error-null-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: null
expect:
response:
jsonrpc: "2.0"
id: "error-null-class"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
stderr: "toBeEmpty"
- it: "should handle numeric className gracefully"
request:
jsonrpc: "2.0"
id: "error-numeric-class"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: 123
expect:
response:
jsonrpc: "2.0"
id: "error-numeric-class"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
stderr: "toBeEmpty"
# ==================================================================================
# EDGE CASE TESTING
# ==================================================================================
- it: "should handle whitespace-only className"
request:
jsonrpc: "2.0"
id: "edge-whitespace"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: " "
expect:
response:
jsonrpc: "2.0"
id: "edge-whitespace"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
stderr: "toBeEmpty"
- it: "should handle class names with special characters"
request:
jsonrpc: "2.0"
id: "edge-special-chars"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product@#$"
expect:
response:
jsonrpc: "2.0"
id: "edge-special-chars"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
stderr: "toBeEmpty"
- it: "should handle very long invalid class names"
request:
jsonrpc: "2.0"
id: "edge-long-invalid"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.very.long.nonexistent.package.that.does.not.exist.anywhere.InvalidClass"
expect:
response:
jsonrpc: "2.0"
id: "edge-long-invalid"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
stderr: "toBeEmpty"
# ==================================================================================
# COMPREHENSIVE CONTENT VALIDATION
# ==================================================================================
- it: "should return substantial documentation content for Product class"
request:
jsonrpc: "2.0"
id: "content-substantial"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "content-substantial"
result:
content:
- type: "text"
text: "match:regex:[\\s\\S]{5000,}" # At least 5000 characters
isError: false
stderr: "toBeEmpty"
- it: "should include multiple sections in complete documentation"
request:
jsonrpc: "2.0"
id: "content-multiple-sections"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "content-multiple-sections"
result:
content:
- type: "text"
text: "match:contains:## Properties"
isError: false
stderr: "toBeEmpty"
- it: "should include detailed method information"
request:
jsonrpc: "2.0"
id: "content-method-info"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "content-method-info"
result:
content:
- type: "text"
text: "match:contains:**Parameters:**"
isError: false
stderr: "toBeEmpty"
- it: "should include return value information"
request:
jsonrpc: "2.0"
id: "content-return-info"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "content-return-info"
result:
content:
- type: "text"
text: "match:contains:**Returns:**"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# PERFORMANCE AND CONSISTENCY VALIDATION
# ==================================================================================
- it: "should have consistent response structure across different classes"
request:
jsonrpc: "2.0"
id: "consistency-structure"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Order"
expect:
response:
jsonrpc: "2.0"
id: "consistency-structure"
result:
content:
- type: "text"
text: "match:type:string"
isError: false
stderr: "toBeEmpty"
- it: "should not include isError field for successful responses"
request:
jsonrpc: "2.0"
id: "success-no-error-flag"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "success-no-error-flag"
result:
content: "match:type:array"
isError: false
stderr: "toBeEmpty"
# ==================================================================================
# PERFORMANCE TIMING TESTS - CI-FRIENDLY
# ==================================================================================
- it: "should respond within reasonable time for Product class lookup"
request:
jsonrpc: "2.0"
id: "perf-product-timing"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "perf-product-timing"
result:
content:
- type: "text"
text: "match:contains:dw.catalog.Product"
isError: false
performance:
maxResponseTime: "500ms" # CI-friendly timeout for documentation lookup
stderr: "toBeEmpty"
- it: "should respond within reasonable time for Order class lookup"
request:
jsonrpc: "2.0"
id: "perf-order-timing"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.order.Order"
expect:
response:
jsonrpc: "2.0"
id: "perf-order-timing"
result:
content:
- type: "text"
text: "match:contains:dw.order.Order"
isError: false
performance:
maxResponseTime: "500ms" # CI-friendly timeout for documentation lookup
stderr: "toBeEmpty"
- it: "should respond within reasonable time for Customer class lookup"
request:
jsonrpc: "2.0"
id: "perf-customer-timing"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.customer.Customer"
expect:
response:
jsonrpc: "2.0"
id: "perf-customer-timing"
result:
content:
- type: "text"
text: "match:contains:dw.customer.Customer"
isError: false
performance:
maxResponseTime: "500ms" # CI-friendly timeout for documentation lookup
stderr: "toBeEmpty"
- it: "should handle error cases quickly"
request:
jsonrpc: "2.0"
id: "perf-error-timing"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "NonExistentClass"
expect:
response:
jsonrpc: "2.0"
id: "perf-error-timing"
result:
content:
- type: "text"
text: "match:contains:Error"
isError: true
performance:
maxResponseTime: "300ms" # Error handling should be faster
stderr: "toBeEmpty"
- it: "should handle validation errors very quickly"
request:
jsonrpc: "2.0"
id: "perf-validation-timing"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: ""
expect:
response:
jsonrpc: "2.0"
id: "perf-validation-timing"
result:
content:
- type: "text"
text: "match:contains:non-empty string"
isError: true
performance:
maxResponseTime: "200ms" # Validation errors should be very fast
stderr: "toBeEmpty"
# ==================================================================================
# RESPONSE FORMAT VALIDATION
# ==================================================================================
- it: "should return proper content array structure"
request:
jsonrpc: "2.0"
id: "format-content-array"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "format-content-array"
result:
content: "match:arrayLength:1"
isError: false
stderr: "toBeEmpty"
- it: "should return content with proper type field"
request:
jsonrpc: "2.0"
id: "format-content-type"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "dw.catalog.Product"
expect:
response:
jsonrpc: "2.0"
id: "format-content-type"
result:
content:
- type: "text"
text: "match:type:string"
isError: false
stderr: "toBeEmpty"
- it: "should maintain consistent error response format"
request:
jsonrpc: "2.0"
id: "format-error-consistent"
method: "tools/call"
params:
name: "get_sfcc_class_documentation"
arguments:
className: "InvalidClass"
expect:
response:
jsonrpc: "2.0"
id: "format-error-consistent"
result:
content:
- type: "text"
text: "match:type:string"
isError: true
stderr: "toBeEmpty"
```