@warmio/contracts 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +3 -3
  2. package/dist/api/endpoints.d.ts +34 -48
  3. package/dist/api/endpoints.d.ts.map +1 -1
  4. package/dist/api/endpoints.js +36 -56
  5. package/dist/api/endpoints.js.map +1 -1
  6. package/dist/generated/base-openapi.d.ts +1 -1
  7. package/dist/generated/base-openapi.d.ts.map +1 -1
  8. package/dist/generated/base-openapi.js +1 -1
  9. package/dist/generated/base-openapi.js.map +1 -1
  10. package/dist/generated/mcp-package-release-metadata.d.ts +7 -0
  11. package/dist/generated/mcp-package-release-metadata.d.ts.map +1 -0
  12. package/dist/generated/mcp-package-release-metadata.js +7 -0
  13. package/dist/generated/mcp-package-release-metadata.js.map +1 -0
  14. package/dist/generated/private-mcp-tool-descriptors.d.ts +0 -38
  15. package/dist/generated/private-mcp-tool-descriptors.d.ts.map +1 -1
  16. package/dist/generated/private-mcp-tool-descriptors.js +0 -46
  17. package/dist/generated/private-mcp-tool-descriptors.js.map +1 -1
  18. package/dist/generated/warm-app-api-manifest.d.ts +1230 -0
  19. package/dist/generated/warm-app-api-manifest.d.ts.map +1 -0
  20. package/dist/generated/warm-app-api-manifest.js +1841 -0
  21. package/dist/generated/warm-app-api-manifest.js.map +1 -0
  22. package/dist/index.d.ts +0 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +0 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/manifest.d.ts +434 -1185
  27. package/dist/manifest.d.ts.map +1 -1
  28. package/dist/manifest.js +21 -34
  29. package/dist/manifest.js.map +1 -1
  30. package/dist/mcp/distribution.d.ts +221 -71
  31. package/dist/mcp/distribution.d.ts.map +1 -1
  32. package/dist/mcp/distribution.js +41 -47
  33. package/dist/mcp/distribution.js.map +1 -1
  34. package/dist/mcp/tools.d.ts +1 -4
  35. package/dist/mcp/tools.d.ts.map +1 -1
  36. package/dist/mcp/tools.js +0 -20
  37. package/dist/mcp/tools.js.map +1 -1
  38. package/dist/openapi/base.yaml +33 -59
  39. package/dist/openapi/build-openapi.d.ts +1 -0
  40. package/dist/openapi/build-openapi.d.ts.map +1 -1
  41. package/dist/openapi/build-openapi.js +75 -16
  42. package/dist/openapi/build-openapi.js.map +1 -1
  43. package/dist/schemas/index.d.ts +1 -0
  44. package/dist/schemas/index.d.ts.map +1 -1
  45. package/dist/schemas/index.js +1 -0
  46. package/dist/schemas/index.js.map +1 -1
  47. package/dist/schemas/public-api.d.ts +1350 -0
  48. package/dist/schemas/public-api.d.ts.map +1 -0
  49. package/dist/schemas/public-api.js +175 -0
  50. package/dist/schemas/public-api.js.map +1 -0
  51. package/package.json +1 -8
  52. package/dist/public-discovery.d.ts +0 -116
  53. package/dist/public-discovery.d.ts.map +0 -1
  54. package/dist/public-discovery.js +0 -91
  55. package/dist/public-discovery.js.map +0 -1
