{
  "tools": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "tools": [
          {
            "name": "list_services",
            "title": "List services",
            "description": "List every backend service exposed to MCP, with a one-line description and the method names each offers. Call this first when you do not already know what is available.",
            "inputSchema": {
              "type": "object",
              "properties": {},
              "additionalProperties": false
            }
          },
          {
            "name": "describe_service",
            "title": "Describe a service",
            "description": "Return method signatures for one service — parameter names, types, whether they are required, and the return shape. Required reading before calling an unfamiliar method, because call_service takes POSITIONAL arguments.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "service": {
                  "type": "string",
                  "description": "Service class name exactly as returned by list_services (e.g. \"PayrollRunEngineService\")."
                }
              },
              "required": [
                "service"
              ],
              "additionalProperties": false
            }
          },
          {
            "name": "call_service",
            "title": "Call a service method",
            "description": "Invoke a method on a registered service. REQUIRES AUTHENTICATION: the request must carry an `orgid` header and an `Authorization: Bearer <token>` header, and the caller needs content permissions in that org. Unlike list_services/describe_service, this one will refuse without them. A token comes from POST /user/signin (body: email, password, with the orgid header) or from an org API key. Arguments are POSITIONAL, in declaration order, with orgId omitted — the server injects orgId and the current user from the authenticated session, and passing your own would be ignored. For a method declared (orgId, body) pass args: [body]; for (orgId, input, author) pass args: [input, author]. Service errors are returned verbatim so you can read them and adjust.",
            "inputSchema": {
              "type": "object",
              "properties": {
                "service": {
                  "type": "string",
                  "description": "Service class name."
                },
                "method": {
                  "type": "string",
                  "description": "Method name. Must be marked @AiCallable or the call is rejected."
                },
                "args": {
                  "type": "array",
                  "description": "Positional arguments in declared order, with orgId omitted.",
                  "items": {}
                }
              },
              "required": [
                "service",
                "method"
              ],
              "additionalProperties": false
            }
          }
        ]
      }
    }
  },
  "services": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 2,
      "result": {
        "content": [
          {
            "type": "text",
            "text": "[\n  {\n    \"service\": \"RepositoryOrgService\",\n    \"description\": \"Organization-level repository operations: lookup, query, create/update/delete orgs, site-domain mapping.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"getOrg\",\n      \"getOrgPublicInfo\",\n      \"queryOrg\",\n      \"userOrg\",\n      \"createOrg\",\n      \"deleteOrg\",\n      \"modifyOrg\",\n      \"queryOrgData\",\n      \"getOrgIdByDomainName\",\n      \"getSiteDomainMapping\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"description\": \"Core CRUD: find/create/update/delete, search, publish, approval workflow, asset operations.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"requestApproval\",\n      \"approve\",\n      \"reject\",\n      \"isUnique\",\n      \"getPartial\",\n      \"findOne\",\n      \"findOneAnyId\",\n      \"findByAttribute\",\n      \"findTimedData\",\n      \"findPageData\",\n      \"findRelated\",\n      \"find\",\n      \"findExperts\",\n      \"findAsset\",\n      \"searchAsset\",\n      \"deleteAssets\",\n      \"updateAsset\",\n      \"getDataTypeCategories\",\n      \"getTags\",\n      \"addTag\",\n      \"findByTag\",\n      \"search\",\n      \"createNoChecks\",\n      \"createExtended\",\n      \"create\",\n      \"update\",\n      \"updatePartial\",\n      \"updateSystemFields\",\n      \"publish\",\n      \"unpublish\",\n      \"delete\",\n      \"deleteBulk\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryEnrichmentService\",\n    \"description\": \"Read-side enrichment for pages, sections, sites, products, events, reservations, and other related-data lookups.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"enrichSingle\",\n      \"enrichPageSection\",\n      \"enrichArray\",\n      \"getInitData\",\n      \"getPreviewPage\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryCollectionService\",\n    \"description\": \"Collection schema discovery and per-org settings (base-setting) management.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"getCollections\",\n      \"getCollection\",\n      \"fixCollection\",\n      \"createSearchIndex\",\n      \"getSetting\",\n      \"setSetting\",\n      \"deleteSetting\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryAggregateService\",\n    \"description\": \"Aggregation passthrough: match/group/sort/projection or full pipeline.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"aggregateWithPipeline\",\n      \"aggregate\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryBulkService\",\n    \"description\": \"Bulk CSV/JSON import, activity logging, and data migration jobs (instant + background).\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"bulkCreate\",\n      \"bulkCreateItem\",\n      \"exportData\",\n      \"recordActivity\",\n      \"migrateData\",\n      \"getMigrationStatus\",\n      \"listMigrationJobs\",\n      \"cancelMigrationJob\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryAssetsService\",\n    \"description\": \"External asset proxies (Pexels) and file-storage indexing into the fileinfo collection.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"searchPhotosFromPexel\",\n      \"searchVideosFromPexel\",\n      \"indexFileLocation\"\n    ]\n  },\n  {\n    \"service\": \"RepositoryProviderFile\",\n    \"description\": \"Org-scoped file/storage gateway — put, get, list, delete, signed URLs, thumbnails. S3 or local disk per tenant config.\",\n    \"group\": \"repository\",\n    \"methods\": [\n      \"getStorage\",\n      \"append\",\n      \"copy\",\n      \"delete\",\n      \"deleteThumbnails\",\n      \"driver\",\n      \"exists\",\n      \"get\",\n      \"getBuffer\",\n      \"getBatchBuffers\",\n      \"getBase64\",\n      \"getSignedUrl\",\n      \"getStat\",\n      \"getStream\",\n      \"getUrl\",\n      \"move\",\n      \"put\",\n      \"putFromUrl\",\n      \"createThumbnails\",\n      \"createFavicon\",\n      \"prepend\",\n      \"flatListx\",\n      \"flatList\",\n      \"flatListPost\",\n      \"setPublicRead\",\n      \"setPrivateRead\",\n      \"customerUpload\",\n      \"customerDelete\",\n      \"customerFlatList\"\n    ]\n  },\n  {\n    \"service\": \"CrmFormService\",\n    \"description\": \"Public-facing CRM form definitions and submissions. Use to fetch the schema for a guest-accessible form or submit a guest entry.\",\n    \"group\": \"crm\",\n    \"methods\": [\n      \"toPublicReply\",\n      \"submitCRMForm\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontCatalogService\",\n    \"description\": \"Storefront catalog reads — site bundles, brands, attributes, collections, categories, POS quick-pick categories, product list/search/detail (with calculated pricing).\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"getStoreData\",\n      \"getBrands\",\n      \"getAttributes\",\n      \"getCollections\",\n      \"getProducts\",\n      \"getMinMaxPrice\",\n      \"getProductRelated\",\n      \"getCategories\",\n      \"addCategory\",\n      \"getPosCategories\",\n      \"getProduct\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontPosService\",\n    \"description\": \"Point-of-sale tab management — open/list/settle/split tabs, add or fire items into kitchen pipelines, refund payments, assign/release service points, flip service-point status. POS tabs share the sf_order shape with web orders so reports see one model.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"openPosTab\",\n      \"listOpenPosTabs\",\n      \"listClosedPosTabs\",\n      \"settlePosTab\",\n      \"printPosCheck\",\n      \"printPosReceipt\",\n      \"sendPosReceipt\",\n      \"splitPosTab\",\n      \"addItemsToOrder\",\n      \"fireOrderItems\",\n      \"refundPosTabPayment\",\n      \"assignServicePointToTab\",\n      \"releaseServicePointFromTab\",\n      \"setServicePointStatus\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontCartService\",\n    \"description\": \"Storefront cart lifecycle — list, fetch (with auto-create), update, and clear. All paths return the cart with `discountService.calculateCart` totals applied.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"carts\",\n      \"cart\",\n      \"cartClear\",\n      \"cartUpdate\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontOrderService\",\n    \"description\": \"Storefront order lifecycle — list/get orders, create from cart (`orderUpdate`), refund, cancel, advance through processing/shipping/delivery/hold/complete states. Owns the `createTransaction` payment-recording flow shared with POS, checkout, and subscription paths.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"getOrders\",\n      \"getOrder\",\n      \"getOrderById\",\n      \"getTransactions\",\n      \"getOrderPayments\",\n      \"getWishlist\",\n      \"orderByEmail\",\n      \"orderRemove\",\n      \"orderRefund\",\n      \"refundPaymentDirect\",\n      \"orderCancel\",\n      \"orderProcess\",\n      \"orderShip\",\n      \"orderDeliver\",\n      \"orderHold\",\n      \"orderRelease\",\n      \"orderComplete\",\n      \"orderSetStatus\",\n      \"findLinkedCustomer\",\n      \"orderUpdate\",\n      \"orderSendWelcome\",\n      \"createTransaction\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontCheckoutService\",\n    \"description\": \"Checkout entry points — mixed-cart checkout (products + rentals), buy-now flow, generic take-payment that applies to its parent order/invoice/ticket/rental, Stripe webhook subscription handler, and the upstream gateway verifyPayment helper.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"checkoutMixed\",\n      \"processSubscription\",\n      \"takePayment\",\n      \"checkoutBuyNow\",\n      \"verifyPayment\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontPaymentService\",\n    \"description\": \"Payment gateway session/intent creation (Stripe, PayPal) and gateway availability listing for the storefront checkout.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"stripeSubscriptionSession\",\n      \"stripeCheckoutSession\",\n      \"stripePaymentIntent\",\n      \"stripeTerminalConnectionToken\",\n      \"stripeTerminalEnsureLocation\",\n      \"stripeTerminalPaymentIntent\",\n      \"stripeCapturePaymentIntent\",\n      \"paypalConfig\",\n      \"listPaymentGateways\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontSubscriptionService\",\n    \"description\": \"Storefront subscriptions — list / look up plan / create-or-renew / cancel, plus the cross-org Appmint billing helpers (root-org plan record + org-side company record stay in sync).\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"getSubscriptions\",\n      \"getSubscriptionPlan\",\n      \"subscriptionUpdate\",\n      \"cancelSubscription\",\n      \"appmintSubscriptionGet\",\n      \"appmintSubscriptionUpdate\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontPartnerSyncService\",\n    \"description\": \"Outbound storefront syndication — push, update, list, and delete products on shopping-partner platforms (Google Merchant, Facebook Catalog, Amazon, etc.) and optionally cross-post to social. Connect-flow stub for partner OAuth handshakes.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"connect\",\n      \"getShoppingPartners\",\n      \"syncServiceAdd\",\n      \"syncServiceDelete\",\n      \"syncProduct\",\n      \"syncProductToAllPartners\",\n      \"deleteProductFromPartner\",\n      \"listPartnerProducts\",\n      \"listAllPartnerProducts\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontSocialService\",\n    \"description\": \"Compose and dispatch social-media posts for storefront products — single product or carousel, per-platform formatting (Facebook, Instagram, TikTok, Twitter, LinkedIn, Pinterest, Snapchat), with preview-only and live-post variants.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"getSocialTargets\",\n      \"postProductsToSocial\",\n      \"previewSocialPost\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontWorkflowService\",\n    \"description\": \"Order-management workflow lifecycle — create the default order workflow, fetch existing ones, and advance an order through stages as its status changes.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"createOrderManagementWorkflow\",\n      \"getOrderManagementWorkflow\",\n      \"initializeOrderWorkflow\",\n      \"advanceOrderWorkflow\"\n    ]\n  },\n  {\n    \"service\": \"StorefrontUrlService\",\n    \"description\": \"Resolves the public-facing base URL and store-page path for a given site. Used by social/partner integrations to build product permalinks.\",\n    \"group\": \"storefront\",\n    \"methods\": [\n      \"getStoreURLs\"\n    ]\n  },\n  {\n    \"service\": \"PostingService\",\n    \"description\": \"Posts business events (sales, invoices, payments, bills, payroll, inventory) to the general ledger as balanced journal entries. Idempotent per source document.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"setAccountMap\",\n      \"postSale\",\n      \"postGiftCardBreakage\",\n      \"postInvoice\",\n      \"postPayment\",\n      \"postPayrollRun\",\n      \"postCostOfGoods\",\n      \"backfillCostOfGoods\",\n      \"resumeInterruptedPostings\",\n      \"backfill\"\n    ]\n  },\n  {\n    \"service\": \"TaxTableCatalogService\",\n    \"description\": \"Catalog of tax tables loaded from shipped JSON files (federal + per-state). Read-only reference data; org-specific rules override it.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"reload\",\n      \"coverage\",\n      \"verify\",\n      \"compare\"\n    ]\n  },\n  {\n    \"service\": \"EmployeeService\",\n    \"description\": \"Employee master records — CRUD, status transitions, time-off, performance reviews, training, skills, onboarding, headcount + anniversary reports.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getEmployees\",\n      \"getEmployee\",\n      \"createEmployee\",\n      \"updateEmployee\",\n      \"deleteEmployee\",\n      \"getEmployeeByEmployeeId\",\n      \"getEmployeesByDepartment\",\n      \"getEmployeesByLocation\",\n      \"getActiveEmployees\",\n      \"getEmployeesBySupervisor\",\n      \"updateEmployeeStatus\",\n      \"terminateEmployee\",\n      \"requestTimeOff\",\n      \"approveTimeOff\",\n      \"rejectTimeOff\",\n      \"getTimeOffRequests\",\n      \"addPerformanceReview\",\n      \"getPerformanceReviews\",\n      \"addTraining\",\n      \"completeTraining\",\n      \"getExpiredTraining\",\n      \"addSkill\",\n      \"getEmployeesBySkill\",\n      \"startOnboarding\",\n      \"completeOnboardingTask\",\n      \"getHeadcount\",\n      \"getUpcomingAnniversaries\",\n      \"getUpcomingBirthdays\"\n    ]\n  },\n  {\n    \"service\": \"TimesheetService\",\n    \"description\": \"Timesheets — bi-weekly time tracking with submit/approve/reject/reopen workflow, time entries, clock-in/out, and reporting.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getTimesheets\",\n      \"getTimesheet\",\n      \"createTimesheet\",\n      \"updateTimesheet\",\n      \"deleteTimesheet\",\n      \"getTimesheetsByEmployee\",\n      \"getTimesheetByEmployeeAndPeriod\",\n      \"getPendingTimesheets\",\n      \"getTimesheetsByStatus\",\n      \"submitTimesheet\",\n      \"approveTimesheet\",\n      \"rejectTimesheet\",\n      \"reopenTimesheet\",\n      \"addTimeEntry\",\n      \"updateTimeEntry\",\n      \"removeTimeEntry\",\n      \"clockIn\",\n      \"clockOut\",\n      \"getActiveClockIn\",\n      \"getTimesheetSummary\",\n      \"getOnTheClock\",\n      \"closeStaleClockIns\",\n      \"getTeamTimesheetStatus\",\n      \"getMissingTimesheets\"\n    ]\n  },\n  {\n    \"service\": \"PayrollService\",\n    \"description\": \"Payroll runs/profiles/stubs CRUD plus the run lifecycle (calculate→approve→process) backed by the PayrollRunEngine, per-employee deduction and bank-account management, payroll summary and W-2 aggregation.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getPayrollRuns\",\n      \"getPayrollRun\",\n      \"createPayrollRun\",\n      \"updatePayrollRun\",\n      \"deletePayrollRun\",\n      \"calculatePayrollRun\",\n      \"approvePayrollRun\",\n      \"processPayrollRun\",\n      \"cancelPayrollRun\",\n      \"getPayStubs\",\n      \"getPayStub\",\n      \"createPayStub\",\n      \"getPayStubsByEmployee\",\n      \"getPayStubsByPayrollRun\",\n      \"getEmployerTaxSetup\",\n      \"updateEmployerTaxSetup\",\n      \"assessEmployerTaxSetup\",\n      \"migrateTaxElections\",\n      \"getPayrollProfiles\",\n      \"getPayrollProfile\",\n      \"getPayrollProfileByEmployee\",\n      \"createPayrollProfile\",\n      \"updatePayrollProfile\",\n      \"deletePayrollProfile\",\n      \"addDeduction\",\n      \"updateDeduction\",\n      \"removeDeduction\",\n      \"addBankAccount\",\n      \"verifyBankAccount\",\n      \"removeBankAccount\",\n      \"getPayrollSummary\",\n      \"getEmployeeW2Data\"\n    ]\n  },\n  {\n    \"service\": \"ScheduleService\",\n    \"description\": \"Shift scheduling — schedule periods with shifts, swap requests, clock-in/out + breaks, and labor reporting.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getSchedules\",\n      \"getSchedule\",\n      \"createSchedule\",\n      \"updateSchedule\",\n      \"deleteSchedule\",\n      \"publishSchedule\",\n      \"archiveSchedule\",\n      \"duplicateSchedule\",\n      \"addShift\",\n      \"updateShift\",\n      \"removeShift\",\n      \"requestShiftSwap\",\n      \"approveShiftSwap\",\n      \"rejectShiftSwap\",\n      \"clockIn\",\n      \"clockOut\",\n      \"addBreak\",\n      \"endBreak\",\n      \"getShiftsByEmployee\",\n      \"getUpcomingShifts\",\n      \"getTodaysShifts\",\n      \"getLaborSummary\"\n    ]\n  },\n  {\n    \"service\": \"WorkOrderService\",\n    \"description\": \"Work orders for service jobs — items, assignments, status, time entries, and materials with cost roll-ups.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getWorkOrders\",\n      \"getWorkOrder\",\n      \"createWorkOrder\",\n      \"updateWorkOrder\",\n      \"deleteWorkOrder\",\n      \"updateWorkOrderStatus\",\n      \"assignWorkOrder\",\n      \"addWorkOrderItem\",\n      \"updateWorkOrderItem\",\n      \"addTimeEntry\",\n      \"addMaterial\",\n      \"getWorkOrdersByCustomer\",\n      \"getActiveWorkOrders\"\n    ]\n  },\n  {\n    \"service\": \"RecruitmentService\",\n    \"description\": \"Recruitment / ATS — job postings, applicants with stage tracking, interviews, and offers.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getJobPostings\",\n      \"getJobPosting\",\n      \"createJobPosting\",\n      \"updateJobPosting\",\n      \"deleteJobPosting\",\n      \"publishJobPosting\",\n      \"closeJobPosting\",\n      \"getApplicants\",\n      \"getApplicant\",\n      \"createApplicant\",\n      \"updateApplicant\",\n      \"deleteApplicant\",\n      \"moveApplicantStage\",\n      \"rejectApplicant\",\n      \"addApplicantNote\",\n      \"getInterviews\",\n      \"getInterview\",\n      \"scheduleInterview\",\n      \"updateInterview\",\n      \"completeInterview\",\n      \"cancelInterview\",\n      \"rescheduleInterview\",\n      \"getOffers\",\n      \"getOffer\",\n      \"createOffer\",\n      \"updateOffer\",\n      \"sendOffer\",\n      \"acceptOffer\",\n      \"declineOffer\",\n      \"withdrawOffer\",\n      \"getRecruitmentMetrics\",\n      \"getApplicantsByStage\"\n    ]\n  },\n  {\n    \"service\": \"BenefitsService\",\n    \"description\": \"Employee benefits — plans (medical/dental/401k/etc.), per-employee enrollments, dependents, beneficiaries, open-enrollment windows, and benefits metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getBenefitPlans\",\n      \"getBenefitPlan\",\n      \"createBenefitPlan\",\n      \"updateBenefitPlan\",\n      \"deleteBenefitPlan\",\n      \"activateBenefitPlan\",\n      \"deactivateBenefitPlan\",\n      \"getActivePlans\",\n      \"getPlansByCategory\",\n      \"getEnrollments\",\n      \"getEnrollment\",\n      \"createEnrollment\",\n      \"updateEnrollment\",\n      \"deleteEnrollment\",\n      \"activateEnrollment\",\n      \"terminateEnrollment\",\n      \"waiveEnrollment\",\n      \"getEmployeeEnrollments\",\n      \"getActiveEnrollmentsByPlan\",\n      \"addDependent\",\n      \"removeDependent\",\n      \"addBeneficiary\",\n      \"removeBeneficiary\",\n      \"startOpenEnrollment\",\n      \"isOpenEnrollmentActive\",\n      \"getBenefitsMetrics\"\n    ]\n  },\n  {\n    \"service\": \"LeaveService\",\n    \"description\": \"Leave management — leave types, per-employee balances with accrual/transactions, leave requests with submit/approve/reject/cancel workflow, leave policies, and metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getLeaveTypes\",\n      \"getLeaveType\",\n      \"createLeaveType\",\n      \"updateLeaveType\",\n      \"deleteLeaveType\",\n      \"getActiveLeaveTypes\",\n      \"getLeaveBalances\",\n      \"getLeaveBalance\",\n      \"createLeaveBalance\",\n      \"updateLeaveBalance\",\n      \"getEmployeeBalances\",\n      \"adjustBalance\",\n      \"accrueLeave\",\n      \"getLeaveRequests\",\n      \"getLeaveRequest\",\n      \"createLeaveRequest\",\n      \"updateLeaveRequest\",\n      \"deleteLeaveRequest\",\n      \"getEmployeeRequests\",\n      \"getLeavePolicies\",\n      \"getLeavePolicy\",\n      \"createLeavePolicy\",\n      \"updateLeavePolicy\",\n      \"deleteLeavePolicy\",\n      \"getLeaveMetrics\"\n    ]\n  },\n  {\n    \"service\": \"PerformanceService\",\n    \"description\": \"Performance management — goals with progress tracking, performance reviews (self/manager/calibration workflow), Performance Improvement Plans (PIPs), and metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getGoals\",\n      \"getGoal\",\n      \"createGoal\",\n      \"updateGoal\",\n      \"deleteGoal\",\n      \"activateGoal\",\n      \"updateGoalProgress\",\n      \"completeGoal\",\n      \"cancelGoal\",\n      \"getEmployeeGoals\",\n      \"getReviews\",\n      \"getReview\",\n      \"createReview\",\n      \"updateReview\",\n      \"deleteReview\",\n      \"startSelfReview\",\n      \"submitSelfAssessment\",\n      \"submitManagerReview\",\n      \"completeReview\",\n      \"acknowledgeReview\",\n      \"getEmployeeReviews\",\n      \"getPIPs\",\n      \"getPIP\",\n      \"createPIP\",\n      \"updatePIP\",\n      \"deletePIP\",\n      \"activatePIP\",\n      \"addPIPCheckIn\",\n      \"completePIP\",\n      \"extendPIP\",\n      \"getPerformanceMetrics\"\n    ]\n  },\n  {\n    \"service\": \"LearningService\",\n    \"description\": \"Learning & Development — courses, certifications, learning paths, course enrollments with progress/assessment tracking, and L&D metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getCourses\",\n      \"getCourse\",\n      \"createCourse\",\n      \"updateCourse\",\n      \"deleteCourse\",\n      \"publishCourse\",\n      \"archiveCourse\",\n      \"getActiveCourses\",\n      \"getCertifications\",\n      \"getCertification\",\n      \"createCertification\",\n      \"updateCertification\",\n      \"deleteCertification\",\n      \"getLearningPaths\",\n      \"getLearningPath\",\n      \"createLearningPath\",\n      \"updateLearningPath\",\n      \"deleteLearningPath\",\n      \"publishLearningPath\",\n      \"getEnrollments\",\n      \"getEnrollment\",\n      \"createEnrollment\",\n      \"updateEnrollment\",\n      \"startCourse\",\n      \"updateCourseProgress\",\n      \"completeCourse\",\n      \"withdrawFromCourse\",\n      \"recordAssessmentAttempt\",\n      \"getEmployeeEnrollments\",\n      \"getEmployeeCertifications\",\n      \"assignCourse\",\n      \"getLearningMetrics\"\n    ]\n  },\n  {\n    \"service\": \"CompensationService\",\n    \"description\": \"Compensation — salary grades/bands, compensation-change requests with approval workflow, bonuses, and compensation metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getSalaryGrades\",\n      \"getSalaryGrade\",\n      \"createSalaryGrade\",\n      \"updateSalaryGrade\",\n      \"deleteSalaryGrade\",\n      \"activateSalaryGrade\",\n      \"getSalaryGradeByCode\",\n      \"calculateCompaRatio\",\n      \"getCompensationChanges\",\n      \"getCompensationChange\",\n      \"createCompensationChange\",\n      \"updateCompensationChange\",\n      \"deleteCompensationChange\",\n      \"submitForApproval\",\n      \"approveCompensationChange\",\n      \"rejectCompensationChange\",\n      \"processCompensationChange\",\n      \"getEmployeeCompensationHistory\",\n      \"getBonuses\",\n      \"getBonus\",\n      \"createBonus\",\n      \"updateBonus\",\n      \"deleteBonus\",\n      \"submitBonusForApproval\",\n      \"approveBonus\",\n      \"scheduleBonus\",\n      \"markBonusPaid\",\n      \"getEmployeeBonuses\",\n      \"getCompensationMetrics\"\n    ]\n  },\n  {\n    \"service\": \"OrganizationService\",\n    \"description\": \"Organization design — departments (with hierarchy), positions/job slots with headcount, org charts, and aggregate org metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getDepartments\",\n      \"getDepartment\",\n      \"createDepartment\",\n      \"updateDepartment\",\n      \"deleteDepartment\",\n      \"getDepartmentByCode\",\n      \"getActiveDepartments\",\n      \"getSubDepartments\",\n      \"updateDepartmentHead\",\n      \"updateDepartmentHeadcount\",\n      \"getDepartmentHierarchy\",\n      \"getPositions\",\n      \"getPosition\",\n      \"createPosition\",\n      \"updatePosition\",\n      \"deletePosition\",\n      \"getPositionByCode\",\n      \"getActivePositions\",\n      \"getPositionsByDepartment\",\n      \"getOpenPositions\",\n      \"fillPosition\",\n      \"vacatePosition\",\n      \"getOrgCharts\",\n      \"getOrgChart\",\n      \"createOrgChart\",\n      \"updateOrgChart\",\n      \"deleteOrgChart\",\n      \"publishOrgChart\",\n      \"archiveOrgChart\",\n      \"getDefaultOrgChart\",\n      \"setDefaultOrgChart\",\n      \"getOrganizationMetrics\"\n    ]\n  },\n  {\n    \"service\": \"DocumentsService\",\n    \"description\": \"HR documents and policies — employee documents, signatures/verification, policies with versions, and per-employee policy acknowledgements.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getEmployeeDocuments\",\n      \"getEmployeeDocument\",\n      \"createEmployeeDocument\",\n      \"updateEmployeeDocument\",\n      \"deleteEmployeeDocument\",\n      \"getDocumentsByEmployee\",\n      \"getDocumentsByCategory\",\n      \"verifyDocument\",\n      \"signDocument\",\n      \"archiveDocument\",\n      \"getExpiringDocuments\",\n      \"getPolicies\",\n      \"getPolicy\",\n      \"createPolicy\",\n      \"updatePolicy\",\n      \"deletePolicy\",\n      \"publishPolicy\",\n      \"archivePolicy\",\n      \"createPolicyVersion\",\n      \"getActivePolicies\",\n      \"getPoliciesByCategory\",\n      \"getPolicyAcknowledgements\",\n      \"getPolicyAcknowledgement\",\n      \"createPolicyAcknowledgement\",\n      \"updatePolicyAcknowledgement\",\n      \"acknowledgePolicy\",\n      \"declinePolicy\",\n      \"waiveAcknowledgement\",\n      \"sendReminder\",\n      \"getEmployeeAcknowledgements\",\n      \"getPendingAcknowledgementsByPolicy\",\n      \"assignPolicyToEmployees\",\n      \"getDocumentsMetrics\"\n    ]\n  },\n  {\n    \"service\": \"OffboardingService\",\n    \"description\": \"Offboarding workflow — termination checklist, equipment return, access revocation, final pay, exit interviews, and offboarding metrics.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"getOffboardings\",\n      \"getOffboarding\",\n      \"createOffboarding\",\n      \"updateOffboarding\",\n      \"deleteOffboarding\",\n      \"startOffboarding\",\n      \"completeChecklistTask\",\n      \"markTaskNotApplicable\",\n      \"recordEquipmentReturn\",\n      \"revokeAccess\",\n      \"processFinalPay\",\n      \"completeOffboarding\",\n      \"cancelOffboarding\",\n      \"getActiveOffboardings\",\n      \"getExitInterviews\",\n      \"getExitInterview\",\n      \"createExitInterview\",\n      \"updateExitInterview\",\n      \"scheduleExitInterview\",\n      \"conductExitInterview\",\n      \"declineExitInterview\",\n      \"addActionItem\",\n      \"getOffboardingMetrics\"\n    ]\n  },\n  {\n    \"service\": \"OnboardingService\",\n    \"description\": \"Staff onboarding — HR-driven new-hire checklist (profile, W-4, pay method, handbook ack, offer letter, I-9) tracked inline on the employee record. Finalizing flips the employee to active.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"startOnboarding\",\n      \"getOnboarding\",\n      \"listOnboardings\",\n      \"completeItem\",\n      \"skipItem\",\n      \"completeOnboarding\",\n      \"cancelOnboarding\"\n    ]\n  },\n  {\n    \"service\": \"VendorService\",\n    \"description\": \"Vendor (supplier/payee) master records.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"delete\"\n    ]\n  },\n  {\n    \"service\": \"BillService\",\n    \"description\": \"Accounts Payable — vendor bills, bill payments, and AP aging reports.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"delete\",\n      \"approve\",\n      \"void\",\n      \"listPayments\",\n      \"recordPayment\",\n      \"aging\"\n    ]\n  },\n  {\n    \"service\": \"BooksService\",\n    \"description\": \"Books facade — chart of accounts, journal entries, general ledger, AR/AP overview.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"listAccounts\",\n      \"getAccount\",\n      \"createAccount\",\n      \"updateAccount\",\n      \"listJournals\",\n      \"getJournal\",\n      \"createJournal\",\n      \"postJournal\",\n      \"ledger\",\n      \"overview\",\n      \"arOpen\"\n    ]\n  },\n  {\n    \"service\": \"ReportsService\",\n    \"description\": \"Financial reports — Profit & Loss, Balance Sheet, Cash Flow (indirect), Trial Balance, and per-location performance roll-up. Multi-location aware.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"profitAndLoss\",\n      \"balanceSheet\",\n      \"cashFlow\",\n      \"trialBalance\",\n      \"locationPerformance\"\n    ]\n  },\n  {\n    \"service\": \"PeriodCloseService\",\n    \"description\": \"Period close workflow — bookkeeper checklist for monthly/quarterly close (reconcile bank/AR/AP/payroll, accruals, lock period).\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"defaultChecklist\",\n      \"list\",\n      \"get\",\n      \"start\",\n      \"toggleItem\",\n      \"lock\",\n      \"reopen\"\n    ]\n  },\n  {\n    \"service\": \"BudgetService\",\n    \"description\": \"Budgets — fiscal-year budget records and budget-vs-actual variance reporting.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"delete\",\n      \"variance\"\n    ]\n  },\n  {\n    \"service\": \"SetupService\",\n    \"description\": \"One-shot org seeding — locations, vendors, chart of accounts, product attributes, and workflows. All seeders are idempotent.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"seedLocations\",\n      \"seedVendors\",\n      \"seedChartOfAccounts\",\n      \"seedProductAttributes\",\n      \"seedAll\"\n    ]\n  },\n  {\n    \"service\": \"EarningTypeService\",\n    \"description\": \"Earning-type catalog (Regular, Overtime, Holiday, Bonus, Commission, Tips, ...) — definitions used by the payroll run engine.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"listActive\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"delete\",\n      \"seedStandard\"\n    ]\n  },\n  {\n    \"service\": \"DeductionTypeService\",\n    \"description\": \"Deduction-type catalog (401k, health premiums, loans, garnishments, etc.) — definitions used by the payroll run engine.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"listActive\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"delete\",\n      \"seedStandard\"\n    ]\n  },\n  {\n    \"service\": \"EmployeeDeductionService\",\n    \"description\": \"Per-employee deduction assignments — links employees to deduction-type catalog with overrides, loan balances, YTD tracking.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"listActiveByEmployee\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"pause\",\n      \"resume\",\n      \"cancel\",\n      \"applyWithdrawal\",\n      \"delete\"\n    ]\n  },\n  {\n    \"service\": \"TaxRuleService\",\n    \"description\": \"Tax-rule catalog — federal, FICA, state, local rates and brackets used by the payroll run engine. Includes a US standard seeder.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"list\",\n      \"listForEmployee\",\n      \"get\",\n      \"create\",\n      \"update\",\n      \"delete\",\n      \"importTaxRules\",\n      \"getStateCoverage\",\n      \"seedStandardUS\"\n    ]\n  },\n  {\n    \"service\": \"EmployeeImportService\",\n    \"description\": \"Employee bulk-import — upserts employees + payroll profiles from row arrays.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"bulkImport\"\n    ]\n  },\n  {\n    \"service\": \"PayrollRunEngineService\",\n    \"description\": \"Payroll run engine — preview a pay period (no writes) or execute it (persists pay stubs, run header, YTDs, loan-balance decrements).\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"preview\",\n      \"execute\",\n      \"persistComputedStubs\"\n    ]\n  },\n  {\n    \"service\": \"PayrollAchService\",\n    \"description\": \"Payroll → ACH bridge — for an executed payroll run, creates bank_transfer records for direct-deposit recipients and generates a NACHA file the operator can upload.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"generateForRun\"\n    ]\n  },\n  {\n    \"service\": \"PayStubPdfService\",\n    \"description\": \"Pay stub PDF generator — renders a one-page PDF for a bm_pay_stub, persists it via the file provider, and writes the fileInfo back onto the stub.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"generate\",\n      \"getBytes\",\n      \"generateForRun\"\n    ]\n  },\n  {\n    \"service\": \"TaxFormService\",\n    \"description\": \"Tax-form generation — substitute W-2 (employees) and 1099-NEC (contractors). Aggregates pay stubs by tax year, renders PDF, persists bm_tax_form records.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"generateW2\",\n      \"generate1099Nec\",\n      \"generateYearEndBatch\",\n      \"getBytes\",\n      \"list\"\n    ]\n  },\n  {\n    \"service\": \"EmployerFilingService\",\n    \"description\": \"Employer regulatory filings — Form 941 (quarterly), Form 940 (annual FUTA), W-3 and 1096 transmittals, and state quarterly wage reports. Each yields a substitute PDF plus a structured e-file export, persisted as bm_tax_form.\",\n    \"group\": \"business-made\",\n    \"methods\": [\n      \"generate941\",\n      \"generate940\",\n      \"generateW3\",\n      \"generate1096\",\n      \"generateStateQuarterly\",\n      \"getBytes\"\n    ]\n  }\n]"
          }
        ],
        "isError": false
      }
    }
  },
  "description": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 3,
      "result": {
        "content": [
          {
            "type": "text",
            "text": "[\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"requestApproval\",\n    \"description\": \"Move a record into workflow approval: marks it pending and emits a `request-approval` workflow command. Requires the collection to have enableWorkflow=true.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"The record (with updated workflow.status).\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"approve\",\n    \"description\": \"Approve a pending record via the workflow command bus.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"true on success.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"reject\",\n    \"description\": \"Reject a pending record via the workflow command bus.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"true on success.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"isUnique\",\n    \"description\": \"Check whether a value is unique on a given attribute. Honours collection schema property `uniqueScope` (single field or array) — when set, scopeValue must also be supplied. For `collection` datatype, also fuzzy-matches name.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype to search.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"attribute\",\n        \"type\": \"String\",\n        \"description\": \"Field name to check for uniqueness.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"value\",\n        \"type\": \"Object\",\n        \"description\": \"Value to check.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"scopeValue\",\n        \"type\": \"Object\",\n        \"description\": \"Required when the property has uniqueScope set.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"sk of the existing record (truthy = NOT unique), or undefined when the value is unused.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"getPartial\",\n    \"description\": \"Read a subset of fields off a record (provider-level projection).\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"fields\",\n        \"type\": \"Array\",\n        \"description\": \"Field names to include.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Partial record.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findOne\",\n    \"description\": \"Find a record by sk (must be a valid ObjectId). Optionally enriches type-specific related data.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk (ObjectId).\",\n        \"required\": true\n      },\n      {\n        \"name\": \"enrich\",\n        \"type\": \"Object\",\n        \"description\": \"Whether to apply enrichment.\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"BaseModel or null.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findOneAnyId\",\n    \"description\": \"Find a record by any natural identifier — username, email, slug, name, sku, number, or sk/_id (case-insensitive). Returns the first match; warns if multiple were found.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"dataId\",\n        \"type\": \"String\",\n        \"description\": \"Identifier value.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions including enrich flag.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModel or undefined.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findByAttribute\",\n    \"description\": \"Find records matching attribute = value (or list all of a datatype when both omitted). Optionally enriches.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"attribute\",\n        \"type\": \"String\",\n        \"description\": \"Field name.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"value\",\n        \"type\": \"String\",\n        \"description\": \"Field value.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO with matching records.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findTimedData\",\n    \"description\": \"Find records of one or more time-anchored datatypes (event/reservation/task/sf_subscription/schedule) overlapping a date range. Defaults to the next 30 days when endDate is omitted.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"startDate\",\n        \"type\": \"Object\",\n        \"description\": \"ISO date or Date — defaults to now.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"endDate\",\n        \"type\": \"Object\",\n        \"description\": \"ISO date or Date — defaults to startDate + 30 days.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatypes\",\n        \"type\": \"Object\",\n        \"description\": \"Single datatype, comma string, or array. Defaults to all five.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Map keyed by datatype → BaseModelDTO.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findPageData\",\n    \"description\": \"Power site/storefront page queries: resolves either a specific record (by slug/name/sk) or builds a filtered listing across categories, tags, attribute filters (price ranges, keyword Elastic queries) for a \\\"collection-subSchema\\\" pair.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"dataTypeTemp\",\n        \"type\": \"String\",\n        \"description\": \"\\\"collection-subSchema\\\" string (or just \\\"collection\\\").\",\n        \"required\": true\n      },\n      {\n        \"name\": \"dataId\",\n        \"type\": \"String\",\n        \"description\": \"Record id/slug for single-record fetch (skip filters when provided).\",\n        \"required\": true\n      },\n      {\n        \"name\": \"attributes\",\n        \"type\": \"Object\",\n        \"description\": \"Filter map (or JSON string) of attribute → value, including special \\\"price\\\" range.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"keyword\",\n        \"type\": \"String\",\n        \"description\": \"Optional free-text keyword (routes through ElasticSearch query shape).\",\n        \"required\": true\n      },\n      {\n        \"name\": \"categories\",\n        \"type\": \"Object\",\n        \"description\": \"Single string, CSV, or array of category names.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"tags\",\n        \"type\": \"Object\",\n        \"description\": \"Single string, CSV, or array of tag names.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO of matching records.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findRelated\",\n    \"description\": \"Find related records (same datatype) by overlapping post.categories or post.tags of a primary record resolved through findOneAnyId.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"anyId\",\n        \"type\": \"String\",\n        \"description\": \"Identifier of the primary record.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO of related records (or [] when primary has no taxonomy).\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"find\",\n    \"description\": \"Generic find: paginated query against a datatype with optional enrichment.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"query\",\n        \"type\": \"Object\",\n        \"description\": \"Mongo or ES query body.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions (page, pageSize, sort, enrich, ...).\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"BaseModelDTO.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findExperts\",\n    \"description\": \"Find experts in the configured shared org (`appmint-expert` collection).\",\n    \"params\": [\n      {\n        \"name\": \"keyword\",\n        \"type\": \"String\",\n        \"description\": \"Search keyword.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO of expert profiles.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findAsset\",\n    \"description\": \"Find shared assets (templates, components) — runs against the configured SHARED_ORG instead of the caller's org.\",\n    \"params\": [\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype in the shared org.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"query\",\n        \"type\": \"Object\",\n        \"description\": \"Mongo query.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"searchAsset\",\n    \"description\": \"Free-text search shared assets (delegates to search() against SHARED_ORG).\",\n    \"params\": [\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"keyword\",\n        \"type\": \"Object\",\n        \"description\": \"Search keyword.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"query\",\n        \"type\": \"Object\",\n        \"description\": \"Optional Mongo filter.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"deleteAssets\",\n    \"description\": \"Delete one or more shared/in-org assets. For component-style datatypes the underlying record is `flexdata`; for template datatypes the underlying record is `fileinfo` and the file payload is also removed.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"Object\",\n        \"description\": \"Org id (overridden to SHARED_ORG for component/tag-template).\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Asset datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"ids\",\n        \"type\": \"Object\",\n        \"description\": \"Single id or array.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"true.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"updateAsset\",\n    \"description\": \"Update an asset record — flexdata for component-style, fileinfo (and the underlying file payload) for template-style.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"Object\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Asset datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"Object\",\n        \"description\": \"Asset id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"data\",\n        \"type\": \"Object\",\n        \"description\": \"Update payload.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"void.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"getDataTypeCategories\",\n    \"description\": \"Look up the `category` record whose name matches a datatype — used for taxonomy headers.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Category BaseModel or undefined.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"getTags\",\n    \"description\": \"List the org's tag vocabulary from the `tag` collection, projected to sk/name/value, optionally filtered by a keyword matched anywhere in the tag name. Returns every match rather than a page — callers use this to populate tag pickers, and find() would otherwise cap it at 50. Uniqueness is enforced on the way in by addTag, so the list is already free of duplicates.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"keyword\",\n        \"type\": \"String\",\n        \"description\": \"Optional search — matches anywhere in the tag name. Omit for the whole vocabulary.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO of matching tag records, sorted by name, carrying only sk/name/value.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"addTag\",\n    \"description\": \"Add a tag to the org's tag vocabulary. This is what keeps the collection free of duplicates: a tag whose name already exists (case-insensitive) is returned as-is instead of creating a second record, so reads never have to de-duplicate.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"tag\",\n        \"type\": \"Object\",\n        \"description\": \"{ name (required), value? }. Name is stored lower-case; value defaults to it.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"author\",\n        \"type\": \"Object\",\n        \"description\": \"Author label.\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"The created or already-existing tag record.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"findByTag\",\n    \"description\": \"Provider-level multi-tag query.\",\n    \"params\": [\n      {\n        \"name\": \"orgId\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"tags\",\n        \"type\": \"Array\",\n        \"description\": \"Array of tag names.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"BaseModelDTO.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"search\",\n    \"description\": \"Free-text search via the provider. Falls back to find() when keyword is empty. Auto-recovers from \\\"text index required\\\" by calling fixCollection once and retrying.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype to search (defaults to site_index when empty).\",\n        \"required\": true\n      },\n      {\n        \"name\": \"keyword\",\n        \"type\": \"Object\",\n        \"description\": \"Search keyword.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"query\",\n        \"type\": \"Object\",\n        \"description\": \"Mongo filter to AND with the text query.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"options\",\n        \"type\": \"Object\",\n        \"description\": \"DataOptions.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"tries\",\n        \"type\": \"Object\",\n        \"description\": \"Internal retry counter.\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"BaseModelDTO.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"createNoChecks\",\n    \"description\": \"Insert a record bypassing all collection/workflow/schedule pre/post processing — used by bulk import, history rewrite, and migration.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"data\",\n        \"type\": \"Object\",\n        \"description\": \"BaseModel to insert.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"returnObject\",\n        \"type\": \"Object\",\n        \"description\": \"When true, returns the inserted object.\",\n        \"required\": false\n      },\n      {\n        \"name\": \"uniqueFields\",\n        \"type\": \"Array\",\n        \"description\": \"Optional unique-field guard.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Inserted record (when returnObject=true) or provider-shaped result.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"createExtended\",\n    \"description\": \"Custom create variants. Currently supports `create-page-from-template`: clones a page from the configured SHARED_ORG into the caller's org with a unique name/slug suffix.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"createData\",\n        \"type\": \"Object\",\n        \"description\": \"{ data, action, options }.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"created_by\",\n        \"type\": \"Object\",\n        \"description\": \"Author label.\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"Created record (delegates to create()).\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"create\",\n    \"description\": \"Create a record with full pipeline: collection lookup, datatype guards (company/reservation/event/user/customer use dedicated services), workflow + schedule materialisation, system events, Stripe/PayPal hookups for subscription plans. Drops duplicate calls (same payload) defensively.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"data\",\n        \"type\": \"Object\",\n        \"description\": \"BaseModel to create. Must include datatype + non-empty data.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"created_by\",\n        \"type\": \"Object\",\n        \"description\": \"Author label (defaults \\\"system\\\").\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"Created record with id resolved.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"update\",\n    \"description\": \"Update a record with full pipeline: caller-source guards, history versioning + activity logging, workflow stage reset, schedule re-link, Stripe/PayPal subscription-plan upstream sync, COLLECTION_UPDATE event.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"data\",\n        \"type\": \"Object\",\n        \"description\": \"BaseModel with mutated fields.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"modified_by\",\n        \"type\": \"Object\",\n        \"description\": \"Author label (defaults \\\"system\\\").\",\n        \"required\": false\n      }\n    ],\n    \"returns\": \"Updated record.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"updatePartial\",\n    \"description\": \"Provider-level partial update — sets the provided dotted-path key/value pairs without going through the full update pipeline.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"Object\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"keyValuePair\",\n        \"type\": \"Object\",\n        \"description\": \"Map of dotted path → new value.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"updateBy\",\n        \"type\": \"String\",\n        \"description\": \"Audit label (currently informational).\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Provider-shaped update result.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"updateSystemFields\",\n    \"description\": \"Restricted partial update for BaseModel wrapper fields (notes, stats, workflow, state, owner, requiredRole, post, style, name, etc.). Cannot touch `data` or `data.*`.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"Object\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"keyValuePair\",\n        \"type\": \"Object\",\n        \"description\": \"Map of dotted path → new value. Top-level segment must be a whitelisted system field.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"updateBy\",\n        \"type\": \"String\",\n        \"description\": \"Audit label.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Provider-shaped update result.\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"publish\",\n    \"description\": \"Publish a page or post: copies the source into the `published` collection and bumps state. No-op for any other datatype.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"page or post.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"\\\"published\\\" / \\\"already published\\\".\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"unpublish\",\n    \"description\": \"Unpublish a page or post: removes the corresponding `published` row and resets the source state to draft.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"page or post.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"String\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"\\\"unpublished\\\".\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"delete\",\n    \"description\": \"Delete a record with full cascade: cancels owned tasks/activities/published/history, fires SendNotificationCommand for messages, emits COLLECTION_DELETE, cancels owned schedules, writes a TrashCreateCommand for restore, then provider-deletes the record.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"id\",\n        \"type\": \"Object\",\n        \"description\": \"Record sk.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"silent\",\n        \"type\": \"Object\",\n        \"description\": \"Skip cascades + events when true.\",\n        \"required\": false\n      },\n      {\n        \"name\": \"deletedBy\",\n        \"type\": \"String\",\n        \"description\": \"Audit label.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"void (provider-shaped).\",\n    \"group\": \"repository\"\n  },\n  {\n    \"service\": \"RepositoryCrudService\",\n    \"method\": \"deleteBulk\",\n    \"description\": \"Iterate `delete()` over a list of ids, swallowing per-id errors. Returns a per-id success/error report.\",\n    \"params\": [\n      {\n        \"name\": \"orgid\",\n        \"type\": \"String\",\n        \"description\": \"Org id.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"datatype\",\n        \"type\": \"String\",\n        \"description\": \"Datatype.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"uids\",\n        \"type\": \"Array\",\n        \"description\": \"Array of record sks.\",\n        \"required\": true\n      },\n      {\n        \"name\": \"deletedBy\",\n        \"type\": \"String\",\n        \"description\": \"Audit label.\",\n        \"required\": true\n      }\n    ],\n    \"returns\": \"Array of `{ id, success?, error? }`.\",\n    \"group\": \"repository\"\n  }\n]"
          }
        ],
        "isError": false
      }
    }
  },
  "booking": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 4,
      "result": {
        "content": [
          {
            "type": "text",
            "text": "{\n  \"_id\": \"6ab4db2df573f9dab8fbf435\",\n  \"pk\": \"learner-recovery-mubo2g1c|reservation\",\n  \"sk\": \"6ab4db2df573f9dab8fbf435\",\n  \"name\": \"ZK0EFBML\",\n  \"datatype\": \"reservation\",\n  \"data\": {\n    \"reservationDefinitionId\": \"6ab4db2df573f9dab8fbf434\",\n    \"service\": \"Design consultation\",\n    \"startTime\": \"2026-10-05T10:00:00-05:00\",\n    \"endTime\": \"2026-10-05T10:30:00-05:00\",\n    \"customer\": {\n      \"email\": \"noah.ai-review.20260924@example.invalid\",\n      \"name\": \"Noah Tutorial\",\n      \"phone\": null,\n      \"id\": \"6ab4db2df573f9dab8fbf430\"\n    },\n    \"partySize\": 1,\n    \"name\": \"ZK0EFBML\",\n    \"customerId\": \"6ab4db2df573f9dab8fbf430\",\n    \"status\": \"new\",\n    \"timezone\": \"America/Chicago\",\n    \"locationType\": \"physical\",\n    \"address\": \"Training venue\",\n    \"meetingInfo\": \"\",\n    \"meetingLink\": \"\"\n  },\n  \"version\": 0,\n  \"author\": \"noah.ai-review.20260924@example.invalid\",\n  \"created_by\": \"noah.ai-review.20260924@example.invalid\",\n  \"state\": \"draft\",\n  \"createdate\": \"2026-09-24T08:11:25.963Z\",\n  \"modifydate\": \"2026-09-24T08:11:25.963Z\",\n  \"search\": \"6ab4db2df573f9dab8fbf434 Design consultation 2026 10 05T10 00 00 05 00 2026 10 05T10 30 00 05 00 noah ai review 20260924 example invalid Noah Tutorial 6ab4db2df573f9dab8fbf430 1 ZK0EFBML 6ab4db2df573f9dab8fbf430 new America Chicago physical Training venue\"\n}"
          }
        ],
        "isError": false
      }
    }
  },
  "anonymous": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 5,
      "result": {
        "content": [
          {
            "type": "text",
            "text": "Authentication required: send an Authorization: Bearer <token> header to call a service. list_services and describe_service work without one."
          }
        ],
        "isError": true
      }
    }
  },
  "noOrg": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 6,
      "result": {
        "content": [
          {
            "type": "text",
            "text": "Authentication required: send an Authorization: Bearer <token> header to call a service. list_services and describe_service work without one."
          }
        ],
        "isError": true
      }
    }
  },
  "notExposed": {
    "status": 200,
    "body": {
      "jsonrpc": "2.0",
      "id": 7,
      "result": {
        "content": [
          {
            "type": "text",
            "text": "Method tutorialNotExposed on RepositoryCrudService is not @AiCallable (or does not exist)"
          }
        ],
        "isError": true
      }
    }
  }
}