@@ -1,2 +1,2 @@
1
- export declare const baseOpenApiYaml = "openapi: 3.1.0\ninfo:\n title: Warm API\n description: |\n Read your financial context or invoke supported Warm actions through a compact operation catalog.\n\n ## Authentication\n All requests use `Authorization: Bearer`. API keys are created for either read-only context\n access or automation access in Settings on paid Warm plans.\n\n Read/export routes accept `Authorization: Bearer YOUR_API_KEY_OR_ACCESS_TOKEN`.\n Automation routes require an automation key (`warm_auto_...`) and do not accept access tokens.\n\n Unauthenticated responses include `WWW-Authenticate` guidance and protected resource metadata.\n\n ## Rate Limits\n - Context keys: 200 requests per hour per key\n - Automation keys: 500 requests per hour per key\n - Rate limit headers included in authenticated responses\n - `/api/export` supports dataset-scoped delta sync with `since` and publishes edge-cache metadata headers\n version: '2.0.0'\n contact:\n name: Warm Support\n url: https://warm.io/support\n license:\n name: Proprietary\n url: https://warm.io/terms\n\nservers:\n - url: https://app.warm.io\n description: Production\n\nsecurity:\n - BearerAuth: []\n\npaths:\n /api/verify:\n get:\n operationId: verifyApiAccess\n summary: Verify API credentials\n description: |\n Validate a Warm API key or signed-in user access token against the public verification route.\n\n This endpoint is the canonical readiness check for public API clients and discovery tools.\n tags:\n - Verification\n responses:\n '200':\n description: Credentials are valid and the caller has API access\n content:\n application/json:\n schema:\n type: object\n required:\n - status\n - valid\n - auth\n properties:\n status:\n type: string\n enum: [ok]\n valid:\n type: boolean\n auth:\n type: string\n description: Auth method used to satisfy verification\n audience:\n type: string\n enum: [context, automation, oauth]\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/export:\n get:\n operationId: getDatasetExport\n summary: Get a typed dataset export\n description: |\n Fetch a canonical financial dataset export from the unified `/api/export` surface.\n\n Use `dataset=transactions` for paginated transaction history. Other datasets return\n a typed JSON object keyed by the dataset name or retained public alias.\n\n Preferred dataset names are `accounts`, `transactions`, `snapshots`, `recurring`,\n `budgets`, `goals`, `health`, `liabilities`, and `holdings`.\n tags:\n - Export\n parameters:\n - name: dataset\n in: query\n description: Dataset identifier or retained public alias\n required: true\n schema:\n type: string\n enum:\n - accounts\n - transactions\n - snapshots\n - recurring\n - budgets\n - goals\n - health\n - liabilities\n - holdings\n - name: since\n in: query\n description: ISO timestamp for incremental exports\n required: false\n schema:\n type: string\n format: date-time\n - name: last_knowledge\n in: query\n description: Legacy alias for `since`\n required: false\n schema:\n type: string\n format: date-time\n - name: limit\n in: query\n description: Maximum transactions per page when `dataset=transactions`\n required: false\n schema:\n type: integer\n minimum: 1\n maximum: 1000\n - name: cursor\n in: query\n description: Pagination token from `pagination.next_cursor` when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: accountId\n in: query\n description: Optional account filter when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: search\n in: query\n description: Optional merchant or description search filter when `dataset=transactions`\n required: false\n schema:\n type: string\n minLength: 1\n maxLength: 120\n responses:\n '200':\n description: Successful dataset export\n content:\n application/json:\n schema:\n type: object\n description: Dataset-shaped JSON response keyed by the requested dataset\n properties:\n generated_at:\n type: string\n format: date-time\n next_knowledge:\n type: string\n format: date-time\n nullable: true\n pagination:\n $ref: '#/components/schemas/Pagination'\n additionalProperties: true\n '400':\n description: Invalid query parameters\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context:\n get:\n operationId: getFinancialContext\n summary: Get compact financial context\n description: |\n Fetch the current compact FinancialContext artifact for the authenticated user.\n\n This response does not include transaction items. Use\n `/api/financial-context/transactions` for month-addressed transaction pages or the\n fixed 10-day latest transaction window.\n tags:\n - Export\n responses:\n '200':\n description: Compact FinancialContext artifact\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContext'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/transactions:\n get:\n operationId: getFinancialContextTransactions\n summary: Get financial-context transactions\n description: |\n Fetch one transaction month or the fixed 10-day latest transaction window from the\n current financial-context artifact.\n\n The raw API requires exactly one selector: `month=YYYY-MM` or `latest=1`.\n Bare calls are invalid on the raw API. The current `@warmio/mcp` `get_transactions` tool\n accepts one required `period` string: `latest` for the fixed latest window or `YYYY-MM`\n for a month. It does not accept cursor, search, or `last_knowledge`.\n Transaction amounts use the Warm/Plaid sign convention:\n positive = expense/debit, negative = income/credit.\n\n A well-formed month inside the covered range with no matching items returns `200` with\n `count: 0` and `items: []`. Months before the earliest indexed month or after the latest\n covered month return `404`.\n tags:\n - Export\n parameters:\n - name: month\n in: query\n description: Transaction month selector in YYYY-MM format. Mutually exclusive with `latest`.\n required: false\n schema:\n type: string\n pattern: '^\\d{4}-(0[1-9]|1[0-2])$'\n example: '2026-07'\n - name: latest\n in: query\n description: Set to `1` for the fixed 10-day latest transaction window.\n required: false\n schema:\n type: string\n enum: ['1']\n responses:\n '200':\n description: Transaction month page or latest transaction window\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n oneOf:\n - $ref: '#/components/schemas/TransactionMonth'\n - $ref: '#/components/schemas/LatestTransactions'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '400':\n description: Missing selectors, mutually exclusive selectors, malformed `month`, or `latest` other than `1`\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/meta:\n get:\n operationId: getFinancialContextMeta\n summary: Get financial-context metadata\n description: |\n Fetch operational metadata for the current financial-context artifact, including the\n content hash used as the ETag, byte length, row counts, and freshness timestamps.\n `content_hash` is the public artifact version token; this metadata does not expose a\n public `data_version`.\n tags:\n - Export\n responses:\n '200':\n description: Financial-context metadata\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContextMeta'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/automation/operations/search:\n post:\n operationId: searchOperations\n summary: Search supported automation operations\n tags: [Automation]\n security:\n - AutomationKeyAuth: []\n requestBody:\n required: false\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n properties:\n query:\n type: string\n maxLength: 200\n responses:\n '200':\n description: Matching operations\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operations]\n properties:\n operations:\n type: array\n items:\n $ref: '#/components/schemas/AutomationOperation'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '400':\n $ref: '#/components/responses/BadRequest'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/describe:\n post:\n operationId: describeOperation\n summary: Describe one operation and request owner approval when required\n tags: [Automation]\n security:\n - AutomationKeyAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationRequest'\n responses:\n '200':\n description: Operation schema and optional pending owner approval\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operation]\n properties:\n operation:\n allOf:\n - $ref: '#/components/schemas/AutomationOperation'\n - type: object\n properties:\n input_schema:\n type: object\n approval:\n type: object\n additionalProperties: false\n required: [id, status, approval_url, expires_at]\n properties:\n id: { type: string, format: uuid }\n status: { type: string, enum: [pending] }\n approval_url: { type: string, format: uri }\n expires_at: { type: string, format: date-time }\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/invoke:\n post:\n operationId: invokeOperation\n summary: Invoke one supported operation\n tags: [Automation]\n security:\n - AutomationKeyAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationInvokeRequest'\n responses:\n '200':\n description: Wrapped response from the invoked operation\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/AutomationInvocationResponse'\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '409':\n description: Owner approval is required, invalid, expired, or already used\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\ncomponents:\n securitySchemes:\n BearerAuth:\n type: http\n scheme: bearer\n description: 'Read/export format: `Authorization: Bearer YOUR_API_KEY_OR_ACCESS_TOKEN`'\n AutomationKeyAuth:\n type: http\n scheme: bearer\n description: 'Automation format: `Authorization: Bearer warm_auto_...`'\n\n headers:\n ETag:\n description: Quoted content hash for If-None-Match revalidation\n schema:\n type: string\n example: '\"7b6f9d4c...\"'\n PrivateNoStore:\n description: Private financial responses are not stored by browsers or shared caches\n schema:\n type: string\n example: private, no-store\n\n responses:\n BadRequest:\n description: The request body or operation input is invalid\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Unauthorized:\n description: Missing or invalid credentials\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Forbidden:\n description: The caller is authenticated but does not have API access\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n NotFound:\n description: The requested operation does not exist\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n InternalError:\n description: The request could not be completed safely\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n PayloadTooLarge:\n description: The response would exceed the public API response-size limit\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n RateLimited:\n description: Hourly per-credential rate limit exceeded\n headers:\n Retry-After:\n description: Seconds until the rate-limit window resets\n schema:\n type: integer\n example: 3600\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n\n schemas:\n AutomationOperation:\n type: object\n additionalProperties: false\n required: [operation_id, summary, description, method, path, risk, confirmation_required]\n properties:\n operation_id: { type: string }\n summary: { type: string }\n description: { type: string }\n method: { type: string, enum: [GET, POST, PATCH, PUT, DELETE] }\n path: { type: string }\n risk:\n type: array\n items: { type: string, enum: [read, write, destructive, external_effect] }\n confirmation_required: { type: boolean }\n OperationRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n OperationInvokeRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n approval_id:\n type: string\n format: uuid\n description: Matching owner approval required for every write operation\n OperationInput:\n type: object\n additionalProperties: false\n properties:\n params: { type: object, additionalProperties: { type: string } }\n body: { type: object, additionalProperties: true }\n AutomationInvocationResponse:\n type: object\n additionalProperties: false\n required: [body, headers, operation_id, status]\n properties:\n body: {}\n headers:\n type: object\n additionalProperties: { type: string }\n operation_id: { type: string }\n status: { type: integer, minimum: 100, maximum: 599 }\n ExportResponse:\n type: object\n required:\n - schema_version\n - generated_at\n - user_id\n - data_version\n - next_knowledge\n - accounts\n - transactions\n - snapshots\n - pagination\n properties:\n schema_version:\n type: string\n description: API schema version\n example: v1\n generated_at:\n type: string\n format: date-time\n description: Response generation timestamp\n example: '2026-01-10T15:30:00Z'\n user_id:\n type: string\n format: uuid\n description: Your user ID\n example: a1b2c3d4-e5f6-7890-abcd-ef1234567890\n data_version:\n type: integer\n description: Monotonic version number (increments on data changes)\n example: 42\n next_knowledge:\n type: string\n format: date-time\n description: Use as `last_knowledge` in next request for delta sync\n example: '2026-01-10T15:30:00Z'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/Account'\n transactions:\n type: array\n items:\n $ref: '#/components/schemas/Transaction'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/Snapshot'\n pagination:\n $ref: '#/components/schemas/Pagination'\n\n Account:\n type: object\n required:\n - id\n - name\n - type\n - current_balance\n - iso_currency_code\n - is_active\n properties:\n id:\n type: string\n format: uuid\n description: Unique account identifier\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n account_id:\n type: string\n description: External account ID (from Plaid)\n example: plaid_acc_ABC123xyz\n name:\n type: string\n description: Display name with masked account number\n example: 'Checking ****1234'\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n description: Account type\n example: depository\n subtype:\n type: string\n description: Specific subtype\n example: checking\n enum:\n - checking\n - savings\n - money market\n - cd\n - credit card\n - mortgage\n - student\n - auto\n - 401k\n - ira\n - brokerage\n - other\n current_balance:\n type: number\n description: Current balance (positive for assets)\n example: 5420.50\n available_balance:\n type: number\n nullable: true\n description: Available balance (may differ from current)\n example: 5320.50\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n mask:\n type: string\n description: Last 4 digits of account number\n example: '1234'\n is_active:\n type: boolean\n description: Whether account is actively syncing\n example: true\n created_at:\n type: string\n format: date-time\n example: '2025-06-15T10:00:00Z'\n updated_at:\n type: string\n format: date-time\n example: '2026-01-10T12:00:00Z'\n\n Transaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - name\n - primary_category\n - detailed_category\n - pending\n - iso_currency_code\n properties:\n id:\n type: string\n format: uuid\n description: Unique transaction identifier\n example: txn_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d\n transaction_id:\n type: string\n description: External transaction ID (from Plaid)\n example: plaid_txn_XYZ789abc\n account_id:\n type: string\n format: uuid\n description: Parent account ID\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n date:\n type: string\n format: date\n description: Posted date\n example: '2026-01-09'\n authorized_date:\n type: string\n format: date\n nullable: true\n description: Authorization date (if different)\n example: '2026-01-08'\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n example: 42.50\n name:\n type: string\n description: Raw transaction description from bank\n example: 'TRADER JOES #123 SAN FRANCISCO'\n merchant_name:\n type: string\n nullable: true\n description: Cleaned merchant name\n example: \"Trader Joe's\"\n merchant_entity_id:\n type: string\n nullable: true\n description: Unique merchant identifier\n example: eyg8o776k0QmNgVpAmaQj4WgzW9Qzo6O51gdd\n logo:\n type: string\n format: uri\n nullable: true\n description: URL to merchant logo\n example: https://plaid-merchant-logos.plaid.com/trader_joes.png\n primary_category:\n type: string\n description: High-level category\n example: FOOD_AND_DRINK\n enum:\n - INCOME\n - TRANSFER_IN\n - TRANSFER_OUT\n - LOAN_PAYMENTS\n - BANK_FEES\n - ENTERTAINMENT\n - FOOD_AND_DRINK\n - GENERAL_MERCHANDISE\n - HOME_IMPROVEMENT\n - MEDICAL\n - PERSONAL_CARE\n - GENERAL_SERVICES\n - GOVERNMENT_AND_NON_PROFIT\n - TRANSPORTATION\n - TRAVEL\n - RENT_AND_UTILITIES\n detailed_category:\n type: string\n description: Specific category\n example: FOOD_AND_DRINK_GROCERIES\n category_confidence:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n description: Category confidence level\n example: VERY_HIGH\n payment_channel:\n type: string\n enum: [in_store, online, other]\n description: How payment was made\n example: in_store\n pending:\n type: boolean\n description: Whether transaction is still pending\n example: false\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n location:\n $ref: '#/components/schemas/Location'\n created_at:\n type: string\n format: date-time\n example: '2026-01-09T18:30:00Z'\n\n Location:\n type: object\n nullable: true\n properties:\n city:\n type: string\n nullable: true\n example: San Francisco\n region:\n type: string\n nullable: true\n example: CA\n postal_code:\n type: string\n nullable: true\n example: '94110'\n country:\n type: string\n nullable: true\n example: US\n\n Snapshot:\n type: object\n required:\n - id\n - period_type\n - period_start\n - period_end\n - snapshot_date\n properties:\n id:\n type: string\n format: uuid\n description: Unique snapshot identifier\n example: snap_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\n period_type:\n type: string\n enum: [daily, weekly, monthly]\n description: Period granularity\n example: daily\n period_start:\n type: string\n format: date\n description: Period start date\n example: '2026-01-01'\n period_end:\n type: string\n format: date\n description: Period end date\n example: '2026-01-31'\n snapshot_date:\n type: string\n format: date\n description: When snapshot was taken\n example: '2026-01-10'\n income:\n type: number\n description: Total income for period\n example: 6500.00\n expenses:\n type: number\n description: Total expenses for period\n example: 4200.00\n net_cash_flow:\n type: number\n description: Income minus expenses\n example: 2300.00\n savings_rate:\n type: number\n description: Percentage saved (0.0 to 1.0)\n example: 0.35\n net_worth:\n type: number\n description: Total assets minus liabilities\n example: 45000.00\n total_cash:\n type: number\n description: Sum of depository balances\n example: 12500.00\n total_debt:\n type: number\n description: Sum of credit/loan balances\n example: 8500.00\n investment_value:\n type: number\n description: Investment account value\n example: 28000.00\n asset_value:\n type: number\n description: Other asset values\n example: 15000.00\n burn_rate:\n type: number\n description: Average daily spending\n example: 140.00\n runway_days:\n type: integer\n description: Days of expenses covered by cash\n example: 89\n safe_to_spend:\n type: number\n description: Estimated discretionary spending available\n example: 1800.00\n recurring_total:\n type: number\n description: Sum of recurring expenses\n example: 1250.00\n spending_by_category:\n type: array\n items:\n $ref: '#/components/schemas/CategorySpending'\n top_merchants:\n type: array\n items:\n $ref: '#/components/schemas/MerchantSpending'\n income_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: 0.05\n spending_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: -0.08\n created_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n\n CategorySpending:\n type: object\n properties:\n category:\n type: string\n example: FOOD_AND_DRINK\n amount:\n type: number\n example: 850.00\n percentage:\n type: number\n example: 20.2\n\n MerchantSpending:\n type: object\n properties:\n merchant:\n type: string\n example: Whole Foods\n amount:\n type: number\n example: 420.00\n count:\n type: integer\n example: 8\n\n Pagination:\n type: object\n properties:\n limit:\n type: integer\n description: Transactions per page\n example: 1000\n next_cursor:\n type: string\n nullable: true\n description: Token for next page (null if no more pages)\n example: eyJkYXRlIjoiMjAyNi0wMS0wMSIsImlkIjoiYWJjMTIzIn0\n\n RecurringStream:\n type: object\n properties:\n id:\n type: string\n format: uuid\n description: Unique stream identifier\n example: cb3daddd-1f82-43ed-ba9f-60ecf8c937e3\n stream_id:\n type: string\n description: External stream ID (from Plaid)\n example: LN053MyLw9H9MQ5ybwrJim1Kj495gbsJ98aeM\n account_id:\n type: string\n description: Account ID this stream belongs to\n example: Dpnjw06KAJHYVmr5jqejimy4nE0OQJczvD8KD\n stream_type:\n type: string\n enum: [inflow, outflow]\n description: Direction of recurring payment\n example: outflow\n merchant_name:\n type: string\n description: Merchant or payee name\n example: Ting\n description:\n type: string\n description: Transaction description pattern\n example: 'TING* INV#MI-4636263'\n category:\n type: object\n properties:\n primary:\n type: string\n example: RENT_AND_UTILITIES\n detailed:\n type: string\n example: RENT_AND_UTILITIES_TELEPHONE\n confidence_level:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, SEMI_MONTHLY, MONTHLY, ANNUALLY, UNKNOWN]\n description: Payment frequency\n example: MONTHLY\n average_amount:\n type: number\n description: Average transaction amount\n example: 118.98\n last_amount:\n type: number\n description: Most recent transaction amount\n example: 146.58\n is_active:\n type: boolean\n description: Whether stream is currently active\n example: true\n status:\n type: string\n enum: [MATURE, EARLY_DETECTION, TOMBSTONED]\n description: Detection status\n example: MATURE\n first_date:\n type: string\n format: date\n description: First detected transaction date\n example: '2025-07-15'\n last_date:\n type: string\n format: date\n description: Most recent transaction date\n example: '2025-09-15'\n next_date:\n type: string\n format: date\n description: Predicted next transaction date\n example: '2025-10-15'\n source:\n type: string\n enum: [plaid, user]\n description: How stream was detected\n example: plaid\n\n Error:\n type: object\n required:\n - error\n properties:\n error:\n type: string\n description: Human-readable error message\n example: Invalid API key.\n\n FinancialContext:\n type: object\n required:\n - version\n - updated_at\n - currency\n - status\n - transactions\n - recurring\n - budgets\n - goals\n - snapshots\n - liabilities\n - holdings\n - health\n properties:\n version:\n type: string\n enum: [v1]\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n currency:\n type: string\n enum: [USD]\n status:\n $ref: '#/components/schemas/FinancialContextStatus'\n transactions:\n $ref: '#/components/schemas/TransactionIndex'\n recurring:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextRecurring'\n budgets:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextBudget'\n goals:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextGoal'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextSnapshot'\n liabilities:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextLiability'\n holdings:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextHolding'\n health:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextHealth'\n - type: 'null'\n\n FinancialContextStatus:\n type: object\n required:\n - position\n - accounts\n properties:\n position:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextPosition'\n - type: 'null'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextAccount'\n\n FinancialContextPosition:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - investments\n - other_assets\n - total_assets\n properties:\n date:\n type: string\n format: date\n nullable: true\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n other_assets:\n type: number\n nullable: true\n total_assets:\n type: number\n nullable: true\n\n FinancialContextAccount:\n type: object\n required:\n - id\n - name\n - type\n - subtype\n - group\n - institution\n - mask\n - balance\n - available\n - currency\n - updated_at\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n subtype:\n type: string\n nullable: true\n group:\n type: string\n enum: [cash, debt, investments]\n nullable: true\n institution:\n type: string\n nullable: true\n mask:\n type: string\n nullable: true\n balance:\n type: number\n nullable: true\n available:\n type: number\n nullable: true\n currency:\n type: string\n nullable: true\n updated_at:\n type: string\n format: date-time\n nullable: true\n\n TransactionIndex:\n type: object\n required:\n - total\n - months\n properties:\n total:\n type: integer\n minimum: 0\n months:\n type: array\n items:\n type: object\n required:\n - month\n - count\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n count:\n type: integer\n minimum: 0\n\n TransactionMonth:\n type: object\n required:\n - month\n - start_date\n - end_date\n - count\n - items\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n start_date:\n type: string\n format: date\n end_date:\n type: string\n format: date\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n LatestTransactions:\n type: object\n required:\n - since\n - window_days\n - count\n - items\n properties:\n since:\n type: string\n format: date\n description: Inclusive lower bound for the latest transaction window\n window_days:\n type: integer\n enum: [10]\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n FinancialContextTransaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - merchant\n - name\n - category\n - subcategory\n - pending\n - currency\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n date:\n type: string\n format: date\n nullable: true\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n merchant:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n category:\n type: string\n nullable: true\n subcategory:\n type: string\n nullable: true\n pending:\n type: boolean\n nullable: true\n currency:\n type: string\n nullable: true\n\n FinancialContextRecurring:\n type: object\n required:\n - id\n - account_id\n - direction\n - frequency\n - status\n - merchant\n - amount\n - next_date\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n direction:\n type: string\n enum: [inflow, outflow]\n nullable: true\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY]\n nullable: true\n status:\n type: string\n enum: [active, inactive, dismissed]\n nullable: true\n merchant:\n type: string\n nullable: true\n amount:\n type: number\n nullable: true\n next_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextBudget:\n type: object\n required:\n - id\n - name\n - type\n - period\n - status\n - amount\n - spent\n - remaining\n - used_percent\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [category, merchant]\n period:\n type: string\n enum: [weekly, biweekly, monthly]\n status:\n type: string\n enum: [under, warning, over]\n amount:\n type: number\n spent:\n type: number\n remaining:\n type: number\n used_percent:\n type: number\n\n FinancialContextGoal:\n type: object\n required:\n - id\n - name\n - category\n - status\n - target\n - current\n - progress_percent\n - target_date\n properties:\n id:\n type: string\n name:\n type: string\n category:\n type: string\n status:\n type: string\n enum: [not_started, in_progress, on_track, behind, completed]\n target:\n type: number\n current:\n type: number\n progress_percent:\n type: number\n target_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextSnapshot:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - income\n - expenses\n - cash_flow\n - savings_rate\n - investments\n - assets\n - health_score\n properties:\n date:\n type: string\n format: date\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n income:\n type: number\n nullable: true\n expenses:\n type: number\n nullable: true\n cash_flow:\n type: number\n nullable: true\n savings_rate:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n assets:\n type: number\n nullable: true\n health_score:\n type: number\n nullable: true\n\n FinancialContextLiability:\n type: object\n required:\n - account_id\n - type\n - balance\n - minimum_payment\n - due_date\n - interest_rate\n - rate_type\n - overdue\n properties:\n account_id:\n type: string\n nullable: true\n type:\n type: string\n enum: [credit, student, mortgage, other]\n nullable: true\n balance:\n type: number\n nullable: true\n minimum_payment:\n type: number\n nullable: true\n due_date:\n type: string\n format: date\n nullable: true\n interest_rate:\n type: number\n nullable: true\n rate_type:\n type: string\n enum: [fixed, variable]\n nullable: true\n overdue:\n type: boolean\n nullable: true\n\n FinancialContextHolding:\n type: object\n required:\n - account_id\n - symbol\n - name\n - type\n - quantity\n - value\n - cost_basis\n properties:\n account_id:\n type: string\n nullable: true\n symbol:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n type:\n type: string\n enum: [cash, derivative, equity, etf, fixed_income, mutual_fund, other]\n nullable: true\n quantity:\n type: number\n nullable: true\n value:\n type: number\n nullable: true\n cost_basis:\n type: number\n nullable: true\n\n FinancialContextHealth:\n type: object\n required:\n - score\n - label\n - level\n - summary\n - data_completeness\n - pillars\n properties:\n score:\n type: number\n label:\n type: string\n enum: [Needs Attention, Good, Strong]\n level:\n type: string\n enum: [critical, poor, fair, good, strong]\n summary:\n type: string\n data_completeness:\n type: number\n pillars:\n oneOf:\n - type: object\n required:\n - spend\n - save\n - borrow\n - build\n properties:\n spend:\n type: number\n nullable: true\n save:\n type: number\n nullable: true\n borrow:\n type: number\n nullable: true\n build:\n type: number\n nullable: true\n - type: 'null'\n\n FinancialContextMeta:\n type: object\n required:\n - version\n - user_id\n - context_id\n - generated_at\n - updated_at\n - content_hash\n - byte_length\n - counts\n properties:\n version:\n type: string\n enum: [v1]\n user_id:\n type: string\n context_id:\n type: string\n generated_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n content_hash:\n type: string\n description: Opaque artifact version token and ETag value. This is the only public artifact version token.\n byte_length:\n type: integer\n minimum: 0\n counts:\n type: object\n required:\n - accounts\n - transaction_months\n - transactions\n - snapshots\n properties:\n accounts:\n type: integer\n minimum: 0\n transaction_months:\n type: integer\n minimum: 0\n transactions:\n type: integer\n minimum: 0\n snapshots:\n type: integer\n minimum: 0\n\ntags:\n - name: Export\n description: Export financial data as structured JSON\n";
1
+ export declare const baseOpenApiYaml = "openapi: 3.1.0\ninfo:\n title: Warm API\n description: |\n Read your financial context or invoke supported Warm actions through a compact operation catalog.\n\n ## Authentication\n All requests use `Authorization: Bearer`. Each account has one non-expiring full-access\n API key (`warm_...`) for raw API and local MCP use. Read/export routes also accept a\n signed-in access token; access tokens never authorize automation operations.\n\n Unauthenticated responses include `WWW-Authenticate` guidance and protected resource metadata.\n\n ## Rate Limits\n - API keys: 500 requests per hour per key\n - Rate limit headers included in authenticated responses\n - `/api/export` supports dataset-scoped delta sync with `since` and publishes edge-cache metadata headers\n version: '3.0.0'\n contact:\n name: Warm Support\n url: https://warm.io/support\n license:\n name: Proprietary\n url: https://warm.io/terms\n\nservers:\n - url: https://app.warm.io\n description: Production\n\nsecurity:\n - BearerAuth: []\n\npaths:\n /api/verify:\n get:\n operationId: verifyApiAccess\n summary: Verify API credentials\n description: |\n Validate a Warm API key or signed-in user access token for installer and Settings flows.\n tags:\n - Verification\n responses:\n '200':\n description: Credentials are valid and the caller has API access\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/VerifyApiResponse'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/export:\n get:\n operationId: getDatasetExport\n summary: Get a typed dataset export\n description: |\n Fetch a canonical financial dataset export from the unified `/api/export` surface.\n\n Use `dataset=transactions` for paginated transaction history. Other datasets return\n a typed JSON object keyed by the documented dataset name.\n\n Preferred dataset names are `accounts`, `transactions`, `snapshots`, `recurring`,\n `budgets`, `goals`, `health`, `liabilities`, and `holdings`.\n tags:\n - Export\n parameters:\n - name: dataset\n in: query\n description: Dataset identifier\n required: true\n schema:\n type: string\n enum:\n - accounts\n - transactions\n - snapshots\n - recurring\n - budgets\n - goals\n - health\n - liabilities\n - holdings\n - name: since\n in: query\n description: ISO timestamp for incremental exports\n required: false\n schema:\n type: string\n format: date-time\n - name: limit\n in: query\n description: Maximum transactions per page when `dataset=transactions`\n required: false\n schema:\n type: integer\n minimum: 1\n maximum: 1000\n - name: cursor\n in: query\n description: Pagination token from `pagination.next_cursor` when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: accountId\n in: query\n description: Optional account filter when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: search\n in: query\n description: Optional merchant or description search filter when `dataset=transactions`\n required: false\n schema:\n type: string\n minLength: 1\n maxLength: 120\n responses:\n '200':\n description: Successful dataset export\n content:\n application/json:\n schema:\n oneOf:\n - $ref: '#/components/schemas/ExportAccountsResponse'\n - $ref: '#/components/schemas/ExportTransactionsResponse'\n - $ref: '#/components/schemas/ExportSnapshotsResponse'\n - $ref: '#/components/schemas/ExportRecurringResponse'\n - $ref: '#/components/schemas/ExportBudgetsResponse'\n - $ref: '#/components/schemas/ExportGoalsResponse'\n - $ref: '#/components/schemas/ExportHealthResponse'\n - $ref: '#/components/schemas/ExportLiabilitiesResponse'\n - $ref: '#/components/schemas/ExportHoldingsResponse'\n '400':\n description: Invalid query parameters\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context:\n get:\n operationId: getFinancialContext\n summary: Get compact financial context\n description: |\n Fetch the current compact FinancialContext artifact for the authenticated user.\n\n This response does not include transaction items. Use\n `/api/financial-context/transactions` for month-addressed transaction pages or the\n fixed 10-day latest transaction window.\n tags:\n - Export\n responses:\n '200':\n description: Compact FinancialContext artifact\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContext'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/transactions:\n get:\n operationId: getFinancialContextTransactions\n summary: Get financial-context transactions\n description: |\n Fetch one transaction month or the fixed 10-day latest transaction window from the\n current financial-context artifact.\n\n The raw API requires exactly one selector: `month=YYYY-MM` or `latest=1`.\n Bare calls are invalid on the raw API. The current `@warmio/mcp` `get_transactions` tool\n accepts one required `period` string: `latest` for the fixed latest window or `YYYY-MM`\n for a month. It does not accept export pagination or filtering controls.\n Transaction amounts use the Warm/Plaid sign convention:\n positive = expense/debit, negative = income/credit.\n\n A well-formed month inside the covered range with no matching items returns `200` with\n `count: 0` and `items: []`. Months before the earliest indexed month or after the latest\n covered month return `404`.\n tags:\n - Export\n parameters:\n - name: month\n in: query\n description: Transaction month selector in YYYY-MM format. Mutually exclusive with `latest`.\n required: false\n schema:\n type: string\n pattern: '^\\d{4}-(0[1-9]|1[0-2])$'\n example: '2026-07'\n - name: latest\n in: query\n description: Set to `1` for the fixed 10-day latest transaction window.\n required: false\n schema:\n type: string\n enum: ['1']\n responses:\n '200':\n description: Transaction month page or latest transaction window\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n oneOf:\n - $ref: '#/components/schemas/TransactionMonth'\n - $ref: '#/components/schemas/LatestTransactions'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '400':\n description: Missing selectors, mutually exclusive selectors, malformed `month`, or `latest` other than `1`\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/meta:\n get:\n operationId: getFinancialContextMeta\n summary: Get financial-context metadata\n description: |\n Fetch operational metadata for the current financial-context artifact, including the\n content hash used as the ETag, byte length, row counts, and freshness timestamps.\n `content_hash` is the public artifact version token; this metadata does not expose a\n public `data_version`.\n tags:\n - Export\n responses:\n '200':\n description: Financial-context metadata\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContextMeta'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/automation/operations/search:\n post:\n operationId: searchOperations\n summary: Search supported automation operations\n tags: [Automation]\n security:\n - BearerAuth: []\n requestBody:\n required: false\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n properties:\n query:\n type: string\n maxLength: 200\n responses:\n '200':\n description: Matching operations\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operations]\n properties:\n operations:\n type: array\n items:\n $ref: '#/components/schemas/AutomationOperation'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '400':\n $ref: '#/components/responses/BadRequest'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/describe:\n post:\n operationId: describeOperation\n summary: Describe one operation and request owner approval when required\n tags: [Automation]\n security:\n - BearerAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationRequest'\n responses:\n '200':\n description: Operation schema and optional pending owner approval\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operation]\n properties:\n operation:\n allOf:\n - $ref: '#/components/schemas/AutomationOperation'\n - type: object\n properties:\n input_schema:\n type: object\n approval:\n type: object\n additionalProperties: false\n required: [id, status, approval_url, expires_at]\n properties:\n id: { type: string, format: uuid }\n status: { type: string, enum: [pending] }\n approval_url: { type: string, format: uri }\n expires_at: { type: string, format: date-time }\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/invoke:\n post:\n operationId: invokeOperation\n summary: Invoke one supported operation\n tags: [Automation]\n security:\n - BearerAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationInvokeRequest'\n responses:\n '200':\n description: Wrapped response from the invoked operation\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/AutomationInvocationResponse'\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '409':\n description: Owner approval is required, invalid, expired, or already used\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\ncomponents:\n securitySchemes:\n BearerAuth:\n type: http\n scheme: bearer\n description: 'Read/export format: `Authorization: Bearer YOUR_API_KEY_OR_ACCESS_TOKEN`'\n\n headers:\n ETag:\n description: Quoted content hash for If-None-Match revalidation\n schema:\n type: string\n example: '\"7b6f9d4c...\"'\n PrivateNoStore:\n description: Private financial responses are not stored by browsers or shared caches\n schema:\n type: string\n example: private, no-store\n\n responses:\n BadRequest:\n description: The request body or operation input is invalid\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Unauthorized:\n description: Missing or invalid credentials\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Forbidden:\n description: The caller is authenticated but does not have API access\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n NotFound:\n description: The requested operation does not exist\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n InternalError:\n description: The request could not be completed safely\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n PayloadTooLarge:\n description: The response would exceed the public API response-size limit\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n RateLimited:\n description: Hourly per-credential rate limit exceeded\n headers:\n Retry-After:\n description: Seconds until the rate-limit window resets\n schema:\n type: integer\n example: 3600\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n\n schemas:\n AutomationOperation:\n type: object\n additionalProperties: false\n required: [operation_id, summary, description, method, path, risk, confirmation_required]\n properties:\n operation_id: { type: string }\n summary: { type: string }\n description: { type: string }\n method: { type: string, enum: [GET, POST, PATCH, PUT, DELETE] }\n path: { type: string }\n risk:\n type: array\n items: { type: string, enum: [read, write, destructive, external_effect] }\n confirmation_required: { type: boolean }\n OperationRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n OperationInvokeRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n approval_id:\n type: string\n format: uuid\n description: Matching owner approval required for every write operation\n OperationInput:\n type: object\n additionalProperties: false\n properties:\n params: { type: object, additionalProperties: { type: string } }\n body: { type: object, additionalProperties: true }\n AutomationInvocationResponse:\n type: object\n additionalProperties: false\n required: [body, headers, operation_id, status]\n properties:\n body: {}\n headers:\n type: object\n additionalProperties: { type: string }\n operation_id: { type: string }\n status: { type: integer, minimum: 100, maximum: 599 }\n ExportResponse:\n type: object\n required:\n - schema_version\n - generated_at\n - user_id\n - data_version\n - next_knowledge\n - accounts\n - transactions\n - snapshots\n - pagination\n properties:\n schema_version:\n type: string\n description: API schema version\n example: v1\n generated_at:\n type: string\n format: date-time\n description: Response generation timestamp\n example: '2026-01-10T15:30:00Z'\n user_id:\n type: string\n format: uuid\n description: Your user ID\n example: a1b2c3d4-e5f6-7890-abcd-ef1234567890\n data_version:\n type: integer\n description: Monotonic version number (increments on data changes)\n example: 42\n next_knowledge:\n type: string\n format: date-time\n description: Use as `since` in the next request for delta sync\n example: '2026-01-10T15:30:00Z'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/Account'\n transactions:\n type: array\n items:\n $ref: '#/components/schemas/Transaction'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/Snapshot'\n pagination:\n $ref: '#/components/schemas/Pagination'\n\n Account:\n type: object\n required:\n - id\n - name\n - type\n - current_balance\n - iso_currency_code\n - is_active\n properties:\n id:\n type: string\n format: uuid\n description: Unique account identifier\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n account_id:\n type: string\n description: External account ID (from Plaid)\n example: plaid_acc_ABC123xyz\n name:\n type: string\n description: Display name with masked account number\n example: 'Checking ****1234'\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n description: Account type\n example: depository\n subtype:\n type: string\n description: Specific subtype\n example: checking\n enum:\n - checking\n - savings\n - money market\n - cd\n - credit card\n - mortgage\n - student\n - auto\n - 401k\n - ira\n - brokerage\n - other\n current_balance:\n type: number\n description: Current balance (positive for assets)\n example: 5420.50\n available_balance:\n type: number\n nullable: true\n description: Available balance (may differ from current)\n example: 5320.50\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n mask:\n type: string\n description: Last 4 digits of account number\n example: '1234'\n is_active:\n type: boolean\n description: Whether account is actively syncing\n example: true\n created_at:\n type: string\n format: date-time\n example: '2025-06-15T10:00:00Z'\n updated_at:\n type: string\n format: date-time\n example: '2026-01-10T12:00:00Z'\n\n Transaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - name\n - primary_category\n - detailed_category\n - pending\n - iso_currency_code\n properties:\n id:\n type: string\n format: uuid\n description: Unique transaction identifier\n example: txn_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d\n transaction_id:\n type: string\n description: External transaction ID (from Plaid)\n example: plaid_txn_XYZ789abc\n account_id:\n type: string\n format: uuid\n description: Parent account ID\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n date:\n type: string\n format: date\n description: Posted date\n example: '2026-01-09'\n authorized_date:\n type: string\n format: date\n nullable: true\n description: Authorization date (if different)\n example: '2026-01-08'\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n example: 42.50\n name:\n type: string\n description: Raw transaction description from bank\n example: 'TRADER JOES #123 SAN FRANCISCO'\n merchant_name:\n type: string\n nullable: true\n description: Cleaned merchant name\n example: \"Trader Joe's\"\n merchant_entity_id:\n type: string\n nullable: true\n description: Unique merchant identifier\n example: eyg8o776k0QmNgVpAmaQj4WgzW9Qzo6O51gdd\n logo:\n type: string\n format: uri\n nullable: true\n description: URL to merchant logo\n example: https://plaid-merchant-logos.plaid.com/trader_joes.png\n primary_category:\n type: string\n description: High-level category\n example: FOOD_AND_DRINK\n enum:\n - INCOME\n - TRANSFER_IN\n - TRANSFER_OUT\n - LOAN_PAYMENTS\n - BANK_FEES\n - ENTERTAINMENT\n - FOOD_AND_DRINK\n - GENERAL_MERCHANDISE\n - HOME_IMPROVEMENT\n - MEDICAL\n - PERSONAL_CARE\n - GENERAL_SERVICES\n - GOVERNMENT_AND_NON_PROFIT\n - TRANSPORTATION\n - TRAVEL\n - RENT_AND_UTILITIES\n detailed_category:\n type: string\n description: Specific category\n example: FOOD_AND_DRINK_GROCERIES\n category_confidence:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n description: Category confidence level\n example: VERY_HIGH\n payment_channel:\n type: string\n enum: [in_store, online, other]\n description: How payment was made\n example: in_store\n pending:\n type: boolean\n description: Whether transaction is still pending\n example: false\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n location:\n $ref: '#/components/schemas/Location'\n created_at:\n type: string\n format: date-time\n example: '2026-01-09T18:30:00Z'\n\n Location:\n type: object\n nullable: true\n properties:\n city:\n type: string\n nullable: true\n example: San Francisco\n region:\n type: string\n nullable: true\n example: CA\n postal_code:\n type: string\n nullable: true\n example: '94110'\n country:\n type: string\n nullable: true\n example: US\n\n Snapshot:\n type: object\n required:\n - id\n - period_type\n - period_start\n - period_end\n - snapshot_date\n properties:\n id:\n type: string\n format: uuid\n description: Unique snapshot identifier\n example: snap_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\n period_type:\n type: string\n enum: [daily, weekly, monthly]\n description: Period granularity\n example: daily\n period_start:\n type: string\n format: date\n description: Period start date\n example: '2026-01-01'\n period_end:\n type: string\n format: date\n description: Period end date\n example: '2026-01-31'\n snapshot_date:\n type: string\n format: date\n description: When snapshot was taken\n example: '2026-01-10'\n income:\n type: number\n description: Total income for period\n example: 6500.00\n expenses:\n type: number\n description: Total expenses for period\n example: 4200.00\n net_cash_flow:\n type: number\n description: Income minus expenses\n example: 2300.00\n savings_rate:\n type: number\n description: Percentage saved (0.0 to 1.0)\n example: 0.35\n net_worth:\n type: number\n description: Total assets minus liabilities\n example: 45000.00\n total_cash:\n type: number\n description: Sum of depository balances\n example: 12500.00\n total_debt:\n type: number\n description: Sum of credit/loan balances\n example: 8500.00\n investment_value:\n type: number\n description: Investment account value\n example: 28000.00\n asset_value:\n type: number\n description: Other asset values\n example: 15000.00\n burn_rate:\n type: number\n description: Average daily spending\n example: 140.00\n runway_days:\n type: integer\n description: Days of expenses covered by cash\n example: 89\n safe_to_spend:\n type: number\n description: Estimated discretionary spending available\n example: 1800.00\n recurring_total:\n type: number\n description: Sum of recurring expenses\n example: 1250.00\n spending_by_category:\n type: array\n items:\n $ref: '#/components/schemas/CategorySpending'\n top_merchants:\n type: array\n items:\n $ref: '#/components/schemas/MerchantSpending'\n income_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: 0.05\n spending_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: -0.08\n created_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n\n CategorySpending:\n type: object\n properties:\n category:\n type: string\n example: FOOD_AND_DRINK\n amount:\n type: number\n example: 850.00\n percentage:\n type: number\n example: 20.2\n\n MerchantSpending:\n type: object\n properties:\n merchant:\n type: string\n example: Whole Foods\n amount:\n type: number\n example: 420.00\n count:\n type: integer\n example: 8\n\n Pagination:\n type: object\n properties:\n limit:\n type: integer\n description: Transactions per page\n example: 1000\n next_cursor:\n type: string\n nullable: true\n description: Token for next page (null if no more pages)\n example: eyJkYXRlIjoiMjAyNi0wMS0wMSIsImlkIjoiYWJjMTIzIn0\n\n RecurringStream:\n type: object\n properties:\n id:\n type: string\n format: uuid\n description: Unique stream identifier\n example: cb3daddd-1f82-43ed-ba9f-60ecf8c937e3\n stream_id:\n type: string\n description: External stream ID (from Plaid)\n example: LN053MyLw9H9MQ5ybwrJim1Kj495gbsJ98aeM\n account_id:\n type: string\n description: Account ID this stream belongs to\n example: Dpnjw06KAJHYVmr5jqejimy4nE0OQJczvD8KD\n stream_type:\n type: string\n enum: [inflow, outflow]\n description: Direction of recurring payment\n example: outflow\n merchant_name:\n type: string\n description: Merchant or payee name\n example: Ting\n description:\n type: string\n description: Transaction description pattern\n example: 'TING* INV#MI-4636263'\n category:\n type: object\n properties:\n primary:\n type: string\n example: RENT_AND_UTILITIES\n detailed:\n type: string\n example: RENT_AND_UTILITIES_TELEPHONE\n confidence_level:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, SEMI_MONTHLY, MONTHLY, ANNUALLY, UNKNOWN]\n description: Payment frequency\n example: MONTHLY\n average_amount:\n type: number\n description: Average transaction amount\n example: 118.98\n last_amount:\n type: number\n description: Most recent transaction amount\n example: 146.58\n is_active:\n type: boolean\n description: Whether stream is currently active\n example: true\n status:\n type: string\n enum: [MATURE, EARLY_DETECTION, TOMBSTONED]\n description: Detection status\n example: MATURE\n first_date:\n type: string\n format: date\n description: First detected transaction date\n example: '2025-07-15'\n last_date:\n type: string\n format: date\n description: Most recent transaction date\n example: '2025-09-15'\n next_date:\n type: string\n format: date\n description: Predicted next transaction date\n example: '2025-10-15'\n source:\n type: string\n enum: [plaid, user]\n description: How stream was detected\n example: plaid\n\n Error:\n type: object\n additionalProperties: false\n required:\n - error\n properties:\n error:\n type: string\n VerifyApiResponse:\n type: object\n additionalProperties: false\n required: [valid]\n properties:\n valid:\n type: boolean\n enum: [true]\n description: Human-readable error message\n example: Invalid API key.\n\n FinancialContext:\n type: object\n required:\n - version\n - updated_at\n - currency\n - status\n - transactions\n - recurring\n - budgets\n - goals\n - snapshots\n - liabilities\n - holdings\n - health\n properties:\n version:\n type: string\n enum: [v1]\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n currency:\n type: string\n enum: [USD]\n status:\n $ref: '#/components/schemas/FinancialContextStatus'\n transactions:\n $ref: '#/components/schemas/TransactionIndex'\n recurring:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextRecurring'\n budgets:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextBudget'\n goals:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextGoal'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextSnapshot'\n liabilities:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextLiability'\n holdings:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextHolding'\n health:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextHealth'\n - type: 'null'\n\n FinancialContextStatus:\n type: object\n required:\n - position\n - accounts\n properties:\n position:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextPosition'\n - type: 'null'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextAccount'\n\n FinancialContextPosition:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - investments\n - other_assets\n - total_assets\n properties:\n date:\n type: string\n format: date\n nullable: true\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n other_assets:\n type: number\n nullable: true\n total_assets:\n type: number\n nullable: true\n\n FinancialContextAccount:\n type: object\n required:\n - id\n - name\n - type\n - subtype\n - group\n - institution\n - mask\n - balance\n - available\n - currency\n - updated_at\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n subtype:\n type: string\n nullable: true\n group:\n type: string\n enum: [cash, debt, investments]\n nullable: true\n institution:\n type: string\n nullable: true\n mask:\n type: string\n nullable: true\n balance:\n type: number\n nullable: true\n available:\n type: number\n nullable: true\n currency:\n type: string\n nullable: true\n updated_at:\n type: string\n format: date-time\n nullable: true\n\n TransactionIndex:\n type: object\n required:\n - total\n - months\n properties:\n total:\n type: integer\n minimum: 0\n months:\n type: array\n items:\n type: object\n required:\n - month\n - count\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n count:\n type: integer\n minimum: 0\n\n TransactionMonth:\n type: object\n required:\n - month\n - start_date\n - end_date\n - count\n - items\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n start_date:\n type: string\n format: date\n end_date:\n type: string\n format: date\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n LatestTransactions:\n type: object\n required:\n - since\n - window_days\n - count\n - items\n properties:\n since:\n type: string\n format: date\n description: Inclusive lower bound for the latest transaction window\n window_days:\n type: integer\n enum: [10]\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n FinancialContextTransaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - merchant\n - name\n - category\n - subcategory\n - pending\n - currency\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n date:\n type: string\n format: date\n nullable: true\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n merchant:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n category:\n type: string\n nullable: true\n subcategory:\n type: string\n nullable: true\n pending:\n type: boolean\n nullable: true\n currency:\n type: string\n nullable: true\n\n FinancialContextRecurring:\n type: object\n required:\n - id\n - account_id\n - direction\n - frequency\n - status\n - merchant\n - amount\n - next_date\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n direction:\n type: string\n enum: [inflow, outflow]\n nullable: true\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY]\n nullable: true\n status:\n type: string\n enum: [active, inactive, dismissed]\n nullable: true\n merchant:\n type: string\n nullable: true\n amount:\n type: number\n nullable: true\n next_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextBudget:\n type: object\n required:\n - id\n - name\n - type\n - period\n - status\n - amount\n - spent\n - remaining\n - used_percent\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [category, merchant]\n period:\n type: string\n enum: [weekly, biweekly, monthly]\n status:\n type: string\n enum: [under, warning, over]\n amount:\n type: number\n spent:\n type: number\n remaining:\n type: number\n used_percent:\n type: number\n\n FinancialContextGoal:\n type: object\n required:\n - id\n - name\n - category\n - status\n - target\n - current\n - progress_percent\n - target_date\n properties:\n id:\n type: string\n name:\n type: string\n category:\n type: string\n status:\n type: string\n enum: [not_started, in_progress, on_track, behind, completed]\n target:\n type: number\n current:\n type: number\n progress_percent:\n type: number\n target_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextSnapshot:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - income\n - expenses\n - cash_flow\n - savings_rate\n - investments\n - assets\n - health_score\n properties:\n date:\n type: string\n format: date\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n income:\n type: number\n nullable: true\n expenses:\n type: number\n nullable: true\n cash_flow:\n type: number\n nullable: true\n savings_rate:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n assets:\n type: number\n nullable: true\n health_score:\n type: number\n nullable: true\n\n FinancialContextLiability:\n type: object\n required:\n - account_id\n - type\n - balance\n - minimum_payment\n - due_date\n - interest_rate\n - rate_type\n - overdue\n properties:\n account_id:\n type: string\n nullable: true\n type:\n type: string\n enum: [credit, student, mortgage, other]\n nullable: true\n balance:\n type: number\n nullable: true\n minimum_payment:\n type: number\n nullable: true\n due_date:\n type: string\n format: date\n nullable: true\n interest_rate:\n type: number\n nullable: true\n rate_type:\n type: string\n enum: [fixed, variable]\n nullable: true\n overdue:\n type: boolean\n nullable: true\n\n FinancialContextHolding:\n type: object\n required:\n - account_id\n - symbol\n - name\n - type\n - quantity\n - value\n - cost_basis\n properties:\n account_id:\n type: string\n nullable: true\n symbol:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n type:\n type: string\n enum: [cash, derivative, equity, etf, fixed_income, mutual_fund, other]\n nullable: true\n quantity:\n type: number\n nullable: true\n value:\n type: number\n nullable: true\n cost_basis:\n type: number\n nullable: true\n\n FinancialContextHealth:\n type: object\n required:\n - score\n - label\n - level\n - summary\n - data_completeness\n - pillars\n properties:\n score:\n type: number\n label:\n type: string\n enum: [Needs Attention, Good, Strong]\n level:\n type: string\n enum: [critical, poor, fair, good, strong]\n summary:\n type: string\n data_completeness:\n type: number\n pillars:\n oneOf:\n - type: object\n required:\n - spend\n - save\n - borrow\n - build\n properties:\n spend:\n type: number\n nullable: true\n save:\n type: number\n nullable: true\n borrow:\n type: number\n nullable: true\n build:\n type: number\n nullable: true\n - type: 'null'\n\n FinancialContextMeta:\n type: object\n required:\n - version\n - user_id\n - context_id\n - generated_at\n - updated_at\n - content_hash\n - byte_length\n - counts\n properties:\n version:\n type: string\n enum: [v1]\n user_id:\n type: string\n context_id:\n type: string\n generated_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n content_hash:\n type: string\n description: Opaque artifact version token and ETag value. This is the only public artifact version token.\n byte_length:\n type: integer\n minimum: 0\n counts:\n type: object\n required:\n - accounts\n - transaction_months\n - transactions\n - snapshots\n properties:\n accounts:\n type: integer\n minimum: 0\n transaction_months:\n type: integer\n minimum: 0\n transactions:\n type: integer\n minimum: 0\n snapshots:\n type: integer\n minimum: 0\n\ntags:\n - name: Export\n description: Export financial data as structured JSON\n";
2
2
  //# sourceMappingURL=base-openapi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-openapi.d.ts","sourceRoot":"","sources":["../../src/generated/base-openapi.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,2y/CAA2y/C,CAAC"}
1
+ {"version":3,"file":"base-openapi.d.ts","sourceRoot":"","sources":["../../src/generated/base-openapi.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,+g+CAA+g+C,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // Generated by tools/tasks/generate-openapi-base.mts. Do not edit.
2
- export const baseOpenApiYaml = "openapi: 3.1.0\ninfo:\n title: Warm API\n description: |\n Read your financial context or invoke supported Warm actions through a compact operation catalog.\n\n ## Authentication\n All requests use `Authorization: Bearer`. API keys are created for either read-only context\n access or automation access in Settings on paid Warm plans.\n\n Read/export routes accept `Authorization: Bearer YOUR_API_KEY_OR_ACCESS_TOKEN`.\n Automation routes require an automation key (`warm_auto_...`) and do not accept access tokens.\n\n Unauthenticated responses include `WWW-Authenticate` guidance and protected resource metadata.\n\n ## Rate Limits\n - Context keys: 200 requests per hour per key\n - Automation keys: 500 requests per hour per key\n - Rate limit headers included in authenticated responses\n - `/api/export` supports dataset-scoped delta sync with `since` and publishes edge-cache metadata headers\n version: '2.0.0'\n contact:\n name: Warm Support\n url: https://warm.io/support\n license:\n name: Proprietary\n url: https://warm.io/terms\n\nservers:\n - url: https://app.warm.io\n description: Production\n\nsecurity:\n - BearerAuth: []\n\npaths:\n /api/verify:\n get:\n operationId: verifyApiAccess\n summary: Verify API credentials\n description: |\n Validate a Warm API key or signed-in user access token against the public verification route.\n\n This endpoint is the canonical readiness check for public API clients and discovery tools.\n tags:\n - Verification\n responses:\n '200':\n description: Credentials are valid and the caller has API access\n content:\n application/json:\n schema:\n type: object\n required:\n - status\n - valid\n - auth\n properties:\n status:\n type: string\n enum: [ok]\n valid:\n type: boolean\n auth:\n type: string\n description: Auth method used to satisfy verification\n audience:\n type: string\n enum: [context, automation, oauth]\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/export:\n get:\n operationId: getDatasetExport\n summary: Get a typed dataset export\n description: |\n Fetch a canonical financial dataset export from the unified `/api/export` surface.\n\n Use `dataset=transactions` for paginated transaction history. Other datasets return\n a typed JSON object keyed by the dataset name or retained public alias.\n\n Preferred dataset names are `accounts`, `transactions`, `snapshots`, `recurring`,\n `budgets`, `goals`, `health`, `liabilities`, and `holdings`.\n tags:\n - Export\n parameters:\n - name: dataset\n in: query\n description: Dataset identifier or retained public alias\n required: true\n schema:\n type: string\n enum:\n - accounts\n - transactions\n - snapshots\n - recurring\n - budgets\n - goals\n - health\n - liabilities\n - holdings\n - name: since\n in: query\n description: ISO timestamp for incremental exports\n required: false\n schema:\n type: string\n format: date-time\n - name: last_knowledge\n in: query\n description: Legacy alias for `since`\n required: false\n schema:\n type: string\n format: date-time\n - name: limit\n in: query\n description: Maximum transactions per page when `dataset=transactions`\n required: false\n schema:\n type: integer\n minimum: 1\n maximum: 1000\n - name: cursor\n in: query\n description: Pagination token from `pagination.next_cursor` when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: accountId\n in: query\n description: Optional account filter when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: search\n in: query\n description: Optional merchant or description search filter when `dataset=transactions`\n required: false\n schema:\n type: string\n minLength: 1\n maxLength: 120\n responses:\n '200':\n description: Successful dataset export\n content:\n application/json:\n schema:\n type: object\n description: Dataset-shaped JSON response keyed by the requested dataset\n properties:\n generated_at:\n type: string\n format: date-time\n next_knowledge:\n type: string\n format: date-time\n nullable: true\n pagination:\n $ref: '#/components/schemas/Pagination'\n additionalProperties: true\n '400':\n description: Invalid query parameters\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context:\n get:\n operationId: getFinancialContext\n summary: Get compact financial context\n description: |\n Fetch the current compact FinancialContext artifact for the authenticated user.\n\n This response does not include transaction items. Use\n `/api/financial-context/transactions` for month-addressed transaction pages or the\n fixed 10-day latest transaction window.\n tags:\n - Export\n responses:\n '200':\n description: Compact FinancialContext artifact\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContext'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/transactions:\n get:\n operationId: getFinancialContextTransactions\n summary: Get financial-context transactions\n description: |\n Fetch one transaction month or the fixed 10-day latest transaction window from the\n current financial-context artifact.\n\n The raw API requires exactly one selector: `month=YYYY-MM` or `latest=1`.\n Bare calls are invalid on the raw API. The current `@warmio/mcp` `get_transactions` tool\n accepts one required `period` string: `latest` for the fixed latest window or `YYYY-MM`\n for a month. It does not accept cursor, search, or `last_knowledge`.\n Transaction amounts use the Warm/Plaid sign convention:\n positive = expense/debit, negative = income/credit.\n\n A well-formed month inside the covered range with no matching items returns `200` with\n `count: 0` and `items: []`. Months before the earliest indexed month or after the latest\n covered month return `404`.\n tags:\n - Export\n parameters:\n - name: month\n in: query\n description: Transaction month selector in YYYY-MM format. Mutually exclusive with `latest`.\n required: false\n schema:\n type: string\n pattern: '^\\d{4}-(0[1-9]|1[0-2])$'\n example: '2026-07'\n - name: latest\n in: query\n description: Set to `1` for the fixed 10-day latest transaction window.\n required: false\n schema:\n type: string\n enum: ['1']\n responses:\n '200':\n description: Transaction month page or latest transaction window\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n oneOf:\n - $ref: '#/components/schemas/TransactionMonth'\n - $ref: '#/components/schemas/LatestTransactions'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '400':\n description: Missing selectors, mutually exclusive selectors, malformed `month`, or `latest` other than `1`\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/meta:\n get:\n operationId: getFinancialContextMeta\n summary: Get financial-context metadata\n description: |\n Fetch operational metadata for the current financial-context artifact, including the\n content hash used as the ETag, byte length, row counts, and freshness timestamps.\n `content_hash` is the public artifact version token; this metadata does not expose a\n public `data_version`.\n tags:\n - Export\n responses:\n '200':\n description: Financial-context metadata\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContextMeta'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/automation/operations/search:\n post:\n operationId: searchOperations\n summary: Search supported automation operations\n tags: [Automation]\n security:\n - AutomationKeyAuth: []\n requestBody:\n required: false\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n properties:\n query:\n type: string\n maxLength: 200\n responses:\n '200':\n description: Matching operations\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operations]\n properties:\n operations:\n type: array\n items:\n $ref: '#/components/schemas/AutomationOperation'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '400':\n $ref: '#/components/responses/BadRequest'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/describe:\n post:\n operationId: describeOperation\n summary: Describe one operation and request owner approval when required\n tags: [Automation]\n security:\n - AutomationKeyAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationRequest'\n responses:\n '200':\n description: Operation schema and optional pending owner approval\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operation]\n properties:\n operation:\n allOf:\n - $ref: '#/components/schemas/AutomationOperation'\n - type: object\n properties:\n input_schema:\n type: object\n approval:\n type: object\n additionalProperties: false\n required: [id, status, approval_url, expires_at]\n properties:\n id: { type: string, format: uuid }\n status: { type: string, enum: [pending] }\n approval_url: { type: string, format: uri }\n expires_at: { type: string, format: date-time }\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/invoke:\n post:\n operationId: invokeOperation\n summary: Invoke one supported operation\n tags: [Automation]\n security:\n - AutomationKeyAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationInvokeRequest'\n responses:\n '200':\n description: Wrapped response from the invoked operation\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/AutomationInvocationResponse'\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '409':\n description: Owner approval is required, invalid, expired, or already used\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\ncomponents:\n securitySchemes:\n BearerAuth:\n type: http\n scheme: bearer\n description: 'Read/export format: `Authorization: Bearer YOUR_API_KEY_OR_ACCESS_TOKEN`'\n AutomationKeyAuth:\n type: http\n scheme: bearer\n description: 'Automation format: `Authorization: Bearer warm_auto_...`'\n\n headers:\n ETag:\n description: Quoted content hash for If-None-Match revalidation\n schema:\n type: string\n example: '\"7b6f9d4c...\"'\n PrivateNoStore:\n description: Private financial responses are not stored by browsers or shared caches\n schema:\n type: string\n example: private, no-store\n\n responses:\n BadRequest:\n description: The request body or operation input is invalid\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Unauthorized:\n description: Missing or invalid credentials\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Forbidden:\n description: The caller is authenticated but does not have API access\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n NotFound:\n description: The requested operation does not exist\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n InternalError:\n description: The request could not be completed safely\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n PayloadTooLarge:\n description: The response would exceed the public API response-size limit\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n RateLimited:\n description: Hourly per-credential rate limit exceeded\n headers:\n Retry-After:\n description: Seconds until the rate-limit window resets\n schema:\n type: integer\n example: 3600\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n\n schemas:\n AutomationOperation:\n type: object\n additionalProperties: false\n required: [operation_id, summary, description, method, path, risk, confirmation_required]\n properties:\n operation_id: { type: string }\n summary: { type: string }\n description: { type: string }\n method: { type: string, enum: [GET, POST, PATCH, PUT, DELETE] }\n path: { type: string }\n risk:\n type: array\n items: { type: string, enum: [read, write, destructive, external_effect] }\n confirmation_required: { type: boolean }\n OperationRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n OperationInvokeRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n approval_id:\n type: string\n format: uuid\n description: Matching owner approval required for every write operation\n OperationInput:\n type: object\n additionalProperties: false\n properties:\n params: { type: object, additionalProperties: { type: string } }\n body: { type: object, additionalProperties: true }\n AutomationInvocationResponse:\n type: object\n additionalProperties: false\n required: [body, headers, operation_id, status]\n properties:\n body: {}\n headers:\n type: object\n additionalProperties: { type: string }\n operation_id: { type: string }\n status: { type: integer, minimum: 100, maximum: 599 }\n ExportResponse:\n type: object\n required:\n - schema_version\n - generated_at\n - user_id\n - data_version\n - next_knowledge\n - accounts\n - transactions\n - snapshots\n - pagination\n properties:\n schema_version:\n type: string\n description: API schema version\n example: v1\n generated_at:\n type: string\n format: date-time\n description: Response generation timestamp\n example: '2026-01-10T15:30:00Z'\n user_id:\n type: string\n format: uuid\n description: Your user ID\n example: a1b2c3d4-e5f6-7890-abcd-ef1234567890\n data_version:\n type: integer\n description: Monotonic version number (increments on data changes)\n example: 42\n next_knowledge:\n type: string\n format: date-time\n description: Use as `last_knowledge` in next request for delta sync\n example: '2026-01-10T15:30:00Z'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/Account'\n transactions:\n type: array\n items:\n $ref: '#/components/schemas/Transaction'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/Snapshot'\n pagination:\n $ref: '#/components/schemas/Pagination'\n\n Account:\n type: object\n required:\n - id\n - name\n - type\n - current_balance\n - iso_currency_code\n - is_active\n properties:\n id:\n type: string\n format: uuid\n description: Unique account identifier\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n account_id:\n type: string\n description: External account ID (from Plaid)\n example: plaid_acc_ABC123xyz\n name:\n type: string\n description: Display name with masked account number\n example: 'Checking ****1234'\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n description: Account type\n example: depository\n subtype:\n type: string\n description: Specific subtype\n example: checking\n enum:\n - checking\n - savings\n - money market\n - cd\n - credit card\n - mortgage\n - student\n - auto\n - 401k\n - ira\n - brokerage\n - other\n current_balance:\n type: number\n description: Current balance (positive for assets)\n example: 5420.50\n available_balance:\n type: number\n nullable: true\n description: Available balance (may differ from current)\n example: 5320.50\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n mask:\n type: string\n description: Last 4 digits of account number\n example: '1234'\n is_active:\n type: boolean\n description: Whether account is actively syncing\n example: true\n created_at:\n type: string\n format: date-time\n example: '2025-06-15T10:00:00Z'\n updated_at:\n type: string\n format: date-time\n example: '2026-01-10T12:00:00Z'\n\n Transaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - name\n - primary_category\n - detailed_category\n - pending\n - iso_currency_code\n properties:\n id:\n type: string\n format: uuid\n description: Unique transaction identifier\n example: txn_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d\n transaction_id:\n type: string\n description: External transaction ID (from Plaid)\n example: plaid_txn_XYZ789abc\n account_id:\n type: string\n format: uuid\n description: Parent account ID\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n date:\n type: string\n format: date\n description: Posted date\n example: '2026-01-09'\n authorized_date:\n type: string\n format: date\n nullable: true\n description: Authorization date (if different)\n example: '2026-01-08'\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n example: 42.50\n name:\n type: string\n description: Raw transaction description from bank\n example: 'TRADER JOES #123 SAN FRANCISCO'\n merchant_name:\n type: string\n nullable: true\n description: Cleaned merchant name\n example: \"Trader Joe's\"\n merchant_entity_id:\n type: string\n nullable: true\n description: Unique merchant identifier\n example: eyg8o776k0QmNgVpAmaQj4WgzW9Qzo6O51gdd\n logo:\n type: string\n format: uri\n nullable: true\n description: URL to merchant logo\n example: https://plaid-merchant-logos.plaid.com/trader_joes.png\n primary_category:\n type: string\n description: High-level category\n example: FOOD_AND_DRINK\n enum:\n - INCOME\n - TRANSFER_IN\n - TRANSFER_OUT\n - LOAN_PAYMENTS\n - BANK_FEES\n - ENTERTAINMENT\n - FOOD_AND_DRINK\n - GENERAL_MERCHANDISE\n - HOME_IMPROVEMENT\n - MEDICAL\n - PERSONAL_CARE\n - GENERAL_SERVICES\n - GOVERNMENT_AND_NON_PROFIT\n - TRANSPORTATION\n - TRAVEL\n - RENT_AND_UTILITIES\n detailed_category:\n type: string\n description: Specific category\n example: FOOD_AND_DRINK_GROCERIES\n category_confidence:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n description: Category confidence level\n example: VERY_HIGH\n payment_channel:\n type: string\n enum: [in_store, online, other]\n description: How payment was made\n example: in_store\n pending:\n type: boolean\n description: Whether transaction is still pending\n example: false\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n location:\n $ref: '#/components/schemas/Location'\n created_at:\n type: string\n format: date-time\n example: '2026-01-09T18:30:00Z'\n\n Location:\n type: object\n nullable: true\n properties:\n city:\n type: string\n nullable: true\n example: San Francisco\n region:\n type: string\n nullable: true\n example: CA\n postal_code:\n type: string\n nullable: true\n example: '94110'\n country:\n type: string\n nullable: true\n example: US\n\n Snapshot:\n type: object\n required:\n - id\n - period_type\n - period_start\n - period_end\n - snapshot_date\n properties:\n id:\n type: string\n format: uuid\n description: Unique snapshot identifier\n example: snap_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\n period_type:\n type: string\n enum: [daily, weekly, monthly]\n description: Period granularity\n example: daily\n period_start:\n type: string\n format: date\n description: Period start date\n example: '2026-01-01'\n period_end:\n type: string\n format: date\n description: Period end date\n example: '2026-01-31'\n snapshot_date:\n type: string\n format: date\n description: When snapshot was taken\n example: '2026-01-10'\n income:\n type: number\n description: Total income for period\n example: 6500.00\n expenses:\n type: number\n description: Total expenses for period\n example: 4200.00\n net_cash_flow:\n type: number\n description: Income minus expenses\n example: 2300.00\n savings_rate:\n type: number\n description: Percentage saved (0.0 to 1.0)\n example: 0.35\n net_worth:\n type: number\n description: Total assets minus liabilities\n example: 45000.00\n total_cash:\n type: number\n description: Sum of depository balances\n example: 12500.00\n total_debt:\n type: number\n description: Sum of credit/loan balances\n example: 8500.00\n investment_value:\n type: number\n description: Investment account value\n example: 28000.00\n asset_value:\n type: number\n description: Other asset values\n example: 15000.00\n burn_rate:\n type: number\n description: Average daily spending\n example: 140.00\n runway_days:\n type: integer\n description: Days of expenses covered by cash\n example: 89\n safe_to_spend:\n type: number\n description: Estimated discretionary spending available\n example: 1800.00\n recurring_total:\n type: number\n description: Sum of recurring expenses\n example: 1250.00\n spending_by_category:\n type: array\n items:\n $ref: '#/components/schemas/CategorySpending'\n top_merchants:\n type: array\n items:\n $ref: '#/components/schemas/MerchantSpending'\n income_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: 0.05\n spending_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: -0.08\n created_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n\n CategorySpending:\n type: object\n properties:\n category:\n type: string\n example: FOOD_AND_DRINK\n amount:\n type: number\n example: 850.00\n percentage:\n type: number\n example: 20.2\n\n MerchantSpending:\n type: object\n properties:\n merchant:\n type: string\n example: Whole Foods\n amount:\n type: number\n example: 420.00\n count:\n type: integer\n example: 8\n\n Pagination:\n type: object\n properties:\n limit:\n type: integer\n description: Transactions per page\n example: 1000\n next_cursor:\n type: string\n nullable: true\n description: Token for next page (null if no more pages)\n example: eyJkYXRlIjoiMjAyNi0wMS0wMSIsImlkIjoiYWJjMTIzIn0\n\n RecurringStream:\n type: object\n properties:\n id:\n type: string\n format: uuid\n description: Unique stream identifier\n example: cb3daddd-1f82-43ed-ba9f-60ecf8c937e3\n stream_id:\n type: string\n description: External stream ID (from Plaid)\n example: LN053MyLw9H9MQ5ybwrJim1Kj495gbsJ98aeM\n account_id:\n type: string\n description: Account ID this stream belongs to\n example: Dpnjw06KAJHYVmr5jqejimy4nE0OQJczvD8KD\n stream_type:\n type: string\n enum: [inflow, outflow]\n description: Direction of recurring payment\n example: outflow\n merchant_name:\n type: string\n description: Merchant or payee name\n example: Ting\n description:\n type: string\n description: Transaction description pattern\n example: 'TING* INV#MI-4636263'\n category:\n type: object\n properties:\n primary:\n type: string\n example: RENT_AND_UTILITIES\n detailed:\n type: string\n example: RENT_AND_UTILITIES_TELEPHONE\n confidence_level:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, SEMI_MONTHLY, MONTHLY, ANNUALLY, UNKNOWN]\n description: Payment frequency\n example: MONTHLY\n average_amount:\n type: number\n description: Average transaction amount\n example: 118.98\n last_amount:\n type: number\n description: Most recent transaction amount\n example: 146.58\n is_active:\n type: boolean\n description: Whether stream is currently active\n example: true\n status:\n type: string\n enum: [MATURE, EARLY_DETECTION, TOMBSTONED]\n description: Detection status\n example: MATURE\n first_date:\n type: string\n format: date\n description: First detected transaction date\n example: '2025-07-15'\n last_date:\n type: string\n format: date\n description: Most recent transaction date\n example: '2025-09-15'\n next_date:\n type: string\n format: date\n description: Predicted next transaction date\n example: '2025-10-15'\n source:\n type: string\n enum: [plaid, user]\n description: How stream was detected\n example: plaid\n\n Error:\n type: object\n required:\n - error\n properties:\n error:\n type: string\n description: Human-readable error message\n example: Invalid API key.\n\n FinancialContext:\n type: object\n required:\n - version\n - updated_at\n - currency\n - status\n - transactions\n - recurring\n - budgets\n - goals\n - snapshots\n - liabilities\n - holdings\n - health\n properties:\n version:\n type: string\n enum: [v1]\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n currency:\n type: string\n enum: [USD]\n status:\n $ref: '#/components/schemas/FinancialContextStatus'\n transactions:\n $ref: '#/components/schemas/TransactionIndex'\n recurring:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextRecurring'\n budgets:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextBudget'\n goals:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextGoal'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextSnapshot'\n liabilities:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextLiability'\n holdings:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextHolding'\n health:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextHealth'\n - type: 'null'\n\n FinancialContextStatus:\n type: object\n required:\n - position\n - accounts\n properties:\n position:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextPosition'\n - type: 'null'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextAccount'\n\n FinancialContextPosition:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - investments\n - other_assets\n - total_assets\n properties:\n date:\n type: string\n format: date\n nullable: true\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n other_assets:\n type: number\n nullable: true\n total_assets:\n type: number\n nullable: true\n\n FinancialContextAccount:\n type: object\n required:\n - id\n - name\n - type\n - subtype\n - group\n - institution\n - mask\n - balance\n - available\n - currency\n - updated_at\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n subtype:\n type: string\n nullable: true\n group:\n type: string\n enum: [cash, debt, investments]\n nullable: true\n institution:\n type: string\n nullable: true\n mask:\n type: string\n nullable: true\n balance:\n type: number\n nullable: true\n available:\n type: number\n nullable: true\n currency:\n type: string\n nullable: true\n updated_at:\n type: string\n format: date-time\n nullable: true\n\n TransactionIndex:\n type: object\n required:\n - total\n - months\n properties:\n total:\n type: integer\n minimum: 0\n months:\n type: array\n items:\n type: object\n required:\n - month\n - count\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n count:\n type: integer\n minimum: 0\n\n TransactionMonth:\n type: object\n required:\n - month\n - start_date\n - end_date\n - count\n - items\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n start_date:\n type: string\n format: date\n end_date:\n type: string\n format: date\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n LatestTransactions:\n type: object\n required:\n - since\n - window_days\n - count\n - items\n properties:\n since:\n type: string\n format: date\n description: Inclusive lower bound for the latest transaction window\n window_days:\n type: integer\n enum: [10]\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n FinancialContextTransaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - merchant\n - name\n - category\n - subcategory\n - pending\n - currency\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n date:\n type: string\n format: date\n nullable: true\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n merchant:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n category:\n type: string\n nullable: true\n subcategory:\n type: string\n nullable: true\n pending:\n type: boolean\n nullable: true\n currency:\n type: string\n nullable: true\n\n FinancialContextRecurring:\n type: object\n required:\n - id\n - account_id\n - direction\n - frequency\n - status\n - merchant\n - amount\n - next_date\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n direction:\n type: string\n enum: [inflow, outflow]\n nullable: true\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY]\n nullable: true\n status:\n type: string\n enum: [active, inactive, dismissed]\n nullable: true\n merchant:\n type: string\n nullable: true\n amount:\n type: number\n nullable: true\n next_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextBudget:\n type: object\n required:\n - id\n - name\n - type\n - period\n - status\n - amount\n - spent\n - remaining\n - used_percent\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [category, merchant]\n period:\n type: string\n enum: [weekly, biweekly, monthly]\n status:\n type: string\n enum: [under, warning, over]\n amount:\n type: number\n spent:\n type: number\n remaining:\n type: number\n used_percent:\n type: number\n\n FinancialContextGoal:\n type: object\n required:\n - id\n - name\n - category\n - status\n - target\n - current\n - progress_percent\n - target_date\n properties:\n id:\n type: string\n name:\n type: string\n category:\n type: string\n status:\n type: string\n enum: [not_started, in_progress, on_track, behind, completed]\n target:\n type: number\n current:\n type: number\n progress_percent:\n type: number\n target_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextSnapshot:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - income\n - expenses\n - cash_flow\n - savings_rate\n - investments\n - assets\n - health_score\n properties:\n date:\n type: string\n format: date\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n income:\n type: number\n nullable: true\n expenses:\n type: number\n nullable: true\n cash_flow:\n type: number\n nullable: true\n savings_rate:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n assets:\n type: number\n nullable: true\n health_score:\n type: number\n nullable: true\n\n FinancialContextLiability:\n type: object\n required:\n - account_id\n - type\n - balance\n - minimum_payment\n - due_date\n - interest_rate\n - rate_type\n - overdue\n properties:\n account_id:\n type: string\n nullable: true\n type:\n type: string\n enum: [credit, student, mortgage, other]\n nullable: true\n balance:\n type: number\n nullable: true\n minimum_payment:\n type: number\n nullable: true\n due_date:\n type: string\n format: date\n nullable: true\n interest_rate:\n type: number\n nullable: true\n rate_type:\n type: string\n enum: [fixed, variable]\n nullable: true\n overdue:\n type: boolean\n nullable: true\n\n FinancialContextHolding:\n type: object\n required:\n - account_id\n - symbol\n - name\n - type\n - quantity\n - value\n - cost_basis\n properties:\n account_id:\n type: string\n nullable: true\n symbol:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n type:\n type: string\n enum: [cash, derivative, equity, etf, fixed_income, mutual_fund, other]\n nullable: true\n quantity:\n type: number\n nullable: true\n value:\n type: number\n nullable: true\n cost_basis:\n type: number\n nullable: true\n\n FinancialContextHealth:\n type: object\n required:\n - score\n - label\n - level\n - summary\n - data_completeness\n - pillars\n properties:\n score:\n type: number\n label:\n type: string\n enum: [Needs Attention, Good, Strong]\n level:\n type: string\n enum: [critical, poor, fair, good, strong]\n summary:\n type: string\n data_completeness:\n type: number\n pillars:\n oneOf:\n - type: object\n required:\n - spend\n - save\n - borrow\n - build\n properties:\n spend:\n type: number\n nullable: true\n save:\n type: number\n nullable: true\n borrow:\n type: number\n nullable: true\n build:\n type: number\n nullable: true\n - type: 'null'\n\n FinancialContextMeta:\n type: object\n required:\n - version\n - user_id\n - context_id\n - generated_at\n - updated_at\n - content_hash\n - byte_length\n - counts\n properties:\n version:\n type: string\n enum: [v1]\n user_id:\n type: string\n context_id:\n type: string\n generated_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n content_hash:\n type: string\n description: Opaque artifact version token and ETag value. This is the only public artifact version token.\n byte_length:\n type: integer\n minimum: 0\n counts:\n type: object\n required:\n - accounts\n - transaction_months\n - transactions\n - snapshots\n properties:\n accounts:\n type: integer\n minimum: 0\n transaction_months:\n type: integer\n minimum: 0\n transactions:\n type: integer\n minimum: 0\n snapshots:\n type: integer\n minimum: 0\n\ntags:\n - name: Export\n description: Export financial data as structured JSON\n";
2
+ export const baseOpenApiYaml = "openapi: 3.1.0\ninfo:\n title: Warm API\n description: |\n Read your financial context or invoke supported Warm actions through a compact operation catalog.\n\n ## Authentication\n All requests use `Authorization: Bearer`. Each account has one non-expiring full-access\n API key (`warm_...`) for raw API and local MCP use. Read/export routes also accept a\n signed-in access token; access tokens never authorize automation operations.\n\n Unauthenticated responses include `WWW-Authenticate` guidance and protected resource metadata.\n\n ## Rate Limits\n - API keys: 500 requests per hour per key\n - Rate limit headers included in authenticated responses\n - `/api/export` supports dataset-scoped delta sync with `since` and publishes edge-cache metadata headers\n version: '3.0.0'\n contact:\n name: Warm Support\n url: https://warm.io/support\n license:\n name: Proprietary\n url: https://warm.io/terms\n\nservers:\n - url: https://app.warm.io\n description: Production\n\nsecurity:\n - BearerAuth: []\n\npaths:\n /api/verify:\n get:\n operationId: verifyApiAccess\n summary: Verify API credentials\n description: |\n Validate a Warm API key or signed-in user access token for installer and Settings flows.\n tags:\n - Verification\n responses:\n '200':\n description: Credentials are valid and the caller has API access\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/VerifyApiResponse'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/export:\n get:\n operationId: getDatasetExport\n summary: Get a typed dataset export\n description: |\n Fetch a canonical financial dataset export from the unified `/api/export` surface.\n\n Use `dataset=transactions` for paginated transaction history. Other datasets return\n a typed JSON object keyed by the documented dataset name.\n\n Preferred dataset names are `accounts`, `transactions`, `snapshots`, `recurring`,\n `budgets`, `goals`, `health`, `liabilities`, and `holdings`.\n tags:\n - Export\n parameters:\n - name: dataset\n in: query\n description: Dataset identifier\n required: true\n schema:\n type: string\n enum:\n - accounts\n - transactions\n - snapshots\n - recurring\n - budgets\n - goals\n - health\n - liabilities\n - holdings\n - name: since\n in: query\n description: ISO timestamp for incremental exports\n required: false\n schema:\n type: string\n format: date-time\n - name: limit\n in: query\n description: Maximum transactions per page when `dataset=transactions`\n required: false\n schema:\n type: integer\n minimum: 1\n maximum: 1000\n - name: cursor\n in: query\n description: Pagination token from `pagination.next_cursor` when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: accountId\n in: query\n description: Optional account filter when `dataset=transactions`\n required: false\n schema:\n type: string\n - name: search\n in: query\n description: Optional merchant or description search filter when `dataset=transactions`\n required: false\n schema:\n type: string\n minLength: 1\n maxLength: 120\n responses:\n '200':\n description: Successful dataset export\n content:\n application/json:\n schema:\n oneOf:\n - $ref: '#/components/schemas/ExportAccountsResponse'\n - $ref: '#/components/schemas/ExportTransactionsResponse'\n - $ref: '#/components/schemas/ExportSnapshotsResponse'\n - $ref: '#/components/schemas/ExportRecurringResponse'\n - $ref: '#/components/schemas/ExportBudgetsResponse'\n - $ref: '#/components/schemas/ExportGoalsResponse'\n - $ref: '#/components/schemas/ExportHealthResponse'\n - $ref: '#/components/schemas/ExportLiabilitiesResponse'\n - $ref: '#/components/schemas/ExportHoldingsResponse'\n '400':\n description: Invalid query parameters\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context:\n get:\n operationId: getFinancialContext\n summary: Get compact financial context\n description: |\n Fetch the current compact FinancialContext artifact for the authenticated user.\n\n This response does not include transaction items. Use\n `/api/financial-context/transactions` for month-addressed transaction pages or the\n fixed 10-day latest transaction window.\n tags:\n - Export\n responses:\n '200':\n description: Compact FinancialContext artifact\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContext'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/transactions:\n get:\n operationId: getFinancialContextTransactions\n summary: Get financial-context transactions\n description: |\n Fetch one transaction month or the fixed 10-day latest transaction window from the\n current financial-context artifact.\n\n The raw API requires exactly one selector: `month=YYYY-MM` or `latest=1`.\n Bare calls are invalid on the raw API. The current `@warmio/mcp` `get_transactions` tool\n accepts one required `period` string: `latest` for the fixed latest window or `YYYY-MM`\n for a month. It does not accept export pagination or filtering controls.\n Transaction amounts use the Warm/Plaid sign convention:\n positive = expense/debit, negative = income/credit.\n\n A well-formed month inside the covered range with no matching items returns `200` with\n `count: 0` and `items: []`. Months before the earliest indexed month or after the latest\n covered month return `404`.\n tags:\n - Export\n parameters:\n - name: month\n in: query\n description: Transaction month selector in YYYY-MM format. Mutually exclusive with `latest`.\n required: false\n schema:\n type: string\n pattern: '^\\d{4}-(0[1-9]|1[0-2])$'\n example: '2026-07'\n - name: latest\n in: query\n description: Set to `1` for the fixed 10-day latest transaction window.\n required: false\n schema:\n type: string\n enum: ['1']\n responses:\n '200':\n description: Transaction month page or latest transaction window\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n oneOf:\n - $ref: '#/components/schemas/TransactionMonth'\n - $ref: '#/components/schemas/LatestTransactions'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '400':\n description: Missing selectors, mutually exclusive selectors, malformed `month`, or `latest` other than `1`\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/financial-context/meta:\n get:\n operationId: getFinancialContextMeta\n summary: Get financial-context metadata\n description: |\n Fetch operational metadata for the current financial-context artifact, including the\n content hash used as the ETag, byte length, row counts, and freshness timestamps.\n `content_hash` is the public artifact version token; this metadata does not expose a\n public `data_version`.\n tags:\n - Export\n responses:\n '200':\n description: Financial-context metadata\n headers:\n ETag:\n $ref: '#/components/headers/ETag'\n Cache-Control:\n $ref: '#/components/headers/PrivateNoStore'\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/FinancialContextMeta'\n '304':\n description: The caller's If-None-Match value matches the current content hash\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '413':\n $ref: '#/components/responses/PayloadTooLarge'\n '429':\n $ref: '#/components/responses/RateLimited'\n\n /api/automation/operations/search:\n post:\n operationId: searchOperations\n summary: Search supported automation operations\n tags: [Automation]\n security:\n - BearerAuth: []\n requestBody:\n required: false\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n properties:\n query:\n type: string\n maxLength: 200\n responses:\n '200':\n description: Matching operations\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operations]\n properties:\n operations:\n type: array\n items:\n $ref: '#/components/schemas/AutomationOperation'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '400':\n $ref: '#/components/responses/BadRequest'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/describe:\n post:\n operationId: describeOperation\n summary: Describe one operation and request owner approval when required\n tags: [Automation]\n security:\n - BearerAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationRequest'\n responses:\n '200':\n description: Operation schema and optional pending owner approval\n content:\n application/json:\n schema:\n type: object\n additionalProperties: false\n required: [operation]\n properties:\n operation:\n allOf:\n - $ref: '#/components/schemas/AutomationOperation'\n - type: object\n properties:\n input_schema:\n type: object\n approval:\n type: object\n additionalProperties: false\n required: [id, status, approval_url, expires_at]\n properties:\n id: { type: string, format: uuid }\n status: { type: string, enum: [pending] }\n approval_url: { type: string, format: uri }\n expires_at: { type: string, format: date-time }\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\n /api/automation/operations/invoke:\n post:\n operationId: invokeOperation\n summary: Invoke one supported operation\n tags: [Automation]\n security:\n - BearerAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/OperationInvokeRequest'\n responses:\n '200':\n description: Wrapped response from the invoked operation\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/AutomationInvocationResponse'\n '400':\n $ref: '#/components/responses/BadRequest'\n '401':\n $ref: '#/components/responses/Unauthorized'\n '403':\n $ref: '#/components/responses/Forbidden'\n '404':\n $ref: '#/components/responses/NotFound'\n '409':\n description: Owner approval is required, invalid, expired, or already used\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n '429':\n $ref: '#/components/responses/RateLimited'\n '500':\n $ref: '#/components/responses/InternalError'\n\ncomponents:\n securitySchemes:\n BearerAuth:\n type: http\n scheme: bearer\n description: 'Read/export format: `Authorization: Bearer YOUR_API_KEY_OR_ACCESS_TOKEN`'\n\n headers:\n ETag:\n description: Quoted content hash for If-None-Match revalidation\n schema:\n type: string\n example: '\"7b6f9d4c...\"'\n PrivateNoStore:\n description: Private financial responses are not stored by browsers or shared caches\n schema:\n type: string\n example: private, no-store\n\n responses:\n BadRequest:\n description: The request body or operation input is invalid\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Unauthorized:\n description: Missing or invalid credentials\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n Forbidden:\n description: The caller is authenticated but does not have API access\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n NotFound:\n description: The requested operation does not exist\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n InternalError:\n description: The request could not be completed safely\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n PayloadTooLarge:\n description: The response would exceed the public API response-size limit\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n RateLimited:\n description: Hourly per-credential rate limit exceeded\n headers:\n Retry-After:\n description: Seconds until the rate-limit window resets\n schema:\n type: integer\n example: 3600\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Error'\n\n schemas:\n AutomationOperation:\n type: object\n additionalProperties: false\n required: [operation_id, summary, description, method, path, risk, confirmation_required]\n properties:\n operation_id: { type: string }\n summary: { type: string }\n description: { type: string }\n method: { type: string, enum: [GET, POST, PATCH, PUT, DELETE] }\n path: { type: string }\n risk:\n type: array\n items: { type: string, enum: [read, write, destructive, external_effect] }\n confirmation_required: { type: boolean }\n OperationRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n OperationInvokeRequest:\n type: object\n additionalProperties: false\n required: [operation_id]\n properties:\n operation_id: { type: string }\n input:\n $ref: '#/components/schemas/OperationInput'\n approval_id:\n type: string\n format: uuid\n description: Matching owner approval required for every write operation\n OperationInput:\n type: object\n additionalProperties: false\n properties:\n params: { type: object, additionalProperties: { type: string } }\n body: { type: object, additionalProperties: true }\n AutomationInvocationResponse:\n type: object\n additionalProperties: false\n required: [body, headers, operation_id, status]\n properties:\n body: {}\n headers:\n type: object\n additionalProperties: { type: string }\n operation_id: { type: string }\n status: { type: integer, minimum: 100, maximum: 599 }\n ExportResponse:\n type: object\n required:\n - schema_version\n - generated_at\n - user_id\n - data_version\n - next_knowledge\n - accounts\n - transactions\n - snapshots\n - pagination\n properties:\n schema_version:\n type: string\n description: API schema version\n example: v1\n generated_at:\n type: string\n format: date-time\n description: Response generation timestamp\n example: '2026-01-10T15:30:00Z'\n user_id:\n type: string\n format: uuid\n description: Your user ID\n example: a1b2c3d4-e5f6-7890-abcd-ef1234567890\n data_version:\n type: integer\n description: Monotonic version number (increments on data changes)\n example: 42\n next_knowledge:\n type: string\n format: date-time\n description: Use as `since` in the next request for delta sync\n example: '2026-01-10T15:30:00Z'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/Account'\n transactions:\n type: array\n items:\n $ref: '#/components/schemas/Transaction'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/Snapshot'\n pagination:\n $ref: '#/components/schemas/Pagination'\n\n Account:\n type: object\n required:\n - id\n - name\n - type\n - current_balance\n - iso_currency_code\n - is_active\n properties:\n id:\n type: string\n format: uuid\n description: Unique account identifier\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n account_id:\n type: string\n description: External account ID (from Plaid)\n example: plaid_acc_ABC123xyz\n name:\n type: string\n description: Display name with masked account number\n example: 'Checking ****1234'\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n description: Account type\n example: depository\n subtype:\n type: string\n description: Specific subtype\n example: checking\n enum:\n - checking\n - savings\n - money market\n - cd\n - credit card\n - mortgage\n - student\n - auto\n - 401k\n - ira\n - brokerage\n - other\n current_balance:\n type: number\n description: Current balance (positive for assets)\n example: 5420.50\n available_balance:\n type: number\n nullable: true\n description: Available balance (may differ from current)\n example: 5320.50\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n mask:\n type: string\n description: Last 4 digits of account number\n example: '1234'\n is_active:\n type: boolean\n description: Whether account is actively syncing\n example: true\n created_at:\n type: string\n format: date-time\n example: '2025-06-15T10:00:00Z'\n updated_at:\n type: string\n format: date-time\n example: '2026-01-10T12:00:00Z'\n\n Transaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - name\n - primary_category\n - detailed_category\n - pending\n - iso_currency_code\n properties:\n id:\n type: string\n format: uuid\n description: Unique transaction identifier\n example: txn_9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d\n transaction_id:\n type: string\n description: External transaction ID (from Plaid)\n example: plaid_txn_XYZ789abc\n account_id:\n type: string\n format: uuid\n description: Parent account ID\n example: acc_8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c\n date:\n type: string\n format: date\n description: Posted date\n example: '2026-01-09'\n authorized_date:\n type: string\n format: date\n nullable: true\n description: Authorization date (if different)\n example: '2026-01-08'\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n example: 42.50\n name:\n type: string\n description: Raw transaction description from bank\n example: 'TRADER JOES #123 SAN FRANCISCO'\n merchant_name:\n type: string\n nullable: true\n description: Cleaned merchant name\n example: \"Trader Joe's\"\n merchant_entity_id:\n type: string\n nullable: true\n description: Unique merchant identifier\n example: eyg8o776k0QmNgVpAmaQj4WgzW9Qzo6O51gdd\n logo:\n type: string\n format: uri\n nullable: true\n description: URL to merchant logo\n example: https://plaid-merchant-logos.plaid.com/trader_joes.png\n primary_category:\n type: string\n description: High-level category\n example: FOOD_AND_DRINK\n enum:\n - INCOME\n - TRANSFER_IN\n - TRANSFER_OUT\n - LOAN_PAYMENTS\n - BANK_FEES\n - ENTERTAINMENT\n - FOOD_AND_DRINK\n - GENERAL_MERCHANDISE\n - HOME_IMPROVEMENT\n - MEDICAL\n - PERSONAL_CARE\n - GENERAL_SERVICES\n - GOVERNMENT_AND_NON_PROFIT\n - TRANSPORTATION\n - TRAVEL\n - RENT_AND_UTILITIES\n detailed_category:\n type: string\n description: Specific category\n example: FOOD_AND_DRINK_GROCERIES\n category_confidence:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n description: Category confidence level\n example: VERY_HIGH\n payment_channel:\n type: string\n enum: [in_store, online, other]\n description: How payment was made\n example: in_store\n pending:\n type: boolean\n description: Whether transaction is still pending\n example: false\n iso_currency_code:\n type: string\n description: ISO 4217 currency code\n example: USD\n location:\n $ref: '#/components/schemas/Location'\n created_at:\n type: string\n format: date-time\n example: '2026-01-09T18:30:00Z'\n\n Location:\n type: object\n nullable: true\n properties:\n city:\n type: string\n nullable: true\n example: San Francisco\n region:\n type: string\n nullable: true\n example: CA\n postal_code:\n type: string\n nullable: true\n example: '94110'\n country:\n type: string\n nullable: true\n example: US\n\n Snapshot:\n type: object\n required:\n - id\n - period_type\n - period_start\n - period_end\n - snapshot_date\n properties:\n id:\n type: string\n format: uuid\n description: Unique snapshot identifier\n example: snap_1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\n period_type:\n type: string\n enum: [daily, weekly, monthly]\n description: Period granularity\n example: daily\n period_start:\n type: string\n format: date\n description: Period start date\n example: '2026-01-01'\n period_end:\n type: string\n format: date\n description: Period end date\n example: '2026-01-31'\n snapshot_date:\n type: string\n format: date\n description: When snapshot was taken\n example: '2026-01-10'\n income:\n type: number\n description: Total income for period\n example: 6500.00\n expenses:\n type: number\n description: Total expenses for period\n example: 4200.00\n net_cash_flow:\n type: number\n description: Income minus expenses\n example: 2300.00\n savings_rate:\n type: number\n description: Percentage saved (0.0 to 1.0)\n example: 0.35\n net_worth:\n type: number\n description: Total assets minus liabilities\n example: 45000.00\n total_cash:\n type: number\n description: Sum of depository balances\n example: 12500.00\n total_debt:\n type: number\n description: Sum of credit/loan balances\n example: 8500.00\n investment_value:\n type: number\n description: Investment account value\n example: 28000.00\n asset_value:\n type: number\n description: Other asset values\n example: 15000.00\n burn_rate:\n type: number\n description: Average daily spending\n example: 140.00\n runway_days:\n type: integer\n description: Days of expenses covered by cash\n example: 89\n safe_to_spend:\n type: number\n description: Estimated discretionary spending available\n example: 1800.00\n recurring_total:\n type: number\n description: Sum of recurring expenses\n example: 1250.00\n spending_by_category:\n type: array\n items:\n $ref: '#/components/schemas/CategorySpending'\n top_merchants:\n type: array\n items:\n $ref: '#/components/schemas/MerchantSpending'\n income_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: 0.05\n spending_vs_last_period:\n type: number\n description: Percentage change from previous period\n example: -0.08\n created_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n\n CategorySpending:\n type: object\n properties:\n category:\n type: string\n example: FOOD_AND_DRINK\n amount:\n type: number\n example: 850.00\n percentage:\n type: number\n example: 20.2\n\n MerchantSpending:\n type: object\n properties:\n merchant:\n type: string\n example: Whole Foods\n amount:\n type: number\n example: 420.00\n count:\n type: integer\n example: 8\n\n Pagination:\n type: object\n properties:\n limit:\n type: integer\n description: Transactions per page\n example: 1000\n next_cursor:\n type: string\n nullable: true\n description: Token for next page (null if no more pages)\n example: eyJkYXRlIjoiMjAyNi0wMS0wMSIsImlkIjoiYWJjMTIzIn0\n\n RecurringStream:\n type: object\n properties:\n id:\n type: string\n format: uuid\n description: Unique stream identifier\n example: cb3daddd-1f82-43ed-ba9f-60ecf8c937e3\n stream_id:\n type: string\n description: External stream ID (from Plaid)\n example: LN053MyLw9H9MQ5ybwrJim1Kj495gbsJ98aeM\n account_id:\n type: string\n description: Account ID this stream belongs to\n example: Dpnjw06KAJHYVmr5jqejimy4nE0OQJczvD8KD\n stream_type:\n type: string\n enum: [inflow, outflow]\n description: Direction of recurring payment\n example: outflow\n merchant_name:\n type: string\n description: Merchant or payee name\n example: Ting\n description:\n type: string\n description: Transaction description pattern\n example: 'TING* INV#MI-4636263'\n category:\n type: object\n properties:\n primary:\n type: string\n example: RENT_AND_UTILITIES\n detailed:\n type: string\n example: RENT_AND_UTILITIES_TELEPHONE\n confidence_level:\n type: string\n enum: [VERY_HIGH, HIGH, MEDIUM, LOW, UNKNOWN]\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, SEMI_MONTHLY, MONTHLY, ANNUALLY, UNKNOWN]\n description: Payment frequency\n example: MONTHLY\n average_amount:\n type: number\n description: Average transaction amount\n example: 118.98\n last_amount:\n type: number\n description: Most recent transaction amount\n example: 146.58\n is_active:\n type: boolean\n description: Whether stream is currently active\n example: true\n status:\n type: string\n enum: [MATURE, EARLY_DETECTION, TOMBSTONED]\n description: Detection status\n example: MATURE\n first_date:\n type: string\n format: date\n description: First detected transaction date\n example: '2025-07-15'\n last_date:\n type: string\n format: date\n description: Most recent transaction date\n example: '2025-09-15'\n next_date:\n type: string\n format: date\n description: Predicted next transaction date\n example: '2025-10-15'\n source:\n type: string\n enum: [plaid, user]\n description: How stream was detected\n example: plaid\n\n Error:\n type: object\n additionalProperties: false\n required:\n - error\n properties:\n error:\n type: string\n VerifyApiResponse:\n type: object\n additionalProperties: false\n required: [valid]\n properties:\n valid:\n type: boolean\n enum: [true]\n description: Human-readable error message\n example: Invalid API key.\n\n FinancialContext:\n type: object\n required:\n - version\n - updated_at\n - currency\n - status\n - transactions\n - recurring\n - budgets\n - goals\n - snapshots\n - liabilities\n - holdings\n - health\n properties:\n version:\n type: string\n enum: [v1]\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n currency:\n type: string\n enum: [USD]\n status:\n $ref: '#/components/schemas/FinancialContextStatus'\n transactions:\n $ref: '#/components/schemas/TransactionIndex'\n recurring:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextRecurring'\n budgets:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextBudget'\n goals:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextGoal'\n snapshots:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextSnapshot'\n liabilities:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextLiability'\n holdings:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextHolding'\n health:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextHealth'\n - type: 'null'\n\n FinancialContextStatus:\n type: object\n required:\n - position\n - accounts\n properties:\n position:\n oneOf:\n - $ref: '#/components/schemas/FinancialContextPosition'\n - type: 'null'\n accounts:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextAccount'\n\n FinancialContextPosition:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - investments\n - other_assets\n - total_assets\n properties:\n date:\n type: string\n format: date\n nullable: true\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n other_assets:\n type: number\n nullable: true\n total_assets:\n type: number\n nullable: true\n\n FinancialContextAccount:\n type: object\n required:\n - id\n - name\n - type\n - subtype\n - group\n - institution\n - mask\n - balance\n - available\n - currency\n - updated_at\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [depository, credit, loan, investment, brokerage, other]\n subtype:\n type: string\n nullable: true\n group:\n type: string\n enum: [cash, debt, investments]\n nullable: true\n institution:\n type: string\n nullable: true\n mask:\n type: string\n nullable: true\n balance:\n type: number\n nullable: true\n available:\n type: number\n nullable: true\n currency:\n type: string\n nullable: true\n updated_at:\n type: string\n format: date-time\n nullable: true\n\n TransactionIndex:\n type: object\n required:\n - total\n - months\n properties:\n total:\n type: integer\n minimum: 0\n months:\n type: array\n items:\n type: object\n required:\n - month\n - count\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n count:\n type: integer\n minimum: 0\n\n TransactionMonth:\n type: object\n required:\n - month\n - start_date\n - end_date\n - count\n - items\n properties:\n month:\n type: string\n pattern: '^\\d{4}-\\d{2}$'\n start_date:\n type: string\n format: date\n end_date:\n type: string\n format: date\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n LatestTransactions:\n type: object\n required:\n - since\n - window_days\n - count\n - items\n properties:\n since:\n type: string\n format: date\n description: Inclusive lower bound for the latest transaction window\n window_days:\n type: integer\n enum: [10]\n count:\n type: integer\n minimum: 0\n items:\n type: array\n items:\n $ref: '#/components/schemas/FinancialContextTransaction'\n\n FinancialContextTransaction:\n type: object\n required:\n - id\n - account_id\n - date\n - amount\n - merchant\n - name\n - category\n - subcategory\n - pending\n - currency\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n date:\n type: string\n format: date\n nullable: true\n amount:\n type: number\n description: Amount (positive = expense/debit, negative = income/credit)\n merchant:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n category:\n type: string\n nullable: true\n subcategory:\n type: string\n nullable: true\n pending:\n type: boolean\n nullable: true\n currency:\n type: string\n nullable: true\n\n FinancialContextRecurring:\n type: object\n required:\n - id\n - account_id\n - direction\n - frequency\n - status\n - merchant\n - amount\n - next_date\n properties:\n id:\n type: string\n account_id:\n type: string\n nullable: true\n direction:\n type: string\n enum: [inflow, outflow]\n nullable: true\n frequency:\n type: string\n enum: [WEEKLY, BIWEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUALLY, ANNUALLY]\n nullable: true\n status:\n type: string\n enum: [active, inactive, dismissed]\n nullable: true\n merchant:\n type: string\n nullable: true\n amount:\n type: number\n nullable: true\n next_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextBudget:\n type: object\n required:\n - id\n - name\n - type\n - period\n - status\n - amount\n - spent\n - remaining\n - used_percent\n properties:\n id:\n type: string\n name:\n type: string\n type:\n type: string\n enum: [category, merchant]\n period:\n type: string\n enum: [weekly, biweekly, monthly]\n status:\n type: string\n enum: [under, warning, over]\n amount:\n type: number\n spent:\n type: number\n remaining:\n type: number\n used_percent:\n type: number\n\n FinancialContextGoal:\n type: object\n required:\n - id\n - name\n - category\n - status\n - target\n - current\n - progress_percent\n - target_date\n properties:\n id:\n type: string\n name:\n type: string\n category:\n type: string\n status:\n type: string\n enum: [not_started, in_progress, on_track, behind, completed]\n target:\n type: number\n current:\n type: number\n progress_percent:\n type: number\n target_date:\n type: string\n format: date\n nullable: true\n\n FinancialContextSnapshot:\n type: object\n required:\n - date\n - net_worth\n - cash\n - debt\n - income\n - expenses\n - cash_flow\n - savings_rate\n - investments\n - assets\n - health_score\n properties:\n date:\n type: string\n format: date\n net_worth:\n type: number\n nullable: true\n cash:\n type: number\n nullable: true\n debt:\n type: number\n nullable: true\n income:\n type: number\n nullable: true\n expenses:\n type: number\n nullable: true\n cash_flow:\n type: number\n nullable: true\n savings_rate:\n type: number\n nullable: true\n investments:\n type: number\n nullable: true\n assets:\n type: number\n nullable: true\n health_score:\n type: number\n nullable: true\n\n FinancialContextLiability:\n type: object\n required:\n - account_id\n - type\n - balance\n - minimum_payment\n - due_date\n - interest_rate\n - rate_type\n - overdue\n properties:\n account_id:\n type: string\n nullable: true\n type:\n type: string\n enum: [credit, student, mortgage, other]\n nullable: true\n balance:\n type: number\n nullable: true\n minimum_payment:\n type: number\n nullable: true\n due_date:\n type: string\n format: date\n nullable: true\n interest_rate:\n type: number\n nullable: true\n rate_type:\n type: string\n enum: [fixed, variable]\n nullable: true\n overdue:\n type: boolean\n nullable: true\n\n FinancialContextHolding:\n type: object\n required:\n - account_id\n - symbol\n - name\n - type\n - quantity\n - value\n - cost_basis\n properties:\n account_id:\n type: string\n nullable: true\n symbol:\n type: string\n nullable: true\n name:\n type: string\n nullable: true\n type:\n type: string\n enum: [cash, derivative, equity, etf, fixed_income, mutual_fund, other]\n nullable: true\n quantity:\n type: number\n nullable: true\n value:\n type: number\n nullable: true\n cost_basis:\n type: number\n nullable: true\n\n FinancialContextHealth:\n type: object\n required:\n - score\n - label\n - level\n - summary\n - data_completeness\n - pillars\n properties:\n score:\n type: number\n label:\n type: string\n enum: [Needs Attention, Good, Strong]\n level:\n type: string\n enum: [critical, poor, fair, good, strong]\n summary:\n type: string\n data_completeness:\n type: number\n pillars:\n oneOf:\n - type: object\n required:\n - spend\n - save\n - borrow\n - build\n properties:\n spend:\n type: number\n nullable: true\n save:\n type: number\n nullable: true\n borrow:\n type: number\n nullable: true\n build:\n type: number\n nullable: true\n - type: 'null'\n\n FinancialContextMeta:\n type: object\n required:\n - version\n - user_id\n - context_id\n - generated_at\n - updated_at\n - content_hash\n - byte_length\n - counts\n properties:\n version:\n type: string\n enum: [v1]\n user_id:\n type: string\n context_id:\n type: string\n generated_at:\n type: string\n format: date-time\n updated_at:\n type: string\n format: date-time\n description: Latest represented source-data freshness timestamp\n content_hash:\n type: string\n description: Opaque artifact version token and ETag value. This is the only public artifact version token.\n byte_length:\n type: integer\n minimum: 0\n counts:\n type: object\n required:\n - accounts\n - transaction_months\n - transactions\n - snapshots\n properties:\n accounts:\n type: integer\n minimum: 0\n transaction_months:\n type: integer\n minimum: 0\n transactions:\n type: integer\n minimum: 0\n snapshots:\n type: integer\n minimum: 0\n\ntags:\n - name: Export\n description: Export financial data as structured JSON\n";
3
3
  //# sourceMappingURL=base-openapi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-openapi.js","sourceRoot":"","sources":["../../src/generated/base-openapi.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,wy/CAAwy/C,CAAC"}
1
+ {"version":3,"file":"base-openapi.js","sourceRoot":"","sources":["../../src/generated/base-openapi.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,4g+CAA4g+C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const warmMcpPackageReleaseMetadata: {
2
+ readonly name: "@warmio/mcp";
3
+ readonly version: "11.0.0";
4
+ readonly nodeEngine: ">=18";
5
+ };
6
+ export type WarmMcpPackageReleaseMetadata = typeof warmMcpPackageReleaseMetadata;
7
+ //# sourceMappingURL=mcp-package-release-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-package-release-metadata.d.ts","sourceRoot":"","sources":["../../src/generated/mcp-package-release-metadata.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,6BAA6B;aACxC,IAAM,EAAE,aAAa;aACrB,OAAS,EAAE,QAAQ;aACnB,UAAY,EAAE,MAAM;CACZ,CAAC;AAEX,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Generated by tools/tasks/generate-contract-manifest.mts. Do not edit.
2
+ export const warmMcpPackageReleaseMetadata = {
3
+ "name": "@warmio/mcp",
4
+ "version": "11.0.0",
5
+ "nodeEngine": ">=18"
6
+ };
7
+ //# sourceMappingURL=mcp-package-release-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-package-release-metadata.js","sourceRoot":"","sources":["../../src/generated/mcp-package-release-metadata.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,MAAM,EAAE,aAAa;IACrB,SAAS,EAAE,QAAQ;IACnB,YAAY,EAAE,MAAM;CACZ,CAAC"}
@@ -1,5 +1,4 @@
1
1
  export declare const privateMcpToolDescriptors: readonly [{
2
- readonly mode: "context";
3
2
  readonly name: "get_financial_context";
4
3
  readonly description: "Read-only compact FinancialContext JSON. Includes status.position, status.accounts, transaction index total/months, recurring, budgets, goals, snapshots, liabilities, holdings, and health. Transaction items are not inline; use get_transactions for items.";
5
4
  readonly annotations: {
@@ -599,7 +598,6 @@ export declare const privateMcpToolDescriptors: readonly [{
599
598
  readonly $schema: "https://json-schema.org/draft-07/schema#";
600
599
  };
601
600
  }, {
602
- readonly mode: "context";
603
601
  readonly name: "get_transactions";
604
602
  readonly description: "Read-only transactions from the FinancialContext artifact. Pass `period: \"latest\"` for the fixed 10-day latest window or `period: \"YYYY-MM\"` for a month page. The latest window is not caller-configurable. Months outside the covered range return an error.";
605
603
  readonly annotations: {
@@ -755,40 +753,6 @@ export declare const privateMcpToolDescriptors: readonly [{
755
753
  readonly $schema: "https://json-schema.org/draft-07/schema#";
756
754
  };
757
755
  }, {
758
- readonly mode: "context";
759
- readonly name: "verify_key";
760
- readonly description: "Read-only API key validation for the configured Warm account.";
761
- readonly annotations: {
762
- readonly readOnlyHint: true;
763
- readonly destructiveHint: false;
764
- readonly openWorldHint: false;
765
- };
766
- readonly input_schema: {
767
- readonly type: "object";
768
- readonly properties: {};
769
- readonly additionalProperties: false;
770
- readonly $schema: "https://json-schema.org/draft-07/schema#";
771
- };
772
- readonly output_schema: {
773
- readonly type: "object";
774
- readonly properties: {
775
- readonly audience: {
776
- readonly type: "string";
777
- readonly enum: readonly ["automation", "context", "oauth"];
778
- };
779
- readonly status: {
780
- readonly type: "string";
781
- };
782
- readonly valid: {
783
- readonly type: "boolean";
784
- };
785
- };
786
- readonly required: readonly ["status", "valid"];
787
- readonly additionalProperties: false;
788
- readonly $schema: "https://json-schema.org/draft-07/schema#";
789
- };
790
- }, {
791
- readonly mode: "automation";
792
756
  readonly name: "search_operations";
793
757
  readonly description: "Search the supported Warm operation catalog. Use this first to find the smallest matching operation.";
794
758
  readonly annotations: {
@@ -853,7 +817,6 @@ export declare const privateMcpToolDescriptors: readonly [{
853
817
  readonly $schema: "https://json-schema.org/draft-07/schema#";
854
818
  };
855
819
  }, {
856
- readonly mode: "automation";
857
820
  readonly name: "describe_operation";
858
821
  readonly description: "Describe one operation, including its input schema and risk. For write operations, pass the exact intended input to receive an approval with its ID, status, URL, and expiry.";
859
822
  readonly annotations: {
@@ -959,7 +922,6 @@ export declare const privateMcpToolDescriptors: readonly [{
959
922
  readonly $schema: "https://json-schema.org/draft-07/schema#";
960
923
  };
961
924
  }, {
962
- readonly mode: "automation";
963
925
  readonly name: "invoke_operation";
964
926
  readonly description: "Invoke one previously discovered Warm operation. Every write operation requires the approval_id returned for the exact same input by describe_operation.";
965
927
  readonly annotations: {